Changeset 22241
- Timestamp:
- 11/08/17 05:07:49 (7 years ago)
- Location:
- issm/trunk-jpl/src
- Files:
-
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/AdaptiveMeshRefinement.cpp
r22100 r22241 30 30 this->fathermesh = new TPZGeoMesh(*cp.fathermesh); 31 31 this->previousmesh = new TPZGeoMesh(*cp.previousmesh); 32 this->refinement_type = cp.refinement_type; 32 33 this->level_max = cp.level_max; 33 34 this->radius_level_max = cp.radius_level_max; … … 38 39 this->thicknesserror_threshold = cp.thicknesserror_threshold; 39 40 this->deviatoricerror_threshold = cp.deviatoricerror_threshold; 41 this->max_deviatoricerror = cp.max_deviatoricerror; 42 this->max_thicknesserror = cp.max_thicknesserror; 40 43 this->sid2index.clear(); 41 44 this->sid2index.resize(cp.sid2index.size()); … … 61 64 if(this->fathermesh) delete this->fathermesh; 62 65 if(this->previousmesh) delete this->previousmesh; 66 this->refinement_type = -1; 63 67 this->level_max = -1; 64 68 this->radius_level_max = -1; … … 69 73 this->thicknesserror_threshold = -1; 70 74 this->deviatoricerror_threshold = -1; 75 this->max_deviatoricerror = -1; 76 this->max_thicknesserror = -1; 71 77 this->sid2index.clear(); 72 78 this->index2sid.clear(); … … 79 85 this->fathermesh = NULL; 80 86 this->previousmesh = NULL; 87 this->refinement_type = -1; 81 88 this->level_max = -1; 82 89 this->radius_level_max = -1; … … 87 94 this->thicknesserror_threshold = -1; 88 95 this->deviatoricerror_threshold = -1; 96 this->max_deviatoricerror = -1; 97 this->max_thicknesserror = -1; 89 98 this->sid2index.clear(); 90 99 this->index2sid.clear(); … … 94 103 95 104 /*Mesh refinement methods*/ 96 void AdaptiveMeshRefinement::ExecuteRefinement( int numberofpoints,double* xylist,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist){/*{{{*/97 105 void AdaptiveMeshRefinement::ExecuteRefinement(double* gl_distance,double* if_distance,double* deviatoricerror,double* thicknesserror,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist){/*{{{*/ 106 98 107 /*IMPORTANT! pelementslist are in Matlab indexing*/ 99 108 /*NEOPZ works only in C indexing*/ 100 109 if(!this->fathermesh || !this->previousmesh) _error_("Impossible to execute refinement: fathermesh or previousmesh is NULL!\n"); 110 if(this->refinement_type!=0 && this->refinement_type!=1) _error_("Impossible to execute refinement: refinement type is not defined!\n"); 111 112 /*Input verifications*/ 113 if(this->deviatoricerror_threshold>0 && !deviatoricerror) _error_("deviatoricerror is NULL!\n"); 114 if(this->thicknesserror_threshold>0 && !thicknesserror) _error_("thicknesserror is NULL!\n"); 115 if(this->groundingline_distance>0 && !gl_distance) _error_("gl_distance is NULL!\n"); 116 if(this->icefront_distance>0 && !if_distance) _error_("if_distance is NULL!\n"); 101 117 102 118 /*Intermediaries*/ 103 119 bool verbose=VerboseSolution(); 104 105 /*Refine the mesh using level max*/106 this->RefineMesh(verbose,this->previousmesh,numberofpoints,xylist);107 108 /*Get new geometric mesh in ISSM data structure*/109 this->GetMesh(this->previousmesh,pnewnumberofvertices,pnewnumberofelements,px,py,pelementslist);110 111 /*Verify the new geometry*/112 this->CheckMesh(pnewnumberofvertices,pnewnumberofelements,px,py,pelementslist);113 114 if(verbose) _printf_("\trefinement process done!\n");115 }116 /*}}}*/117 void AdaptiveMeshRefinement::ExecuteRefinement(double* gl_elementdistance,double* if_elementdistance,double* deviatoricerror,double* thicknesserror,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist){/*{{{*/118 119 /*IMPORTANT! pelementslist are in Matlab indexing*/120 /*NEOPZ works only in C indexing*/121 if(!this->fathermesh || !this->previousmesh) _error_("Impossible to execute refinement: fathermesh or previousmesh is NULL!\n");122 123 /*Intermediaries*/124 bool verbose=true;125 120 126 121 /*Execute refinement*/ 127 this->Refine mentProcess(verbose,gl_elementdistance,if_elementdistance,deviatoricerror,thicknesserror);122 this->RefineMeshOneLevel(verbose,gl_distance,if_distance,deviatoricerror,thicknesserror); 128 123 129 124 /*Get new geometric mesh in ISSM data structure*/ … … 134 129 } 135 130 /*}}}*/ 136 void AdaptiveMeshRefinement::RefinementProcess(bool &verbose,double* gl_elementdistance,double* if_elementdistance,double* deviatoricerror,double* thicknesserror){/*{{{*/ 137 138 if(verbose) _printf_("\n\trefinement process started (level max = " << this->level_max << ")\n"); 131 void AdaptiveMeshRefinement::RefineMeshOneLevel(bool &verbose,double* gl_distance,double* if_distance,double* deviatoricerror,double* thicknesserror){/*{{{*/ 139 132 140 133 /*Intermediaries*/ 141 TPZGeoMesh* nohangingnodesmesh=NULL; 142 143 double mean_mask = 0; 144 double mean_tauerror = 0; 145 double mean_Herror = 0; 146 double group_Herror = 0; 147 int index,sid; 148 std::vector<int> specialfatherindex; specialfatherindex.clear(); 149 150 /*Calculate mean values*/ 151 /* 152 for(int i=0;i<this->sid2index.size();i++){ 153 mean_mask += masklevelset[i]; 154 mean_tauerror += deviatorictensorerror[i]; 155 mean_Herror += thicknesserror[i]; 156 } 157 mean_mask /= this->sid2index.size(); 158 mean_tauerror /= this->sid2index.size(); 159 mean_Herror /= this->sid2index.size(); 160 */ 161 if(verbose) _printf_("\t\tdeal with special elements...\n"); 162 /*Deal with special elements*/ 163 for(int i=0;i<this->specialelementsindex.size();i++){ 164 if(this->specialelementsindex[i]==-1) continue; 165 /*Get special element and verify*/ 166 TPZGeoEl* geoel=this->previousmesh->Element(this->specialelementsindex[i]); 167 if(!geoel)_error_("special element (sid) "<<i<<" is null!\n"); 168 if(geoel->HasSubElement())_error_("special element (sid) "<<i<<" has "<<geoel->NSubElements()<<" subelements!\n"); 169 if(geoel->MaterialId()!=this->GetElemMaterialID()) _error_("geoel->MaterialId is not GetElemMaterialID!\n"); 170 if(!geoel->Father())_error_("father of special element (sid) "<<i<<" is null!\n"); 171 172 /*Get element's siblings and verify*/ 173 TPZGeoEl* father=geoel->Father(); 174 TPZVec<TPZGeoEl *> siblings; 175 father->GetHigherSubElements(siblings); 176 std::vector<int> sidvec; sidvec.resize(siblings.size()); 177 for (int j=0;j<siblings.size();j++){ 178 if(!siblings[j]) _error_("special element (sid) "<<i<<" has a null siblings null!\n"); 179 sidvec[j]=this->index2sid[siblings[j]->Index()]; 180 } 181 182 /*Now, reset the data strucure and verify if the siblings should be deleted*/ 183 if(siblings.size()<4){ 184 /*Reset subelements in the father*/ 185 father->ResetSubElements(); 186 }else{ 187 if(siblings.size()!=4) _error_("element (index) "<<father->Index()<<" has "<<father->NSubElements()<<" subelements!\n"); 188 } 189 for (int j=0;j<siblings.size();j++){ 190 for(int k=0;k<this->specialelementsindex.size();k++){ 191 if(this->specialelementsindex[k]==siblings[j]->Index()){ 192 index = siblings[j]->Index(); 193 if(index<0) _error_("index is null!\n"); 194 sid = this->index2sid[index]; 195 if(sid<0) _error_("sid is null!\n"); 196 this->specialelementsindex[k] = -1; 197 this->index2sid[index] = -1; 198 this->sid2index[sid] = -1; 199 } 200 } 201 if(siblings.size()<4){ 202 /*Ok, the special element can be deleted*/ 203 siblings[j]->ResetSubElements(); 204 this->previousmesh->DeleteElement(siblings[j],siblings[j]->Index()); 205 } 206 } 207 208 /*Now, verify if the father should be refined with uniform pattern (smoother)*/ 209 if(siblings.size()==3){//it keeps the mesh with uniform elements 210 /*Father has uniform subelements now*/ 211 TPZVec<TPZGeoEl *> sons; 212 father->Divide(sons); 213 }else{ 214 specialfatherindex.push_back(father->Index()); 215 } 216 if(this->specialelementsindex[i]!=-1) _error_("special element "<<i<<" was not deleted!\n"); 217 } 218 this->previousmesh->BuildConnectivity(); 219 220 if(verbose) _printf_("\t\tuniform refinement...\n"); 221 /*Deal with uniform elemnts*/ 222 for(int i=0;i<this->sid2index.size();i++){ 223 if(this->sid2index[i]==-1) continue; 224 /*Get element and verify*/ 225 TPZGeoEl* geoel=this->previousmesh->Element(this->sid2index[i]); 226 if(geoel->HasSubElement()) _error_("element (sid) "<<i<<" has "<<geoel->NSubElements()<<" subelements!\n"); 227 if(geoel->MaterialId()!=this->GetElemMaterialID()) _error_("geoel->MaterialId is not GetElemMaterialID!\n"); 228 229 /*Refine process*/ 230 if(thicknesserror[i]>mean_Herror) 231 { 232 int count=0; 233 TPZGeoEl* father=geoel->Father(); 234 if(father){ 235 for(int j=3;j<6;j++){ 236 index=father->Neighbour(j).Element()->Index(); 237 for(int k=0;k<specialfatherindex.size();k++) if(specialfatherindex[k]==index) count++; 238 } 239 } 240 TPZVec<TPZGeoEl *> sons; 241 if(geoel->Level()<this->level_max && count==0) geoel->Divide(sons); 242 } 243 else if(geoel->Level()>0) 244 {/*Unrefine process*/ 245 246 /*Get siblings and verify*/ 247 TPZVec<TPZGeoEl *> siblings; 248 geoel->Father()->GetHigherSubElements(siblings); 249 //if(siblings.size()<4) _error_("Impossible to refine: geoel (index) "<<this->sid2index[i]<<" has less than 3 siblings!\n"); 250 if(siblings.size()>4) continue;//Father has more then 4 sons, this group should not be unrefined. 251 252 /*Compute the error of the group*/ 253 group_Herror=0; 254 for(int j=0;j<siblings.size();j++){ 255 index = siblings[j]->Index(); 256 sid = this->index2sid[index]; 257 if(sid==-1) continue; 258 group_Herror+=thicknesserror[sid]; 259 } 260 /*Verify if this group should be unrefined*/ 261 if(group_Herror>0 && group_Herror<0*mean_Herror){ //itapopo 262 /*Reset subelements in the father*/ 263 this->previousmesh->Element(geoel->Father()->Index())->ResetSubElements(); 264 /*Delete the elements and set their indexes in the index2sid and sid2index*/ 265 for (int j=0;j<siblings.size();j++){ 266 index = siblings[j]->Index(); 267 sid = this->index2sid[index]; 268 this->index2sid[index]=-1; 269 if(sid!=-1) this->sid2index[sid]=-1; 270 this->previousmesh->DeleteElement(siblings[j],siblings[j]->Index()); 271 }//for j 272 }//if 273 }/*Unrefine process*/ 274 }//for i 275 this->previousmesh->BuildConnectivity(); 276 277 if(verbose) _printf_("\t\trefine to avoid hanging nodes...\n"); 278 this->RefineMeshToAvoidHangingNodes(verbose,this->previousmesh); 279 280 //nohangingnodesmesh = this->CreateRefPatternMesh(newmesh); itapopo tentar otimizar 281 282 if(verbose) _printf_("\trefinement process done!\n"); 283 } 284 /*}}}*/ 285 void AdaptiveMeshRefinement::RefineMesh(bool &verbose,TPZGeoMesh* gmesh,int numberofpoints,double* xylist){/*{{{*/ 286 287 /*Verify if there are points*/ 288 if(numberofpoints==0) return; 289 290 /*Intermediaries*/ 291 int nelem =-1; 292 int side2D = 6; 293 double radius_h =-1; 294 double radius_hmax=std::max(this->radius_level_max,std::max(this->groundingline_distance,this->icefront_distance)); 295 int count =-1; 296 double mindistance=0.; 297 double distance =0.;; 134 int nelem =-1; 135 int side2D = 6; 136 int sid =-1; 137 int count =-1; 138 int criteria =-1; 139 int numberofcriteria =-1; 140 int nconformelements = this->sid2index.size(); 141 double gl_radius_h =-1; 142 double gl_radius_hmax = std::max(this->radius_level_max,this->groundingline_distance); 143 double if_radius_h =-1; 144 double if_radius_hmax = std::max(this->radius_level_max,this->icefront_distance); 145 double gl_groupdistance =-1; 146 double if_groupdistance =-1; 147 double d_maxerror =-1; 148 double t_maxerror =-1; 149 double deviatoric_grouperror =-1; 150 double thickness_grouperror =-1; 151 TPZGeoMesh* gmesh = NULL; 298 152 TPZVec<REAL> qsi(2,0.),cp(3,0.); 299 153 TPZVec<TPZGeoEl*> sons; 300 301 /*First, delete the special elements*/ 302 this->DeleteSpecialElements(verbose,gmesh); 154 std::vector<int> index; 155 156 /*Calculate the number of criteria{{{*/ 157 numberofcriteria=0; 158 if(this->deviatoricerror_threshold>0) numberofcriteria++; 159 if(this->thicknesserror_threshold>0) numberofcriteria++; 160 if(this->groundingline_distance>0) numberofcriteria++; 161 if(this->icefront_distance>0) numberofcriteria++; 162 /*}}}*/ 163 164 /*Calculate the maximum of the estimators, if requested{{{*/ 165 if(this->deviatoricerror_threshold>0 && this->max_deviatoricerror<0){ 166 for(int i=0;i<nconformelements;i++) this->max_deviatoricerror=max(this->max_deviatoricerror,deviatoricerror[i]); 167 } 168 if(this->thicknesserror_threshold>0 && this->max_thicknesserror<0){ 169 for(int i=0;i<nconformelements;i++) this->max_thicknesserror=max(this->max_thicknesserror,thicknesserror[i]); 170 } 171 /*}}}*/ 172 173 /*First, verify if special elements have min distance or high errors{{{*/ 174 gmesh=this->previousmesh; 175 for(int i=0;i<this->specialelementsindex.size();i++){ 176 if(this->specialelementsindex[i]==-1) _error_("index is -1!\n"); 177 if(!gmesh->Element(this->specialelementsindex[i])) _error_("element is null!\n"); 178 if(!gmesh->Element(this->specialelementsindex[i])->Father()) _error_("father is null!\n"); 179 if(gmesh->Element(this->specialelementsindex[i])->HasSubElement()) _error_("special element has sub elements!\n"); 180 sons.clear(); 181 gmesh->Element(this->specialelementsindex[i])->Father()->GetHigherSubElements(sons); 182 /*Limits*/ 183 gl_radius_h = gl_radius_hmax*std::pow(this->gradation,this->level_max-gmesh->Element(this->specialelementsindex[i])->Level()); 184 if_radius_h = if_radius_hmax*std::pow(this->gradation,this->level_max-gmesh->Element(this->specialelementsindex[i])->Level()); 185 d_maxerror = this->deviatoricerror_threshold*this->max_deviatoricerror; 186 t_maxerror = this->thicknesserror_threshold*this->max_thicknesserror; 187 /*Calculate the distance and error of the group (sons)*/ 188 gl_groupdistance=INFINITY;if_groupdistance=INFINITY;deviatoric_grouperror=0;thickness_grouperror=0; 189 for(int s=0;s<sons.size();s++){ 190 sid=this->index2sid[sons[s]->Index()]; 191 if(sid<0) continue; 192 if(this->groundingline_distance>0) gl_groupdistance=std::min(gl_groupdistance,gl_distance[sid]); 193 if(this->icefront_distance>0) if_groupdistance=std::min(if_groupdistance,if_distance[sid]); 194 if(this->deviatoricerror_threshold>0) deviatoric_grouperror+=deviatoricerror[sid]; 195 if(this->thicknesserror_threshold>0) thickness_grouperror+=thicknesserror[sid]; 196 } 197 criteria=0; 198 if(this->groundingline_distance>0 && gl_groupdistance<gl_radius_h) criteria++; 199 if(this->icefront_distance>0 && if_groupdistance<if_radius_h) criteria++; 200 if(this->deviatoricerror_threshold>0 && deviatoric_grouperror>d_maxerror) criteria++; 201 if(this->thicknesserror_threshold>0 && thickness_grouperror>t_maxerror) criteria++; 202 /*Finally, it keeps the father index if it must be refine*/ 203 if(criteria) index.push_back(gmesh->Element(this->specialelementsindex[i])->FatherIndex()); 204 } 205 /*}}}*/ 206 207 /*Now, detele the special elements{{{*/ 208 if(this->refinement_type==1) this->DeleteSpecialElements(verbose,gmesh); 209 else this->specialelementsindex.clear(); 210 /*}}}*/ 211 212 /*Set the mesh and delete previousmesh if refinement type is 0{{{*/ 213 if(this->refinement_type==0){ 214 delete this->previousmesh; 215 gmesh=this->fathermesh; 216 } 217 /*}}}*/ 218 219 /*Unrefinement process: loop over level of refinements{{{*/ 220 if(verbose) _printf_("\tunrefinement process...\n"); 221 if(verbose) _printf_("\ttotal: "); 222 count=0; 223 224 nelem=gmesh->NElements();//must keep here 225 for(int i=0;i<nelem;i++){ 226 if(!gmesh->Element(i)) continue; 227 if(gmesh->Element(i)->MaterialId()!=this->GetElemMaterialID()) continue; 228 if(gmesh->Element(i)->HasSubElement()) continue; 229 if(gmesh->Element(i)->Level()==0) continue; 230 if(!gmesh->Element(i)->Father()) _error_("father is NULL!\n"); 231 /*Limits with lag*/ 232 gl_radius_h = this->lag*gl_radius_hmax*std::pow(this->gradation,this->level_max-gmesh->Element(i)->Level()); 233 if_radius_h = this->lag*if_radius_hmax*std::pow(this->gradation,this->level_max-gmesh->Element(i)->Level()); 234 d_maxerror = 0.05*this->max_deviatoricerror;//itapopo definir melhor 235 t_maxerror = 0.05*this->max_thicknesserror;//itapopo definir melhor 236 /*Get the sons of the father (sibilings)*/ 237 sons.clear(); 238 gmesh->Element(i)->Father()->GetHigherSubElements(sons); 239 if(sons.size()!=4) continue;//delete just group of 4 elements. This avoids big holes in the mesh 240 /*Find the minimal distance and the error of the group*/ 241 gl_groupdistance=INFINITY;if_groupdistance=INFINITY;deviatoric_grouperror=0;thickness_grouperror=0; 242 for(int s=0;s<sons.size();s++){ 243 sid=this->index2sid[sons[s]->Index()]; 244 /*Verify if this group have solutions*/ 245 if(sid<0){gl_groupdistance=INFINITY;if_groupdistance=INFINITY;deviatoric_grouperror=INFINITY;thickness_grouperror=INFINITY;continue;} 246 /*Distance and error of the group*/ 247 if(this->groundingline_distance>0) gl_groupdistance=std::min(gl_groupdistance,gl_distance[sid]); 248 if(this->icefront_distance>0) if_groupdistance=std::min(if_groupdistance,if_distance[sid]); 249 if(this->deviatoricerror_threshold>0) deviatoric_grouperror+=deviatoricerror[sid]; 250 if(this->thicknesserror_threshold>0) thickness_grouperror+=thicknesserror[sid]; 251 } 252 /*Verify the criteria*/ 253 criteria=0; 254 if(this->groundingline_distance>0 && gl_groupdistance>gl_radius_h) criteria++; 255 if(this->icefront_distance>0 && if_groupdistance>if_radius_h) criteria++; 256 if(this->deviatoricerror_threshold>0 && deviatoric_grouperror<d_maxerror) criteria++; 257 if(this->thicknesserror_threshold>0 && thickness_grouperror<t_maxerror) criteria++; 258 /*Now, if the group attends the criteria, unrefine it*/ 259 if(criteria==numberofcriteria){ 260 gmesh->Element(i)->Father()->ResetSubElements(); count++; 261 for(int s=0;s<sons.size();s++){this->index2sid[sons[s]->Index()]=-1;gmesh->DeleteElement(sons[s],sons[s]->Index());} 262 } 263 } 264 if(verbose) _printf_(""<<count<<"\n"); 265 /*Adjust the connectivities before continue*/ 266 gmesh->BuildConnectivity(); 267 /*}}}*/ 303 268 304 269 /*Refinement process: loop over level of refinements{{{*/ 305 270 if(verbose) _printf_("\trefinement process (level max = "<<this->level_max<<")\n"); 306 for(int h=1;h<=this->level_max;h++){ 307 if(verbose) _printf_("\tlevel "<<h<<" (total: "); 271 if(verbose) _printf_("\ttotal: "); 272 count=0; 273 nelem=gmesh->NElements();//must keep here 274 for(int i=0;i<nelem;i++){ 275 if(!gmesh->Element(i)) continue; 276 if(gmesh->Element(i)->MaterialId()!=this->GetElemMaterialID()) continue; 277 if(gmesh->Element(i)->HasSubElement()) continue; 278 if(gmesh->Element(i)->Level()==this->level_max) continue; 279 /*Verify if this element has solutions*/ 280 sid=this->index2sid[gmesh->Element(i)->Index()]; 281 if(sid<0) continue; 282 /*Filter: set the region/radius for level h*/ 283 gl_radius_h = gl_radius_hmax*std::pow(this->gradation,this->level_max-(gmesh->Element(i)->Level()+1));//+1, current element level is <level_max 284 if_radius_h = if_radius_hmax*std::pow(this->gradation,this->level_max-(gmesh->Element(i)->Level()+1));//+1, current element level is <level_max 285 d_maxerror = this->deviatoricerror_threshold*this->max_deviatoricerror; 286 t_maxerror = this->thicknesserror_threshold*this->max_thicknesserror; 287 /*Verify distance and error of the element, if requested*/ 288 criteria=0; 289 if(this->groundingline_distance>0 && gl_distance[sid]<gl_radius_h) criteria++; 290 if(this->icefront_distance>0 && if_distance[sid]<if_radius_h) criteria++; 291 if(this->deviatoricerror_threshold>0 && deviatoricerror[sid]>d_maxerror) criteria++; 292 if(this->thicknesserror_threshold>0 && thicknesserror[sid]>t_maxerror) criteria++; 293 /*Now, if it attends any criterion, keep the element index to refine in next step*/ 294 if(criteria)index.push_back(i); 295 } 296 /*Now, refine the elements*/ 297 for(int i=0;i<index.size();i++){ 298 if(!gmesh->Element(index[i])) DebugStop(); 299 if(!gmesh->Element(index[i])->HasSubElement()){gmesh->Element(index[i])->Divide(sons);count++;} 300 } 301 if(verbose) _printf_(""<<count<<"\n"); 302 /*Adjust the connectivities before continue*/ 303 gmesh->BuildConnectivity(); 304 /*}}}*/ 305 306 /*Now, apply smoothing and insert special elements to avoid hanging nodes{{{*/ 307 this->RefineMeshWithSmoothing(verbose,gmesh); 308 if(this->refinement_type==0) this->previousmesh=this->CreateRefPatternMesh(gmesh);//in this case, gmesh==this->fathermesh 309 gmesh=this->previousmesh;//previous mesh is always refined to avoid hanging nodes 310 this->RefineMeshToAvoidHangingNodes(verbose,gmesh); 311 /*}}}*/ 312 } 313 /*}}}*/ 314 int AdaptiveMeshRefinement::VerifyRefinementType(TPZGeoEl* geoel){/*{{{*/ 315 316 /* 317 * 0 : no refinement 318 * 1 : special refinement (to avoid hanging nodes) 319 * 2 : uniform refinment 320 * */ 321 if(!geoel) _error_("geoel is NULL!\n"); 322 323 /*Output*/ 324 int type=0; 325 int count=0; 326 327 /*Intermediaries*/ 328 TPZVec<TPZGeoEl*> sons; 329 330 /*Loop over neighboors (sides 3, 4 and 5)*/ 331 for(int j=3;j<6;j++){ 332 sons.clear(); 333 geoel->Neighbour(j).Element()->GetHigherSubElements(sons); 334 if(sons.size()) count++; //if neighbour was refined 335 if(sons.size()>4) count++; //if neighbour's level is > element level+1 336 } 337 338 /*Verify and return*/ 339 if(count>1) type=2; 340 else type=count; 341 342 return type; 343 } 344 /*}}}*/ 345 void AdaptiveMeshRefinement::RefineMeshWithSmoothing(bool &verbose,TPZGeoMesh* gmesh){/*{{{*/ 346 347 /*Intermediaries*/ 348 int nelem =-1; 349 int count =-1; 350 int type =-1; 351 int typecount =-1; 352 353 TPZVec<TPZGeoEl*> sons; 354 355 /*Refinement process: loop over level of refinements*/ 356 if(verbose) _printf_("\tsmoothing process (level max = "<<this->level_max<<")\n"); 357 if(verbose) _printf_("\ttotal: "); 358 359 count=1; 360 while(count>0){ 308 361 count=0; 309 310 /*Filter: set the region/radius for level h*/311 radius_h=radius_hmax*std::pow(this->gradation,this->level_max-h);312 313 /*Find the minimal distance of the elements (center point) to the points */314 362 nelem=gmesh->NElements();//must keep here 315 for(int i=0;i<nelem;i++){ //itapopo pode-se reduzir o espaço de busca aqui363 for(int i=0;i<nelem;i++){ 316 364 if(!gmesh->Element(i)) continue; 317 365 if(gmesh->Element(i)->MaterialId()!=this->GetElemMaterialID()) continue; 318 366 if(gmesh->Element(i)->HasSubElement()) continue; 319 if(gmesh->Element(i)->Level()>=h) continue; 320 gmesh->Element(i)->CenterPoint(side2D,qsi); 321 gmesh->Element(i)->X(qsi,cp); 322 mindistance=radius_h; 323 for (int j=0;j<numberofpoints;j++){ 324 distance = std::sqrt( (xylist[2*j]-cp[0])*(xylist[2*j]-cp[0])+(xylist[2*j+1]-cp[1] )*(xylist[2*j+1]-cp[1]) ); 325 mindistance = std::min(mindistance,distance);//min distance to the point 367 if(gmesh->Element(i)->Level()==this->level_max) continue; 368 /*loop over neighboors (sides 3, 4 and 5). Important: neighbours has the same dimension of the element*/ 369 type=this->VerifyRefinementType(gmesh->Element(i)); 370 if(type<2){ 371 typecount=0; 372 for(int j=3;j<6;j++){ 373 if(gmesh->Element(i)->Neighbour(j).Element()->HasSubElement()) continue; 374 if(gmesh->Element(i)->Neighbour(j).Element()->Index()==i) typecount++;//neighbour==this element, element at the border 375 if(this->VerifyRefinementType(gmesh->Element(i)->Neighbour(j).Element())==1) typecount++; 376 } 377 if(typecount>1 && type==1) type=2; 378 else if(typecount>2 && type==0) type=2; 326 379 } 327 /*If the element is inside the region, refine it*/ 328 if(mindistance<radius_h){ 329 gmesh->Element(i)->Divide(sons); 330 count++; 331 } 332 } 333 if(verbose) _printf_(""<<count<<")\n"); 334 } 335 /*Adjust the connectivities before continue*/ 336 gmesh->BuildConnectivity(); 337 /*}}}*/ 338 339 /*Unrefinement process: loop over level of refinements{{{*/ 340 if(verbose) _printf_("\tunrefinement process...\n"); 341 for(int h=this->level_max;h>=1;h--){ 342 if(verbose) _printf_("\tlevel "<<h<<" (total: "); 343 count=0; 344 345 /*Filter with lag: set the region/radius for level h*/ 346 radius_h=this->lag*radius_hmax*std::pow(this->gradation,this->level_max-h); 347 348 /*Find the minimal distance of the elements (center point) to the points */ 349 nelem=gmesh->NElements();//must keep here 350 for(int i=0;i<nelem;i++){//itapopo pode-se reduzir o espaço de busca aqui 351 if(!gmesh->Element(i)) continue; 352 if(gmesh->Element(i)->MaterialId()!=this->GetElemMaterialID()) continue; 353 if(gmesh->Element(i)->HasSubElement()) continue; 354 if(gmesh->Element(i)->Level()!=h) continue; 355 if(!gmesh->Element(i)->Father()) _error_("father is NULL!\n"); 356 /*Get the sons of the father (sibilings)*/ 357 sons.clear(); 358 gmesh->Element(i)->Father()->GetHigherSubElements(sons); 359 if(sons.size()!=4) continue;//delete just group of 4 elements. This avoids big holes in the mesh 360 /*Find the minimal distance of the group*/ 361 mindistance=INFINITY; 362 for(int s=0;s<sons.size();s++){ 363 sons[s]->CenterPoint(side2D,qsi); 364 sons[s]->X(qsi,cp); 365 for (int j=0;j<numberofpoints;j++){ 366 distance = std::sqrt( (xylist[2*j]-cp[0])*(xylist[2*j]-cp[0])+(xylist[2*j+1]-cp[1] )*(xylist[2*j+1]-cp[1]) ); 367 mindistance = std::min(mindistance,distance);//min distance to the point 368 } 369 } 370 /*If the group is outside the region, unrefine the group*/ 371 if(mindistance>radius_h){ 372 gmesh->Element(i)->Father()->ResetSubElements(); 373 count++; 374 for(int s=0;s<sons.size();s++){ 375 gmesh->DeleteElement(sons[s],sons[s]->Index()); 376 } 377 } 378 } 379 if(verbose) _printf_(""<<count<<")\n"); 380 } 381 /*Adjust the connectivities before continue*/ 382 gmesh->BuildConnectivity(); 383 /*}}}*/ 384 385 /*Now, insert special elements to avoid hanging nodes*/ 386 this->RefineMeshToAvoidHangingNodes(verbose,gmesh); 387 } 388 /*}}}*/ 389 void AdaptiveMeshRefinement::RefineMesh(TPZGeoMesh* gmesh,std::vector<int> &elements){/*{{{*/ 390 391 /*Refine elements: uniform pattern refinement*/ 392 for(int i=0;i<elements.size();i++){ 393 /*Get geometric element and verify if it has already been refined*/ 394 int index = elements[i]; 395 TPZGeoEl * geoel = gmesh->Element(index); 396 if(geoel->HasSubElement()) _error_("Impossible to refine: geoel (index) " << index << " has subelements!\n"); 397 if(geoel->MaterialId()!=this->GetElemMaterialID()) _error_("Impossible to refine: geoel->MaterialId is not GetElemMaterialID!\n"); 398 /*Divide geoel*/ 399 TPZVec<TPZGeoEl *> Sons; 400 geoel->Divide(Sons); 401 } 402 gmesh->BuildConnectivity(); 380 /*refine the element if requested*/ 381 if(type==2){gmesh->Element(i)->Divide(sons); count++;} 382 } 383 if(verbose){ 384 if(count==0) _printf_(""<<count<<"\n"); 385 else _printf_(""<<count<<", "); 386 } 387 /*Adjust the connectivities before continue*/ 388 gmesh->BuildConnectivity(); 389 } 403 390 } 404 391 /*}}}*/ … … 452 439 if(gmesh->Element(this->specialelementsindex[i])->Father()) gmesh->Element(this->specialelementsindex[i])->Father()->ResetSubElements(); 453 440 gmesh->DeleteElement(gmesh->Element(this->specialelementsindex[i]),this->specialelementsindex[i]); 441 this->index2sid[this->specialelementsindex[i]]=-1; 454 442 count++; 455 443 } … … 568 556 if(nvertices<=0) _error_("Impossible to create initial mesh: nvertices is <= 0!\n"); 569 557 if(nelements<=0) _error_("Impossible to create initial mesh: nelements is <= 0!\n"); 558 if(this->refinement_type!=0 && this->refinement_type!=1) _error_("Impossible to create initial mesh: refinement type is not defined!\n"); 570 559 571 560 /*Verify and creating initial mesh*/ … … 591 580 const int mat = this->GetElemMaterialID(); 592 581 TPZManVector<long> elem(this->GetNumberOfNodes(),0); 582 this->index2sid.clear(); this->index2sid.resize(nelements); 593 583 this->sid2index.clear(); 594 584 595 585 for(int i=0;i<nelements;i++){ 596 586 for(int j=0;j<this->GetNumberOfNodes();j++) elem[j]=elements[i*this->GetNumberOfNodes()+j]-1;//Convert Matlab to C indexing 597 /*reftype = 0: uniform, fast / reftype = 1: uniform and non-uniform (avoid hanging nodes), it is not too fast */598 const int reftype = 1;599 587 switch(this->GetNumberOfNodes()){ 600 case 3: this->fathermesh->CreateGeoElement(ETriangle,elem,mat,index, reftype); break;588 case 3: this->fathermesh->CreateGeoElement(ETriangle,elem,mat,index,this->refinement_type); break; 601 589 default: _error_("mesh not supported yet"); 602 590 } 603 591 /*Define the element ID*/ 604 592 this->fathermesh->ElementVec()[index]->SetId(i); 605 /*Initialize sid2index */593 /*Initialize sid2index and index2sid*/ 606 594 this->sid2index.push_back((int)index); 595 this->index2sid[(int)index]=this->sid2index.size()-1;//keep the element sid 607 596 } 608 597 /*Build element and node connectivities*/ 609 598 this->fathermesh->BuildConnectivity(); 610 599 /*Set previous mesh*/ 611 this->previousmesh=new TPZGeoMesh(*this->fathermesh); 600 if(this->refinement_type==1) this->previousmesh=new TPZGeoMesh(*this->fathermesh); 601 else this->previousmesh=this->CreateRefPatternMesh(this->fathermesh); 612 602 } 613 603 /*}}}*/ … … 622 612 int reftype = 1; 623 613 long index; 624 614 625 615 //nodes 626 616 newgmesh->NodeVec().Resize(nnodes); … … 630 620 for(int i=0;i<nelem;i++){ 631 621 TPZGeoEl * geoel = gmesh->Element(i); 632 TPZManVector<long> elem(3,0); 622 623 if(!geoel){ 624 index=newgmesh->ElementVec().AllocateNewElement(); 625 newgmesh->ElementVec()[index] = NULL; 626 continue; 627 } 628 629 TPZManVector<long> elem(3,0); 633 630 for(int j=0;j<3;j++) elem[j] = geoel->NodeIndex(j); 634 631 635 632 newgmesh->CreateGeoElement(ETriangle,elem,mat,index,reftype); 636 633 newgmesh->ElementVec()[index]->SetId(geoel->Id()); 637 634 638 635 TPZGeoElRefPattern<TPZGeoTriangle>* newgeoel = dynamic_cast<TPZGeoElRefPattern<TPZGeoTriangle>*>(newgmesh->ElementVec()[index]); … … 689 686 } 690 687 } 688 689 /*Now, build connectivities*/ 691 690 newgmesh->BuildConnectivity(); 692 691 … … 715 714 //Verify if there are inf or NaN in coords 716 715 for(int i=0;i<*nvertices;i++){ 717 if( isnan((*px)[i]) ||isinf((*px)[i])) _error_("Impossible to continue: px i=" << i <<" is NaN or Inf!\n");718 if( isnan((*py)[i]) ||isinf((*py)[i])) _error_("Impossible to continue: py i=" << i <<" is NaN or Inf!\n");716 if(std::isnan((*px)[i]) || std::isinf((*px)[i])) _error_("Impossible to continue: px i=" << i <<" is NaN or Inf!\n"); 717 if(std::isnan((*py)[i]) || std::isinf((*py)[i])) _error_("Impossible to continue: py i=" << i <<" is NaN or Inf!\n"); 719 718 } 720 719 for(int i=0;i<*nelements;i++){ 721 720 for(int j=0;j<this->GetNumberOfNodes();j++){ 722 if( isnan((*pelements)[i*GetNumberOfNodes()+j])) _error_("Impossible to continue: px i=" << i <<" is NaN!\n");723 if( isinf((*pelements)[i*GetNumberOfNodes()+j])) _error_("Impossible to continue: px i=" << i <<" is Inf!\n");721 if(std::isnan((*pelements)[i*GetNumberOfNodes()+j])) _error_("Impossible to continue: px i=" << i <<" is NaN!\n"); 722 if(std::isinf((*pelements)[i*GetNumberOfNodes()+j])) _error_("Impossible to continue: px i=" << i <<" is Inf!\n"); 724 723 } 725 724 } -
issm/trunk-jpl/src/c/classes/AdaptiveMeshRefinement.h
r22100 r22241 54 54 * radius_h = lag * initial_radius * gradation ^ (level_max-h) 55 55 */ 56 int refinement_type; //0 uniform (faster); 1 refpattern 56 57 int level_max; //max level of refinement 57 58 double radius_level_max; //initial radius which in the elements will be refined with level max … … 63 64 double thicknesserror_threshold; //if ==0, it will not be used 64 65 double deviatoricerror_threshold; //if ==0, it will not be used 66 double max_deviatoricerror; // Max value of the error estimator; in general, it is defined in the first time step. Attention with restart 67 double max_thicknesserror; // Max value of the error estimator; in general, it is defined in the first time step. Attention with restart 65 68 /*}}}*/ 66 69 /*Public methods{{{*/ … … 74 77 void Initialize(); 75 78 void ExecuteRefinement(int numberofpoints,double* xylist,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist); 76 void ExecuteRefinement(double* gl_elementdistance,double* if_elementdistance,double* deviatoricerror,double* thicknesserror,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist); 79 void ExecuteRefinement(int numberofpoints,double* xylist,double* deviatoricerror,double* thicknesserror,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist); 80 void ExecuteRefinement(double* gl_distance,double* if_distance,double* deviatoricerror,double* thicknesserror,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist); 77 81 void CreateInitialMesh(int &nvertices,int &nelements,double* x,double* y,int* elements); 78 82 void CheckMesh(int* nvertices,int* nelements,double** px,double** py,int** pelements); … … 80 84 private: 81 85 /*Private attributes{{{*/ 82 std::vector<int> sid2index; 83 std::vector<int> index2sid; 84 std::vector<int> specialelementsindex; 85 TPZGeoMesh *fathermesh; // Father Mesh is the entire mesh without refinement86 TPZGeoMesh *previousmesh; // Previous Mesh is the refinedmesh86 std::vector<int> sid2index; // Vector that keeps index of PZGeoMesh elements used in the ISSM mesh (sid) 87 std::vector<int> index2sid; // Vector that keeps sid of issm mesh elements used in the neopz mesh (index) 88 std::vector<int> specialelementsindex; // Vector that keeps index of the special elements (created to avoid haning nodes) 89 TPZGeoMesh *fathermesh; // Entire mesh without refinement if refinement_type==1; refined with hanging nodes if efinement_type==0 90 TPZGeoMesh *previousmesh; // Refined mesh without hanging nodes (it is always refpattern type), used to generate ISSM mesh 87 91 /*}}}*/ 88 92 /*Private methods{{{*/ 89 void RefinementProcess(bool &verbose,double* partiallyfloatedelements,double* masklevelset,double* deviatorictensorerror,double* thicknesserror); 90 void RefineMesh(bool &verbose,TPZGeoMesh* gmesh,int numberofpoints,double* xylist); 91 void RefineMesh(TPZGeoMesh *gmesh,std::vector<int> &elements); 92 void RefineMeshToAvoidHangingNodes(bool &verbose,TPZGeoMesh* gmesh); 93 void RefineMeshOneLevel(bool &verbose,double* gl_distance,double* if_distance,double* deviatoricerror,double* thicknesserror); 94 void RefineMeshWithSmoothing(bool &verbose,TPZGeoMesh* gmesh); 95 void RefineMeshToAvoidHangingNodes(bool &verbose,TPZGeoMesh* gmesh); 93 96 void DeleteSpecialElements(bool &verbose,TPZGeoMesh* gmesh); 94 97 void GetMesh(TPZGeoMesh* gmesh,int* nvertices,int* nelements,double** px,double** py,int** pelements); … … 98 101 void PrintGMeshVTK(TPZGeoMesh *gmesh,std::ofstream &file,bool matColor=true); 99 102 int GetVTK_ElType(TPZGeoEl* gel); 103 int VerifyRefinementType(TPZGeoEl* geoel); 100 104 /*}}}*/ 101 105 }; -
issm/trunk-jpl/src/c/classes/AmrBamg.cpp
r22100 r22241 17 17 18 18 /*Constructor, copy, clean up and destructor*/ 19 AmrBamg::AmrBamg(IssmDouble hmin,IssmDouble hmax,int fieldenum_in,IssmDouble err_in,int keepmetric_in,IssmDouble gradation_in, 20 IssmDouble groundingline_resolution_in,IssmDouble groundingline_distance_in, 21 IssmDouble icefront_resolution_in,IssmDouble icefront_distance_in, 22 IssmDouble thicknesserror_resolution_in,IssmDouble thicknesserror_threshold_in, 23 IssmDouble deviatoricerror_resolution_in,IssmDouble deviatoricerror_threshold_in){/*{{{*/ 19 AmrBamg::AmrBamg(){/*{{{*/ 24 20 25 this->fieldenum = fieldenum_in; 26 this->keepmetric = keepmetric_in; 27 this->groundingline_resolution = groundingline_resolution_in; 28 this->groundingline_distance = groundingline_distance_in; 29 this->icefront_resolution = icefront_resolution_in; 30 this->icefront_distance = icefront_distance_in; 31 this->thicknesserror_resolution = thicknesserror_resolution_in; 32 this->thicknesserror_threshold = thicknesserror_threshold_in; 33 this->deviatoricerror_resolution = deviatoricerror_resolution_in; 34 this->deviatoricerror_threshold = deviatoricerror_threshold_in; 21 /*These attributes MUST be setup by FemModel*/ 22 this->fieldenum = -1;//fieldenum_in; 23 this->keepmetric = -1;//keepmetric_in; 24 this->groundingline_resolution = -1;//groundingline_resolution_in; 25 this->groundingline_distance = -1;//groundingline_distance_in; 26 this->icefront_resolution = -1;//icefront_resolution_in; 27 this->icefront_distance = -1;//icefront_distance_in; 28 this->thicknesserror_resolution = -1;//thicknesserror_resolution_in; 29 this->thicknesserror_threshold = -1;//thicknesserror_threshold_in; 30 this->thicknesserror_maximum = -1; 31 this->deviatoricerror_resolution = -1;//deviatoricerror_resolution_in; 32 this->deviatoricerror_threshold = -1;//deviatoricerror_threshold_in; 33 this->deviatoricerror_maximum = -1; 34 35 /*Geometry and mesh as NULL*/ 35 36 this->geometry = NULL; 36 37 this->fathermesh = NULL; … … 43 44 this->options->coeff = 1; 44 45 this->options->errg = 0.1; 45 this->options->gradation = gradation_in;46 this->options->gradation = -1; //MUST be setup by the FemModel 46 47 this->options->Hessiantype = 0; 47 48 this->options->maxnbv = 1e6; … … 54 55 this->options->verbose = 0; 55 56 this->options->Crack = 0; 56 this->options->KeepVertices = 1; /*!!!!! VERY IMPORTANT !!!!! */57 this->options->KeepVertices = 1; /*!!!!! VERY IMPORTANT !!!!! This avoid numerical errors when remeshing*/ 57 58 this->options->splitcorners = 1; 58 this->options->hmin = hmin; 59 this->options->hmax = hmax; 60 61 this->options->err=xNew<IssmDouble>(1); 62 this->options->errSize[0]=1; 63 this->options->errSize[1]=1; 64 this->options->err[0] = err_in; 59 this->options->hmin = -1;/*MUST be setup by the FemModel*/ 60 this->options->hmax = -1;/*MUST be setup by the FemModel*/ 61 this->options->err = xNew<IssmDouble>(1); 62 this->options->err[0] = -1;/*MUST be setup by the FemModel*/ 63 this->options->errSize[0] = 1; 64 this->options->errSize[1] = 1; 65 65 } 66 66 /*}}}*/ … … 174 174 *pelementslist = elementslist; 175 175 }/*}}}*/ 176 void AmrBamg::SetBamgOpts(IssmDouble hmin_in,IssmDouble hmax_in,IssmDouble err_in,IssmDouble gradation_in){/*{{{*/ 177 178 if(!this->options) _error_("AmrBamg->options is NULL!"); 179 180 this->options->hmin = hmin_in; 181 this->options->hmax = hmax_in; 182 this->options->err[0] = err_in; 183 this->options->gradation= gradation_in; 184 }/*}}}*/ -
issm/trunk-jpl/src/c/classes/AmrBamg.h
r21930 r22241 21 21 IssmDouble thicknesserror_resolution; 22 22 IssmDouble thicknesserror_threshold; 23 IssmDouble thicknesserror_maximum; 23 24 IssmDouble deviatoricerror_resolution; 24 25 IssmDouble deviatoricerror_threshold; 26 IssmDouble deviatoricerror_maximum; 25 27 26 28 /* Constructor, destructor etc*/ 27 AmrBamg(IssmDouble hmin,IssmDouble hmax,int fieldenum_in,IssmDouble err_in,int keepmetric_in,IssmDouble gradation_in, 28 IssmDouble groundingline_resolution_in,IssmDouble groundingline_distance_in, 29 IssmDouble icefront_resolution_in,IssmDouble icefront_distance_in, 30 IssmDouble thicknesserror_resolution_in,IssmDouble thicknesserror_threshold_in, 31 IssmDouble deviatoricerror_resolution_in,IssmDouble deviatoricerror_threshold_in); 29 AmrBamg(); 30 32 31 ~AmrBamg(); 33 32 … … 35 34 void Initialize(int* elements,IssmDouble* x,IssmDouble* y,int numberofvertices,int numberofelements); 36 35 void ExecuteRefinementBamg(IssmDouble* field,IssmDouble* hmaxVertices,int* pnewnumberofvertices,int *pnewnumberofelements,IssmDouble** px,IssmDouble** py,IssmDouble** pz,int** pelementslist); 36 void SetBamgOpts(IssmDouble hmin_in,IssmDouble hmax_in,IssmDouble err_in,IssmDouble gradation_in); 37 37 38 38 private: -
issm/trunk-jpl/src/c/classes/FemModel.cpp
r22192 r22241 2648 2648 YC_new[i]+=Ynew[vid]; 2649 2649 } 2650 XC_new[i]=XC_new[i]/3 ;2651 YC_new[i]=YC_new[i]/3 ;2650 XC_new[i]=XC_new[i]/3.; 2651 YC_new[i]=YC_new[i]/3.; 2652 2652 } 2653 2653 … … 3029 3029 elementslist[elementswidth*i+0] = reCast<int>(id1[i])+1; //InterpMesh wants Matlab indexing 3030 3030 elementslist[elementswidth*i+1] = reCast<int>(id2[i])+1; //InterpMesh wants Matlab indexing 3031 elementslist[elementswidth*i+2] = reCast<int>(id3[i])+1; //InterpMesh wants Matlab indexin f3031 elementslist[elementswidth*i+2] = reCast<int>(id3[i])+1; //InterpMesh wants Matlab indexing 3032 3032 } 3033 3033 … … 3608 3608 Vector<IssmDouble>* vxc = new Vector<IssmDouble>(numberofelements); 3609 3609 Vector<IssmDouble>* vyc = new Vector<IssmDouble>(numberofelements); 3610 IssmDouble *x = NULL; 3611 IssmDouble *y = NULL; 3612 IssmDouble *z = NULL; 3613 3614 /*Get vertices coordinates*/ 3615 VertexCoordinatesx(&x,&y,&z,this->vertices,false) ; 3610 IssmDouble* x = NULL; 3611 IssmDouble* y = NULL; 3612 IssmDouble* z = NULL; 3613 IssmDouble* xyz_list = NULL; 3614 IssmDouble x1,y1,x2,y2,x3,y3; 3616 3615 3617 3616 /*Insert the element center coordinates*/ 3618 3617 for(int i=0;i<this->elements->Size();i++){ 3619 3618 Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i)); 3620 element->GetVerticesSidList(elem_vertices);3619 //element->GetVerticesSidList(elem_vertices); 3621 3620 int sid = element->Sid(); 3622 vxc->SetValue(sid,(x[elem_vertices[0]]+x[elem_vertices[1]]+x[elem_vertices[2]])/3.,INS_VAL); 3623 vyc->SetValue(sid,(y[elem_vertices[0]]+y[elem_vertices[1]]+y[elem_vertices[2]])/3.,INS_VAL); 3621 element->GetVerticesCoordinates(&xyz_list); 3622 x1 = xyz_list[3*0+0];y1 = xyz_list[3*0+1]; 3623 x2 = xyz_list[3*1+0];y2 = xyz_list[3*1+1]; 3624 x3 = xyz_list[3*2+0];y3 = xyz_list[3*2+1]; 3625 vxc->SetValue(sid,(x1+x2+x3)/3.,INS_VAL); 3626 vyc->SetValue(sid,(y1+y2+y3)/3.,INS_VAL); 3624 3627 } 3625 3628 … … 3636 3639 xDelete<IssmDouble>(y); 3637 3640 xDelete<IssmDouble>(z); 3641 xDelete<IssmDouble>(xyz_list); 3638 3642 xDelete<int>(elem_vertices); 3639 3643 delete vxc; … … 3658 3662 int* elem_vertices = xNew<int>(elementswidth); 3659 3663 IssmDouble* levelset = xNew<IssmDouble>(elementswidth); 3660 IssmDouble* x = NULL; 3661 IssmDouble* y = NULL; 3662 IssmDouble* z = NULL; 3664 IssmDouble* xyz_list = NULL; 3663 3665 Vector<IssmDouble>* vx_zerolevelset = new Vector<IssmDouble>(numberofelements); 3664 3666 Vector<IssmDouble>* vy_zerolevelset = new Vector<IssmDouble>(numberofelements); … … 3666 3668 IssmDouble* y_zerolevelset = NULL; 3667 3669 int count,sid; 3668 IssmDouble xcenter,ycenter; 3669 3670 /*Get vertices coordinates*/ 3671 VertexCoordinatesx(&x,&y,&z,this->vertices,false) ; 3670 IssmDouble xc,yc,x1,y1,x2,y2,x3,y3; 3672 3671 3673 3672 /*Use the element center coordinate if level set is zero (grounding line or ice front), otherwise set NAN*/ … … 3676 3675 element->GetInputListOnVertices(levelset,levelset_type); 3677 3676 element->GetVerticesSidList(elem_vertices); 3678 sid = element->Sid(); 3679 xcenter = NAN; 3680 ycenter = NAN; 3677 sid= element->Sid(); 3678 element->GetVerticesCoordinates(&xyz_list); 3679 x1 = xyz_list[3*0+0];y1 = xyz_list[3*0+1]; 3680 x2 = xyz_list[3*1+0];y2 = xyz_list[3*1+1]; 3681 x3 = xyz_list[3*2+0];y3 = xyz_list[3*2+1]; 3682 xc = NAN; 3683 yc = NAN; 3681 3684 Tria* tria = xDynamicCast<Tria*>(element); 3682 3685 if(tria->IsIceInElement()){/*verify if there is ice in the element*/ 3683 3686 if(levelset[0]*levelset[1]<0. || levelset[0]*levelset[2]<0. || 3684 3687 abs(levelset[0]*levelset[1])<DBL_EPSILON || abs(levelset[0]*levelset[2])<DBL_EPSILON) { 3685 xc enter=(x[elem_vertices[0]]+x[elem_vertices[1]]+x[elem_vertices[2]])/3.;3686 yc enter=(y[elem_vertices[0]]+y[elem_vertices[1]]+y[elem_vertices[2]])/3.;3688 xc=(x1+x2+x3)/3.; 3689 yc=(y1+y2+y3)/3.; 3687 3690 } 3688 3691 } 3689 vx_zerolevelset->SetValue(sid,xcenter,INS_VAL); 3690 vy_zerolevelset->SetValue(sid,ycenter,INS_VAL); 3692 vx_zerolevelset->SetValue(sid,xc,INS_VAL); 3693 vy_zerolevelset->SetValue(sid,yc,INS_VAL); 3694 xDelete<IssmDouble>(xyz_list); 3691 3695 } 3692 3696 /*Assemble and serialize*/ … … 3720 3724 xDelete<IssmDouble>(x_zerolevelset); 3721 3725 xDelete<IssmDouble>(y_zerolevelset); 3722 xDelete<IssmDouble>(x); 3723 xDelete<IssmDouble>(y); 3724 xDelete<IssmDouble>(z); 3726 xDelete<IssmDouble>(xyz_list); 3725 3727 delete vx_zerolevelset; 3726 3728 delete vy_zerolevelset; … … 4474 4476 if(this->amrbamg->deviatoricerror_threshold>0) this->GethmaxVerticesFromEstimators(hmaxvertices_serial,DeviatoricStressErrorEstimatorEnum); 4475 4477 } 4476 4478 4477 4479 if(my_rank==0){ 4478 4480 this->amrbamg->ExecuteRefinementBamg(vector_serial,hmaxvertices_serial,&newnumberofvertices,&newnumberofelements,&newx,&newy,&newz,&newelementslist); … … 4518 4520 int* elements = NULL; 4519 4521 IssmDouble hmin,hmax,err,gradation; 4520 IssmDouble groundingline_resolution,groundingline_distance,icefront_resolution,icefront_distance;4521 IssmDouble thicknesserror_resolution,thicknesserror_threshold,deviatoricerror_resolution,deviatoricerror_threshold;4522 int fieldenum,keepmetric;4523 4522 4524 4523 /*Get rank*/ … … 4531 4530 this->GetMesh(this->vertices,this->elements,&x,&y,&z,&elements); 4532 4531 4532 /*Create bamg data structures for bamg*/ 4533 this->amrbamg = new AmrBamg(); 4534 4533 4535 /*Get amr parameters*/ 4534 4536 this->parameters->FindParam(&hmin,AmrHminEnum); 4535 4537 this->parameters->FindParam(&hmax,AmrHmaxEnum); 4536 this->parameters->FindParam(&fieldenum,AmrFieldEnum);4537 4538 this->parameters->FindParam(&err,AmrErrEnum); 4538 this->parameters->FindParam(&keepmetric,AmrKeepMetricEnum);4539 4539 this->parameters->FindParam(&gradation,AmrGradationEnum); 4540 this->parameters->FindParam(&groundingline_resolution,AmrGroundingLineResolutionEnum); 4541 this->parameters->FindParam(&groundingline_distance,AmrGroundingLineDistanceEnum); 4542 this->parameters->FindParam(&icefront_resolution,AmrIceFrontResolutionEnum); 4543 this->parameters->FindParam(&icefront_distance,AmrIceFrontDistanceEnum); 4544 this->parameters->FindParam(&thicknesserror_resolution,AmrThicknessErrorResolutionEnum); 4545 this->parameters->FindParam(&thicknesserror_threshold,AmrThicknessErrorThresholdEnum); 4546 this->parameters->FindParam(&deviatoricerror_resolution,AmrDeviatoricErrorResolutionEnum); 4547 this->parameters->FindParam(&deviatoricerror_threshold,AmrDeviatoricErrorThresholdEnum); 4548 4549 /*Create bamg data structures for bamg*/ 4550 this->amrbamg = new AmrBamg(hmin,hmax,fieldenum,err,keepmetric,gradation, 4551 groundingline_resolution,groundingline_distance, 4552 icefront_resolution,icefront_distance, 4553 thicknesserror_resolution,thicknesserror_threshold, 4554 deviatoricerror_resolution,deviatoricerror_threshold); 4540 this->parameters->FindParam(&this->amrbamg->fieldenum,AmrFieldEnum); 4541 this->parameters->FindParam(&this->amrbamg->keepmetric,AmrKeepMetricEnum); 4542 this->parameters->FindParam(&this->amrbamg->groundingline_resolution,AmrGroundingLineResolutionEnum); 4543 this->parameters->FindParam(&this->amrbamg->groundingline_distance,AmrGroundingLineDistanceEnum); 4544 this->parameters->FindParam(&this->amrbamg->icefront_resolution,AmrIceFrontResolutionEnum); 4545 this->parameters->FindParam(&this->amrbamg->icefront_distance,AmrIceFrontDistanceEnum); 4546 this->parameters->FindParam(&this->amrbamg->thicknesserror_resolution,AmrThicknessErrorResolutionEnum); 4547 this->parameters->FindParam(&this->amrbamg->thicknesserror_threshold,AmrThicknessErrorThresholdEnum); 4548 this->parameters->FindParam(&this->amrbamg->thicknesserror_maximum,AmrThicknessErrorMaximumEnum); 4549 this->parameters->FindParam(&this->amrbamg->deviatoricerror_resolution,AmrDeviatoricErrorResolutionEnum); 4550 this->parameters->FindParam(&this->amrbamg->deviatoricerror_threshold,AmrDeviatoricErrorThresholdEnum); 4551 this->parameters->FindParam(&this->amrbamg->deviatoricerror_maximum,AmrDeviatoricErrorMaximumEnum); 4552 /*Set BamgOpts*/ 4553 this->amrbamg->SetBamgOpts(hmin,hmax,err,gradation); 4555 4554 4556 4555 /*Re-create original mesh and put it in bamg structure (only cpu 0)*/ … … 4608 4607 4609 4608 /*Intermediaries*/ 4610 int numberofelements = this->elements->NumberOfElements(); 4611 IssmDouble* error_elements = NULL; 4612 IssmDouble *x = NULL; 4613 IssmDouble *y = NULL; 4614 IssmDouble *z = NULL; 4615 int *index = NULL; 4616 IssmDouble maxerror,threshold,resolution; 4617 int vid; 4618 4609 int elementswidth = this->GetElementsWidth(); 4610 int numberofelements = this->elements->NumberOfElements(); 4611 int numberofvertices = this->vertices->NumberOfVertices(); 4612 IssmDouble* maxlength = xNew<IssmDouble>(numberofelements); 4613 IssmDouble* error_vertices = xNewZeroInit<IssmDouble>(numberofvertices); 4614 IssmDouble* error_elements = NULL; 4615 IssmDouble* x = NULL; 4616 IssmDouble* y = NULL; 4617 IssmDouble* z = NULL; 4618 int* index = NULL; 4619 IssmDouble maxerror,threshold,resolution,length; 4620 IssmDouble L1,L2,L3; 4621 int vid,v1,v2,v3; 4622 bool refine; 4623 4624 /*Fill variables*/ 4619 4625 switch(errorestimator_type){ 4620 4626 case ThicknessErrorEstimatorEnum: 4621 4627 threshold = this->amrbamg->thicknesserror_threshold; 4622 4628 resolution = this->amrbamg->thicknesserror_resolution; 4623 this->ThicknessZZErrorEstimator(&error_elements); 4629 maxerror = this->amrbamg->thicknesserror_maximum; 4630 this->ThicknessZZErrorEstimator(&error_elements);//error is serial, but the calculation is parallel 4624 4631 break; 4625 4632 case DeviatoricStressErrorEstimatorEnum: 4626 4633 threshold = this->amrbamg->deviatoricerror_threshold; 4627 4634 resolution = this->amrbamg->deviatoricerror_resolution; 4628 this->ZZErrorEstimator(&error_elements); 4635 maxerror = this->amrbamg->deviatoricerror_maximum; 4636 this->ZZErrorEstimator(&error_elements);//error is serial, but the calculation is parallel 4629 4637 break; 4630 4638 default: _error_("not implemented yet"); 4631 4639 } 4632 4633 4640 if(!error_elements) _error_("error_elements is NULL!\n"); 4641 4642 /*Find the max of the estimators if it was not provided*/ 4643 if(maxerror<DBL_EPSILON){ 4644 for(int i=0;i<numberofelements;i++) maxerror=max(maxerror,error_elements[i]); 4645 switch(errorestimator_type){ 4646 case ThicknessErrorEstimatorEnum: this->amrbamg->thicknesserror_maximum = maxerror;break; 4647 case DeviatoricStressErrorEstimatorEnum: this->amrbamg->deviatoricerror_maximum = maxerror;break; 4648 } 4649 } 4634 4650 4635 4651 /*Get mesh*/ 4636 4652 this->GetMesh(this->vertices,this->elements,&x,&y,&z,&index); 4637 4638 /*Find the max of the estimators (use error_elements)*/ 4639 maxerror=error_elements[0]; 4640 for(int i=0;i<numberofelements;i++) maxerror=max(maxerror,error_elements[i]); 4641 4642 /*Fill hmaxvertices*/ 4653 4654 /*Fill error_vertices (this is the sum of all elements connected to the vertex)*/ 4643 4655 for(int i=0;i<numberofelements;i++){ 4644 if(error_elements[i]>threshold*maxerror){ 4645 /*ok, fill the hmaxvertices using the element vertices*/ 4646 for(int j=0;j<this->GetElementsWidth();j++){ 4647 vid=index[i*this->GetElementsWidth()+j]-1;//Matlab to C indexing 4656 v1=index[i*elementswidth+0]-1;//Matlab to C indexing 4657 v2=index[i*elementswidth+1]-1;//Matlab to C indexing 4658 v3=index[i*elementswidth+2]-1;//Matlab to C indexing 4659 L1=sqrt(pow(x[v2]-x[v1],2)+pow(y[v2]-y[v1],2)); 4660 L2=sqrt(pow(x[v3]-x[v2],2)+pow(y[v3]-y[v2],2)); 4661 L3=sqrt(pow(x[v1]-x[v3],2)+pow(y[v1]-y[v3],2)); 4662 /*Fill the vectors*/ 4663 maxlength[i] =max(L1,max(L2,L3)); 4664 error_vertices[v1]+=error_elements[i]; 4665 error_vertices[v2]+=error_elements[i]; 4666 error_vertices[v3]+=error_elements[i]; 4667 } 4668 4669 /*Fill hmaxvertices with the criteria*/ 4670 for(int i=0;i<numberofelements;i++){ 4671 refine=false; 4672 /*Refine any element if its error > phi*maxerror*/ 4673 if(error_elements[i]>threshold*maxerror) refine=true; 4674 /*If the element size is closer to the resolution, verify the sum of error in the vertices*/ 4675 if(resolution/maxlength[i]>0.85){ 4676 for(int j=0;j<elementswidth;j++){ 4677 vid=index[i*elementswidth+j]-1;//Matlab to C indexing 4678 if(error_vertices[vid]>0.005*maxerror) refine=true;//itapopo must be better defined 4679 } 4680 } 4681 /*Now, fill the hmaxvertices if requested*/ 4682 if(refine){ 4683 for(int j=0;j<elementswidth;j++){ 4684 vid=index[i*elementswidth+j]-1;//Matlab to C indexing 4648 4685 if(xIsNan<IssmDouble>(hmaxvertices[vid])) hmaxvertices[vid]=resolution; 4649 4686 else hmaxvertices[vid]=min(resolution,hmaxvertices[vid]); … … 4658 4695 xDelete<int>(index); 4659 4696 xDelete<IssmDouble>(error_elements); 4697 xDelete<IssmDouble>(error_vertices); 4698 xDelete<IssmDouble>(maxlength); 4660 4699 } 4661 4700 /*}}}*/ … … 4714 4753 int my_rank = IssmComm::GetRank(); 4715 4754 int numberofelements = this->elements->NumberOfElements(); 4716 IssmDouble* element_label = xNewZeroInit<IssmDouble>(numberofelements); 4717 int numberofpoints = -1; 4718 IssmDouble* xylist = NULL; 4755 IssmDouble* gl_distance = NULL; 4756 IssmDouble* if_distance = NULL; 4757 IssmDouble* deviatoricerror= NULL; 4758 IssmDouble* thicknesserror = NULL; 4719 4759 IssmDouble* newx = NULL; 4720 4760 IssmDouble* newy = NULL; … … 4724 4764 int newnumberofelements = -1; 4725 4765 4726 /*Get element_label, if requested*/ 4727 if(this->amr->groundingline_distance>0) this->GetElementLabelFromZeroLevelSet(element_label,MaskGroundediceLevelsetEnum); 4728 if(this->amr->icefront_distance>0) this->GetElementLabelFromZeroLevelSet(element_label,MaskIceLevelsetEnum); 4729 if(this->amr->thicknesserror_threshold>0) this->GetElementLabelFromEstimators(element_label,ThicknessErrorEstimatorEnum); 4730 if(this->amr->deviatoricerror_threshold>0) this->GetElementLabelFromEstimators(element_label,DeviatoricStressErrorEstimatorEnum); 4731 this->GetPointsFromElementLabel(element_label,&numberofpoints,&xylist); 4732 4766 /*Get fields, if requested*/ 4767 if(this->amr->groundingline_distance>0) this->GetElementDistanceToZeroLevelSet(&gl_distance,MaskGroundediceLevelsetEnum); 4768 if(this->amr->icefront_distance>0) this->GetElementDistanceToZeroLevelSet(&if_distance,MaskIceLevelsetEnum); 4769 if(this->amr->thicknesserror_threshold>0) this->ThicknessZZErrorEstimator(&thicknesserror); 4770 if(this->amr->deviatoricerror_threshold>0) this->ZZErrorEstimator(&deviatoricerror); 4771 4733 4772 if(my_rank==0){ 4734 this->amr->ExecuteRefinement(numberofpoints,xylist,&newnumberofvertices,&newnumberofelements,&newx,&newy,&newelementslist); 4735 newz=xNewZeroInit<IssmDouble>(newnumberofvertices); 4773 this->amr->ExecuteRefinement(gl_distance,if_distance,deviatoricerror,thicknesserror, 4774 &newnumberofvertices,&newnumberofelements,&newx,&newy,&newelementslist); 4775 newz=xNewZeroInit<IssmDouble>(newnumberofvertices); 4736 4776 if(newnumberofvertices<=0 || newnumberofelements<=0) _error_("Error in the ReMeshNeopz."); 4737 4777 } … … 4760 4800 4761 4801 /*Cleanup*/ 4762 xDelete<IssmDouble>(element_label); 4763 xDelete<IssmDouble>(xylist); 4802 xDelete<IssmDouble>(deviatoricerror); 4803 xDelete<IssmDouble>(thicknesserror); 4804 xDelete<IssmDouble>(gl_distance); 4805 xDelete<IssmDouble>(if_distance); 4764 4806 } 4765 4807 /*}}}*/ … … 4805 4847 this->SetRefPatterns(); 4806 4848 this->amr = new AdaptiveMeshRefinement(); 4849 this->amr->refinement_type = 1;//1 is refpattern; 0 is uniform (faster) 4807 4850 this->amr->level_max = level_max; 4808 4851 this->amr->radius_level_max = radius_level_max; … … 4824 4867 } 4825 4868 /*}}}*/ 4826 void FemModel::GetPointsFromElementLabel(IssmDouble* element_label,int* pnumberofpoints,IssmDouble** pxylist){/*{{{*/4827 4828 if(!element_label) _error_("element_label is NULL!\n");4829 4830 /*Outputs*/4831 int numberofpoints = -1;4832 IssmDouble* xylist = NULL;4833 4834 /*Intermediaries*/4835 int numberofelements = this->elements->NumberOfElements();4836 int count = -1;4837 IssmDouble* xc = NULL;4838 IssmDouble* yc = NULL;4839 4840 /*First, find the number of labeled elements (points)*/4841 count=0;4842 for(int i=0;i<numberofelements;i++){4843 if(element_label[i]>DBL_EPSILON) count++;4844 }4845 4846 /*Set number of points*/4847 numberofpoints=count;4848 if(count>0) xylist=xNew<IssmDouble>(2*numberofpoints);4849 4850 /*Get element center coordinates*/4851 this->GetElementCenterCoordinates(&xc,&yc);4852 4853 /*Now, fill xylist data*/4854 count=0;4855 for(int i=0;i<numberofelements;i++){4856 if(element_label[i]>DBL_EPSILON){4857 xylist[2*count] = xc[i];4858 xylist[2*count+1] = yc[i];4859 count++;4860 }4861 }4862 4863 /*Assign pointers*/4864 (*pxylist)=xylist;4865 *pnumberofpoints=numberofpoints;4866 4867 /*Cleanup*/4868 xDelete<IssmDouble>(xc);4869 xDelete<IssmDouble>(yc);4870 }4871 /*}}}*/4872 void FemModel::GetElementLabelFromZeroLevelSet(IssmDouble* element_label,int levelset_type){/*{{{*/4873 4874 /*Here, "zero level set" means grounding line or ice front, depending on the level set type*/4875 /*element_label is 1 if the element zero level set, NAN otherwise*/4876 if(levelset_type!=MaskGroundediceLevelsetEnum && levelset_type!=MaskIceLevelsetEnum) _error_("level set type not implemented yet!");4877 if(!element_label) _error_("element_label is NULL!\n");4878 4879 /*Intermediaries*/4880 int elementswidth = this->GetElementsWidth();4881 int numberofelements = this->elements->NumberOfElements();4882 int* elem_vertices = xNew<int>(elementswidth);4883 IssmDouble* levelset = xNew<IssmDouble>(elementswidth);4884 Vector<IssmDouble>* velement_label = new Vector<IssmDouble>(numberofelements);4885 IssmDouble* element_label_serial = NULL;4886 int sid = -1;4887 IssmDouble label = -1.;4888 4889 /*Use the element center coordinate if level set is zero (grounding line or ice front), otherwise set NAN*/4890 for(int i=0;i<this->elements->Size();i++){4891 Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));4892 element->GetInputListOnVertices(levelset,levelset_type);4893 element->GetVerticesSidList(elem_vertices);4894 sid = element->Sid();4895 label = NAN;4896 Tria* tria = xDynamicCast<Tria*>(element);4897 if(tria->IsIceInElement()){/*verify if there is ice in the element*/4898 if(levelset[0]*levelset[1]<0. || levelset[0]*levelset[2]<0. ||4899 abs(levelset[0]*levelset[1])<DBL_EPSILON || abs(levelset[0]*levelset[2])<DBL_EPSILON) {4900 label=1.;4901 }4902 }4903 velement_label->SetValue(sid,label,INS_VAL);4904 }4905 4906 /*Assemble and serialize*/4907 velement_label->Assemble();4908 element_label_serial=velement_label->ToMPISerial();4909 4910 /*Merge with the output*/4911 for(int i=0;i<numberofelements;i++){4912 if(!xIsNan<IssmDouble>(element_label_serial[i])) element_label[i]=element_label_serial[i];4913 else; //do nothing4914 }4915 4916 /*Cleanup*/4917 xDelete<int>(elem_vertices);4918 xDelete<IssmDouble>(levelset);4919 xDelete<IssmDouble>(element_label_serial);4920 delete velement_label;4921 }4922 /*}}}*/4923 void FemModel::GetElementLabelFromEstimators(IssmDouble* element_label,int estimator_type){/*{{{*/4924 4925 /*element_label is 1 if the element zero level set, NAN otherwise*/4926 if(!element_label) _error_("element_label is NULL!\n");4927 4928 /*Intermediaries*/4929 int numberofelements = this->elements->NumberOfElements();4930 IssmDouble* elementerror = NULL;4931 IssmDouble threshold = -1.;4932 IssmDouble maxerror = -1.;4933 4934 switch(estimator_type){4935 case ThicknessErrorEstimatorEnum:4936 threshold=this->amr->thicknesserror_threshold;4937 this->ThicknessZZErrorEstimator(&elementerror);4938 break;4939 case DeviatoricStressErrorEstimatorEnum:4940 threshold=this->amr->deviatoricerror_threshold;4941 this->ZZErrorEstimator(&elementerror);4942 break;4943 default: _error_("not implemented yet");4944 }4945 4946 /*Find the max of the estimators*/4947 maxerror=elementerror[0];4948 for(int i=0;i<numberofelements;i++) maxerror=max(maxerror,elementerror[i]);4949 4950 /*Merge with the output*/4951 for(int i=0;i<numberofelements;i++){4952 if(elementerror[i]>threshold*maxerror) element_label[i]=1.;4953 else; //do nothing4954 }4955 4956 /*Cleanup*/4957 xDelete<IssmDouble>(elementerror);4958 }4959 /*}}}*/4960 4869 void FemModel::GetElementDistanceToZeroLevelSet(IssmDouble** pelementdistance,int levelset_type){/*{{{*/ 4961 4870 … … 4970 4879 4971 4880 /*Intermediaries*/ 4972 int numberofelements = this->elements->NumberOfElements(); 4973 IssmDouble* levelset_points= NULL; 4974 IssmDouble* xc = NULL; 4975 IssmDouble* yc = NULL; 4881 int numberofelements = this->elements->NumberOfElements(); 4882 Vector<IssmDouble>* velementdistance = new Vector<IssmDouble>(numberofelements); 4883 IssmDouble* levelset_points = NULL; 4884 IssmDouble* xyz_list = NULL; 4885 IssmDouble mindistance,distance; 4886 IssmDouble xc,yc,x1,y1,x2,y2,x3,y3; 4976 4887 int numberofpoints; 4977 IssmDouble distance; 4978 4979 /*Get element center coordinates*/ 4980 this->GetElementCenterCoordinates(&xc,&yc); 4981 4982 /*Get points which level set is zero (center of elements with zero level set)*/ 4888 4889 /*Get points which level set is zero (center of elements with zero level set, levelset_points is serial)*/ 4983 4890 this->GetZeroLevelSetPoints(&levelset_points,numberofpoints,levelset_type); 4984 4891 4985 /*Find the minimal element distance to the zero levelset (grounding line or ice front)*/ 4986 elementdistance=xNew<IssmDouble>(numberofelements); 4987 for(int i=0;i<numberofelements;i++){ 4988 elementdistance[i]=INFINITY; 4892 for(int i=0;i<this->elements->Size();i++){//parallel 4893 Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i)); 4894 int sid = element->Sid(); 4895 element->GetVerticesCoordinates(&xyz_list); 4896 x1 = xyz_list[3*0+0];y1 = xyz_list[3*0+1]; 4897 x2 = xyz_list[3*1+0];y2 = xyz_list[3*1+1]; 4898 x3 = xyz_list[3*2+0];y3 = xyz_list[3*2+1]; 4899 xc = (x1+x2+x3)/3.; 4900 yc = (y1+y2+y3)/3.; 4901 mindistance=INFINITY; 4902 /*Loop over each point (where level set is zero)*/ 4989 4903 for(int j=0;j<numberofpoints;j++){ 4990 distance=sqrt((xc[i]-levelset_points[2*j])*(xc[i]-levelset_points[2*j])+(yc[i]-levelset_points[2*j+1])*(yc[i]-levelset_points[2*j+1])); 4991 elementdistance[i]=min(distance,elementdistance[i]); 4992 } 4904 distance =sqrt((xc-levelset_points[2*j])*(xc-levelset_points[2*j])+(yc-levelset_points[2*j+1])*(yc-levelset_points[2*j+1])); 4905 mindistance=min(distance,mindistance); 4906 } 4907 velementdistance->SetValue(sid,mindistance,INS_VAL); 4908 xDelete<IssmDouble>(xyz_list); 4993 4909 } 4994 4910 4911 /*Assemble*/ 4912 velementdistance->Assemble(); 4913 4995 4914 /*Assign the pointer*/ 4996 (*pelementdistance)= elementdistance;4915 (*pelementdistance)=velementdistance->ToMPISerial(); 4997 4916 4998 4917 /*Cleanup*/ 4999 4918 xDelete<IssmDouble>(levelset_points); 5000 xDelete<IssmDouble>(x c);5001 xDelete<IssmDouble>(yc);4919 xDelete<IssmDouble>(xyz_list); 4920 delete velementdistance; 5002 4921 } 5003 4922 /*}}}*/ -
issm/trunk-jpl/src/c/classes/FemModel.h
r22192 r22241 193 193 void ReMeshNeopz(int* pnewnumberofvertices,int* pnewnumberofelements,IssmDouble** pnewx,IssmDouble** pnewy,IssmDouble** pnewz,int** pnewelementslist); 194 194 void InitializeAdaptiveRefinementNeopz(void); 195 void GetPointsFromElementLabel(IssmDouble* element_label,int* numberofpoints,IssmDouble** xylist);196 void GetElementLabelFromZeroLevelSet(IssmDouble* element_label,int levelset_type);197 void GetElementLabelFromEstimators(IssmDouble* element_label,int estimator_type);198 195 void GetElementDistanceToZeroLevelSet(IssmDouble** pelementdistance,int levelset_type); 199 196 void SetRefPatterns(void); -
issm/trunk-jpl/src/c/cores/transient_core.cpp
r21978 r22241 26 26 int output_frequency; 27 27 int recording_frequency; 28 int domaintype,groundingline_migration,smb_model,amr_frequency ;28 int domaintype,groundingline_migration,smb_model,amr_frequency,amr_restart; 29 29 int numoutputs; 30 30 Analysis *analysis = NULL; … … 65 65 if(numoutputs) femmodel->parameters->FindParam(&requested_outputs,&numoutputs,TransientRequestedOutputsEnum); 66 66 67 #ifdef _HAVE_NEOPZ_ 68 bool ismismip = false;//itapopo testing restart 69 if(ismismip) femmodel->ReMesh(); 67 #ifdef _HAVE_BAMG_ //#ifdef _HAVE_NEOPZ_ itapopo 68 if(amr_frequency){ 69 femmodel->parameters->FindParam(&amr_restart,AmrRestartEnum); 70 if(amr_restart) femmodel->ReMesh(); 71 } 70 72 #endif 71 73 -
issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
r22136 r22241 136 136 parameters->AddObject(iomodel->CopyConstantObject("md.amr.icefront_distance",AmrIceFrontDistanceEnum)); 137 137 parameters->AddObject(iomodel->CopyConstantObject("md.amr.thicknesserror_threshold",AmrThicknessErrorThresholdEnum)); 138 parameters->AddObject(iomodel->CopyConstantObject("md.amr.thicknesserror_maximum",AmrThicknessErrorMaximumEnum)); 138 139 parameters->AddObject(iomodel->CopyConstantObject("md.amr.deviatoricerror_threshold",AmrDeviatoricErrorThresholdEnum)); 140 parameters->AddObject(iomodel->CopyConstantObject("md.amr.deviatoricerror_maximum",AmrDeviatoricErrorMaximumEnum)); 141 parameters->AddObject(iomodel->CopyConstantObject("md.amr.restart",AmrRestartEnum)); 139 142 break; 140 143 #endif … … 153 156 parameters->AddObject(iomodel->CopyConstantObject("md.amr.thicknesserror_resolution",AmrThicknessErrorResolutionEnum)); 154 157 parameters->AddObject(iomodel->CopyConstantObject("md.amr.thicknesserror_threshold",AmrThicknessErrorThresholdEnum)); 158 parameters->AddObject(iomodel->CopyConstantObject("md.amr.thicknesserror_maximum",AmrThicknessErrorMaximumEnum)); 155 159 parameters->AddObject(iomodel->CopyConstantObject("md.amr.deviatoricerror_resolution",AmrDeviatoricErrorResolutionEnum)); 156 160 parameters->AddObject(iomodel->CopyConstantObject("md.amr.deviatoricerror_threshold",AmrDeviatoricErrorThresholdEnum)); 161 parameters->AddObject(iomodel->CopyConstantObject("md.amr.deviatoricerror_maximum",AmrDeviatoricErrorMaximumEnum)); 162 parameters->AddObject(iomodel->CopyConstantObject("md.amr.restart",AmrRestartEnum)); 157 163 /*Convert fieldname to enum and put it in params*/ 158 164 iomodel->FindConstant(&fieldname,"md.amr.fieldname"); -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r22200 r22241 870 870 TransientAmrFrequencyEnum, 871 871 AmrTypeEnum, 872 AmrRestartEnum, 872 873 AmrNeopzEnum, 873 874 AmrLevelMaxEnum, … … 887 888 AmrThicknessErrorResolutionEnum, 888 889 AmrThicknessErrorThresholdEnum, 890 AmrThicknessErrorMaximumEnum, 889 891 AmrDeviatoricErrorResolutionEnum, 890 892 AmrDeviatoricErrorThresholdEnum, 893 AmrDeviatoricErrorMaximumEnum, 891 894 DeviatoricStressErrorEstimatorEnum, 892 895 ThicknessErrorEstimatorEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r22200 r22241 843 843 case TransientAmrFrequencyEnum : return "TransientAmrFrequency"; 844 844 case AmrTypeEnum : return "AmrType"; 845 case AmrRestartEnum : return "AmrRestart"; 845 846 case AmrNeopzEnum : return "AmrNeopz"; 846 847 case AmrLevelMaxEnum : return "AmrLevelMax"; … … 860 861 case AmrThicknessErrorResolutionEnum : return "AmrThicknessErrorResolution"; 861 862 case AmrThicknessErrorThresholdEnum : return "AmrThicknessErrorThreshold"; 863 case AmrThicknessErrorMaximumEnum : return "AmrThicknessErrorMaximum"; 862 864 case AmrDeviatoricErrorResolutionEnum : return "AmrDeviatoricErrorResolution"; 863 865 case AmrDeviatoricErrorThresholdEnum : return "AmrDeviatoricErrorThreshold"; 866 case AmrDeviatoricErrorMaximumEnum : return "AmrDeviatoricErrorMaximum"; 864 867 case DeviatoricStressErrorEstimatorEnum : return "DeviatoricStressErrorEstimator"; 865 868 case ThicknessErrorEstimatorEnum : return "ThicknessErrorEstimator"; -
issm/trunk-jpl/src/m/classes/amr.js
r22100 r22241 19 19 this.thicknesserror_resolution = 500; 20 20 this.thicknesserror_threshold = 0; 21 this.thicknesserror_maximum = 0; 21 22 this.deviatoricerror_resolution = 500; 22 23 this.deviatoricerror_threshold = 0; 24 this.deviatoricerror_maximum = 0; 23 25 }// }}} 24 26 this.disp= function(){// {{{ … … 35 37 fielddisplay(this,'thicknesserror_resolution','element length when thickness error estimator is used'); 36 38 fielddisplay(this,'thicknesserror_threshold','maximum threshold thickness error permitted'); 39 fielddisplay(this,'thicknesserror_maximum','maximum thickness error permitted'); 37 40 fielddisplay(this,'deviatoricerror_resolution','element length when deviatoric stress error estimator is used'); 38 41 fielddisplay(this,'deviatoricerror_threshold','maximum threshold deviatoricstress error permitted'); 42 fielddisplay(this,'deviatoricerror_maximum','maximum deviatoricstress error permitted'); 39 43 }// }}} 40 44 this.classname= function(){// {{{ … … 53 57 checkfield(md,'fieldname','amr.thicknesserror_resolution','numel',[1],'>',0,'<',this.hmax,'NaN',1); 54 58 checkfield(md,'fieldname','amr.thicknesserror_threshold','numel',[1],'>=',0,'<=',1,'NaN',1); 59 checkfield(md,'fieldname','amr.thicknesserror_maximum','numel',[1],'>=',0,'NaN',1,'Inf',1); 55 60 checkfield(md,'fieldname','amr.deviatoricerror_resolution','numel',[1],'>',0,'<',this.hmax,'NaN',1); 56 61 checkfield(md,'fieldname','amr.deviatoricerror_threshold','numel',[1],'>=',0,'<=',1,'NaN',1); 62 checkfield(md,'fieldname','amr.deviatoricerror_maximum','numel',[1],'>=',0,'NaN',1,'Inf',1); 57 63 } // }}} 58 64 this.marshall=function(md,prefix,fid) { //{{{ … … 70 76 WriteData(fid,prefix,'object',this,'fieldname','thicknesserror_resolution','format','Double'); 71 77 WriteData(fid,prefix,'object',this,'fieldname','thicknesserror_threshold','format','Double'); 78 WriteData(fid,prefix,'object',this,'fieldname','thicknesserror_maximum','format','Double'); 72 79 WriteData(fid,prefix,'object',this,'fieldname','deviatoricerror_resolution','format','Double'); 73 80 WriteData(fid,prefix,'object',this,'fieldname','deviatoricerror_threshold','format','Double'); 81 WriteData(fid,prefix,'object',this,'fieldname','deviatoricerror_maximum','format','Double'); 74 82 }//}}} 75 83 this.fix=function() { //{{{ … … 89 97 this.thicknesserror_resolution = 0.; 90 98 this.thicknesserror_threshold = 0.; 99 this.thicknesserror_maximum = 0.; 91 100 this.deviatoricerror_resolution = 0.; 92 101 this.deviatoricerror_threshold = 0.; 102 this.deviatoricerror_maximum = 0.; 93 103 94 104 this.setdefaultparameters(); -
issm/trunk-jpl/src/m/classes/amr.m
r22100 r22241 18 18 thicknesserror_resolution = 0.; 19 19 thicknesserror_threshold = 0.; 20 thicknesserror_maximum = 0.; 20 21 deviatoricerror_resolution = 0.; 21 22 deviatoricerror_threshold = 0.; 23 deviatoricerror_maximum = 0.; 24 restart=0.; 22 25 end 23 26 methods (Static) … … 86 89 self.thicknesserror_resolution=500.; 87 90 self.thicknesserror_threshold=0.; 91 self.thicknesserror_maximum=0.; 88 92 self.deviatoricerror_resolution=500.; 89 93 self.deviatoricerror_threshold=0.; 94 self.deviatoricerror_maximum=0.; 95 96 %is restart? This calls femmodel->ReMesh() before first time step. 97 self.restart=0; 90 98 91 99 end % }}} … … 103 111 md = checkfield(md,'fieldname','amr.thicknesserror_resolution','numel',[1],'>',0,'<',self.hmax,'NaN',1); 104 112 md = checkfield(md,'fieldname','amr.thicknesserror_threshold','numel',[1],'>=',0,'<=',1,'NaN',1); 113 md = checkfield(md,'fieldname','amr.thicknesserror_maximum','numel',[1],'>=',0,'NaN',1,'Inf',1); 105 114 md = checkfield(md,'fieldname','amr.deviatoricerror_resolution','numel',[1],'>',0,'<',self.hmax,'NaN',1); 106 115 md = checkfield(md,'fieldname','amr.deviatoricerror_threshold','numel',[1],'>=',0,'<=',1,'NaN',1); 116 md = checkfield(md,'fieldname','amr.deviatoricerror_maximum','numel',[1],'>=',0,'NaN',1,'Inf',1); 117 md = checkfield(md,'fieldname','amr.restart','numel',[1],'>=',0,'<=',1,'NaN',1); 107 118 end % }}} 108 119 function disp(self) % {{{ … … 120 131 fielddisplay(self,'thicknesserror_resolution',['element length when thickness error estimator is used']); 121 132 fielddisplay(self,'thicknesserror_threshold',['maximum threshold thickness error permitted']); 133 fielddisplay(self,'thicknesserror_maximum',['maximum thickness error permitted']); 122 134 fielddisplay(self,'deviatoricerror_resolution',['element length when deviatoric stress error estimator is used']); 123 135 fielddisplay(self,'deviatoricerror_threshold',['maximum threshold deviatoricstress error permitted']); 124 136 fielddisplay(self,'deviatoricerror_maximum',['maximum deviatoricstress error permitted']); 137 fielddisplay(self,'restart',['indicates if ReMesh() will call before first time step']); 125 138 end % }}} 126 139 function marshall(self,prefix,md,fid) % {{{ … … 139 152 WriteData(fid,prefix,'object',self,'class','amr','fieldname','thicknesserror_resolution','format','Double'); 140 153 WriteData(fid,prefix,'object',self,'class','amr','fieldname','thicknesserror_threshold','format','Double'); 154 WriteData(fid,prefix,'object',self,'class','amr','fieldname','thicknesserror_maximum','format','Double'); 141 155 WriteData(fid,prefix,'object',self,'class','amr','fieldname','deviatoricerror_resolution','format','Double'); 142 156 WriteData(fid,prefix,'object',self,'class','amr','fieldname','deviatoricerror_threshold','format','Double'); 157 WriteData(fid,prefix,'object',self,'class','amr','fieldname','deviatoricerror_maximum','format','Double'); 158 WriteData(fid,prefix,'object',self,'class','amr','fieldname','restart','format','Integer'); 143 159 144 160 end % }}} -
issm/trunk-jpl/src/m/classes/amr.py
r22100 r22241 24 24 self.thicknesserror_resolution = 0. 25 25 self.thicknesserror_threshold = 0. 26 self.thicknesserror_maximum = 0. 26 27 self.deviatoricerror_resolution= 0. 27 28 self.deviatoricerror_threshold = 0. 29 self.deviatoricerror_maximum = 0. 28 30 #set defaults 29 31 self.setdefaultparameters() … … 42 44 string="%s\n%s"%(string,fielddisplay(self,"thicknesserror_resolution","element length when thickness error estimator is used")) 43 45 string="%s\n%s"%(string,fielddisplay(self,"thicknesserror_threshold","maximum threshold thickness error permitted")) 46 string="%s\n%s"%(string,fielddisplay(self,"thicknesserror_maximum","maximum thickness error permitted")) 44 47 string="%s\n%s"%(string,fielddisplay(self,"deviatoricerror_resolution","element length when deviatoric stress error estimator is used")) 45 48 string="%s\n%s"%(string,fielddisplay(self,"deviatoricerror_threshold","maximum threshold deviatoricstress error permitted")) 49 string="%s\n%s"%(string,fielddisplay(self,"deviatoricerror_maximum","maximum deviatoricstress error permitted")) 46 50 return string 47 51 #}}} … … 59 63 self.thicknesserror_resolution = 500. 60 64 self.thicknesserror_threshold = 0 65 self.thicknesserror_maximum = 0 61 66 self.deviatoricerror_resolution= 500. 62 67 self.deviatoricerror_threshold = 0 68 self.deviatoricerror_maximum = 0 63 69 return self 64 70 #}}} … … 74 80 md = checkfield(md,'fieldname','amr.thicknesserror_resolution','numel',[1],'>',0,'<',self.hmax,'NaN',1); 75 81 md = checkfield(md,'fieldname','amr.thicknesserror_threshold','numel',[1],'>=',0,'<=',1,'NaN',1); 82 md = checkfield(md,'fieldname','amr.thicknesserror_maximum','numel',[1],'>=',0,'NaN',1,'Inf',1); 76 83 md = checkfield(md,'fieldname','amr.deviatoricerror_resolution','numel',[1],'>',0,'<',self.hmax,'NaN',1); 77 84 md = checkfield(md,'fieldname','amr.deviatoricerror_threshold','numel',[1],'>=',0,'<=',1,'NaN',1); 85 md = checkfield(md,'fieldname','amr.deviatoricerror_maximum','numel',[1],'>=',0,'NaN',1,'Inf',1); 78 86 return md 79 87 # }}} … … 92 100 WriteData(fid,prefix,'object',self,'fieldname','thicknesserror_resolution','format','Double'); 93 101 WriteData(fid,prefix,'object',self,'fieldname','thicknesserror_threshold','format','Double'); 102 WriteData(fid,prefix,'object',self,'fieldname','thicknesserror_maximum','format','Double'); 94 103 WriteData(fid,prefix,'object',self,'fieldname','deviatoricerror_resolution','format','Double'); 95 104 WriteData(fid,prefix,'object',self,'fieldname','deviatoricerror_threshold','format','Double'); 105 WriteData(fid,prefix,'object',self,'fieldname','deviatoricerror_maximum','format','Double'); 96 106 # }}} -
issm/trunk-jpl/src/m/contrib/tsantos/AMRexportVTK.m
r21806 r22241 60 60 61 61 timestep=step; 62 63 points=[model.results.TransientSolution(step).MeshX model.results.TransientSolution(step).MeshY zeros(size(model.results.TransientSolution(step).MeshX))]; 62 if(isfield(model.results.TransientSolution,'MeshElements')) 63 index = model.results.TransientSolution(step).MeshElements; 64 x = model.results.TransientSolution(step).MeshX; 65 y = model.results.TransientSolution(step).MeshY; 66 else 67 index = model.mesh.elements; 68 x = model.mesh.x; 69 y = model.mesh.y; 70 end 71 72 points=[x y zeros(size(x))]; 64 73 [num_of_points,dim]=size(points); 65 [num_of_elt]=size( model.results.TransientSolution(step).MeshElements,1);74 [num_of_elt]=size(index,1); 66 75 67 76 fid = fopen(strcat(path,filesep,name,filesep,'timestep.vtk',int2str(timestep),'.vtk'),'w+'); … … 86 95 end 87 96 s=cell2mat(horzcat(s,{'\n'})); 88 fprintf(fid,s,[(point_per_elt)*ones(num_of_elt,1) model.results.TransientSolution(step).MeshElements-1]');97 fprintf(fid,s,[(point_per_elt)*ones(num_of_elt,1) index-1]'); 89 98 90 99 fprintf(fid,'CELL_TYPES %d\n',num_of_elt); -
issm/trunk-jpl/src/m/contrib/tsantos/mismip/gl_position.m
r21707 r22241 3 3 %initialization of some variables 4 4 data = md.results.TransientSolution(step).MaskGroundediceLevelset; 5 index = md.results.TransientSolution(step).MeshElements; 6 x = md.results.TransientSolution(step).MeshX; 7 y = md.results.TransientSolution(step).MeshY; 5 if(isfield(md.results.TransientSolution,'MeshElements')) 6 index = md.results.TransientSolution(step).MeshElements; 7 x = md.results.TransientSolution(step).MeshX; 8 y = md.results.TransientSolution(step).MeshY; 9 else 10 index = md.mesh.elements; 11 x = md.mesh.x; 12 y = md.mesh.y; 13 end 8 14 numberofelements = size(index,1); 9 15 elementslist = 1:numberofelements; -
issm/trunk-jpl/src/m/contrib/tsantos/mismip/ice_evolution.m
r21707 r22241 2 2 %iv: ice volume 3 3 %ivaf: ice volume above floatation 4 %GL y40 : grounding line position @ y=40km4 %GL_y : grounding line position @ y (y comes in m) 5 5 %nelem : number of elements 6 % usage: 7 % 8 % Default: y=40km, i0=1 9 % [ga iv ivaf GL_y nelem t] = ice_evolution(md); 10 % 11 % Default: y=40km 12 % [ga iv ivaf GL_y nelem t] = ice_evolution(md,i0); 13 % 14 % Use this for y the borders (y=0 or y=ymax) 15 % [ga iv ivaf GL_y nelem t] = ice_evolution(md,i0,y); 16 % 17 % 6 18 7 function [ga iv ivaf GL y40 nelem t] = ice_evolution(md),19 function [ga iv ivaf GL_y nelem t] = ice_evolution(varargin), 8 20 9 21 ga = []; 10 22 iv = []; 11 23 ivaf = []; 12 GL y40= [];24 GL_y = []; 13 25 nelem = []; 14 26 t = []; 27 28 if(nargin==0) 29 error('it is necessary the model!') 30 elseif(nargin==1) 31 % Defoult is y=40km 32 i0 = 1; 33 y0 = 35000; 34 y1 = 45000; 35 dy = 100; 36 y = 40000; 37 elseif(nargin==2) 38 i0=varargin{2}; 39 % Defoult is y=40km 40 y0 = 35000; 41 y1 = 45000; 42 dy = 100; 43 y = 40000; 44 elseif(nargin==3) 45 i0 = varargin{2}; 46 y = varargin{3}; 47 dy = 10; 48 y0 = y-dy; 49 y1 = y+dy; 50 else 51 error('number of inputs is more than 3'); 52 end 53 %set the model 54 md =varargin{1}; 15 55 nsteps = length(md.results.TransientSolution); 16 56 17 for i=1:nsteps, 57 58 for i=i0:nsteps, 18 59 ga(i) = md.results.TransientSolution(i).GroundedArea; 19 60 iv(i) = md.results.TransientSolution(i).IceVolume; 20 61 ivaf(i) = md.results.TransientSolution(i).IceVolumeAboveFloatation; 21 nelem(i) = size(md.results.TransientSolution(i).MeshElements,1); 62 if(isfield(md.results.TransientSolution,'MeshElements')) 63 nelem(i) = size(md.results.TransientSolution(i).MeshElements,1); 64 else 65 nelem(i) = md.mesh.numberofelements; 66 end 22 67 t(i) = md.results.TransientSolution(i).time; 23 %find GL position at y=40km68 %find GL position between y0 and y1 24 69 [glx gly] = gl_position(md,i,0); 25 pos=find(gly<45000 & gly > 35000); 26 x=gly(pos); 27 v=glx(pos); 28 xq=[38000:100:42000]; 29 vq = interp1(x,v,xq,'linear'); 30 pos=find(xq==40000); 31 GLy40(i)=vq(pos); 70 pos = find(gly<y1 & gly>y0); 71 x = gly(pos); 72 v = glx(pos); 73 if(length(pos)==0) 74 error('pos is null') 75 elseif(length(pos)==1) 76 %this should be used for y=0 or y=ymax 77 GL_y(i) = v; 78 else 79 %this should be used when y is inside the domain; so, use linear interpolation 80 xq = [y0:dy:y1]; 81 vq = interp1(x,v,xq,'linear'); 82 pos = find(xq==y); 83 if(pos) 84 GL_y(i) = vq(pos); 85 else 86 error('pos is null') 87 end 88 end 89 32 90 end 33 91 -
issm/trunk-jpl/src/m/contrib/tsantos/remesh.m
r21678 r22241 58 58 NewModel.geometry.surface = md.results.TransientSolution(end).Surface; 59 59 NewModel.geometry.base = md.results.TransientSolution(end).Base; 60 %NewModel.geometry.bed =md.geometry.bed; %use from parameterize60 NewModel.geometry.bed = md.results.TransientSolution(end).Bed;%md.geometry.bed; %use from parameterize 61 61 NewModel.geometry.thickness = md.results.TransientSolution(end).Thickness; 62 62 NewModel.mask.groundedice_levelset = md.results.TransientSolution(end).MaskGroundediceLevelset; … … 72 72 NewModel.cluster = md.cluster; 73 73 NewModel.transient = md.transient; 74 NewModel.amr = md.amr; 74 75 75 76 mdOut = NewModel;
Note:
See TracChangeset
for help on using the changeset viewer.