Changeset 26973
- Timestamp:
- 04/27/22 11:22:23 (3 years ago)
- Location:
- issm/trunk-jpl
- Files:
-
- 2 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified issm/trunk-jpl/src/c/cores/movingfront_core.cpp ¶
r26972 r26973 16 16 17 17 /* intermediaries */ 18 bool save_results,isstressbalance,ismasstransport,isthermal,isenthalpy,islevelset,ismovingfront,killicebergs ,haskillberg;18 bool save_results,isstressbalance,ismasstransport,isthermal,isenthalpy,islevelset,ismovingfront,killicebergs; 19 19 int domaintype, num_extrapol_vars, index,reinit_frequency,step; 20 20 int* extrapol_vars=NULL; … … 120 120 /*Kill ice berg to avoid free body motion*/ 121 121 if(killicebergs){ 122 int killberg = 0; 122 123 if(VerboseSolution()) _printf0_(" looking for icebergs to kill\n"); 123 KillIcebergsx(femmodel); 124 femmodel->parameters->FindParam(&haskillberg,LevelsetHasKillIcebergsEnum); 125 if (haskillberg) { 126 if(VerboseSolution()) _printf0_(" reinitializing level set after killing icebergs\n"); 124 killberg = KillIcebergsx(femmodel); 125 /*wait for all cores*/ 126 int totalkill; 127 ISSM_MPI_Reduce(&killberg,&totalkill,1,ISSM_MPI_INT,ISSM_MPI_SUM,0,IssmComm::GetComm()); 128 ISSM_MPI_Bcast(&totalkill,1,ISSM_MPI_INT,0,IssmComm::GetComm()); 129 130 if (totalkill > 0) { 131 if(VerboseSolution()) _printf0_(" reinitializing level set after killing " << totalkill << " icebergs\n"); 127 132 femmodel->ResetLevelset(); 128 133 ResetBoundaryConditions(femmodel,LevelsetAnalysisEnum); -
TabularUnified issm/trunk-jpl/src/c/modules/KillIcebergsx/KillIcebergsx.cpp ¶
r26965 r26973 9 9 #include "../InputUpdateFromVectorx/InputUpdateFromVectorx.h" 10 10 11 voidKillIcebergsx(FemModel* femmodel){11 int KillIcebergsx(FemModel* femmodel){ 12 12 13 13 /*Intermediaries*/ … … 18 18 IssmDouble *local_mask = xNewZeroInit<IssmDouble>(nbv_local); 19 19 bool *element_flag = xNewZeroInit<bool>(femmodel->elements->Size()); 20 IssmDouble ice; 20 21 21 22 /*Step 1, go through all elements and put 1 in local_mask if the element is grounded*/ … … 27 28 element_flag[i] = true; 28 29 } 29 else {30 else { 30 31 if(element->IsAllGrounded()){ 32 /* only look at element with ice but not fully grounded */ 31 33 int numvertices = element->GetNumberOfVertices(); 32 for(int v=0;v<numvertices;v++) local_mask[element->vertices[v]->Lid()] = 1.; 34 Gauss* gauss=element->NewGauss(); 35 Input* icelevel_input = element->GetInput(MaskIceLevelsetEnum); _assert_(icelevel_input); 36 37 for(int v=0;v<numvertices;v++) { 38 gauss->GaussVertex(v); 39 icelevel_input->GetInputValue(&ice,gauss); 40 /* The initial mask is very strict, we look at all grounded elements and set the mask for ice nodes only. */ 41 if (ice < 0) local_mask[element->vertices[v]->Lid()] = 1.; 42 } 43 delete gauss; 33 44 } 34 45 } … … 48 59 /*Local iterations on partition*/ 49 60 bool keepgoing = true; 50 int didsomething = 0;51 61 int iter = 1; 52 62 while(keepgoing){ … … 54 64 55 65 keepgoing = false; 56 didsomething = 0;57 66 int i=0; 58 67 for(Object* & object : femmodel->elements->objects){ … … 62 71 int numvertices = element->GetNumberOfVertices(); 63 72 bool found1 = false; 73 IssmDouble sumlocalmask = 0.; 74 64 75 for(int j=0;j<numvertices;j++){ 65 76 lid = element->vertices[j]->Lid(); 66 if(local_mask[lid]>0.){ 77 /*we need to have at least a sharing edge, to extend the mask*/ 78 sumlocalmask += local_mask[lid]; 79 if(sumlocalmask > 1.5){ 67 80 found1 = true; 68 81 break; … … 73 86 for(int j=0;j<numvertices;j++){ 74 87 lid = element->vertices[j]->Lid(); 75 if(local_mask[lid]==0.){ 76 local_mask[lid]=1.; 77 keepgoing = true; 78 didsomething = 1; 79 } 88 local_mask[lid]=1.; 80 89 } 90 keepgoing = true; 81 91 } 82 92 } … … 99 109 xDelete<bool>(element_flag); 100 110 101 bool killbergReinit = false;111 int killbergReinit = 0; 102 112 /*OK, now deactivate iceberg and count the number of deactivated vertices*/ 103 113 for(Object* & object : femmodel->elements->objects){ … … 121 131 element->AddInput(MaskIceLevelsetEnum,values,P1Enum); 122 132 xDelete<IssmDouble>(values); 123 killbergReinit = true;133 killbergReinit += 1; 124 134 } 125 135 } 126 136 } 127 /*Recompute the sign distance for the levelset function*/128 femmodel->parameters->SetParam(killbergReinit,LevelsetHasKillIcebergsEnum);129 130 137 /*cleanup*/ 131 138 xDelete<IssmDouble>(local_mask); 139 140 /*Recompute the sign distance for the levelset function*/ 141 return killbergReinit; 132 142 } -
TabularUnified issm/trunk-jpl/src/c/modules/KillIcebergsx/KillIcebergsx.h ¶
r23992 r26973 6 6 7 7 /* local prototypes: */ 8 voidKillIcebergsx(FemModel* femmodel);8 int KillIcebergsx(FemModel* femmodel); 9 9 10 10 #endif -
TabularUnified issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h ¶
r26965 r26973 270 270 LevelsetReinitFrequencyEnum, 271 271 LevelsetStabilizationEnum, 272 LevelsetHasKillIcebergsEnum,273 272 LockFileNameEnum, 274 273 LoveAllowLayerDeletionEnum, -
TabularUnified issm/trunk-jpl/src/m/parameterization/killberg.m ¶
r26965 r26973 28 28 %isgrounded = max(md.mask.ocean_levelset(md.mesh.elements),[],2)>0; 29 29 pos = find(isgrounded); 30 element_flag(pos) = 1;30 %element_flag(pos) = 1; 31 31 mask(md.mesh.elements(pos,:)) = 1; 32 mask(md.mask.ice_levelset>=0) = 0; 32 33 33 34 iter = 1;
Note:
See TracChangeset
for help on using the changeset viewer.