Changeset 23966


Ignore:
Timestamp:
05/31/19 08:58:09 (6 years ago)
Author:
Mathieu Morlighem
Message:

CHG: added alternative to GL advection: streamline diffusion

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/analyses/GLheightadvectionAnalysis.cpp

    r23585 r23966  
    6161
    6262        /*Intermediaries */
     63        const IssmPDouble yts = 365*24*3600.;
    6364        int        domaintype,dim;
    6465        IssmDouble Jdet,D_scalar,onboundary;
     
    104105                GetBprime(Bprime,element,dim,xyz_list,gauss);
    105106
    106                 D_scalar=gauss->weight*Jdet;
    107 
    108107                /*Get velocity*/
    109108                vx_input->GetInputValue(&vx,gauss);
    110109                vy_input->GetInputValue(&vy,gauss);
    111                 bc_input->GetInputValue(&onboundary,gauss);
    112                 if(onboundary>0.){
    113                         /*We do not want to advect garbage, make sure only diffusion is applied on boundary*/
    114                         vx = 0.; vy = 0.;
    115                 }
    116 
    117                 /*Diffusion */
    118                 if(sqrt(vx*vx+vy*vy)<1000./31536000.){
    119                         IssmPDouble kappa = -10.;
     110
     111                if(false){
     112                        /*Streamline diffusion*/
     113                        vel = sqrt(vx*vx+vy*vy);
     114                        if(vel<10./yts){
     115                                vx = 0.; vy = 0.;
     116                                vel = 30./yts*500000.;
     117                        }
     118
    120119                        for(int i=0;i<numnodes;i++){
    121120                                for(int j=0;j<numnodes;j++){
    122                                         Ke->values[i*numnodes+j] += D_scalar*kappa*(dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + dbasis[1*numnodes+j]*dbasis[1*numnodes+i]);
     121                                        Ke->values[i*numnodes+j] += gauss->weight*Jdet*(
     122                                                                (vx*dbasis[0*numnodes+i] + vy*dbasis[1*numnodes+i])*(vx*dbasis[0*numnodes+j] + vy*dbasis[1*numnodes+j])
     123                                                                + vel/500000.*(dbasis[0*numnodes+i]*dbasis[0*numnodes+j] + dbasis[1*numnodes+i]*dbasis[1*numnodes+j]));
    123124                                }
    124125                        }
    125126                }
    126 
    127                 /*Advection: */
    128                 for(int i=0;i<numnodes;i++){
    129                         for(int j=0;j<numnodes;j++){
    130                                 Ke->values[i*numnodes+j] += (D_scalar*(vx*dbasis[0*numnodes+j]*basis[i] + vy*dbasis[1*numnodes+j]*basis[i]))*1e-2;
    131                         }
    132                 }
    133 
    134                 /*Artificial diffusivity*/
    135                 vel=sqrt(vx*vx + vy*vy)+1.e-14;
    136                 D[0][0]=D_scalar*h/(2.*vel)*fabs(vx*vx);  D[0][1]=D_scalar*h/(2.*vel)*fabs(vx*vy);
    137                 D[1][0]=D_scalar*h/(2.*vel)*fabs(vy*vx);  D[1][1]=D_scalar*h/(2.*vel)*fabs(vy*vy);
    138                 TripleMultiply(Bprime,dim,numnodes,1,
    139                                         &D[0][0],2,2,0,
    140                                         Bprime,dim,numnodes,0,
    141                                         &Ke->values[0],1);
     127                else{
     128                        D_scalar=gauss->weight*Jdet;
     129
     130                        bc_input->GetInputValue(&onboundary,gauss);
     131                        if(onboundary>0.){
     132                                /*We do not want to advect garbage, make sure only diffusion is applied on boundary*/
     133                                vx = 0.; vy = 0.;
     134                        }
     135
     136                        /*Diffusion */
     137                        if(sqrt(vx*vx+vy*vy)<1000./31536000.){
     138                                IssmPDouble kappa = -10.;
     139                                for(int i=0;i<numnodes;i++){
     140                                        for(int j=0;j<numnodes;j++){
     141                                                Ke->values[i*numnodes+j] += D_scalar*kappa*(dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + dbasis[1*numnodes+j]*dbasis[1*numnodes+i]);
     142                                        }
     143                                }
     144                        }
     145
     146                        /*Advection: */
     147                        for(int i=0;i<numnodes;i++){
     148                                for(int j=0;j<numnodes;j++){
     149                                        Ke->values[i*numnodes+j] += (D_scalar*(vx*dbasis[0*numnodes+j]*basis[i] + vy*dbasis[1*numnodes+j]*basis[i]))*1e-2;
     150                                }
     151                        }
     152
     153                        /*Artificial diffusivity*/
     154                        vel=sqrt(vx*vx + vy*vy)+1.e-14;
     155                        D[0][0]=D_scalar*h/(2.*vel)*fabs(vx*vx);  D[0][1]=D_scalar*h/(2.*vel)*fabs(vx*vy);
     156                        D[1][0]=D_scalar*h/(2.*vel)*fabs(vy*vx);  D[1][1]=D_scalar*h/(2.*vel)*fabs(vy*vy);
     157                        TripleMultiply(Bprime,dim,numnodes,1,
     158                                                &D[0][0],2,2,0,
     159                                                Bprime,dim,numnodes,0,
     160                                                &Ke->values[0],1);
     161                }
    142162        }
    143163
Note: See TracChangeset for help on using the changeset viewer.