Changeset 24000


Ignore:
Timestamp:
06/07/19 13:46:04 (6 years ago)
Author:
tsantos
Message:

CHG: working on SUPG for ice thickness. Fixed a bug, added another part of the formulation

File:
1 edited

Legend:

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

    r23985 r24000  
    285285        IssmDouble Jdet,D_scalar,dt,h;
    286286        IssmDouble vel,vx,vy,dvxdx,dvydy;
    287         IssmDouble lambda_x,lambda_y,tau;
     287        IssmDouble xi,tau;
    288288        IssmDouble dvx[2],dvy[2];
    289289        IssmDouble* xyz_list = NULL;
     
    304304        ElementMatrix* Ke     = element->NewElementMatrix();
    305305        IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
     306        IssmDouble*             dbasis = xNew<IssmDouble>(dim*numnodes);
    306307        IssmDouble*    B      = xNew<IssmDouble>(dim*numnodes);
    307308        IssmDouble*    Bprime = xNew<IssmDouble>(dim*numnodes);
     
    367368                switch(stabilization){
    368369                        case 0:
    369                                 /*Nothing to be onde*/
     370                                /*Nothing to be done*/
    370371                                break;
    371372                        case 1:
     
    393394                                /*SUPG*/
    394395                                if(dim!=2) _error_("Stabilization "<<stabilization<<" not supported yet for dim != 2");
     396                                element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
     397                                vxaverage_input->GetInputAverage(&vx);
     398                                vyaverage_input->GetInputAverage(&vy);
    395399                                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;
     400                                //xi=0.3130;
     401                                xi=1;
     402                                tau=xi*h/(2*vel);
    399403                                break;
    400404                        default:
     
    415419                                                &Ke->values[0],1);
    416420                }
    417                 if(stabilization==5){
     421                if(stabilization==5){/*{{{*/
    418422                         /*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);
     423                        for(int i=0;i<numnodes;i++){
     424                                for(int j=0;j<numnodes;j++){
     425                                        Ke->values[i*numnodes+j]+=gauss->weight*Jdet*tau*basis[j]*(vx*dbasis[0*numnodes+i]+vy*dbasis[1*numnodes+i]);   
     426                                }
     427                        }
     428                        /*Mass matrix - part 3*/
     429                        for(int i=0;i<numnodes;i++){
     430                                for(int j=0;j<numnodes;j++){
     431                                        Ke->values[i*numnodes+j]+=gauss->weight*Jdet*tau*basis[j]*(basis[i]*dvxdx+basis[i]*dvydy);     
     432                                }
     433                        }
    426434                       
    427435                        /*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                        for(int i=0;i<numnodes;i++){
     437            for(int j=0;j<numnodes;j++){
     438               Ke->values[i*numnodes+j]+=dt*gauss->weight*Jdet*tau*(vx*dbasis[0*numnodes+j]+vy*dbasis[1*numnodes+j])*(vx*dbasis[0*numnodes+i]+vy*dbasis[1*numnodes+i]);
     439            }
     440         }
     441                        /*Advection matrix - part 3, A*/
     442                        for(int i=0;i<numnodes;i++){
     443            for(int j=0;j<numnodes;j++){
     444                                        Ke->values[i*numnodes+j]+=dt*gauss->weight*Jdet*tau*(vx*dbasis[0*numnodes+j]+vy*dbasis[1*numnodes+j])*(basis[i]*dvxdx+basis[i]*dvydy);
     445                                }
     446         }
     447
    436448                        /*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                
    444                 }
     449                        for(int i=0;i<numnodes;i++){
     450            for(int j=0;j<numnodes;j++){
     451                                        Ke->values[i*numnodes+j]+=dt*gauss->weight*Jdet*tau*(basis[j]*dvxdx+basis[j]*dvydy)*(vx*dbasis[0*numnodes+i]+vy*dbasis[1*numnodes+i]);
     452                                }
     453         }
     454                        /*Advection matrix - part 3, B*/
     455                        for(int i=0;i<numnodes;i++){
     456            for(int j=0;j<numnodes;j++){
     457                                        Ke->values[i*numnodes+j]+=dt*gauss->weight*Jdet*tau*(basis[j]*dvxdx+basis[j]*dvydy)*(basis[i]*dvxdx+basis[i]*dvydy);   
     458                                }
     459                        }
     460                }/*}}}*/
    445461        }
    446462
     
    448464        xDelete<IssmDouble>(xyz_list);
    449465        xDelete<IssmDouble>(basis);
     466        xDelete<IssmDouble>(dbasis);
    450467        xDelete<IssmDouble>(B);
    451468        xDelete<IssmDouble>(Bprime);
     
    559576        IssmDouble  Jdet,dt;
    560577        IssmDouble  ms,mb,gmb,fmb,thickness;
    561         IssmDouble  vx,vy,vel,lambda_x,lambda_y,h,tau;
     578        IssmDouble  vx,vy,vel,dvxdx,dvydy,xi,h,tau;
     579        IssmDouble  dvx[2],dvy[2];
    562580        IssmDouble  gllevelset,phi=1.;
    563581        IssmDouble* xyz_list = NULL;
     
    640658       
    641659                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*/
    651660                        element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
     661                        vxaverage_input->GetInputAverage(&vx);
     662                        vyaverage_input->GetInputAverage(&vy);
     663                        vxaverage_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
     664                        vyaverage_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
     665                        vel=sqrt(vx*vx+vy*vy)+1.e-8;
     666                        dvxdx=dvx[0];
     667                        dvydy=dvy[1];
     668                        //xi=0.3130;
     669                        xi=1;
     670                        tau=xi*h/(2*vel);
    652671                       
    653672                        /*Force vector - part 2*/
    654673                        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]);
     674                                pe->values[i]+=Jdet*gauss->weight*(thickness+dt*(ms-mb))*(tau*vx*dbasis[0*numnodes+i]+tau*vy*dbasis[1*numnodes+i]);
     675                        }
     676                        /*Force vector - part 3*/
     677                        for(int i=0;i<numnodes;i++){
     678                                pe->values[i]+=Jdet*gauss->weight*(thickness+dt*(ms-mb))*(tau*basis[i]*dvxdx+tau*basis[i]*dvydy);
    656679                        }
    657680                }
Note: See TracChangeset for help on using the changeset viewer.