Changeset 23985


Ignore:
Timestamp:
06/04/19 16:51:10 (6 years ago)
Author:
tsantos
Message:

NEW: added Streamline Updwind Petrov-Galerkin stabilization for Ice Thickness advection

Location:
issm/trunk-jpl/src
Files:
2 edited

Legend:

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

    r23959 r23985  
    285285        IssmDouble Jdet,D_scalar,dt,h;
    286286        IssmDouble vel,vx,vy,dvxdx,dvydy;
     287        IssmDouble lambda_x,lambda_y,tau;
    287288        IssmDouble dvx[2],dvy[2];
    288289        IssmDouble* xyz_list = NULL;
     
    389390                                }
    390391                                break;
     392                        case 5:
     393                                /*SUPG*/
     394                                if(dim!=2) _error_("Stabilization "<<stabilization<<" not supported yet for dim != 2");
     395                                vel=sqrt(vx*vx+vy*vy)+1.e-8;
     396                                tau=0.25;
     397                                lambda_x=tau*h*vx/vel;
     398                                lambda_y=tau*h*vy/vel;
     399                                break;
    391400                        default:
    392401                                _error_("Stabilization "<<stabilization<<" not supported yet");
     
    405414                                                Bprime,dim,numnodes,0,
    406415                                                &Ke->values[0],1);
     416                }
     417                if(stabilization==5){
     418                         /*Mass matrix - part 2*/
     419                        D_scalar=gauss->weight*Jdet;
     420                        D[0*dim+0]=D_scalar*lambda_x;
     421                        D[1*dim+1]=D_scalar*lambda_y;
     422                        TripleMultiply(Bprime,dim,numnodes,1,
     423                                                                D,dim,dim,0,
     424                                                                B,dim,numnodes,0,
     425                                                                &Ke->values[0],1);
     426                       
     427                        /*Advection matrix - part 2, A*/
     428                        D_scalar=dt*gauss->weight*Jdet;
     429                        D[0*dim+0]=D_scalar*dvxdx*lambda_x;
     430                        D[1*dim+1]=D_scalar*dvydy*lambda_y;
     431                        TripleMultiply(Bprime,dim,numnodes,1,
     432                                                D,dim,dim,0,
     433                                                B,dim,numnodes,0,
     434                                                &Ke->values[0],1);
     435                       
     436                        /*Advection matrix - part 2, B*/
     437                        D[0*dim+0]=D_scalar*vx*lambda_x;
     438                        D[1*dim+1]=D_scalar*vy*lambda_y;
     439                        TripleMultiply(Bprime,dim,numnodes,1,
     440                                                D,dim,dim,0,
     441                                                Bprime,dim,numnodes,0,
     442                                                &Ke->values[0],1);
     443               
    407444                }
    408445        }
     
    516553
    517554        /*Intermediaries */
     555        int                     stabilization,dim,domaintype;
    518556        int         melt_style,point1;
    519557        bool        mainlyfloating;
     
    521559        IssmDouble  Jdet,dt;
    522560        IssmDouble  ms,mb,gmb,fmb,thickness;
     561        IssmDouble  vx,vy,vel,lambda_x,lambda_y,h,tau;
    523562        IssmDouble  gllevelset,phi=1.;
    524563        IssmDouble* xyz_list = NULL;
    525564        Gauss*      gauss     = NULL;
    526565
     566        /*Get problem dimension*/
     567        element->FindParam(&domaintype,DomainTypeEnum);
     568        switch(domaintype){
     569                case Domain2DverticalEnum:   dim = 1; break;
     570                case Domain2DhorizontalEnum: dim = 2; break;
     571                case Domain3DEnum:           dim = 2; break;
     572                default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
     573        }
     574         
    527575        /*Fetch number of nodes and dof for this finite element*/
    528576        int numnodes = element->GetNumberOfNodes();
     
    531579        ElementVector* pe    = element->NewElementVector();
    532580        IssmDouble*    basis = xNew<IssmDouble>(numnodes);
     581        IssmDouble*    dbasis= xNew<IssmDouble>(dim*numnodes);
    533582
    534583        /*Retrieve all inputs and parameters*/
     
    536585        element->FindParam(&melt_style,GroundinglineMeltInterpolationEnum);
    537586        element->FindParam(&dt,TimesteppingTimeStepEnum);
     587        element->FindParam(&stabilization,MasstransportStabilizationEnum);
    538588        Input* gmb_input        = element->GetInput(BasalforcingsGroundediceMeltingRateEnum);  _assert_(gmb_input);
    539589        Input* fmb_input        = element->GetInput(BasalforcingsFloatingiceMeltingRateEnum);  _assert_(fmb_input);
     
    541591        Input* ms_input         = element->GetInput(SmbMassBalanceEnum);                       _assert_(ms_input);
    542592        Input* thickness_input  = element->GetInput(ThicknessEnum);                            _assert_(thickness_input);
    543 
     593        Input* vxaverage_input  = element->GetInput(VxAverageEnum);                                                                             _assert_(vxaverage_input);
     594        Input* vyaverage_input  = element->GetInput(VyAverageEnum);                                                                             _assert_(vyaverage_input);
     595
     596        h=element->CharacteristicLength();
     597       
    544598        /*Recover portion of element that is grounded*/
    545599        phi=element->GetGroundedPortion(xyz_list);
     
    584638
    585639                for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*(thickness+dt*(ms-mb))*basis[i];
     640       
     641                if(stabilization==5){ //SUPG
     642                        /*Prepare coefficients*/
     643                        vxaverage_input->GetInputValue(&vx,gauss);
     644                        vxaverage_input->GetInputValue(&vy,gauss);
     645                        vel = sqrt(vx*vx+vy*vy)+1.e-8;
     646                        tau=0.25;
     647                        lambda_x = tau*h*vx/vel;
     648                        lambda_y = tau*h*vy/vel;
     649       
     650                        /*Get nodal derivatives*/
     651                        element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
     652                       
     653                        /*Force vector - part 2*/
     654                        for(int i=0;i<numnodes;i++){
     655                                pe->values[i]+=Jdet*gauss->weight*(thickness+dt*(ms-mb))*(lambda_x*dbasis[numnodes*0+i]+lambda_y*dbasis[numnodes*1+i]);
     656                        }
     657                }
     658       
    586659        }
    587660
     
    589662        xDelete<IssmDouble>(xyz_list);
    590663        xDelete<IssmDouble>(basis);
     664        xDelete<IssmDouble>(dbasis);
    591665        delete gauss;
    592666        return pe;
  • issm/trunk-jpl/src/m/classes/masstransport.m

    r21049 r23985  
    9292                        md = checkfield(md,'fieldname','masstransport.isfreesurface','values',[0 1]);
    9393                        md = checkfield(md,'fieldname','masstransport.hydrostatic_adjustment','values',{'Absolute' 'Incremental'});
    94                         md = checkfield(md,'fieldname','masstransport.stabilization','values',[0 1 2 3 4]);
     94                        md = checkfield(md,'fieldname','masstransport.stabilization','values',[0 1 2 3 4 5]);
    9595                        md = checkfield(md,'fieldname','masstransport.min_thickness','>',0);
    9696                        md = checkfield(md,'fieldname','masstransport.requested_outputs','stringrow',1);
     
    103103                        fielddisplay(self,'min_thickness','minimum ice thickness allowed [m]');
    104104                        fielddisplay(self,'hydrostatic_adjustment','adjustment of ice shelves surface and bed elevations: ''Incremental'' or ''Absolute'' ');
    105                         fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding, 3: discontinuous Galerkin, 4: Flux Correction Transport');
     105                        fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding, 3: discontinuous Galerkin, 4: Flux Correction Transport, 5: streamline upwind Petrov-Galerkin (SUPG)');
    106106
    107107                        disp(sprintf('\n      %s','Penalty options:'));
Note: See TracChangeset for help on using the changeset viewer.