Changeset 21528
- Timestamp:
- 02/08/17 17:13:30 (8 years ago)
- Location:
- issm/trunk-jpl/src/c/classes
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/AdaptiveMeshRefinement.cpp
r21503 r21528 3 3 */ 4 4 5 5 #ifdef HAVE_CONFIG_H 6 6 #include <config.h> 7 7 #else … … 52 52 this->hmax=-1; 53 53 this->elementswidth=-1; 54 gRefDBase.clear(); 54 55 } 55 56 /*}}}*/ … … 128 129 /*Mesh refinement methods*/ 129 130 #include "TPZVTKGeoMesh.h" //itapopo 130 void AdaptiveMeshRefinement::ExecuteRefinement(int &type_process,double *vx, double *vy, double *masklevelset, int &nvertices, int &nelements, int &nsegments, double** x, double** y, double** z, int*** elements, int*** segments){/*{{{*/ 131 #include "../shared/shared.h" //itapopo 132 void AdaptiveMeshRefinement::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){/*{{{*/ 133 134 /*IMPORTANT! pelements (and psegments) are in Matlab indexing*/ 135 /*NEOPZ works only in C indexing*/ 131 136 132 137 //itapopo _assert_(this->fathermesh); … … 171 176 172 177 /*Get new geometric mesh in ISSM data structure*/ 173 this->GetMesh(nohangingnodesmesh,nvertices,nelements,nsegments, x,y,z,elements,segments);178 this->GetMesh(nohangingnodesmesh,nvertices,nelements,nsegments,px,py,pz,pelements,psegments); 174 179 175 180 /*Verify the new geometry*/ 176 this->CheckMesh(nvertices,nelements,nsegments,this->elementswidth, x,y,z,elements,segments);181 this->CheckMesh(nvertices,nelements,nsegments,this->elementswidth,px,py,pz,pelements,psegments); 177 182 178 183 delete nohangingnodesmesh; … … 255 260 } 256 261 /*}}}*/ 257 void AdaptiveMeshRefinement::GetMesh(TPZGeoMesh *gmesh, int &nvertices, int &nelements, int &nsegments, double** meshX, double** meshY, double** meshZ, int*** elements, int*** segments){/*{{{*/ 262 void AdaptiveMeshRefinement::GetMesh(TPZGeoMesh *gmesh,int &nvertices,int &nelements,int &nsegments,double** px,double** py,double** pz, int** pelements, int** psegments){/*{{{*/ 263 264 /*IMPORTANT! pelements (and psegments) are in Matlab indexing*/ 265 /*NEOPZ works only in C indexing*/ 258 266 259 267 /* vertices */ … … 261 269 262 270 /* mesh coords */ 263 double *newmeshX = new double[ntotalvertices];264 double *newmeshY = new double[ntotalvertices];265 double *newmeshZ = new double[ntotalvertices];271 double* newmeshX = xNew<IssmDouble>(ntotalvertices); 272 double* newmeshY = xNew<IssmDouble>(ntotalvertices); 273 double* newmeshZ = xNew<IssmDouble>(ntotalvertices); 266 274 267 275 /* getting mesh coords */ … … 283 291 284 292 int ntotalelements = (int)GeoVec.size(); 285 int ** newelements = new int*[ntotalelements];293 int* newelements = xNew<int>(ntotalelements*this->elementswidth); 286 294 287 295 if ( !(this->elementswidth == 3) && !(this->elementswidth == 4) && !(this->elementswidth == 6) ) DebugStop(); 288 296 289 for(int i = 0; i < GeoVec.size(); i++){ 290 newelements[i] = new int[this->elementswidth]; 291 for(int j = 0; j < this->elementswidth; j++) newelements[i][j] = (int)GeoVec[i]->NodeIndex(j); 292 } 297 for(int i=0;i<GeoVec.size();i++){ 298 for(int j=0;j<this->elementswidth;j++) newelements[i*this->elementswidth+j]=(int)GeoVec[i]->NodeIndex(j)+1;//C to Matlab indexing 299 } 293 300 294 301 /* segments */ … … 301 308 302 309 int ntotalsegments = (int)SegVec.size(); 303 int * * newsegments = new int*[ntotalsegments];304 305 for(int i = 0; i < SegVec.size(); i++){306 307 newsegments[i] = new int[3];308 for(int j = 0; j < 2; j++) newsegments[i][j] = SegVec[i]->NodeIndex(j);310 int *newsegments=NULL; 311 if(ntotalsegments>0) newsegments=xNew<int>(ntotalsegments*3); 312 313 for(int i=0;i<SegVec.size();i++){ 314 315 for(int j=0;j<2;j++) newsegments[i*3+j]=(int)SegVec[i]->NodeIndex(j)+1;//C to Matlab indexing 309 316 310 317 int neighborindex = SegVec[i]->Neighbour(2).Element()->Index(); … … 319 326 320 327 if(neighbourid==-1) DebugStop(); //itapopo talvez passar para _assert_ 321 newsegments[i ][2] = neighbourid;328 newsegments[i*3+2] = neighbourid+1;//C to Matlab indexing 322 329 } 323 330 324 331 //setting outputs 325 nvertices 326 nelements 327 nsegments 328 * meshX= newmeshX;329 * meshY= newmeshY;330 * meshZ= newmeshZ;331 * elements= newelements;332 * segments= newsegments;332 nvertices = ntotalvertices; 333 nelements = ntotalelements; 334 nsegments = ntotalsegments; 335 *px = newmeshX; 336 *py = newmeshY; 337 *pz = newmeshZ; 338 *pelements = newelements; 339 *psegments = newsegments; 333 340 334 341 } … … 381 388 ElemVec.clear(); 382 389 383 // itapopo inserir modo de encontrar criterio 384 if(false) this->TagAllElements(gmesh,ElemVec); //uniform, refine all elements!390 // itapopo inserir modo de encontrar criterio TESTING!!!! Come to false! 391 if(true) this->TagAllElements(gmesh,ElemVec); //uniform, refine all elements! 385 392 386 393 /* Adaptive refinement. This refines some elements following some criteria*/ 387 this->TagElementsNearGroundingLine(gmesh, GLvec, hlevel, ElemVec);394 //this->TagElementsNearGroundingLine(gmesh, GLvec, hlevel, ElemVec); 388 395 389 396 } … … 437 444 } 438 445 /*}}}*/ 439 void AdaptiveMeshRefinement::CreateInitialMesh(int &nvertices, int &nelements, int &nsegments, int &width, double* x, double* y, double* z, int** elements, int** segments){/*{{{*/ 440 446 void AdaptiveMeshRefinement::CreateInitialMesh(int &nvertices,int &nelements,int &nsegments,int &width,double* x,double* y,double* z,int* elements,int* segments){/*{{{*/ 447 448 /*IMPORTANT! elements come in Matlab indexing*/ 449 /*NEOPZ works only in C indexing*/ 450 441 451 // itapopo _assert_(nvertices>0); 442 452 // itapoo _assert_(nelements>0); 443 453 this->SetElementWidth(width); 444 454 445 455 /*Verify and creating initial mesh*/ … … 450 460 451 461 /*Set the vertices (geometric nodes in NeoPZ context)*/ 452 for(int i=0;i<nvertices;i++){ 453 454 /*x,y,z coords*/ 455 TPZManVector<REAL,3> coord(3,0.); 456 coord[0]= x[i]; 457 coord[1]= y[i]; 458 coord[2]= z[i]; 459 460 /*Insert in the mesh*/ 461 this->fathermesh->NodeVec()[i].SetCoord(coord); 462 this->fathermesh->NodeVec()[i].SetNodeId(i); 462 for(int i=0;i<nvertices;i++){ 463 /*x,y,z coords*/ 464 TPZManVector<REAL,3> coord(3,0.); 465 coord[0]= x[i]; 466 coord[1]= y[i]; 467 coord[2]= z[i]; 468 /*Insert in the mesh*/ 469 this->fathermesh->NodeVec()[i].SetCoord(coord); 470 this->fathermesh->NodeVec()[i].SetNodeId(i); 463 471 } 464 472 465 473 /*Generate the elements*/ 466 467 468 474 long index; 475 const int mat = this->GetElemMaterialID(); 476 TPZManVector<long> elem(this->elementswidth,0); 469 477 470 478 for(int iel=0;iel<nelements;iel++){ 471 479 472 for(int jel=0;jel<this->elementswidth;jel++) elem[jel]=elements[iel ][jel];473 474 475 476 477 case 3: this->fathermesh->CreateGeoElement(ETriangle, elem, mat, index, reftype); 478 case 4: this->fathermesh->CreateGeoElement(ETetraedro, elem, mat, index, reftype); DebugStop(); break;// itapopo _error_("tetra elements must be verified!")break;479 case 6: this->fathermesh->CreateGeoElement(EPrisma, elem, mat, index, reftype);break;480 480 for(int jel=0;jel<this->elementswidth;jel++) elem[jel]=elements[iel*this->elementswidth+jel]-1;//Convert Matlab to C indexing 481 482 /*reftype = 0: uniform, fast / reftype = 1: uniform and non-uniform (avoid hanging nodes), it is not too fast */ 483 const int reftype = 1; 484 switch(this->elementswidth){ 485 case 3: this->fathermesh->CreateGeoElement(ETriangle, elem, mat, index, reftype); break; 486 case 4: this->fathermesh->CreateGeoElement(ETetraedro, elem, mat, index, reftype); DebugStop(); break; 487 case 6: this->fathermesh->CreateGeoElement(EPrisma, elem, mat, index, reftype); DebugStop(); break; 488 default: DebugStop();//itapopo _error_("mesh not supported yet"); 481 489 } 482 490 483 /*Define the element ID*/ 484 this->fathermesh->ElementVec()[index]->SetId(iel); 485 491 /*Define the element ID*/ 492 this->fathermesh->ElementVec()[index]->SetId(iel); 486 493 } 487 494 488 /*Generate the 1D segments elements (boundary)*/ 489 const int matboundary = this->GetBoundaryMaterialID(); 490 TPZManVector<long> boundary(2,0.); 491 492 for(int iel=nelements;iel<nelements+nsegments;iel++){ 493 494 boundary[0] = segments[iel-nelements][0]; 495 boundary[1] = segments[iel-nelements][1]; 496 497 /*reftype = 0: uniform, fast / reftype = 1: uniform and non-uniform (avoid hanging nodes), it is not too fast */ 498 const int reftype = 0; 499 this->fathermesh->CreateGeoElement(EOned, boundary, matboundary, index, reftype);//cria elemento unidimensional 500 this->fathermesh->ElementVec()[index]->SetId(iel); 501 502 } 503 504 /*Build element and node connectivities*/ 505 this->fathermesh->BuildConnectivity(); 506 /*Create previous mesh as a copy of father mesh*/ 507 this->previousmesh = new TPZGeoMesh(*this->fathermesh); 508 495 /*Generate the 1D segments elements (boundary)*/ 496 const int matboundary = this->GetBoundaryMaterialID(); 497 TPZManVector<long> boundary(2,0.); 498 499 for(int iel=nelements;iel<nelements+nsegments;iel++){ 500 boundary[0] = segments[(iel-nelements)*2+0]-1;//Convert Matlab to C indexing 501 boundary[1] = segments[(iel-nelements)*2+1]-1;//Convert Matlab to C indexing 502 /*reftype = 0: uniform, fast / reftype = 1: uniform and non-uniform (avoid hanging nodes), it is not too fast */ 503 const int reftype = 0; 504 this->fathermesh->CreateGeoElement(EOned, boundary, matboundary, index, reftype);//cria elemento unidimensional 505 this->fathermesh->ElementVec()[index]->SetId(iel); 506 } 507 508 /*Build element and node connectivities*/ 509 this->fathermesh->BuildConnectivity(); 510 511 /*Create previous mesh as a copy of father mesh*/ 512 this->previousmesh = new TPZGeoMesh(*this->fathermesh); 513 514 /*Set refinement patterns*/ 515 this->SetRefPatterns(); 516 509 517 } 510 518 /*}}}*/ … … 517 525 } 518 526 /*}}}*/ 519 void AdaptiveMeshRefinement::CheckMesh(int &nvertices, int &nelements, int &nsegments,int &width, double** x, double** y, double** z, int*** elements, int*** segments){/*{{{*/ 527 void AdaptiveMeshRefinement::SetRefPatterns(){/*{{{*/ 528 529 /*Initialize the global variable of refinement patterns*/ 530 gRefDBase.InitializeUniformRefPattern(EOned); 531 gRefDBase.InitializeUniformRefPattern(ETriangle); 532 533 //gRefDBase.InitializeRefPatterns(); 534 /*Insert specifics patterns to ISSM core*/ 535 std::string filepath = REFPATTERNDIR; 536 std::string filename1 = filepath + "/2D_Triang_Rib_3.rpt"; 537 std::string filename2 = filepath + "/2D_Triang_Rib_4.rpt"; 538 std::string filename3 = filepath + "/2D_Triang_Rib2_Side_3_4.rpt"; 539 std::string filename4 = filepath + "/2D_Triang_Rib2_Side_3_4permuted.rpt"; 540 std::string filename5 = filepath + "/2D_Triang_Rib2_Side_3_5.rpt"; 541 std::string filename6 = filepath + "/2D_Triang_Rib2_Side_3_5permuted.rpt"; 542 std::string filename7 = filepath + "/2D_Triang_Rib_5.rpt"; 543 544 TPZAutoPointer<TPZRefPattern> refpat1 = new TPZRefPattern(filename1); 545 TPZAutoPointer<TPZRefPattern> refpat2 = new TPZRefPattern(filename2); 546 TPZAutoPointer<TPZRefPattern> refpat3 = new TPZRefPattern(filename3); 547 TPZAutoPointer<TPZRefPattern> refpat4 = new TPZRefPattern(filename4); 548 TPZAutoPointer<TPZRefPattern> refpat5 = new TPZRefPattern(filename5); 549 TPZAutoPointer<TPZRefPattern> refpat6 = new TPZRefPattern(filename6); 550 TPZAutoPointer<TPZRefPattern> refpat7 = new TPZRefPattern(filename7); 551 552 if(!gRefDBase.FindRefPattern(refpat1)) gRefDBase.InsertRefPattern(refpat1); 553 if(!gRefDBase.FindRefPattern(refpat2)) gRefDBase.InsertRefPattern(refpat2); 554 if(!gRefDBase.FindRefPattern(refpat3)) gRefDBase.InsertRefPattern(refpat3); 555 if(!gRefDBase.FindRefPattern(refpat4)) gRefDBase.InsertRefPattern(refpat4); 556 if(!gRefDBase.FindRefPattern(refpat5)) gRefDBase.InsertRefPattern(refpat5); 557 if(!gRefDBase.FindRefPattern(refpat6)) gRefDBase.InsertRefPattern(refpat6); 558 if(!gRefDBase.FindRefPattern(refpat7)) gRefDBase.InsertRefPattern(refpat7); 559 } 560 /*}}}*/ 561 void AdaptiveMeshRefinement::CheckMesh(int &nvertices,int &nelements,int &nsegments,int &width,double** px,double** py,double** pz,int** pelements, int** psegments){/*{{{*/ 520 562 521 563 /*Basic verification*/ … … 524 566 if ( !(width == 3) && !(width == 4) && !(width == 6) ) DebugStop(); // itapopo verifcar se irá usar o _assert_ 525 567 526 if( ! x || !y || !z || !elements ) DebugStop(); // itapopo verifcar se irá usar o _assert_568 if( !px || !py || !pz || !pelements ) DebugStop(); // itapopo verifcar se irá usar o _assert_ 527 569 528 570 /*Verify if there are orphan nodes*/ … … 531 573 for(int i = 0; i < nelements; i++){ 532 574 for(int j = 0; j < width; j++) { 533 elemvertices.insert((* elements)[i][j]);575 elemvertices.insert((*pelements)[i*width+j]); 534 576 } 535 577 } … … 538 580 539 581 //Verify if there are inf or NaN in coords 540 for(int i = 0; i < nvertices; i++) if(isnan((* x)[i]) || isinf((*x)[i])) DebugStop();541 for(int i = 0; i < nvertices; i++) if(isnan((* y)[i]) || isinf((*y)[i])) DebugStop();542 for(int i = 0; i < nvertices; i++) if(isnan((* z)[i]) || isinf((*z)[i])) DebugStop();582 for(int i = 0; i < nvertices; i++) if(isnan((*px)[i]) || isinf((*px)[i])) DebugStop(); 583 for(int i = 0; i < nvertices; i++) if(isnan((*py)[i]) || isinf((*py)[i])) DebugStop(); 584 for(int i = 0; i < nvertices; i++) if(isnan((*pz)[i]) || isinf((*pz)[i])) DebugStop(); 543 585 544 586 for(int i = 0; i < nelements; i++){ 545 587 for(int j = 0; j < width; j++){ 546 if( isnan((* elements)[i][j]) || isinf((*elements)[i][j]) ) DebugStop();547 } 548 } 549 550 } 551 /*}}}*/ 588 if( isnan((*pelements)[i*width+j]) || isinf((*pelements)[i*width+j]) ) DebugStop(); 589 } 590 } 591 592 } 593 /*}}}*/ -
issm/trunk-jpl/src/c/classes/AdaptiveMeshRefinement.h
r21503 r21528 10 10 11 11 /*NeoPZ includes*/ 12 /*REAL and STATE definitions, NeoPZ variables*/ 12 /*REAL and STATE definitions, NeoPZ variables itapopo should be read by NeoPZ's config.h*/ 13 #ifndef REFPATTERNDIR 14 # define REFPATTERNDIR "/home/santos/trunk-jpl/externalpackages/neopz/install/include/refpatterns" 15 #endif 16 13 17 #ifndef REALdouble 14 18 #define REALdouble … … 55 59 void SetHMax(int &h); // Define the max level of refinement 56 60 void SetElementWidth(int &width); // Define elements width 57 void ExecuteRefinement(int &type_process,double *vx, double *vy, double *masklevelset, int &nvertices, int &nelements, int &nsegments, double** x, double** y, double** z, int*** elements, int***segments=NULL); // A new mesh will be created and refined. This returns the new mesh58 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 elements59 void CheckMesh(int &nvertices, int &nelements, int &nsegments, int &width, double** x, double** y, double** z, int*** elements, int***segments=NULL); // Check the consistency of the mesh61 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 62 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 63 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 60 64 61 65 private: … … 75 79 void TagElementsNearGroundingLine(TPZGeoMesh *gmesh,std::vector<TPZVec<REAL> > &GLvec,int &hlevel,std::vector<int> &ElemVec); // This tag elements near the grounding line 76 80 void CalcGroundingLinePosition(double *masklevelset,std::vector<TPZVec<REAL> > &GLvec); // Calculate the grounding line position using previous mesh 77 void GetMesh(TPZGeoMesh *gmesh, int &nvertices, int &nelements, int &nsegments, double** meshX, double** meshY, double** meshZ, int*** elements, int***segments=NULL); // Return coords and elements in ISSM data structure81 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 78 82 inline int GetElemMaterialID(){return 1;} // Return element material ID 79 83 inline int GetBoundaryMaterialID(){return 2;} // Return segment (2D boundary) material ID 80 84 void SetRefPatterns(); // Initialize and insert the refinement patterns 81 85 }; 82 86 -
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r21518 r21528 1578 1578 name==HydrologyHeadOldEnum || 1579 1579 name==StressbalanceConvergenceNumStepsEnum || 1580 name==MeshVertexonbaseEnum 1580 name==MeshVertexonbaseEnum || 1581 name==FrictionPEnum || 1582 name==FrictionQEnum || 1583 name==LoadingforceXEnum || 1584 name==LoadingforceYEnum 1581 1585 1582 1586 ) { -
issm/trunk-jpl/src/c/classes/FemModel.cpp
r21524 r21528 82 82 #ifdef _HAVE_NEOPZ_ 83 83 this->InitializeAdaptiveRefinement(); 84 FemModel *Test=this->ReMesh();//itapopo: just to test!; 85 //Test->elements->DeepEcho(); 86 //Test->CleanUp(); 87 //delete Test; 84 FemModel *Test=this->ReMesh();//itapopo: just to test!;; 85 //if(IssmComm::GetRank()==0) Test->elements->DeepEcho(); 88 86 #endif 89 87 … … 2924 2922 void FemModel::InitializeAdaptiveRefinement(void){/*{{{*/ 2925 2923 2926 int my_rank=IssmComm::GetRank(); 2927 2928 /*Initialize AMR*/ 2929 if(my_rank==0){ 2930 /*Just CPU #0 should keep AMR object*/ 2924 /*Define variables*/ 2925 int my_rank = IssmComm::GetRank(); 2926 this->amr = NULL;//initialize amr as NULL 2927 int numberofvertices = this->vertices->NumberOfVertices(); 2928 int numberofelements = this->elements->NumberOfElements(); 2929 int numberofsegments = 0; //used on matlab 2930 IssmDouble* x = NULL; 2931 IssmDouble* y = NULL; 2932 IssmDouble* z = NULL; 2933 int* elements = NULL; 2934 int elementswidth = this->GetElementsWidth(); //just tria elements in this version. Itapopo: 2935 2936 /*Get vertices coordinates of the coarse mesh (father mesh)*/ 2937 /*elements comes in Matlab indexing*/ 2938 this->GetMesh(this,&x,&y,&z,&elements); 2939 2940 /*Create initial mesh (coarse mesh) in neopz data structure*/ 2941 /*Just CPU #0 should keep AMR object*/ 2942 if(my_rank==0){ 2931 2943 this->amr = new AdaptiveMeshRefinement(); 2932 int hmax = 2; //itapopo: it must be defined by interface. Using 2 just to test2944 int hmax = 0; //itapopo: it must be defined by interface. Using 2 just to test 2933 2945 this->amr->SetHMax(hmax); //Set max level of refinement 2934 } 2935 else{ 2936 this->amr=NULL; 2937 } 2938 2939 /*Get initial mesh*/ 2940 /*Get total number of elements and total numbers of elements in the initial mesh*/ 2941 int numberofvertices, numberofelements, numberofsegments; 2942 numberofvertices = this->vertices->NumberOfVertices(); 2943 numberofelements = this->elements->NumberOfElements(); 2944 numberofsegments = -1; //used on matlab 2945 2946 /*Get vertices coordinates*/ 2947 IssmDouble *x = NULL; 2948 IssmDouble *y = NULL; 2949 IssmDouble *z = NULL; 2950 VertexCoordinatesx(&x, &y, &z, this->vertices,false) ; 2951 2952 /*Get element vertices*/ 2953 int elementswidth = 3; //just 2D mesh in this version (just tria elements) 2954 int* elem_vertices=xNew<int>(elementswidth); 2955 Vector<IssmDouble>* vid1= new Vector<IssmDouble>(numberofelements); 2956 Vector<IssmDouble>* vid2= new Vector<IssmDouble>(numberofelements); 2957 Vector<IssmDouble>* vid3= new Vector<IssmDouble>(numberofelements); 2958 2959 /*Go through elements, and for each element, get vertices*/ 2960 for(int i=0;i<this->elements->Size();i++){ 2961 Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i)); 2962 element->GetVerticesSidList(elem_vertices); 2963 vid1->SetValue(element->sid,elem_vertices[0],INS_VAL); 2964 vid2->SetValue(element->sid,elem_vertices[1],INS_VAL); 2965 vid3->SetValue(element->sid,elem_vertices[2],INS_VAL); 2966 } 2967 2968 /*Assemble*/ 2969 vid1->Assemble(); 2970 vid2->Assemble(); 2971 vid3->Assemble(); 2972 2973 /*Serialize*/ 2974 IssmDouble *id1 = vid1->ToMPISerial(); 2975 IssmDouble *id2 = vid2->ToMPISerial(); 2976 IssmDouble *id3 = vid3->ToMPISerial(); 2977 2978 int **elementsptr; 2979 elementsptr = new int*[numberofelements]; 2980 for(int i=0;i<numberofelements;i++){ 2981 elementsptr[i] = new int[elementswidth]; 2982 elementsptr[i][0] = (int)id1[i]; 2983 elementsptr[i][1] = (int)id2[i]; 2984 elementsptr[i][2] = (int)id3[i]; 2985 } 2986 2987 /*Create initial mesh (coarse mesh) in neopz data structure*/ 2988 if(my_rank==0){ 2989 int nsegments=0; 2990 this->amr->CreateInitialMesh(numberofvertices, numberofelements, nsegments, elementswidth, x, y, z, elementsptr, NULL); 2946 this->amr->CreateInitialMesh(numberofvertices,numberofelements,numberofsegments,elementswidth,x,y,z,elements,NULL); 2991 2947 } 2992 2948 … … 2995 2951 xDelete<IssmDouble>(y); 2996 2952 xDelete<IssmDouble>(z); 2997 delete vid1; 2998 delete vid2; 2999 delete vid3; 3000 xDelete<IssmDouble>(id1); 3001 xDelete<IssmDouble>(id2); 3002 xDelete<IssmDouble>(id3); 3003 for(int i=0;i<numberofelements;i++) delete [] elementsptr[i]; 3004 if(elementsptr) delete [] elementsptr; 3005 xDelete<int>(elem_vertices); 2953 xDelete<int>(elements); 3006 2954 3007 2955 } … … 3009 2957 FemModel* FemModel::ReMesh(void){/*{{{*/ 3010 2958 3011 int numprocs=IssmComm::GetSize();3012 if(numprocs>1) _error_("Multithreading not tested yet. Run with 1 cpu.");3013 3014 2959 /*Variables*/ 3015 IssmDouble *newx =NULL;3016 IssmDouble *newy =NULL;3017 IssmDouble *newz =NULL;3018 int *newelementslist =NULL;3019 int newnumberofvertices =-1;3020 int newnumberofelements =-1;3021 bool* my_elements =NULL;3022 int* my_vertices =NULL;3023 int elementswidth =3;//just tria elements in this version2960 IssmDouble *newx = NULL; 2961 IssmDouble *newy = NULL; 2962 IssmDouble *newz = NULL; 2963 int *newelementslist = NULL; 2964 int newnumberofvertices = -1; 2965 int newnumberofelements = -1; 2966 bool* my_elements = NULL; 2967 int* my_vertices = NULL; 2968 int elementswidth = this->GetElementsWidth();//just tria elements in this version 3024 2969 3025 2970 /*Execute refinement and get the new mesh*/ 2971 /*newelementslist come in Matlab indexing*/ 3026 2972 this->ExecuteRefinement(newnumberofvertices,newnumberofelements,&newx,&newy,&newz,&newelementslist); 3027 2973 3028 2974 /*Partitioning the new mesh. Maybe ElementsAndVerticesPartitioning.cpp could be modified to set this without iomodel.*/ 3029 2975 this->ElementsAndVerticesPartitioning(newnumberofvertices,newnumberofelements,elementswidth,newelementslist,&my_elements,&my_vertices); 3030 2976 3031 2977 /*Creating new femmodel with new mesh*/ 3032 FemModel* output =new FemModel(*this);2978 FemModel* output = new FemModel(*this); 3033 2979 3034 2980 /*Copy basic attributes:*/ … … 3055 3001 output->vertices=new Vertices(); 3056 3002 this->CreateVertices(newnumberofvertices,newnumberofelements,elementswidth,newelementslist,my_vertices,newx,newy,newz,output->vertices); 3057 3003 3058 3004 /*Creating elements*/ 3059 3005 /*Just Tria in this version*/ 3060 3006 output->elements=new Elements(); 3061 this->CreateElements(newnumberofelements,elementswidth,newelementslist,my_elements,output->elements); 3062 /*Cleanup*/ 3063 // xDelete<int>(newelementslist); itapopo 3007 this->CreateElements(newnumberofelements,elementswidth,newelementslist,my_elements,output->elements); 3064 3008 3065 3009 /*Creating materials*/ … … 3089 3033 /*Create constraints*/ 3090 3034 output->constraints=new Constraints(); 3091 this->CreateConstraints(newnumberofvertices,newnumberofelements,new elementslist,newx,newy,my_vertices,output->constraints);3035 this->CreateConstraints(newnumberofvertices,newnumberofelements,newx,newy,my_vertices,output->constraints); 3092 3036 3093 3037 output->elements->Presort(); … … 3117 3061 } 3118 3062 3119 /*Finally: interpolate all inputs*/ 3120 printf("-------------- file: FemModel.cpp line: %i\n",__LINE__); 3063 /*Finally: interpolate all inputs and insert them into the new elements.*/ 3121 3064 this->InterpolateInputs(output); 3122 3065 GetMaskOfIceVerticesLSMx(output); 3066 3123 3067 /*Reset current configuration: */ 3124 3068 analysis_type=output->analysis_type_list[this->analysis_counter]; 3125 3069 output->SetCurrentConfiguration(analysis_type); 3126 3070 3071 /*Cleanup*/ 3072 xDelete<IssmDouble>(newx); 3073 xDelete<IssmDouble>(newy); 3074 xDelete<IssmDouble>(newz); 3075 xDelete<int>(newelementslist); 3076 xDelete<int>(my_vertices); 3077 xDelete<bool>(my_elements); 3127 3078 3128 3079 return output; 3080 3129 3081 } 3130 3082 /*}}}*/ … … 3190 3142 } 3191 3143 3192 printf("-------------- file: FemModel.cpp line: %i\n",__LINE__);3193 printf("Found %i %i inputs\n",numP0inputs,numP1inputs);3194 3195 3144 /*========== Deal with P0 inputs ==========*/ 3196 3145 int numelementsold = this->elements->NumberOfElements(); … … 3203 3152 3204 3153 for(int i=0;i<numP0inputs;i++){ 3205 printf("Dealing with %s (type: %s)\n",EnumToStringx(P0input_enums[i]),EnumToStringx(P0input_interp[i]));3206 3154 GetVectorFromInputsx(&vector,this,P0input_enums[i],ElementSIdEnum); 3207 3155 … … 3210 3158 xDelete<IssmDouble>(vector); 3211 3159 } 3212 printf("Printing array to make sure it looks alright\n");3213 printarray(P0inputsold,numelementsold,numP0inputs);3214 3160 3215 3161 /*========== Deal with P1 inputs ==========*/ … … 3219 3165 3220 3166 for(int i=0;i<numP1inputs;i++){ 3221 printf("Dealing with %s (type: %s)\n",EnumToStringx(P1input_enums[i]),EnumToStringx(P1input_interp[i]));3222 3167 GetVectorFromInputsx(&vector,this,P1input_enums[i],VertexSIdEnum); 3223 3168 … … 3226 3171 xDelete<IssmDouble>(vector); 3227 3172 } 3228 printf("Printing array to make sure it looks alright\n");3229 printarray(P1inputsold,numverticesold,numP1inputs);3230 3173 3231 3174 /*Old mesh coordinates*/ … … 3234 3177 IssmDouble *Zold = NULL; 3235 3178 int *Indexold = NULL; 3236 int *Indexnew = NULL;3237 3179 IssmDouble *Xnew = NULL; 3238 3180 IssmDouble *Ynew = NULL; 3239 3181 IssmDouble *Znew = NULL; 3182 IssmDouble* XC_new = NULL; 3183 IssmDouble* YC_new = NULL; 3184 int *Indexnew = NULL; 3240 3185 3241 3186 /*Get the old mesh*/ 3242 printf("-------------- file: FemModel.cpp line: %i\n",__LINE__);3243 3187 this->GetMesh(this,&Xold,&Yold,&Zold,&Indexold); 3244 3188 3245 3189 /*Get the new mesh*/ 3246 printf("-------------- file: FemModel.cpp line: %i\n",__LINE__);3247 3190 this->GetMesh(newfemmodel,&Xnew,&Ynew,&Znew,&Indexnew); 3248 3249 printf("-------------- file: FemModel.cpp line: %i\n",__LINE__); 3191 3192 /*Calculate the center points xc and xy*/ 3193 int elementswidth = this->GetElementsWidth(); //just tria in this version 3194 /*new mesh*/ 3195 XC_new=xNewZeroInit<IssmDouble>(numelementsnew); 3196 YC_new=xNewZeroInit<IssmDouble>(numelementsnew); 3197 for(int i=0;i<numelementsnew;i++){ 3198 for(int j=0;j<elementswidth;j++){ 3199 int vid = Indexnew[i*elementswidth+j]-1;//Transform to C indexing 3200 XC_new[i]+=Xnew[vid]; 3201 YC_new[i]+=Ynew[vid]; 3202 } 3203 XC_new[i]=XC_new[i]/3; 3204 YC_new[i]=YC_new[i]/3; 3205 } 3206 3250 3207 /*Interplate P0 inputs in the new mesh*/ 3251 3208 InterpFromMeshToMesh2dx(&P0inputsnew,Indexold,Xold,Yold,numverticesold,numelementsold, 3252 3209 P0inputsold,numelementsold,numP0inputs, 3253 Xnew,Ynew,numelementsnew,NULL); 3254 3255 printf("Printing array AFTER INTERP - P0 INPUTS - to make sure it looks alright\n"); 3256 printarray(P0inputsnew,numelementsnew,numP0inputs); 3210 XC_new,YC_new,numelementsnew,NULL); 3257 3211 3258 3212 /*Interpolate P1 inputs in the new mesh*/ … … 3261 3215 Xnew,Ynew,numverticesnew,NULL); 3262 3216 3263 printf("Printing array AFTER INTERP - P1 INPUTS - to make sure it looks alright\n"); 3264 printarray(P1inputsnew,numverticesnew,numP1inputs); 3265 3266 _error_("STOP"); 3267 3217 /*Insert P0 inputs into the new elements.*/ 3218 vector=NULL; 3219 for(int i=0;i<numP0inputs;i++){ 3220 3221 /*Get P0 input vector from the interpolated matrix*/ 3222 vector=xNew<IssmDouble>(numelementsnew); 3223 for(int j=0;j<numelementsnew;j++) vector[j]=P0inputsnew[j*numP0inputs+i];//vector has values for all elements (serial) 3224 3225 /*Update elements from inputs: */ 3226 for(int j=0;j<newfemmodel->elements->Size();j++){ 3227 Element* element=xDynamicCast<Element*>(newfemmodel->elements->GetObjectByOffset(j)); 3228 switch(P0input_interp[i]){ 3229 case P0Enum: 3230 case DoubleInputEnum: 3231 element->AddInput(new DoubleInput(P0input_enums[i],vector[element->sid]));//sid because newfemmodel has just a partitioning 3232 break; 3233 case IntInputEnum: 3234 element->AddInput(new IntInput(P0input_enums[i],vector[element->sid]));//sid because newfemmodel has just a partitioning 3235 break; 3236 case BoolInputEnum: 3237 element->AddInput(new BoolInput(P0input_enums[i],vector[element->sid]));//sid because newfemmodel has just a partitioning 3238 break; 3239 default: 3240 _error_(EnumToStringx(P0input_enums[i])<<" Not supported yet"); 3241 } 3242 } 3243 3244 xDelete<IssmDouble>(vector); 3245 } 3246 3247 /*Insert P1 inputs into the new elements.*/ 3248 vector=NULL; 3249 for(int i=0;i<numP1inputs;i++){ 3250 3251 /*Get P0 input vector from the interpolated matrix*/ 3252 vector=xNew<IssmDouble>(numverticesnew); 3253 for(int j=0;j<numverticesnew;j++) vector[j]=P1inputsnew[j*numP1inputs+i];//vector has all vertices (serial) 3254 3255 /*Update elements from inputs: */ 3256 InputUpdateFromVectorx(newfemmodel,vector,P1input_enums[i],VertexSIdEnum);//VertexSId because vector is serial in SId indexing 3257 3258 xDelete<IssmDouble>(vector); 3259 } 3260 3261 /*Cleanup*/ 3262 xDelete<IssmDouble>(input_interpolations_serial); 3268 3263 xDelete<IssmDouble>(P0inputsold); 3269 3264 xDelete<IssmDouble>(P0inputsnew); 3265 xDelete<int>(P0input_enums); 3266 xDelete<int>(P0input_interp); 3270 3267 xDelete<IssmDouble>(P1inputsold); 3271 3268 xDelete<IssmDouble>(P1inputsnew); 3272 3273 _error_("STOP"); 3274 } 3275 /*}}}*/ 3276 void FemModel::ExecuteRefinement(int &newnumberofvertices,int &newnumberofelements,IssmDouble** newx,IssmDouble** newy,IssmDouble** newz,int** pnewelementslist){/*{{{*/ 3277 3278 int **newelements=NULL; 3279 int **newsegments=NULL; 3280 int newnumberofsegments=-1; 3281 3282 /*All indexing here is in C type: 0..n-1*/ 3283 int my_rank=IssmComm::GetRank(); 3284 const int elementswidth=3;//just 2D mesh, tria elements 3269 xDelete<int>(P1input_enums); 3270 xDelete<int>(P1input_interp); 3271 xDelete<IssmDouble>(Xold); 3272 xDelete<IssmDouble>(Yold); 3273 xDelete<IssmDouble>(Zold); 3274 xDelete<int>(Indexold); 3275 xDelete<IssmDouble>(Xnew); 3276 xDelete<IssmDouble>(Ynew); 3277 xDelete<IssmDouble>(Znew); 3278 xDelete<IssmDouble>(XC_new); 3279 xDelete<IssmDouble>(YC_new); 3280 xDelete<int>(Indexnew); 3281 3282 } 3283 /*}}}*/ 3284 void FemModel::ExecuteRefinement(int &numberofvertices,int &numberofelements,IssmDouble** px,IssmDouble** py,IssmDouble** pz,int** pelementslist){/*{{{*/ 3285 3286 /*elements is in Matlab indexing*/ 3287 3288 int my_rank = IssmComm::GetRank(); 3289 int numberofsegments = -1; 3290 IssmDouble* vx = NULL; //itapopo this is not being used 3291 IssmDouble* vy = NULL; //itapopo this is not being used 3292 IssmDouble* x = NULL; 3293 IssmDouble* y = NULL; 3294 IssmDouble* z = NULL; 3295 int* elementslist = NULL; 3296 int* segments = NULL; 3297 IssmDouble* masklevelset = NULL; 3298 const int elementswidth = this->GetElementsWidth();//just 2D mesh, tria elements 3285 3299 3286 3300 /*Solutions which will be used to refine the elements*/ 3287 IssmDouble* vx=NULL; //itapopo this is not being used3288 IssmDouble* vy=NULL; //itapopo this is not being used3289 IssmDouble* masklevelset=NULL;3290 int* newelementslist=NULL;3291 3292 3301 this->GetMaskLevelSet(&masklevelset);//itapopo verificar se já existe um método igual a esse 3293 3302 3294 int type_process=1; //1: it refines father mesh. See AdaptiveMeshRefinement.h (.cpp)3295 3303 if(my_rank==0){ 3296 this->amr->ExecuteRefinement(type_process,vx,vy,masklevelset,newnumberofvertices,newnumberofelements,newnumberofsegments,newx,newy,newz,&newelements,&newsegments); 3297 if(newnumberofvertices<=0 || newnumberofelements<=0 /*|| newnumberofsegments<=0*/) _error_("Error in the refinement process."); 3298 3299 // printf(" PRINTING COORDINATES... \n"); 3300 // for(int i=0;i<newnumberofvertices;i++) std::cout << "ID: " << i << "\t" << "X: " << newx[i] << "\t" << "Y: " << newy[i] << "\n"; 3301 // printf(" PRINTING ELEMENTS... \n"); 3302 // for(int i=0;i<newnumberofelements;i++) std::cout << "El: " << i << "\t" << newelements[i][0] << "\t" << newelements[i][1] << "\t" << newelements[i][2] << "\n"; 3303 } 3304 3305 /*Fill the element list to partitioning*/ 3306 if(my_rank==0){ 3307 newelementslist=xNew<int>(newnumberofelements*elementswidth); 3308 for(int i=0;i<newnumberofelements;i++){ //itapopo os elementos poderão sair do ExecuteRefinement nesse formato 3309 for(int j=0;j<elementswidth;j++){ 3310 newelementslist[elementswidth*i+j]=newelements[i][j]; //C indexing 3311 } 3312 } 3313 (*pnewelementslist)=newelementslist; 3314 } 3315 3316 /*Cleanup masklevetset*/ 3304 int type_process=1; //1: it refines father mesh. See AdaptiveMeshRefinement.h (.cpp) 3305 this->amr->ExecuteRefinement(type_process,vx,vy,masklevelset, 3306 numberofvertices,numberofelements,numberofsegments,&x,&y,&z,&elementslist,&segments); 3307 if(numberofvertices<=0 || numberofelements<=0 /*|| newnumberofsegments<=0*/) _error_("Error in the refinement process."); 3308 } 3309 else{ 3310 x=xNew<IssmDouble>(numberofvertices); 3311 y=xNew<IssmDouble>(numberofvertices); 3312 z=xNew<IssmDouble>(numberofvertices); 3313 elementslist=xNew<int>(numberofelements*this->GetElementsWidth()); 3314 } 3315 3316 /*Send new mesh to others CPU*/ 3317 ISSM_MPI_Bcast(&numberofvertices,1,ISSM_MPI_INT,0,IssmComm::GetComm()); 3318 ISSM_MPI_Bcast(&numberofelements,1,ISSM_MPI_INT,0,IssmComm::GetComm()); 3319 ISSM_MPI_Bcast(x,numberofvertices,ISSM_MPI_PDOUBLE,0,IssmComm::GetComm()); 3320 ISSM_MPI_Bcast(y,numberofvertices,ISSM_MPI_PDOUBLE,0,IssmComm::GetComm()); 3321 ISSM_MPI_Bcast(z,numberofvertices,ISSM_MPI_PDOUBLE,0,IssmComm::GetComm()); 3322 ISSM_MPI_Bcast(elementslist,numberofelements*this->GetElementsWidth(),ISSM_MPI_INT,0,IssmComm::GetComm()); 3323 3324 /*Assign the pointers*/ 3325 (*pelementslist) = elementslist; //Matlab indexing 3326 (*px) = x; 3327 (*py) = y; 3328 (*pz) = z; 3329 3330 /*Cleanup*/ 3331 if(segments) xDelete<int>(segments); 3317 3332 xDelete<IssmDouble>(masklevelset); 3333 3318 3334 } 3319 3335 /*}}}*/ 3320 3336 void FemModel::GetMaskLevelSet(IssmDouble **pmasklevelset){/*{{{*/ 3321 3337 3322 int elementswidth =3;//just 2D mesh, tria elements3323 int numberofelements =this->elements->NumberOfElements();3324 int numberofvertices =this->vertices->NumberOfVertices();3338 int elementswidth = this->GetElementsWidth();//just 2D mesh, tria elements 3339 int numberofelements = this->elements->NumberOfElements(); 3340 int numberofvertices = this->vertices->NumberOfVertices(); 3325 3341 3326 3342 IssmDouble* elementlevelset=xNew<IssmDouble>(elementswidth); … … 3352 3368 void FemModel::CreateVertices(int newnumberofvertices,int newnumberofelements,int elementswidth,int* newelementslist,int* my_vertices,IssmDouble* newx,IssmDouble* newy,IssmDouble* newz,Vertices* vertices){/*{{{*/ 3353 3369 3370 /*newelementslist is in Matlab indexing*/ 3371 3354 3372 /*Creating connectivity table*/ 3355 3373 int* connectivity=NULL; … … 3358 3376 for (int i=0;i<newnumberofelements;i++){ 3359 3377 for (int j=0;j<elementswidth;j++){ 3360 int vertexid = newelementslist[elementswidth*i+j]; //C indexing3361 _assert_(vertexid> -1 && vertexid<newnumberofvertices);3362 connectivity[vertexid ]+=1;3378 int vertexid = newelementslist[elementswidth*i+j]; 3379 _assert_(vertexid>0 && vertexid-1<newnumberofvertices);//Matlab indexing 3380 connectivity[vertexid-1]+=1;//Matlab to C indexing 3363 3381 } 3364 3382 } … … 3386 3404 /*}}}*/ 3387 3405 void FemModel::CreateElements(int newnumberofelements,int elementswidth,int* newelementslist,bool* my_elements,Elements* elements){/*{{{*/ 3406 3407 /*newlementslist is in Matlab indexing*/ 3388 3408 3389 3409 for(int i=0;i<newnumberofelements;i++){ … … 3410 3430 /*retrieve vertices ids*/ 3411 3431 int* vertex_ids=xNew<int>(elementswidth); 3412 for(int j=0;j<elementswidth;j++) vertex_ids[j]=reCast<int>(newelementslist[elementswidth*i+j]) +1;//this Hook wants Matlab indexing3432 for(int j=0;j<elementswidth;j++) vertex_ids[j]=reCast<int>(newelementslist[elementswidth*i+j]);//this Hook wants Matlab indexing 3413 3433 /*Setting the hooks*/ 3414 3434 newtria->numanalyses =this->nummodels; … … 3426 3446 } 3427 3447 3428 //itapopo there is this line in CreateElementsVerticesAndMaterials.3429 //elements->InputDuplicate(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);3430 3448 } 3431 3449 /*}}}*/ … … 3441 3459 /*Add new constant material property to materials, at the end: */ 3442 3460 Matpar *newmatpar=static_cast<Matpar*>(this->materials->GetObjectByOffset(this->materials->Size()-1)->copy()); 3461 newmatpar->mid = newnumberofelements+1;//itapopo testando 3443 3462 materials->AddObject(newmatpar);//put it at the end of the materials 3444 3463 … … 3448 3467 3449 3468 int lid=0; 3450 //itapopo use the GetMesh!!3451 3469 for(int j=0;j<newnumberofvertices;j++){ 3452 3470 if(my_vertices[j]){ … … 3497 3515 3498 3516 int numberofvertices, numberofelements; 3499 int elementswidth = 3; //itapopojust 2D mesh in this version (just tria elements)3517 int elementswidth = this->GetElementsWidth(); // just 2D mesh in this version (just tria elements) 3500 3518 IssmDouble *x = NULL; 3501 3519 IssmDouble *y = NULL; … … 3538 3556 if(numberofelements*elementswidth<0) _error_("numberofelements negative."); 3539 3557 for(int i=0;i<numberofelements;i++){ 3540 std::cout << (int)id1[i]+1 << " " << (int)id2[i]+1 <<" " << (int)id3[i]+1 << std::endl;3541 3558 elementslist[elementswidth*i+0] = (int)id1[i]+1; //InterpMesh wants Matlab indexing 3542 3559 elementslist[elementswidth*i+1] = (int)id2[i]+1; //InterpMesh wants Matlab indexing … … 3548 3565 *py = y; 3549 3566 *pz = z; 3550 *pelementslist = elementslist; 3551 } 3552 /*}}}*/ 3553 void FemModel::CreateConstraints(int newnumberofvertices,int newnumberofelements,int* newelementslist,IssmDouble* newx,IssmDouble* newy,int* my_vertices,Constraints* constraints){/*{{{*/ 3567 *pelementslist = elementslist; //Matlab indexing. InterMesh uses this type. 3568 3569 /*Cleanup*/ 3570 xDelete<int>(elem_vertices); 3571 xDelete<IssmDouble>(id1); 3572 xDelete<IssmDouble>(id2); 3573 xDelete<IssmDouble>(id3); 3574 delete vid1; 3575 delete vid2; 3576 delete vid3; 3577 } 3578 /*}}}*/ 3579 void FemModel::CreateConstraints(int newnumberofvertices,int newnumberofelements,IssmDouble* newx,IssmDouble* newy,int* my_vertices,Constraints* constraints){/*{{{*/ 3554 3580 3555 3581 /*Get x and y of the mesh i-1*/ 3556 int numberofvertices, numberofelements; 3557 numberofvertices = this->vertices->NumberOfVertices(); 3558 numberofelements = this->elements->NumberOfElements(); 3559 3560 /*Get vertices coordinates*/ 3561 IssmDouble *x = NULL; 3562 IssmDouble *y = NULL; 3563 IssmDouble *z = NULL; 3564 VertexCoordinatesx(&x, &y, &z, this->vertices,false) ; 3565 3566 /*Get element vertices*/ 3567 int elementswidth = 3; //just 2D mesh in this version (just tria elements) 3568 int* elem_vertices=xNew<int>(elementswidth); 3569 Vector<IssmDouble>* vid1= new Vector<IssmDouble>(numberofelements); 3570 Vector<IssmDouble>* vid2= new Vector<IssmDouble>(numberofelements); 3571 Vector<IssmDouble>* vid3= new Vector<IssmDouble>(numberofelements); 3572 3573 /*Go through elements, and for each element, get vertices*/ 3574 for(int i=0;i<this->elements->Size();i++){ 3575 Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i)); 3576 element->GetVerticesSidList(elem_vertices); 3577 vid1->SetValue(element->sid,elem_vertices[0],INS_VAL); 3578 vid2->SetValue(element->sid,elem_vertices[1],INS_VAL); 3579 vid3->SetValue(element->sid,elem_vertices[2],INS_VAL); 3580 } 3581 3582 /*Assemble*/ 3583 vid1->Assemble(); 3584 vid2->Assemble(); 3585 vid3->Assemble(); 3586 3587 /*Serialize*/ 3588 IssmDouble *id1 = vid1->ToMPISerial(); 3589 IssmDouble *id2 = vid2->ToMPISerial(); 3590 IssmDouble *id3 = vid3->ToMPISerial(); 3591 3592 /*Construct elements list (mesh i-1)*/ 3593 int* elementslist=NULL; 3594 elementslist=xNew<int>(numberofelements*elementswidth); 3595 for(int i=0;i<numberofelements;i++){ //itapopo os elementos poderão sair do ExecuteRefinement nesse formato 3596 elementslist[elementswidth*i+0] = (int)id1[i]+1; //InterpMesh wants Matlab indexing 3597 elementslist[elementswidth*i+1] = (int)id2[i]+1; //InterpMesh wants Matlab indexing 3598 elementslist[elementswidth*i+2] = (int)id3[i]+1; //InterpMesh wants Matlab indexinf 3599 } 3600 3582 int my_rank = IssmComm::GetRank(); 3583 int numberofvertices = this->vertices->NumberOfVertices(); 3584 int numberofelements = this->elements->NumberOfElements(); 3585 IssmDouble *x = NULL; 3586 IssmDouble *y = NULL; 3587 IssmDouble *z = NULL; 3588 int *elementslist = NULL; 3589 3590 /*elementslist is in Matlab indexing*/ 3591 this->GetMesh(this,&x,&y,&z,&elementslist); 3592 3601 3593 /*itapopo ATTENTION: JUST SPCVX AND SPCVY TO TEST!!!*/ 3602 3594 /*OTHERS CONSTRAINTS MUST BE IMPLEMENTED!!!*/ … … 3645 3637 3646 3638 /*Serialize*/ 3647 spcvx=vspcvx->ToMPISerial(); 3648 spcvy=vspcvy->ToMPISerial(); 3649 spcvxflag=vspcvxflag->ToMPISerial(); 3650 spcvyflag=vspcvyflag->ToMPISerial(); 3651 /*Free the data*/ 3652 delete vspcvx; 3653 delete vspcvy; 3654 delete vspcvxflag; 3655 delete vspcvyflag; 3656 3657 IssmDouble *newspcvx=NULL; 3658 IssmDouble *newspcvy=NULL; 3659 IssmDouble *newspcvxflag=NULL; 3660 IssmDouble *newspcvyflag=NULL; 3661 int nods_data=numberofvertices; 3662 int nels_data=numberofelements; 3663 int M_data=numberofvertices; 3664 int N_data=1; 3665 int N_interp=newnumberofvertices; 3666 Options *options=new Options(); 3639 spcvx = vspcvx->ToMPISerial(); 3640 spcvy = vspcvy->ToMPISerial(); 3641 spcvxflag = vspcvxflag->ToMPISerial(); 3642 spcvyflag = vspcvyflag->ToMPISerial(); 3643 3644 IssmDouble *newspcvx = NULL; 3645 IssmDouble *newspcvy = NULL; 3646 IssmDouble *newspcvxflag = NULL; 3647 IssmDouble *newspcvyflag = NULL; 3648 int nods_data = numberofvertices; 3649 int nels_data = numberofelements; 3650 int M_data = numberofvertices; 3651 int N_data = 1; 3652 int N_interp = newnumberofvertices; 3667 3653 3668 3654 /*Interpolate spcvx and spcvy in the new mesh*/ 3669 InterpFromMeshToMesh2dx(&newspcvx,elementslist,x,y,nods_data,nels_data,spcvx,M_data,N_data,newx,newy,N_interp, options);3670 InterpFromMeshToMesh2dx(&newspcvy,elementslist,x,y,nods_data,nels_data,spcvy,M_data,N_data,newx,newy,N_interp, options);3671 InterpFromMeshToMesh2dx(&newspcvxflag,elementslist,x,y,nods_data,nels_data,spcvxflag,M_data,N_data,newx,newy,N_interp, options);3672 InterpFromMeshToMesh2dx(&newspcvyflag,elementslist,x,y,nods_data,nels_data,spcvyflag,M_data,N_data,newx,newy,N_interp, options);3655 InterpFromMeshToMesh2dx(&newspcvx,elementslist,x,y,nods_data,nels_data,spcvx,M_data,N_data,newx,newy,N_interp,NULL); 3656 InterpFromMeshToMesh2dx(&newspcvy,elementslist,x,y,nods_data,nels_data,spcvy,M_data,N_data,newx,newy,N_interp,NULL); 3657 InterpFromMeshToMesh2dx(&newspcvxflag,elementslist,x,y,nods_data,nels_data,spcvxflag,M_data,N_data,newx,newy,N_interp,NULL); 3658 InterpFromMeshToMesh2dx(&newspcvyflag,elementslist,x,y,nods_data,nels_data,spcvyflag,M_data,N_data,newx,newy,N_interp,NULL); 3673 3659 3674 3660 int nodecounter = 0; //itapopo deve começar pelo primeiro nó do StressbalanceAnalysis … … 3696 3682 count++; 3697 3683 } 3698 3699 } 3684 } 3685 3686 /*Cleanup*/ 3687 xDelete<IssmDouble>(x); 3688 xDelete<IssmDouble>(y); 3689 xDelete<IssmDouble>(z); 3690 xDelete<int>(elementslist); 3691 xDelete<IssmDouble>(spcvx); 3692 xDelete<IssmDouble>(spcvy); 3693 xDelete<IssmDouble>(spcvxflag); 3694 xDelete<IssmDouble>(spcvyflag); 3695 xDelete<IssmDouble>(newspcvx); 3696 xDelete<IssmDouble>(newspcvy); 3697 xDelete<IssmDouble>(newspcvxflag); 3698 xDelete<IssmDouble>(newspcvyflag); 3699 delete vspcvx; 3700 delete vspcvy; 3701 delete vspcvxflag; 3702 delete vspcvyflag; 3703 3700 3704 } 3701 3705 /*}}}*/ 3702 3706 void FemModel::UpdateElements(int newnumberofelements,int* newelementslist,bool* my_elements,int nodecounter,int analysis_counter,Elements* newelements){/*{{{*/ 3707 3708 /*newelementslist is in Matlab indexing*/ 3703 3709 3704 3710 /*Update elements, set hnode. … … 3712 3718 int numnodes=3; 3713 3719 int* tria_node_ids=xNew<int>(numnodes); 3714 tria_node_ids[0]=nodecounter+newelementslist[3*iel+0] +1; //matlab indexing3715 tria_node_ids[1]=nodecounter+newelementslist[3*iel+1] +1; //matlab indexing3716 tria_node_ids[2]=nodecounter+newelementslist[3*iel+2] +1; //matlab indexing3720 tria_node_ids[0]=nodecounter+newelementslist[3*iel+0]; //matlab indexing 3721 tria_node_ids[1]=nodecounter+newelementslist[3*iel+1]; //matlab indexing 3722 tria_node_ids[2]=nodecounter+newelementslist[3*iel+2]; //matlab indexing 3717 3723 tria->SetHookNodes(tria_node_ids,numnodes,analysis_counter); tria->nodes=NULL; 3718 3724 xDelete<int>(tria_node_ids); … … 3725 3731 void FemModel::ElementsAndVerticesPartitioning(int& newnumberofvertices,int& newnumberofelements,int& elementswidth,int* newelementslist,bool** pmy_elements,int** pmy_vertices){/*{{{*/ 3726 3732 3727 int *epart=NULL; //element partitioning. 3728 int *npart=NULL; //node partitioning. 3729 int edgecut=1; 3730 int numflag=0; 3731 int etype=1; 3732 int my_rank = IssmComm::GetRank(); 3733 int numprocs=IssmComm::GetSize(); 3734 bool *my_elements=NULL; 3735 int *my_vertices=NULL; 3733 /*newelementslist come in Matlab indexing*/ 3734 3735 int *epart = NULL; //element partitioning. 3736 int *npart = NULL; //node partitioning. 3737 int *index = NULL; //elements in C indexing 3738 int edgecut = 1; 3739 int numflag = 0; 3740 int etype = 1; 3741 int my_rank = IssmComm::GetRank(); 3742 int numprocs = IssmComm::GetSize(); 3743 bool *my_elements = NULL; 3744 int *my_vertices = NULL; 3736 3745 3737 3746 _assert_(newnumberofvertices>0); … … 3739 3748 epart=xNew<int>(newnumberofelements); 3740 3749 npart=xNew<int>(newnumberofvertices); 3750 index=xNew<int>(elementswidth*newnumberofelements); 3751 3752 for (int i=0;i<newnumberofelements;i++){ 3753 for (int j=0;j<elementswidth;j++){ 3754 *(index+elementswidth*i+j)=(*(newelementslist+elementswidth*i+j))-1; //-1 for C indexing in Metis 3755 } 3756 } 3741 3757 3742 3758 /*Partition using Metis:*/ 3743 3759 if (numprocs>1){ 3744 3760 #ifdef _HAVE_METIS_ 3745 METIS_PartMeshNodalPatch(&newnumberofelements,&newnumberofvertices, newelementslist, &etype, &numflag, &numprocs, &edgecut, epart, npart);3761 METIS_PartMeshNodalPatch(&newnumberofelements,&newnumberofvertices, index, &etype, &numflag, &numprocs, &edgecut, epart, npart); 3746 3762 #else 3747 3763 _error_("metis has not beed installed. Cannot run with more than 1 cpu"); … … 3770 3786 will hold which vertices belong to this partition*/ 3771 3787 for(int j=0;j<elementswidth;j++){ 3772 _assert_(newelementslist[elementswidth*i+j] <newnumberofvertices);3773 my_vertices[newelementslist[elementswidth*i+j] ]=1;3788 _assert_(newelementslist[elementswidth*i+j]-1<newnumberofvertices);//newelementslist is in Matlab indexing 3789 my_vertices[newelementslist[elementswidth*i+j]-1]=1;//newelementslist is in Matlab indexing 3774 3790 } 3775 3791 } 3776 3792 } 3793 3794 /*Assign output pointers:*/ 3795 *pmy_elements=my_elements; 3796 *pmy_vertices=my_vertices; 3777 3797 3778 3798 /*Free ressources:*/ 3779 3799 xDelete<int>(epart); 3780 3800 xDelete<int>(npart); 3781 3782 /*Assign output pointers:*/ 3783 *pmy_elements=my_elements; 3784 *pmy_vertices=my_vertices; 3801 xDelete<int>(index); 3785 3802 3786 3803 } -
issm/trunk-jpl/src/c/classes/FemModel.h
r21524 r21528 150 150 FemModel* ReMesh(void); 151 151 void GetMesh(FemModel* femmodel,IssmDouble** px, IssmDouble** py, IssmDouble** pz, int** pelementslist); 152 void ExecuteRefinement(int &newnumberofvertices,int &newnumberofelements,IssmDouble** newx,IssmDouble** newy,IssmDouble** newz,int** newelementslist); 152 int GetElementsWidth(){return 3;};//just tria elements in this first version 153 void ExecuteRefinement(int &numberofvertices,int &numberofelements,IssmDouble** px,IssmDouble** py,IssmDouble** pz,int** pelementslist); 153 154 void GetMaskLevelSet(IssmDouble** pmasklevelset); 154 155 void CreateVertices(int newnumberofvertices,int newnumberofelements,int elementswidth,int* newelementslist,int* my_vertices,IssmDouble* newx,IssmDouble* newy,IssmDouble* newz,Vertices* vertices); … … 156 157 void CreateMaterials(int newnumberofelements,bool* my_elements,Materials* materials); 157 158 void CreateNodes(int newnumberofvertices,int* my_vertices,int nodecounter,int analysis_enum,Nodes* nodes); 158 void CreateConstraints(int newnumberofvertices,int newnumberofelements, int* newelementslist,IssmDouble* newx,IssmDouble* newy,int* my_vertices,Constraints* constraints);159 void CreateConstraints(int newnumberofvertices,int newnumberofelements,IssmDouble* newx,IssmDouble* newy,int* my_vertices,Constraints* constraints); 159 160 void InterpolateInputs(FemModel* femmodel); 160 161 void UpdateElements(int newnumberofelements,int* newelementslist,bool* my_elements,int nodecounter,int analysis_counter,Elements* newelements);
Note:
See TracChangeset
for help on using the changeset viewer.