Changeset 17331


Ignore:
Timestamp:
02/21/14 09:21:47 (11 years ago)
Author:
seroussi
Message:

NEW: added mass transport for flowline models

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

Legend:

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

    r17277 r17331  
    261261        /*Intermediaries */
    262262        int        stabilization;
    263         int        meshtype;
     263        int        meshtype,dim;
    264264        IssmDouble Jdet,D_scalar,dt,h;
    265265        IssmDouble vel,vx,vy,dvxdx,dvydy;
     
    267267        IssmDouble* xyz_list = NULL;
    268268
     269        /*Get problem dimension*/
     270        element->FindParam(&meshtype,MeshTypeEnum);
     271        switch(meshtype){
     272                case Mesh2DverticalEnum:   dim = 1; break;
     273                case Mesh2DhorizontalEnum: dim = 2; break;
     274                case Mesh3DEnum:           dim = 2; break;
     275                default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
     276        }
     277
    269278        /*Fetch number of nodes and dof for this finite element*/
    270279        int numnodes = element->GetNumberOfNodes();
     
    273282        ElementMatrix* Ke     = element->NewElementMatrix();
    274283        IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
    275         IssmDouble*    B      = xNew<IssmDouble>(2*numnodes);
    276         IssmDouble*    Bprime = xNew<IssmDouble>(2*numnodes);
    277         IssmDouble     D[2][2]={0.};
     284        IssmDouble*    B      = xNew<IssmDouble>(dim*numnodes);
     285        IssmDouble*    Bprime = xNew<IssmDouble>(dim*numnodes);
     286        IssmDouble*    D      = xNewZeroInit<IssmDouble>(dim*dim);
    278287
    279288        /*Retrieve all inputs and parameters*/
     
    290299        else{
    291300                vxaverage_input=element->GetInput(VxAverageEnum); _assert_(vxaverage_input);
    292                 vyaverage_input=element->GetInput(VyAverageEnum); _assert_(vyaverage_input);
     301                if(dim==2) vyaverage_input=element->GetInput(VyAverageEnum); _assert_(vyaverage_input);
     302
    293303        }
    294304        h = element->CharacteristicLength();
     
    303313
    304314                vxaverage_input->GetInputValue(&vx,gauss);
    305                 vyaverage_input->GetInputValue(&vy,gauss);
    306315                vxaverage_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
    307                 vyaverage_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
     316                if(dim==2){
     317                        vyaverage_input->GetInputValue(&vy,gauss);
     318                        vyaverage_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
     319                }
    308320
    309321                D_scalar=gauss->weight*Jdet;
     
    313325                                        &Ke->values[0],1);
    314326
    315                 GetB(B,element,xyz_list,gauss);
    316                 GetBprime(Bprime,element,xyz_list,gauss);
     327                GetB(B,element,dim,xyz_list,gauss);
     328                GetBprime(Bprime,element,dim,xyz_list,gauss);
    317329
    318330                dvxdx=dvx[0];
    319                 dvydy=dvy[1];
     331                if(dim==2) dvydy=dvy[1];
    320332                D_scalar=dt*gauss->weight*Jdet;
    321333
    322                 D[0][0]=D_scalar*dvxdx;
    323                 D[1][1]=D_scalar*dvydy;
    324                 TripleMultiply(B,2,numnodes,1,
    325                                         &D[0][0],2,2,0,
    326                                         B,2,numnodes,0,
     334                D[0*dim+0]=D_scalar*dvxdx;
     335                if(dim==2) D[1*dim+1]=D_scalar*dvydy;
     336
     337                TripleMultiply(B,dim,numnodes,1,
     338                                        D,dim,dim,0,
     339                                        B,dim,numnodes,0,
    327340                                        &Ke->values[0],1);
    328341
    329                 D[0][0]=D_scalar*vx;
    330                 D[1][1]=D_scalar*vy;
    331                 TripleMultiply(B,2,numnodes,1,
    332                                         &D[0][0],2,2,0,
    333                                         Bprime,2,numnodes,0,
     342                D[0*dim+0]=D_scalar*vx;
     343                if(dim==2) D[1*dim+1]=D_scalar*vy;
     344
     345                TripleMultiply(B,dim,numnodes,1,
     346                                        D,dim,dim,0,
     347                                        Bprime,dim,numnodes,0,
    334348                                        &Ke->values[0],1);
    335349
    336350                if(stabilization==2){
    337                         /*Streamline upwinding*/
    338                         vel=sqrt(vx*vx+vy*vy)+1.e-8;
    339                         D[0][0]=h/(2*vel)*vx*vx;
    340                         D[1][0]=h/(2*vel)*vy*vx;
    341                         D[0][1]=h/(2*vel)*vx*vy;
    342                         D[1][1]=h/(2*vel)*vy*vy;
     351                        if(dim==1){
     352                                vel=fabs(vx)+1.e-8;
     353                                D[0]=h/(2*vel)*vx*vx;
     354                        }
     355                        else{
     356                                /*Streamline upwinding*/
     357                                vel=sqrt(vx*vx+vy*vy)+1.e-8;
     358                                D[0*dim+0]=h/(2*vel)*vx*vx;
     359                                D[1*dim+0]=h/(2*vel)*vy*vx;
     360                                D[0*dim+1]=h/(2*vel)*vx*vy;
     361                                D[1*dim+1]=h/(2*vel)*vy*vy;
     362                        }
    343363                }
    344364                else if(stabilization==1){
    345365                        /*SSA*/
    346366                        vxaverage_input->GetInputAverage(&vx);
    347                         vyaverage_input->GetInputAverage(&vy);
    348                         D[0][0]=h/2.0*fabs(vx);
    349                         D[1][1]=h/2.0*fabs(vy);
     367                        if(dim==2) vyaverage_input->GetInputAverage(&vy);
     368                        D[0*dim+0]=h/2.0*fabs(vx);
     369                        if(dim==2) D[1*dim+1]=h/2.0*fabs(vy);
    350370                }
    351371                if(stabilization==1 || stabilization==2){
    352                         D[0][0]=D_scalar*D[0][0];
    353                         D[1][0]=D_scalar*D[1][0];
    354                         D[0][1]=D_scalar*D[0][1];
    355                         D[1][1]=D_scalar*D[1][1];
    356                         TripleMultiply(Bprime,2,numnodes,1,
    357                                                 &D[0][0],2,2,0,
    358                                                 Bprime,2,numnodes,0,
     372                        if(dim==1) D[0]=D_scalar*D[0];
     373                        else{
     374                                D[0*dim+0]=D_scalar*D[0*dim+0];
     375                                D[1*dim+0]=D_scalar*D[1*dim+0];
     376                                D[0*dim+1]=D_scalar*D[0*dim+1];
     377                                D[1*dim+1]=D_scalar*D[1*dim+1];
     378                        }
     379
     380                        TripleMultiply(Bprime,dim,numnodes,1,
     381                                                D,dim,dim,0,
     382                                                Bprime,dim,numnodes,0,
    359383                                                &Ke->values[0],1);
    360384                }
     
    366390        xDelete<IssmDouble>(B);
    367391        xDelete<IssmDouble>(Bprime);
     392        xDelete<IssmDouble>(D);
    368393        delete gauss;
    369394        return Ke;
     
    422447
    423448                /*WARNING: B and Bprime are inverted compared to CG*/
    424                 GetB(Bprime,element,xyz_list,gauss);
    425                 GetBprime(B,element,xyz_list,gauss);
     449                GetB(Bprime,element,2,xyz_list,gauss);
     450                GetBprime(B,element,2,xyz_list,gauss);
    426451
    427452                D_scalar = - dt*gauss->weight*Jdet;
     
    568593        return pe;
    569594}/*}}}*/
    570 void MasstransportAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
     595void MasstransportAnalysis::GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
    571596        /*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2.
    572597         * For node i, Bi can be expressed in the actual coordinate system
     
    588613        /*Build B: */
    589614        for(int i=0;i<numnodes;i++){
    590                 B[numnodes*0+i] = basis[i];
    591                 B[numnodes*1+i] = basis[i];
     615                for(int j=0;j<dim;j++){
     616                        B[numnodes*j+i] = basis[i];
     617                }
    592618        }
    593619
     
    595621        xDelete<IssmDouble>(basis);
    596622}/*}}}*/
    597 void MasstransportAnalysis::GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
     623void MasstransportAnalysis::GetBprime(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
    598624        /*Compute B'  matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2.
    599625         * For node i, Bi' can be expressed in the actual coordinate system
     
    610636
    611637        /*Get nodal functions derivatives*/
    612         IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes);
     638        IssmDouble* dbasis=xNew<IssmDouble>(dim*numnodes);
    613639        element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
    614640
    615641        /*Build B': */
    616642        for(int i=0;i<numnodes;i++){
    617                 Bprime[numnodes*0+i] = dbasis[0*numnodes+i];
    618                 Bprime[numnodes*1+i] = dbasis[1*numnodes+i];
     643                for(int j=0;j<dim;j++){
     644                        Bprime[numnodes*j+i] = dbasis[j*numnodes+i];
     645                }
    619646        }
    620647
  • issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.h

    r17212 r17331  
    3030                ElementVector* CreatePVectorCG(Element* element);
    3131                ElementVector* CreatePVectorDG(Element* element);
    32                 void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
    33                 void GetBprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
     32                void GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
     33                void GetBprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
    3434                void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
    3535                void InputUpdateFromSolution(IssmDouble* solution,Element* element);
Note: See TracChangeset for help on using the changeset viewer.