Salome HOME
Merge from V6_main 01/04/2013
[modules/med.git] / src / MEDMEMCppTest / MEDMEMTest_Remapper.cxx
1 // Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
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.
7 //
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.
12 //
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
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #include "MEDMEMTest.hxx"
21
22 #include "MEDMEM_Remapper.hxx"
23 #include "MEDMEM_Meshing.hxx"
24
25 #include "MEDNormalizedUnstructuredMesh.txx"
26 #include "Interpolation3D.txx"
27
28 #include <cppunit/TestAssert.h>
29 #include <iostream>
30 //#include <vector>
31
32 // namespace MEDMEMTest
33 // {
34 void MEDMEMTest::test_RemapperP0P0() 
35 {
36   std::string sourcename=getResourceFile("square1.med");
37   MEDMEM::MESH *source_mesh=new MEDMEM::MESH (MED_DRIVER,sourcename,"Mesh_2");
38
39   std::string targetname=getResourceFile("square2.med");
40   MEDMEM::MESH *target_mesh=new MEDMEM::MESH (MED_DRIVER,targetname,"Mesh_3");
41
42   int nbcomp=3;
43
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++)
48     sourcevalue[i]=1.0;
49
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++)
54     targetvalue[i]=0.0;
55
56
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);
65
66   //MN: Old tests
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
71
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);
75
76   CPPUNIT_ASSERT_DOUBLES_EQUAL(source_integral,target_integral,1e-10);
77
78   //MN: Transfer test
79   double max = -2;
80   double min =  2;
81   for(int i = 0; i<target_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
82     {
83       if( targetvalue[i] >max) max = targetvalue[i];
84       if( targetvalue[i] <min) min = targetvalue[i];
85     }
86
87   CPPUNIT_ASSERT_DOUBLES_EQUAL(1,max,1e-10);
88   CPPUNIT_ASSERT_DOUBLES_EQUAL(1,min,1e-10);
89
90   //MN: Reverse transfer test
91   remapper.reverseTransfer(*source_field,*target_field);
92
93   max = -2;
94   min =  2;
95   for(int i = 0; i<source_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
96     {
97       if( sourcevalue[i] >max) max = sourcevalue[i];
98       if( sourcevalue[i] <min) min = sourcevalue[i];
99     }
100
101   CPPUNIT_ASSERT_DOUBLES_EQUAL(1,max,1e-10);
102   CPPUNIT_ASSERT_DOUBLES_EQUAL(1,min,1e-10);
103
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());
109   max = -2;
110   min =  2;
111   for(int i = 0; i<source_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
112     {
113       if( sourcevalue[i] >max) max = sourcevalue[i];
114       if( sourcevalue[i] <min) min = sourcevalue[i];
115     }
116
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++)
120     {
121       if( targetvalue[i] >max) max = targetvalue[i];
122       if( targetvalue[i] <min) min = targetvalue[i];
123     }
124
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();
135 }
136
137 void  MEDMEMTest::test_RemapperP1P1() 
138 {
139   std::string sourcename=getResourceFile("square1.med");
140   MEDMEM::MESH *source_mesh=new MEDMEM::MESH (MED_DRIVER,sourcename,"Mesh_2");
141
142   std::string targetname=getResourceFile("square2.med");
143   MEDMEM::MESH *target_mesh=new MEDMEM::MESH (MED_DRIVER,targetname,"Mesh_3");
144
145   int nbcomp=2;
146
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++)
151     sourcevalue[i]=1.0;
152
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;
158
159
160   MEDMEM_REMAPPER remapper;
161   remapper.prepare(*source_mesh,*target_mesh,"P1P1");
162   remapper.transfer(*source_field,*target_field);
163
164   double max = -2;
165   double min =  2;
166   for(int i = 0; i<target_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
167     {
168       if( targetvalue[i] >max) max = targetvalue[i];
169       if( targetvalue[i] <min) min = targetvalue[i];
170     }
171
172   CPPUNIT_ASSERT_DOUBLES_EQUAL(1,max,1e-10);
173   CPPUNIT_ASSERT_DOUBLES_EQUAL(1,min,1e-10);
174
175   remapper.reverseTransfer(*source_field,*target_field);
176
177   max = -2;
178   min =  2;
179   for(int i = 0; i<source_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
180     {
181       if( sourcevalue[i] >max) max = sourcevalue[i];
182       if( sourcevalue[i] <min) min = sourcevalue[i];
183     }
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();
190 }
191
192
193 void  MEDMEMTest::test_RemapperP1P0() 
194 {
195   std::string sourcename=getResourceFile("square1.med");
196   MEDMEM::MESH *source_mesh=new MEDMEM::MESH (MED_DRIVER,sourcename,"Mesh_2");
197
198   std::string targetname=getResourceFile("square2.med");
199   MEDMEM::MESH *target_mesh=new MEDMEM::MESH (MED_DRIVER,targetname,"Mesh_3");
200
201   int nbcomp=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++)
206     sourcevalue[i]=1.0;
207
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++)
212     targetvalue[i]=0.0;
213
214
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);
220
221   double max = -2;
222   double min =  2;
223   for(int i = 0; i<target_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
224     {
225       if( targetvalue[i] >max) max = targetvalue[i];
226       if( targetvalue[i] <min) min = targetvalue[i];
227     }
228
229   CPPUNIT_ASSERT_DOUBLES_EQUAL(1,max,1e-10);
230   CPPUNIT_ASSERT_DOUBLES_EQUAL(1,min,1e-10);
231
232   remapper.reverseTransfer(*source_field,*target_field);
233   max = -2;
234   min =  2;
235   for(int i = 0; i<source_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
236     {
237       if( sourcevalue[i] >max) max = sourcevalue[i];
238       if( sourcevalue[i] <min) min = sourcevalue[i];
239     }
240
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();
245 }
246
247 void  MEDMEMTest::test_RemapperP0P1() 
248 {
249   std::string sourcename=getResourceFile("square1.med");
250   MEDMEM::MESH *source_mesh=new MEDMEM::MESH (MED_DRIVER,sourcename,"Mesh_2");
251
252   std::string targetname=getResourceFile("square2.med");
253   MEDMEM::MESH *target_mesh=new MEDMEM::MESH (MED_DRIVER,targetname,"Mesh_3");
254
255   int nbcomp=4;
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++)
260     sourcevalue[i]=1.0;
261
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++)
266     targetvalue[i]=0.0;
267
268
269   MEDMEM_REMAPPER remapper;
270   remapper.prepare(*source_mesh,*target_mesh,"P0P1");
271   remapper.transfer(*source_field,*target_field);
272
273   double max = -2;
274   double min =  2;
275   for(int i = 0; i<target_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
276     {
277       if( targetvalue[i] >max) max = targetvalue[i];
278       if( targetvalue[i] <min) min = targetvalue[i];
279     }
280
281   CPPUNIT_ASSERT_DOUBLES_EQUAL(1,max,1e-10);
282   CPPUNIT_ASSERT_DOUBLES_EQUAL(1,min,1e-10);
283
284   remapper.reverseTransfer(*source_field,*target_field);
285
286   max = -2;
287   min =  2;
288   for(int i = 0; i<source_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS)*nbcomp; i++)
289     {
290       if( sourcevalue[i] >max) max = sourcevalue[i];
291       if( sourcevalue[i] <min) min = sourcevalue[i];
292     }
293
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();
300 }
301
302 namespace
303 {
304   MESH * build3DSourceMesh1()
305   {
306     const double coords[84]=
307       {
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
314       };
315
316     const int conn[212]=
317       {
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
327       };
328     MESHING* meshing = new MESHING;
329     meshing->setName( "TESTMESH" );
330     const int nNodes=28;
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] = 
335       {
336         "m", "m", "m" 
337       };
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);
345     //All cell conn
346     meshing->setConnectivity(MED_EN::MED_CELL,MED_EN::MED_TETRA4,conn);
347     return meshing;
348   }
349
350   MESH * build3DTargetMesh1()
351   {
352     const double coords[24]=
353       {
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
356       };
357
358     const int conn[20]=
359       {
360         6, 7, 4, 1, 2, 4, 1, 6, 4, 7, 6, 8, 7, 5, 1, 6, 7, 4, 1, 3
361       };
362
363     MESHING* meshing = new MESHING;
364     meshing->setName( "TESTMESH" );
365     const int nNodes=8;
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] = 
370       {
371         "m", "m", "m" 
372       };
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);
380     //All cell conn
381     meshing->setConnectivity(MED_EN::MED_CELL,MED_EN::MED_TETRA4,conn);
382     return meshing;
383   }
384
385   MESH * build1DTargetMesh1()
386   {
387     double coords[36]=
388       {
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.
391       };
392     const int conn[16]=
393       {
394         1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12
395       };
396     MESHING* meshing = new MESHING;
397     meshing->setName( "TESTMESH" );
398     const int nNodes=12;
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] = 
403       {
404         "m", "m", "m" 
405       };
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);
413     //All cell conn
414     meshing->setConnectivity(MED_EN::MED_CELL,MED_EN::MED_SEG2,conn);
415     return meshing;
416   }
417
418   MESH * build3DSourceMesh2()
419   {
420     double coords[27]=
421       {
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 
424       };
425     int conn[48]=
426       {
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
428       };
429     MESHING* meshing = new MESHING;
430     meshing->setName( "TESTMESH" );
431     const int nNodes=9;
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] = 
436       {
437         "m", "m", "m" 
438       };
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);
446     //
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);
452     //All cell conn
453     meshing->setConnectivity(MED_EN::MED_CELL,MED_EN::MED_TETRA4,conn);
454     meshing->setConnectivity(MED_EN::MED_FACE,MED_EN::MED_TRIA3,conn);
455     return meshing;
456   }
457
458   MESH * build3DTargetMesh2()
459   {
460     double coords[81]=
461       {
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. 
465       };
466     int conn[64]=
467       {
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
470       };
471     MESHING* meshing = new MESHING;
472     meshing->setName( "TESTMESH" );
473     const int nNodes=27;
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] = 
478       {
479         "m", "m", "m" 
480       };
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);
488     //
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);
494     //All cell conn
495     meshing->setConnectivity(MED_EN::MED_CELL,MED_EN::MED_HEXA8,conn);
496     meshing->setConnectivity(MED_EN::MED_FACE,MED_EN::MED_QUAD4,conn);
497     return meshing;
498   }
499
500   MESH * build3DSourceMesh2Poly()
501   {
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" );
510     const int nNodes=9;
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] = 
515       {
516         "m", "m", "m" 
517       };
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);
525     //All cell conn
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);
528     return meshing;
529   }
530
531   MESH * build3DTargetMesh2Poly()
532   {
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" );
542     const int nNodes=27;
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] = 
547       {
548         "m", "m", "m" 
549       };
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);
557     //All cell conn
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);
560     return meshing;
561   }
562 } // noname namespace
563
564 void MEDMEMTest::test_remapper4()
565 {
566   const double valsSrc[28]=
567     {
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.
569     };
570   const double targetExpected[8]= 
571     {
572       16.2061111122415724, 21.8916666665293072, 15.5833333333333321, 13.1613888888184309, 11.8583333333333361, 10.6969444444233712, 4.48388888888888815, 9.42500000000000071
573     };
574
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);
583   //
584   MEDMEM_REMAPPER remap;
585   remap.prepare(*source,*target,"P1P1");
586   remap.transfer(*f1,*f2);
587   const double *tmp=f2->getValue();
588   for(int i=0;i<8;i++)
589     CPPUNIT_ASSERT_DOUBLES_EQUAL(targetExpected[i],tmp[i],1e-12);
590   //
591   source->removeReference();
592   target->removeReference();
593   f1->removeReference();
594   f2->removeReference();
595 }
596
597 void MEDMEMTest::test_remapper5()
598 {
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);
631   res.clear();
632   //
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);
650   res.clear();
651   //
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);
680   //
681   targetMesh->removeReference();
682   sourceMesh->removeReference();
683 }
684
685 void MEDMEMTest::test_remapper6()
686 {
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();
721 }
722
723 void MEDMEMTest::test_remapper7()
724 {
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();
761 }
762
763 void MEDMEMTest::test_remapper3DTo1D()
764 {
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();
786 }
787
788 double MEDMEMTest::sumAll(const std::vector< std::map<int,double> >& matrix)
789 {
790   double ret=0.;
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;
794   return ret;
795 }
796
797 void MEDMEMTest::absField(MEDMEM::FIELD<double>& field)
798 {
799   double* areas=const_cast<double*>(field.getValue());
800   for (int i=0; i< field.getNumberOfValues();i++)
801     {
802       areas[i]=fabs(areas[i]);
803     }
804 }
805
806 // }