Changeset 27649
- Timestamp:
- 03/18/23 13:04:20 (2 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/HydrologyShaktiAnalysis.cpp
r27470 r27649 53 53 int M,N; 54 54 int *segments = NULL; 55 iomodel->FetchData(&segments,&M,&N,"md.mesh.segments"); 55 if(iomodel->domaintype==Domain3DEnum){ 56 iomodel->FetchData(&segments,&M,&N,"md.mesh.segments2d"); 57 } 58 else if(iomodel->domaintype==Domain2DhorizontalEnum){ 59 iomodel->FetchData(&segments,&M,&N,"md.mesh.segments"); 60 } 61 else{ 62 _error_("mesh type not supported yet"); 63 } 56 64 57 65 /*Check that the size seem right*/ 58 66 _assert_(N==3); _assert_(M>=3); 67 59 68 for(int i=0;i<M;i++){ 60 69 if(iomodel->my_elements[segments[i*3+2]-1]){ … … 169 178 ElementMatrix* HydrologyShaktiAnalysis::CreateKMatrix(Element* element){/*{{{*/ 170 179 180 /* Check if ice in element */ 181 if(element->IsAllFloating() || !element->IsIceInElement()) return NULL; 182 if(!element->IsOnBase()) return NULL; 183 Element* basalelement = element->SpawnBasalElement(); 184 171 185 /*Intermediaries */ 172 186 IssmDouble Jdet; … … 175 189 176 190 /*Fetch number of nodes and dof for this finite element*/ 177 int numnodes = element->GetNumberOfNodes();191 int numnodes = basalelement->GetNumberOfNodes(); 178 192 179 193 /*Initialize Element vector and other vectors*/ 180 ElementMatrix* Ke = element->NewElementMatrix();194 ElementMatrix* Ke = basalelement->NewElementMatrix(); 181 195 IssmDouble* dbasis = xNew<IssmDouble>(2*numnodes); 182 196 IssmDouble* basis = xNew<IssmDouble>(numnodes); 183 197 184 198 /*Retrieve all inputs and parameters*/ 185 element->GetVerticesCoordinates(&xyz_list);199 basalelement->GetVerticesCoordinates(&xyz_list); 186 200 187 201 /*Get conductivity from inputs*/ 188 IssmDouble conductivity = GetConductivity( element);202 IssmDouble conductivity = GetConductivity(basalelement); 189 203 190 204 /*Get englacial storage coefficient*/ 191 205 IssmDouble storage,dt; 192 element->FindParam(&storage,HydrologyStorageEnum);193 element->FindParam(&dt,TimesteppingTimeStepEnum);194 195 196 197 198 199 Input* B_input =element->GetInput(MaterialsRheologyBEnum); _assert_(B_input);200 Input* n_input =element->GetInput(MaterialsRheologyNEnum); _assert_(n_input);201 Input* gap_input =element->GetInput(HydrologyGapHeightEnum); _assert_(gap_input);202 Input* thickness_input =element->GetInput(ThicknessEnum); _assert_(thickness_input);203 Input* head_input =element->GetInput(HydrologyHeadEnum); _assert_(head_input);204 Input* base_input =element->GetInput(BaseEnum); _assert_(base_input);206 basalelement->FindParam(&storage,HydrologyStorageEnum); 207 basalelement->FindParam(&dt,TimesteppingTimeStepEnum); 208 209 /*Get all inputs and parameters*/ 210 basalelement->FindParam(&rho_water,MaterialsRhoFreshwaterEnum); 211 basalelement->FindParam(&rho_ice,MaterialsRhoIceEnum); 212 basalelement->FindParam(&g,ConstantsGEnum); 213 Input* B_input = basalelement->GetInput(MaterialsRheologyBEnum); _assert_(B_input); 214 Input* n_input = basalelement->GetInput(MaterialsRheologyNEnum); _assert_(n_input); 215 Input* gap_input = basalelement->GetInput(HydrologyGapHeightEnum); _assert_(gap_input); 216 Input* thickness_input = basalelement->GetInput(ThicknessEnum); _assert_(thickness_input); 217 Input* head_input = basalelement->GetInput(HydrologyHeadEnum); _assert_(head_input); 218 Input* base_input = basalelement->GetInput(BaseEnum); _assert_(base_input); 205 219 206 220 /* Start looping on the number of gaussian points: */ 207 Gauss* gauss= element->NewGauss(1);221 Gauss* gauss=basalelement->NewGauss(1); 208 222 while(gauss->next()){ 209 223 210 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 211 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 212 element->NodalFunctions(basis,gauss); 213 214 base_input->GetInputValue(&bed,gauss); 215 thickness_input->GetInputValue(&thickness,gauss); 216 gap_input->GetInputValue(&gap,gauss); 217 head_input->GetInputValue(&head,gauss); 218 219 /*Get ice A parameter*/ 220 B_input->GetInputValue(&B,gauss); 221 n_input->GetInputValue(&n,gauss); 222 A=pow(B,-n); 223 224 /*Get water and ice pressures*/ 225 IssmDouble pressure_ice = rho_ice*g*thickness; _assert_(pressure_ice>0.); 226 IssmDouble pressure_water = rho_water*g*(head-bed); 227 if(pressure_water>pressure_ice) pressure_water = pressure_ice; 228 229 224 basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss); 225 basalelement->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 226 basalelement->NodalFunctions(basis,gauss); 227 228 base_input->GetInputValue(&bed,gauss); 229 thickness_input->GetInputValue(&thickness,gauss); 230 gap_input->GetInputValue(&gap,gauss); 231 head_input->GetInputValue(&head,gauss); 232 233 /*Get ice A parameter*/ 234 B_input->GetInputValue(&B,gauss); 235 n_input->GetInputValue(&n,gauss); 236 A=pow(B,-n); 237 238 /*Get water and ice pressures*/ 239 IssmDouble pressure_ice = rho_ice*g*thickness; _assert_(pressure_ice>0.); 240 IssmDouble pressure_water = rho_water*g*(head-bed); 241 if(pressure_water>pressure_ice) pressure_water = pressure_ice; 230 242 231 243 for(int i=0;i<numnodes;i++){ … … 233 245 Ke->values[i*numnodes+j] += conductivity*gauss->weight*Jdet*(dbasis[0*numnodes+i]*dbasis[0*numnodes+j] + dbasis[1*numnodes+i]*dbasis[1*numnodes+j]) 234 246 + gauss->weight*Jdet*storage/dt*basis[i]*basis[j] 235 247 +gauss->weight*Jdet*A*(n)*(pow(fabs(pressure_ice-pressure_water),(n-1))*rho_water*g)*gap*basis[i]*basis[j]; 236 248 } 237 249 } … … 243 255 xDelete<IssmDouble>(dbasis); 244 256 delete gauss; 257 if(basalelement->IsSpawnedElement()){basalelement->DeleteMaterials(); delete basalelement;}; 245 258 return Ke; 246 259 }/*}}}*/ … … 248 261 249 262 /*Skip if water or ice shelf element*/ 250 if(element->IsAllFloating()) return NULL; 263 if(element->IsAllFloating() || !element->IsIceInElement()) return NULL; 264 if(!element->IsOnBase()) return NULL; 265 Element* basalelement = element->SpawnBasalElement(); 251 266 252 267 /*Intermediaries */ … … 259 274 260 275 /*Fetch number of nodes and dof for this finite element*/ 261 int numnodes = element->GetNumberOfNodes();276 int numnodes = basalelement->GetNumberOfNodes(); 262 277 263 278 /*Initialize Element vector and other vectors*/ 264 ElementVector* pe = element->NewElementVector();279 ElementVector* pe = basalelement->NewElementVector(); 265 280 IssmDouble* basis = xNew<IssmDouble>(numnodes); 266 281 267 282 /*Retrieve all inputs and parameters*/ 268 element->GetVerticesCoordinates(&xyz_list);269 IssmDouble latentheat = element->FindParam(MaterialsLatentheatEnum);270 IssmDouble g = element->FindParam(ConstantsGEnum);271 IssmDouble rho_ice = element->FindParam(MaterialsRhoIceEnum);272 IssmDouble rho_water = element->FindParam(MaterialsRhoFreshwaterEnum);273 Input* geothermalflux_input = element->GetInput(BasalforcingsGeothermalfluxEnum);_assert_(geothermalflux_input);274 Input* head_input = element->GetInput(HydrologyHeadEnum); _assert_(head_input);275 Input* gap_input = element->GetInput(HydrologyGapHeightEnum); _assert_(gap_input);276 Input* thickness_input = element->GetInput(ThicknessEnum); _assert_(thickness_input);277 Input* base_input = element->GetInput(BaseEnum); _assert_(base_input);278 Input* B_input = element->GetInput(MaterialsRheologyBEnum); _assert_(B_input);279 Input* n_input = element->GetInput(MaterialsRheologyNEnum); _assert_(n_input);280 Input* englacial_input = element->GetInput(HydrologyEnglacialInputEnum); _assert_(englacial_input);281 Input* lr_input = element->GetInput(HydrologyBumpSpacingEnum); _assert_(lr_input);282 Input* br_input = element->GetInput(HydrologyBumpHeightEnum); _assert_(br_input);283 Input* headold_input = element->GetInput(HydrologyHeadOldEnum); _assert_(headold_input);283 basalelement->GetVerticesCoordinates(&xyz_list); 284 IssmDouble latentheat = basalelement->FindParam(MaterialsLatentheatEnum); 285 IssmDouble g = basalelement->FindParam(ConstantsGEnum); 286 IssmDouble rho_ice = basalelement->FindParam(MaterialsRhoIceEnum); 287 IssmDouble rho_water = basalelement->FindParam(MaterialsRhoFreshwaterEnum); 288 Input* geothermalflux_input = basalelement->GetInput(BasalforcingsGeothermalfluxEnum);_assert_(geothermalflux_input); 289 Input* head_input = basalelement->GetInput(HydrologyHeadEnum); _assert_(head_input); 290 Input* gap_input = basalelement->GetInput(HydrologyGapHeightEnum); _assert_(gap_input); 291 Input* thickness_input = basalelement->GetInput(ThicknessEnum); _assert_(thickness_input); 292 Input* base_input = basalelement->GetInput(BaseEnum); _assert_(base_input); 293 Input* B_input = basalelement->GetInput(MaterialsRheologyBEnum); _assert_(B_input); 294 Input* n_input = basalelement->GetInput(MaterialsRheologyNEnum); _assert_(n_input); 295 Input* englacial_input = basalelement->GetInput(HydrologyEnglacialInputEnum); _assert_(englacial_input); 296 Input* lr_input = basalelement->GetInput(HydrologyBumpSpacingEnum); _assert_(lr_input); 297 Input* br_input = basalelement->GetInput(HydrologyBumpHeightEnum); _assert_(br_input); 298 Input* headold_input = basalelement->GetInput(HydrologyHeadOldEnum); _assert_(headold_input); 284 299 285 300 /*Get conductivity from inputs*/ 286 IssmDouble conductivity = GetConductivity( element);301 IssmDouble conductivity = GetConductivity(basalelement); 287 302 288 303 /*Get englacial storage coefficient*/ 289 304 IssmDouble storage,dt; 290 element->FindParam(&storage,HydrologyStorageEnum);291 element->FindParam(&dt,TimesteppingTimeStepEnum);292 293 /*Build friction element, needed later: */294 Friction* friction=new Friction( element,2);305 basalelement->FindParam(&storage,HydrologyStorageEnum); 306 basalelement->FindParam(&dt,TimesteppingTimeStepEnum); 307 308 /*Build friction basalelement, needed later: */ 309 Friction* friction=new Friction(basalelement,2); 295 310 296 311 /* Start looping on the number of gaussian points: */ 297 Gauss* gauss= element->NewGauss(2);312 Gauss* gauss=basalelement->NewGauss(2); 298 313 while(gauss->next()){ 299 314 300 element->JacobianDeterminant(&Jdet,xyz_list,gauss);301 element->NodalFunctions(basis,gauss);315 basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss); 316 basalelement->NodalFunctions(basis,gauss); 302 317 geothermalflux_input->GetInputValue(&G,gauss); 303 318 base_input->GetInputValue(&bed,gauss); … … 338 353 339 354 /*Compute change in sensible heat due to changes in pressure melting point*/ 340 355 dpressure_water[0] = rho_water*g*(dh[0] - dbed[0]); 341 356 dpressure_water[1] = rho_water*g*(dh[1] - dbed[1]); 342 357 343 344 345 346 347 348 349 350 351 352 353 354 355 356 } 358 meltrate = 1/latentheat*(G+frictionheat+rho_water*g*conductivity*(dh[0]*dh[0]+dh[1]*dh[1])); 359 360 for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight* 361 ( 362 meltrate*(1/rho_water-1/rho_ice) 363 +A*pow(fabs(pressure_ice - pressure_water),n-1)*(pressure_ice + rho_water*g*bed)*gap 364 +(n-1)*A*pow(fabs(pressure_ice - pressure_water),n-1)*(rho_water*g*head)*gap 365 -beta*sqrt(vx*vx+vy*vy) 366 +ieb 367 +storage*head_old/dt 368 )*basis[i]; 369 370 } 371 357 372 /*Clean up and return*/ 358 373 xDelete<IssmDouble>(xyz_list); … … 360 375 delete friction; 361 376 delete gauss; 377 if(basalelement->IsSpawnedElement()){basalelement->DeleteMaterials(); delete basalelement;}; 362 378 return pe; 363 379 }/*}}}*/ … … 369 385 }/*}}}*/ 370 386 void HydrologyShaktiAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/ 387 388 /*Only update if on base*/ 389 if(!element->IsOnBase()) return; 371 390 372 391 /*Intermediary*/ … … 411 430 412 431 /*Add input to the element: */ 413 element->Add Input(HydrologyHeadEnum,values,element->GetElementType());432 element->AddBasalInput(HydrologyHeadEnum,values,element->GetElementType()); 414 433 415 434 /*Update reynolds number according to new solution*/ … … 424 443 425 444 IssmDouble reynolds = conductivity*sqrt(dh[0]*dh[0]+dh[1]*dh[1])/NU; 426 element->Add Input(HydrologyReynoldsEnum,&reynolds,P0Enum);445 element->AddBasalInput(HydrologyReynoldsEnum,&reynolds,P0Enum); 427 446 428 447 /*Compute new effective pressure*/ … … 438 457 }/*}}}*/ 439 458 void HydrologyShaktiAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/ 440 /*Default, do nothing*/ 459 /*Update active elements based on ice levelset and ocean levelset*/ 460 GetMaskOfIceVerticesLSMx(femmodel,true); 461 SetActiveNodesLSMx(femmodel,true); 462 463 IssmDouble rho_ice = femmodel->parameters->FindParam(MaterialsRhoIceEnum); 464 IssmDouble rho_water = femmodel->parameters->FindParam(MaterialsRhoFreshwaterEnum); 465 IssmDouble g = femmodel->parameters->FindParam(ConstantsGEnum); 466 467 /*Constrain all nodes that are grounded and unconstrain the ones that float*/ 468 for(Object* & object : femmodel->elements->objects){ 469 470 /*Get current element and return if not on base*/ 471 Element *element = xDynamicCast<Element*>(object); 472 if(!element->IsOnBase()) continue; 473 474 int numnodes = element->GetNumberOfNodes(); 475 IssmDouble *mask = xNew<IssmDouble>(numnodes); 476 IssmDouble *bed = xNew<IssmDouble>(numnodes); 477 IssmDouble *thickness = xNew<IssmDouble>(numnodes); 478 IssmDouble *ls_active = xNew<IssmDouble>(numnodes); 479 480 element->GetInputListOnNodes(&mask[0],MaskOceanLevelsetEnum); 481 element->GetInputListOnNodes(&bed[0],BaseEnum); 482 element->GetInputListOnNodes(&thickness[0],ThicknessEnum); 483 element->GetInputListOnNodes(&ls_active[0],HydrologyMaskNodeActivationEnum); 484 485 //for(int in=0;in<numnodes;in++){ // 486 for(int in=0;in<3;in++){ // 487 Node* node=element->GetNode(in); 488 if(mask[in]>0. && ls_active[in]==1.){ 489 node->Activate(); //Not sure if we need this! 490 } 491 else{ 492 IssmDouble phi = rho_ice*g*thickness[in] + rho_water*g*bed[in]; //FIXME this is correct! 493 node->Deactivate();// Not sure if we need this 494 node->ApplyConstraint(0,phi); 495 } 496 } 497 xDelete<IssmDouble>(mask); 498 xDelete<IssmDouble>(bed); 499 xDelete<IssmDouble>(thickness); 500 xDelete<IssmDouble>(ls_active); 501 } 502 441 503 return; 442 504 }/*}}}*/ … … 475 537 476 538 /*Skip if water or ice shelf element*/ 477 if(element->IsAllFloating()) return; 539 if(element->IsAllFloating() || !element->IsIceInElement()) return; 540 if(!element->IsOnBase()) return; 478 541 479 542 /*Intermediaries */ 480 IssmDouble newgap = 0.;543 IssmDouble newgap = 0.; 481 544 IssmDouble Jdet,meltrate,G,dh[2],B,A,n,dt; 482 545 IssmDouble gap,bed,thickness,head; … … 484 547 IssmDouble alpha2,frictionheat; 485 548 IssmDouble* xyz_list = NULL; 486 549 IssmDouble dpressure_water[2],dbed[2],PMPheat,dissipation; 487 550 IssmDouble q = 0.; 488 551 IssmDouble channelization = 0.; 489 552 490 553 /*Retrieve all inputs and parameters*/ … … 551 614 if(pressure_water>pressure_ice) pressure_water = pressure_ice; 552 615 553 554 616 /* Compute change in sensible heat due to changes in pressure melting point*/ 617 dpressure_water[0] = rho_water*g*(dh[0] - dbed[0]); 555 618 dpressure_water[1] = rho_water*g*(dh[1] - dbed[1]); 556 619 dissipation=rho_water*g*conductivity*(dh[0]*dh[0]+dh[1]*dh[1]); … … 558 621 meltrate = 1/latentheat*(G+frictionheat+rho_water*g*conductivity*(dh[0]*dh[0]+dh[1]*dh[1])); 559 622 560 element->AddInput(DummyEnum,&meltrate,P0Enum); 561 element->AddInput(EsaEmotionEnum,&frictionheat,P0Enum); 562 element->AddInput(EsaNmotionEnum,&dissipation,P0Enum); 563 element->AddInput(EsaUmotionEnum,&PMPheat,P0Enum); 564 623 element->AddBasalInput(DummyEnum,&meltrate,P0Enum); 624 element->AddBasalInput(EsaEmotionEnum,&frictionheat,P0Enum); 625 element->AddBasalInput(EsaNmotionEnum,&dissipation,P0Enum); 626 element->AddBasalInput(EsaUmotionEnum,&PMPheat,P0Enum); 565 627 566 628 newgap += gauss->weight*Jdet*(gap+dt*( 567 meltrate/rho_ice568 -A*pow(fabs(pressure_ice-pressure_water),n-1)*(pressure_ice-pressure_water)*gap569 +beta*sqrt(vx*vx+vy*vy)570 ));629 meltrate/rho_ice 630 -A*pow(fabs(pressure_ice-pressure_water),n-1)*(pressure_ice-pressure_water)*gap 631 +beta*sqrt(vx*vx+vy*vy) 632 )); 571 633 572 634 … … 574 636 575 637 /* Compute basal water flux */ 576 638 q += gauss->weight*Jdet*(conductivity*sqrt(dh[0]*dh[0]+dh[1]*dh[1])); 577 639 578 640 /* Compute "degree of channelization" (ratio of melt opening to opening by sliding) */ … … 590 652 591 653 /*Add new gap as an input*/ 592 element->Add Input(HydrologyGapHeightEnum,&newgap,P0Enum);654 element->AddBasalInput(HydrologyGapHeightEnum,&newgap,P0Enum); 593 655 594 656 /*Divide by connectivity, add basal flux as an input*/ 595 657 q = q/totalweights; 596 element->Add Input(HydrologyBasalFluxEnum,&q,P0Enum);658 element->AddBasalInput(HydrologyBasalFluxEnum,&q,P0Enum); 597 659 598 660 /* Divide by connectivity, add degree of channelization as an input */ 599 661 channelization = channelization/totalweights; 600 element->Add Input(DegreeOfChannelizationEnum,&channelization,P0Enum);662 element->AddBasalInput(DegreeOfChannelizationEnum,&channelization,P0Enum); 601 663 602 664 /*Clean up and return*/ … … 616 678 617 679 /*Skip if water or ice shelf element*/ 618 if(element->IsAllFloating()) return; 680 if(element->IsAllFloating() || !element->IsIceInElement()) return; 681 if(!element->IsOnBase()) return; 619 682 620 683 /*Intermediaries*/ … … 633 696 Input* base_input = element->GetInput(BaseEnum); _assert_(base_input); 634 697 635 636 698 Gauss* gauss=element->NewGauss(); 637 699 for (int i=0;i<numnodes;i++){ … … 646 708 647 709 /*Add new gap as an input*/ 648 element->Add Input(EffectivePressureEnum,N,element->GetElementType());710 element->AddBasalInput(EffectivePressureEnum,N,element->GetElementType()); 649 711 650 712 /*Clean up and return*/ -
issm/trunk-jpl/src/c/classes/Loads/Neumannflux.cpp
r26329 r27649 352 352 353 353 /*Initialize Load Vector and return if necessary*/ 354 Tria* tria=(Tria*)element; 354 Tria* tria=NULL; 355 if(element->ObjectEnum()==TriaEnum){ 356 tria = (Tria*)this->element; 357 } 358 else if(element->ObjectEnum()==PentaEnum){ 359 tria = (Tria*)this->element->SpawnBasalElement(); 360 } 355 361 _assert_(tria->FiniteElement()==P1Enum); 356 362 if(!tria->IsIceInElement() || tria->IsAllFloating()) return NULL; … … 380 386 /*Clean up and return*/ 381 387 delete gauss; 388 if(tria->IsSpawnedElement()){tria->DeleteMaterials(); delete tria;}; 382 389 return pe; 383 390 } -
issm/trunk-jpl/src/c/classes/Node.cpp
r27298 r27649 147 147 analysis_enum==HydrologyDCInefficientAnalysisEnum || 148 148 analysis_enum==HydrologyDCEfficientAnalysisEnum || 149 analysis_enum==HydrologyShaktiAnalysisEnum || 150 analysis_enum==HydrologyGlaDSAnalysisEnum || 149 151 analysis_enum==GLheightadvectionAnalysisEnum || 150 152 analysis_enum==LevelsetAnalysisEnum -
issm/trunk-jpl/src/c/cores/hydrology_core.cpp
r27462 r27649 65 65 /*solid earth considerations:*/ 66 66 SolidEarthWaterUpdates(femmodel); 67 68 67 delete ug; 69 70 68 } 71 69 -
issm/trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp
r27491 r27649 117 117 if(ishydrology){ 118 118 /*We may not be running with ismovingfront so we can't assume LevelsetAnalysis is active*/ 119 femmodel->SetCurrentConfiguration(HydrologyGlaDSAnalysisEnum); 119 int hydrology_model; 120 femmodel->parameters->FindParam(&hydrology_model,HydrologyModelEnum); 121 if(hydrology_model==HydrologyshaktiEnum){ 122 femmodel->SetCurrentConfiguration(HydrologyShaktiAnalysisEnum); 123 } 124 else if(hydrology_model==HydrologyGlaDSEnum){ 125 femmodel->SetCurrentConfiguration(HydrologyGlaDSAnalysisEnum); 126 } 127 else{ 128 _error_("hydrology model not supported yet"); 129 } 120 130 }else if(isdebris){ 121 131 femmodel->SetCurrentConfiguration(DebrisAnalysisEnum);
Note:
See TracChangeset
for help on using the changeset viewer.