X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FParaMEDMEMTest%2FParaMEDMEMTest_OverlapDEC.cxx;h=5969e2be045dd6abf0e4323310cbcc06d827cb73;hb=9a3f48daeedcc6e06bcc731f1c885d07cb15a1be;hp=d0f41d12cab7a5756cdb7e66d6175ca778dd8af9;hpb=93aa2b4d6b1873e76a0226143dcc7f7a577489bf;p=tools%2Fmedcoupling.git diff --git a/src/ParaMEDMEMTest/ParaMEDMEMTest_OverlapDEC.cxx b/src/ParaMEDMEMTest/ParaMEDMEMTest_OverlapDEC.cxx index d0f41d12c..5969e2be0 100644 --- a/src/ParaMEDMEMTest/ParaMEDMEMTest_OverlapDEC.cxx +++ b/src/ParaMEDMEMTest/ParaMEDMEMTest_OverlapDEC.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -35,17 +35,18 @@ using namespace std; -#include "MEDCouplingAutoRefCountObjectPtr.hxx" +#include "MCAuto.hxx" #include "MEDLoader.hxx" #include "MEDLoaderBase.hxx" #include "MEDCouplingFieldDouble.hxx" #include "MEDCouplingMemArray.hxx" #include "MEDCouplingRemapper.hxx" -using namespace ParaMEDMEM; +using namespace MEDCoupling; -typedef MEDCouplingAutoRefCountObjectPtr MUMesh; -typedef MEDCouplingAutoRefCountObjectPtr MFDouble; +typedef MCAuto MUMesh; +typedef MCAuto MFDouble; +typedef MCAuto DADouble; //void ParaMEDMEMTest::testOverlapDEC_LMEC_seq() //{ @@ -58,16 +59,16 @@ typedef MEDCouplingAutoRefCountObjectPtr MFDouble; // string tgt_mesh_nam(rep + string("T_SC_Trio_dst.med")); //// string src_mesh_nam(rep + string("h_TH_Trio_src.med")); //// string tgt_mesh_nam(rep + string("h_TH_Trio_dst.med")); -// MUMesh src_mesh=MEDLoader::ReadUMeshFromFile(src_mesh_nam,"SupportOf_",0); -// MUMesh tgt_mesh=MEDLoader::ReadUMeshFromFile(tgt_mesh_nam,"SupportOf_T_SC_Trio",0); -//// MUMesh tgt_mesh=MEDLoader::ReadUMeshFromFile(tgt_mesh_nam,"SupportOf_h_TH_Trio",0); +// MUMesh src_mesh=ReadUMeshFromFile(src_mesh_nam,"SupportOf_",0); +// MUMesh tgt_mesh=ReadUMeshFromFile(tgt_mesh_nam,"SupportOf_T_SC_Trio",0); +//// MUMesh tgt_mesh=ReadUMeshFromFile(tgt_mesh_nam,"SupportOf_h_TH_Trio",0); // // MFDouble srcField = MEDCouplingFieldDouble::New(ON_CELLS, ONE_TIME); // srcField->setMesh(src_mesh); // DataArrayDouble * dad = DataArrayDouble::New(); dad->alloc(src_mesh->getNumberOfCells(),1); // dad->fillWithValue(1.0); // srcField->setArray(dad); -// srcField->setNature(ConservativeVolumic); +// srcField->setNature(IntensiveMaximum); // // MEDCouplingRemapper remap; // remap.setOrientation(2); // always consider surface intersections as absolute areas. @@ -75,7 +76,7 @@ typedef MEDCouplingAutoRefCountObjectPtr MFDouble; // MFDouble tgtField = remap.transferField(srcField, 1.0e+300); // tgtField->setName("result"); // string out_nam(rep + string("adrien.med")); -// MEDLoader::WriteField(out_nam,tgtField, true); +// WriteField(out_nam,tgtField, true); // cout << "wrote: " << out_nam << "\n"; // double integ1 = 0.0, integ2 = 0.0; // srcField->integral(true, &integ1); @@ -88,7 +89,7 @@ typedef MEDCouplingAutoRefCountObjectPtr MFDouble; // //void ParaMEDMEMTest::testOverlapDEC_LMEC_para() //{ -// using namespace ParaMEDMEM; +// using namespace MEDCoupling; // // int size; // int rank; @@ -127,9 +128,9 @@ typedef MEDCouplingAutoRefCountObjectPtr MFDouble; // { // // string src_mesh_nam(rep + string("h_TH_Trio_src.med")); // // string tgt_mesh_nam(rep + string("h_TH_Trio_dst.med")); -// MUMesh src_mesh=MEDLoader::ReadUMeshFromFile(src_mesh_nam,"SupportOf_",0); -// MUMesh tgt_mesh=MEDLoader::ReadUMeshFromFile(tgt_mesh_nam,"SupportOf_T_SC_Trio",0); -// // MUMesh tgt_mesh=MEDLoader::ReadUMeshFromFile(tgt_mesh_nam,"SupportOf_h_TH_Trio",0); +// MUMesh src_mesh=ReadUMeshFromFile(src_mesh_nam,"SupportOf_",0); +// MUMesh tgt_mesh=ReadUMeshFromFile(tgt_mesh_nam,"SupportOf_T_SC_Trio",0); +// // MUMesh tgt_mesh=ReadUMeshFromFile(tgt_mesh_nam,"SupportOf_h_TH_Trio",0); // // // **** SOURCE // srcField = MEDCouplingFieldDouble::New(ON_CELLS, ONE_TIME); @@ -137,18 +138,18 @@ typedef MEDCouplingAutoRefCountObjectPtr MFDouble; // DataArrayDouble * dad = DataArrayDouble::New(); dad->alloc(src_mesh->getNumberOfCells(),1); // dad->fillWithValue(1.0); // srcField->setArray(dad); -// srcField->setNature(ConservativeVolumic); +// srcField->setNature(IntensiveMaximum); // // ComponentTopology comptopo; // parameshS = new ParaMESH(src_mesh,*dec.getGroup(),"source mesh"); // parafieldS = new ParaFIELD(ON_CELLS,ONE_TIME,parameshS,comptopo); -// parafieldS->getField()->setNature(ConservativeVolumic);//IntegralGlobConstraint +// parafieldS->getField()->setNature(IntensiveMaximum);//ExtensiveConservation // parafieldS->getField()->setArray(dad); // // // **** TARGET // parameshT=new ParaMESH(tgt_mesh,*dec.getGroup(),"target mesh"); // parafieldT=new ParaFIELD(ON_CELLS,ONE_TIME,parameshT,comptopo); -// parafieldT->getField()->setNature(ConservativeVolumic);//IntegralGlobConstraint +// parafieldT->getField()->setNature(IntensiveMaximum);//ExtensiveConservation // parafieldT->getField()->getArray()->fillWithValue(1.0e300); //// valsT[0]=7.; // } @@ -169,7 +170,7 @@ typedef MEDCouplingAutoRefCountObjectPtr MFDouble; // tgtField->integral(true, &integ2); // tgtField->setName("result"); // string out_nam(rep + string("adrien_para.med")); -// MEDLoader::WriteField(out_nam,tgtField, true); +// WriteField(out_nam,tgtField, true); // cout << "wrote: " << out_nam << "\n"; // CPPUNIT_ASSERT_DOUBLES_EQUAL(integ1,integ2,1e-8); // } @@ -180,17 +181,15 @@ typedef MEDCouplingAutoRefCountObjectPtr MFDouble; // // MPI_Barrier(MPI_COMM_WORLD); //} - -void prepareData1(int rank, ProcessorGroup * grp, NatureOfField nature, - MEDCouplingUMesh *& meshS, MEDCouplingUMesh *& meshT, - ParaMESH*& parameshS, ParaMESH*& parameshT, - ParaFIELD*& parafieldS, ParaFIELD*& parafieldT) +// +void prepareData1(int rank, NatureOfField nature, + MEDCouplingFieldDouble *& fieldS, MEDCouplingFieldDouble *& fieldT) { if(rank==0) { const double coordsS[10]={0.,0.,0.5,0.,1.,0.,0.,0.5,0.5,0.5}; const double coordsT[6]={0.,0.,1.,0.,1.,1.}; - meshS=MEDCouplingUMesh::New(); + MUMesh meshS=MEDCouplingUMesh::New(); meshS->setMeshDimension(2); DataArrayDouble *myCoords=DataArrayDouble::New(); myCoords->alloc(5,2); @@ -202,14 +201,14 @@ void prepareData1(int rank, ProcessorGroup * grp, NatureOfField nature, meshS->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,connS); meshS->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,connS+4); meshS->finishInsertingCells(); - ComponentTopology comptopo; - parameshS=new ParaMESH(meshS, *grp,"source mesh"); - parafieldS=new ParaFIELD(ON_CELLS,NO_TIME,parameshS,comptopo); - parafieldS->getField()->setNature(nature); - double *valsS=parafieldS->getField()->getArray()->getPointer(); + fieldS = MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME); + DADouble arr = DataArrayDouble::New(); arr->alloc(meshS->getNumberOfCells(), 1); + fieldS->setMesh(meshS); fieldS->setArray(arr); + fieldS->setNature(nature); + double *valsS=fieldS->getArray()->getPointer(); valsS[0]=7.; valsS[1]=8.; // - meshT=MEDCouplingUMesh::New(); + MUMesh meshT=MEDCouplingUMesh::New(); meshT->setMeshDimension(2); myCoords=DataArrayDouble::New(); myCoords->alloc(3,2); @@ -220,10 +219,11 @@ void prepareData1(int rank, ProcessorGroup * grp, NatureOfField nature, meshT->allocateCells(1); meshT->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,connT); meshT->finishInsertingCells(); - parameshT=new ParaMESH(meshT,*grp,"target mesh"); - parafieldT=new ParaFIELD(ON_CELLS,NO_TIME,parameshT,comptopo); - parafieldT->getField()->setNature(nature); - double *valsT=parafieldT->getField()->getArray()->getPointer(); + fieldT = MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME); + DADouble arr2 = DataArrayDouble::New(); arr2->alloc(meshT->getNumberOfCells(), 1); + fieldT->setMesh(meshT); fieldT->setArray(arr2); + fieldT->setNature(nature); + double *valsT=fieldT->getArray()->getPointer(); valsT[0]=7.; } // @@ -231,7 +231,7 @@ void prepareData1(int rank, ProcessorGroup * grp, NatureOfField nature, { const double coordsS[10]={1.,0.,0.5,0.5,1.,0.5,0.5,1.,1.,1.}; const double coordsT[6]={0.,0.,0.5,0.5,0.,1.}; - meshS=MEDCouplingUMesh::New(); + MUMesh meshS=MEDCouplingUMesh::New(); meshS->setMeshDimension(2); DataArrayDouble *myCoords=DataArrayDouble::New(); myCoords->alloc(5,2); @@ -243,15 +243,14 @@ void prepareData1(int rank, ProcessorGroup * grp, NatureOfField nature, meshS->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,connS); meshS->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,connS+3); meshS->finishInsertingCells(); - ComponentTopology comptopo; - parameshS=new ParaMESH(meshS,*grp,"source mesh"); - parafieldS=new ParaFIELD(ON_CELLS,NO_TIME,parameshS,comptopo); - parafieldS->getField()->setNature(nature); - double *valsS=parafieldS->getField()->getArray()->getPointer(); - valsS[0]=9.; - valsS[1]=11.; + fieldS = MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME); + DADouble arr = DataArrayDouble::New(); arr->alloc(meshS->getNumberOfCells(), 1); + fieldS->setMesh(meshS); fieldS->setArray(arr); + fieldS->setNature(nature); + double *valsS=fieldS->getArray()->getPointer(); + valsS[0]=9.; valsS[1]=11.; // - meshT=MEDCouplingUMesh::New(); + MUMesh meshT=MEDCouplingUMesh::New(); meshT->setMeshDimension(2); myCoords=DataArrayDouble::New(); myCoords->alloc(3,2); @@ -262,10 +261,11 @@ void prepareData1(int rank, ProcessorGroup * grp, NatureOfField nature, meshT->allocateCells(1); meshT->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,connT); meshT->finishInsertingCells(); - parameshT=new ParaMESH(meshT,*grp,"target mesh"); - parafieldT=new ParaFIELD(ON_CELLS,NO_TIME,parameshT,comptopo); - parafieldT->getField()->setNature(nature); - double *valsT=parafieldT->getField()->getArray()->getPointer(); + fieldT = MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME); + DADouble arr2 = DataArrayDouble::New(); arr2->alloc(meshT->getNumberOfCells(), 1); + fieldT->setMesh(meshT); fieldT->setArray(arr2); + fieldT->setNature(nature); + double *valsT=fieldT->getArray()->getPointer(); valsT[0]=8.; } // @@ -273,7 +273,7 @@ void prepareData1(int rank, ProcessorGroup * grp, NatureOfField nature, { const double coordsS[8]={0.,0.5, 0.5,0.5, 0.,1., 0.5,1.}; const double coordsT[6]={0.5,0.5,0.,1.,1.,1.}; - meshS=MEDCouplingUMesh::New(); + MUMesh meshS=MEDCouplingUMesh::New(); meshS->setMeshDimension(2); DataArrayDouble *myCoords=DataArrayDouble::New(); myCoords->alloc(4,2); @@ -284,14 +284,14 @@ void prepareData1(int rank, ProcessorGroup * grp, NatureOfField nature, meshS->allocateCells(1); meshS->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,connS); meshS->finishInsertingCells(); - ComponentTopology comptopo; - parameshS=new ParaMESH(meshS,*grp,"source mesh"); - parafieldS=new ParaFIELD(ON_CELLS,NO_TIME,parameshS,comptopo); - parafieldS->getField()->setNature(nature); - double *valsS=parafieldS->getField()->getArray()->getPointer(); + fieldS = MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME); + DADouble arr = DataArrayDouble::New(); arr->alloc(meshS->getNumberOfCells(), 1); + fieldS->setMesh(meshS); fieldS->setArray(arr); + fieldS->setNature(nature); + double *valsS=fieldS->getArray()->getPointer(); valsS[0]=10.; // - meshT=MEDCouplingUMesh::New(); + MUMesh meshT=MEDCouplingUMesh::New(); meshT->setMeshDimension(2); myCoords=DataArrayDouble::New(); myCoords->alloc(3,2); @@ -302,152 +302,15 @@ void prepareData1(int rank, ProcessorGroup * grp, NatureOfField nature, meshT->allocateCells(1); meshT->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,connT); meshT->finishInsertingCells(); - parameshT=new ParaMESH(meshT,*grp,"target mesh"); - parafieldT=new ParaFIELD(ON_CELLS,NO_TIME,parameshT,comptopo); - parafieldT->getField()->setNature(nature); - double *valsT=parafieldT->getField()->getArray()->getPointer(); + fieldT = MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME); + DADouble arr2 = DataArrayDouble::New(); arr2->alloc(meshT->getNumberOfCells(), 1); + fieldT->setMesh(meshT); fieldT->setArray(arr2); + fieldT->setNature(nature); + double *valsT=fieldT->getArray()->getPointer(); valsT[0]=9.; } } -/*! Test case from the official doc of the OverlapDEC. - * WARNING: bounding boxes are tweaked here to make the case more interesting (i.e. to avoid an all to all exchange - * between all procs). - */ -void ParaMEDMEMTest::testOverlapDEC1() -{ - int size, rank; - MPI_Comm_size(MPI_COMM_WORLD,&size); - MPI_Comm_rank(MPI_COMM_WORLD,&rank); - // char hostname[256]; - // printf("(%d) PID %d on localhost ready for attach\n", rank, getpid()); - // fflush(stdout); - -// if (rank == 1) -// { -// int i=1, j=0; -// while (i!=0) -// j=2; -// } - - if (size != 3) return ; - int nproc = 3; - std::set procs; - for (int i=0; igetField()->getArray()->getIJ(0,0),1e-12); - } - if(rank==1) - { - CPPUNIT_ASSERT_DOUBLES_EQUAL(8.5,parafieldT->getField()->getArray()->getIJ(0,0),1e-12); - } - if(rank==2) - { - CPPUNIT_ASSERT_DOUBLES_EQUAL(10.5,parafieldT->getField()->getArray()->getIJ(0,0),1e-12); - } - - delete parafieldS; - delete parafieldT; - delete parameshS; - delete parameshT; - meshS->decrRef(); - meshT->decrRef(); - - MPI_Barrier(MPI_COMM_WORLD); -} - -/*! - * Same as testOverlapDEC1() but with regular bounding boxes. If you're looking for a nice debug case, - * testOverlapDEC1() is more appropriate. - */ -void ParaMEDMEMTest::testOverlapDEC2() -{ - int size, rank; - MPI_Comm_size(MPI_COMM_WORLD,&size); - MPI_Comm_rank(MPI_COMM_WORLD,&rank); - - if (size != 3) return ; - int nproc = 3; - std::set procs; - for (int i=0; igetField()->getArray()->getIJ(0,0),1e-12); - } - if(rank==1) - { - CPPUNIT_ASSERT_DOUBLES_EQUAL(8.5,parafieldT->getField()->getArray()->getIJ(0,0),1e-12); - } - if(rank==2) - { - CPPUNIT_ASSERT_DOUBLES_EQUAL(10.5,parafieldT->getField()->getArray()->getIJ(0,0),1e-12); - } - delete parafieldS; - delete parafieldT; - delete parameshS; - delete parameshT; - meshS->decrRef(); - meshT->decrRef(); - - MPI_Barrier(MPI_COMM_WORLD); -} - void prepareData2_buildOneSquare(MEDCouplingUMesh* & meshS_0, MEDCouplingUMesh* & meshT_0) { const double coords[10] = {0.0,0.0, 0.0,1.0, 1.0,1.0, 1.0,0.0, 0.5,0.5}; @@ -487,7 +350,9 @@ void prepareData2_buildOneSquare(MEDCouplingUMesh* & meshS_0, MEDCouplingUMesh* void prepareData2(int rank, ProcessorGroup * grp, NatureOfField nature, MEDCouplingUMesh *& meshS, MEDCouplingUMesh *& meshT, ParaMESH*& parameshS, ParaMESH*& parameshT, - ParaFIELD*& parafieldS, ParaFIELD*& parafieldT) + ParaFIELD*& parafieldS, ParaFIELD*& parafieldT, + bool stripPartOfSource=false, + int fieldCompoNum=1) { MEDCouplingUMesh *meshS_0 = 0, *meshT_0 = 0; prepareData2_buildOneSquare(meshS_0, meshT_0); @@ -495,27 +360,37 @@ void prepareData2(int rank, ProcessorGroup * grp, NatureOfField nature, if(rank==0) { const double tr1[] = {1.5, 0.0}; - MEDCouplingUMesh *meshS_1 = static_cast(meshS_0->deepCpy()); + MEDCouplingUMesh *meshS_1 = static_cast(meshS_0->deepCopy()); meshS_1->translate(tr1); const double tr2[] = {3.0, 0.0}; - MEDCouplingUMesh *meshS_2 = static_cast(meshS_0->deepCpy()); + MEDCouplingUMesh *meshS_2 = static_cast(meshS_0->deepCopy()); meshS_2->translate(tr2); std::vector vec; - vec.push_back(meshS_0);vec.push_back(meshS_1);vec.push_back(meshS_2); + vec.push_back(meshS_0);vec.push_back(meshS_1); + if (!stripPartOfSource) + vec.push_back(meshS_2); meshS = MEDCouplingUMesh::MergeUMeshes(vec); meshS_1->decrRef(); meshS_2->decrRef(); - ComponentTopology comptopo; + ComponentTopology comptopo(fieldCompoNum); parameshS=new ParaMESH(meshS, *grp,"source mesh"); parafieldS=new ParaFIELD(ON_CELLS,ONE_TIME,parameshS,comptopo); parafieldS->getField()->setNature(nature); double *valsS=parafieldS->getField()->getArray()->getPointer(); - valsS[0]=1.; valsS[1]=2.; valsS[2]=3.; + for(int i=0; i < fieldCompoNum; i++) + { + valsS[i] = 1. * (10^i); + valsS[fieldCompoNum+i] = 2. * (10^i); + if (!stripPartOfSource) + { + valsS[2*fieldCompoNum+i] = 3. * (10^i); + } + } // const double tr3[] = {0.0, -1.5}; - MEDCouplingUMesh *meshT_3 = static_cast(meshT_0->deepCpy()); + MEDCouplingUMesh *meshT_3 = static_cast(meshT_0->deepCopy()); meshT_3->translate(tr3); vec.clear(); vec.push_back(meshT_0);vec.push_back(meshT_3); @@ -530,10 +405,10 @@ void prepareData2(int rank, ProcessorGroup * grp, NatureOfField nature, if(rank==1) { const double tr3[] = {0.0, -1.5}; - MEDCouplingUMesh *meshS_3 = static_cast(meshS_0->deepCpy()); + MEDCouplingUMesh *meshS_3 = static_cast(meshS_0->deepCopy()); meshS_3->translate(tr3); const double tr4[] = {1.5, -1.5}; - MEDCouplingUMesh *meshS_4 = static_cast(meshS_0->deepCpy()); + MEDCouplingUMesh *meshS_4 = static_cast(meshS_0->deepCopy()); meshS_4->translate(tr4); std::vector vec; @@ -541,22 +416,26 @@ void prepareData2(int rank, ProcessorGroup * grp, NatureOfField nature, meshS = MEDCouplingUMesh::MergeUMeshes(vec); meshS_3->decrRef(); meshS_4->decrRef(); - ComponentTopology comptopo; + ComponentTopology comptopo(fieldCompoNum); parameshS=new ParaMESH(meshS, *grp,"source mesh"); parafieldS=new ParaFIELD(ON_CELLS,ONE_TIME,parameshS,comptopo); parafieldS->getField()->setNature(nature); double *valsS=parafieldS->getField()->getArray()->getPointer(); - valsS[0]=4.; valsS[1]=5.; + for(int i=0; i < fieldCompoNum; i++) + { + valsS[i] = 4. * (10^i); + valsS[fieldCompoNum+i] = 5. * (10^i); + } // const double tr5[] = {1.5, 0.0}; - MEDCouplingUMesh *meshT_1 = static_cast(meshT_0->deepCpy()); + MEDCouplingUMesh *meshT_1 = static_cast(meshT_0->deepCopy()); meshT_1->translate(tr5); const double tr6[] = {3.0, 0.0}; - MEDCouplingUMesh *meshT_2 = static_cast(meshT_0->deepCpy()); + MEDCouplingUMesh *meshT_2 = static_cast(meshT_0->deepCopy()); meshT_2->translate(tr6); const double tr7[] = {1.5, -1.5}; - MEDCouplingUMesh *meshT_4 = static_cast(meshT_0->deepCpy()); + MEDCouplingUMesh *meshT_4 = static_cast(meshT_0->deepCopy()); meshT_4->translate(tr7); vec.clear(); @@ -572,6 +451,113 @@ void prepareData2(int rank, ProcessorGroup * grp, NatureOfField nature, meshT_0->decrRef(); } +/*! Test case from the official doc of the OverlapDEC. + * WARNING: bounding boxes might be tweaked here to make the case more interesting (i.e. to avoid an all to all exchange + * between all procs). + */ +void testOverlapDEC_generic(int workSharingAlgo, double bbAdj) +{ + int size, rank; + MPI_Comm_size(MPI_COMM_WORLD,&size); + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + // char hostname[256]; + // printf("(%d) PID %d on localhost ready for attach\n", rank, getpid()); + // fflush(stdout); + +// if (rank == 0) +// { +// int i=1, j=0; +// while (i!=0) +// j=2; +// } + + if (size != 3) return ; + int nproc = 3; + std::set procs; + for (int i=0; igetArray()->getIJ(0,0),1e-12); + } + if(rank==1) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(8.5,mcfieldT->getArray()->getIJ(0,0),1e-12); + } + if(rank==2) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(10.5,mcfieldT->getArray()->getIJ(0,0),1e-12); + } + + mcfieldS->decrRef(); + mcfieldT->decrRef(); + + MPI_Barrier(MPI_COMM_WORLD); +} + +void ParaMEDMEMTest::testOverlapDEC1() +{ + /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * HACK ON BOUNDING BOX TO MAKE THIS CASE SIMPLE AND USABLE IN DEBUG + * Bounding boxes are slightly smaller than should be, thus localizing the work to be done + * and avoiding every proc talking to everyone else. + * Obviously this is NOT a good idea to do this in production code :-) + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + testOverlapDEC_generic(0,-1.0e-12); +} + +void ParaMEDMEMTest::testOverlapDEC1_bis() +{ + // Same BB hack as above + testOverlapDEC_generic(1,-1.0e-12); +} + +void ParaMEDMEMTest::testOverlapDEC1_ter() +{ + // Same BB hack as above + testOverlapDEC_generic(2, -1.0e-12); +} + + +/*! + * Same as testOverlapDEC1() but with regular bounding boxes. If you're looking for a nice debug case, + * testOverlapDEC1() is identical in terms of geometry and field values, and more appropriate. + */ +void ParaMEDMEMTest::testOverlapDEC2() +{ + testOverlapDEC_generic(0,1.0e-12); +} + +void ParaMEDMEMTest::testOverlapDEC2_bis() +{ + testOverlapDEC_generic(1,1.0e-12); +} + +void ParaMEDMEMTest::testOverlapDEC2_ter() +{ + testOverlapDEC_generic(2,1.0e-12); +} + + /*! Test focused on the mapping of cell IDs. * (i.e. when only part of the source/target mesh is transmitted) */ @@ -594,13 +580,7 @@ void ParaMEDMEMTest::testOverlapDEC3() ParaMESH* parameshS=0, *parameshT=0; ParaFIELD* parafieldS=0, *parafieldT=0; - prepareData2(rank, grp, ConservativeVolumic, meshS, meshT, parameshS, parameshT, parafieldS, parafieldT); -// if (rank == 1) -// { -// int i=1, j=0; -// while (i!=0) -// j=2; -// } + prepareData2(rank, grp, IntensiveMaximum, meshS, meshT, parameshS, parameshT, parafieldS, parafieldT); dec.attachSourceLocalField(parafieldS); dec.attachTargetLocalField(parafieldT); @@ -610,7 +590,7 @@ void ParaMEDMEMTest::testOverlapDEC3() MEDCouplingFieldDouble * resField = parafieldT->getField(); if(rank==0) { - CPPUNIT_ASSERT_EQUAL(8, resField->getNumberOfTuples()); + CPPUNIT_ASSERT_EQUAL(8, (int)resField->getNumberOfTuples()); for(int i=0;i<4;i++) CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0,resField->getArray()->getIJ(i,0),1e-12); for(int i=4;i<8;i++) @@ -618,7 +598,7 @@ void ParaMEDMEMTest::testOverlapDEC3() } if(rank==1) { - CPPUNIT_ASSERT_EQUAL(12, resField->getNumberOfTuples()); + CPPUNIT_ASSERT_EQUAL(12, (int)resField->getNumberOfTuples()); for(int i=0;i<4;i++) CPPUNIT_ASSERT_DOUBLES_EQUAL(2.0,resField->getArray()->getIJ(i,0),1e-12); for(int i=4;i<8;i++) @@ -637,8 +617,88 @@ void ParaMEDMEMTest::testOverlapDEC3() } /*! - * Test default values and multi-component fields + * Tests: + * - default value + * - multi-component fields */ void ParaMEDMEMTest::testOverlapDEC4() { + int size, rank; + MPI_Comm_size(MPI_COMM_WORLD,&size); + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + + int nproc = 2; + if (size != nproc) return ; + std::set procs; + for (int i=0; igetField(); + if(rank==0) + { + CPPUNIT_ASSERT_EQUAL(8, (int)resField->getNumberOfTuples()); + for(int i=0;i<4;i++) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0,resField->getArray()->getIJ(i*2,0),1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(10.0,resField->getArray()->getIJ(i*2+1,0),1e-12); + } + for(int i=4;i<8;i++) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(4.0,resField->getArray()->getIJ(i*2,0),1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(40.0,resField->getArray()->getIJ(i*2+1,0),1e-12); + } + } + if(rank==1) + { + CPPUNIT_ASSERT_EQUAL(12, (int)resField->getNumberOfTuples()); + for(int i=0;i<4;i++) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(2.0,resField->getArray()->getIJ(i*2,0),1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(20.0,resField->getArray()->getIJ(i*2+1,0),1e-12); + } + // Default value should be here: + for(int i=4;i<8;i++) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(defVal,resField->getArray()->getIJ(i*2,0),1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(defVal,resField->getArray()->getIJ(i*2+1,0),1e-12); + } + for(int i=8;i<12;i++) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL(5.0,resField->getArray()->getIJ(i*2,0),1e-12); + CPPUNIT_ASSERT_DOUBLES_EQUAL(50.0,resField->getArray()->getIJ(i*2+1,0),1e-12); + } + } + delete parafieldS; + delete parafieldT; + delete parameshS; + delete parameshT; + meshS->decrRef(); + meshT->decrRef(); + + MPI_Barrier(MPI_COMM_WORLD); } +