[21726] | 1 | Index: ../trunk-jpl/src/c/classes/AdaptiveMeshRefinement.cpp
|
---|
| 2 | ===================================================================
|
---|
| 3 | --- ../trunk-jpl/src/c/classes/AdaptiveMeshRefinement.cpp (revision 21671)
|
---|
| 4 | +++ ../trunk-jpl/src/c/classes/AdaptiveMeshRefinement.cpp (revision 21672)
|
---|
| 5 | @@ -26,15 +26,30 @@
|
---|
| 6 | this->CleanUp();
|
---|
| 7 |
|
---|
| 8 | /*Copy all data*/
|
---|
| 9 | - this->fathermesh = new TPZGeoMesh(*cp.fathermesh);
|
---|
| 10 | - this->previousmesh = new TPZGeoMesh(*cp.previousmesh);
|
---|
| 11 | - this->hmax = cp.hmax;
|
---|
| 12 | - this->elementswidth = cp.elementswidth;
|
---|
| 13 | + this->fathermesh = new TPZGeoMesh(*cp.fathermesh);
|
---|
| 14 | + this->previousmesh = new TPZGeoMesh(*cp.previousmesh);
|
---|
| 15 | + this->levelmax = cp.levelmax;
|
---|
| 16 | + this->elementswidth = cp.elementswidth;
|
---|
| 17 | + this->regionlevel1 = cp.regionlevel1;
|
---|
| 18 | + this->regionlevelmax = cp.regionlevelmax;
|
---|
| 19 | return *this;
|
---|
| 20 |
|
---|
| 21 | }
|
---|
| 22 | /*}}}*/
|
---|
| 23 | AdaptiveMeshRefinement::~AdaptiveMeshRefinement(){/*{{{*/
|
---|
| 24 | +
|
---|
| 25 | + bool ismismip = true;
|
---|
| 26 | + if(ismismip){//itapopo
|
---|
| 27 | + TPZFileStream fstr;
|
---|
| 28 | + std::stringstream ss;
|
---|
| 29 | +
|
---|
| 30 | + ss << this->levelmax;
|
---|
| 31 | + std::string AMRfile = "/home/santos/Misomip2/L" + ss.str() + "_tsai/amr.txt";
|
---|
| 32 | +
|
---|
| 33 | + fstr.OpenWrite(AMRfile.c_str());
|
---|
| 34 | + int withclassid = 1;
|
---|
| 35 | + this->Write(fstr,withclassid);
|
---|
| 36 | + }
|
---|
| 37 | this->CleanUp();
|
---|
| 38 | gRefDBase.clear();
|
---|
| 39 | }
|
---|
| 40 | @@ -44,17 +59,21 @@
|
---|
| 41 | /*Verify and delete all data*/
|
---|
| 42 | if(this->fathermesh) delete this->fathermesh;
|
---|
| 43 | if(this->previousmesh) delete this->previousmesh;
|
---|
| 44 | - this->hmax=-1;
|
---|
| 45 | - this->elementswidth=-1;
|
---|
| 46 | + this->levelmax = -1;
|
---|
| 47 | + this->elementswidth = -1;
|
---|
| 48 | + this->regionlevel1 = -1;
|
---|
| 49 | + this->regionlevelmax = -1;
|
---|
| 50 | }
|
---|
| 51 | /*}}}*/
|
---|
| 52 | void AdaptiveMeshRefinement::Initialize(){/*{{{*/
|
---|
| 53 |
|
---|
| 54 | /*Set pointers to NULL*/
|
---|
| 55 | - this->fathermesh = NULL;
|
---|
| 56 | - this->previousmesh = NULL;
|
---|
| 57 | - this->hmax = -1;
|
---|
| 58 | - this->elementswidth = -1;
|
---|
| 59 | + this->fathermesh = NULL;
|
---|
| 60 | + this->previousmesh = NULL;
|
---|
| 61 | + this->levelmax = -1;
|
---|
| 62 | + this->elementswidth = -1;
|
---|
| 63 | + this->regionlevel1 = -1;
|
---|
| 64 | + this->regionlevelmax = -1;
|
---|
| 65 | }
|
---|
| 66 | /*}}}*/
|
---|
| 67 | int AdaptiveMeshRefinement::ClassId() const{/*{{{*/
|
---|
| 68 | @@ -81,10 +100,12 @@
|
---|
| 69 | }
|
---|
| 70 |
|
---|
| 71 | /* Read simple attributes */
|
---|
| 72 | - buf.Read(&this->hmax,1);
|
---|
| 73 | + buf.Read(&this->levelmax,1);
|
---|
| 74 | buf.Read(&this->elementswidth,1);
|
---|
| 75 | + buf.Read(&this->regionlevel1,1);
|
---|
| 76 | + buf.Read(&this->regionlevelmax,1);
|
---|
| 77 |
|
---|
| 78 | - /* Read geometric mesh*/
|
---|
| 79 | + /* Read geometric mesh*/
|
---|
| 80 | TPZSaveable *sv1 = TPZSaveable::Restore(buf,0);
|
---|
| 81 | this->fathermesh = dynamic_cast<TPZGeoMesh*>(sv1);
|
---|
| 82 |
|
---|
| 83 | @@ -113,9 +134,11 @@
|
---|
| 84 | buf.Write(&classid,1);
|
---|
| 85 |
|
---|
| 86 | /* Write simple attributes */
|
---|
| 87 | - buf.Write(&this->hmax,1);
|
---|
| 88 | + buf.Write(&this->levelmax,1);
|
---|
| 89 | buf.Write(&this->elementswidth,1);
|
---|
| 90 | -
|
---|
| 91 | + buf.Write(&this->regionlevel1,1);
|
---|
| 92 | + buf.Write(&this->regionlevelmax,1);
|
---|
| 93 | +
|
---|
| 94 | /* Write the geometric mesh*/
|
---|
| 95 | this->fathermesh->Write(buf, this->ClassId());
|
---|
| 96 | this->previousmesh->Write(buf, this->ClassId());
|
---|
| 97 | @@ -137,15 +160,15 @@
|
---|
| 98 | /*IMPORTANT! pelements (and psegments) are in Matlab indexing*/
|
---|
| 99 | /*NEOPZ works only in C indexing*/
|
---|
| 100 |
|
---|
| 101 | - //itapopo _assert_(this->fathermesh);
|
---|
| 102 | - //itapopo _assert_(this->previousmesh);
|
---|
| 103 | + _assert_(this->fathermesh);
|
---|
| 104 | + _assert_(this->previousmesh);
|
---|
| 105 |
|
---|
| 106 | /*Calculate the position of the grounding line using previous mesh*/
|
---|
| 107 | std::vector<TPZVec<REAL> > GLvec;
|
---|
| 108 | this->CalcGroundingLinePosition(masklevelset, GLvec);
|
---|
| 109 |
|
---|
| 110 | - std::ofstream file1("/ronne_1/home/santos/mesh0.vtk");
|
---|
| 111 | - TPZVTKGeoMesh::PrintGMeshVTK(this->previousmesh,file1 );
|
---|
| 112 | + // std::ofstream file1("/home/santos/mesh0.vtk");
|
---|
| 113 | + // TPZVTKGeoMesh::PrintGMeshVTK(this->fathermesh,file1 );
|
---|
| 114 |
|
---|
| 115 | /*run refinement or unrefinement process*/
|
---|
| 116 | TPZGeoMesh *newmesh;
|
---|
| 117 | @@ -157,8 +180,8 @@
|
---|
| 118 |
|
---|
| 119 | this->RefinementProcess(newmesh,GLvec);
|
---|
| 120 |
|
---|
| 121 | - std::ofstream file2("/ronne_1/home/santos/mesh1.vtk");
|
---|
| 122 | - TPZVTKGeoMesh::PrintGMeshVTK(this->previousmesh,file2 );
|
---|
| 123 | + //std::ofstream file2("/home/santos/mesh1.vtk");
|
---|
| 124 | + //TPZVTKGeoMesh::PrintGMeshVTK(this->previousmesh,file2 );
|
---|
| 125 |
|
---|
| 126 | /*Set new mesh pointer. Previous mesh just have uniform elements*/
|
---|
| 127 | if(type_process==1){
|
---|
| 128 | @@ -167,15 +190,16 @@
|
---|
| 129 | }
|
---|
| 130 |
|
---|
| 131 | /*Refine elements to avoid hanging nodes*/
|
---|
| 132 | - TPZGeoMesh *nohangingnodesmesh = new TPZGeoMesh(*newmesh);
|
---|
| 133 | + //TPZGeoMesh *nohangingnodesmesh = new TPZGeoMesh(*newmesh);//itapopo testando, este era o original
|
---|
| 134 | + TPZGeoMesh *nohangingnodesmesh = this->CreateRefPatternMesh(newmesh);//itapopo testando, este eh novo metodo
|
---|
| 135 |
|
---|
| 136 | - std::ofstream file3("/ronne_1/home/santos/mesh2.vtk");
|
---|
| 137 | - TPZVTKGeoMesh::PrintGMeshVTK(newmesh,file3);
|
---|
| 138 | + //std::ofstream file3("/home/santos/mesh2.vtk");
|
---|
| 139 | + //TPZVTKGeoMesh::PrintGMeshVTK(this->previousmesh,file3);
|
---|
| 140 |
|
---|
| 141 | this->RefineMeshToAvoidHangingNodes(nohangingnodesmesh);
|
---|
| 142 |
|
---|
| 143 | - std::ofstream file4("/ronne_1/home/santos/mesh3.vtk");
|
---|
| 144 | - TPZVTKGeoMesh::PrintGMeshVTK(nohangingnodesmesh,file4);
|
---|
| 145 | + //std::ofstream file4("/home/santos/mesh3.vtk");
|
---|
| 146 | + //TPZVTKGeoMesh::PrintGMeshVTK(nohangingnodesmesh,file4);
|
---|
| 147 |
|
---|
| 148 | /*Get new geometric mesh in ISSM data structure*/
|
---|
| 149 | this->GetMesh(nohangingnodesmesh,nvertices,nelements,nsegments,px,py,pz,pelements,psegments);
|
---|
| 150 | @@ -190,10 +214,10 @@
|
---|
| 151 | /*}}}*/
|
---|
| 152 | void AdaptiveMeshRefinement::RefinementProcess(TPZGeoMesh *gmesh,std::vector<TPZVec<REAL> > &GLvec){/*{{{*/
|
---|
| 153 |
|
---|
| 154 | - /*Refine mesh hmax times*/
|
---|
| 155 | - _printf_("\n\trefinement process (hmax = " << this->hmax << ")\n");
|
---|
| 156 | + /*Refine mesh levelmax times*/
|
---|
| 157 | + _printf_("\n\trefinement process (level max = " << this->levelmax << ")\n");
|
---|
| 158 | _printf_("\tprogress: ");
|
---|
| 159 | - for(int hlevel=1;hlevel<=this->hmax;hlevel++){
|
---|
| 160 | + for(int hlevel=1;hlevel<=this->levelmax;hlevel++){
|
---|
| 161 |
|
---|
| 162 | /*Set elements to be refined using some criteria*/
|
---|
| 163 | std::vector<int> ElemVec; //elements without children
|
---|
| 164 | @@ -364,6 +388,7 @@
|
---|
| 165 | int vertex1 = this->previousmesh->Element(i)->NodeIndex(1);
|
---|
| 166 | int vertex2 = this->previousmesh->Element(i)->NodeIndex(2);
|
---|
| 167 |
|
---|
| 168 | + //itapopo inserir uma verificação para não acessar fora da memória
|
---|
| 169 | double mls0 = masklevelset[vertex0];
|
---|
| 170 | double mls1 = masklevelset[vertex1];
|
---|
| 171 | double mls2 = masklevelset[vertex2];
|
---|
| 172 | @@ -418,10 +443,12 @@
|
---|
| 173 | /*}}}*/
|
---|
| 174 | void AdaptiveMeshRefinement::TagElementsNearGroundingLine(TPZGeoMesh *gmesh,std::vector<TPZVec<REAL> > &GLvec,int &hlevel,std::vector<int> &ElemVec){/*{{{*/
|
---|
| 175 |
|
---|
| 176 | - /* Tag elements near grounding line */
|
---|
| 177 | - double MaxRegion = 40000.; //itapopo
|
---|
| 178 | - double alpha = log(1.5); //itapopo
|
---|
| 179 | - double MaxDistance = MaxRegion / std::exp(alpha*(hlevel-1));
|
---|
| 180 | + /* Tag elements near grounding line */
|
---|
| 181 | + double D1 = this->regionlevel1;
|
---|
| 182 | + double Dhmax = this->regionlevelmax;
|
---|
| 183 | + int hmax = this->levelmax;
|
---|
| 184 | + double alpha = (hmax==1) ? 0. : log(D1/Dhmax)/(hmax-1.);
|
---|
| 185 | + double Di = D1/exp(alpha*(hlevel-1));
|
---|
| 186 |
|
---|
| 187 | for(int i=0;i<gmesh->NElements();i++){
|
---|
| 188 |
|
---|
| 189 | @@ -435,20 +462,20 @@
|
---|
| 190 | gmesh->Element(i)->CenterPoint(side2D, qsi);
|
---|
| 191 | gmesh->Element(i)->X(qsi, centerPoint);
|
---|
| 192 |
|
---|
| 193 | - REAL distance = MaxDistance;
|
---|
| 194 | + REAL distance = Di;
|
---|
| 195 |
|
---|
| 196 | for (int j = 0; j < GLvec.size(); j++) {
|
---|
| 197 |
|
---|
| 198 | REAL value = ( GLvec[j][0] - centerPoint[0] ) * ( GLvec[j][0] - centerPoint[0] ); // (x2-x1)^2
|
---|
| 199 | value += ( GLvec[j][1] - centerPoint[1] ) * ( GLvec[j][1] - centerPoint[1] );// (y2-y1)^2
|
---|
| 200 | - value = std::sqrt(value); ///Radius
|
---|
| 201 | + value = std::sqrt(value); //Radius
|
---|
| 202 |
|
---|
| 203 | //finding the min distance to the grounding line
|
---|
| 204 | if(value < distance) distance = value;
|
---|
| 205 |
|
---|
| 206 | }
|
---|
| 207 |
|
---|
| 208 | - if(distance < MaxDistance) ElemVec.push_back(i);
|
---|
| 209 | + if(distance < Di) ElemVec.push_back(i);
|
---|
| 210 | }
|
---|
| 211 |
|
---|
| 212 | }
|
---|
| 213 | @@ -458,12 +485,12 @@
|
---|
| 214 | /*IMPORTANT! elements come in Matlab indexing*/
|
---|
| 215 | /*NEOPZ works only in C indexing*/
|
---|
| 216 |
|
---|
| 217 | - // itapopo _assert_(nvertices>0);
|
---|
| 218 | - // itapoo _assert_(nelements>0);
|
---|
| 219 | + _assert_(nvertices>0);
|
---|
| 220 | + _assert_(nelements>0);
|
---|
| 221 | this->SetElementWidth(width);
|
---|
| 222 |
|
---|
| 223 | /*Verify and creating initial mesh*/
|
---|
| 224 | - //itapopo if(this->fathermesh) _error_("Initial mesh already exists!");
|
---|
| 225 | + if(this->fathermesh) _error_("Initial mesh already exists!");
|
---|
| 226 |
|
---|
| 227 | this->fathermesh = new TPZGeoMesh();
|
---|
| 228 | this->fathermesh->NodeVec().Resize( nvertices );
|
---|
| 229 | @@ -490,7 +517,7 @@
|
---|
| 230 | for(int jel=0;jel<this->elementswidth;jel++) elem[jel]=elements[iel*this->elementswidth+jel]-1;//Convert Matlab to C indexing
|
---|
| 231 |
|
---|
| 232 | /*reftype = 0: uniform, fast / reftype = 1: uniform and non-uniform (avoid hanging nodes), it is not too fast */
|
---|
| 233 | - const int reftype = 1;
|
---|
| 234 | + const int reftype = 0;
|
---|
| 235 | switch(this->elementswidth){
|
---|
| 236 | case 3: this->fathermesh->CreateGeoElement(ETriangle, elem, mat, index, reftype); break;
|
---|
| 237 | case 4: this->fathermesh->CreateGeoElement(ETetraedro, elem, mat, index, reftype); DebugStop(); break;
|
---|
| 238 | @@ -520,54 +547,107 @@
|
---|
| 239 |
|
---|
| 240 | /*Create previous mesh as a copy of father mesh*/
|
---|
| 241 | this->previousmesh = new TPZGeoMesh(*this->fathermesh);
|
---|
| 242 | -
|
---|
| 243 | - /*Set refinement patterns*/
|
---|
| 244 | - this->SetRefPatterns();
|
---|
| 245 |
|
---|
| 246 | }
|
---|
| 247 | /*}}}*/
|
---|
| 248 | -void AdaptiveMeshRefinement::SetHMax(int &h){/*{{{*/
|
---|
| 249 | - this->hmax = h;
|
---|
| 250 | +#include "pzgeotriangle.h" //itapopo
|
---|
| 251 | +#include "pzreftriangle.h" //itapopo
|
---|
| 252 | +using namespace pzgeom;
|
---|
| 253 | +TPZGeoMesh* AdaptiveMeshRefinement::CreateRefPatternMesh(TPZGeoMesh* gmesh){/*{{{*/
|
---|
| 254 | +
|
---|
| 255 | + TPZGeoMesh *newgmesh = new TPZGeoMesh();
|
---|
| 256 | + newgmesh->CleanUp();
|
---|
| 257 | +
|
---|
| 258 | + int nnodes = gmesh->NNodes();
|
---|
| 259 | + int nelem = gmesh->NElements();
|
---|
| 260 | + int mat = this->GetElemMaterialID();;
|
---|
| 261 | + int reftype = 1;
|
---|
| 262 | + long index;
|
---|
| 263 | +
|
---|
| 264 | + //nodes
|
---|
| 265 | + newgmesh->NodeVec().Resize(nnodes);
|
---|
| 266 | + for(int i=0;i<nnodes;i++) newgmesh->NodeVec()[i] = gmesh->NodeVec()[i];
|
---|
| 267 | +
|
---|
| 268 | + //elements
|
---|
| 269 | + for(int i=0;i<nelem;i++){
|
---|
| 270 | + TPZGeoEl * geoel = gmesh->Element(i);
|
---|
| 271 | + TPZManVector<long> elem(3,0);
|
---|
| 272 | + for(int j=0;j<3;j++) elem[j] = geoel->NodeIndex(j);
|
---|
| 273 | +
|
---|
| 274 | + newgmesh->CreateGeoElement(ETriangle,elem,mat,index,reftype);
|
---|
| 275 | + newgmesh->ElementVec()[index]->SetId(geoel->Id());
|
---|
| 276 | +
|
---|
| 277 | + TPZGeoElRefPattern<TPZGeoTriangle>* newgeoel = dynamic_cast<TPZGeoElRefPattern<TPZGeoTriangle>*>(newgmesh->ElementVec()[index]);
|
---|
| 278 | +
|
---|
| 279 | + //old neighbourhood
|
---|
| 280 | + const int nsides = TPZGeoTriangle::NSides;
|
---|
| 281 | + TPZVec< std::vector<TPZGeoElSide> > neighbourhood(nsides);
|
---|
| 282 | + TPZVec<long> NodesSequence(0);
|
---|
| 283 | + for(int s = 0; s < nsides; s++){
|
---|
| 284 | + neighbourhood[s].resize(0);
|
---|
| 285 | + TPZGeoElSide mySide(geoel,s);
|
---|
| 286 | + TPZGeoElSide neighS = mySide.Neighbour();
|
---|
| 287 | + if(mySide.Dimension() == 0){
|
---|
| 288 | + long oldSz = NodesSequence.NElements();
|
---|
| 289 | + NodesSequence.resize(oldSz+1);
|
---|
| 290 | + NodesSequence[oldSz] = geoel->NodeIndex(s);
|
---|
| 291 | + }
|
---|
| 292 | + while(mySide != neighS){
|
---|
| 293 | + neighbourhood[s].push_back(neighS);
|
---|
| 294 | + neighS = neighS.Neighbour();
|
---|
| 295 | + }
|
---|
| 296 | + }
|
---|
| 297 | +
|
---|
| 298 | + //inserting in new element
|
---|
| 299 | + for(int s = 0; s < nsides; s++){
|
---|
| 300 | + TPZGeoEl * tempEl = newgeoel;
|
---|
| 301 | + TPZGeoElSide tempSide(newgeoel,s);
|
---|
| 302 | + int byside = s;
|
---|
| 303 | + for(unsigned long n = 0; n < neighbourhood[s].size(); n++){
|
---|
| 304 | + TPZGeoElSide neighS = neighbourhood[s][n];
|
---|
| 305 | + tempEl->SetNeighbour(byside, neighS);
|
---|
| 306 | + tempEl = neighS.Element();
|
---|
| 307 | + byside = neighS.Side();
|
---|
| 308 | + }
|
---|
| 309 | + tempEl->SetNeighbour(byside, tempSide);
|
---|
| 310 | + }
|
---|
| 311 | +
|
---|
| 312 | + long fatherindex = geoel->FatherIndex();
|
---|
| 313 | + if(fatherindex>-1) newgeoel->SetFather(fatherindex);
|
---|
| 314 | +
|
---|
| 315 | + if(!geoel->HasSubElement()) continue;
|
---|
| 316 | +
|
---|
| 317 | + int nsons = geoel->NSubElements();
|
---|
| 318 | +
|
---|
| 319 | + TPZAutoPointer<TPZRefPattern> ref = gRefDBase.GetUniformRefPattern(ETriangle);
|
---|
| 320 | + newgeoel->SetRefPattern(ref);
|
---|
| 321 | +
|
---|
| 322 | + for(int j=0;j<nsons;j++){
|
---|
| 323 | + TPZGeoEl* son = geoel->SubElement(j);
|
---|
| 324 | + if(!son){
|
---|
| 325 | + DebugStop();
|
---|
| 326 | + }
|
---|
| 327 | + newgeoel->SetSubElement(j,son);
|
---|
| 328 | + }
|
---|
| 329 | + }
|
---|
| 330 | + newgmesh->BuildConnectivity();
|
---|
| 331 | +
|
---|
| 332 | + return newgmesh;
|
---|
| 333 | }
|
---|
| 334 | /*}}}*/
|
---|
| 335 | +void AdaptiveMeshRefinement::SetLevelMax(int &h){/*{{{*/
|
---|
| 336 | + this->levelmax = h;
|
---|
| 337 | +}
|
---|
| 338 | +/*}}}*/
|
---|
| 339 | +void AdaptiveMeshRefinement::SetRegions(double &D1,double Dhmax){/*{{{*/
|
---|
| 340 | + this->regionlevel1 = D1;
|
---|
| 341 | + this->regionlevelmax = Dhmax;
|
---|
| 342 | +}
|
---|
| 343 | +/*}}}*/
|
---|
| 344 | void AdaptiveMeshRefinement::SetElementWidth(int &width){/*{{{*/
|
---|
| 345 | this->elementswidth = width;
|
---|
| 346 | }
|
---|
| 347 | /*}}}*/
|
---|
| 348 | -void AdaptiveMeshRefinement::SetRefPatterns(){/*{{{*/
|
---|
| 349 | -
|
---|
| 350 | - /*Initialize the global variable of refinement patterns*/
|
---|
| 351 | - gRefDBase.InitializeUniformRefPattern(EOned);
|
---|
| 352 | - gRefDBase.InitializeUniformRefPattern(ETriangle);
|
---|
| 353 | -
|
---|
| 354 | - //gRefDBase.InitializeRefPatterns();
|
---|
| 355 | - /*Insert specifics patterns to ISSM core*/
|
---|
| 356 | - std::string filepath = REFPATTERNDIR;
|
---|
| 357 | - std::string filename1 = filepath + "/2D_Triang_Rib_3.rpt";
|
---|
| 358 | - std::string filename2 = filepath + "/2D_Triang_Rib_4.rpt";
|
---|
| 359 | - std::string filename3 = filepath + "/2D_Triang_Rib_OnlyTriang_Side_3_4.rpt";
|
---|
| 360 | - std::string filename4 = filepath + "/2D_Triang_Rib_OnlyTriang_Side_3_4_permuted.rpt";
|
---|
| 361 | - std::string filename5 = filepath + "/2D_Triang_Rib_OnlyTriang_Side_3_5.rpt";
|
---|
| 362 | - std::string filename6 = filepath + "/2D_Triang_Rib_OnlyTriang_Side_3_5_permuted.rpt";
|
---|
| 363 | - std::string filename7 = filepath + "/2D_Triang_Rib_5.rpt";
|
---|
| 364 | -
|
---|
| 365 | - TPZAutoPointer<TPZRefPattern> refpat1 = new TPZRefPattern(filename1);
|
---|
| 366 | - TPZAutoPointer<TPZRefPattern> refpat2 = new TPZRefPattern(filename2);
|
---|
| 367 | - TPZAutoPointer<TPZRefPattern> refpat3 = new TPZRefPattern(filename3);
|
---|
| 368 | - TPZAutoPointer<TPZRefPattern> refpat4 = new TPZRefPattern(filename4);
|
---|
| 369 | - TPZAutoPointer<TPZRefPattern> refpat5 = new TPZRefPattern(filename5);
|
---|
| 370 | - TPZAutoPointer<TPZRefPattern> refpat6 = new TPZRefPattern(filename6);
|
---|
| 371 | - TPZAutoPointer<TPZRefPattern> refpat7 = new TPZRefPattern(filename7);
|
---|
| 372 | -
|
---|
| 373 | - if(!gRefDBase.FindRefPattern(refpat1)) gRefDBase.InsertRefPattern(refpat1);
|
---|
| 374 | - if(!gRefDBase.FindRefPattern(refpat2)) gRefDBase.InsertRefPattern(refpat2);
|
---|
| 375 | - if(!gRefDBase.FindRefPattern(refpat3)) gRefDBase.InsertRefPattern(refpat3);
|
---|
| 376 | - if(!gRefDBase.FindRefPattern(refpat4)) gRefDBase.InsertRefPattern(refpat4);
|
---|
| 377 | - if(!gRefDBase.FindRefPattern(refpat5)) gRefDBase.InsertRefPattern(refpat5);
|
---|
| 378 | - if(!gRefDBase.FindRefPattern(refpat6)) gRefDBase.InsertRefPattern(refpat6);
|
---|
| 379 | - if(!gRefDBase.FindRefPattern(refpat7)) gRefDBase.InsertRefPattern(refpat7);
|
---|
| 380 | -}
|
---|
| 381 | -/*}}}*/
|
---|
| 382 | void AdaptiveMeshRefinement::CheckMesh(int &nvertices,int &nelements,int &nsegments,int &width,double** px,double** py,double** pz,int** pelements, int** psegments){/*{{{*/
|
---|
| 383 |
|
---|
| 384 | /*Basic verification*/
|
---|
| 385 | Index: ../trunk-jpl/src/c/classes/FemModel.cpp
|
---|
| 386 | ===================================================================
|
---|
| 387 | --- ../trunk-jpl/src/c/classes/FemModel.cpp (revision 21671)
|
---|
| 388 | +++ ../trunk-jpl/src/c/classes/FemModel.cpp (revision 21672)
|
---|
| 389 | @@ -2920,28 +2920,53 @@
|
---|
| 390 | void FemModel::InitializeAdaptiveRefinement(void){/*{{{*/
|
---|
| 391 |
|
---|
| 392 | /*Define variables*/
|
---|
| 393 | - int my_rank = IssmComm::GetRank();
|
---|
| 394 | - this->amr = NULL;//initialize amr as NULL
|
---|
| 395 | - int numberofvertices = this->vertices->NumberOfVertices();
|
---|
| 396 | - int numberofelements = this->elements->NumberOfElements();
|
---|
| 397 | - int numberofsegments = 0; //used on matlab
|
---|
| 398 | - IssmDouble* x = NULL;
|
---|
| 399 | - IssmDouble* y = NULL;
|
---|
| 400 | - IssmDouble* z = NULL;
|
---|
| 401 | - int* elements = NULL;
|
---|
| 402 | - int elementswidth = this->GetElementsWidth(); //just tria elements in this version. Itapopo:
|
---|
| 403 | + int my_rank = IssmComm::GetRank();
|
---|
| 404 | + this->amr = NULL;//initialize amr as NULL
|
---|
| 405 | + int numberofvertices = this->vertices->NumberOfVertices();
|
---|
| 406 | + int numberofelements = this->elements->NumberOfElements();
|
---|
| 407 | + int numberofsegments = 0; //used on matlab
|
---|
| 408 | + IssmDouble* x = NULL;
|
---|
| 409 | + IssmDouble* y = NULL;
|
---|
| 410 | + IssmDouble* z = NULL;
|
---|
| 411 | + int* elements = NULL;
|
---|
| 412 | + int elementswidth = this->GetElementsWidth(); //just tria elements in this version. Itapopo:
|
---|
| 413 | + int levelmax = 0;
|
---|
| 414 | + IssmDouble regionlevel1 = 0.;
|
---|
| 415 | + IssmDouble regionlevelmax = 0.;
|
---|
| 416 |
|
---|
| 417 | /*Get vertices coordinates of the coarse mesh (father mesh)*/
|
---|
| 418 | /*elements comes in Matlab indexing*/
|
---|
| 419 | this->GetMesh(this->vertices,this->elements,&x,&y,&z,&elements);
|
---|
| 420 |
|
---|
| 421 | + /*Get amr parameters*/
|
---|
| 422 | + this->parameters->FindParam(&levelmax,AmrLevelMaxEnum);
|
---|
| 423 | + this->parameters->FindParam(®ionlevel1,AmrRegionLevel1Enum);
|
---|
| 424 | + this->parameters->FindParam(®ionlevelmax,AmrRegionLevelMaxEnum);
|
---|
| 425 | +
|
---|
| 426 | /*Create initial mesh (coarse mesh) in neopz data structure*/
|
---|
| 427 | /*Just CPU #0 should keep AMR object*/
|
---|
| 428 | - if(my_rank==0){
|
---|
| 429 | - this->amr = new AdaptiveMeshRefinement();
|
---|
| 430 | - int hmax = 0; //itapopo: it must be defined by interface. Using 2 just to test
|
---|
| 431 | - this->amr->SetHMax(hmax); //Set max level of refinement
|
---|
| 432 | - this->amr->CreateInitialMesh(numberofvertices,numberofelements,numberofsegments,elementswidth,x,y,z,elements,NULL);
|
---|
| 433 | + this->SetRefPatterns();
|
---|
| 434 | + if(my_rank==0){
|
---|
| 435 | + bool ismisomip = true;
|
---|
| 436 | + if(ismisomip){//itapopo
|
---|
| 437 | + TPZFileStream fstr;
|
---|
| 438 | + std::stringstream ss;
|
---|
| 439 | +
|
---|
| 440 | + ss << levelmax;
|
---|
| 441 | + std::string AMRfile = "/home/santos/Misomip2/L" + ss.str() + "_tsai/amr.txt";
|
---|
| 442 | + fstr.OpenRead(AMRfile.c_str());
|
---|
| 443 | +
|
---|
| 444 | + TPZSaveable *sv = TPZSaveable::Restore(fstr,0);
|
---|
| 445 | + this->amr = dynamic_cast<AdaptiveMeshRefinement*>(sv);
|
---|
| 446 | + }
|
---|
| 447 | + else{
|
---|
| 448 | + this->amr = new AdaptiveMeshRefinement();
|
---|
| 449 | + //this->amr->SetLevelMax(levelmax); //Set max level of refinement
|
---|
| 450 | + //this->amr->SetRegions(regionlevel1,regionlevelmax);
|
---|
| 451 | + this->amr->CreateInitialMesh(numberofvertices,numberofelements,numberofsegments,elementswidth,x,y,z,elements,NULL);
|
---|
| 452 | + }
|
---|
| 453 | + this->amr->SetLevelMax(levelmax); //Set max level of refinement
|
---|
| 454 | + this->amr->SetRegions(regionlevel1,regionlevelmax);
|
---|
| 455 | }
|
---|
| 456 |
|
---|
| 457 | /*Free the vectors*/
|
---|
| 458 | @@ -2952,6 +2977,40 @@
|
---|
| 459 |
|
---|
| 460 | }
|
---|
| 461 | /*}}}*/
|
---|
| 462 | +void FemModel::SetRefPatterns(){/*{{{*/
|
---|
| 463 | +
|
---|
| 464 | + /*Initialize the global variable of refinement patterns*/
|
---|
| 465 | + gRefDBase.InitializeUniformRefPattern(EOned);
|
---|
| 466 | + gRefDBase.InitializeUniformRefPattern(ETriangle);
|
---|
| 467 | +
|
---|
| 468 | + //gRefDBase.InitializeRefPatterns();
|
---|
| 469 | + /*Insert specifics patterns to ISSM core*/
|
---|
| 470 | + std::string filepath = REFPATTERNDIR;
|
---|
| 471 | + std::string filename1 = filepath + "/2D_Triang_Rib_3.rpt";
|
---|
| 472 | + std::string filename2 = filepath + "/2D_Triang_Rib_4.rpt";
|
---|
| 473 | + std::string filename3 = filepath + "/2D_Triang_Rib_OnlyTriang_Side_3_4.rpt";
|
---|
| 474 | + std::string filename4 = filepath + "/2D_Triang_Rib_OnlyTriang_Side_3_4_permuted.rpt";
|
---|
| 475 | + std::string filename5 = filepath + "/2D_Triang_Rib_OnlyTriang_Side_3_5.rpt";
|
---|
| 476 | + std::string filename6 = filepath + "/2D_Triang_Rib_OnlyTriang_Side_3_5_permuted.rpt";
|
---|
| 477 | + std::string filename7 = filepath + "/2D_Triang_Rib_5.rpt";
|
---|
| 478 | +
|
---|
| 479 | + TPZAutoPointer<TPZRefPattern> refpat1 = new TPZRefPattern(filename1);
|
---|
| 480 | + TPZAutoPointer<TPZRefPattern> refpat2 = new TPZRefPattern(filename2);
|
---|
| 481 | + TPZAutoPointer<TPZRefPattern> refpat3 = new TPZRefPattern(filename3);
|
---|
| 482 | + TPZAutoPointer<TPZRefPattern> refpat4 = new TPZRefPattern(filename4);
|
---|
| 483 | + TPZAutoPointer<TPZRefPattern> refpat5 = new TPZRefPattern(filename5);
|
---|
| 484 | + TPZAutoPointer<TPZRefPattern> refpat6 = new TPZRefPattern(filename6);
|
---|
| 485 | + TPZAutoPointer<TPZRefPattern> refpat7 = new TPZRefPattern(filename7);
|
---|
| 486 | +
|
---|
| 487 | + if(!gRefDBase.FindRefPattern(refpat1)) gRefDBase.InsertRefPattern(refpat1);
|
---|
| 488 | + if(!gRefDBase.FindRefPattern(refpat2)) gRefDBase.InsertRefPattern(refpat2);
|
---|
| 489 | + if(!gRefDBase.FindRefPattern(refpat3)) gRefDBase.InsertRefPattern(refpat3);
|
---|
| 490 | + if(!gRefDBase.FindRefPattern(refpat4)) gRefDBase.InsertRefPattern(refpat4);
|
---|
| 491 | + if(!gRefDBase.FindRefPattern(refpat5)) gRefDBase.InsertRefPattern(refpat5);
|
---|
| 492 | + if(!gRefDBase.FindRefPattern(refpat6)) gRefDBase.InsertRefPattern(refpat6);
|
---|
| 493 | + if(!gRefDBase.FindRefPattern(refpat7)) gRefDBase.InsertRefPattern(refpat7);
|
---|
| 494 | +}
|
---|
| 495 | +/*}}}*/
|
---|
| 496 | void FemModel::ReMesh(void){/*{{{*/
|
---|
| 497 |
|
---|
| 498 | /*Variables*/
|
---|
| 499 | @@ -3066,6 +3125,12 @@
|
---|
| 500 |
|
---|
| 501 | GetMaskOfIceVerticesLSMx(this);
|
---|
| 502 |
|
---|
| 503 | + /*Insert MISMIP+ bed topography*/
|
---|
| 504 | + if(true) this->BedrockFromMismipPlus();
|
---|
| 505 | +
|
---|
| 506 | + /*Adjust base, thickness and mask grounded ice leve set*/
|
---|
| 507 | + if(true) this->AdjustBaseThicknessAndMask();
|
---|
| 508 | +
|
---|
| 509 | /*Reset current configuration: */
|
---|
| 510 | analysis_type=this->analysis_type_list[this->analysis_counter];
|
---|
| 511 | SetCurrentConfiguration(analysis_type);
|
---|
| 512 | @@ -3082,6 +3147,138 @@
|
---|
| 513 |
|
---|
| 514 | }
|
---|
| 515 | /*}}}*/
|
---|
| 516 | +void FemModel::BedrockFromMismipPlus(void){/*{{{*/
|
---|
| 517 | +
|
---|
| 518 | + /*Insert bedrock from mismip+ setup*/
|
---|
| 519 | + /*This was used to Misomip project/simulations*/
|
---|
| 520 | +
|
---|
| 521 | + IssmDouble x,y,bx,by;
|
---|
| 522 | + int numvertices = this->GetElementsWidth();
|
---|
| 523 | + IssmDouble* xyz_list = NULL;
|
---|
| 524 | + IssmDouble* r = xNew<IssmDouble>(numvertices);
|
---|
| 525 | +
|
---|
| 526 | + for(int el=0;el<this->elements->Size();el++){
|
---|
| 527 | + Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(el));
|
---|
| 528 | +
|
---|
| 529 | + element->GetVerticesCoordinates(&xyz_list);
|
---|
| 530 | + for(int i=0;i<numvertices;i++){
|
---|
| 531 | + x = *(xyz_list+3*i+0);
|
---|
| 532 | + y = *(xyz_list+3*i+1);
|
---|
| 533 | +
|
---|
| 534 | + bx=-150.-728.8*std::pow(x/300000.,2)+343.91*std::pow(x/300000.,4)-50.57*std::pow(x/300000.,6);
|
---|
| 535 | + by=500./(1.+std::exp((-2./4000.)*(y-80000./2.-24000.)))+500./(1.+std::exp((2./4000.)*(y-80000./2.+24000.)));
|
---|
| 536 | +
|
---|
| 537 | + r[i]=std::max(bx+by,-720.);
|
---|
| 538 | + }
|
---|
| 539 | +
|
---|
| 540 | + /*insert new bedrock*/
|
---|
| 541 | + element->AddInput(BedEnum,&r[0],P1Enum);
|
---|
| 542 | +
|
---|
| 543 | + /*Cleanup*/
|
---|
| 544 | + xDelete<IssmDouble>(xyz_list);
|
---|
| 545 | + }
|
---|
| 546 | +
|
---|
| 547 | + /*Delete*/
|
---|
| 548 | + xDelete<IssmDouble>(r);
|
---|
| 549 | +
|
---|
| 550 | + return;
|
---|
| 551 | +}
|
---|
| 552 | +/*}}}*/
|
---|
| 553 | +void FemModel::AdjustBaseThicknessAndMask(void){/*{{{*/
|
---|
| 554 | +
|
---|
| 555 | + int numvertices = this->GetElementsWidth();
|
---|
| 556 | + IssmDouble rho_water,rho_ice,density,base_float;
|
---|
| 557 | + IssmDouble* phi = xNew<IssmDouble>(numvertices);
|
---|
| 558 | + IssmDouble* h = xNew<IssmDouble>(numvertices);
|
---|
| 559 | + IssmDouble* s = xNew<IssmDouble>(numvertices);
|
---|
| 560 | + IssmDouble* b = xNew<IssmDouble>(numvertices);
|
---|
| 561 | + IssmDouble* r = xNew<IssmDouble>(numvertices);
|
---|
| 562 | + IssmDouble* sl = xNew<IssmDouble>(numvertices);
|
---|
| 563 | +
|
---|
| 564 | + for(int el=0;el<this->elements->Size();el++){
|
---|
| 565 | + Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(el));
|
---|
| 566 | +
|
---|
| 567 | + element->GetInputListOnVertices(&s[0],SurfaceEnum);
|
---|
| 568 | + element->GetInputListOnVertices(&r[0],BedEnum);
|
---|
| 569 | + element->GetInputListOnVertices(&sl[0],SealevelEnum);
|
---|
| 570 | + rho_water = element->matpar->GetMaterialParameter(MaterialsRhoSeawaterEnum);
|
---|
| 571 | + rho_ice = element->matpar->GetMaterialParameter(MaterialsRhoIceEnum);
|
---|
| 572 | + density = rho_ice/rho_water;
|
---|
| 573 | +
|
---|
| 574 | + for(int i=0;i<numvertices;i++){
|
---|
| 575 | + /*calculate base floatation (which supports given surface*/
|
---|
| 576 | + base_float = rho_ice*s[i]/(rho_ice-rho_water);
|
---|
| 577 | + if(r[i]>base_float){
|
---|
| 578 | + b[i] = r[i];
|
---|
| 579 | + }
|
---|
| 580 | + else {
|
---|
| 581 | + b[i] = base_float;
|
---|
| 582 | + }
|
---|
| 583 | +
|
---|
| 584 | + if(abs(sl[i])>0) _error_("Sea level value not supported!");
|
---|
| 585 | + /*update thickness and mask grounded ice level set*/
|
---|
| 586 | + h[i] = s[i]-b[i];
|
---|
| 587 | + phi[i] = h[i]+r[i]/density;
|
---|
| 588 | + }
|
---|
| 589 | +
|
---|
| 590 | + /*Update inputs*/
|
---|
| 591 | + element->AddInput(MaskGroundediceLevelsetEnum,&phi[0],P1Enum);
|
---|
| 592 | + element->AddInput(ThicknessEnum,&h[0],P1Enum);
|
---|
| 593 | + element->AddInput(BaseEnum,&b[0],P1Enum);
|
---|
| 594 | +
|
---|
| 595 | + }
|
---|
| 596 | +
|
---|
| 597 | + /*Delete*/
|
---|
| 598 | + xDelete<IssmDouble>(phi);
|
---|
| 599 | + xDelete<IssmDouble>(h);
|
---|
| 600 | + xDelete<IssmDouble>(s);
|
---|
| 601 | + xDelete<IssmDouble>(b);
|
---|
| 602 | + xDelete<IssmDouble>(r);
|
---|
| 603 | + xDelete<IssmDouble>(sl);
|
---|
| 604 | +
|
---|
| 605 | + return;
|
---|
| 606 | +}
|
---|
| 607 | +/*}}}*/
|
---|
| 608 | +void FemModel::WriteMeshInResults(void){/*{{{*/
|
---|
| 609 | +
|
---|
| 610 | + int step = -1;
|
---|
| 611 | + int numberofelements = -1;
|
---|
| 612 | + int numberofvertices = -1;
|
---|
| 613 | + IssmDouble time = -1;
|
---|
| 614 | + IssmDouble* x = NULL;
|
---|
| 615 | + IssmDouble* y = NULL;
|
---|
| 616 | + IssmDouble* z = NULL;
|
---|
| 617 | + int* elementslist = NULL;
|
---|
| 618 | +
|
---|
| 619 | + if(!this->elements || !this->vertices || !this->results || !this->parameters) return;
|
---|
| 620 | +
|
---|
| 621 | + parameters->FindParam(&step,StepEnum);
|
---|
| 622 | + parameters->FindParam(&time,TimeEnum);
|
---|
| 623 | + numberofelements=this->elements->NumberOfElements();
|
---|
| 624 | + numberofvertices=this->vertices->NumberOfVertices();
|
---|
| 625 | +
|
---|
| 626 | + /*Get mesh. Elementslist comes in Matlab indexing*/
|
---|
| 627 | + this->GetMesh(this->vertices,this->elements,&x,&y,&z,&elementslist);
|
---|
| 628 | +
|
---|
| 629 | + /*Write mesh in Results*/
|
---|
| 630 | + this->results->AddResult(new GenericExternalResult<int*>(this->results->Size()+1,MeshElementsEnum,
|
---|
| 631 | + elementslist,numberofelements,this->GetElementsWidth(),step,time));
|
---|
| 632 | +
|
---|
| 633 | + this->results->AddResult(new GenericExternalResult<IssmDouble*>(this->results->Size()+1,MeshXEnum,
|
---|
| 634 | + x,numberofvertices,1,step,time));
|
---|
| 635 | +
|
---|
| 636 | + this->results->AddResult(new GenericExternalResult<IssmDouble*>(this->results->Size()+1,MeshYEnum,
|
---|
| 637 | + y,numberofvertices,1,step,time));
|
---|
| 638 | +
|
---|
| 639 | + /*Cleanup*/
|
---|
| 640 | + xDelete<IssmDouble>(x);
|
---|
| 641 | + xDelete<IssmDouble>(y);
|
---|
| 642 | + xDelete<IssmDouble>(z);
|
---|
| 643 | + xDelete<int>(elementslist);
|
---|
| 644 | +
|
---|
| 645 | + return;
|
---|
| 646 | +}
|
---|
| 647 | +/*}}}*/
|
---|
| 648 | void FemModel::InterpolateInputs(Vertices* newfemmodel_vertices,Elements* newfemmodel_elements){/*{{{*/
|
---|
| 649 |
|
---|
| 650 | int maxinputs = MaximumNumberOfDefinitionsEnum;
|
---|
| 651 | @@ -3215,7 +3412,7 @@
|
---|
| 652 | InterpFromMeshToMesh2dx(&P1inputsnew,Indexold,Xold,Yold,numverticesold,numelementsold,
|
---|
| 653 | P1inputsold,numverticesold,numP1inputs,
|
---|
| 654 | Xnew,Ynew,numverticesnew,NULL);
|
---|
| 655 | -
|
---|
| 656 | +
|
---|
| 657 | /*Insert P0 inputs into the new elements.*/
|
---|
| 658 | vector=NULL;
|
---|
| 659 | for(int i=0;i<numP0inputs;i++){
|
---|
| 660 | @@ -3250,7 +3447,7 @@
|
---|
| 661 | vector=NULL;
|
---|
| 662 | for(int i=0;i<numP1inputs;i++){
|
---|
| 663 |
|
---|
| 664 | - /*Get P0 input vector from the interpolated matrix*/
|
---|
| 665 | + /*Get P1 input vector from the interpolated matrix*/
|
---|
| 666 | vector=xNew<IssmDouble>(numverticesnew);
|
---|
| 667 | for(int j=0;j<numverticesnew;j++) vector[j]=P1inputsnew[j*numP1inputs+i];//vector has all vertices (serial)
|
---|
| 668 |
|
---|
| 669 | Index: ../trunk-jpl/src/c/classes/AdaptiveMeshRefinement.h
|
---|
| 670 | ===================================================================
|
---|
| 671 | --- ../trunk-jpl/src/c/classes/AdaptiveMeshRefinement.h (revision 21671)
|
---|
| 672 | +++ ../trunk-jpl/src/c/classes/AdaptiveMeshRefinement.h (revision 21672)
|
---|
| 673 | @@ -57,17 +57,21 @@
|
---|
| 674 | /*General methods*/
|
---|
| 675 | void CleanUp(); // Clean all attributes
|
---|
| 676 | void Initialize(); // Initialize the attributes with NULL and values out of usually range
|
---|
| 677 | - void SetHMax(int &h); // Define the max level of refinement
|
---|
| 678 | - void SetElementWidth(int &width); // Define elements width
|
---|
| 679 | + void SetLevelMax(int &h); // Define the max level of refinement
|
---|
| 680 | + void SetRegions(double &D1,double Dhmax); // Define the regions which will be refined
|
---|
| 681 | + void SetElementWidth(int &width); // Define elements width
|
---|
| 682 | void ExecuteRefinement(int &type_process,double *vx,double *vy,double *masklevelset,int &nvertices,int &nelements,int &nsegments,double** px,double** py,double** pz,int** pelements,int** psegments=NULL); // A new mesh will be created and refined. This returns the new mesh
|
---|
| 683 | void CreateInitialMesh(int &nvertices,int &nelements,int &nsegments,int &width,double* x,double* y,double* z,int* elements,int* segments=NULL); // Create a NeoPZ geometric mesh by coords and elements
|
---|
| 684 | - void CheckMesh(int &nvertices,int &nelements,int &nsegments,int &width,double** px,double** py,double** pz,int** pelements,int** psegments=NULL); // Check the consistency of the mesh
|
---|
| 685 | + TPZGeoMesh* CreateRefPatternMesh(TPZGeoMesh* gmesh);
|
---|
| 686 | + void CheckMesh(int &nvertices,int &nelements,int &nsegments,int &width,double** px,double** py,double** pz,int** pelements,int** psegments=NULL); // Check the consistency of the mesh
|
---|
| 687 |
|
---|
| 688 | private:
|
---|
| 689 |
|
---|
| 690 | /*Private attributes*/
|
---|
| 691 | int elementswidth; // Geometric nodes for element: 3 == Tria, 4 == Tetra, 6 == Penta
|
---|
| 692 | - int hmax; // Max level of refinement
|
---|
| 693 | + int levelmax; // Max level of refinement
|
---|
| 694 | + double regionlevel1; // Region which will be refined with level 1
|
---|
| 695 | + double regionlevelmax; // Region which will be refined with level max
|
---|
| 696 | TPZGeoMesh *fathermesh; // Father Mesh is the entire mesh without refinement
|
---|
| 697 | TPZGeoMesh *previousmesh; // Previous mesh is a refined mesh of last step
|
---|
| 698 |
|
---|
| 699 | @@ -82,7 +86,6 @@
|
---|
| 700 | void GetMesh(TPZGeoMesh *gmesh,int &nvertices,int &nelements,int &nsegments,double** px,double** py,double** pz,int** pelements,int** psegments=NULL); // Return coords and elements in ISSM data structure
|
---|
| 701 | inline int GetElemMaterialID(){return 1;} // Return element material ID
|
---|
| 702 | inline int GetBoundaryMaterialID(){return 2;} // Return segment (2D boundary) material ID
|
---|
| 703 | - void SetRefPatterns(); // Initialize and insert the refinement patterns
|
---|
| 704 | };
|
---|
| 705 |
|
---|
| 706 | #endif
|
---|
| 707 | Index: ../trunk-jpl/src/c/classes/FemModel.h
|
---|
| 708 | ===================================================================
|
---|
| 709 | --- ../trunk-jpl/src/c/classes/FemModel.h (revision 21671)
|
---|
| 710 | +++ ../trunk-jpl/src/c/classes/FemModel.h (revision 21672)
|
---|
| 711 | @@ -148,6 +148,8 @@
|
---|
| 712 | /*Adaptive mesh refinement methods*/
|
---|
| 713 | void InitializeAdaptiveRefinement(void);
|
---|
| 714 | void ReMesh(void);
|
---|
| 715 | + void BedrockFromMismipPlus(void);
|
---|
| 716 | + void AdjustBaseThicknessAndMask(void);
|
---|
| 717 | void GetMesh(Vertices* femmodel_vertices,Elements* femmodel_elements,IssmDouble** px, IssmDouble** py, IssmDouble** pz, int** pelementslist);
|
---|
| 718 | int GetElementsWidth(){return 3;};//just tria elements in this first version
|
---|
| 719 | void ExecuteRefinement(int &numberofvertices,int &numberofelements,IssmDouble** px,IssmDouble** py,IssmDouble** pz,int** pelementslist);
|
---|
| 720 | @@ -160,6 +162,8 @@
|
---|
| 721 | void InterpolateInputs(Vertices* newfemmodel_vertices,Elements* newfemmodel_elements);
|
---|
| 722 | void UpdateElements(int newnumberofelements,int* newelementslist,bool* my_elements,int nodecounter,int analysis_counter,Elements* newelements);
|
---|
| 723 | void ElementsAndVerticesPartitioning(int& newnumberofvertices,int& newnumberofelements,int& elementswidth,int* newelementslist,bool** pmy_elements,int** pmy_vertices);
|
---|
| 724 | + void WriteMeshInResults(void);
|
---|
| 725 | + void SetRefPatterns(void);
|
---|
| 726 | #endif
|
---|
| 727 | };
|
---|
| 728 |
|
---|