Changeset 16734
- Timestamp:
- 11/13/13 11:02:01 (11 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
r16684 r16734 188 188 }/*}}}*/ 189 189 void EnthalpyAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/ 190 _error_("not implemented yet"); 191 }/*}}}*/ 190 191 bool converged; 192 int i,rheology_law; 193 IssmDouble B_average,s_average,T_average=0.,P_average=0.; 194 int *doflist = NULL; 195 IssmDouble *xyz_list = NULL; 196 197 /*Fetch number of nodes and dof for this finite element*/ 198 int numnodes = element->GetNumberOfNodes(); 199 200 /*Fetch dof list and allocate solution vector*/ 201 element->GetDofList(&doflist,NoneApproximationEnum,GsetEnum); 202 IssmDouble* values = xNew<IssmDouble>(numnodes); 203 IssmDouble* pressure = xNew<IssmDouble>(numnodes); 204 IssmDouble* temperature = xNew<IssmDouble>(numnodes); 205 IssmDouble* waterfraction = xNew<IssmDouble>(numnodes); 206 207 /*Use the dof list to index into the solution vector: */ 208 for(i=0;i<numnodes;i++){ 209 values[i]=solution[doflist[i]]; 210 211 /*Check solution*/ 212 if(xIsNan<IssmDouble>(values[i])) _error_("NaN found in solution vector"); 213 } 214 215 /*Get all inputs and parameters*/ 216 element->GetInputValue(&converged,ConvergedEnum); 217 element->GetInputListOnNodes(pressure,PressureEnum); 218 if(converged){ 219 for(i=0;i<numnodes;i++){ 220 element->EnthalpyToThermal(&temperature[i],&waterfraction[i],values[i],pressure[i]); 221 if(waterfraction[i]<0.) _error_("Negative water fraction found in solution vector"); 222 //if(waterfraction[i]>1.) _error_("Water fraction >1 found in solution vector"); 223 } 224 element->AddInput(EnthalpyEnum,values,P1Enum); 225 element->AddInput(WaterfractionEnum,waterfraction,P1Enum); 226 element->AddInput(TemperatureEnum,temperature,P1Enum); 227 228 /*Update Rheology only if converged (we must make sure that the temperature is below melting point 229 * otherwise the rheology could be negative*/ 230 element->FindParam(&rheology_law,MaterialsRheologyLawEnum); 231 switch(rheology_law){ 232 case NoneEnum: 233 /*Do nothing: B is not temperature dependent*/ 234 break; 235 case PatersonEnum: 236 for(i=0;i<numnodes;i++) T_average+=values[i]/reCast<IssmDouble>(numnodes); 237 B_average=Paterson(T_average); 238 element->AddMaterialInput(MaterialsRheologyBEnum,&B_average,P0Enum); 239 break; 240 case ArrheniusEnum:{ 241 Input* surface_input=element->GetInput(SurfaceEnum); _assert_(surface_input); 242 surface_input->GetInputAverage(&s_average); 243 element->GetVerticesCoordinates(&xyz_list); 244 for(i=0;i<numnodes;i++) T_average+=values[i]/reCast<IssmDouble>(numnodes); 245 //B_average=Arrhenius(T_average, 246 //s_average-((xyz_list[0][2]+xyz_list[1][2]+xyz_list[2][2]+xyz_list[3][2]+xyz_list[4][2]+xyz_list[5][2])/6.0), 247 //element->GetMaticeParameter(MaterialsRheologyNEnum)); 248 element->AddMaterialInput(MaterialsRheologyBEnum,&B_average,P0Enum); 249 break; 250 } 251 case LliboutryDuvalEnum: 252 for(i=0;i<numnodes;i++) T_average+=values[i]/reCast<IssmDouble>(numnodes); 253 for(i=0;i<numnodes;i++) P_average+=pressure[i]/reCast<IssmDouble>(numnodes); 254 B_average=LliboutryDuval(T_average,P_average, 255 element->GetMaterialParameter(MaterialsRheologyNEnum), 256 element->GetMaterialParameter(MaterialsBetaEnum), 257 element->GetMaterialParameter(ConstantsReferencetemperatureEnum), 258 element->GetMaterialParameter(MaterialsHeatcapacityEnum), 259 element->GetMaterialParameter(MaterialsLatentheatEnum)); 260 element->AddMaterialInput(MaterialsRheologyBEnum,&B_average,P0Enum); 261 break; 262 default: 263 _error_("Rheology law " << EnumToStringx(rheology_law) << " not supported yet"); 264 } 265 } 266 else{ 267 element->AddInput(EnthalpyPicardEnum,values,P1Enum); 268 } 269 270 /*Free ressources:*/ 271 xDelete<IssmDouble>(values); 272 xDelete<IssmDouble>(pressure); 273 xDelete<IssmDouble>(temperature); 274 xDelete<IssmDouble>(waterfraction); 275 xDelete<IssmDouble>(xyz_list); 276 xDelete<int>(doflist); 277 }/*}}}*/ -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r16727 r16734 46 46 virtual void CreatePVector(Vector<IssmDouble>* pf)=0; 47 47 virtual void CreateJacobianMatrix(Matrix<IssmDouble>* Jff)=0; 48 virtual void EnthalpyToThermal(IssmDouble* ptemperature,IssmDouble* pwaterfraction,IssmDouble enthalpy,IssmDouble pressure)=0; 48 49 virtual void FindParam(int* pvalue,int paramenum)=0; 49 50 virtual void FindParam(IssmDouble* pvalue,int paramenum)=0; -
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r16727 r16734 963 963 void Penta::Echo(void){ 964 964 this->DeepEcho(); 965 } 966 /*}}}*/ 967 /*FUNCTION Penta::EnthalpyToThermal{{{*/ 968 void Penta::EnthalpyToThermal(IssmDouble* ptemperature,IssmDouble* pwaterfraction,IssmDouble enthalpy,IssmDouble pressure){ 969 matpar->EnthalpyToThermal(ptemperature,pwaterfraction,enthalpy,pressure); 965 970 } 966 971 /*}}}*/ -
issm/trunk-jpl/src/c/classes/Elements/Penta.h
r16727 r16734 84 84 void CreateJacobianMatrix(Matrix<IssmDouble>* Jff); 85 85 void Delta18oParameterization(void); 86 void EnthalpyToThermal(IssmDouble* ptemperature,IssmDouble* pwaterfraction,IssmDouble enthalpy,IssmDouble pressure); 86 87 void GetDofList(int** pdoflist,int approximation_enum,int setenum); 87 88 void GetDofListVelocity(int** pdoflist,int setenum); -
issm/trunk-jpl/src/c/classes/Elements/Seg.h
r16727 r16734 83 83 void CreateJacobianMatrix(Matrix<IssmDouble>* Jff){_error_("not implemented yet");}; 84 84 void Delta18oParameterization(void){_error_("not implemented yet");}; 85 void EnthalpyToThermal(IssmDouble* ptemperature,IssmDouble* pwaterfraction,IssmDouble enthalpy,IssmDouble pressure){_error_("not implemented yet");}; 85 86 void FindParam(int* pvalue,int paramenum); 86 87 void FindParam(IssmDouble* pvalue,int paramenum); -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r16727 r16734 79 79 void CreateJacobianMatrix(Matrix<IssmDouble>* Jff); 80 80 void Delta18oParameterization(void); 81 void EnthalpyToThermal(IssmDouble* ptemperature,IssmDouble* pwaterfraction,IssmDouble enthalpy,IssmDouble pressure){_error_("not implemented yet");}; 81 82 void FindParam(int* pvalue,int paramenum); 82 83 void FindParam(IssmDouble* pvalue,int paramenum);
Note:
See TracChangeset
for help on using the changeset viewer.