1 // Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
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.
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 "MEDMEMTest.hxx"
22 #include "MEDMEM_Remapper.hxx"
23 #include "MEDMEM_Meshing.hxx"
25 #include "MEDNormalizedUnstructuredMesh.txx"
26 #include "Interpolation3D.txx"
28 #include <cppunit/TestAssert.h>
32 // namespace MEDMEMTest
34 void MEDMEMTest::test_RemapperP0P0()
36 std::string sourcename=getResourceFile("square1.med");
37 MEDMEM::MESH *source_mesh=new MEDMEM::MESH (MED_DRIVER,sourcename,"Mesh_2");
39 std::string targetname=getResourceFile("square2.med");
40 MEDMEM::MESH *target_mesh=new MEDMEM::MESH (MED_DRIVER,targetname,"Mesh_3");
44 const MEDMEM::SUPPORT *source_support=source_mesh->getSupportOnAll( MED_EN::MED_CELL );
45 MEDMEM::FIELD<double> *source_field=new MEDMEM::FIELD<double>(source_support,nbcomp);
46 double* sourcevalue=const_cast<double*>(source_field->getValue());
47 for (int i=0; i<source_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
50 const MEDMEM::SUPPORT *target_support=target_mesh->getSupportOnAll( MED_EN::MED_CELL );
51 MEDMEM::FIELD<double> *target_field=new MEDMEM::FIELD<double>(target_support,nbcomp);
52 double* targetvalue=const_cast<double*>(target_field->getValue());
53 for (int i=0; i<target_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
57 MEDMEM_REMAPPER remapper;
58 const std::string intersectiontype = "IntersectionType";
59 std::string convex = "Convex";
60 remapper.setOptionDouble("Precision",1.e-8);
61 remapper.setOptionString(intersectiontype,convex);
62 remapper.setOptionInt("PrintLevel",1);
63 remapper.prepare(*source_mesh,*target_mesh,"P0P0");
64 remapper.transfer(*source_field,*target_field);
67 MEDMEM::FIELD<double> *source_areas=source_mesh->getArea(source_support);
68 MEDMEM::FIELD<double> *target_areas=target_mesh->getArea(target_support);
69 //MEDMEMTest::absField(*source_areas); //absolute value
70 //MEDMEMTest::absField(*target_areas); //absolute value
72 //target square is in reverse order as compared to initial square
73 double source_integral=source_field->normL2(nbcomp,source_areas);
74 double target_integral=target_field->normL2(nbcomp,target_areas);
76 CPPUNIT_ASSERT_DOUBLES_EQUAL(source_integral,target_integral,1e-10);
81 for(int i = 0; i<target_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
83 if( targetvalue[i] >max) max = targetvalue[i];
84 if( targetvalue[i] <min) min = targetvalue[i];
87 CPPUNIT_ASSERT_DOUBLES_EQUAL(1,max,1e-10);
88 CPPUNIT_ASSERT_DOUBLES_EQUAL(1,min,1e-10);
90 //MN: Reverse transfer test
91 remapper.reverseTransfer(*source_field,*target_field);
95 for(int i = 0; i<source_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
97 if( sourcevalue[i] >max) max = sourcevalue[i];
98 if( sourcevalue[i] <min) min = sourcevalue[i];
101 CPPUNIT_ASSERT_DOUBLES_EQUAL(1,max,1e-10);
102 CPPUNIT_ASSERT_DOUBLES_EQUAL(1,min,1e-10);
104 //MN: Hxx2salome transfer test
105 MEDMEM::FIELD<double> *newTargetField =remapper.transferField(*source_field);
106 MEDMEM::FIELD<double> *newSourceField =remapper.reverseTransferField(*target_field);
107 sourcevalue=const_cast<double*>((*newSourceField).getValue());
108 targetvalue=const_cast<double*>((*newTargetField).getValue());
111 for(int i = 0; i<source_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
113 if( sourcevalue[i] >max) max = sourcevalue[i];
114 if( sourcevalue[i] <min) min = sourcevalue[i];
117 CPPUNIT_ASSERT_DOUBLES_EQUAL(1,max,1e-10);
118 CPPUNIT_ASSERT_DOUBLES_EQUAL(1,min,1e-10);
119 for(int i = 0; i<target_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
121 if( targetvalue[i] >max) max = targetvalue[i];
122 if( targetvalue[i] <min) min = targetvalue[i];
125 CPPUNIT_ASSERT_DOUBLES_EQUAL(1,max,1e-10);
126 CPPUNIT_ASSERT_DOUBLES_EQUAL(1,min,1e-10);
127 source_field->removeReference();
128 newSourceField->removeReference();
129 newTargetField->removeReference();
130 target_mesh->removeReference();
131 source_areas->removeReference();
132 target_areas->removeReference();
133 target_field->removeReference();
134 source_mesh->removeReference();
137 void MEDMEMTest::test_RemapperP1P1()
139 std::string sourcename=getResourceFile("square1.med");
140 MEDMEM::MESH *source_mesh=new MEDMEM::MESH (MED_DRIVER,sourcename,"Mesh_2");
142 std::string targetname=getResourceFile("square2.med");
143 MEDMEM::MESH *target_mesh=new MEDMEM::MESH (MED_DRIVER,targetname,"Mesh_3");
147 const MEDMEM::SUPPORT *source_support=source_mesh->getSupportOnAll( MED_EN::MED_NODE );
148 MEDMEM::FIELD<double> *source_field=new MEDMEM::FIELD<double>(source_support,nbcomp);
149 double* sourcevalue=const_cast<double*>(source_field->getValue());
150 for (int i=0; i<source_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
153 const MEDMEM::SUPPORT *target_support=target_mesh->getSupportOnAll( MED_EN::MED_NODE );
154 MEDMEM::FIELD<double> *target_field=new MEDMEM::FIELD<double>(target_support,nbcomp);
155 double* targetvalue=const_cast<double*>(target_field->getValue());
156 for (int i=0; i<target_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
157 targetvalue[i]=-0.0001;
160 MEDMEM_REMAPPER remapper;
161 remapper.prepare(*source_mesh,*target_mesh,"P1P1");
162 remapper.transfer(*source_field,*target_field);
166 for(int i = 0; i<target_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
168 if( targetvalue[i] >max) max = targetvalue[i];
169 if( targetvalue[i] <min) min = targetvalue[i];
172 CPPUNIT_ASSERT_DOUBLES_EQUAL(1,max,1e-10);
173 CPPUNIT_ASSERT_DOUBLES_EQUAL(1,min,1e-10);
175 remapper.reverseTransfer(*source_field,*target_field);
179 for(int i = 0; i<source_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
181 if( sourcevalue[i] >max) max = sourcevalue[i];
182 if( sourcevalue[i] <min) min = sourcevalue[i];
184 CPPUNIT_ASSERT_DOUBLES_EQUAL(1,max,1e-10);
185 CPPUNIT_ASSERT_DOUBLES_EQUAL(1,min,1e-10);
186 source_field->removeReference();
187 source_mesh->removeReference();
188 target_field->removeReference();
189 target_mesh->removeReference();
193 void MEDMEMTest::test_RemapperP1P0()
195 std::string sourcename=getResourceFile("square1.med");
196 MEDMEM::MESH *source_mesh=new MEDMEM::MESH (MED_DRIVER,sourcename,"Mesh_2");
198 std::string targetname=getResourceFile("square2.med");
199 MEDMEM::MESH *target_mesh=new MEDMEM::MESH (MED_DRIVER,targetname,"Mesh_3");
202 const MEDMEM::SUPPORT *source_support=source_mesh->getSupportOnAll( MED_EN::MED_NODE );
203 MEDMEM::FIELD<double> *source_field=new MEDMEM::FIELD<double>(source_support,nbcomp);
204 double* sourcevalue=const_cast<double*>(source_field->getValue());
205 for (int i=0; i<source_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
208 const MEDMEM::SUPPORT *target_support=target_mesh->getSupportOnAll( MED_EN::MED_CELL );
209 MEDMEM::FIELD<double> *target_field=new MEDMEM::FIELD<double>(target_support,nbcomp);
210 double* targetvalue=const_cast<double*>(target_field->getValue());
211 for (int i=0; i<target_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
215 MEDMEM_REMAPPER remapper;
216 remapper.prepare(*source_mesh,*target_mesh,"P1P0");
217 target_mesh->removeReference();
218 source_mesh->removeReference();
219 remapper.transfer(*source_field,*target_field);
223 for(int i = 0; i<target_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
225 if( targetvalue[i] >max) max = targetvalue[i];
226 if( targetvalue[i] <min) min = targetvalue[i];
229 CPPUNIT_ASSERT_DOUBLES_EQUAL(1,max,1e-10);
230 CPPUNIT_ASSERT_DOUBLES_EQUAL(1,min,1e-10);
232 remapper.reverseTransfer(*source_field,*target_field);
235 for(int i = 0; i<source_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
237 if( sourcevalue[i] >max) max = sourcevalue[i];
238 if( sourcevalue[i] <min) min = sourcevalue[i];
241 CPPUNIT_ASSERT_DOUBLES_EQUAL(1,max,1e-10);
242 CPPUNIT_ASSERT_DOUBLES_EQUAL(1,min,1e-10);
243 source_field->removeReference();
244 target_field->removeReference();
247 void MEDMEMTest::test_RemapperP0P1()
249 std::string sourcename=getResourceFile("square1.med");
250 MEDMEM::MESH *source_mesh=new MEDMEM::MESH (MED_DRIVER,sourcename,"Mesh_2");
252 std::string targetname=getResourceFile("square2.med");
253 MEDMEM::MESH *target_mesh=new MEDMEM::MESH (MED_DRIVER,targetname,"Mesh_3");
256 const MEDMEM::SUPPORT *source_support=source_mesh->getSupportOnAll( MED_EN::MED_CELL );
257 MEDMEM::FIELD<double> *source_field=new MEDMEM::FIELD<double>(source_support,nbcomp);
258 double* sourcevalue=const_cast<double*>(source_field->getValue());
259 for (int i=0; i<source_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
262 const MEDMEM::SUPPORT *target_support=target_mesh->getSupportOnAll( MED_EN::MED_NODE );
263 MEDMEM::FIELD<double> *target_field=new MEDMEM::FIELD<double>(target_support,nbcomp);
264 double* targetvalue=const_cast<double*>(target_field->getValue());
265 for (int i=0; i<target_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
269 MEDMEM_REMAPPER remapper;
270 remapper.prepare(*source_mesh,*target_mesh,"P0P1");
271 remapper.transfer(*source_field,*target_field);
275 for(int i = 0; i<target_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
277 if( targetvalue[i] >max) max = targetvalue[i];
278 if( targetvalue[i] <min) min = targetvalue[i];
281 CPPUNIT_ASSERT_DOUBLES_EQUAL(1,max,1e-10);
282 CPPUNIT_ASSERT_DOUBLES_EQUAL(1,min,1e-10);
284 remapper.reverseTransfer(*source_field,*target_field);
288 for(int i = 0; i<source_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
290 if( sourcevalue[i] >max) max = sourcevalue[i];
291 if( sourcevalue[i] <min) min = sourcevalue[i];
294 CPPUNIT_ASSERT_DOUBLES_EQUAL(1,max,1e-10);
295 CPPUNIT_ASSERT_DOUBLES_EQUAL(1,min,1e-10);
296 source_field->removeReference();
297 target_field->removeReference();
298 target_mesh->removeReference();
299 source_mesh->removeReference();
304 MESH * build3DSourceMesh1()
306 const double coords[84]=
308 100.0, 100.0, 0.0, 100.0, 100.0, 100.0, 100.0, 0.0, 100.0, 100.0, 0.0, 0.0, 0.0, 100.0, 0.0,
309 0.0, 100.0, 100.0, 0.0, 0.0, 100.0, 0.0, 0.0, 0.0, 100.0, 100.0, 200.0, 100.0, 0.0, 200.0,
310 0.0, 100.0, 200.0, 0.0, 0.0, 200.0, 100.0, 200.0, 0.0, 100.0, 200.0, 100.0, 0.0, 200.0, 0.0,
311 0.0, 200.0, 100.0, 100.0, 200.0, 200.0, 0.0, 200.0, 200.0, 200.0, 100.0, 0.0, 200.0, 100.00000000833332,
312 100.00000000833332, 200.0, 0.0, 100.0, 200.0, 0.0, 0.0, 200.0, 100.0, 200.0, 200.0, 0.0, 200.0, 200.0,
313 200.0, 0.0, 200.0, 200.0, 100.0, 200.0, 200.0, 200.0, 149.999999970343, 149.9999999874621, 49.999999881628682
318 26, 28, 14, 20, 19, 4, 21, 22, 6, 11, 18, 2, 2, 4, 1, 8, 19, 2, 1, 28, 13, 28, 14, 25,
319 26, 20, 17, 27, 2, 3, 7, 9, 16, 14, 13, 6, 25, 14, 26, 28, 11, 12, 10, 7, 20, 9, 24, 2,
320 23, 9, 24, 20, 17, 14, 18, 2, 7, 10, 11, 9, 14, 18, 6, 16, 6, 5, 2, 13, 19, 1, 25, 28,
321 20, 21, 19, 2, 8, 7, 6, 2, 5, 13, 16, 15, 26, 28, 20, 19, 2, 20, 17, 14, 21, 20, 24, 2,
322 28, 13, 2, 1, 7, 6, 2, 11, 5, 6, 2, 8, 13, 28, 2, 14, 6, 16, 5, 13, 20, 17, 27, 23, 14,
323 6, 18, 2, 2, 4, 8, 3, 14, 6, 2, 13, 19, 2, 4, 1, 9, 24, 3, 10, 4, 2, 19, 21, 2, 28, 20,
324 14, 25, 26, 19, 28, 26, 17, 20, 14, 8, 2, 3, 7, 4, 2, 21, 3, 9, 17, 18, 2, 8, 5, 1, 2, 19,
325 20, 2, 28, 28, 13, 1, 25, 10, 7, 3, 9, 2, 5, 1, 13, 20, 17, 23, 9, 9, 3, 24, 2, 2, 17, 20,
326 9, 21, 3, 2, 24, 11, 2, 7, 9, 11, 9, 18, 2
328 MESHING* meshing = new MESHING;
329 meshing->setName( "TESTMESH" );
331 meshing->setCoordinates(3, nNodes, coords, "CARTESIAN", MED_EN::MED_FULL_INTERLACE);
332 std::string coordname[3] = { "x", "y", "z" };
333 meshing->setCoordinatesNames(coordname);
334 std::string coordunit[3] =
338 meshing->setCoordinatesUnits(coordunit);
339 //Cell connectivity info for classical elts
340 const MED_EN::medGeometryElement classicalTypesCell[1]={MED_EN::MED_TETRA4};
341 const int nbOfCellElts[1]={53};
342 meshing->setNumberOfTypes(1,MED_EN::MED_CELL);
343 meshing->setTypes(classicalTypesCell,MED_EN::MED_CELL);
344 meshing->setNumberOfElements(nbOfCellElts,MED_EN::MED_CELL);
346 meshing->setConnectivity(MED_EN::MED_CELL,MED_EN::MED_TETRA4,conn);
350 MESH * build3DTargetMesh1()
352 const double coords[24]=
354 200.0, 200.0, 0.0, 200.0, 200.0, 200.0, 200.0, 0.0, 0.0, 200.0, 0.0, 200.0,
355 0.0, 200.0, 0.0, 0.0, 200.0, 200.0, 0.0, 0.0, 0.0, 0.0, 0.0, 200.0
360 6, 7, 4, 1, 2, 4, 1, 6, 4, 7, 6, 8, 7, 5, 1, 6, 7, 4, 1, 3
363 MESHING* meshing = new MESHING;
364 meshing->setName( "TESTMESH" );
366 meshing->setCoordinates(3, nNodes, coords, "CARTESIAN",MED_EN::MED_FULL_INTERLACE);
367 std::string coordname[3] = { "x", "y", "z" };
368 meshing->setCoordinatesNames(coordname);
369 std::string coordunit[3] =
373 meshing->setCoordinatesUnits(coordunit);
374 //Cell connectivity info for classical elts
375 const MED_EN::medGeometryElement classicalTypesCell[1]={MED_EN::MED_TETRA4};
376 const int nbOfCellElts[1]={5};
377 meshing->setNumberOfTypes(1,MED_EN::MED_CELL);
378 meshing->setTypes(classicalTypesCell,MED_EN::MED_CELL);
379 meshing->setNumberOfElements(nbOfCellElts,MED_EN::MED_CELL);
381 meshing->setConnectivity(MED_EN::MED_CELL,MED_EN::MED_TETRA4,conn);
385 MESH * build1DTargetMesh1()
389 25.,25.,0., 25.,25.,50., 25.,25.,200., 75.,25.,0., 75.,25.,50., 75.,25.,200.,
390 25.,125.,0., 25.,125.,50., 25.,125.,200., 125.,125.,0., 125.,125.,50., 125.,125.,200.
394 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12
396 MESHING* meshing = new MESHING;
397 meshing->setName( "TESTMESH" );
399 meshing->setCoordinates(3, nNodes, coords, "CARTESIAN",MED_EN::MED_FULL_INTERLACE);
400 string coordname[3] = { "x", "y", "z" };
401 meshing->setCoordinatesNames(coordname);
402 string coordunit[3] =
406 meshing->setCoordinatesUnits(coordunit);
407 //Cell connectivity info for classical elts
408 const MED_EN::medGeometryElement classicalTypesCell[1]={MED_EN::MED_SEG2};
409 const int nbOfCellElts[1]={8};
410 meshing->setNumberOfTypes(1,MED_EN::MED_CELL);
411 meshing->setTypes(classicalTypesCell,MED_EN::MED_CELL);
412 meshing->setNumberOfElements(nbOfCellElts,MED_EN::MED_CELL);
414 meshing->setConnectivity(MED_EN::MED_CELL,MED_EN::MED_SEG2,conn);
418 MESH * build3DSourceMesh2()
422 0.0, 0.0, 200.0, 0.0, 0.0, 0.0, 0.0, 200.0, 200.0, 0.0, 200.0, 0.0, 200.0, 0.0, 200.0,
423 200.0, 0.0, 0.0, 200.0, 200.0, 200.0, 200.0, 200.0, 0.0, 100.0, 100.0, 100.0
427 9, 2, 8, 4, 7, 1, 9, 3, 8, 5, 6, 9, 7, 9, 5, 8, 7, 9, 1, 5, 7, 9, 8, 4, 9, 2, 4, 1, 5, 2, 6, 9, 2, 8, 6, 9, 1, 4, 9, 3, 9, 2, 1, 5, 4, 7, 9, 3
429 MESHING* meshing = new MESHING;
430 meshing->setName( "TESTMESH" );
432 meshing->setCoordinates(3, nNodes, coords, "CARTESIAN",MED_EN::MED_FULL_INTERLACE);
433 string coordname[3] = { "x", "y", "z" };
434 meshing->setCoordinatesNames(coordname);
435 string coordunit[3] =
439 meshing->setCoordinatesUnits(coordunit);
440 //Cell connectivity info for classical elts
441 const MED_EN::medGeometryElement classicalTypesCell[1]={MED_EN::MED_TETRA4};
442 const int nbOfCellElts[1]={12};
443 meshing->setNumberOfTypes(1,MED_EN::MED_CELL);
444 meshing->setTypes(classicalTypesCell,MED_EN::MED_CELL);
445 meshing->setNumberOfElements(nbOfCellElts,MED_EN::MED_CELL);
447 const MED_EN::medGeometryElement classicalTypesFace[1]={MED_EN::MED_TRIA3};
448 const int nbOfFaceElts[1]={1};
449 meshing->setNumberOfTypes(1,MED_EN::MED_FACE);
450 meshing->setTypes(classicalTypesFace,MED_EN::MED_FACE);
451 meshing->setNumberOfElements(nbOfFaceElts,MED_EN::MED_FACE);
453 meshing->setConnectivity(MED_EN::MED_CELL,MED_EN::MED_TETRA4,conn);
454 meshing->setConnectivity(MED_EN::MED_FACE,MED_EN::MED_TRIA3,conn);
458 MESH * build3DTargetMesh2()
462 0., 0., 0., 50., 0., 0. , 200., 0., 0. , 0., 50., 0., 50., 50., 0. , 200., 50., 0., 0., 200., 0., 50., 200., 0. , 200., 200., 0. ,
463 0., 0., 50., 50., 0., 50. , 200., 0., 50. , 0., 50., 50., 50., 50., 50. , 200., 50., 50., 0., 200., 50., 50., 200., 50. , 200., 200., 50. ,
464 0., 0., 200., 50., 0., 200. , 200., 0., 200. , 0., 50., 200., 50., 50., 200. , 200., 50., 200., 0., 200., 200., 50., 200., 200. , 200., 200., 200.
468 1, 2, 5, 4, 10, 11, 14, 13, 2, 3, 6, 5, 11, 12, 15, 14, 4, 5, 8, 7, 13, 14, 17, 16, 5, 6, 9, 8, 14, 15, 18,
469 17, 10, 11, 14, 13, 19, 20, 23, 22, 11, 12, 15, 14, 20, 21, 24, 23, 13, 14, 17, 16, 22, 23, 26, 25, 14, 15, 18, 17, 23, 24, 27, 26
471 MESHING* meshing = new MESHING;
472 meshing->setName( "TESTMESH" );
474 meshing->setCoordinates(3, nNodes, coords, "CARTESIAN",MED_EN::MED_FULL_INTERLACE);
475 string coordname[3] = { "x", "y", "z" };
476 meshing->setCoordinatesNames(coordname);
477 string coordunit[3] =
481 meshing->setCoordinatesUnits(coordunit);
482 //Cell connectivity info for classical elts
483 const MED_EN::medGeometryElement classicalTypesCell[1]={MED_EN::MED_HEXA8};
484 const int nbOfCellElts[1]={8};
485 meshing->setNumberOfTypes(1,MED_EN::MED_CELL);
486 meshing->setTypes(classicalTypesCell,MED_EN::MED_CELL);
487 meshing->setNumberOfElements(nbOfCellElts,MED_EN::MED_CELL);
489 const MED_EN::medGeometryElement classicalTypesFace[1]={MED_EN::MED_QUAD4};
490 const int nbOfFaceElts[1]={1};
491 meshing->setNumberOfTypes(1,MED_EN::MED_FACE);
492 meshing->setTypes(classicalTypesFace,MED_EN::MED_FACE);
493 meshing->setNumberOfElements(nbOfFaceElts,MED_EN::MED_FACE);
495 meshing->setConnectivity(MED_EN::MED_CELL,MED_EN::MED_HEXA8,conn);
496 meshing->setConnectivity(MED_EN::MED_FACE,MED_EN::MED_QUAD4,conn);
500 MESH * build3DSourceMesh2Poly()
502 double coords[27]={ 0.0, 0.0, 200.0, 0.0, 0.0, 0.0, 0.0, 200.0, 200.0, 0.0, 200.0, 0.0, 200.0, 0.0, 200.0,
503 200.0, 0.0, 0.0, 200.0, 200.0, 200.0, 200.0, 200.0, 0.0, 100.0, 100.0, 100.0 };
504 int conn[40]={9, 2, 8, 4, 7, 1, 9, 3, 8, 5, 6, 9, 7, 9, 5, 8, 7, 9, 1, 5, 7, 9, 8, 4, 9, 2, 4, 1, 5, 2, 6, 9, 2, 8, 6, 9, 1, 4, 9, 3};
505 int connPoly1[3]={1,16,31};
506 int connPoly2[30]={9, 2, 1, -1, 9, 5, 2, -1, 2, 5, 1, -1, 1, 5, 9,
507 4, 7, 9, -1, 4, 3, 7, -1, 7, 3, 9, -1, 9, 3, 4};
508 MESHING* meshing = new MESHING;
509 meshing->setName( "TESTMESH" );
511 meshing->setCoordinates(3, nNodes, coords, "CARTESIAN",MED_EN::MED_FULL_INTERLACE);
512 string coordname[3] = { "x", "y", "z" };
513 meshing->setCoordinatesNames(coordname);
514 string coordunit[3] =
518 meshing->setCoordinatesUnits(coordunit);
519 //Cell connectivity info for classical elts
520 const MED_EN::medGeometryElement typesCell[2]={MED_EN::MED_TETRA4,MED_EN::MED_POLYHEDRA};
521 const int nbOfCellElts[2]={10,2};
522 meshing->setNumberOfTypes(2,MED_EN::MED_CELL);
523 meshing->setTypes(typesCell,MED_EN::MED_CELL);
524 meshing->setNumberOfElements(nbOfCellElts,MED_EN::MED_CELL);
526 meshing->setConnectivity(MED_EN::MED_CELL,MED_EN::MED_TETRA4,conn);
527 meshing->setConnectivity(MED_EN::MED_CELL,MED_EN::MED_POLYHEDRA,connPoly2,connPoly1);
531 MESH * build3DTargetMesh2Poly()
533 double coords[81]={ 0., 0., 0., 50., 0., 0. , 200., 0., 0. , 0., 50., 0., 50., 50., 0. , 200., 50., 0., 0., 200., 0., 50., 200., 0. , 200., 200., 0. ,
534 0., 0., 50., 50., 0., 50. , 200., 0., 50. , 0., 50., 50., 50., 50., 50. , 200., 50., 50., 0., 200., 50., 50., 200., 50. , 200., 200., 50. ,
535 0., 0., 200., 50., 0., 200. , 200., 0., 200. , 0., 50., 200., 50., 50., 200. , 200., 50., 200., 0., 200., 200., 50., 200., 200. , 200., 200., 200. };
536 int conn[56]={1, 2, 5, 4, 10, 11, 14, 13, 2, 3, 6, 5, 11, 12, 15, 14, 4, 5, 8, 7, 13, 14, 17, 16, 5, 6, 9, 8, 14, 15, 18,
537 17, 10, 11, 14, 13, 19, 20, 23, 22, 11, 12, 15, 14, 20, 21, 24, 23, 13, 14, 17, 16, 22, 23, 26, 25};
538 int connPoly1[2]={1,30};
539 int connPoly3[29]={ 14, 15, 18, 17, -1, 23, 26, 27, 24, -1, 14, 23, 24, 15, -1, 15, 24, 27, 18, -1, 18, 27, 26, 17, -1, 17, 26, 23, 14};
540 MESHING* meshing = new MESHING;
541 meshing->setName( "TESTMESH" );
543 meshing->setCoordinates(3, nNodes, coords, "CARTESIAN",MED_EN::MED_FULL_INTERLACE);
544 string coordname[3] = { "x", "y", "z" };
545 meshing->setCoordinatesNames(coordname);
546 string coordunit[3] =
550 meshing->setCoordinatesUnits(coordunit);
551 //Cell connectivity info for classical elts
552 const MED_EN::medGeometryElement typesCell[2]={MED_EN::MED_HEXA8,MED_EN::MED_POLYHEDRA};
553 const int nbOfCellElts[2]={7,1};
554 meshing->setNumberOfTypes(2,MED_EN::MED_CELL);
555 meshing->setTypes(typesCell,MED_EN::MED_CELL);
556 meshing->setNumberOfElements(nbOfCellElts,MED_EN::MED_CELL);
558 meshing->setConnectivity(MED_EN::MED_CELL,MED_EN::MED_HEXA8,conn);
559 meshing->setConnectivity(MED_EN::MED_CELL,MED_EN::MED_POLYHEDRA,connPoly3,connPoly1);
562 } // noname namespace
564 void MEDMEMTest::test_remapper4()
566 const double valsSrc[28]=
568 1.,2.,3.,4.,5.,6.,7.,8.,9.,10.,11.,12.,13.,14.,15.,16.,17.,18.,19.,20.,21.,22.,23.,24.,25.,26.,27.,28.
570 const double targetExpected[8]=
572 16.2061111122415724, 21.8916666665293072, 15.5833333333333321, 13.1613888888184309, 11.8583333333333361, 10.6969444444233712, 4.48388888888888815, 9.42500000000000071
575 MESH *source=build3DSourceMesh1();
576 MESH *target=build3DTargetMesh1();
577 const SUPPORT *supSrc=source->getSupportOnAll( MED_EN::MED_NODE );
578 FIELD<double> *f1=new MEDMEM::FIELD<double>(supSrc,1);
579 double *val=(double *)f1->getValue();
580 std::copy(valsSrc,valsSrc+28,val);
581 const SUPPORT *supTrg=target->getSupportOnAll( MED_EN::MED_NODE );
582 FIELD<double> *f2=new FIELD<double>(supTrg,1);
584 MEDMEM_REMAPPER remap;
585 remap.prepare(*source,*target,"P1P1");
586 remap.transfer(*f1,*f2);
587 const double *tmp=f2->getValue();
589 CPPUNIT_ASSERT_DOUBLES_EQUAL(targetExpected[i],tmp[i],1e-12);
591 source->removeReference();
592 target->removeReference();
593 f1->removeReference();
594 f2->removeReference();
597 void MEDMEMTest::test_remapper5()
599 MESH *sourceMesh=build3DSourceMesh2();
600 MESH *targetMesh=build3DTargetMesh2();
601 MEDNormalizedUnstructuredMesh<3,3> sourceWrapper(sourceMesh);
602 MEDNormalizedUnstructuredMesh<3,3> targetWrapper(targetMesh);
603 INTERP_KERNEL::Interpolation3D myInterpolator;
604 vector<map<int,double> > res;
605 myInterpolator.setPrecision(1e-12);
606 myInterpolator.setIntersectionType(INTERP_KERNEL::PointLocator);
607 myInterpolator.interpolateMeshes(sourceWrapper,targetWrapper,res,"P0P0");
608 CPPUNIT_ASSERT_EQUAL(8,(int)res.size());
609 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[0][1],1e-12);
610 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[0][7],1e-12);
611 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[0][8],1e-12);
612 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[0][9],1e-12);
613 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[0][11],1e-12);
614 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[1][8],1e-12);
615 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[1][9],1e-12);
616 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[2][1],1e-12);
617 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[2][7],1e-12);
618 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[3][1],1e-12);
619 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[3][9],1e-12);
620 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[4][7],1e-12);
621 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[4][11],1e-12);
622 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[5][8],1e-12);
623 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[5][11],1e-12);
624 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[6][10],1e-12);
625 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[7][2],1e-12);
626 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[7][4],1e-12);
627 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[7][5],1e-12);
628 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[7][6],1e-12);
629 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[7][12],1e-12);
630 CPPUNIT_ASSERT_DOUBLES_EQUAL(21.,sumAll(res),1e-12);
633 MEDNormalizedUnstructuredMesh<3,3> sourceWrapper2(targetMesh);
634 MEDNormalizedUnstructuredMesh<3,3> targetWrapper2(sourceMesh);
635 INTERP_KERNEL::Interpolation3D myInterpolator2;
636 myInterpolator2.setPrecision(1e-12);
637 myInterpolator2.setIntersectionType(INTERP_KERNEL::PointLocator);
638 myInterpolator2.interpolateMeshes(sourceWrapper2,targetWrapper2,res,"P0P1");
639 CPPUNIT_ASSERT_EQUAL(9,(int)res.size());
640 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[0][5],1e-12);
641 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[1][1],1e-12);
642 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[2][7],1e-12);
643 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[3][3],1e-12);
644 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[4][6],1e-12);
645 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[5][2],1e-12);
646 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[6][8],1e-12);
647 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[7][4],1e-12);
648 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[8][8],1e-12);
649 CPPUNIT_ASSERT_DOUBLES_EQUAL(9.,sumAll(res),1e-12);
652 myInterpolator.setPrecision(1e-12);
653 myInterpolator.setIntersectionType(INTERP_KERNEL::PointLocator);
654 myInterpolator.interpolateMeshes(sourceWrapper,targetWrapper,res,"P1P0");
655 CPPUNIT_ASSERT_EQUAL(8,(int)res.size());
656 CPPUNIT_ASSERT_DOUBLES_EQUAL(3.75,res[0][2],1e-12);
657 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.25,res[0][9],1e-12);
658 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.5,res[1][2],1e-12);
659 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[1][6],1e-12);
660 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.5,res[1][9],1e-12);
661 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.5,res[2][2],1e-12);
662 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[2][4],1e-12);
663 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.5,res[2][9],1e-12);
664 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.5,res[3][2],1e-12);
665 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[3][8],1e-12);
666 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.5,res[3][9],1e-12);
667 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[4][1],1e-12);
668 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.5,res[4][2],1e-12);
669 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.5,res[4][9],1e-12);
670 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.5,res[5][2],1e-12);
671 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[5][5],1e-12);
672 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.5,res[5][9],1e-12);
673 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.25,res[6][1],1e-12);
674 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.25,res[6][3],1e-12);
675 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.25,res[6][4],1e-12);
676 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.25,res[6][9],1e-12);
677 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.25,res[7][7],1e-12);
678 CPPUNIT_ASSERT_DOUBLES_EQUAL(3.75,res[7][9],1e-12);
679 CPPUNIT_ASSERT_DOUBLES_EQUAL(21.,sumAll(res),1e-12);
681 targetMesh->removeReference();
682 sourceMesh->removeReference();
685 void MEDMEMTest::test_remapper6()
687 MESH *sourceMesh=build3DSourceMesh2Poly();
688 MESH *targetMesh=build3DTargetMesh2Poly();
689 MEDNormalizedUnstructuredMesh<3,3> sourceWrapper(sourceMesh);
690 MEDNormalizedUnstructuredMesh<3,3> targetWrapper(targetMesh);
691 INTERP_KERNEL::Interpolation3D myInterpolator;
692 vector<map<int,double> > res;
693 myInterpolator.setPrecision(1e-12);
694 myInterpolator.setIntersectionType(INTERP_KERNEL::PointLocator);
695 myInterpolator.interpolateMeshes(sourceWrapper,targetWrapper,res,"P0P0");
696 CPPUNIT_ASSERT_EQUAL(8,(int)res.size());
697 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[0][1],1e-12);
698 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[0][7],1e-12);
699 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[0][8],1e-12);
700 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[0][9],1e-12);
701 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[0][11],1e-12);
702 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[1][8],1e-12);
703 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[1][9],1e-12);
704 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[2][1],1e-12);
705 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[2][7],1e-12);
706 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[3][1],1e-12);
707 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[3][9],1e-12);
708 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[4][7],1e-12);
709 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[4][11],1e-12);
710 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[5][8],1e-12);
711 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[5][11],1e-12);
712 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[6][10],1e-12);
713 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[7][2],1e-12);
714 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[7][4],1e-12);
715 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[7][5],1e-12);
716 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[7][6],1e-12);
717 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[7][12],1e-12);
718 CPPUNIT_ASSERT_DOUBLES_EQUAL(21.,sumAll(res),1e-12);
719 targetMesh->removeReference();
720 sourceMesh->removeReference();
723 void MEDMEMTest::test_remapper7()
725 MESH *sourceMesh=build3DSourceMesh2();
726 MESH *targetMesh=build3DTargetMesh2();
727 sourceMesh->convertToPoly();
728 targetMesh->convertToPoly();
729 MEDNormalizedUnstructuredMesh<3,3> sourceWrapper(sourceMesh);
730 MEDNormalizedUnstructuredMesh<3,3> targetWrapper(targetMesh);
731 INTERP_KERNEL::Interpolation3D myInterpolator;
732 vector<map<int,double> > res;
733 myInterpolator.setPrecision(1e-12);
734 myInterpolator.setIntersectionType(INTERP_KERNEL::PointLocator);
735 myInterpolator.interpolateMeshes(sourceWrapper,targetWrapper,res,"P0P0");
736 CPPUNIT_ASSERT_EQUAL(8,(int)res.size());
737 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[0][1],1e-12);
738 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[0][7],1e-12);
739 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[0][8],1e-12);
740 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[0][9],1e-12);
741 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[0][11],1e-12);
742 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[1][8],1e-12);
743 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[1][9],1e-12);
744 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[2][1],1e-12);
745 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[2][7],1e-12);
746 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[3][1],1e-12);
747 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[3][9],1e-12);
748 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[4][7],1e-12);
749 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[4][11],1e-12);
750 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[5][8],1e-12);
751 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[5][11],1e-12);
752 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[6][10],1e-12);
753 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[7][2],1e-12);
754 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[7][4],1e-12);
755 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[7][5],1e-12);
756 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[7][6],1e-12);
757 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[7][12],1e-12);
758 CPPUNIT_ASSERT_DOUBLES_EQUAL(21.,sumAll(res),1e-12);
759 targetMesh->removeReference();
760 sourceMesh->removeReference();
763 void MEDMEMTest::test_remapper3DTo1D()
765 MESH *sourceMesh=build3DTargetMesh2();
766 MESH *targetMesh=build1DTargetMesh1();
767 MEDNormalizedUnstructuredMesh<3,3> sourceWrapper(sourceMesh);
768 MEDNormalizedUnstructuredMesh<3,3> targetWrapper(targetMesh);
769 INTERP_KERNEL::Interpolation3D myInterpolator;
770 vector<map<int,double> > res;
771 myInterpolator.setPrecision(1e-12);
772 myInterpolator.setIntersectionType(INTERP_KERNEL::PointLocator);
773 myInterpolator.interpolateMeshes(sourceWrapper,targetWrapper,res,"P0P0");
774 CPPUNIT_ASSERT_EQUAL(8,(int)res.size());
775 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[0][1],1e-12);
776 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[1][5],1e-12);
777 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[2][2],1e-12);
778 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[3][6],1e-12);
779 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[4][3],1e-12);
780 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[5][7],1e-12);
781 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[6][4],1e-12);
782 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,res[7][8],1e-12);
783 CPPUNIT_ASSERT_DOUBLES_EQUAL(8.,sumAll(res),1e-12);
784 targetMesh->removeReference();
785 sourceMesh->removeReference();
788 double MEDMEMTest::sumAll(const std::vector< std::map<int,double> >& matrix)
791 for(std::vector< std::map<int,double> >::const_iterator iter=matrix.begin();iter!=matrix.end();iter++)
792 for(std::map<int,double>::const_iterator iter2=(*iter).begin();iter2!=(*iter).end();iter2++)
793 ret+=(*iter2).second;
797 void MEDMEMTest::absField(MEDMEM::FIELD<double>& field)
799 double* areas=const_cast<double*>(field.getValue());
800 for (int i=0; i< field.getNumberOfValues();i++)
802 areas[i]=fabs(areas[i]);