- Timestamp:
- 11/21/13 09:21:32 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp
r16782 r16848 99 99 }/*}}}*/ 100 100 ElementVector* 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; 102 158 }/*}}}*/ 103 159 void DamageEvolutionAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/ … … 136 192 xDelete<int>(doflist); 137 193 }/*}}}*/ 194 195 /*Intermediaries*/ 196 void 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.