Changeset 26320
- Timestamp:
- 06/11/21 15:01:19 (4 years ago)
- Location:
- issm/trunk-jpl/src/c/analyses
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
r26047 r26320 307 307 308 308 /*Finite Element Analysis*/ 309 void EnthalpyAnalysis::ApplyBasalConstraints(IssmDouble* serial_spc,Element* element){/*{{{*/309 void EnthalpyAnalysis::ApplyBasalConstraints(IssmDouble* local_spc,Element* element){/*{{{*/ 310 310 311 311 /* Do not check if ice in element, this may lead to inconsistencies between cpu partitions */ … … 317 317 int numindices; 318 318 int *indices = NULL; 319 Node* node = NULL;320 319 IssmDouble pressure; 321 320 … … 325 324 326 325 /*Get parameters and inputs: */ 327 Input* pressure_input = element->GetInput(PressureEnum);_assert_(pressure_input);326 Input* pressure_input = element->GetInput(PressureEnum); _assert_(pressure_input); 328 327 329 328 /*Fetch indices of basal & surface nodes for this finite element*/ … … 338 337 339 338 /*apply or release spc*/ 340 node=element->GetNode(indices[i]);339 Node* node=element->GetNode(indices[i]); 341 340 if(!node->IsActive()) continue; 342 if( serial_spc[node->Sid()]==1.){341 if(local_spc[node->Lid()]==1.){ 343 342 pressure_input->GetInputValue(&pressure, gauss); 344 343 node->ApplyConstraint(0,PureIceEnthalpy(element,pressure)); … … 1344 1343 case 0: 1345 1344 // cold, dry base: apply basal surface forcing 1346 vec_spc->SetValue(element->nodes[i]-> Sid(),0.,INS_VAL);1345 vec_spc->SetValue(element->nodes[i]->Pid(),0.,INS_VAL); 1347 1346 break; 1348 1347 case 1: 1349 1348 // cold, wet base: keep at pressure melting point 1350 vec_spc->SetValue(element->nodes[i]-> Sid(),1.,INS_VAL);1349 vec_spc->SetValue(element->nodes[i]->Pid(),1.,INS_VAL); 1351 1350 break; 1352 1351 case 2: 1353 1352 // temperate, thin refreezing base: 1354 vec_spc->SetValue(element->nodes[i]-> Sid(),1.,INS_VAL);1353 vec_spc->SetValue(element->nodes[i]->Pid(),1.,INS_VAL); 1355 1354 break; 1356 1355 case 3: 1357 1356 // temperate, thin melting base: set spc 1358 vec_spc->SetValue(element->nodes[i]-> Sid(),1.,INS_VAL);1357 vec_spc->SetValue(element->nodes[i]->Pid(),1.,INS_VAL); 1359 1358 break; 1360 1359 case 4: 1361 1360 // temperate, thick melting base: 1362 vec_spc->SetValue(element->nodes[i]-> Sid(),1.,INS_VAL);1361 vec_spc->SetValue(element->nodes[i]->Pid(),1.,INS_VAL); 1363 1362 break; 1364 1363 default: … … 1417 1416 case 0: 1418 1417 // cold, dry base: apply basal surface forcing 1419 vec_spc->SetValue(element->nodes[i]-> Sid(),0.,INS_VAL);1418 vec_spc->SetValue(element->nodes[i]->Pid(),0.,INS_VAL); 1420 1419 break; 1421 1420 case 1: 1422 1421 // cold, wet base: keep at pressure melting point 1423 vec_spc->SetValue(element->nodes[i]-> Sid(),1.,INS_VAL);1422 vec_spc->SetValue(element->nodes[i]->Pid(),1.,INS_VAL); 1424 1423 break; 1425 1424 case 2: 1426 1425 // temperate, thin refreezing base: release spc 1427 vec_spc->SetValue(element->nodes[i]-> Sid(),0.,INS_VAL);1426 vec_spc->SetValue(element->nodes[i]->Pid(),0.,INS_VAL); 1428 1427 break; 1429 1428 case 3: 1430 1429 // temperate, thin melting base: set spc 1431 vec_spc->SetValue(element->nodes[i]-> Sid(),1.,INS_VAL);1430 vec_spc->SetValue(element->nodes[i]->Pid(),1.,INS_VAL); 1432 1431 break; 1433 1432 case 4: 1434 1433 // temperate, thick melting base: set grad H*n=0 1435 vec_spc->SetValue(element->nodes[i]-> Sid(),0.,INS_VAL);1434 vec_spc->SetValue(element->nodes[i]->Pid(),0.,INS_VAL); 1436 1435 break; 1437 1436 default: … … 1668 1667 1669 1668 /*Update basal dirichlet BCs for enthalpy: */ 1670 Vector<IssmDouble>* spc = NULL;1671 IssmDouble* serial_spc = NULL;1672 1673 spc=new Vector<IssmDouble>(femmodel->nodes->NumberOfNodes()); 1669 int numnodes = femmodel->nodes->NumberOfNodes(); 1670 int localmasters = femmodel->nodes->NumberOfNodesLocal(); 1671 Vector<IssmDouble>* spc = new Vector<IssmDouble>(localmasters,numnodes); 1672 1674 1673 /*First create a vector to figure out what elements should be constrained*/ 1675 1674 for(Object* & object : femmodel->elements->objects){ … … 1678 1677 } 1679 1678 1680 /*Assemble and serialize*/1679 /*Assemble*/ 1681 1680 spc->Assemble(); 1682 serial_spc=spc->ToMPISerial(); 1681 1682 /*Get local vector with both masters and slaves:*/ 1683 IssmDouble *local_spc = NULL; 1684 femmodel->GetLocalVectorWithClonesNodes(&local_spc,spc); 1683 1685 delete spc; 1684 1686 … … 1686 1688 for(Object* & object : femmodel->elements->objects){ 1687 1689 Element* element=xDynamicCast<Element*>(object); 1688 ApplyBasalConstraints( serial_spc,element);1690 ApplyBasalConstraints(local_spc,element); 1689 1691 } 1690 1692 … … 1692 1694 1693 1695 /*Delete*/ 1694 xDelete<IssmDouble>( serial_spc);1696 xDelete<IssmDouble>(local_spc); 1695 1697 }/*}}}*/ 1696 1698 void EnthalpyAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/ -
issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
r26256 r26320 358 358 /*Retrieve all inputs and parameters*/ 359 359 basalelement->GetVerticesCoordinates(&xyz_list); 360 Input* levelset_input = basalelement->GetInput(MaskIceLevelsetEnum);_assert_(levelset_input);360 Input* levelset_input = basalelement->GetInput(MaskIceLevelsetEnum); _assert_(levelset_input); 361 361 362 362 /* Start looping on the number of gaussian points: */
Note:
See TracChangeset
for help on using the changeset viewer.