Changeset 16848
- Timestamp:
- 11/21/13 09:21:32 (11 years ago)
- Location:
- issm/trunk-jpl/src
- Files:
-
- 1 added
- 12 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 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.h
r16782 r16848 25 25 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 26 26 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 27 28 /*Intermediaries*/ 29 void CreateDamageFInput(Element* element); 27 30 }; 28 31 #endif -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r16847 r16848 107 107 virtual void GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue)=0; 108 108 virtual Input* GetInput(int inputenum)=0; 109 virtual Input* GetMaterialInput(int inputenum)=0; 109 110 virtual void GetInputValue(IssmDouble* pvalue,Node* node,int enumtype)=0; 110 111 virtual void GetInputValue(bool* pvalue,int enum_type)=0; … … 122 123 virtual void ComputeBasalStress(Vector<IssmDouble>* sigma_b)=0; 123 124 virtual void ComputeStrainRate(Vector<IssmDouble>* eps)=0; 125 virtual void ComputeStressTensor(void)=0; 124 126 virtual void ResultInterpolation(int* pinterpolation,int output_enum)=0; 125 127 virtual void ResultToVector(Vector<IssmDouble>* vector,int output_enum)=0; -
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r16847 r16848 1312 1312 Input* Penta::GetInput(int inputenum){ 1313 1313 return inputs->GetInput(inputenum); 1314 } 1315 /*}}}*/ 1316 /*FUNCTION Penta::GetMaterialInput(int inputenum) {{{*/ 1317 Input* Penta::GetMaterialInput(int inputenum){ 1318 return this->material->inputs->GetInput(inputenum); 1314 1319 } 1315 1320 /*}}}*/ -
issm/trunk-jpl/src/c/classes/Elements/Penta.h
r16847 r16848 224 224 int GetElementType(void); 225 225 Input* GetInput(int inputenum); 226 Input* GetMaterialInput(int inputenum); 226 227 void GetInputListOnVertices(IssmDouble* pvalue,int enumtype); 227 228 void GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue); -
issm/trunk-jpl/src/c/classes/Elements/Seg.h
r16847 r16848 137 137 int VelocityInterpolation(void){_error_("not implemented yet");}; 138 138 Input* GetInput(int inputenum){_error_("not implemented yet");}; 139 Input* GetMaterialInput(int inputenum){_error_("not implemented yet");}; 139 140 void GetInputListOnVertices(IssmDouble* pvalue,int enumtype){_error_("not implemented yet");}; 140 141 void GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue){_error_("not implemented yet");}; -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r16847 r16848 1342 1342 Input* Tria::GetInput(int inputenum){ 1343 1343 return inputs->GetInput(inputenum); 1344 } 1345 /*}}}*/ 1346 /*FUNCTION Tria::GetMaterialInput(int inputenum) {{{*/ 1347 Input* Tria::GetMaterialInput(int inputenum){ 1348 return this->material->inputs->GetInput(inputenum); 1344 1349 } 1345 1350 /*}}}*/ -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r16847 r16848 265 265 IssmDouble GetMaterialParameter(int enum_in); 266 266 Input* GetInput(int inputenum); 267 Input* GetMaterialInput(int inputenum); 267 268 void GetInputListOnVertices(IssmDouble* pvalue,int enumtype); 268 269 void GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue); -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r16787 r16848 161 161 MaterialsRheologyNEnum, 162 162 DamageDEnum, 163 DamageFEnum, 163 164 QmuDamageDEnum, 164 165 DamageDbarEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r16787 r16848 169 169 case MaterialsRheologyNEnum : return "MaterialsRheologyN"; 170 170 case DamageDEnum : return "DamageD"; 171 case DamageFEnum : return "DamageF"; 171 172 case QmuDamageDEnum : return "QmuDamageD"; 172 173 case DamageDbarEnum : return "DamageDbar"; -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r16787 r16848 172 172 else if (strcmp(name,"MaterialsRheologyN")==0) return MaterialsRheologyNEnum; 173 173 else if (strcmp(name,"DamageD")==0) return DamageDEnum; 174 else if (strcmp(name,"DamageF")==0) return DamageFEnum; 174 175 else if (strcmp(name,"QmuDamageD")==0) return QmuDamageDEnum; 175 176 else if (strcmp(name,"DamageDbar")==0) return DamageDbarEnum; … … 259 260 else if (strcmp(name,"SteadystateMaxiter")==0) return SteadystateMaxiterEnum; 260 261 else if (strcmp(name,"SteadystateNumRequestedOutputs")==0) return SteadystateNumRequestedOutputsEnum; 261 else if (strcmp(name,"SteadystateReltol")==0) return SteadystateReltolEnum;262 262 else stage=3; 263 263 } 264 264 if(stage==3){ 265 if (strcmp(name,"SteadystateRequestedOutputs")==0) return SteadystateRequestedOutputsEnum; 265 if (strcmp(name,"SteadystateReltol")==0) return SteadystateReltolEnum; 266 else if (strcmp(name,"SteadystateRequestedOutputs")==0) return SteadystateRequestedOutputsEnum; 266 267 else if (strcmp(name,"Surface")==0) return SurfaceEnum; 267 268 else if (strcmp(name,"SurfaceforcingsPrecipitation")==0) return SurfaceforcingsPrecipitationEnum; … … 382 383 else if (strcmp(name,"DoubleMatArrayParam")==0) return DoubleMatArrayParamEnum; 383 384 else if (strcmp(name,"DoubleMatParam")==0) return DoubleMatParamEnum; 384 else if (strcmp(name,"DoubleParam")==0) return DoubleParamEnum;385 385 else stage=4; 386 386 } 387 387 if(stage==4){ 388 if (strcmp(name,"DoubleVecParam")==0) return DoubleVecParamEnum; 388 if (strcmp(name,"DoubleParam")==0) return DoubleParamEnum; 389 else if (strcmp(name,"DoubleVecParam")==0) return DoubleVecParamEnum; 389 390 else if (strcmp(name,"Element")==0) return ElementEnum; 390 391 else if (strcmp(name,"ExternalResult")==0) return ExternalResultEnum; … … 505 506 else if (strcmp(name,"Waterfraction")==0) return WaterfractionEnum; 506 507 else if (strcmp(name,"Watercolumn")==0) return WatercolumnEnum; 507 else if (strcmp(name,"BasalFriction")==0) return BasalFrictionEnum;508 508 else stage=5; 509 509 } 510 510 if(stage==5){ 511 if (strcmp(name,"ViscousHeating")==0) return ViscousHeatingEnum; 511 if (strcmp(name,"BasalFriction")==0) return BasalFrictionEnum; 512 else if (strcmp(name,"ViscousHeating")==0) return ViscousHeatingEnum; 512 513 else if (strcmp(name,"QmuTemperature")==0) return QmuTemperatureEnum; 513 514 else if (strcmp(name,"HydrologyWaterVx")==0) return HydrologyWaterVxEnum; … … 628 629 else if (strcmp(name,"Gsl")==0) return GslEnum; 629 630 else if (strcmp(name,"Option")==0) return OptionEnum; 630 else if (strcmp(name,"GenericOption")==0) return GenericOptionEnum;631 631 else stage=6; 632 632 } 633 633 if(stage==6){ 634 if (strcmp(name,"OptionCell")==0) return OptionCellEnum; 634 if (strcmp(name,"GenericOption")==0) return GenericOptionEnum; 635 else if (strcmp(name,"OptionCell")==0) return OptionCellEnum; 635 636 else if (strcmp(name,"OptionStruct")==0) return OptionStructEnum; 636 637 else if (strcmp(name,"Paterson")==0) return PatersonEnum; -
issm/trunk-jpl/src/m/enum/EnumDefinitions.py
r16787 r16848 161 161 def MaterialsRheologyNEnum(): return StringToEnum("MaterialsRheologyN")[0] 162 162 def DamageDEnum(): return StringToEnum("DamageD")[0] 163 def DamageFEnum(): return StringToEnum("DamageF")[0] 163 164 def QmuDamageDEnum(): return StringToEnum("QmuDamageD")[0] 164 165 def DamageDbarEnum(): return StringToEnum("DamageDbar")[0]
Note:
See TracChangeset
for help on using the changeset viewer.