Changeset 23941
- Timestamp:
- 05/29/19 10:14:47 (6 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified issm/trunk-jpl/src/c/analyses/HydrologyGlaDSAnalysis.cpp ¶
r23937 r23941 113 113 ElementMatrix* HydrologyGlaDSAnalysis::CreateKMatrix(Element* element){/*{{{*/ 114 114 115 _error_("Not implemented");116 117 115 /*Intermediaries */ 118 IssmDouble Jdet;116 IssmDouble Jdet,dphi[3],h,k; 119 117 IssmDouble* xyz_list = NULL; 118 119 /*Hard coded coefficients*/ 120 const IssmPDouble alpha = 5./4.; 121 const IssmPDouble beta = 3./2.; 120 122 121 123 /*Fetch number of nodes and dof for this finite element*/ … … 130 132 element->GetVerticesCoordinates(&xyz_list); 131 133 132 /*Get englacial storage coefficient*/ 133 IssmDouble storage,dt; 134 element->FindParam(&storage,HydrologyStorageEnum); 134 /*Get all inputs and parameters*/ 135 IssmDouble dt,c_t; 135 136 element->FindParam(&dt,TimesteppingTimeStepEnum); 137 element->FindParam(&c_t,HydrologyPressureMeltCoefficientEnum); 138 element->FindParam(&k,HydrologySheetConductivityEnum); 139 Input* phi_input = element->GetInput(HydraulicPotentialEnum); _assert_(phi_input); 140 Input* h_input = element->GetInput(HydrologySheetThicknessEnum); _assert_(h_input); 136 141 137 142 /* Start looping on the number of gaussian points: */ 138 Gauss* gauss=element->NewGauss( 1);143 Gauss* gauss=element->NewGauss(2); 139 144 for(int ig=gauss->begin();ig<gauss->end();ig++){ 140 145 gauss->GaussPoint(ig); … … 144 149 element->NodalFunctions(basis,gauss); 145 150 151 phi_input->GetInputDerivativeValue(&dphi[0],xyz_list,gauss); 152 h_input->GetInputValue(&h,gauss); 153 154 /*Get norm of gradient of hydraulic potential and make sure it is >0*/ 155 IssmDouble normgradphi = sqrt(dphi[0]*dphi[0] + dphi[1]*dphi[1]); 156 if(normgradphi < 1.e-12) normgradphi = 1.e-12; 157 158 IssmDouble coeff = k*pow(h,alpha)*pow(normgradphi,beta-2.); 159 146 160 for(int i=0;i<numnodes;i++){ 147 161 for(int j=0;j<numnodes;j++){ 148 Ke->values[i*numnodes+j] += gauss->weight*Jdet*(dbasis[0*numnodes+i]*dbasis[0*numnodes+j] + dbasis[1*numnodes+i]*dbasis[1*numnodes+j]) 149 + gauss->weight*Jdet*storage/dt*basis[i]*basis[j]; 162 163 /*Diffusive term*/ 164 Ke->values[i*numnodes+j] += gauss->weight*Jdet*( 165 coeff*dbasis[0*numnodes+i]*dbasis[0*numnodes+j] 166 + coeff*dbasis[1*numnodes+i]*dbasis[1*numnodes+j]); 150 167 } 151 168 } … … 164 181 if(element->IsFloating()) return NULL; 165 182 166 _error_("not implemented");167 168 183 /*Intermediaries */ 169 IssmDouble Jdet,meltrate,G,dh[2],B,A,n; 170 IssmDouble gap,bed,thickness,head,ieb,head_old; 171 IssmDouble lr,br,vx,vy,beta; 172 IssmDouble alpha2,frictionheat; 173 IssmDouble PMPheat,dpressure_water[2],dbed[2]; 184 IssmDouble Jdet,w,v,vx,vy,ub,h,N; 185 IssmDouble G,m,frictionheat,alpha2; 186 IssmDouble A,B,n; 174 187 IssmDouble* xyz_list = NULL; 175 188 … … 183 196 /*Retrieve all inputs and parameters*/ 184 197 element->GetVerticesCoordinates(&xyz_list); 185 IssmDouble latentheat = element->FindParam(MaterialsLatentheatEnum); 186 IssmDouble g = element->FindParam(ConstantsGEnum); 187 IssmDouble rho_ice = element->FindParam(MaterialsRhoIceEnum); 188 IssmDouble rho_water = element->FindParam(MaterialsRhoFreshwaterEnum); 189 Input* geothermalflux_input = element->GetInput(BasalforcingsGeothermalfluxEnum);_assert_(geothermalflux_input); 190 Input* head_input = element->GetInput(HydrologyHeadEnum); _assert_(head_input); 191 Input* gap_input = element->GetInput(HydrologyGapHeightEnum); _assert_(gap_input); 192 Input* thickness_input = element->GetInput(ThicknessEnum); _assert_(thickness_input); 193 Input* base_input = element->GetInput(BaseEnum); _assert_(base_input); 194 Input* B_input = element->GetInput(MaterialsRheologyBEnum); _assert_(B_input); 195 Input* n_input = element->GetInput(MaterialsRheologyNEnum); _assert_(n_input); 196 Input* englacial_input = element->GetInput(HydrologyEnglacialInputEnum); _assert_(englacial_input); 197 Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input); 198 Input* vy_input = element->GetInput(VyEnum); _assert_(vy_input); 199 Input* lr_input = element->GetInput(HydrologyBumpSpacingEnum); _assert_(lr_input); 200 Input* br_input = element->GetInput(HydrologyBumpHeightEnum); _assert_(br_input); 201 Input* headold_input = element->GetInput(HydrologyHeadOldEnum); _assert_(headold_input); 202 203 204 /*Get englacial storage coefficient*/ 205 IssmDouble storage,dt; 206 element->FindParam(&storage,HydrologyStorageEnum); 207 element->FindParam(&dt,TimesteppingTimeStepEnum); 198 IssmDouble h_r = element->FindParam(HydrologyBumpHeightEnum); 199 IssmDouble l_r = element->FindParam(HydrologyBumpSpacingEnum); 200 IssmDouble L = element->FindParam(MaterialsLatentheatEnum); 201 IssmDouble rho_ice = element->FindParam(MaterialsRhoIceEnum); 202 Input* vx_input = element->GetInput(VxEnum);_assert_(vx_input); 203 Input* vy_input = element->GetInput(VyEnum);_assert_(vy_input); 204 Input* N_input = element->GetInput(EffectivePressureEnum); _assert_(N_input); 205 Input* h_input = element->GetInput(HydrologySheetThicknessEnum);_assert_(h_input); 206 Input* G_input = element->GetInput(BasalforcingsGeothermalfluxEnum);_assert_(G_input); 207 Input* B_input = element->GetInput(MaterialsRheologyBEnum); _assert_(B_input); 208 Input* n_input = element->GetInput(MaterialsRheologyNEnum); _assert_(n_input); 208 209 209 210 /*Build friction element, needed later: */ … … 217 218 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 218 219 element->NodalFunctions(basis,gauss); 219 geothermalflux_input->GetInputValue(&G,gauss); 220 base_input->GetInputValue(&bed,gauss); 221 base_input->GetInputDerivativeValue(&dbed[0],xyz_list,gauss); 222 thickness_input->GetInputValue(&thickness,gauss); 223 gap_input->GetInputValue(&gap,gauss); 224 head_input->GetInputValue(&head,gauss); 225 head_input->GetInputDerivativeValue(&dh[0],xyz_list,gauss); 226 englacial_input->GetInputValue(&ieb,gauss); 227 lr_input->GetInputValue(&lr,gauss); 228 br_input->GetInputValue(&br,gauss); 220 221 /*Get input values at gauss points*/ 229 222 vx_input->GetInputValue(&vx,gauss); 230 223 vy_input->GetInputValue(&vy,gauss); 231 headold_input->GetInputValue(&head_old,gauss); 232 233 /*Get ice A parameter*/ 224 h_input->GetInputValue(&h,gauss); 225 G_input->GetInputValue(&G,gauss); 234 226 B_input->GetInputValue(&B,gauss); 235 227 n_input->GetInputValue(&n,gauss); 236 A=pow(B,-n); 237 238 /*Compute beta term*/ 239 if(gap<br) 240 beta = (br-gap)/lr; 241 else 242 beta = 0.; 228 N_input->GetInputValue(&N,gauss); 229 230 /*Get basal velocity*/ 231 ub = sqrt(vx*vx + vy*vy); 232 233 /*Compute cavity opening w*/ 234 w = 0.; 235 if(h<h_r) w = ub*(h_r-h)/l_r; 243 236 244 237 /*Compute frictional heat flux*/ 245 238 friction->GetAlpha2(&alpha2,gauss); 246 vx_input->GetInputValue(&vx,gauss); 247 vy_input->GetInputValue(&vy,gauss); 248 frictionheat=alpha2*(vx*vx+vy*vy); 249 250 /*Get water and ice pressures*/ 251 IssmDouble pressure_ice = rho_ice*g*thickness; _assert_(pressure_ice>0.); 252 IssmDouble pressure_water = rho_water*g*(head-bed); 253 if(pressure_water>pressure_ice) pressure_water = pressure_ice; 254 255 /*Get water pressure from previous time step to use in lagged creep term*/ 256 IssmDouble pressure_water_old = rho_water*g*(head_old-bed); 257 if(pressure_water_old>pressure_ice) pressure_water_old = pressure_ice; 258 259 /*Compute change in sensible heat due to changes in pressure melting point*/ 260 dpressure_water[0] = rho_water*g*(dh[0] - dbed[0]); 261 dpressure_water[1] = rho_water*g*(dh[1] - dbed[1]); 262 PMPheat=0.; 263 264 meltrate = 1/latentheat*(G+frictionheat+rho_water*g*(dh[0]*dh[0]+dh[1]*dh[1])-PMPheat); 265 _assert_(meltrate>0.); 266 267 for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight* 268 ( 269 meltrate*(1/rho_water-1/rho_ice) 270 +A*pow(fabs(pressure_ice - pressure_water),n-1)*(pressure_ice - pressure_water)*gap 271 -beta*sqrt(vx*vx+vy*vy) 272 +ieb 273 +storage*head_old/dt 274 )*basis[i]; 275 } 239 frictionheat=alpha2*ub*ub; 240 241 /*Compute melt*/ 242 m = (G + frictionheat)/(rho_ice*L); 243 244 /*Compute closing rate*/ 245 A=pow(B,-n); 246 v = 2./pow(n,n)*A*h*pow(fabs(N),n-1.)*N; 247 248 for(int i=0;i<numnodes;i++) pe->values[i]+= - Jdet*gauss->weight*(w-v-m)*basis[i]; 249 } 250 276 251 /*Clean up and return*/ 277 252 xDelete<IssmDouble>(xyz_list); 278 253 xDelete<IssmDouble>(basis); 254 delete gauss; 279 255 delete friction; 280 delete gauss;281 256 return pe; 282 257 }/*}}}*/ 283 258 void HydrologyGlaDSAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/ 284 _error_("not implemented"); 285 element->GetSolutionFromInputsOneDof(solution,HydrologyHeadEnum); 259 260 element->GetSolutionFromInputsOneDof(solution,HydraulicPotentialEnum); 261 286 262 }/*}}}*/ 287 263 void HydrologyGlaDSAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/ … … 290 266 void HydrologyGlaDSAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/ 291 267 292 _error_("not implemented");293 294 268 /*Intermediary*/ 295 IssmDouble dh[3];296 269 int* doflist = NULL; 297 IssmDouble* xyz_list = NULL; 298 299 /*Get gravity from parameters*/ 300 IssmDouble g = element->FindParam(ConstantsGEnum); 270 IssmDouble phi_0, phi_m, pi; 301 271 302 272 /*Fetch number of nodes for this finite element*/ … … 308 278 309 279 /*Get thickness and base on nodes to apply cap on water head*/ 310 IssmDouble* eff_pressure = xNew<IssmDouble>(numnodes); 280 IssmDouble* N = xNew<IssmDouble>(numnodes); 281 IssmDouble* h = xNew<IssmDouble>(numnodes); 311 282 IssmDouble* thickness = xNew<IssmDouble>(numnodes); 312 283 IssmDouble* bed = xNew<IssmDouble>(numnodes); 313 284 IssmDouble rho_ice = element->FindParam(MaterialsRhoIceEnum); 314 285 IssmDouble rho_water = element->FindParam(MaterialsRhoFreshwaterEnum); 286 IssmDouble g = element->FindParam(ConstantsGEnum); 315 287 element->GetInputListOnNodes(&thickness[0],ThicknessEnum); 316 288 element->GetInputListOnNodes(&bed[0],BaseEnum); 317 318 /*Get head from previous time-step and under-relaxation coefficient to use in under-relaxation for nonlinear convergence*/319 IssmDouble* head_old = xNew<IssmDouble>(numnodes);320 element->GetInputListOnNodes(&head_old[0],HydrologyHeadEnum);321 IssmDouble relaxation;322 element->FindParam(&relaxation,HydrologyRelaxationEnum);323 289 324 290 /*Use the dof list to index into the solution vector: */ … … 326 292 values[i]=solution[doflist[i]]; 327 293 328 /*make sure that p_water<p_ice -> h<rho_i H/rho_w + zb*/ 329 if(values[i]>rho_ice*thickness[i]/rho_water+bed[i]){ 330 values[i] = rho_ice*thickness[i]/rho_water+bed[i]; 331 } 332 333 /*Make sure that negative pressure is not allowed*/ 334 // if(values[i]<bed[i]){ 335 // values[i] = bed[i]; 336 // } 337 338 /*Under-relaxation*/ 339 values[i] = head_old[i] - relaxation*(head_old[i]-values[i]); 294 /*Elevation potential*/ 295 phi_m = rho_water*g*bed[i]; 296 297 /*Compute overburden pressure*/ 298 pi = rho_ice*g*thickness[i]; 299 300 /*Copmute overburden potential*/ 301 phi_0 = phi_m + pi; 340 302 341 303 /*Calculate effective pressure*/ 342 eff_pressure[i] = rho_ice*g*thickness[i] - rho_water*g*(values[i]-bed[i]);304 N[i] = phi_0 - values[i]; 343 305 344 306 if(xIsNan<IssmDouble>(values[i])) _error_("NaN found in solution vector"); … … 347 309 348 310 /*Add input to the element: */ 349 element->AddInput(HydrologyHeadEnum,values,element->GetElementType()); 350 element->AddInput(EffectivePressureEnum,eff_pressure,P1Enum); 351 352 /*Update reynolds number according to new solution*/ 353 element->GetVerticesCoordinates(&xyz_list); 354 Input* head_input = element->GetInput(HydrologyHeadEnum);_assert_(head_input); 355 head_input->GetInputDerivativeAverageValue(&dh[0],xyz_list); 311 element->AddInput(HydraulicPotentialEnum,values,element->GetElementType()); 312 element->AddInput(EffectivePressureEnum,N,P1Enum); 356 313 357 314 /*Free resources:*/ 315 xDelete<int>(doflist); 358 316 xDelete<IssmDouble>(values); 317 xDelete<IssmDouble>(N); 318 xDelete<IssmDouble>(h); 319 xDelete<IssmDouble>(bed); 359 320 xDelete<IssmDouble>(thickness); 360 xDelete<IssmDouble>(bed);361 xDelete<IssmDouble>(xyz_list);362 xDelete<int>(doflist);363 xDelete<IssmDouble>(eff_pressure);364 xDelete<IssmDouble>(head_old);365 321 }/*}}}*/ 366 322 void HydrologyGlaDSAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/ -
TabularUnified issm/trunk-jpl/src/c/analyses/HydrologyShaktiAnalysis.cpp ¶
r23644 r23941 355 355 356 356 /*Get gravity from parameters*/ 357 357 IssmDouble g = element->FindParam(ConstantsGEnum); 358 358 359 359 /*Fetch number of nodes for this finite element*/ -
TabularUnified issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h ¶
r23937 r23941 536 536 GradientEnum, 537 537 GroundinglineHeightEnum, 538 HydraulicPotentialEnum, 538 539 HydrologyBasalFluxEnum, 540 HydrologySheetThicknessEnum, 539 541 HydrologyBumpHeightEnum, 540 542 HydrologyBumpSpacingEnum, -
TabularUnified issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp ¶
r23937 r23941 542 542 case GradientEnum : return "Gradient"; 543 543 case GroundinglineHeightEnum : return "GroundinglineHeight"; 544 case HydraulicPotentialEnum : return "HydraulicPotential"; 544 545 case HydrologyBasalFluxEnum : return "HydrologyBasalFlux"; 546 case HydrologySheetThicknessEnum : return "HydrologySheetThickness"; 545 547 case HydrologyBumpHeightEnum : return "HydrologyBumpHeight"; 546 548 case HydrologyBumpSpacingEnum : return "HydrologyBumpSpacing"; -
TabularUnified issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp ¶
r23937 r23941 554 554 else if (strcmp(name,"Gradient")==0) return GradientEnum; 555 555 else if (strcmp(name,"GroundinglineHeight")==0) return GroundinglineHeightEnum; 556 else if (strcmp(name,"HydraulicPotential")==0) return HydraulicPotentialEnum; 556 557 else if (strcmp(name,"HydrologyBasalFlux")==0) return HydrologyBasalFluxEnum; 558 else if (strcmp(name,"HydrologySheetThickness")==0) return HydrologySheetThicknessEnum; 557 559 else if (strcmp(name,"HydrologyBumpHeight")==0) return HydrologyBumpHeightEnum; 558 560 else if (strcmp(name,"HydrologyBumpSpacing")==0) return HydrologyBumpSpacingEnum; … … 627 629 else if (strcmp(name,"RheologyBbarAbsGradient")==0) return RheologyBbarAbsGradientEnum; 628 630 else if (strcmp(name,"RheologyBInitialguessMisfit")==0) return RheologyBInitialguessMisfitEnum; 629 else if (strcmp(name,"RheologyBInitialguess")==0) return RheologyBInitialguessEnum;630 else if (strcmp(name,"Sealevel")==0) return SealevelEnum;631 631 else stage=6; 632 632 } 633 633 if(stage==6){ 634 if (strcmp(name,"SealevelEustaticMask")==0) return SealevelEustaticMaskEnum; 634 if (strcmp(name,"RheologyBInitialguess")==0) return RheologyBInitialguessEnum; 635 else if (strcmp(name,"Sealevel")==0) return SealevelEnum; 636 else if (strcmp(name,"SealevelEustaticMask")==0) return SealevelEustaticMaskEnum; 635 637 else if (strcmp(name,"SealevelriseCumDeltathickness")==0) return SealevelriseCumDeltathicknessEnum; 636 638 else if (strcmp(name,"SealevelriseDeltathickness")==0) return SealevelriseDeltathicknessEnum; … … 750 752 else if (strcmp(name,"StrainRateperpendicular")==0) return StrainRateperpendicularEnum; 751 753 else if (strcmp(name,"StrainRatexx")==0) return StrainRatexxEnum; 752 else if (strcmp(name,"StrainRatexy")==0) return StrainRatexyEnum;753 else if (strcmp(name,"StrainRatexz")==0) return StrainRatexzEnum;754 754 else stage=7; 755 755 } 756 756 if(stage==7){ 757 if (strcmp(name,"StrainRateyy")==0) return StrainRateyyEnum; 757 if (strcmp(name,"StrainRatexy")==0) return StrainRatexyEnum; 758 else if (strcmp(name,"StrainRatexz")==0) return StrainRatexzEnum; 759 else if (strcmp(name,"StrainRateyy")==0) return StrainRateyyEnum; 758 760 else if (strcmp(name,"StrainRateyz")==0) return StrainRateyzEnum; 759 761 else if (strcmp(name,"StrainRatezz")==0) return StrainRatezzEnum; … … 873 875 else if (strcmp(name,"Outputdefinition67")==0) return Outputdefinition67Enum; 874 876 else if (strcmp(name,"Outputdefinition68")==0) return Outputdefinition68Enum; 875 else if (strcmp(name,"Outputdefinition69")==0) return Outputdefinition69Enum;876 else if (strcmp(name,"Outputdefinition6")==0) return Outputdefinition6Enum;877 877 else stage=8; 878 878 } 879 879 if(stage==8){ 880 if (strcmp(name,"Outputdefinition70")==0) return Outputdefinition70Enum; 880 if (strcmp(name,"Outputdefinition69")==0) return Outputdefinition69Enum; 881 else if (strcmp(name,"Outputdefinition6")==0) return Outputdefinition6Enum; 882 else if (strcmp(name,"Outputdefinition70")==0) return Outputdefinition70Enum; 881 883 else if (strcmp(name,"Outputdefinition71")==0) return Outputdefinition71Enum; 882 884 else if (strcmp(name,"Outputdefinition72")==0) return Outputdefinition72Enum; … … 996 998 else if (strcmp(name,"ExtrudeFromTopAnalysis")==0) return ExtrudeFromTopAnalysisEnum; 997 999 else if (strcmp(name,"FemModel")==0) return FemModelEnum; 998 else if (strcmp(name,"FileParam")==0) return FileParamEnum;999 else if (strcmp(name,"FixedTimestepping")==0) return FixedTimesteppingEnum;1000 1000 else stage=9; 1001 1001 } 1002 1002 if(stage==9){ 1003 if (strcmp(name,"FloatingArea")==0) return FloatingAreaEnum; 1003 if (strcmp(name,"FileParam")==0) return FileParamEnum; 1004 else if (strcmp(name,"FixedTimestepping")==0) return FixedTimesteppingEnum; 1005 else if (strcmp(name,"FloatingArea")==0) return FloatingAreaEnum; 1004 1006 else if (strcmp(name,"FloatingAreaScaled")==0) return FloatingAreaScaledEnum; 1005 1007 else if (strcmp(name,"FloatingMeltRate")==0) return FloatingMeltRateEnum; … … 1119 1121 else if (strcmp(name,"MINIcondensed")==0) return MINIcondensedEnum; 1120 1122 else if (strcmp(name,"MINI")==0) return MINIEnum; 1121 else if (strcmp(name,"MinVel")==0) return MinVelEnum;1122 else if (strcmp(name,"MinVx")==0) return MinVxEnum;1123 1123 else stage=10; 1124 1124 } 1125 1125 if(stage==10){ 1126 if (strcmp(name,"MinVy")==0) return MinVyEnum; 1126 if (strcmp(name,"MinVel")==0) return MinVelEnum; 1127 else if (strcmp(name,"MinVx")==0) return MinVxEnum; 1128 else if (strcmp(name,"MinVy")==0) return MinVyEnum; 1127 1129 else if (strcmp(name,"MinVz")==0) return MinVzEnum; 1128 1130 else if (strcmp(name,"MismipFloatingMeltRate")==0) return MismipFloatingMeltRateEnum; … … 1242 1244 else if (strcmp(name,"TransientArrayParam")==0) return TransientArrayParamEnum; 1243 1245 else if (strcmp(name,"TransientInput")==0) return TransientInputEnum; 1244 else if (strcmp(name,"TransientParam")==0) return TransientParamEnum;1245 else if (strcmp(name,"TransientSolution")==0) return TransientSolutionEnum;1246 1246 else stage=11; 1247 1247 } 1248 1248 if(stage==11){ 1249 if (strcmp(name,"Tria")==0) return TriaEnum; 1249 if (strcmp(name,"TransientParam")==0) return TransientParamEnum; 1250 else if (strcmp(name,"TransientSolution")==0) return TransientSolutionEnum; 1251 else if (strcmp(name,"Tria")==0) return TriaEnum; 1250 1252 else if (strcmp(name,"TriaInput")==0) return TriaInputEnum; 1251 1253 else if (strcmp(name,"UzawaPressureAnalysis")==0) return UzawaPressureAnalysisEnum;
Note:
See TracChangeset
for help on using the changeset viewer.