Changeset 22977


Ignore:
Timestamp:
07/19/18 14:59:24 (7 years ago)
Author:
tpelle
Message:

CHG: advection now working

File:
1 edited

Legend:

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

    r22974 r22977  
    6262        int        domaintype,dim;
    6363        IssmDouble Jdet,D_scalar;
    64         IssmDouble vel,vx,vy,dvxdx,dvydy;
    65         IssmDouble dvx[2],dvy[2];
     64        IssmDouble vel,vx,vy;
    6665        IssmDouble* xyz_list = NULL;
    6766
     
    8079        ElementMatrix* Ke     = element->NewElementMatrix();
    8180        IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
    82         IssmDouble*    B      = xNew<IssmDouble>(dim*numnodes);
     81        IssmDouble*    dbasis = xNew<IssmDouble>(dim*numnodes);
    8382        IssmDouble*    Bprime = xNew<IssmDouble>(dim*numnodes);
    84         IssmDouble    D[2][2] = {0.};
     83        IssmDouble     D[2][2] = {0.};
    8584
    8685        /*Retrieve all inputs and parameters*/
    8786        element->GetVerticesCoordinates(&xyz_list);
    88         Input* vx_input=element->GetInput(BaseSlopeXEnum); _assert_(vx_input);
    89         Input* vy_input=element->GetInput(BaseSlopeYEnum); _assert_(vy_input);
     87        //Input* vx_input=element->GetInput(BaseSlopeXEnum); _assert_(vx_input);
     88        //Input* vy_input=element->GetInput(BaseSlopeYEnum); _assert_(vy_input);
     89        Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input);
     90        Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input);
    9091
    9192        IssmDouble h = element->CharacteristicLength();
    9293
    9394        /* Start  looping on the number of gaussian points: */
    94         Gauss* gauss=element->NewGauss(2);
     95        Gauss* gauss=element->NewGauss(4);
    9596        for(int ig=gauss->begin();ig<gauss->end();ig++){
    9697                gauss->GaussPoint(ig);
    9798
    9899                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
    99                 GetB(B,element,dim,xyz_list,gauss);
     100                element->NodalFunctions(basis,gauss);
     101                element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
    100102                GetBprime(Bprime,element,dim,xyz_list,gauss);
    101103
     104                D_scalar=gauss->weight*Jdet;
     105
     106                /*Diffusion */
     107                if(sqrt(vx*vx+vy*vy)<10./31536000.){
     108                        IssmPDouble kappa = 1.e-4;
     109                        for(int i=0;i<numnodes;i++){
     110                                for(int j=0;j<numnodes;j++){
     111                                        Ke->values[i*numnodes+j] += D_scalar*kappa*(dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + dbasis[1*numnodes+j]*dbasis[1*numnodes+i]);
     112                                }
     113                        }
     114                }
     115
     116                /*Advection: */
    102117                vx_input->GetInputValue(&vx,gauss);
    103118                vy_input->GetInputValue(&vy,gauss);
    104                 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
    105                 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
    106                 dvxdx=dvx[0];
    107                 dvydy=dvy[1];
    108                 D_scalar=gauss->weight*Jdet;
    109 
    110                 /*Advection*/
    111                 //D[0][0]=D_scalar*dvxdx;
    112                 //D[0][1]=0.;
    113                 //D[1][0]=0.;
    114                 //D[1][1]=D_scalar*dvydy;
    115                 //TripleMultiply(B,2,numnodes,1,
    116                 //                      &D[0][0],2,2,0,
    117                 //                      B,2,numnodes,0,
    118                 //                      &Ke->values[0],1);
    119 
    120                 //vx = 0.;
    121                 //vy = -.1;
    122                 if(sqrt(vx*vx+vy*vy)>0.28){
    123                         /*Advection*/
    124                         D[0][0]=D_scalar*vx;
    125                         D[1][1]=D_scalar*vy;
    126                         TripleMultiply(B,2,numnodes,1,
    127                                                 &D[0][0],2,2,0,
    128                                                 Bprime,2,numnodes,0,
    129                                                 &Ke->values[0],1);
    130                 }
    131                 else{
    132                         /*Diffusion*/
    133                         D[0][0]=1e5*h/2.0;
    134                         D[1][1]=1e5*h/2.0;
    135                         TripleMultiply(Bprime,2,numnodes,1,
    136                                                 &D[0][0],2,2,0,
    137                                                 Bprime,2,numnodes,0,
    138                                                 &Ke->values[0],1);
    139                 }
    140 
    141                 /*Stabilization*/
    142                 D[0][0]=h/2.0*fabs(vx);
    143                 D[0][1]=0.;
    144                 D[1][0]=0.;
    145                 D[1][1]=h/2.0*fabs(vy);
    146                 TripleMultiply(Bprime,2,numnodes,1,
     119                for(int i=0;i<numnodes;i++){
     120                        for(int j=0;j<numnodes;j++){
     121                                Ke->values[i*numnodes+j] += D_scalar*(vx*dbasis[0*numnodes+j]*basis[i] + vy*dbasis[1*numnodes+j]*basis[i]);
     122                        }
     123                }
     124
     125                /*Artifficial diffusivity*/
     126                vel=sqrt(vx*vx + vy*vy)+1.e-14;
     127                D[0][0]=D_scalar*h/(2.*vel)*fabs(vx*vx);  D[0][1]=D_scalar*h/(2.*vel)*fabs(vx*vy);
     128                D[1][0]=D_scalar*h/(2.*vel)*fabs(vy*vx);  D[1][1]=D_scalar*h/(2.*vel)*fabs(vy*vy);
     129                TripleMultiply(Bprime,dim,numnodes,1,
    147130                                        &D[0][0],2,2,0,
    148                                         Bprime,2,numnodes,0,
     131                                        Bprime,dim,numnodes,0,
    149132                                        &Ke->values[0],1);
    150133        }
     
    152135        /*Clean up and return*/
    153136        xDelete<IssmDouble>(xyz_list);
    154         xDelete<IssmDouble>(B);
     137        xDelete<IssmDouble>(basis);
     138        xDelete<IssmDouble>(dbasis);
    155139        xDelete<IssmDouble>(Bprime);
    156140        delete gauss;
Note: See TracChangeset for help on using the changeset viewer.