Changeset 27282
- Timestamp:
- 09/14/22 12:59:00 (3 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified issm/trunk-jpl/src/c/analyses/HydrologyGlaDSAnalysis.cpp ¶
r26796 r27282 233 233 }/*}}}*/ 234 234 ElementMatrix* HydrologyGlaDSAnalysis::CreateKMatrix(Element* element){/*{{{*/ 235 236 /*Skip if water or ice shelf element*/ 237 if(element->IsAllFloating() || !element->IsIceInElement()) return NULL; 235 238 236 239 /*Intermediaries */ … … 332 335 333 336 /*Skip if water or ice shelf element*/ 334 if(element->IsAllFloating() ) return NULL;337 if(element->IsAllFloating() || !element->IsIceInElement()) return NULL; 335 338 336 339 /*Intermediaries */ … … 443 446 }/*}}}*/ 444 447 void HydrologyGlaDSAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/ 445 SetActiveNodesLSMx(femmodel); 448 449 /*Update active elements based on ice levelset and ocean levelset*/ 450 GetMaskOfIceVerticesLSMx(femmodel,true); 451 SetActiveNodesLSMx(femmodel,true); 452 453 IssmDouble rho_ice = femmodel->parameters->FindParam(MaterialsRhoIceEnum); 454 IssmDouble rho_water = femmodel->parameters->FindParam(MaterialsRhoFreshwaterEnum); 455 IssmDouble g = femmodel->parameters->FindParam(ConstantsGEnum); 456 457 /*Constrain all nodes that are grounded and unconstrain the ones that float*/ 458 for(Object* & object : femmodel->elements->objects){ 459 Element *element = xDynamicCast<Element*>(object); 460 int numnodes = element->GetNumberOfNodes(); 461 IssmDouble *mask = xNew<IssmDouble>(numnodes); 462 IssmDouble *bed = xNew<IssmDouble>(numnodes); 463 IssmDouble *thickness = xNew<IssmDouble>(numnodes); 464 IssmDouble *ls_active = xNew<IssmDouble>(numnodes); 465 466 element->GetInputListOnNodes(&mask[0],MaskOceanLevelsetEnum); 467 element->GetInputListOnNodes(&bed[0],BaseEnum); 468 element->GetInputListOnNodes(&thickness[0],BaseEnum); 469 element->GetInputListOnNodes(&ls_active[0],HydrologyMaskNodeActivationEnum); 470 471 for(int in=0;in<numnodes;in++){ 472 Node* node=element->GetNode(in); 473 if(mask[in]>0. && ls_active[in]==1.){ 474 node->Activate(); //Not sure if we need this! 475 } 476 else{ 477 IssmDouble phi = rho_ice*g*thickness[in] + rho_water*g*bed[in]; //FIXME this is correct! 478 node->Deactivate();// Not sure if we need this 479 node->ApplyConstraint(0,phi); 480 } 481 } 482 xDelete<IssmDouble>(mask); 483 xDelete<IssmDouble>(bed); 484 xDelete<IssmDouble>(thickness); 485 xDelete<IssmDouble>(ls_active); 486 } 487 488 return; 446 489 }/*}}}*/ 447 490 … … 471 514 void HydrologyGlaDSAnalysis::UpdateSheetThickness(Element* element){/*{{{*/ 472 515 473 /*Skip if water or ice shelf element*/474 //if(element->IsAllFloating()) return;475 476 516 /*Intermediaries */ 477 517 IssmDouble Jdet,vx,vy,ub,h_old,N,h_r,H,b; … … 484 524 /*Initialize new sheet thickness*/ 485 525 IssmDouble* h_new = xNew<IssmDouble>(numvertices); 526 527 /*Set to 0 if inactive element*/ 528 if(element->IsAllFloating() || !element->IsIceInElement()){ 529 for(int iv=0;iv<numvertices;iv++) h_new[iv] = 0.; 530 element->AddInput(HydrologySheetThicknessEnum,h_new,P1Enum); 531 xDelete<IssmDouble>(h_new); 532 return; 533 } 486 534 487 535 /*Retrieve all inputs and parameters*/ … … 545 593 546 594 /*Force floating ice to have zero sheet thickness*/ 547 if(element->IsAllFloating() ){595 if(element->IsAllFloating() || !element->IsIceInElement()){ 548 596 for(int iv=0;iv<numvertices;iv++) h_new[iv] = 0.; 549 597 } … … 564 612 }/*}}}*/ 565 613 void HydrologyGlaDSAnalysis::UpdateEffectivePressure(Element* element){/*{{{*/ 566 567 /*Skip if water or ice shelf element*/568 //if(element->IsAllFloating()) return;569 614 570 615 /*Intermediary*/ … … 583 628 Input* phi_input = element->GetInput(HydraulicPotentialEnum); _assert_(phi_input); 584 629 630 /*Set to 0 if inactive element*/ 631 if(element->IsAllFloating() || !element->IsIceInElement()){ 632 for(int iv=0;iv<numnodes;iv++) N[iv] = 0.; 633 element->AddInput(EffectivePressureEnum,N,P1Enum); 634 xDelete<IssmDouble>(N); 635 return; 636 } 637 585 638 /* Start looping on the number of gaussian points: */ 586 639 Gauss* gauss=element->NewGauss(); … … 607 660 if(xIsNan<IssmDouble>(N[iv])) _error_("NaN found in solution vector"); 608 661 if(xIsInf<IssmDouble>(N[iv])) _error_("Inf found in solution vector"); 609 }610 611 /*Force floating ice to have zero effective pressure*/612 if(element->IsAllFloating()){613 for(int iv=0;iv<numnodes;iv++) N[iv] = 0.;614 662 } 615 663 -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Element.cpp ¶
r27278 r27282 2366 2366 }/*}}}*/ 2367 2367 bool Element::IsGrounded(){/*{{{*/ 2368 /*At least ONE node is grounded (partially grounded returns true)*/ 2368 2369 2369 2370 Input* input=this->GetInput(MaskOceanLevelsetEnum); _assert_(input); -
TabularUnified issm/trunk-jpl/src/c/classes/Loads/Channel.cpp ¶
r26772 r27282 603 603 /*Initialize Element matrix and return if necessary*/ 604 604 Tria* tria=(Tria*)element; 605 if( !tria->IsIceInElement() || tria->IsAllFloating() ||this->boundary){605 if(this->boundary){ 606 606 this->S = 0.; 607 607 return; 608 608 } 609 609 _assert_(tria->FiniteElement()==P1Enum); 610 611 /*Evaluate all fields on center of edge*/ 610 612 int index1=tria->GetVertexIndex(vertices[0]); 611 613 int index2=tria->GetVertexIndex(vertices[1]); 614 GaussTria* gauss=new GaussTria(); 615 gauss->GaussEdgeCenter(index1,index2); 616 617 /*Set to 0 if inactive*/ 618 IssmDouble active; 619 Input* active_input = element->GetInput(HydrologyMaskNodeActivationEnum); _assert_(active_input); 620 active_input->GetInputValue(&active,gauss); 621 if(active!=1.){ 622 this->S = 0.; 623 delete gauss; 624 return; 625 } 612 626 613 627 /*Intermediaries */ … … 644 658 tx = tx/Lt; 645 659 ty = ty/Lt; 646 647 /*Evaluate fields on center of edge*/648 GaussTria* gauss=new GaussTria();649 gauss->GaussEdgeCenter(index1,index2);650 660 651 661 /*Get input values at gauss points*/ -
TabularUnified issm/trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp ¶
r26325 r27282 10 10 #include "../modules.h" 11 11 12 void SetActiveNodesLSMx(FemModel* femmodel ){/*{{{*/12 void SetActiveNodesLSMx(FemModel* femmodel,bool ishydrology){/*{{{*/ 13 13 /* activate/deactivate nodes for levelset method according to IceMaskNodeActivation */ 14 14 15 /* find parameters */ 16 int domaintype; 17 femmodel->parameters->FindParam(&domaintype,DomainTypeEnum); 15 /*Determine which node activation mask to pull from*/ 16 int nodeactivationmask = IceMaskNodeActivationEnum; 17 if(ishydrology) nodeactivationmask = HydrologyMaskNodeActivationEnum; 18 18 19 19 20 for(Object* & object : femmodel->elements->objects){ … … 28 29 case TaylorHoodEnum:case XTaylorHoodEnum:case LATaylorHoodEnum: 29 30 case CrouzeixRaviartEnum:case LACrouzeixRaviartEnum:case OneLayerP4zEnum:{ 30 Input* input=element->GetInput( IceMaskNodeActivationEnum);31 if(!input) _error_("Input " << EnumToStringx( IceMaskNodeActivationEnum) << " not found in element");31 Input* input=element->GetInput(nodeactivationmask); 32 if(!input) _error_("Input " << EnumToStringx(nodeactivationmask) << " not found in element"); 32 33 33 34 /* Start looping on the number of vertices: */ … … 45 46 } 46 47 default: 47 element->GetInputListOnNodes(&mask[0], IceMaskNodeActivationEnum);48 element->GetInputListOnNodes(&mask[0],nodeactivationmask); 48 49 break; 49 50 } … … 58 59 }/*}}}*/ 59 60 60 void GetMaskOfIceVerticesLSMx0(FemModel* femmodel){/*{{{*/ 61 void GetMaskOfIceVerticesLSMx0(FemModel* femmodel,bool ishydrology){/*{{{*/ 62 63 /*Determine which node activation to construct*/ 64 int nodeactivationmask = IceMaskNodeActivationEnum; 65 if(ishydrology) nodeactivationmask = HydrologyMaskNodeActivationEnum; 61 66 62 67 /*Initialize vector with number of vertices*/ … … 68 73 69 74 /*Fill vector with values: */ 70 for(Object* & object : femmodel->elements->objects){ 71 Element* element=xDynamicCast<Element*>(object); 72 if(element->IsIceInElement()){ 73 int nbv = element->GetNumberOfVertices(); 74 for(int iv=0;iv<nbv;iv++){ 75 vec_mask_ice->SetValue(element->vertices[iv]->Pid(),1.,INS_VAL); 75 if(ishydrology){ 76 for(Object* & object : femmodel->elements->objects){ 77 Element* element=xDynamicCast<Element*>(object); 78 if(element->IsIceInElement()){ 79 int nbv = element->GetNumberOfVertices(); 80 for(int iv=0;iv<nbv;iv++){ 81 vec_mask_ice->SetValue(element->vertices[iv]->Pid(),1.,INS_VAL); 82 } 83 } 84 } 85 } 86 else{ 87 for(Object* & object : femmodel->elements->objects){ 88 Element* element=xDynamicCast<Element*>(object); 89 if(element->IsIceInElement() && element->IsGrounded()){ 90 int nbv = element->GetNumberOfVertices(); 91 for(int iv=0;iv<nbv;iv++){ 92 vec_mask_ice->SetValue(element->vertices[iv]->Pid(),1.,INS_VAL); 93 } 76 94 } 77 95 } … … 80 98 /*Assemble vector and serialize */ 81 99 vec_mask_ice->Assemble(); 82 InputUpdateFromVectorx(femmodel,vec_mask_ice, IceMaskNodeActivationEnum,VertexPIdEnum);100 InputUpdateFromVectorx(femmodel,vec_mask_ice,nodeactivationmask,VertexPIdEnum); 83 101 delete vec_mask_ice; 84 102 }/*}}}*/ 85 void GetMaskOfIceVerticesLSMx(FemModel* femmodel ){/*{{{*/103 void GetMaskOfIceVerticesLSMx(FemModel* femmodel,bool ishydrology){/*{{{*/ 86 104 87 femmodel->SetCurrentConfiguration(LevelsetAnalysisEnum); 105 /*Set configuration to levelset*/ 106 if(ishydrology){ 107 /*We may not be running with ismovingfront so we can't assume LevelsetAnalysis is active*/ 108 femmodel->SetCurrentConfiguration(HydrologyGlaDSAnalysisEnum); 109 } 110 else{ 111 femmodel->SetCurrentConfiguration(LevelsetAnalysisEnum); 112 } 113 114 /*Determine which node activation to construct*/ 115 int nodeactivationmask = IceMaskNodeActivationEnum; 116 if(ishydrology) nodeactivationmask = HydrologyMaskNodeActivationEnum; 88 117 89 118 /*Create vector on gset*/ … … 97 126 Element* element=xDynamicCast<Element*>(object); 98 127 99 if(element->IsIceInElement()){ 100 int numnodes = element->GetNumberOfNodes(); 101 int gsize_local=GetNumberOfDofs(element->nodes,numnodes,GsetEnum,NoneEnum); 102 int* glist_local=GetGlobalDofList(element->nodes,numnodes,GsetEnum,NoneEnum); 103 IssmDouble* ones = xNew<IssmDouble>(gsize_local); 104 for(int n=0;n<gsize_local;n++) ones[n] = 1.; 105 vec_mask_ice->SetValues(gsize_local,glist_local,ones,INS_VAL); 106 xDelete<IssmDouble>(ones); 107 xDelete<int>(glist_local); 128 if(ishydrology){ 129 if(element->IsIceInElement() && element->IsGrounded()){ 130 int numnodes = element->GetNumberOfNodes(); 131 int gsize_local=GetNumberOfDofs(element->nodes,numnodes,GsetEnum,NoneEnum); 132 int* glist_local=GetGlobalDofList(element->nodes,numnodes,GsetEnum,NoneEnum); 133 IssmDouble* ones = xNew<IssmDouble>(gsize_local); 134 for(int n=0;n<gsize_local;n++) ones[n] = 1.; 135 vec_mask_ice->SetValues(gsize_local,glist_local,ones,INS_VAL); 136 xDelete<IssmDouble>(ones); 137 xDelete<int>(glist_local); 138 } 139 } 140 else{ 141 if(element->IsIceInElement()){ 142 int numnodes = element->GetNumberOfNodes(); 143 int gsize_local=GetNumberOfDofs(element->nodes,numnodes,GsetEnum,NoneEnum); 144 int* glist_local=GetGlobalDofList(element->nodes,numnodes,GsetEnum,NoneEnum); 145 IssmDouble* ones = xNew<IssmDouble>(gsize_local); 146 for(int n=0;n<gsize_local;n++) ones[n] = 1.; 147 vec_mask_ice->SetValues(gsize_local,glist_local,ones,INS_VAL); 148 xDelete<IssmDouble>(ones); 149 xDelete<int>(glist_local); 150 } 108 151 } 109 152 } … … 120 163 for(Object* & object : femmodel->elements->objects){ 121 164 Element* element=xDynamicCast<Element*>(object); 122 element->InputUpdateFromSolutionOneDof(local_ug, IceMaskNodeActivationEnum);165 element->InputUpdateFromSolutionOneDof(local_ug,nodeactivationmask); 123 166 } 124 167 -
TabularUnified issm/trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.h ¶
r23173 r27282 8 8 #include "../../classes/classes.h" 9 9 10 void SetActiveNodesLSMx(FemModel* femmodel );11 void GetMaskOfIceVerticesLSMx0(FemModel* femmodel );12 void GetMaskOfIceVerticesLSMx(FemModel* femmodel );10 void SetActiveNodesLSMx(FemModel* femmodel,bool ishydrology=false); 11 void GetMaskOfIceVerticesLSMx0(FemModel* femmodel,bool ishydrology=false); 12 void GetMaskOfIceVerticesLSMx(FemModel* femmodel,bool ishydrology=false); 13 13 #endif /* _SETACTIVENODESLSMX_H*/ -
TabularUnified issm/trunk-jpl/src/c/shared/Enum/Enum.vim ¶
r27278 r27282 820 820 syn keyword cConstant HydrologyWaterVxEnum 821 821 syn keyword cConstant HydrologyWaterVyEnum 822 syn keyword cConstant HydrologyMaskNodeActivationEnum 822 823 syn keyword cConstant IceEnum 823 824 syn keyword cConstant IceMaskNodeActivationEnum -
TabularUnified issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h ¶
r27278 r27282 816 816 HydrologyWaterVxEnum, 817 817 HydrologyWaterVyEnum, 818 HydrologyMaskNodeActivationEnum, 818 819 IceEnum, 819 820 IceMaskNodeActivationEnum, -
TabularUnified issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp ¶
r27278 r27282 822 822 case HydrologyWaterVxEnum : return "HydrologyWaterVx"; 823 823 case HydrologyWaterVyEnum : return "HydrologyWaterVy"; 824 case HydrologyMaskNodeActivationEnum : return "HydrologyMaskNodeActivation"; 824 825 case IceEnum : return "Ice"; 825 826 case IceMaskNodeActivationEnum : return "IceMaskNodeActivation"; -
TabularUnified issm/trunk-jpl/src/c/shared/Enum/Enumjl.vim ¶
r27278 r27282 813 813 syn keyword juliaConstC HydrologyWaterVxEnum 814 814 syn keyword juliaConstC HydrologyWaterVyEnum 815 syn keyword juliaConstC HydrologyMaskNodeActivationEnum 815 816 syn keyword juliaConstC IceEnum 816 817 syn keyword juliaConstC IceMaskNodeActivationEnum -
TabularUnified issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp ¶
r27278 r27282 840 840 else if (strcmp(name,"HydrologyWaterVx")==0) return HydrologyWaterVxEnum; 841 841 else if (strcmp(name,"HydrologyWaterVy")==0) return HydrologyWaterVyEnum; 842 else if (strcmp(name,"HydrologyMaskNodeActivation")==0) return HydrologyMaskNodeActivationEnum; 842 843 else if (strcmp(name,"Ice")==0) return IceEnum; 843 844 else if (strcmp(name,"IceMaskNodeActivation")==0) return IceMaskNodeActivationEnum; … … 874 875 else if (strcmp(name,"Misfit")==0) return MisfitEnum; 875 876 else if (strcmp(name,"MovingFrontalVx")==0) return MovingFrontalVxEnum; 876 else if (strcmp(name,"MovingFrontalVy")==0) return MovingFrontalVyEnum;877 877 else stage=8; 878 878 } 879 879 if(stage==8){ 880 if (strcmp(name,"Neumannflux")==0) return NeumannfluxEnum; 880 if (strcmp(name,"MovingFrontalVy")==0) return MovingFrontalVyEnum; 881 else if (strcmp(name,"Neumannflux")==0) return NeumannfluxEnum; 881 882 else if (strcmp(name,"NewDamage")==0) return NewDamageEnum; 882 883 else if (strcmp(name,"Node")==0) return NodeEnum; … … 997 998 else if (strcmp(name,"SmbCciceValue")==0) return SmbCciceValueEnum; 998 999 else if (strcmp(name,"SmbCotValue")==0) return SmbCotValueEnum; 999 else if (strcmp(name,"SmbD")==0) return SmbDEnum;1000 1000 else stage=9; 1001 1001 } 1002 1002 if(stage==9){ 1003 if (strcmp(name,"SmbDailyairdensity")==0) return SmbDailyairdensityEnum; 1003 if (strcmp(name,"SmbD")==0) return SmbDEnum; 1004 else if (strcmp(name,"SmbDailyairdensity")==0) return SmbDailyairdensityEnum; 1004 1005 else if (strcmp(name,"SmbDailyairhumidity")==0) return SmbDailyairhumidityEnum; 1005 1006 else if (strcmp(name,"SmbDailydlradiation")==0) return SmbDailydlradiationEnum; … … 1120 1121 else if (strcmp(name,"Surface")==0) return SurfaceEnum; 1121 1122 else if (strcmp(name,"SurfaceOld")==0) return SurfaceOldEnum; 1122 else if (strcmp(name,"SurfaceLogVelMisfit")==0) return SurfaceLogVelMisfitEnum;1123 1123 else stage=10; 1124 1124 } 1125 1125 if(stage==10){ 1126 if (strcmp(name,"SurfaceLogVxVyMisfit")==0) return SurfaceLogVxVyMisfitEnum; 1126 if (strcmp(name,"SurfaceLogVelMisfit")==0) return SurfaceLogVelMisfitEnum; 1127 else if (strcmp(name,"SurfaceLogVxVyMisfit")==0) return SurfaceLogVxVyMisfitEnum; 1127 1128 else if (strcmp(name,"SurfaceObservation")==0) return SurfaceObservationEnum; 1128 1129 else if (strcmp(name,"SurfaceRelVelMisfit")==0) return SurfaceRelVelMisfitEnum; … … 1243 1244 else if (strcmp(name,"Outputdefinition69")==0) return Outputdefinition69Enum; 1244 1245 else if (strcmp(name,"Outputdefinition6")==0) return Outputdefinition6Enum; 1245 else if (strcmp(name,"Outputdefinition70")==0) return Outputdefinition70Enum;1246 1246 else stage=11; 1247 1247 } 1248 1248 if(stage==11){ 1249 if (strcmp(name,"Outputdefinition71")==0) return Outputdefinition71Enum; 1249 if (strcmp(name,"Outputdefinition70")==0) return Outputdefinition70Enum; 1250 else if (strcmp(name,"Outputdefinition71")==0) return Outputdefinition71Enum; 1250 1251 else if (strcmp(name,"Outputdefinition72")==0) return Outputdefinition72Enum; 1251 1252 else if (strcmp(name,"Outputdefinition73")==0) return Outputdefinition73Enum; … … 1366 1367 else if (strcmp(name,"ElementHook")==0) return ElementHookEnum; 1367 1368 else if (strcmp(name,"ElementSId")==0) return ElementSIdEnum; 1368 else if (strcmp(name,"EnthalpyAnalysis")==0) return EnthalpyAnalysisEnum;1369 1369 else stage=12; 1370 1370 } 1371 1371 if(stage==12){ 1372 if (strcmp(name,"EsaAnalysis")==0) return EsaAnalysisEnum; 1372 if (strcmp(name,"EnthalpyAnalysis")==0) return EnthalpyAnalysisEnum; 1373 else if (strcmp(name,"EsaAnalysis")==0) return EsaAnalysisEnum; 1373 1374 else if (strcmp(name,"EsaSolution")==0) return EsaSolutionEnum; 1374 1375 else if (strcmp(name,"EsaTransitions")==0) return EsaTransitionsEnum; … … 1489 1490 else if (strcmp(name,"Massfluxatgate")==0) return MassfluxatgateEnum; 1490 1491 else if (strcmp(name,"MasstransportAnalysis")==0) return MasstransportAnalysisEnum; 1491 else if (strcmp(name,"MasstransportSolution")==0) return MasstransportSolutionEnum;1492 1492 else stage=13; 1493 1493 } 1494 1494 if(stage==13){ 1495 if (strcmp(name,"Matdamageice")==0) return MatdamageiceEnum; 1495 if (strcmp(name,"MasstransportSolution")==0) return MasstransportSolutionEnum; 1496 else if (strcmp(name,"Matdamageice")==0) return MatdamageiceEnum; 1496 1497 else if (strcmp(name,"Matenhancedice")==0) return MatenhancediceEnum; 1497 1498 else if (strcmp(name,"Materials")==0) return MaterialsEnum; … … 1612 1613 else if (strcmp(name,"SoftMigration")==0) return SoftMigrationEnum; 1613 1614 else if (strcmp(name,"SpatialLinearFloatingMeltRate")==0) return SpatialLinearFloatingMeltRateEnum; 1614 else if (strcmp(name,"SpcDynamic")==0) return SpcDynamicEnum;1615 1615 else stage=14; 1616 1616 } 1617 1617 if(stage==14){ 1618 if (strcmp(name,"SpcStatic")==0) return SpcStaticEnum; 1618 if (strcmp(name,"SpcDynamic")==0) return SpcDynamicEnum; 1619 else if (strcmp(name,"SpcStatic")==0) return SpcStaticEnum; 1619 1620 else if (strcmp(name,"SpcTransient")==0) return SpcTransientEnum; 1620 1621 else if (strcmp(name,"Sset")==0) return SsetEnum;
Note:
See TracChangeset
for help on using the changeset viewer.