Changeset 16843


Ignore:
Timestamp:
11/20/13 21:11:25 (11 years ago)
Author:
Mathieu Morlighem
Message:

NEW: done with bal H

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

Legend:

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

    r16832 r16843  
    115115/*Finite Element Analysis*/
    116116ElementMatrix* BalancethicknessAnalysis::CreateKMatrix(Element* element){/*{{{*/
    117         _error_("not implemented yet");
     117
     118        if(!element->IsOnBed()) return NULL;
     119        Element* basalelement = element->SpawnBasalElement();
     120
     121        int meshtype;
     122        element->FindParam(&meshtype,MeshTypeEnum);
     123
     124        switch(element->FiniteElement()){
     125                case P1Enum: case P2Enum:
     126                        return CreateKMatrixCG(basalelement);
     127                case P1DGEnum:
     128                        return CreateKMatrixDG(basalelement);
     129                default:
     130                        _error_("Element type " << EnumToStringx(element->FiniteElement()) << " not supported yet");
     131        }
     132}/*}}}*/
     133ElementMatrix* BalancethicknessAnalysis::CreateKMatrixCG(Element* element){/*{{{*/
     134
     135        /*Intermediaries */
     136        int        stabilization;
     137        int        meshtype;
     138        IssmDouble Jdet,D_scalar,h;
     139        IssmDouble vel,vx,vy,dvxdx,dvydy;
     140        IssmDouble dvx[2],dvy[2];
     141        IssmDouble* xyz_list = NULL;
     142
     143        /*Fetch number of nodes and dof for this finite element*/
     144        int numnodes = element->GetNumberOfNodes();
     145
     146        /*Initialize Element vector and other vectors*/
     147        ElementMatrix* Ke     = element->NewElementMatrix();
     148        IssmDouble*    B      = xNew<IssmDouble>(2*numnodes);
     149        IssmDouble*    Bprime = xNew<IssmDouble>(2*numnodes);
     150        IssmDouble     D[2][2];
     151
     152        /*Retrieve all inputs and parameters*/
     153        element->GetVerticesCoordinates(&xyz_list);
     154        element->FindParam(&meshtype,MeshTypeEnum);
     155        element->FindParam(&stabilization,BalancethicknessStabilizationEnum);
     156        Input* vxaverage_input=NULL;
     157        Input* vyaverage_input=NULL;
     158        if(meshtype==Mesh2DhorizontalEnum){
     159                vxaverage_input=element->GetInput(VxEnum); _assert_(vxaverage_input);
     160                vyaverage_input=element->GetInput(VyEnum); _assert_(vyaverage_input);
     161        }
     162        else{
     163                vxaverage_input=element->GetInput(VxAverageEnum); _assert_(vxaverage_input);
     164                vyaverage_input=element->GetInput(VyAverageEnum); _assert_(vyaverage_input);
     165        }
     166        h = element->CharacteristicLength();
     167
     168        /* Start  looping on the number of gaussian points: */
     169        Gauss* gauss=element->NewGauss(2);
     170        for(int ig=gauss->begin();ig<gauss->end();ig++){
     171                gauss->GaussPoint(ig);
     172
     173                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
     174                GetB(B,element,xyz_list,gauss);
     175                GetBprime(Bprime,element,xyz_list,gauss);
     176
     177                vxaverage_input->GetInputValue(&vx,gauss);
     178                vyaverage_input->GetInputValue(&vy,gauss);
     179                vxaverage_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
     180                vyaverage_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
     181                dvxdx=dvx[0];
     182                dvydy=dvy[1];
     183                D_scalar=gauss->weight*Jdet;
     184
     185                D[0][0]=D_scalar*dvxdx;
     186                D[0][1]=0.;
     187                D[1][0]=0.;
     188                D[1][1]=D_scalar*dvydy;
     189                TripleMultiply(B,2,numnodes,1,
     190                                        &D[0][0],2,2,0,
     191                                        B,2,numnodes,0,
     192                                        &Ke->values[0],1);
     193
     194                D[0][0]=D_scalar*vx;
     195                D[1][1]=D_scalar*vy;
     196                TripleMultiply(B,2,numnodes,1,
     197                                        &D[0][0],2,2,0,
     198                                        Bprime,2,numnodes,0,
     199                                        &Ke->values[0],1);
     200
     201                if(stabilization==1){
     202                        /*Streamline upwinding*/
     203                        vel=sqrt(vx*vx+vy*vy);
     204                        D[0][0]=h/(2*vel)*vx*vx;
     205                        D[1][0]=h/(2*vel)*vy*vx;
     206                        D[0][1]=h/(2*vel)*vx*vy;
     207                        D[1][1]=h/(2*vel)*vy*vy;
     208                }
     209                else if(stabilization==2){
     210                        /*SSA*/
     211                        vxaverage_input->GetInputAverage(&vx);
     212                        vyaverage_input->GetInputAverage(&vy);
     213                        D[0][0]=h/2.0*fabs(vx);
     214                        D[0][1]=0.;
     215                        D[1][0]=0.;
     216                        D[1][1]=h/2.0*fabs(vy);
     217                }
     218                if(stabilization==1 || stabilization==2){
     219                        D[0][0]=D_scalar*D[0][0];
     220                        D[1][0]=D_scalar*D[1][0];
     221                        D[0][1]=D_scalar*D[0][1];
     222                        D[1][1]=D_scalar*D[1][1];
     223                        TripleMultiply(Bprime,2,numnodes,1,
     224                                                &D[0][0],2,2,0,
     225                                                Bprime,2,numnodes,0,
     226                                                &Ke->values[0],1);
     227                }
     228        }
     229
     230        /*Clean up and return*/
     231        xDelete<IssmDouble>(xyz_list);
     232        xDelete<IssmDouble>(B);
     233        xDelete<IssmDouble>(Bprime);
     234        delete gauss;
     235        return Ke;
     236}/*}}}*/
     237ElementMatrix* BalancethicknessAnalysis::CreateKMatrixDG(Element* element){/*{{{*/
     238
     239        /*Intermediaries */
     240        int        meshtype;
     241        IssmDouble Jdet,D_scalar,vx,vy,dvxdx,dvydy,vel;
     242        IssmDouble dvx[2],dvy[2];
     243        IssmDouble* xyz_list = NULL;
     244
     245        /*Fetch number of nodes and dof for this finite element*/
     246        int numnodes = element->GetNumberOfNodes();
     247
     248        /*Initialize Element vector and other vectors*/
     249        ElementMatrix* Ke     = element->NewElementMatrix();
     250        IssmDouble*    B      = xNew<IssmDouble>(2*numnodes);
     251        IssmDouble*    Bprime = xNew<IssmDouble>(2*numnodes);
     252        IssmDouble     D[2][2];
     253
     254        /*Retrieve all inputs and parameters*/
     255        element->GetVerticesCoordinates(&xyz_list);
     256        element->FindParam(&meshtype,MeshTypeEnum);
     257        Input* vxaverage_input=NULL;
     258        Input* vyaverage_input=NULL;
     259        if(meshtype==Mesh2DhorizontalEnum){
     260                vxaverage_input=element->GetInput(VxEnum); _assert_(vxaverage_input);
     261                vyaverage_input=element->GetInput(VyEnum); _assert_(vyaverage_input);
     262        }
     263        else{
     264                vxaverage_input=element->GetInput(VxAverageEnum); _assert_(vxaverage_input);
     265                vyaverage_input=element->GetInput(VyAverageEnum); _assert_(vyaverage_input);
     266        }
     267
     268        /* Start  looping on the number of gaussian points: */
     269        Gauss* gauss=element->NewGauss(2);
     270        for(int ig=gauss->begin();ig<gauss->end();ig++){
     271                gauss->GaussPoint(ig);
     272
     273                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
     274                vxaverage_input->GetInputValue(&vx,gauss);
     275                vyaverage_input->GetInputValue(&vy,gauss);
     276                vxaverage_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
     277                vyaverage_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
     278                D_scalar=gauss->weight*Jdet;
     279
     280                /*WARNING: B and Bprime are inverted compared to CG*/
     281                GetB(Bprime,element,xyz_list,gauss);
     282                GetBprime(B,element,xyz_list,gauss);
     283
     284                D_scalar = - gauss->weight*Jdet;
     285                D[0][0]  = D_scalar*vx;
     286                D[0][1]  = 0.;
     287                D[1][0]  = 0.;
     288                D[1][1]  = D_scalar*vy;
     289                TripleMultiply(B,2,numnodes,1,
     290                                        &D[0][0],2,2,0,
     291                                        Bprime,2,numnodes,0,
     292                                        &Ke->values[0],1);
     293
     294        }
     295
     296        /*Clean up and return*/
     297        xDelete<IssmDouble>(xyz_list);
     298        xDelete<IssmDouble>(B);
     299        xDelete<IssmDouble>(Bprime);
     300        delete gauss;
     301        return Ke;
    118302}/*}}}*/
    119303ElementVector* BalancethicknessAnalysis::CreatePVector(Element* element){/*{{{*/
     
    213397        delete gauss;
    214398        return pe;
     399}/*}}}*/
     400void BalancethicknessAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
     401        /*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2.
     402         * For node i, Bi can be expressed in the actual coordinate system
     403         * by:
     404         *       Bi=[ N ]
     405         *          [ N ]
     406         * where N is the finiteelement function for node i.
     407         *
     408         * We assume B_prog has been allocated already, of size: 2x(NDOF1*numnodes)
     409         */
     410
     411        /*Fetch number of nodes for this finite element*/
     412        int numnodes = element->GetNumberOfNodes();
     413
     414        /*Get nodal functions*/
     415        IssmDouble* basis=xNew<IssmDouble>(numnodes);
     416        element->NodalFunctions(basis,gauss);
     417
     418        /*Build B: */
     419        for(int i=0;i<numnodes;i++){
     420                B[numnodes*0+i] = basis[i];
     421                B[numnodes*1+i] = basis[i];
     422        }
     423
     424        /*Clean-up*/
     425        xDelete<IssmDouble>(basis);
     426}/*}}}*/
     427void BalancethicknessAnalysis::GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
     428        /*Compute B'  matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2.
     429         * For node i, Bi' can be expressed in the actual coordinate system
     430         * by:
     431         *       Bi_prime=[ dN/dx ]
     432         *                [ dN/dy ]
     433         * where N is the finiteelement function for node i.
     434         *
     435         * We assume B' has been allocated already, of size: 3x(NDOF2*numnodes)
     436         */
     437
     438        /*Fetch number of nodes for this finite element*/
     439        int numnodes = element->GetNumberOfNodes();
     440
     441        /*Get nodal functions derivatives*/
     442        IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes);
     443        element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
     444
     445        /*Build B': */
     446        for(int i=0;i<numnodes;i++){
     447                Bprime[numnodes*0+i] = dbasis[0*numnodes+i];
     448                Bprime[numnodes*1+i] = dbasis[1*numnodes+i];
     449        }
     450
     451        /*Clean-up*/
     452        xDelete<IssmDouble>(dbasis);
     453
    215454}/*}}}*/
    216455void BalancethicknessAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
  • issm/trunk-jpl/src/c/analyses/BalancethicknessAnalysis.h

    r16811 r16843  
    2222                /*Finite element Analysis*/
    2323                ElementMatrix* CreateKMatrix(Element* element);
     24                ElementMatrix* CreateKMatrixCG(Element* element);
     25                ElementMatrix* CreateKMatrixDG(Element* element);
    2426                ElementVector* CreatePVector(Element* element);
    2527                ElementVector* CreatePVectorCG(Element* element);
    2628                ElementVector* CreatePVectorDG(Element* element);
     29                void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
     30                void GetBprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
    2731                void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
    2832                void InputUpdateFromSolution(IssmDouble* solution,Element* element);
Note: See TracChangeset for help on using the changeset viewer.