1 // Copyright (C) 2007-2015 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #include "MEDPARTITIONERTest.hxx"
22 #include "MEDPARTITIONER_MeshCollection.hxx"
23 #include "MEDPARTITIONER_ParallelTopology.hxx"
24 #include "MEDPARTITIONER_ParaDomainSelector.hxx"
25 #include "MEDPARTITIONER_Utils.hxx"
27 #include "CellModel.hxx"
28 #include "MEDFileMesh.hxx"
29 #include "MEDLoader.hxx"
30 #include "MEDLoaderBase.hxx"
31 #include "MEDCouplingUMesh.hxx"
32 #include "MEDCouplingMappedExtrudedMesh.hxx"
33 #include "MEDCouplingFieldDouble.hxx"
34 #include "MEDCouplingMemArray.hxx"
35 #include "MEDCouplingMultiFields.hxx"
37 #include <cppunit/TestAssert.h>
48 #define getcwd _getcwd
58 using namespace MEDCoupling;
59 using namespace MEDPARTITIONER;
61 void MEDPARTITIONERTest::setSize(int ni, int nj, int nk)
63 this->_ni=ni; //nb of hexa9
66 this->_ntot=_ni*_nj*_nk;
67 string ijk=IntToStr(ni)+"x"+IntToStr(nj)+"x"+IntToStr(nk);
68 this->_file_name="tmp_testMesh_"+ijk+".med";
69 this->_file_name_with_faces="tmp_testMeshWithFaces_"+ijk+".med";
70 string ij=IntToStr(ni)+"x"+IntToStr(nj);
71 this->_file_name2="tmp_testMesh_"+ij+".med";
72 this->_mesh_name="testMesh";
75 void MEDPARTITIONERTest::setSmallSize()
77 setSize(2,3,5); //nb of hexa9
80 void MEDPARTITIONERTest::setMedianSize()
82 setSize(20,30,50); //nb of hexa9
85 void MEDPARTITIONERTest::setbigSize()
87 setSize(200,300,500); //nb of hexa9
90 std::string MEDPARTITIONERTest::getPartitionerExe() const
93 if ( getenv("MEDCOUPLING_ROOT_DIR") )
95 execName=getenv("MEDCOUPLING_ROOT_DIR"); //.../INSTALL/MED
96 execName+="/bin/medpartitioner";
97 std::ifstream my_file(execName);
101 execName = getcwd(NULL, 0);
102 execName += "/../../MEDPartitioner/medpartitioner";
103 if (! std::ifstream(execName.c_str()))
104 CPPUNIT_FAIL("Can't find medpartitioner, please set MEDCOUPLING_ROOT_DIR");
108 // ============================================================================
110 * Set up the environment called at every CPPUNIT_TEST ()
112 // ============================================================================
113 void MEDPARTITIONERTest::setUp()
116 #if defined(HAVE_MPI)
117 if (MyGlobals::_Rank==-1) //do once only
120 MPI_Comm_size(MPI_COMM_WORLD, &MyGlobals::_World_Size);
121 MPI_Comm_rank(MPI_COMM_WORLD, &MyGlobals::_Rank);
124 //sequential : no MPI
125 MyGlobals::_World_Size=1;
131 #if defined(HAVE_MPI)
132 cout<<"\ndefined(HAVE_MPI)"<<endl;
134 cout<<"\nNOT defined(HAVE_MPI)"<<endl;
136 #if defined(MED_ENABLE_PARMETIS)
137 cout<<"defined(MED_ENABLE_PARMETIS)"<<endl;
139 cout<<"NOT defined(MED_ENABLE_PARMETIS)"<<endl;
141 #if defined(MED_ENABLE_METIS)
142 cout<<"defined(MED_ENABLE_METIS)"<<endl;
144 cout<<"NOT defined(MED_ENABLE_METIS)"<<endl;
146 #if defined(MED_ENABLE_SCOTCH)
147 cout<<"defined(MED_ENABLE_SCOTCH)"<<endl;
149 cout<<"NOT defined(MED_ENABLE_SCOTCH)"<<endl;
154 // ============================================================================
158 // ============================================================================
159 void MEDPARTITIONERTest::tearDown()
163 MEDCoupling::MEDCouplingUMesh * MEDPARTITIONERTest::buildCUBE3DMesh()
168 for (int k=0; k<=_nk; k++)
169 for (int j=0; j<=_nj; j++)
170 for (int i=0; i<=_ni; i++)
172 coor.push_back(i+.1);
173 coor.push_back(j+.2);
174 coor.push_back(k+.3);
177 for (int k=0; k<_nk; k++)
178 for (int j=0; j<_nj; j++)
179 for (int i=0; i<_ni; i++)
181 ii=i + j*(_ni+1) + k*(_ni+1)*(_nj+1);
183 conn.push_back(ii+1);
186 conn.push_back(ii-1);
188 ii=i + j*(_ni+1) + (k+1)*(_ni+1)*(_nj+1);
190 conn.push_back(ii+1);
193 conn.push_back(ii-1);
197 if (_verbose) //only for debug
199 cout<< "\nnb coor " << (_ni+1)*(_nj+1)*(_nk+1)*3 << " " << coor.size() << endl;
200 for (int i=0; i<(int)coor.size(); i++)
201 cout << coor[i] << " ";
203 cout << "\nnb conn " << (_ni)*(_nj)*(_nk)*8 << " " << conn.size() << endl;
204 for (int i=0; i<(int)conn.size(); i=i+8)
206 for (int j=0; j<8; j++)
207 cout << conn[i+j] << " ";
214 MEDCouplingUMesh *mesh=MEDCouplingUMesh::New();
215 mesh->setMeshDimension(3);
216 int nbc=conn.size()/8; //nb of cells
217 int nbv=coor.size()/3; //nb of vertices
218 mesh->allocateCells(nbc);
219 for(int i=0; i<nbc; i++)
222 std::copy(conn.begin()+i*8,conn.begin()+(i+1)*8,onehexa);
223 if (false) //(_verbose)
225 for (int j=0; j<8; j++) cout<<onehexa[j]<<" ";
228 mesh->insertNextCell(INTERP_KERNEL::NORM_HEXA8,8,onehexa);
230 mesh->finishInsertingCells();
231 DataArrayDouble *myCoords=DataArrayDouble::New();
232 myCoords->alloc(nbv,3);
233 std::copy(coor.begin(),coor.end(),myCoords->getPointer());
234 mesh->setCoords(myCoords);
235 mesh->setName(_mesh_name.c_str());
237 mesh->checkConsistencyLight();
241 MEDCoupling::MEDCouplingUMesh * MEDPARTITIONERTest::buildCARRE3DMesh()
242 //only quad4 in oblique (k=j)
246 for (int j=0; j<=_nj; j++)
247 for (int i=0; i<=_ni; i++)
250 coor.push_back(i+.1);
251 coor.push_back(j+.2);
252 coor.push_back(k+.3);
256 for (int j=0; j<_nj; j++)
257 for (int i=0; i<_ni; i++)
259 ii=i + j*(_ni+1) + k*(_ni+1)*(_nj+1);
261 conn.push_back(ii+1);
264 conn.push_back(ii-1);
267 if (false) //(_verbose)
269 cout<<"\nnb coor "<<(_ni+1)*(_nj+1)*3<<" "<<coor.size()<<endl;
270 for (int i=0; i<(int)coor.size(); i++)
271 cout << coor[i] << " ";
273 cout<<"\nnb conn "<<(_ni)*(_nj)*4<<" "<<conn.size()<<endl;
274 for (int i=0; i<(int)conn.size(); i=i+4)
276 for (int j=0; j<4; j++) cout<<conn[i+j]<<" ";
282 MEDCouplingUMesh *mesh=MEDCouplingUMesh::New();
283 mesh->setMeshDimension(2);
284 int nbc=conn.size()/4; //nb of cells
285 int nbv=coor.size()/3; //nb of vertices
286 mesh->allocateCells(nbc);
287 for(int i=0; i<nbc; i++)
290 std::copy(conn.begin()+i*4,conn.begin()+(i+1)*4,onequa);
291 if (false) //(_verbose)
293 for (int j=0; j<4; j++) cout<<onequa[j]<<" ";
296 mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,onequa);
298 mesh->finishInsertingCells();
299 DataArrayDouble *myCoords=DataArrayDouble::New();
300 myCoords->alloc(nbv,3);
301 std::copy(coor.begin(),coor.end(),myCoords->getPointer());
302 mesh->setCoords(myCoords);
303 mesh->setName(_mesh_name.c_str());
305 mesh->checkConsistencyLight();
309 MEDCoupling::MEDCouplingUMesh * MEDPARTITIONERTest::buildFACE3DMesh()
310 //only quad4 on a global face of the CUBE3D (k=0)
314 for (int j=0; j<=_nj; j++)
315 for (int i=0; i<=_ni; i++)
318 coor.push_back(i+.1);
319 coor.push_back(j+.2);
320 coor.push_back(k+.3);
324 for (int j=0; j<_nj; j++)
325 for (int i=0; i<_ni; i++)
327 ii=i + j*(_ni+1) + k*(_ni+1)*(_nj+1);
329 conn.push_back(ii+1);
332 conn.push_back(ii-1);
335 if (false) //(_verbose)
337 cout<<"\nnb coor "<<(_ni+1)*(_nj+1)*3<<" "<<coor.size()<<endl;
338 for (int i=0; i<(int)coor.size(); i++)
339 cout << coor[i] << " ";
341 cout<<"\nnb conn "<<(_ni)*(_nj)*4<<" "<<conn.size()<<endl;
342 for (int i=0; i<(int)conn.size(); i=i+4)
344 for (int j=0; j<4; j++)
345 cout << conn[i+j] << " ";
351 MEDCouplingUMesh *mesh=MEDCouplingUMesh::New();
352 mesh->setMeshDimension(2);
353 int nbc=conn.size()/4; //nb of cells
354 int nbv=coor.size()/3; //nb of vertices
355 mesh->allocateCells(nbc);
356 for(int i=0; i<nbc; i++)
359 std::copy(conn.begin()+i*4,conn.begin()+(i+1)*4,onequa);
360 if (false) //(_verbose)
362 for (int j=0; j<4; j++) cout<<onequa[j]<<" ";
365 mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,onequa);
367 mesh->finishInsertingCells();
368 DataArrayDouble *myCoords=DataArrayDouble::New();
369 myCoords->alloc(nbv,3);
370 std::copy(coor.begin(),coor.end(),myCoords->getPointer());
371 mesh->setCoords(myCoords);
372 mesh->setName(_mesh_name.c_str());
374 mesh->checkConsistencyLight();
378 MEDCouplingFieldDouble * MEDPARTITIONERTest::buildVecFieldOnCells(string myfileName)
380 //int ni=2,nj=3,nk=5; //nb of hexa9
381 vector<double> field;
382 for (int k=0; k<_nk; k++)
383 for (int j=0; j<_nj; j++)
384 for (int i=0; i<_ni; i++)
386 field.push_back(i+.1);
387 field.push_back(j+.2);
388 field.push_back(k+.3);
391 MEDCouplingUMesh *mesh=ReadUMeshFromFile(myfileName.c_str(),_mesh_name.c_str(),0);
392 int nbOfCells=mesh->getNumberOfCells();
393 MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,ONE_TIME);
394 f1->setName("VectorFieldOnCells");
395 f1->setDescription("DescriptionOfFieldOnCells"); //not saved in file?
397 DataArrayDouble *myField=DataArrayDouble::New();
398 myField->alloc(nbOfCells,3);
399 std::copy(field.begin(),field.end(),myField->getPointer());
400 f1->setArray(myField);
401 myField->setInfoOnComponent(0,"vx");
402 myField->setInfoOnComponent(1,"vy");
403 myField->setInfoOnComponent(2,"vz");
406 f1->checkConsistencyLight();
411 MEDCouplingFieldDouble * MEDPARTITIONERTest::buildVecFieldOnNodes()
413 //int ni=2,nj=3,nk=5; //nb of hexa9
414 vector<double> field;
415 for (int k=0; k<=_nk; k++)
416 for (int j=0; j<=_nj; j++)
417 for (int i=0; i<=_ni; i++)
419 field.push_back(i+.1);
420 field.push_back(j+.2);
421 field.push_back(k+.3);
424 MEDCouplingUMesh *mesh=ReadUMeshFromFile(_file_name.c_str(),_mesh_name.c_str(),0);
425 int nbOfNodes=mesh->getNumberOfNodes();
426 MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_NODES,ONE_TIME);
427 f1->setName("VectorFieldOnNodes");
428 f1->setDescription("DescriptionOfFieldOnNodes"); //not saved in file?
430 DataArrayDouble *myField=DataArrayDouble::New();
431 myField->alloc(nbOfNodes,3);
432 std::copy(field.begin(),field.end(),myField->getPointer());
433 f1->setArray(myField);
434 myField->setInfoOnComponent(0,"vx");
435 myField->setInfoOnComponent(1,"vy");
436 myField->setInfoOnComponent(2,"vz");
439 f1->checkConsistencyLight();
445 void MEDPARTITIONERTest::createTestMeshWithoutField()
448 MEDCouplingUMesh * mesh = buildCUBE3DMesh();
449 WriteUMesh(_file_name.c_str(),mesh,true);
450 if (_verbose) cout<<endl<<_file_name<<" created"<<endl;
451 if (_ntot<1000000) //too long
453 MEDCouplingUMesh *mesh_rw=ReadUMeshFromFile(_file_name.c_str(),mesh->getName().c_str(),0);
454 if (_verbose) cout<<_file_name<<" reread"<<endl;
455 CPPUNIT_ASSERT(mesh->isEqual(mesh_rw,1e-12));
462 vector<const MEDCoupling::MEDCouplingUMesh*> meshes;
463 MEDCouplingUMesh * mesh1 = buildCUBE3DMesh();
464 MEDCouplingUMesh * mesh2 = buildFACE3DMesh();
465 mesh1->setName("testMesh");
466 mesh2->setName("theFaces");
467 mesh2->tryToShareSameCoordsPermute(*mesh1, 1e-9);
468 mesh2->checkConsistencyLight();
469 mesh1->checkConsistencyLight();
470 meshes.push_back(mesh1);
471 meshes.push_back(mesh2);
472 WriteUMeshes(_file_name_with_faces.c_str(), meshes, true);
474 MEDCoupling::MEDFileUMesh* mfm=MEDCoupling::MEDFileUMesh::New(_file_name_with_faces.c_str(), mesh1->getName().c_str());
475 DataArrayInt* FacesFam=DataArrayInt::New();
476 FacesFam->alloc(mfm->getSizeAtLevel(-1),1);
477 FacesFam->fillWithValue(-1);
478 DataArrayInt* CellsFam=DataArrayInt::New();
479 CellsFam->alloc(mfm->getSizeAtLevel(0),1);
480 CellsFam->fillWithValue(1);
481 mfm->setFamilyFieldArr(-1,FacesFam);
482 mfm->setFamilyFieldArr(0,CellsFam);
483 map<string,int> theFamilies;
484 theFamilies["FAMILLE_ZERO"]=0;
485 theFamilies["FamilyFaces"]=-1;
486 theFamilies["FamilyCells"]=1;
487 map<string, vector<string> > theGroups;
488 theGroups["GroupFaces"].push_back("FamilyFaces");
489 theGroups["GroupCells"].push_back("FamilyCells");
490 mfm->setFamilyInfo(theFamilies);
491 mfm->setGroupInfo(theGroups);
492 mfm->write(_file_name_with_faces.c_str(),0);
496 /*ce truc marche pas!
497 MEDCoupling::MEDFileUMesh* mfm=MEDCoupling::MEDFileUMesh::New(_file_name_with_faces.c_str(), mesh1->getName());
498 vector<const MEDCoupling::MEDCouplingUMesh*> ms;
500 mfm->setGroupsFromScratch(-1, ms);
501 mfm->write(_file_name_with_faces.c_str(),0);
504 if (_verbose) cout<<endl<<_file_name_with_faces<<" created"<<endl;
505 if (_ntot<1000000) //too long
507 MEDCouplingUMesh *mesh_rw=ReadUMeshFromFile(_file_name_with_faces.c_str(),mesh1->getName().c_str(),0);
508 if (_verbose) cout<<_file_name_with_faces<<" reread"<<endl;
509 CPPUNIT_ASSERT(mesh1->isEqual(mesh_rw,1e-12));
518 MEDCouplingUMesh * mesh = buildCARRE3DMesh();
519 WriteUMesh(_file_name2.c_str(),mesh,true);
520 if (_verbose) cout<<endl<<_file_name2<<" created"<<endl;
521 MEDCouplingUMesh *mesh_rw=ReadUMeshFromFile(_file_name2.c_str(),mesh->getName().c_str(),0);
522 if (_verbose) cout<<_file_name2<<" reread"<<endl;
523 CPPUNIT_ASSERT(mesh->isEqual(mesh_rw,1e-12));
530 create a set of nbx*nby*nbz files mesh of ni*ny*nz cells
532 void MEDPARTITIONERTest::createHugeTestMesh(int ni, int nj, int nk, int nbx, int nby, int nbz, int nbTarget)
535 _nb_target_huge=nbTarget;
536 MEDCouplingUMesh * mesh = buildCUBE3DMesh();
537 //int nbx=1, nby=1, nbz=2;
538 std::vector< double > cooDep,cooFin;
539 mesh->getCoordinatesOfNode(0, cooDep);
540 mesh->getCoordinatesOfNode(mesh->getNumberOfNodes()-1, cooFin);
541 //cout<<endl<<cooDep[0]<<" "<<cooDep[1]<<" "<<cooDep[2]<<endl;
542 //cout<<cooFin[0]<<" "<<cooFin[1]<<" "<<cooFin[2]<<endl;
545 <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n \
547 <version maj=\"2\" min=\"3\" ver=\"1\"/>\n \
548 <description what=\"\" when=\"YYMMDDHHmm\"/>\n \
550 <mesh name=\"testMesh\"/>\n \
553 <subdomain number=\"$subdomainNumber\"/>\n \
554 <global_numbering present=\"no\"/>\n \
556 <files>\n$tagSubfile \
558 <mapping>\n$tagMesh \
562 string tagSubfiles, tagSubfile="\
563 <subfile id=\"$xyz\">\n \
564 <name>$fileName</name>\n \
565 <machine>localhost</machine>\n \
567 string tagMeshes, tagMesh="\
568 <mesh name=\"testMesh\">\n \
569 <chunk subdomain=\"$xyz\">\n \
570 <name>testMesh</name>\n \
576 DataArrayDouble* coordsInit=mesh->getCoords()->deepCopy();
577 double* ptrInit=coordsInit->getPointer();
578 double deltax=cooFin[0]-cooDep[0];
579 double deltay=cooFin[1]-cooDep[1];
580 double deltaz=cooFin[2]-cooDep[2];
583 for (int z=0; z<nbz; z++)
586 for (int y=0; y<nby; y++)
589 for (int x=0; x<nbx; x++)
593 fileName="tmp_testMeshHuge_"+IntToStr(_ni)+"x"+IntToStr(_nj)+"x"+IntToStr(_nk)+"_"+sxyz+".med";
595 DataArrayDouble* coords=mesh->getCoords();
596 //int nbOfComp=coords->getNumberOfComponents(); //be 3D
597 int nbOfTuple=coords->getNumberOfTuples();
598 double* ptr=coords->getPointer();
599 double* ptrini=ptrInit;
600 for (int i=0; i<nbOfTuple; i++)
602 *ptr=(*ptrini)+dx; ptr++; ptrini++; //be 3D
603 *ptr=(*ptrini)+dy; ptr++; ptrini++;
604 *ptr=(*ptrini)+dz; ptr++; ptrini++;
607 WriteUMesh(fileName.c_str(),mesh,true);
609 tagSubfiles+=tagSubfile;
610 tagSubfiles.replace(tagSubfiles.find("$xyz"),4,sxyz);
611 tagSubfiles.replace(tagSubfiles.find("$fileName"),9,fileName);
614 tagMeshes.replace(tagMeshes.find("$xyz"),4,sxyz);
622 coordsInit->decrRef();
624 tagXml.replace(tagXml.find("$subdomainNumber"),16,sxyz);
625 tagXml.replace(tagXml.find("$tagSubfile"),11,tagSubfiles);
626 tagXml.replace(tagXml.find("$tagMesh"),8,tagMeshes);
629 _file_name_huge_xml="tmp_testMeshHuge_"+IntToStr(_ni)+"x"+IntToStr(_nj)+"x"+IntToStr(_nk)+"_"+sxyz+".xml";
630 std::ofstream f(_file_name_huge_xml.c_str());
633 //cout<<"\n"<<tagXml<<endl;
635 cout<<endl<<nameFileXml<<" created"<<endl;
639 void MEDPARTITIONERTest::createTestMeshWithVecFieldOnCells()
642 string name=_file_name;
643 MEDCouplingFieldDouble *f1=buildVecFieldOnCells(name);
644 name.replace(name.find(".med"),4,"_WithVecFieldOnCells.med");
645 WriteField(name.c_str(),f1,true);
646 f1->setTime(3.,1,1); //time,it,order
647 f1->applyFunc("x/2.");
648 WriteField(name.c_str(),f1,false);
649 if (_verbose) cout<<endl<<name<<" created"<<endl;
650 if (_ntot<1000000) //too long
652 MEDCouplingFieldDouble *f2=ReadFieldCell(name.c_str(),f1->getMesh()->getName().c_str(),0,f1->getName().c_str(),0,1);
653 //DataArrayDouble *res=f2->getArray();
654 if (_verbose) cout<<name<<" reread"<<endl;
655 //CPPUNIT_ASSERT(f1->isEqual(f2,1e-12,1e-12));
661 string name=_file_name;
662 MEDCouplingFieldDouble *f1=buildVecFieldOnCells(name);
663 name.replace(name.find(".med"),4,"_WithVecFieldOnGaussNe.med");
664 MEDCouplingFieldDouble *f3=MEDCouplingFieldDouble::New(ON_GAUSS_NE,ONE_TIME);
665 f3->setMesh(f1->getMesh());
666 //cout<<"\nNumberOfMeshPlacesExpected "<<f3->getNumberOfMeshPlacesExpected()<<" "
667 // /*<<getNumberOfTuples(f1->getMesh())<<" "*/
668 // <<f3->getMesh()->getNumberOfNodes()<<" "
669 // <<f3->getMesh()->getNumberOfCells()<<endl;
670 f3->setName("MyFieldOnGaussNE");
671 f3->setDescription("MyDescriptionNE");
672 DataArrayDouble *array=DataArrayDouble::New();
673 //int nb=f1->getMesh()->getNumberOfNodes();
675 /*8 pt de gauss by cell
676 int nb=f3->getMesh()->getNumberOfCells()*8;
678 double *ptr=array->getPointer();
679 for (int i=0; i<nb*2; i=i+2) {ptr[i]=(double)(i/8) ; ptr[i]=2.*(double)(i/8);}
682 //more nbptgauss=8 by default needs set MEDCouplingFieldDiscretizationPerCell
683 //theory: (may be) http://www.code-aster.org/V2/doc/v9/fr/man_r/r3/r3.06.03.pdf
684 int nbptgauss=8; //nb pt de gauss by cell
685 int nbcell=f3->getMesh()->getNumberOfCells();
686 int nb=nbcell*nbptgauss;
688 array->alloc(nb,nbcomp);
689 double *ptr=array->getPointer();
691 for (int i=0; i<nbcell; i++)
692 for (int j=0; j<nbptgauss; j++)
693 for (int k=0; k<nbcomp; k++)
695 //123.4 for 12th cell,3rd component, 4th gausspoint
696 ptr[ii]=(double)((i+1)*10+(k+1))+((double)(j+1))/10.;
699 array->setInfoOnComponent(0,"vGx");
700 array->setInfoOnComponent(1,"vGy");
704 WriteField(name.c_str(),f3,true);
705 if (_verbose) cout<<endl<<name<<" created"<<endl;
706 f3->checkConsistencyLight();
708 if (_ntot<1000000) //too long
710 MEDCouplingFieldDouble* f4=ReadField(ON_GAUSS_NE, name.c_str(), f3->getMesh()->getName().c_str(), 0, "MyFieldOnGaussNE", 5, 6);
711 if (_verbose) cout<<"MyFieldOnGaussNE reread"<<endl;
717 string name=_file_name_with_faces;
718 MEDCouplingFieldDouble *f1=buildVecFieldOnCells(name);
719 name.replace(name.find(".med"),4,"_WithVecFieldOnCells.med");
720 WriteField(name.c_str(),f1,true);
721 if (_verbose) cout<<endl<<name<<" created"<<endl;
722 if (_ntot<1000000) //too long
724 MEDCouplingFieldDouble *f2=ReadFieldCell(name.c_str(),f1->getMesh()->getName().c_str(),0,f1->getName().c_str(),0,1);
725 if (_verbose) cout<<name<<" reread"<<endl;
726 //CPPUNIT_ASSERT(f1->isEqual(f2,1e-12,1e-12)); assertion failed!!
733 void MEDPARTITIONERTest::createTestMeshWithVecFieldOnNodes()
735 MEDCouplingFieldDouble *f1=buildVecFieldOnNodes();
736 string name=_file_name;
737 name.replace(name.find(".med"),4,"_WithVecFieldOnNodes.med");
738 WriteField(name.c_str(),f1,true);
739 if (_verbose) cout<<endl<<name<<" created"<<endl;
740 if (_ntot<1000000) //too long
742 MEDCouplingFieldDouble *f2=ReadFieldNode(name.c_str(),f1->getMesh()->getName().c_str(),0,f1->getName().c_str(),0,1);
743 if (_verbose) cout<<name<<" reread"<<endl;
744 //CPPUNIT_ASSERT(f1->isEqual(f2,1e-12,1e-12)); assertion failed!!
750 void MEDPARTITIONERTest::verifyTestMeshWithVecFieldOnNodes()
752 string name=_file_name;
753 name.replace(name.find(".med"),4,"_WithVecFieldOnNodes.med");
754 MEDCouplingUMesh * m=ReadUMeshFromFile(name.c_str(),_mesh_name.c_str(),0);
755 std::set<INTERP_KERNEL::NormalizedCellType> types(m->getAllGeoTypes());
758 cout<<"\n types in "<<name<<" : ";
759 //for (std::set<INTERP_KERNEL::NormalizedCellType>::iterator t=types.begin(); t!=types.end(); ++t) cout<<" "<<*t;
760 for (std::set<INTERP_KERNEL::NormalizedCellType>::const_iterator t=types.begin(); t!=types.end(); ++t)
762 //INTERP_KERNEL::CellModel essai=INTERP_KERNEL::CellModel::GetCellModel(*t);
763 cout<<" "<<(INTERP_KERNEL::CellModel::GetCellModel(*t)).getRepr();
769 MEDFileUMesh * mf = MEDFileUMesh::New(_file_name.c_str(),_mesh_name.c_str(),-1,-1);
771 lev=mf->getNonEmptyLevels();
774 cout<<" levels in "<<name<<" : ";
775 for (vector<int>::iterator l=lev.begin(); l!=lev.end(); ++l) cout<<" "<<*l;
781 void MEDPARTITIONERTest::createTestMeshes()
783 createTestMeshWithoutField();
784 createTestMeshWithVecFieldOnCells();
785 createTestMeshWithVecFieldOnNodes();
788 void MEDPARTITIONERTest::deleteTestMeshes()
790 string cmd="rm *tmp_testMesh*";
791 if (_verbose) cout<<endl<<cmd<<endl;
792 system(cmd.c_str()); //may be not if debug
795 void MEDPARTITIONERTest::testMeshCollectionSingle()
799 MyGlobals::_World_Size=1;
801 string fileName=_file_name_with_faces;
802 MEDPARTITIONER::ParaDomainSelector parallelizer(false);
803 MEDPARTITIONER::MeshCollection collection(fileName,parallelizer);
804 CPPUNIT_ASSERT(collection.isParallelMode());
805 CPPUNIT_ASSERT_EQUAL(3, collection.getMeshDimension());
806 CPPUNIT_ASSERT(collection.getName()=="testMesh");
807 CPPUNIT_ASSERT_EQUAL(1,collection.getNbOfLocalMeshes());
808 CPPUNIT_ASSERT_EQUAL(1,collection.getNbOfGlobalMeshes());
809 CPPUNIT_ASSERT_EQUAL(_ni*_nj*_nk,collection.getNbOfLocalCells());
810 CPPUNIT_ASSERT_EQUAL(_ni*_nj,collection.getNbOfLocalFaces());
813 void MEDPARTITIONERTest::testMeshCollectionXml()
816 createHugeTestMesh(_ni, _nj, _nk, 2, 2, 2, 32); //xml but not so huge
817 string fileName=_file_name_huge_xml;
818 MEDPARTITIONER::ParaDomainSelector parallelizer(false);
819 MEDPARTITIONER::MeshCollection collection(fileName,parallelizer);
820 CPPUNIT_ASSERT(collection.isParallelMode());
821 CPPUNIT_ASSERT_EQUAL(3, collection.getMeshDimension());
822 CPPUNIT_ASSERT(collection.getName()=="testMesh");
823 CPPUNIT_ASSERT_EQUAL(8,collection.getNbOfLocalMeshes());
824 CPPUNIT_ASSERT_EQUAL(8,collection.getNbOfGlobalMeshes());
825 CPPUNIT_ASSERT_EQUAL(_ni*_nj*_nk*8,collection.getNbOfLocalCells());
826 CPPUNIT_ASSERT_EQUAL(0,collection.getNbOfLocalFaces());
830 //#################for metis
834 #if defined(MED_ENABLE_METIS)
835 void MEDPARTITIONERTest::testMeshCollectionSinglePartitionMetis()
839 //MyGlobals::_Verbose=500;
840 string fileName=_file_name_with_faces;
842 bool split_family=false;
843 bool empty_groups=false;
844 MEDPARTITIONER::ParaDomainSelector parallelizer(false);
845 MEDPARTITIONER::MeshCollection collection(fileName,parallelizer);
847 MEDPARTITIONER::ParallelTopology* aPT = (MEDPARTITIONER::ParallelTopology*) collection.getTopology();
848 aPT->setGlobalNumerotationDefault(collection.getParaDomainSelector());
849 //Creating the graph and partitioning it
850 auto_ptr< MEDPARTITIONER::Topology > new_topo;
851 new_topo.reset( collection.createPartition(ndomains,MEDPARTITIONER::Graph::METIS) );
852 //Creating a new mesh collection from the partitioning
853 MEDPARTITIONER::MeshCollection new_collection(collection,new_topo.get(),split_family,empty_groups);
855 //example to create files
856 //MyGlobals::_General_Informations.clear();
857 //MyGlobals::_General_Informations.push_back(SerializeFromString("finalMeshName=Merge"));
858 //if (MyGlobals::_Verbose>100) cout << "generalInformations : \n"<<ReprVectorOfString(MyGlobals::_General_Informations);
859 //new_collection.write("ttmp")
861 CPPUNIT_ASSERT(new_collection.isParallelMode());
862 CPPUNIT_ASSERT_EQUAL(3, new_collection.getMeshDimension());
863 CPPUNIT_ASSERT(new_collection.getName()==collection.getName());
864 CPPUNIT_ASSERT_EQUAL(ndomains,new_collection.getNbOfLocalMeshes());
865 CPPUNIT_ASSERT_EQUAL(ndomains,new_collection.getNbOfGlobalMeshes());
866 CPPUNIT_ASSERT_EQUAL(collection.getNbOfLocalCells(),new_collection.getNbOfLocalCells());
867 CPPUNIT_ASSERT_EQUAL(collection.getNbOfLocalFaces(),new_collection.getNbOfLocalFaces());
870 void MEDPARTITIONERTest::testMeshCollectionComplexPartitionMetis()
873 createHugeTestMesh(_ni, _nj, _nk, 2, 2, 2, 32); //xml on 2*2*2 meshes but not so huge
874 string fileName=_file_name_huge_xml;
875 bool split_family=false;
876 bool empty_groups=false;
877 MEDPARTITIONER::ParaDomainSelector parallelizer(false);
878 MEDPARTITIONER::MeshCollection collection(fileName,parallelizer);
880 MEDPARTITIONER::ParallelTopology* aPT = (MEDPARTITIONER::ParallelTopology*) collection.getTopology();
881 aPT->setGlobalNumerotationDefault(collection.getParaDomainSelector());
883 for (int ndomains=2 ; ndomains<=16 ; ndomains++)
885 //Creating the graph and partitioning it
886 auto_ptr< MEDPARTITIONER::Topology > new_topo;
887 new_topo.reset( collection.createPartition(ndomains,MEDPARTITIONER::Graph::METIS) );
888 //Creating a new mesh collection from the partitioning
889 MEDPARTITIONER::MeshCollection new_collection(collection,new_topo.get(),split_family,empty_groups);
891 CPPUNIT_ASSERT_EQUAL(ndomains,new_collection.getNbOfLocalMeshes());
892 CPPUNIT_ASSERT_EQUAL(ndomains,new_collection.getNbOfGlobalMeshes());
893 CPPUNIT_ASSERT_EQUAL(collection.getNbOfLocalCells(),new_collection.getNbOfLocalCells());
894 CPPUNIT_ASSERT_EQUAL(collection.getNbOfLocalFaces(),new_collection.getNbOfLocalFaces());
898 void MEDPARTITIONERTest::testMetisSmallSize()
900 //#if !defined(HAVE_MPI)
903 std::string MetisOrScotch("metis");
904 launchMetisOrScotchMedpartitionerOnTestMeshes(MetisOrScotch);
905 verifyMetisOrScotchMedpartitionerOnSmallSizeForMesh(MetisOrScotch);
906 verifyMetisOrScotchMedpartitionerOnSmallSizeForFieldOnCells(MetisOrScotch);
907 verifyMetisOrScotchMedpartitionerOnSmallSizeForFieldOnGaussNe(MetisOrScotch);
913 //#################for scotch
916 #if defined(MED_ENABLE_SCOTCH)
917 void MEDPARTITIONERTest::testMeshCollectionSinglePartitionScotch()
921 //MyGlobals::_Verbose=500;
922 string fileName=_file_name_with_faces;
924 bool split_family=false;
925 bool empty_groups=false;
926 MEDPARTITIONER::ParaDomainSelector parallelizer(false);
927 MEDPARTITIONER::MeshCollection collection(fileName,parallelizer);
929 MEDPARTITIONER::ParallelTopology* aPT = (MEDPARTITIONER::ParallelTopology*) collection.getTopology();
930 aPT->setGlobalNumerotationDefault(collection.getParaDomainSelector());
931 //Creating the graph and partitioning it
932 auto_ptr< MEDPARTITIONER::Topology > new_topo;
933 new_topo.reset( collection.createPartition(ndomains,MEDPARTITIONER::Graph::SCOTCH) );
934 //Creating a new mesh collection from the partitioning
935 MEDPARTITIONER::MeshCollection new_collection(collection,new_topo.get(),split_family,empty_groups);
937 //example to create files
938 //MyGlobals::_General_Informations.clear();
939 //MyGlobals::_General_Informations.push_back(SerializeFromString("finalMeshName=Merge"));
940 //if (MyGlobals::_Verbose>100) cout << "generalInformations : \n"<<ReprVectorOfString(MyGlobals::_General_Informations);
941 //new_collection.write("ttmp")
943 CPPUNIT_ASSERT(new_collection.isParallelMode());
944 CPPUNIT_ASSERT_EQUAL(3, new_collection.getMeshDimension());
945 CPPUNIT_ASSERT(new_collection.getName()==collection.getName());
946 CPPUNIT_ASSERT_EQUAL(ndomains,new_collection.getNbOfLocalMeshes());
947 CPPUNIT_ASSERT_EQUAL(ndomains,new_collection.getNbOfGlobalMeshes());
948 CPPUNIT_ASSERT_EQUAL(collection.getNbOfLocalCells(),new_collection.getNbOfLocalCells());
949 CPPUNIT_ASSERT_EQUAL(collection.getNbOfLocalFaces(),new_collection.getNbOfLocalFaces());
952 void MEDPARTITIONERTest::testMeshCollectionComplexPartitionScotch()
955 createHugeTestMesh(_ni, _nj, _nk, 2, 2, 2, 32); //xml on 2*2*2 meshes but not so huge
956 string fileName=_file_name_huge_xml;
957 bool split_family=false;
958 bool empty_groups=false;
959 MEDPARTITIONER::ParaDomainSelector parallelizer(false);
960 MEDPARTITIONER::MeshCollection collection(fileName,parallelizer);
962 MEDPARTITIONER::ParallelTopology* aPT = (MEDPARTITIONER::ParallelTopology*) collection.getTopology();
963 aPT->setGlobalNumerotationDefault(collection.getParaDomainSelector());
965 for (int ndomains=2 ; ndomains<=16 ; ndomains++)
967 //Creating the graph and partitioning it
968 auto_ptr< MEDPARTITIONER::Topology > new_topo;
969 new_topo.reset( collection.createPartition(ndomains,MEDPARTITIONER::Graph::SCOTCH) );
970 //Creating a new mesh collection from the partitioning
971 MEDPARTITIONER::MeshCollection new_collection(collection,new_topo.get(),split_family,empty_groups);
973 CPPUNIT_ASSERT_EQUAL(ndomains,new_collection.getNbOfLocalMeshes());
974 CPPUNIT_ASSERT_EQUAL(ndomains,new_collection.getNbOfGlobalMeshes());
975 CPPUNIT_ASSERT_EQUAL(collection.getNbOfLocalCells(),new_collection.getNbOfLocalCells());
976 CPPUNIT_ASSERT_EQUAL(collection.getNbOfLocalFaces(),new_collection.getNbOfLocalFaces());
980 void MEDPARTITIONERTest::testScotchSmallSize()
982 //#if !defined(HAVE_MPI)
985 std::string MetisOrScotch("scotch");
986 launchMetisOrScotchMedpartitionerOnTestMeshes(MetisOrScotch);
987 verifyMetisOrScotchMedpartitionerOnSmallSizeForMesh(MetisOrScotch);
988 verifyMetisOrScotchMedpartitionerOnSmallSizeForFieldOnCells(MetisOrScotch);
989 verifyMetisOrScotchMedpartitionerOnSmallSizeForFieldOnGaussNe(MetisOrScotch);
994 void MEDPARTITIONERTest::launchMetisOrScotchMedpartitionerOnTestMeshes(std::string MetisOrScotch)
997 string cmd,execName,sourceName,targetName;
999 execName=getPartitionerExe();
1001 cmd="which "+execName+" 2>/dev/null 1>/dev/null"; //no trace
1002 res=system(cmd.c_str());
1003 CPPUNIT_ASSERT_EQUAL_MESSAGE(execName + " - INVALID PATH TO medpartitioner", 0, res);
1005 cmd=execName+" --ndomains=2 --split-method="+MetisOrScotch; //on same proc
1006 sourceName=_file_name;
1007 targetName=_file_name;
1008 targetName.replace(targetName.find(".med"),4,"_partitionedTo2_");
1009 cmd+=" --input-file="+sourceName+" --output-file="+targetName+" --verbose="+IntToStr(_verbose);
1010 if (_verbose) cout<<endl<<cmd<<endl;
1011 res=system(cmd.c_str());
1012 CPPUNIT_ASSERT_EQUAL(0, res);
1014 cmd=execName+" --ndomains=5 --split-method="+MetisOrScotch; //on less proc
1015 sourceName=_file_name;
1016 targetName=_file_name;
1017 targetName.replace(targetName.find(".med"),4,"_partitionedTo5_");
1018 cmd+=" --input-file="+sourceName+" --output-file="+targetName+" --verbose="+IntToStr(_verbose);
1019 if (_verbose) cout<<endl<<cmd<<endl;
1020 res=system(cmd.c_str());
1021 CPPUNIT_ASSERT_EQUAL(0, res);
1023 cmd=execName+" --ndomains=1 --split-method="+MetisOrScotch; //on 1 proc
1024 sourceName=targetName+".xml";
1025 targetName=_file_name;
1026 targetName.replace(targetName.find(".med"),4,"_remergedFrom5_");
1027 cmd+=" --input-file="+sourceName+" --output-file="+targetName+" --verbose="+IntToStr(_verbose);
1028 if (_verbose) cout<<endl<<cmd<<endl;
1029 res=system(cmd.c_str());
1030 CPPUNIT_ASSERT_EQUAL(0, res);
1032 cmd=execName+" --ndomains=1 --split-method="+MetisOrScotch; //on more proc
1033 //sourceName=targetName+".xml";
1034 targetName=_file_name;
1035 targetName.replace(targetName.find(".med"),4,"_remergedFrom5_");
1036 cmd+=" --input-file="+sourceName+" --output-file="+targetName+" --verbose="+IntToStr(_verbose);
1037 if (_verbose) cout<<endl<<cmd<<endl;
1038 res=system(cmd.c_str());
1039 CPPUNIT_ASSERT_EQUAL(0, res);
1042 void MEDPARTITIONERTest::verifyMetisOrScotchMedpartitionerOnSmallSizeForMesh(std::string MetisOrScotch)
1045 string fileName,cmd,execName,sourceName,targetName,input;
1046 execName=getPartitionerExe();
1047 fileName=_file_name_with_faces;
1049 MEDCoupling::MEDFileUMesh* initialMesh=MEDCoupling::MEDFileUMesh::New(fileName.c_str(),_mesh_name.c_str());
1050 MEDCoupling::MEDCouplingUMesh* cellMesh=initialMesh->getLevel0Mesh(false);
1051 MEDCoupling::MEDCouplingUMesh* faceMesh=initialMesh->getLevelM1Mesh(false);
1053 cmd=execName+" --ndomains=5 --split-method="+MetisOrScotch; //on same proc
1054 sourceName=fileName;
1055 targetName=fileName;
1056 targetName.replace(targetName.find(".med"),4,"_partitionedTo5_");
1057 cmd+=" --input-file="+sourceName+" --output-file="+targetName+" --verbose="+IntToStr(_verbose);
1058 if (_verbose) cout<<endl<<cmd<<endl;
1059 res=system(cmd.c_str());
1060 CPPUNIT_ASSERT_EQUAL(0, res);
1061 input=targetName+".xml";
1063 MEDPARTITIONER::ParaDomainSelector parallelizer(false);
1064 MEDPARTITIONER::MeshCollection collection(input,parallelizer);
1065 CPPUNIT_ASSERT_EQUAL(3, collection.getMeshDimension());
1066 std::vector<MEDCoupling::MEDCouplingUMesh*>cellMeshes=collection.getMesh();
1067 CPPUNIT_ASSERT_EQUAL(5, (int) cellMeshes.size());
1069 for (std::size_t i = 0; i < cellMeshes.size(); i++)
1070 nbcells+=cellMeshes[i]->getNumberOfCells();
1071 CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), nbcells);
1073 std::vector<MEDCoupling::MEDCouplingUMesh*>faceMeshes=collection.getFaceMesh();
1074 CPPUNIT_ASSERT_EQUAL(5, (int) faceMeshes.size());
1076 for (std::size_t i=0; i < faceMeshes.size(); i++)
1077 nbfaces+=faceMeshes[i]->getNumberOfCells();
1078 CPPUNIT_ASSERT_EQUAL(faceMesh->getNumberOfCells(), nbfaces);
1080 //merge split meshes and test equality
1081 cmd=execName+" --ndomains=1 --split-method="+MetisOrScotch; //on same proc
1082 sourceName=targetName+".xml";
1083 targetName=fileName;
1084 targetName.replace(targetName.find(".med"),4,"_remergedFrom5_");
1085 cmd+=" --input-file="+sourceName+" --output-file="+targetName+" --verbose="+IntToStr(_verbose);
1086 if (_verbose) cout<<endl<<cmd<<endl;
1087 res=system(cmd.c_str());
1088 CPPUNIT_ASSERT_EQUAL(0, res);
1090 string refusedName=targetName+"1.med";
1091 MEDCoupling::MEDFileUMesh* refusedMesh=MEDCoupling::MEDFileUMesh::New(refusedName.c_str(),_mesh_name.c_str());
1092 MEDCoupling::MEDCouplingUMesh* refusedCellMesh=refusedMesh->getLevel0Mesh(false);
1093 MEDCoupling::MEDCouplingUMesh* refusedFaceMesh=refusedMesh->getLevelM1Mesh(false);
1095 CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), refusedCellMesh->getNumberOfCells());
1096 CPPUNIT_ASSERT_EQUAL(faceMesh->getNumberOfCells(), refusedFaceMesh->getNumberOfCells());
1099 MEDCoupling::MEDCouplingMesh* mergeCell=cellMesh->mergeMyselfWith(refusedCellMesh);
1100 CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), mergeCell->getNumberOfCells());
1102 MEDCoupling::MEDCouplingMesh* mergeFace=faceMesh->mergeMyselfWith(refusedFaceMesh);
1103 CPPUNIT_ASSERT_EQUAL(faceMesh->getNumberOfCells(), mergeFace->getNumberOfCells());
1105 CPPUNIT_ASSERT(faceMesh->isEqual(refusedFaceMesh,1e-12));
1108 std::vector<const MEDCouplingUMesh *> meshes;
1109 std::vector<DataArrayInt *> corr;
1110 meshes.push_back(cellMesh);
1111 refusedCellMesh->tryToShareSameCoordsPermute(*cellMesh, 1e-9);
1112 meshes.push_back(refusedCellMesh);
1113 MEDCouplingUMesh* fusedCell=MEDCouplingUMesh::FuseUMeshesOnSameCoords(meshes,0,corr);
1114 CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), fusedCell->getNumberOfCells());
1117 for (std::size_t i = 0; i < corr.size(); i++)
1120 meshes.push_back(faceMesh);
1121 refusedFaceMesh->tryToShareSameCoordsPermute(*faceMesh, 1e-9);
1122 meshes.push_back(refusedFaceMesh);
1123 MEDCouplingUMesh* fusedFace=MEDCouplingUMesh::FuseUMeshesOnSameCoords(meshes,0,corr);
1124 CPPUNIT_ASSERT_EQUAL(faceMesh->getNumberOfCells(), fusedFace->getNumberOfCells());
1126 for (std::size_t i = 0; i < corr.size(); i++)
1128 fusedFace->decrRef();
1129 refusedFaceMesh->decrRef();
1130 faceMesh->decrRef();
1131 fusedCell->decrRef();
1132 refusedCellMesh->decrRef();
1133 refusedMesh->decrRef();
1134 cellMesh->decrRef();
1135 initialMesh->decrRef();
1136 //done in ~collection
1137 //for (int i = 0; i < faceMeshes.size(); i++) faceMeshes[i]->decrRef();
1138 //for (int i = 0; i < cellMeshes.size(); i++) cellMeshes[i]->decrRef();
1141 void MEDPARTITIONERTest::verifyMetisOrScotchMedpartitionerOnSmallSizeForFieldOnCells(std::string MetisOrScotch)
1144 string fileName,cmd,execName,sourceName,targetName,input;
1145 execName=getPartitionerExe();
1146 fileName=_file_name;
1147 fileName.replace(fileName.find(".med"),4,"_WithVecFieldOnCells.med");
1149 MEDCoupling::MEDFileUMesh* initialMesh=MEDCoupling::MEDFileUMesh::New(fileName.c_str(),_mesh_name.c_str());
1150 MEDCoupling::MEDCouplingUMesh* cellMesh=initialMesh->getLevel0Mesh(false);
1152 cmd=execName+" --ndomains=5 --split-method="+MetisOrScotch; //on same proc
1153 sourceName=fileName;
1154 targetName=fileName;
1155 targetName.replace(targetName.find(".med"),4,"_partitionedTo5_");
1156 cmd+=" --input-file="+sourceName+" --output-file="+targetName+" --verbose="+IntToStr(_verbose);
1157 if (_verbose) cout<<endl<<cmd<<endl;
1158 res=system(cmd.c_str());
1159 CPPUNIT_ASSERT_EQUAL(0, res);
1160 input=targetName+".xml";
1162 //merge split meshes and test equality
1163 cmd=execName+" --ndomains=1 --split-method="+MetisOrScotch; //on same proc
1164 sourceName=targetName+".xml";
1165 targetName=fileName;
1166 targetName.replace(targetName.find(".med"),4,"_remergedFrom5_");
1167 cmd+=" --input-file="+sourceName+" --output-file="+targetName+" --verbose="+IntToStr(_verbose);
1168 if (_verbose) cout<<endl<<cmd<<endl;
1169 res=system(cmd.c_str());
1170 CPPUNIT_ASSERT_EQUAL(0, res);
1172 string refusedName=targetName+"1.med";
1173 MEDCoupling::MEDFileUMesh* refusedMesh=MEDCoupling::MEDFileUMesh::New(refusedName.c_str(),_mesh_name.c_str());
1174 MEDCoupling::MEDCouplingUMesh* refusedCellMesh=refusedMesh->getLevel0Mesh(false);
1176 CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), refusedCellMesh->getNumberOfCells());
1178 std::vector<const MEDCouplingUMesh *> meshes;
1179 std::vector<DataArrayInt *> corr;
1180 meshes.push_back(cellMesh);
1181 refusedCellMesh->tryToShareSameCoordsPermute(*cellMesh, 1e-9);
1182 meshes.push_back(refusedCellMesh);
1183 MEDCouplingUMesh* fusedCell=MEDCouplingUMesh::FuseUMeshesOnSameCoords(meshes,0,corr);
1184 CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), fusedCell->getNumberOfCells());
1186 MEDCouplingFieldDouble* field1=ReadFieldCell(fileName.c_str(),initialMesh->getName().c_str(),0,"VectorFieldOnCells",0,1);
1187 MEDCouplingFieldDouble* field2=ReadFieldCell(refusedName.c_str(),refusedCellMesh->getName().c_str(),0,"VectorFieldOnCells",0,1);
1189 int nbcells=corr[1]->getNumberOfTuples();
1190 CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), nbcells);
1191 //use corr to test equality of field
1192 DataArrayDouble* f1=field1->getArray();
1193 DataArrayDouble* f2=field2->getArray();
1196 cout<<"\nf1 : "<<f1->reprZip();
1197 cout<<"\nf2 : "<<f2->reprZip(); //field2->advancedRepradvancedRepr();
1198 for (std::size_t i = 0; i < corr.size(); i++)
1199 cout << "\ncorr " << i << " : " << corr[i]->reprZip();
1203 int nbcomp=field1->getNumberOfComponents();
1204 double* p1=f1->getPointer();
1205 double* p2=f2->getPointer();
1206 int* pc=corr[1]->getPointer();
1207 for (int i = 0; i < nbcells; i++)
1209 int i1=pc[i]*nbcomp;
1211 for (int j = 0; j < nbcomp; j++)
1213 if (p1[i1+j]==p2[i2+j]) nbequal++;
1214 //cout<<" "<<p1[i1+j]<<"="<<p2[i2+j];
1217 CPPUNIT_ASSERT_EQUAL(nbcells*nbcomp, nbequal);
1219 for (std::size_t i = 0; i < corr.size(); i++)
1223 fusedCell->decrRef();
1224 refusedMesh->decrRef();
1225 refusedCellMesh->decrRef();
1226 cellMesh->decrRef();
1227 initialMesh->decrRef();
1230 void MEDPARTITIONERTest::verifyMetisOrScotchMedpartitionerOnSmallSizeForFieldOnGaussNe(std::string MetisOrScotch)
1233 string fileName,cmd,execName,sourceName,targetName,input;
1234 execName=getPartitionerExe();
1235 fileName=_file_name;
1236 fileName.replace(fileName.find(".med"),4,"_WithVecFieldOnGaussNe.med");
1238 MEDCoupling::MEDFileUMesh* initialMesh=MEDCoupling::MEDFileUMesh::New(fileName.c_str(),_mesh_name.c_str());
1239 MEDCoupling::MEDCouplingUMesh* cellMesh=initialMesh->getLevel0Mesh(false);
1241 cmd=execName+" --ndomains=5 --split-method="+MetisOrScotch; //on same proc
1242 sourceName=fileName;
1243 targetName=fileName;
1244 targetName.replace(targetName.find(".med"),4,"_partitionedTo5_");
1245 cmd+=" --input-file="+sourceName+" --output-file="+targetName+" --verbose="+IntToStr(_verbose);
1246 if (_verbose) cout<<endl<<cmd<<endl;
1247 res=system(cmd.c_str());
1248 CPPUNIT_ASSERT_EQUAL(0, res);
1249 input=targetName+".xml";
1251 //merge split meshes and test equality
1252 cmd=execName+" --ndomains=1 --split-method="+MetisOrScotch; //on same proc
1253 sourceName=targetName+".xml";
1254 targetName=fileName;
1255 targetName.replace(targetName.find(".med"),4,"_remergedFrom5_");
1256 cmd+=" --input-file="+sourceName+" --output-file="+targetName+" --verbose="+IntToStr(_verbose);
1257 if (_verbose) cout<<endl<<cmd<<endl;
1258 res=system(cmd.c_str());
1259 CPPUNIT_ASSERT_EQUAL(0, res);
1261 string refusedName=targetName+"1.med";
1262 MEDCoupling::MEDFileUMesh* refusedMesh=MEDCoupling::MEDFileUMesh::New(refusedName.c_str(),_mesh_name.c_str());
1263 MEDCoupling::MEDCouplingUMesh* refusedCellMesh=refusedMesh->getLevel0Mesh(false);
1265 CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), refusedCellMesh->getNumberOfCells());
1267 std::vector<const MEDCouplingUMesh *> meshes;
1268 std::vector<DataArrayInt *> corr;
1269 meshes.push_back(cellMesh);
1270 refusedCellMesh->tryToShareSameCoordsPermute(*cellMesh, 1e-9);
1271 meshes.push_back(refusedCellMesh);
1272 MEDCouplingUMesh* fusedCell=MEDCouplingUMesh::FuseUMeshesOnSameCoords(meshes,0,corr);
1273 CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), fusedCell->getNumberOfCells());
1275 MEDCouplingFieldDouble* field1=ReadField(ON_GAUSS_NE,fileName.c_str(),initialMesh->getName().c_str(),0,"MyFieldOnGaussNE",5,6);
1276 MEDCouplingFieldDouble* field2=ReadField(ON_GAUSS_NE,refusedName.c_str(),refusedCellMesh->getName().c_str(),0,"MyFieldOnGaussNE",5,6);
1278 int nbcells=corr[1]->getNumberOfTuples();
1279 CPPUNIT_ASSERT_EQUAL(cellMesh->getNumberOfCells(), nbcells);
1280 //use corr to test equality of field
1281 DataArrayDouble* f1=field1->getArray();
1282 DataArrayDouble* f2=field2->getArray();
1285 cout << "\nf1 : " << f1->reprZip(); //123.4 for 12th cell,3rd component, 4th gausspoint
1286 cout << "\nf2 : " << f2->reprZip(); //field2->advancedRepradvancedRepr();
1287 for (std::size_t i = 0; i < corr.size(); i++)
1288 cout << "\ncorr " << i << " : " << corr[i]->reprZip();
1293 int nbcomp=field1->getNumberOfComponents();
1294 double* p1=f1->getPointer();
1295 double* p2=f2->getPointer();
1296 int* pc=corr[1]->getPointer();
1297 for (int i = 0; i < nbcells; i++)
1299 int i1=pc[i]*nbcomp*nbptgauss;
1300 int i2=i*nbcomp*nbptgauss;
1301 for (int j = 0; j < nbcomp*nbptgauss; j++)
1303 if (p1[i1+j]==p2[i2+j]) nbequal++;
1304 //cout<<" "<<p1[i1+j]<<"="<<p2[i2+j];
1307 CPPUNIT_ASSERT_EQUAL(nbcells*nbcomp*nbptgauss, nbequal);
1309 for (std::size_t i = 0; i < corr.size(); i++)
1313 fusedCell->decrRef();
1314 refusedMesh->decrRef();
1315 refusedCellMesh->decrRef();
1316 cellMesh->decrRef();
1317 initialMesh->decrRef();
1320 //================================================================================
1322 * \brief Test for 0021756: [CEA 602] MEDPartitioner improvements
1324 //================================================================================
1326 void MEDPARTITIONERTest::testCreateBoundaryFaces2D()
1328 // Fixed complains are:
1329 // - 2D is not available
1330 // - groups and family handling is bugged (probably due to bug in the handling
1331 // of arrayTo in castIntField())
1332 // - creates boundary faces option is not handled
1334 // Create a 2D mesh in a file
1336 const char fileName[] = "tmp_testCreateBoundaryFaces2D.med";
1338 const int idFam1 = 3, idFam2 = 2;
1339 int nbFam1, nbFam2, nbc;
1341 const int nbX = 20, nbY = 15;
1343 vector<double> coor;
1344 for (int j=0; j<=nbY; j++)
1345 for (int i=0; i<=nbX; i++)
1347 coor.push_back(i+.1);
1348 coor.push_back(j+.2);
1351 for (int j=0; j<nbY; j++)
1352 for (int i=0; i<nbX; i++)
1356 conn.push_back(ii+1);
1359 conn.push_back(ii-1);
1361 MEDCouplingUMesh *mesh=MEDCouplingUMesh::New();
1362 mesh->setMeshDimension(2);
1364 nbc=conn.size()/4; //nb of cells
1365 mesh->allocateCells(nbc);
1366 int* pConn = &conn[0];
1367 for(int i=0; i<nbc; i++, pConn+=4)
1368 mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,pConn);
1369 mesh->finishInsertingCells();
1371 int nbv=coor.size()/2; //nb of vertices
1372 DataArrayDouble *myCoords=DataArrayDouble::New();
1373 myCoords->useArray( &coor[0], /*ownership=*/false, CPP_DEALLOC, nbv, 2 );
1374 mesh->setCoords(myCoords);
1375 mesh->setName("FacesIn2D");
1376 myCoords->decrRef();
1377 mesh->checkConsistencyLight();
1380 DataArrayInt* cellsFam=DataArrayInt::New();
1381 cellsFam->alloc(nbc,1);
1382 nbFam1 = nbc/3, nbFam2 = nbc/2;
1384 for ( int i = 0; i < nbFam1; ++i ) cellsFam->getPointer()[ iE++ ] = idFam1;
1385 for ( int i = 0; i < nbFam2; ++i ) cellsFam->getPointer()[ iE++ ] = idFam2;
1386 for ( ; iE < nbc; ) cellsFam->getPointer()[ iE++ ] = 0;
1387 map<string,int> theFamilies;
1388 theFamilies["FAMILLE_ZERO"]=0;
1389 theFamilies["Family1" ]=idFam1;
1390 theFamilies["Family2" ]=idFam2;
1391 map<string, vector<string> > theGroups;
1392 theGroups["Group1"].push_back("Family1");
1393 theGroups["Group2"].push_back("Family2");
1396 MEDFileUMesh * fileMesh = MEDFileUMesh::New();
1397 fileMesh->setMeshAtLevel(0, mesh);
1398 fileMesh->setFamilyInfo(theFamilies);
1399 fileMesh->setGroupInfo(theGroups);
1400 fileMesh->setFamilyFieldArr(0, cellsFam);
1401 fileMesh->write(fileName,2);
1403 cellsFam->decrRef();
1405 fileMesh->decrRef();
1409 // Partition the mesh into 4 parts
1411 const int ndomains = 4;
1412 ParaDomainSelector parallelizer(false);
1413 MeshCollection collection(fileName,parallelizer);
1414 ParallelTopology* aPT = (ParallelTopology*) collection.getTopology();
1415 aPT->setGlobalNumerotationDefault(collection.getParaDomainSelector());
1417 std::auto_ptr< Topology > new_topo;
1418 #if defined(MED_ENABLE_METIS) || defined(MED_ENABLE_PARMETIS)
1419 new_topo.reset( collection.createPartition(ndomains,Graph::METIS) );
1421 #if defined(MED_ENABLE_SCOTCH)
1422 if ( !new_topo.get() )
1423 new_topo.reset( collection.createPartition(ndomains,Graph::SCOTCH) );
1425 if ( !new_topo.get() )
1428 // Check that "2D is available"
1430 const char xmlName[] = "tmp_testCreateBoundaryFaces2D";
1432 MyGlobals::_Creates_Boundary_Faces = true;
1433 MeshCollection new_collection(collection,new_topo.get());
1435 CPPUNIT_ASSERT_EQUAL(ndomains,new_collection.getNbOfLocalMeshes());
1436 CPPUNIT_ASSERT_EQUAL(ndomains,new_collection.getNbOfGlobalMeshes());
1437 CPPUNIT_ASSERT_EQUAL(collection.getNbOfLocalCells(),new_collection.getNbOfLocalCells());
1438 CPPUNIT_ASSERT_EQUAL(0,collection.getNbOfLocalFaces());
1439 CPPUNIT_ASSERT (new_collection.getNbOfLocalFaces() > 0 );
1441 MyGlobals::_General_Informations.clear();
1442 MyGlobals::_General_Informations.push_back(SerializeFromString("finalMeshName=2D"));
1443 new_collection.write( xmlName );
1446 // Check that "groups and family handling is NOT bugged"
1448 MeshCollection new_collection(std::string(xmlName)+".xml");
1449 std::map< int, int > famId2nb; // count total nb of cells in divided families
1450 std::map< int, int >::iterator id2nn;
1452 const std::vector<MEDCoupling::DataArrayInt*>& famIdsVec = new_collection.getCellFamilyIds();
1453 for ( size_t i = 0; i < famIdsVec.size(); ++i )
1455 MEDCoupling::DataArrayInt* famIdsArr = famIdsVec[i];
1456 for ( int j = famIdsArr->getNbOfElems()-1; j >= 0; --j )
1458 id2nn = famId2nb.insert( make_pair( famIdsArr->getPointer()[j], 0 )).first;
1463 CPPUNIT_ASSERT_EQUAL( 3, (int) famId2nb.size() ); // 3 fams/groups in all
1464 CPPUNIT_ASSERT_EQUAL( 1, (int) famId2nb.count( 0 ));
1465 CPPUNIT_ASSERT_EQUAL( 1, (int) famId2nb.count( idFam1 ));
1466 CPPUNIT_ASSERT_EQUAL( 1, (int) famId2nb.count( idFam2 ));
1467 CPPUNIT_ASSERT_EQUAL( nbFam1, famId2nb[ idFam1 ]);
1468 CPPUNIT_ASSERT_EQUAL( nbFam2, famId2nb[ idFam2 ]);
1469 CPPUNIT_ASSERT_EQUAL( nbc - nbFam1 - nbFam2, famId2nb[ 0 ]);
1471 // Check that "creates boundary faces option is handled"
1474 const std::vector<MEDCoupling::DataArrayInt*>& famIdsVec = new_collection.getFaceFamilyIds();
1475 for ( size_t i = 0; i < famIdsVec.size(); ++i )
1477 MEDCoupling::DataArrayInt* famIdsArr = famIdsVec[i];
1478 for ( int j = famIdsArr->getNbOfElems()-1; j >= 0; --j )
1480 id2nn = famId2nb.insert( make_pair( famIdsArr->getPointer()[j], 0 )).first;
1485 CPPUNIT_ASSERT( !famId2nb.empty() );
1487 // for each "JOINT_n_p_..." group there must be "JOINT_p_n_..." group
1489 std::map<std::string,int>& famName2id = new_collection.getFamilyInfo();
1490 std::map<std::string,int>::iterator na2id = famName2id.begin(), na2id2;
1491 std::set< int > okFamIds;
1493 for ( ; na2id != famName2id.end(); ++na2id )
1495 if ( okFamIds.count( na2id->second ) || na2id->first[0] != 'J')
1498 bool groupOK = false;
1499 while ( !groupOK && ++na2id2 != famName2id.end() )
1500 groupOK = ( na2id2->first.find_first_not_of( na2id->first ) == std::string::npos );
1502 CPPUNIT_ASSERT( groupOK );
1503 CPPUNIT_ASSERT( na2id->second != na2id2->second);
1504 CPPUNIT_ASSERT_EQUAL( 1, (int) famId2nb.count( na2id2->second ));
1505 CPPUNIT_ASSERT_EQUAL( 1, (int) famId2nb.count( na2id->second ));
1506 CPPUNIT_ASSERT_EQUAL( (int) famId2nb[ na2id2->second ],
1507 (int) famId2nb[ na2id->second ]);
1508 okFamIds.insert( na2id2->second );