Changeset 16875


Ignore:
Timestamp:
11/21/13 19:51:14 (12 years ago)
Author:
Mathieu Morlighem
Message:

NEW: added KMatrix damage

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

Legend:

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

    r16865 r16875  
    9696/*Finite Element Analysis*/
    9797ElementMatrix* DamageEvolutionAnalysis::CreateKMatrix(Element* element){/*{{{*/
    98         _error_("not implemented yet");
    99 }/*}}}*/
    100 ElementVector* DamageEvolutionAnalysis::CreatePVector(Element* element){/*{{{*/
    10198
    10299        /*Intermediaries*/
     
    118115
    119116        /*Intermediaries */
     117        int         stabilization;
     118        IssmDouble  Jdet,dt,D_scalar;
     119        IssmDouble  vel,vx,vy,dvxdx,dvydy,dvx[2],dvy[2];
     120        IssmDouble *xyz_list  = NULL;
     121
     122        /*Fetch number of nodes and dof for this finite element*/
     123        int numnodes = basalelement->GetNumberOfNodes();
     124
     125        /*Initialize Element vector*/
     126        ElementMatrix* Ke     = basalelement->NewElementMatrix(NoneApproximationEnum);
     127        IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
     128        IssmDouble*    B      = xNew<IssmDouble>(2*numnodes);
     129        IssmDouble*    Bprime = xNew<IssmDouble>(2*numnodes);
     130        IssmDouble     D[2][2]={0.};
     131
     132        /*Retrieve all inputs and parameters*/
     133        basalelement->GetVerticesCoordinates(&xyz_list);
     134        basalelement->FindParam(&dt,TimesteppingTimeStepEnum);
     135        basalelement->FindParam(&stabilization,DamageStabilizationEnum);
     136        Input* vxaverage_input=NULL;
     137        Input* vyaverage_input=NULL;
     138        if(meshtype==Mesh2DhorizontalEnum){
     139                vxaverage_input=basalelement->GetInput(VxEnum); _assert_(vxaverage_input);
     140                vyaverage_input=basalelement->GetInput(VyEnum); _assert_(vyaverage_input);
     141        }
     142        else{
     143                vxaverage_input=basalelement->GetInput(VxAverageEnum); _assert_(vxaverage_input);
     144                vyaverage_input=basalelement->GetInput(VyAverageEnum); _assert_(vyaverage_input);
     145        }
     146        IssmDouble h=basalelement->CharacteristicLength();
     147
     148        /* Start  looping on the number of gaussian points: */
     149        Gauss* gauss=basalelement->NewGauss(2);
     150        for(int ig=gauss->begin();ig<gauss->end();ig++){
     151                gauss->GaussPoint(ig);
     152
     153                basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
     154                basalelement->NodalFunctions(basis,gauss);
     155                D_scalar=gauss->weight*Jdet;
     156
     157                vxaverage_input->GetInputValue(&vx,gauss);
     158                vyaverage_input->GetInputValue(&vy,gauss);
     159                vxaverage_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
     160                vyaverage_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
     161
     162                TripleMultiply(basis,1,numnodes,1,
     163                                        &D_scalar,1,1,0,
     164                                        basis,1,numnodes,0,
     165                                        &Ke->values[0],1);
     166
     167                GetB(B,element,xyz_list,gauss);
     168                GetBprime(Bprime,element,xyz_list,gauss);
     169
     170                dvxdx=dvx[0];
     171                dvydy=dvy[1];
     172                D_scalar=dt*gauss->weight*Jdet;
     173
     174                D[0][0]=D_scalar*dvxdx;
     175                D[1][1]=D_scalar*dvydy;
     176                TripleMultiply(B,2,numnodes,1,
     177                                        &D[0][0],2,2,0,
     178                                        B,2,numnodes,0,
     179                                        &Ke->values[0],1);
     180
     181                D[0][0]=D_scalar*vx;
     182                D[1][1]=D_scalar*vy;
     183                TripleMultiply(B,2,numnodes,1,
     184                                        &D[0][0],2,2,0,
     185                                        Bprime,2,numnodes,0,
     186                                        &Ke->values[0],1);
     187
     188                if(stabilization==2){
     189                        /*Streamline upwinding*/
     190                        vel=sqrt(vx*vx+vy*vy)+1.e-8;
     191                        D[0][0]=h/(2*vel)*vx*vx;
     192                        D[1][0]=h/(2*vel)*vy*vx;
     193                        D[0][1]=h/(2*vel)*vx*vy;
     194                        D[1][1]=h/(2*vel)*vy*vy;
     195                }
     196                else if(stabilization==1){
     197                        /*SSA*/
     198                        vxaverage_input->GetInputAverage(&vx);
     199                        vyaverage_input->GetInputAverage(&vy);
     200                        D[0][0]=h/2.0*fabs(vx);
     201                        D[0][1]=0.;
     202                        D[1][0]=0.;
     203                        D[1][1]=h/2.0*fabs(vy);
     204                }
     205                if(stabilization==1 || stabilization==2){
     206                        D[0][0]=D_scalar*D[0][0];
     207                        D[1][0]=D_scalar*D[1][0];
     208                        D[0][1]=D_scalar*D[0][1];
     209                        D[1][1]=D_scalar*D[1][1];
     210                        TripleMultiply(Bprime,2,numnodes,1,
     211                                                &D[0][0],2,2,0,
     212                                                Bprime,2,numnodes,0,
     213                                                &Ke->values[0],1);
     214                }
     215
     216        }
     217
     218        /*Clean up and return*/
     219        xDelete<IssmDouble>(xyz_list);
     220        xDelete<IssmDouble>(basis);
     221        xDelete<IssmDouble>(B);
     222        xDelete<IssmDouble>(Bprime);
     223        delete gauss;
     224        if(meshtype!=Mesh2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
     225        return Ke;
     226}/*}}}*/
     227ElementVector* DamageEvolutionAnalysis::CreatePVector(Element* element){/*{{{*/
     228
     229        /*Intermediaries*/
     230        int      meshtype;
     231        Element* basalelement;
     232
     233        /*Get basal element*/
     234        element->FindParam(&meshtype,MeshTypeEnum);
     235        switch(meshtype){
     236                case Mesh2DhorizontalEnum:
     237                        basalelement = element;
     238                        break;
     239                case Mesh3DEnum:
     240                        if(!element->IsOnBed()) return NULL;
     241                        basalelement = element->SpawnBasalElement();
     242                        break;
     243                default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
     244        }
     245
     246        /*Intermediaries */
    120247        IssmDouble  Jdet,dt;
    121248        IssmDouble  f,damage;
     
    156283        delete gauss;
    157284        return pe;
     285}/*}}}*/
     286void DamageEvolutionAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
     287        /*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2.
     288         * For node i, Bi can be expressed in the actual coordinate system
     289         * by:
     290         *       Bi=[ N ]
     291         *          [ N ]
     292         * where N is the finiteelement function for node i.
     293         *
     294         * We assume B_prog has been allocated already, of size: 2x(NDOF1*numnodes)
     295         */
     296
     297        /*Fetch number of nodes for this finite element*/
     298        int numnodes = element->GetNumberOfNodes();
     299
     300        /*Get nodal functions*/
     301        IssmDouble* basis=xNew<IssmDouble>(numnodes);
     302        element->NodalFunctions(basis,gauss);
     303
     304        /*Build B: */
     305        for(int i=0;i<numnodes;i++){
     306                B[numnodes*0+i] = basis[i];
     307                B[numnodes*1+i] = basis[i];
     308        }
     309
     310        /*Clean-up*/
     311        xDelete<IssmDouble>(basis);
     312}/*}}}*/
     313void DamageEvolutionAnalysis::GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
     314        /*Compute B'  matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2.
     315         * For node i, Bi' can be expressed in the actual coordinate system
     316         * by:
     317         *       Bi_prime=[ dN/dx ]
     318         *                [ dN/dy ]
     319         * where N is the finiteelement function for node i.
     320         *
     321         * We assume B' has been allocated already, of size: 3x(NDOF2*numnodes)
     322         */
     323
     324        /*Fetch number of nodes for this finite element*/
     325        int numnodes = element->GetNumberOfNodes();
     326
     327        /*Get nodal functions derivatives*/
     328        IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes);
     329        element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
     330
     331        /*Build B': */
     332        for(int i=0;i<numnodes;i++){
     333                Bprime[numnodes*0+i] = dbasis[0*numnodes+i];
     334                Bprime[numnodes*1+i] = dbasis[1*numnodes+i];
     335        }
     336
     337        /*Clean-up*/
     338        xDelete<IssmDouble>(dbasis);
     339
    158340}/*}}}*/
    159341void DamageEvolutionAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
  • issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.h

    r16848 r16875  
    2323                ElementMatrix* CreateKMatrix(Element* element);
    2424                ElementVector* CreatePVector(Element* element);
     25                void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
     26                void GetBprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
    2527                void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
    2628                void InputUpdateFromSolution(IssmDouble* solution,Element* element);
Note: See TracChangeset for help on using the changeset viewer.