Ignore:
Timestamp:
11/21/13 09:21:32 (11 years ago)
Author:
Mathieu Morlighem
Message:

CHG: done with Damage evolution

File:
1 edited

Legend:

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

    r16782 r16848  
    9999}/*}}}*/
    100100ElementVector* DamageEvolutionAnalysis::CreatePVector(Element* element){/*{{{*/
    101 _error_("not implemented yet");
     101
     102        /*Intermediaries*/
     103        int      meshtype;
     104        Element* basalelement;
     105
     106        /*Get basal element*/
     107        element->FindParam(&meshtype,MeshTypeEnum);
     108        switch(meshtype){
     109                case Mesh2DhorizontalEnum:
     110                        basalelement = element;
     111                        break;
     112                case Mesh3DEnum:
     113                        if(!element->IsOnBed()) return NULL;
     114                        basalelement = element->SpawnBasalElement();
     115                        break;
     116                default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
     117        }
     118
     119        /*Intermediaries */
     120        IssmDouble  Jdet,dt;
     121        IssmDouble  f,damage;
     122        IssmDouble* xyz_list = NULL;
     123
     124        /*Fetch number of nodes and dof for this finite element*/
     125        int numnodes = element->GetNumberOfNodes();
     126
     127        /*Initialize Element vector and other vectors*/
     128        ElementVector* pe    = element->NewElementVector();
     129        IssmDouble*    basis = xNew<IssmDouble>(numnodes);
     130
     131        /*Retrieve all inputs and parameters*/
     132        element->GetVerticesCoordinates(&xyz_list);
     133        element->FindParam(&dt,TimesteppingTimeStepEnum);
     134        this->CreateDamageFInput(element);
     135        Input* damaged_input = element->GetMaterialInput(DamageDbarEnum); _assert_(damaged_input);
     136        Input* damagef_input = element->GetMaterialInput(DamageFEnum);    _assert_(damagef_input);
     137
     138        /* Start  looping on the number of gaussian points: */
     139        Gauss* gauss=element->NewGauss(2);
     140        for(int ig=gauss->begin();ig<gauss->end();ig++){
     141                gauss->GaussPoint(ig);
     142
     143                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
     144                element->NodalFunctions(basis,gauss);
     145
     146                damaged_input->GetInputValue(&damage,gauss);
     147                damagef_input->GetInputValue(&f,gauss);
     148
     149                for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*(damage+dt*f)*basis[i];
     150        }
     151
     152        /*Clean up and return*/
     153        xDelete<IssmDouble>(xyz_list);
     154        xDelete<IssmDouble>(basis);
     155        if(meshtype!=Mesh2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
     156        delete gauss;
     157        return pe;
    102158}/*}}}*/
    103159void DamageEvolutionAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
     
    136192        xDelete<int>(doflist);
    137193}/*}}}*/
     194
     195/*Intermediaries*/
     196void DamageEvolutionAnalysis::CreateDamageFInput(Element* element){/*{{{*/
     197
     198        /*Intermediaries */
     199        IssmDouble c1,c2,c3,healing,stress_threshold;
     200        IssmDouble s_xx,s_xy,s_yy;
     201        IssmDouble J2s,Xis,Psi,PosPsi,NegPsi;
     202        IssmDouble damage,sigma_xx,sigma_xy,sigma_yy;
     203
     204        /*Fetch number of vertices and allocate output*/
     205        int numvertices = element->GetNumberOfVertices();
     206        IssmDouble* f   = xNew<IssmDouble>(numvertices);
     207
     208        /*retrieve parameters:*/
     209        element->FindParam(&c1,DamageC1Enum);
     210        element->FindParam(&c2,DamageC2Enum);
     211        element->FindParam(&c3,DamageC3Enum);
     212        element->FindParam(&healing,DamageHealingEnum);
     213        element->FindParam(&stress_threshold,DamageStressThresholdEnum);
     214
     215        /*Compute stress tensor: */
     216        element->ComputeStressTensor();
     217
     218        /*retrieve what we need: */
     219        Input* sigma_xx_input  = element->GetInput(StressTensorxxEnum);     _assert_(sigma_xx_input);
     220        Input* sigma_xy_input  = element->GetInput(StressTensorxyEnum);     _assert_(sigma_xy_input);
     221        Input* sigma_yy_input  = element->GetInput(StressTensoryyEnum);     _assert_(sigma_yy_input);
     222        Input* damage_input    = element->GetMaterialInput(DamageDbarEnum); _assert_(damage_input);
     223
     224        /*Damage evolution z mapping: */
     225        Gauss* gauss=element->NewGauss();
     226        for (int iv=0;iv<numvertices;iv++){
     227                gauss->GaussVertex(iv);
     228               
     229                damage_input->GetInputValue(&damage,gauss);
     230                sigma_xx_input->GetInputValue(&sigma_xx,gauss);
     231                sigma_xy_input->GetInputValue(&sigma_xy,gauss);
     232                sigma_yy_input->GetInputValue(&sigma_yy,gauss);
     233
     234                s_xx=sigma_xx/(1.-damage);
     235                s_xy=sigma_xy/(1.-damage);
     236                s_yy=sigma_yy/(1.-damage);
     237
     238                J2s=1./sqrt(2.)*sqrt(s_xx*s_xx + s_yy*s_yy + s_xy*s_xy);
     239                Xis=sqrt(3.0)*J2s;
     240                Psi=Xis-stress_threshold;
     241                PosPsi=max(Psi,0.);
     242                NegPsi=max(-Psi,0.);
     243
     244                f[iv]= c1*(pow(PosPsi,c2) - healing*pow(NegPsi,c2))*pow((1.-damage),-c3);
     245        }
     246
     247        /*Add input*/
     248        element->AddMaterialInput(DamageFEnum,f,P1Enum);
     249       
     250        /*Clean up and return*/
     251        delete gauss;
     252}/*}}}*/
Note: See TracChangeset for help on using the changeset viewer.