1 // Copyright (C) 2007-2012 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
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 "MEDCouplingRemapperTest.hxx"
21 #include "MEDCouplingUMesh.hxx"
22 #include "MEDCouplingExtrudedMesh.hxx"
23 #include "MEDCouplingFieldDouble.hxx"
24 #include "MEDCouplingFieldTemplate.hxx"
25 #include "MEDCouplingMemArray.hxx"
26 #include "MEDCouplingRemapper.hxx"
28 #include "MEDCouplingBasicsTest.hxx"
33 using namespace ParaMEDMEM;
35 void MEDCouplingRemapperTest::test2DInterpP0P0_1()
37 MEDCouplingUMesh *sourceMesh=MEDCouplingBasicsTest::build2DSourceMesh_1();
38 MEDCouplingUMesh *targetMesh=MEDCouplingBasicsTest::build2DTargetMesh_1();
40 MEDCouplingRemapper remapper;
41 remapper.setPrecision(1e-12);
42 remapper.setIntersectionType(INTERP_KERNEL::Triangulation);
43 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(sourceMesh,targetMesh,"P0P0"));
45 MEDCouplingFieldDouble *srcField=MEDCouplingFieldDouble::New(ON_CELLS);
46 srcField->setNature(ConservativeVolumic);
47 srcField->setMesh(sourceMesh);
48 DataArrayDouble *array=DataArrayDouble::New();
49 array->alloc(sourceMesh->getNumberOfCells(),1);
50 srcField->setArray(array);
51 double *ptr=array->getPointer();
52 for(int i=0;i<sourceMesh->getNumberOfCells();i++)
55 MEDCouplingFieldDouble *trgfield=remapper.transferField(srcField,4.57);
56 const double *values=trgfield->getArray()->getConstPointer();
57 const double valuesExpected[5]={7.5 ,7. ,7.,8.,7.5};
58 CPPUNIT_ASSERT_EQUAL(5,trgfield->getArray()->getNumberOfTuples());
59 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
60 for(int i0=0;i0<5;i0++)
61 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected[i0],values[i0],1e-12);
64 srcField->setNature(IntegralGlobConstraint);
65 trgfield=remapper.transferField(srcField,4.57);
66 values=trgfield->getArray()->getConstPointer();
67 const double valuesExpected2[5]={3.75 ,1.75 ,1.75,4.,3.75};
68 CPPUNIT_ASSERT_EQUAL(5,trgfield->getArray()->getNumberOfTuples());
69 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
70 for(int i0=0;i0<5;i0++)
71 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected2[i0],values[i0],1e-12);
74 srcField->setNature(ConservativeVolumic);
75 trgfield=remapper.transferField(srcField,4.57);
76 values=trgfield->getArray()->getConstPointer();
77 CPPUNIT_ASSERT_EQUAL(5,trgfield->getArray()->getNumberOfTuples());
78 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
79 for(int i0=0;i0<5;i0++)
80 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected[i0],values[i0],1e-12);
83 srcField->setNature(IntegralGlobConstraint);
84 trgfield=remapper.transferField(srcField,4.57);
85 values=trgfield->getArray()->getConstPointer();
86 CPPUNIT_ASSERT_EQUAL(5,trgfield->getArray()->getNumberOfTuples());
87 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
88 for(int i0=0;i0<5;i0++)
89 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected2[i0],values[i0],1e-12);
92 srcField->setNature(Integral);
93 trgfield=remapper.transferField(srcField,4.57);
94 values=trgfield->getArray()->getConstPointer();
95 CPPUNIT_ASSERT_EQUAL(5,trgfield->getArray()->getNumberOfTuples());
96 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
97 for(int i0=0;i0<5;i0++)
98 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected2[i0],values[i0],1e-12);
101 srcField->setNature(RevIntegral);
102 trgfield=remapper.transferField(srcField,4.57);
103 values=trgfield->getArray()->getConstPointer();
104 CPPUNIT_ASSERT_EQUAL(5,trgfield->getArray()->getNumberOfTuples());
105 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
106 for(int i0=0;i0<5;i0++)
107 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected[i0],values[i0],1e-12);
112 sourceMesh->decrRef();
113 targetMesh->decrRef();
116 void MEDCouplingRemapperTest::test2DInterpP0P0R_1()
118 MEDCouplingUMesh *sourceMesh=MEDCouplingBasicsTest::build2DSourceMesh_1();
119 MEDCouplingUMesh *targetMesh=MEDCouplingBasicsTest::build2DTargetMesh_1();
121 MEDCouplingRemapper remapper;
122 remapper.setPrecision(1e-12);
123 remapper.setIntersectionType(INTERP_KERNEL::Triangulation);
124 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(sourceMesh,targetMesh,"P0P0"));
126 MEDCouplingFieldDouble *targetField=MEDCouplingFieldDouble::New(ON_CELLS);
127 targetField->setNature(ConservativeVolumic);
128 targetField->setMesh(sourceMesh);
129 DataArrayDouble *array=DataArrayDouble::New();
130 array->alloc(targetMesh->getNumberOfCells(),1);
131 targetField->setArray(array);
132 double *ptr=array->getPointer();
133 for(int i=0;i<targetMesh->getNumberOfCells();i++)
134 ptr[i]=(double)(i+7);
137 MEDCouplingFieldDouble *srcfield=remapper.reverseTransferField(targetField,4.57);
138 const double *values=srcfield->getArray()->getConstPointer();
139 const double valuesExpected[2]={8.75 ,9.5};
140 CPPUNIT_ASSERT_EQUAL(2,srcfield->getArray()->getNumberOfTuples());
141 CPPUNIT_ASSERT_EQUAL(1,srcfield->getArray()->getNumberOfComponents());
142 for(int i0=0;i0<2;i0++)
143 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected[i0],values[i0],1e-12);
146 targetField->setNature(IntegralGlobConstraint);
147 srcfield=remapper.reverseTransferField(targetField,4.57);
148 values=srcfield->getArray()->getConstPointer();
149 const double valuesExpected2[2]={26., 19.};
150 CPPUNIT_ASSERT_EQUAL(2,srcfield->getArray()->getNumberOfTuples());
151 CPPUNIT_ASSERT_EQUAL(1,srcfield->getArray()->getNumberOfComponents());
152 for(int i0=0;i0<2;i0++)
153 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected2[i0],values[i0],1e-12);
156 targetField->decrRef();
158 sourceMesh->decrRef();
159 targetMesh->decrRef();
162 void MEDCouplingRemapperTest::test1DInterp_1()
164 MEDCouplingUMesh *sourceMesh=MEDCouplingBasicsTest::build1DSourceMesh_2();
165 MEDCouplingUMesh *targetMesh=MEDCouplingBasicsTest::build1DTargetMesh_2();
167 MEDCouplingRemapper remapper;
168 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(sourceMesh,targetMesh,"P0P0"));
169 MEDCouplingFieldDouble *srcField=MEDCouplingFieldDouble::New(ON_CELLS);
170 srcField->setNature(ConservativeVolumic);
171 srcField->setMesh(sourceMesh);
172 DataArrayDouble *array=DataArrayDouble::New();
173 array->alloc(sourceMesh->getNumberOfCells(),1);
174 srcField->setArray(array);
175 double *ptr=array->getPointer();
176 for(int i=0;i<sourceMesh->getNumberOfCells();i++)
177 ptr[i]=(double)(i+7);
180 MEDCouplingFieldDouble *trgfield=remapper.transferField(srcField,4.57);
181 const double *values=trgfield->getArray()->getConstPointer();
182 const double valuesExpected1[2]={9.0540540540540526,7.4};
183 CPPUNIT_ASSERT_EQUAL(2,trgfield->getArray()->getNumberOfTuples());
184 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
185 for(int i0=0;i0<2;i0++)
186 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected1[i0],values[i0],1e-12);
188 const double valuesExpected2[2]={24.75,5.75};
189 srcField->setNature(Integral);
190 trgfield=remapper.transferField(srcField,4.57);
191 values=trgfield->getArray()->getConstPointer();
192 CPPUNIT_ASSERT_EQUAL(2,trgfield->getArray()->getNumberOfTuples());
193 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
194 for(int i0=0;i0<2;i0++)
195 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected2[i0],values[i0],1e-12);
198 const double valuesExpected3[2]={24.75,9.25};
199 srcField->setNature(IntegralGlobConstraint);
200 trgfield=remapper.transferField(srcField,4.57);
201 values=trgfield->getArray()->getConstPointer();
202 CPPUNIT_ASSERT_EQUAL(2,trgfield->getArray()->getNumberOfTuples());
203 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
204 for(int i0=0;i0<2;i0++)
205 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected3[i0],values[i0],1e-12);
208 const double valuesExpected4[2]={7.4444444444444446,7.4};
209 srcField->setNature(RevIntegral);
210 trgfield=remapper.transferField(srcField,4.57);
211 values=trgfield->getArray()->getConstPointer();
212 CPPUNIT_ASSERT_EQUAL(2,trgfield->getArray()->getNumberOfTuples());
213 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
214 for(int i0=0;i0<2;i0++)
215 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected4[i0],values[i0],1e-12);
219 sourceMesh->decrRef();
220 targetMesh->decrRef();
222 sourceMesh=MEDCouplingBasicsTest::build2DCurveSourceMesh_2();
223 targetMesh=MEDCouplingBasicsTest::build2DCurveTargetMesh_2();
224 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(sourceMesh,targetMesh,"P0P0"));
225 srcField=MEDCouplingFieldDouble::New(ON_CELLS);
226 srcField->setNature(ConservativeVolumic);
227 srcField->setMesh(sourceMesh);
228 array=DataArrayDouble::New();
229 array->alloc(sourceMesh->getNumberOfCells(),1);
230 srcField->setArray(array);
231 ptr=array->getPointer();
232 for(int i=0;i<sourceMesh->getNumberOfCells();i++)
233 ptr[i]=(double)(i+7);
236 trgfield=remapper.transferField(srcField,4.57);
237 values=trgfield->getArray()->getConstPointer();
238 CPPUNIT_ASSERT_EQUAL(2,trgfield->getArray()->getNumberOfTuples());
239 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
240 for(int i0=0;i0<2;i0++)
241 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected1[i0],values[i0],1e-12);
243 srcField->setNature(Integral);
244 trgfield=remapper.transferField(srcField,4.57);
245 values=trgfield->getArray()->getConstPointer();
246 CPPUNIT_ASSERT_EQUAL(2,trgfield->getArray()->getNumberOfTuples());
247 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
248 for(int i0=0;i0<2;i0++)
249 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected2[i0],values[i0],1e-12);
252 srcField->setNature(IntegralGlobConstraint);
253 trgfield=remapper.transferField(srcField,4.57);
254 values=trgfield->getArray()->getConstPointer();
255 CPPUNIT_ASSERT_EQUAL(2,trgfield->getArray()->getNumberOfTuples());
256 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
257 for(int i0=0;i0<2;i0++)
258 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected3[i0],values[i0],1e-12);
261 srcField->setNature(RevIntegral);
262 trgfield=remapper.transferField(srcField,4.57);
263 values=trgfield->getArray()->getConstPointer();
264 CPPUNIT_ASSERT_EQUAL(2,trgfield->getArray()->getNumberOfTuples());
265 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
266 for(int i0=0;i0<2;i0++)
267 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected4[i0],values[i0],1e-12);
271 sourceMesh->decrRef();
272 targetMesh->decrRef();
275 void MEDCouplingRemapperTest::test2DInterpMultiMethods()
277 MEDCouplingUMesh *sourceMesh=MEDCouplingBasicsTest::build2DSourceMesh_1();
278 MEDCouplingUMesh *targetMesh=MEDCouplingBasicsTest::build2DTargetMesh_1();
280 MEDCouplingRemapper remapper;
281 remapper.setPrecision(1e-12);
282 remapper.setIntersectionType(INTERP_KERNEL::Triangulation);
283 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(sourceMesh,targetMesh,"P0P0"));
285 MEDCouplingFieldDouble *srcField=MEDCouplingFieldDouble::New(ON_CELLS);
286 srcField->setNature(ConservativeVolumic);
287 srcField->setMesh(sourceMesh);
288 DataArrayDouble *array=DataArrayDouble::New();
289 array->alloc(sourceMesh->getNumberOfCells(),1);
290 srcField->setArray(array);
291 double *ptr=array->getPointer();
292 for(int i=0;i<sourceMesh->getNumberOfCells();i++)
293 ptr[i]=(double)(i+7);
295 MEDCouplingFieldDouble *trgfield=remapper.transferField(srcField,4.57);
296 const double *values=trgfield->getArray()->getConstPointer();
297 const double valuesExpected[5]={7.5 ,7. ,7.,8.,7.5};
298 CPPUNIT_ASSERT_EQUAL(5,trgfield->getArray()->getNumberOfTuples());
299 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
300 for(int i0=0;i0<5;i0++)
301 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected[i0],values[i0],1e-12);
305 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(sourceMesh,targetMesh,"P1P0"));
306 srcField=MEDCouplingFieldDouble::New(ON_NODES);
307 srcField->setNature(ConservativeVolumic);
308 srcField->setMesh(sourceMesh);
309 array=DataArrayDouble::New();
310 array->alloc(sourceMesh->getNumberOfNodes(),1);
311 srcField->setArray(array);
312 ptr=array->getPointer();
313 for(int i=0;i<sourceMesh->getNumberOfNodes();i++)
314 ptr[i]=(double)(i+7);
316 trgfield=remapper.transferField(srcField,4.57);
317 values=trgfield->getArray()->getConstPointer();
318 const double valuesExpected2[5]={7.,7.666666666666667,8.6666666666666661,8.8333333333333339,10.};
319 CPPUNIT_ASSERT_EQUAL(5,trgfield->getArray()->getNumberOfTuples());
320 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
321 for(int i0=0;i0<5;i0++)
322 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected2[i0],values[i0],1e-12);
326 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(targetMesh,sourceMesh,"P0P1"));
327 srcField=MEDCouplingFieldDouble::New(ON_CELLS);
328 srcField->setNature(ConservativeVolumic);
329 srcField->setMesh(targetMesh);
330 array=DataArrayDouble::New();
331 array->alloc(targetMesh->getNumberOfCells(),1);
332 srcField->setArray(array);
333 ptr=array->getPointer();
334 for(int i=0;i<targetMesh->getNumberOfCells();i++)
335 ptr[i]=(double)(i+7);
337 trgfield=remapper.transferField(srcField,4.57);
338 values=trgfield->getArray()->getConstPointer();
339 const double valuesExpected3[4]={7.5,8.5,10.,10.625};
340 CPPUNIT_ASSERT_EQUAL(4,trgfield->getArray()->getNumberOfTuples());
341 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
342 for(int i0=0;i0<4;i0++)
343 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected3[i0],values[i0],1e-12);
347 sourceMesh->decrRef();
348 targetMesh->decrRef();
350 sourceMesh=MEDCouplingBasicsTest::build2DSourceMesh_1();
351 targetMesh=MEDCouplingBasicsTest::build2DTargetMesh_2();
352 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(sourceMesh,targetMesh,"P1P1"));
353 srcField=MEDCouplingFieldDouble::New(ON_NODES);
354 srcField->setNature(ConservativeVolumic);
355 srcField->setMesh(sourceMesh);
356 array=DataArrayDouble::New();
357 array->alloc(sourceMesh->getNumberOfNodes(),1);
358 srcField->setArray(array);
359 ptr=array->getPointer();
360 for(int i=0;i<sourceMesh->getNumberOfNodes();i++)
361 ptr[i]=(double)(i+7);
363 trgfield=remapper.transferField(srcField,4.57);
364 values=trgfield->getArray()->getConstPointer();
365 const double valuesExpected4[9]={ 7.,7.35,8.,7.7,8.2857142857142865,
366 9.5333333333333332,9.,9.7666666666666657,10.};
367 CPPUNIT_ASSERT_EQUAL(9,trgfield->getArray()->getNumberOfTuples());
368 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
369 for(int i0=0;i0<9;i0++)
370 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected4[i0],values[i0],1e-12);
374 sourceMesh->decrRef();
375 targetMesh->decrRef();
378 void MEDCouplingRemapperTest::testMultiDimCombi()
381 MEDCouplingUMesh *sourceMesh=MEDCouplingBasicsTest::build2DSourceMesh_1();
382 MEDCouplingUMesh *targetMesh=MEDCouplingBasicsTest::build2DTargetMesh_1();
384 MEDCouplingRemapper remapper;
385 remapper.setPrecision(1e-12);
386 remapper.setIntersectionType(INTERP_KERNEL::Triangulation);
387 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(sourceMesh,targetMesh,"P0P0"));
388 MEDCouplingFieldDouble *srcField=MEDCouplingFieldDouble::New(ON_CELLS);
389 srcField->setNature(ConservativeVolumic);
390 srcField->setMesh(sourceMesh);
391 DataArrayDouble *array=DataArrayDouble::New();
392 array->alloc(sourceMesh->getNumberOfCells(),1);
393 srcField->setArray(array);
394 double *ptr=array->getPointer();
395 for(int i=0;i<sourceMesh->getNumberOfCells();i++)
396 ptr[i]=(double)(i+7);
398 MEDCouplingFieldDouble *trgField=remapper.transferField(srcField,4.57);
399 const double *values=trgField->getArray()->getConstPointer();
400 const double valuesExpected[5]={7.5 ,7. ,7.,8.,7.5};
401 CPPUNIT_ASSERT_EQUAL(5,trgField->getArray()->getNumberOfTuples());
402 CPPUNIT_ASSERT_EQUAL(1,trgField->getArray()->getNumberOfComponents());
403 for(int i0=0;i0<5;i0++)
404 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected[i0],values[i0],1e-12);
407 sourceMesh->decrRef();
408 targetMesh->decrRef();
409 // ------------- 3D Surf
410 sourceMesh=MEDCouplingBasicsTest::build3DSurfSourceMesh_1();
411 targetMesh=MEDCouplingBasicsTest::build3DSurfTargetMesh_1();
412 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(sourceMesh,targetMesh,"P0P0"));
413 srcField=MEDCouplingFieldDouble::New(ON_CELLS);
414 srcField->setNature(ConservativeVolumic);
415 srcField->setMesh(sourceMesh);
416 array=DataArrayDouble::New();
417 array->alloc(sourceMesh->getNumberOfCells(),1);
418 srcField->setArray(array);
419 ptr=array->getPointer();
420 for(int i=0;i<sourceMesh->getNumberOfCells();i++)
421 ptr[i]=(double)(i+8);
423 trgField=remapper.transferField(srcField,4.57);
424 CPPUNIT_ASSERT_EQUAL(5,trgField->getArray()->getNumberOfTuples());
425 CPPUNIT_ASSERT_EQUAL(1,trgField->getArray()->getNumberOfComponents());
426 const double valuesExpected2[5]={8.5,8.,8.,9.,8.5};
427 values=trgField->getArray()->getConstPointer();
428 for(int i0=0;i0<5;i0++)
429 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected2[i0],values[i0],1e-12);
432 sourceMesh->decrRef();
433 targetMesh->decrRef();
435 sourceMesh=MEDCouplingBasicsTest::build3DSourceMesh_1();
436 targetMesh=MEDCouplingBasicsTest::build3DTargetMesh_1();
437 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(sourceMesh,targetMesh,"P0P0"));
438 srcField=MEDCouplingFieldDouble::New(ON_CELLS);
439 srcField->setNature(ConservativeVolumic);
440 srcField->setMesh(sourceMesh);
441 array=DataArrayDouble::New();
442 array->alloc(sourceMesh->getNumberOfCells(),1);
443 srcField->setArray(array);
444 ptr=array->getPointer();
445 for(int i=0;i<sourceMesh->getNumberOfCells();i++)
446 ptr[i]=(double)(i+7);
448 trgField=remapper.transferField(srcField,4.57);
449 CPPUNIT_ASSERT_EQUAL(8,trgField->getArray()->getNumberOfTuples());
450 CPPUNIT_ASSERT_EQUAL(1,trgField->getArray()->getNumberOfComponents());
451 const double valuesExpected3[8]={13.166666666666668, 13.888888888888888, 10.722222222222223, 10.870370370370372,
452 14.555555555555555, 13.888888888888889, 14.444444444444443, 11.72222222222222};
453 values=trgField->getArray()->getConstPointer();
454 for(int i0=0;i0<8;i0++)
455 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected3[i0],values[i0],1e-12);
458 sourceMesh->decrRef();
459 targetMesh->decrRef();
460 // ------------- 3D -> 1D
461 sourceMesh=MEDCouplingBasicsTest::build3DTargetMesh_1();
462 targetMesh=MEDCouplingBasicsTest::build1DTargetMesh_1();
463 remapper.setIntersectionType(INTERP_KERNEL::PointLocator);
464 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(sourceMesh,targetMesh,"P0P0"));
465 srcField=MEDCouplingFieldDouble::New(ON_CELLS);
466 srcField->setNature(ConservativeVolumic);
467 srcField->setMesh(sourceMesh);
468 array=DataArrayDouble::New();
469 array->alloc(sourceMesh->getNumberOfCells(),1);
470 srcField->setArray(array);
471 ptr=array->getPointer();
472 for(int i=0;i<sourceMesh->getNumberOfCells();i++)
473 ptr[i]=(double)(i+7);
475 trgField=remapper.transferField(srcField,4.57);
476 CPPUNIT_ASSERT_EQUAL(8,trgField->getArray()->getNumberOfTuples());
477 CPPUNIT_ASSERT_EQUAL(1,trgField->getArray()->getNumberOfComponents());
478 const double valuesExpected4[8]={7.,11.,8.,12.,9.,13.,10.,14.};
479 values=trgField->getArray()->getConstPointer();
480 for(int i0=0;i0<8;i0++)
481 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected4[i0],values[i0],1e-12);
484 sourceMesh->decrRef();
485 targetMesh->decrRef();
486 // ------------- 1D -> 3D
487 sourceMesh=MEDCouplingBasicsTest::build1DTargetMesh_1();
488 targetMesh=MEDCouplingBasicsTest::build3DTargetMesh_1();
489 remapper.setIntersectionType(INTERP_KERNEL::PointLocator);
490 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(sourceMesh,targetMesh,"P0P0"));
491 srcField=MEDCouplingFieldDouble::New(ON_CELLS);
492 srcField->setNature(ConservativeVolumic);
493 srcField->setMesh(sourceMesh);
494 array=DataArrayDouble::New();
495 array->alloc(sourceMesh->getNumberOfCells(),1);
496 srcField->setArray(array);
497 ptr=array->getPointer();
498 for(int i=0;i<sourceMesh->getNumberOfCells();i++)
499 ptr[i]=(double)(i+7);
501 trgField=remapper.transferField(srcField,4.57);
502 CPPUNIT_ASSERT_EQUAL(8,trgField->getArray()->getNumberOfTuples());
503 CPPUNIT_ASSERT_EQUAL(1,trgField->getArray()->getNumberOfComponents());
504 const double valuesExpected5[8]={7.,9.,11.,13.,8.,10.,12.,14.};
505 values=trgField->getArray()->getConstPointer();
506 for(int i0=0;i0<8;i0++)
507 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected5[i0],values[i0],1e-12);
510 sourceMesh->decrRef();
511 targetMesh->decrRef();
512 // ------------- 2D -> 1D
513 sourceMesh=MEDCouplingBasicsTest::build2DTargetMesh_1();
514 targetMesh=build1DTargetMesh_2();
515 remapper.setIntersectionType(INTERP_KERNEL::PointLocator);
516 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(sourceMesh,targetMesh,"P0P0"));
517 srcField=MEDCouplingFieldDouble::New(ON_CELLS);
518 srcField->setNature(ConservativeVolumic);
519 srcField->setMesh(sourceMesh);
520 array=DataArrayDouble::New();
521 array->alloc(sourceMesh->getNumberOfCells(),1);
522 srcField->setArray(array);
523 ptr=array->getPointer();
524 for(int i=0;i<sourceMesh->getNumberOfCells();i++)
525 ptr[i]=(double)(i+7);
527 trgField=remapper.transferField(srcField,4.57);
528 const double valuesExpected8[5]={9.,8.,11.,7.,11.};
529 values=trgField->getArray()->getConstPointer();
530 for(int i0=0;i0<5;i0++)
531 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected8[i0],values[i0],1e-12);
534 sourceMesh->decrRef();
535 targetMesh->decrRef();
536 // ------------- 1D -> 2D
537 sourceMesh=build1DTargetMesh_2();
538 targetMesh=MEDCouplingBasicsTest::build2DTargetMesh_1();
539 remapper.setIntersectionType(INTERP_KERNEL::PointLocator);
540 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(sourceMesh,targetMesh,"P0P0"));
541 srcField=MEDCouplingFieldDouble::New(ON_CELLS);
542 srcField->setNature(ConservativeVolumic);
543 srcField->setMesh(sourceMesh);
544 array=DataArrayDouble::New();
545 array->alloc(sourceMesh->getNumberOfCells(),1);
546 srcField->setArray(array);
547 ptr=array->getPointer();
548 for(int i=0;i<sourceMesh->getNumberOfCells();i++)
549 ptr[i]=(double)(i+7);
551 trgField=remapper.transferField(srcField,4.57);
552 const double valuesExpected9[5]={10.,8.,7.,4.57,10.};
553 values=trgField->getArray()->getConstPointer();
554 for(int i0=0;i0<5;i0++)
555 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected9[i0],values[i0],1e-12);
558 sourceMesh->decrRef();
559 targetMesh->decrRef();
560 // ------------- 2D -> -1D
561 sourceMesh=MEDCouplingBasicsTest::build2DTargetMesh_1();
562 targetMesh=MEDCouplingUMesh::New("an example of -1 D mesh",-1);
563 srcField=MEDCouplingFieldDouble::New(ON_CELLS);
564 srcField->setNature(ConservativeVolumic);
565 srcField->setMesh(sourceMesh);
566 array=DataArrayDouble::New();
567 array->alloc(sourceMesh->getNumberOfCells(),1);
568 srcField->setArray(array);
569 ptr=array->getPointer();
570 for(int i=0;i<sourceMesh->getNumberOfCells();i++)
571 ptr[i]=(double)(i+7);
573 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(sourceMesh,targetMesh,"P0P0"));
574 trgField=remapper.transferField(srcField,4.57);
575 values=trgField->getArray()->getConstPointer();
576 CPPUNIT_ASSERT_EQUAL(1,trgField->getNumberOfTuples());
577 CPPUNIT_ASSERT_EQUAL(1,trgField->getNumberOfComponents());
578 CPPUNIT_ASSERT_DOUBLES_EQUAL(9.125,values[0],1e-14);
580 srcField=remapper.reverseTransferField(trgField,4.220173);
581 CPPUNIT_ASSERT_EQUAL(5,srcField->getNumberOfTuples());
582 CPPUNIT_ASSERT_EQUAL(1,srcField->getNumberOfComponents());
583 values=srcField->getArray()->getConstPointer();
584 for(int i0=0;i0<5;i0++)
585 CPPUNIT_ASSERT_DOUBLES_EQUAL(9.125,values[i0],1e-14);
587 trgField->setNature(Integral);
588 srcField=remapper.reverseTransferField(trgField,4.220173);
589 CPPUNIT_ASSERT_EQUAL(5,srcField->getNumberOfTuples());
590 CPPUNIT_ASSERT_EQUAL(1,srcField->getNumberOfComponents());
591 values=srcField->getArray()->getConstPointer();
592 const double valuesExpected6[5]={2.28125,1.140625,1.140625,2.28125,2.28125};
593 for(int i0=0;i0<5;i0++)
594 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected6[i0],values[i0],1e-14);
597 // ------------- -1D -> 2D
598 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(targetMesh,sourceMesh,"P0P0"));
599 trgField=MEDCouplingFieldDouble::New(ON_CELLS);
600 trgField->setNature(ConservativeVolumic);
601 trgField->setMesh(targetMesh);
602 array=DataArrayDouble::New();
603 array->alloc(targetMesh->getNumberOfCells(),1);
604 trgField->setArray(array);
605 ptr=array->getPointer();
608 srcField=remapper.transferField(trgField,4.221073);
609 values=srcField->getArray()->getConstPointer();
610 for(int i0=0;i0<5;i0++)
611 CPPUNIT_ASSERT_DOUBLES_EQUAL(7.,values[i0],1e-14);
613 trgField->setNature(IntegralGlobConstraint);
614 srcField=remapper.transferField(trgField,4.221073);
615 values=srcField->getArray()->getConstPointer();
616 const double valuesExpected7[5]={1.75,0.875,0.875,1.75,1.75};
617 for(int i0=0;i0<5;i0++)
618 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected7[i0],values[i0],1e-14);
620 trgField->setNature(Integral);
621 srcField=remapper.transferField(trgField,4.221073);
622 values=srcField->getArray()->getConstPointer();
623 for(int i0=0;i0<5;i0++)
624 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected7[i0],values[i0],1e-14);
627 sourceMesh->decrRef();
628 targetMesh->decrRef();
629 //------------- 1D -> 2D
630 const int conn[8]={0,1,1,2,2,3,3,0};
631 const int conn2[12]={6,7,5,4,2,7,6,3,0,4,5,1};
632 const double coords1[]={0.17,0.93,0.56,0.93,0.56,0.25,0.17,0.52};
633 const double coords2[]={0.,0.,1.,0.,1.,1.,0.,1.,0.,0.5,1.,0.5,0.,0.8,1.,0.8};
634 sourceMesh=MEDCouplingUMesh::New("src1D",1);
635 sourceMesh->allocateCells(4);
636 sourceMesh->insertNextCell(INTERP_KERNEL::NORM_SEG2,2,conn);
637 sourceMesh->insertNextCell(INTERP_KERNEL::NORM_SEG2,2,conn+2);
638 sourceMesh->insertNextCell(INTERP_KERNEL::NORM_SEG2,2,conn+4);
639 sourceMesh->insertNextCell(INTERP_KERNEL::NORM_SEG2,2,conn+6);
640 sourceMesh->finishInsertingCells();
641 array=DataArrayDouble::New(); array->alloc(4,2);
642 std::copy(coords1,coords1+8,array->getPointer());
643 sourceMesh->setCoords(array); array->decrRef();
644 targetMesh=MEDCouplingUMesh::New("trg2D",2);
645 targetMesh->allocateCells(3);
646 targetMesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn2);
647 targetMesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn2+4);
648 targetMesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn2+8);
649 targetMesh->finishInsertingCells();
650 array=DataArrayDouble::New(); array->alloc(8,2);
651 std::copy(coords2,coords2+16,array->getPointer());
652 targetMesh->setCoords(array); array->decrRef();
653 remapper.setPrecision(1e-12);
654 remapper.setIntersectionType(INTERP_KERNEL::Geometric2D);
655 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(sourceMesh,targetMesh,"P0P0"));
656 srcField=MEDCouplingFieldDouble::New(ON_CELLS);
657 srcField->setNature(ConservativeVolumic);
658 srcField->setMesh(sourceMesh);
659 array=DataArrayDouble::New();
660 array->alloc(4,1); array->iota(2.);
661 srcField->setArray(array); array->decrRef();
662 trgField=remapper.transferField(srcField,4.57);
663 const double valuesExpected10[3]={3.9674868868103834, 2.8, 3.6372633449255796};
664 CPPUNIT_ASSERT_EQUAL(3,trgField->getNumberOfTuples());
665 CPPUNIT_ASSERT_EQUAL(1,trgField->getNumberOfComponents());
667 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected10[i],trgField->getIJ(i,0),1e-13);
670 //------------- 2D -> 1D
671 remapper.setPrecision(1e-12);
672 remapper.setIntersectionType(INTERP_KERNEL::Geometric2D);
673 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(targetMesh,sourceMesh,"P0P0"));
674 srcField=MEDCouplingFieldDouble::New(ON_CELLS);
675 srcField->setNature(ConservativeVolumic);
676 srcField->setMesh(targetMesh);
677 array=DataArrayDouble::New();
678 array->alloc(3,1); array->iota(2.);
679 srcField->setArray(array); array->decrRef();
680 trgField=remapper.transferField(srcField,4.57);
681 const double valuesExpected11[4]={3., 2.9264705882352944, 3.8518518518518516, 2.3170731707317076};
682 CPPUNIT_ASSERT_EQUAL(4,trgField->getNumberOfTuples());
683 CPPUNIT_ASSERT_EQUAL(1,trgField->getNumberOfComponents());
685 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected11[i],trgField->getIJ(i,0),1e-13);
688 sourceMesh->decrRef();
689 targetMesh->decrRef();
690 //------------- 2D -> 3D
691 sourceMesh=MEDCouplingBasicsTest::build3D2DSourceMesh();
692 targetMesh=MEDCouplingBasicsTest::build3D2DTargetMesh();
693 remapper.setIntersectionType(INTERP_KERNEL::Triangulation);
694 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(sourceMesh,targetMesh,"P0P0"));
695 srcField=MEDCouplingFieldDouble::New(ON_CELLS);
696 srcField->setNature(ConservativeVolumic);
697 srcField->setMesh(sourceMesh);
698 array=DataArrayDouble::New();
699 array->alloc(7,1); array->iota(2.);
700 srcField->setArray(array); array->decrRef();
701 trgField=remapper.transferField(srcField,4.57);
702 const double valuesExpected12[3]={5.70909090909091, 6.08362715128042, 6.92857142857143};
703 CPPUNIT_ASSERT_EQUAL(3,trgField->getNumberOfTuples());
704 CPPUNIT_ASSERT_EQUAL(1,trgField->getNumberOfComponents());
706 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected12[i],trgField->getIJ(i,0),1e-13);
709 //------------- 3D -> 2D
710 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(targetMesh,sourceMesh,"P0P0"));
711 srcField=MEDCouplingFieldDouble::New(ON_CELLS);
712 srcField->setNature(ConservativeVolumic);
713 srcField->setMesh(targetMesh);
714 array=DataArrayDouble::New();
715 array->alloc(3,1); array->iota(2.);
716 srcField->setArray(array); array->decrRef();
717 trgField=remapper.transferField(srcField,4.57);
718 const double valuesExpected13[7]={3., 4., 2.5, 2.909090909090909, 2., 3.5, 3.3571428571428572};
719 CPPUNIT_ASSERT_EQUAL(7,trgField->getNumberOfTuples());
720 CPPUNIT_ASSERT_EQUAL(1,trgField->getNumberOfComponents());
722 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected13[i],trgField->getIJ(i,0),1e-13);
725 sourceMesh->decrRef();
726 targetMesh->decrRef();
729 void MEDCouplingRemapperTest::testNatureOfField()
731 MEDCouplingUMesh *sourceMesh=MEDCouplingBasicsTest::build2DSourceMesh_1();
732 MEDCouplingUMesh *targetMesh=build2DTargetMesh_3();
734 MEDCouplingRemapper remapper;
735 remapper.setPrecision(1e-12);
736 remapper.setIntersectionType(INTERP_KERNEL::Triangulation);
737 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(sourceMesh,targetMesh,"P0P0"));
738 MEDCouplingFieldDouble *srcField=MEDCouplingFieldDouble::New(ON_CELLS);
739 srcField->setNature(ConservativeVolumic);
740 srcField->setMesh(sourceMesh);
741 DataArrayDouble *array=DataArrayDouble::New();
742 array->alloc(sourceMesh->getNumberOfCells(),1);
743 srcField->setArray(array);
744 double *ptr=array->getPointer();
745 for(int i=0;i<sourceMesh->getNumberOfCells();i++)
746 ptr[i]=(double)(i+7);
748 MEDCouplingFieldDouble *trgfield=remapper.transferField(srcField,4.220173);
749 const double *values=trgfield->getArray()->getConstPointer();
750 const double valuesExpected[4]={7.75, 7.0625, 4.220173,8.0};
751 CPPUNIT_ASSERT_EQUAL(4,trgfield->getArray()->getNumberOfTuples());
752 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
753 for(int i0=0;i0<4;i0++)
754 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected[i0],values[i0],1e-12);
757 srcField->setNature(IntegralGlobConstraint);
758 trgfield=remapper.transferField(srcField,4.220173);
759 values=trgfield->getArray()->getConstPointer();
760 const double valuesExpected2[4]={2.8374999999999999, 7.3624999999999998, 4.220173, 4.7999999999999998};
761 CPPUNIT_ASSERT_EQUAL(4,trgfield->getArray()->getNumberOfTuples());
762 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
763 for(int i0=0;i0<4;i0++)
764 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected2[i0],values[i0],1e-12);
767 srcField->setNature(Integral);
768 trgfield=remapper.transferField(srcField,4.220173);
769 values=trgfield->getArray()->getConstPointer();
770 const double valuesExpected3[4]={1.24, 4.5199999999999996, 4.220173, 1.9199999999999999};
771 CPPUNIT_ASSERT_EQUAL(4,trgfield->getArray()->getNumberOfTuples());
772 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
773 for(int i0=0;i0<4;i0++)
774 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected3[i0],values[i0],1e-12);
777 srcField->setNature(RevIntegral);
778 trgfield=remapper.transferField(srcField,4.220173);
779 values=trgfield->getArray()->getConstPointer();
780 const double valuesExpected9[4]={2.48, 3.766666666666666, 4.220173, 1.9199999999999999};
781 CPPUNIT_ASSERT_EQUAL(4,trgfield->getArray()->getNumberOfTuples());
782 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
783 for(int i0=0;i0<4;i0++)
784 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected9[i0],values[i0],1e-12);
788 // REVERSE ***********
789 trgfield=MEDCouplingFieldDouble::New(ON_CELLS);
790 trgfield->setNature(ConservativeVolumic);
791 trgfield->setMesh(targetMesh);
792 array=DataArrayDouble::New();
793 array->alloc(targetMesh->getNumberOfCells(),1);
794 trgfield->setArray(array);
795 ptr=array->getPointer();
796 for(int i=0;i<targetMesh->getNumberOfCells();i++)
797 ptr[i]=(double)(i+7);
799 srcField=remapper.reverseTransferField(trgfield,4.220173);
800 values=srcField->getArray()->getConstPointer();
801 const double valuesExpected4[2]={7.9375, 8.9};
802 CPPUNIT_ASSERT_EQUAL(2,srcField->getArray()->getNumberOfTuples());
803 CPPUNIT_ASSERT_EQUAL(1,srcField->getArray()->getNumberOfComponents());
804 for(int i0=0;i0<2;i0++)
805 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected4[i0],values[i0],1e-12);
810 sourceMesh->decrRef();
811 targetMesh->decrRef();
813 sourceMesh=build2DTargetMesh_3();
814 targetMesh=MEDCouplingBasicsTest::build2DSourceMesh_1();
816 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(sourceMesh,targetMesh,"P0P0"));
817 srcField=MEDCouplingFieldDouble::New(ON_CELLS);
818 srcField->setNature(ConservativeVolumic);
819 srcField->setMesh(sourceMesh);
820 array=DataArrayDouble::New();
821 array->alloc(sourceMesh->getNumberOfCells(),1);
822 srcField->setArray(array);
823 ptr=array->getPointer();
824 for(int i=0;i<sourceMesh->getNumberOfCells();i++)
825 ptr[i]=(double)(i+7);
827 trgfield=remapper.transferField(srcField,4.220173);
828 values=trgfield->getArray()->getConstPointer();
829 const double valuesExpected5[2]={7.9375, 8.9};
830 CPPUNIT_ASSERT_EQUAL(2,trgfield->getArray()->getNumberOfTuples());
831 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
832 for(int i0=0;i0<2;i0++)
833 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected5[i0],values[i0],1e-12);
836 srcField->setNature(IntegralGlobConstraint);
837 trgfield=remapper.transferField(srcField,4.220173);
838 values=trgfield->getArray()->getConstPointer();
839 const double valuesExpected6[4]={9.25, 15.75};
840 CPPUNIT_ASSERT_EQUAL(2,trgfield->getArray()->getNumberOfTuples());
841 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
842 for(int i0=0;i0<2;i0++)
843 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected6[i0],values[i0],1e-12);
846 srcField->setNature(Integral);
847 trgfield=remapper.transferField(srcField,4.220173);
848 values=trgfield->getArray()->getConstPointer();
849 const double valuesExpected7[2]={4.56, 4.3466666666666667};
850 CPPUNIT_ASSERT_EQUAL(2,trgfield->getArray()->getNumberOfTuples());
851 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
852 for(int i0=0;i0<2;i0++)
853 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected7[i0],values[i0],1e-12);
856 srcField->setNature(RevIntegral);
857 trgfield=remapper.transferField(srcField,4.220173);
858 values=trgfield->getArray()->getConstPointer();
859 const double valuesExpected10[2]={5.08, 3.56};
860 CPPUNIT_ASSERT_EQUAL(2,trgfield->getArray()->getNumberOfTuples());
861 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
862 for(int i0=0;i0<2;i0++)
863 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected10[i0],values[i0],1e-12);
867 // REVERSE ***********
868 trgfield=MEDCouplingFieldDouble::New(ON_CELLS);
869 trgfield->setNature(ConservativeVolumic);
870 trgfield->setMesh(targetMesh);
871 array=DataArrayDouble::New();
872 array->alloc(targetMesh->getNumberOfCells(),1);
873 trgfield->setArray(array);
874 ptr=array->getPointer();
875 for(int i=0;i<targetMesh->getNumberOfCells();i++)
876 ptr[i]=(double)(i+7);
878 srcField=remapper.reverseTransferField(trgfield,4.220173);
879 values=srcField->getArray()->getConstPointer();
880 const double valuesExpected8[4]={7.75, 7.0625,4.220173, 8.0};
881 CPPUNIT_ASSERT_EQUAL(4,srcField->getArray()->getNumberOfTuples());
882 CPPUNIT_ASSERT_EQUAL(1,srcField->getArray()->getNumberOfComponents());
883 for(int i0=0;i0<4;i0++)
884 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected8[i0],values[i0],1e-12);
889 sourceMesh->decrRef();
890 targetMesh->decrRef();
893 void MEDCouplingRemapperTest::testExtruded()
895 MEDCouplingUMesh *mesh2DS=0;
896 MEDCouplingUMesh *mesh3DS=build3DExtrudedUMesh_1(mesh2DS);
897 MEDCouplingExtrudedMesh *extS=MEDCouplingExtrudedMesh::New(mesh3DS,mesh2DS,1);
900 MEDCouplingUMesh *mesh2DT=0;
901 MEDCouplingUMesh *mesh3DT=build3DExtrudedUMesh_1(mesh2DT);
902 MEDCouplingExtrudedMesh *extT=MEDCouplingExtrudedMesh::New(mesh3DT,mesh2DT,1);
912 void MEDCouplingRemapperTest::testExtruded2()
914 MEDCouplingUMesh *meshN,*meshTT,*meshTF;
915 MEDCouplingBasicsTest::build3DExtrudedUMesh_2(meshN,meshTT,meshTF);
917 double pt[3]={300.,300.,0.};
918 double v[3]={0.,0.,2.};
919 meshN->findNodesOnPlane(pt,v,1e-12,n);
920 MEDCouplingUMesh *meshN2D=(MEDCouplingUMesh *)meshN->buildFacePartOfMySelfNode(&n[0],&n[0]+n.size(),true);
924 DataArrayInt *da=meshTT->mergeNodes(1e-12,b,newNbOfNodes);
927 meshTT->findNodesOnPlane(pt,v,1e-12,n);
928 MEDCouplingUMesh *meshTT2D=(MEDCouplingUMesh *)meshTT->buildFacePartOfMySelfNode(&n[0],&n[0]+n.size(),true);
930 meshTF->findNodesOnPlane(pt,v,1e-12,n);
931 MEDCouplingUMesh *meshTF2D=(MEDCouplingUMesh *)meshTF->buildFacePartOfMySelfNode(&n[0],&n[0]+n.size(),true);
934 MEDCouplingExtrudedMesh *meshNE=MEDCouplingExtrudedMesh::New(meshN,meshN2D,0);
935 MEDCouplingExtrudedMesh *meshTTE=MEDCouplingExtrudedMesh::New(meshTT,meshTT2D,0);
936 MEDCouplingExtrudedMesh *meshTFE=MEDCouplingExtrudedMesh::New(meshTF,meshTF2D,0);
938 MEDCouplingRemapper remapper;
939 remapper.setPrecision(1e-12);
940 remapper.setIntersectionType(INTERP_KERNEL::Geometric2D);
941 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(meshNE,meshTTE,"P0P0"));
942 MEDCouplingFieldDouble *srcField=MEDCouplingFieldDouble::New(ON_CELLS);
943 srcField->setNature(IntegralGlobConstraint);
944 srcField->setMesh(meshNE);
945 DataArrayDouble *array=DataArrayDouble::New();
946 array->alloc(meshNE->getNumberOfCells(),1);
947 srcField->setArray(array);
949 1000.,1000.,1020.,1030.,1040.,1000.,1000.,1070.,1080.,1090.,1000.,1000.,1120.,1130.,1140.,1000.,1000.,1170.,1180.,1190.,
950 2000.,2000.,2020.,2030.,2040.,2000.,2000.,2070.,2080.,2090.,2000.,2000.,2120.,2130.,2140.,2000.,2000.,2170.,2180.,2190.,
952 CPPUNIT_ASSERT_EQUAL((int)(sizeof(vals1)/sizeof(double)),meshNE->getNumberOfCells());
953 std::copy(vals1,vals1+meshNE->getNumberOfCells(),array->getPointer());
955 MEDCouplingFieldDouble *trgField=remapper.transferField(srcField,4.220173);
956 double expected1[200]={
957 800.,800.,800.,800.,800.,800.,800.,800.,800.,800.,1600.,1600.,1600.,1600.,1600.,1600.,1600.,1600.,1600.,1600.,
958 102.,102.,102.,102.,102.,102.,102.,102.,102.,102.,202.,202.,202.,202.,202.,202.,202.,202.,202.,202.,
959 103.,103.,103.,103.,103.,103.,103.,103.,103.,103.,203.,203.,203.,203.,203.,203.,203.,203.,203.,203.,
960 104.,104.,104.,104.,104.,104.,104.,104.,104.,104.,204.,204.,204.,204.,204.,204.,204.,204.,204.,204.,
961 219.,219.,219.,219.,219.,219.,219.,219.,219.,219.,419.,419.,419.,419.,419.,419.,419.,419.,419.,419.,
962 221.,221.,221.,221.,221.,221.,221.,221.,221.,221.,421.,421.,421.,421.,421.,421.,421.,421.,421.,421.,
963 223.,223.,223.,223.,223.,223.,223.,223.,223.,223.,423.,423.,423.,423.,423.,423.,423.,423.,423.,423.,
964 117.,117.,117.,117.,117.,117.,117.,117.,117.,117.,217.,217.,217.,217.,217.,217.,217.,217.,217.,217.,
965 118.,118.,118.,118.,118.,118.,118.,118.,118.,118.,218.,218.,218.,218.,218.,218.,218.,218.,218.,218.,
966 119.,119.,119.,119.,119.,119.,119.,119.,119.,119.,219.,219.,219.,219.,219.,219.,219.,219.,219.,219.
968 for(int i=0;i<200;i++)
969 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],trgField->getArray()->getConstPointer()[i],1e-3);//1e-3 precision due to non coincidence in 1D mesh
970 CPPUNIT_ASSERT_DOUBLES_EQUAL(std::accumulate(expected1,expected1+200,0.),std::accumulate(vals1,vals1+40,0.),1e-10);
971 CPPUNIT_ASSERT_DOUBLES_EQUAL(std::accumulate(expected1,expected1+200,0.),std::accumulate(trgField->getArray()->getConstPointer(),trgField->getArray()->getConstPointer()+200,0.),1e-10);
974 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(meshNE,meshTFE,"P0P0"));
975 trgField=remapper.transferField(srcField,4.220173);
976 double expected2[340]={25.5, 51.25, 51.75, 26., 79., 158.75, 160.25, 80.5, 85.25, 171.25, 172.75, 86.75, 29.25, 58.75, 59.25, 29.75, 25.5, 51.25, 51.75, 26., 79., 158.75,
977 160.25, 80.5, 85.25, 171.25, 172.75, 86.75, 29.25, 58.75, 59.25, 29.75, 25.5, 51.25, 51.75, 26., 79., 158.75, 160.25, 80.5, 85.25, 171.25, 172.75, 86.75,
978 29.25, 58.75, 59.25, 29.75, 25.5, 51.25, 51.75, 26., 79., 158.75, 160.25, 80.5, 85.25, 171.25, 172.75, 86.75, 29.25, 58.75, 59.25, 29.75, 25.5, 51.25, 51.75,
979 26., 79., 158.75, 160.25, 80.5, 85.25, 171.25, 172.75, 86.75, 29.25, 58.75, 59.25, 29.75, 25.5, 51.25, 51.75, 26., 79., 158.75, 160.25, 80.5, 85.25, 171.25,
980 172.75, 86.75, 29.25, 58.75, 59.25, 29.75, 25.5, 51.25, 51.75, 26., 79., 158.75, 160.25, 80.5, 85.25, 171.25, 172.75, 86.75, 29.25, 58.75, 59.25, 29.75, 25.5,
981 51.25, 51.75, 26., 79., 158.75, 160.25, 80.5, 85.25, 171.25, 172.75, 86.75, 29.25, 58.75, 59.25, 29.75, 25.5, 51.25, 51.75, 26., 79., 158.75, 160.25, 80.5,
982 85.25, 171.25, 172.75, 86.75, 29.25, 58.75, 59.25, 29.75, 25.5, 51.25, 51.75, 26., 79., 158.75, 160.25, 80.5, 85.25, 171.25, 172.75, 86.75, 29.25, 58.75, 59.25,
983 29.75, 50.5, 101.25, 101.75, 51., 154., 308.75, 310.25, 155.5, 160.25, 321.25, 322.75, 161.75, 54.25, 108.75, 109.25, 54.75, 50.5, 101.25, 101.75, 51., 154.,
984 308.75, 310.25, 155.5, 160.25, 321.25, 322.75, 161.75, 54.25, 108.75, 109.25, 54.75, 50.5, 101.25, 101.75, 51., 154., 308.75, 310.25, 155.5, 160.25, 321.25, 322.75,
985 161.75, 54.25, 108.75, 109.25, 54.75, 50.5, 101.25, 101.75, 51., 154., 308.75, 310.25, 155.5, 160.25, 321.25, 322.75, 161.75, 54.25, 108.75, 109.25, 54.75, 50.5,
986 101.25, 101.75, 51., 154., 308.75, 310.25, 155.5, 160.25, 321.25, 322.75, 161.75, 54.25, 108.75, 109.25, 54.75, 50.5, 101.25, 101.75, 51., 154., 308.75, 310.25,
987 155.5, 160.25, 321.25, 322.75, 161.75, 54.25, 108.75, 109.25, 54.75, 50.5, 101.25, 101.75, 51., 154., 308.75, 310.25, 155.5, 160.25, 321.25, 322.75, 161.75, 54.25,
988 108.75, 109.25, 54.75, 50.5, 101.25, 101.75, 51., 154., 308.75, 310.25, 155.5, 160.25, 321.25, 322.75, 161.75, 54.25, 108.75, 109.25, 54.75, 50.5, 101.25, 101.75,
989 51., 154., 308.75, 310.25, 155.5, 160.25, 321.25, 322.75, 161.75, 54.25, 108.75, 109.25, 54.75, 50.5, 101.25, 101.75, 51., 154., 308.75, 310.25, 155.5, 160.25, 321.25,
990 322.75, 161.75, 54.25, 108.75, 109.25, 54.75, 800., 800., 800., 800., 800., 800., 800., 800., 800., 800., 1600., 1600., 1600., 1600., 1600., 1600., 1600.,
991 1600., 1600., 1600.};
992 for(int i=0;i<340;i++)
993 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],trgField->getArray()->getConstPointer()[i],1e-3);//1e-3 precision due to non coincidence in 1D mesh
994 CPPUNIT_ASSERT_DOUBLES_EQUAL(std::accumulate(expected2,expected2+340,0.),std::accumulate(vals1,vals1+40,0.),1e-10);
995 CPPUNIT_ASSERT_DOUBLES_EQUAL(std::accumulate(expected2,expected2+340,0.),std::accumulate(trgField->getArray()->getConstPointer(),trgField->getArray()->getConstPointer()+340,0.),1e-10);
1000 100., 200., 300., 400., 500., 600., 700., 800., 900., 1000., 1100., 1200., 1300., 1400., 1500., 1600., 1700., 1800., 1900., 2000,
1001 101., 201., 301., 401., 501., 601., 701., 801., 901., 1001., 1101., 1201., 1301., 1401., 1501., 1601., 1701., 1801., 1901., 2001,
1002 102., 202., 302., 402., 502., 602., 702., 802., 902., 1002., 1102., 1202., 1302., 1402., 1502., 1602., 1702., 1802., 1902., 2002,
1003 103., 203., 303., 403., 503., 603., 703., 803., 903., 1003., 1103., 1203., 1303., 1403., 1503., 1603., 1703., 1803., 1903., 2003,
1004 104., 204., 304., 404., 504., 604., 704., 804., 904., 1004., 1104., 1204., 1304., 1404., 1504., 1604., 1704., 1804., 1904., 2004,
1005 105., 205., 305., 405., 505., 605., 705., 805., 905., 1005., 1105., 1205., 1305., 1405., 1505., 1605., 1705., 1805., 1905., 2005,
1006 106., 206., 306., 406., 506., 606., 706., 806., 906., 1006., 1106., 1206., 1306., 1406., 1506., 1606., 1706., 1806., 1906., 2006,
1007 107., 207., 307., 407., 507., 607., 707., 807., 907., 1007., 1107., 1207., 1307., 1407., 1507., 1607., 1707., 1807., 1907., 2007,
1008 108., 208., 308., 408., 508., 608., 708., 808., 908., 1008., 1108., 1208., 1308., 1408., 1508., 1608., 1708., 1808., 1908., 2008,
1009 109., 209., 309., 409., 509., 609., 709., 809., 909., 1009., 1109., 1209., 1309., 1409., 1509., 1609., 1709., 1809., 1909., 2009.
1011 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(meshNE,meshTTE,"P0P0"));
1012 trgField=MEDCouplingFieldDouble::New(ON_CELLS);
1013 trgField->setNature(ConservativeVolumic);
1014 trgField->setMesh(meshTTE);
1015 array=DataArrayDouble::New();
1016 array->alloc(meshTTE->getNumberOfCells(),1);
1017 trgField->setArray(array);
1018 std::copy(vals2,vals2+meshTTE->getNumberOfCells(),array->getPointer());
1020 srcField=remapper.reverseTransferField(trgField,4.220173);
1021 double expected3[40]={
1022 550.,550.,551.,552.,553.,550.,550.,554.,555.,556.,550.,550.,554.,555.,556.,550.,550.,557.,558.,559.,
1023 1550.,1550.,1551.,1552.,1553.,1550.,1550.,1554.,1555.,1556.,1550.,1550.,1554.,1555.,1556.,1550.,1550.,1557.,1558.,1559.
1025 for(int i=0;i<40;i++)
1026 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected3[i],srcField->getArray()->getConstPointer()[i],1e-3);//1e-3 precision due to non coincidence in 1D mesh
1027 srcField->decrRef();
1028 trgField->decrRef();
1031 100., 101., 102., 103., 104., 105., 106., 107., 108., 109., 110., 111., 112., 113., 114., 115.,
1032 200., 201., 202., 203., 204., 205., 206., 207., 208., 209., 210., 211., 212., 213., 214., 215.,
1033 300., 301., 302., 303., 304., 305., 306., 307., 308., 309., 310., 311., 312., 313., 314., 315.,
1034 400., 401., 402., 403., 404., 405., 406., 407., 408., 409., 410., 411., 412., 413., 414., 415.,
1035 500., 501., 502., 503., 504., 505., 506., 507., 508., 509., 510., 511., 512., 513., 514., 515.,
1036 600., 601., 602., 603., 604., 605., 606., 607., 608., 609., 610., 611., 612., 613., 614., 615.,
1037 700., 701., 702., 703., 704., 705., 706., 707., 708., 709., 710., 711., 712., 713., 714., 715.,
1038 800., 801., 802., 803., 804., 805., 806., 807., 808., 809., 810., 811., 812., 813., 814., 815.,
1039 900., 901., 902., 903., 904., 905., 906., 907., 908., 909., 910., 911., 912., 913., 914., 915.,
1040 1000., 1001., 1002., 1003., 1004., 1005., 1006., 1007., 1008., 1009., 1010., 1011., 1012., 1013., 1014., 1015.,
1041 1100., 1101., 1102., 1103., 1104., 1105., 1106., 1107., 1108., 1109., 1110., 1111., 1112., 1113., 1114., 1115.,
1042 1200., 1201., 1202., 1203., 1204., 1205., 1206., 1207., 1208., 1209., 1210., 1211., 1212., 1213., 1214., 1215.,
1043 1300., 1301., 1302., 1303., 1304., 1305., 1306., 1307., 1308., 1309., 1310., 1311., 1312., 1313., 1314., 1315.,
1044 1400., 1401., 1402., 1403., 1404., 1405., 1406., 1407., 1408., 1409., 1410., 1411., 1412., 1413., 1414., 1415.,
1045 1500., 1501., 1502., 1503., 1504., 1505., 1506., 1507., 1508., 1509., 1510., 1511., 1512., 1513., 1514., 1515.,
1046 1600., 1601., 1602., 1603., 1604., 1605., 1606., 1607., 1608., 1609., 1610., 1611., 1612., 1613., 1614., 1615.,
1047 1700., 1701., 1702., 1703., 1704., 1705., 1706., 1707., 1708., 1709., 1710., 1711., 1712., 1713., 1714., 1715.,
1048 1800., 1801., 1802., 1803., 1804., 1805., 1806., 1807., 1808., 1809., 1810., 1811., 1812., 1813., 1814., 1815.,
1049 1900., 1901., 1902., 1903., 1904., 1905., 1906., 1907., 1908., 1909., 1910., 1911., 1912., 1913., 1914., 1915.,
1050 2000., 2001., 2002., 2003., 2004., 2005., 2006., 2007., 2008., 2009., 2010., 2011., 2012., 2013., 2014., 2015.,
1051 116.,216.,316.,416.,516.,616.,716.,816.,916.,1016.,1116.,1216.,1316.,1416.,1516.,1616.,1716.,1816.,1916.,2016.
1053 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(meshNE,meshTFE,"P0P0"));
1054 trgField=MEDCouplingFieldDouble::New(ON_CELLS);
1055 trgField->setNature(ConservativeVolumic);
1056 trgField->setMesh(meshTFE);
1057 array=DataArrayDouble::New();
1058 array->alloc(meshTFE->getNumberOfCells(),1);
1059 trgField->setArray(array);
1060 std::copy(vals3,vals3+meshTFE->getNumberOfCells(),array->getPointer());
1062 srcField=remapper.reverseTransferField(trgField,4.220173);
1063 double expected4[40]={
1064 566.,566.,552.5,553.5,554.5,566.,566.,554.5,555.5,556.5,566.,566.,558.5,559.5,560.5,566.,566.,560.5,561.5,562.5,
1065 1566.,1566.,1552.5,1553.5,1554.5,1566.,1566.,1554.5,1555.5,1556.5,1566.,1566.,1558.5,1559.5,1560.5,1566.,1566.,1560.5,1561.5,1562.5
1067 for(int i=0;i<40;i++)
1068 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected4[i],srcField->getArray()->getConstPointer()[i],1e-3);//1e-3 precision due to non coincidence in 1D mesh
1069 srcField->decrRef();
1070 trgField->decrRef();
1073 meshTT2D->decrRef();
1074 meshTF2D->decrRef();
1083 void MEDCouplingRemapperTest::testPrepareEx1()
1085 MEDCouplingUMesh *sourceMesh=MEDCouplingBasicsTest::build2DSourceMesh_1();
1086 MEDCouplingUMesh *targetMesh=build2DTargetMesh_3();
1088 MEDCouplingRemapper remapper;
1089 remapper.setPrecision(1e-12);
1090 remapper.setIntersectionType(INTERP_KERNEL::Triangulation);
1091 MEDCouplingFieldTemplate *srcFt=MEDCouplingFieldTemplate::New(ON_CELLS);
1092 MEDCouplingFieldTemplate *trgFt=MEDCouplingFieldTemplate::New(ON_CELLS);
1093 srcFt->setMesh(sourceMesh);
1094 trgFt->setMesh(targetMesh);
1095 CPPUNIT_ASSERT_EQUAL(1,remapper.prepareEx(srcFt,trgFt));
1098 MEDCouplingFieldDouble *srcField=MEDCouplingFieldDouble::New(ON_CELLS);
1099 srcField->setNature(ConservativeVolumic);
1100 srcField->setMesh(sourceMesh);
1101 DataArrayDouble *array=DataArrayDouble::New();
1102 array->alloc(sourceMesh->getNumberOfCells(),1);
1103 srcField->setArray(array);
1104 double *ptr=array->getPointer();
1105 for(int i=0;i<sourceMesh->getNumberOfCells();i++)
1106 ptr[i]=(double)(i+7);
1108 MEDCouplingFieldDouble *trgfield=remapper.transferField(srcField,4.220173);
1109 const double *values=trgfield->getArray()->getConstPointer();
1110 const double valuesExpected[4]={7.75, 7.0625, 4.220173,8.0};
1111 CPPUNIT_ASSERT_EQUAL(4,trgfield->getArray()->getNumberOfTuples());
1112 CPPUNIT_ASSERT_EQUAL(1,trgfield->getArray()->getNumberOfComponents());
1113 for(int i0=0;i0<4;i0++)
1114 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected[i0],values[i0],1e-12);
1115 trgfield->decrRef();
1116 srcField->decrRef();
1117 sourceMesh->decrRef();
1118 targetMesh->decrRef();
1121 MEDCouplingUMesh *MEDCouplingRemapperTest::build1DTargetMesh_2()
1123 double targetCoords[20]={
1124 0.59,0.09, 0.69,0.19, 0.21,-0.29,0.31,-0.19, 0.45,0.25,0.65,0.45,
1125 -0.2,-0.2,0.11,0.11, 0.25,0.25, 0.45,0.45
1127 int targetConn[10]={0,1, 2,3, 4,5, 6,7, 8,9};
1129 MEDCouplingUMesh *targetMesh=MEDCouplingUMesh::New("my name of mesh 1D 2",1);
1130 targetMesh->allocateCells(5);
1131 for(int i=0;i<5;i++)
1132 targetMesh->insertNextCell(INTERP_KERNEL::NORM_SEG2,2,targetConn+2*i);
1133 targetMesh->finishInsertingCells();
1134 DataArrayDouble *myCoords=DataArrayDouble::New();
1135 myCoords->alloc(10,2);
1136 std::copy(targetCoords,targetCoords+20,myCoords->getPointer());
1137 targetMesh->setCoords(myCoords);
1138 myCoords->decrRef();
1142 MEDCouplingUMesh *MEDCouplingRemapperTest::build2DTargetMesh_3()
1144 double targetCoords[20]={-0.6,-0.4, -0.1,-0.4, 1.1,-0.4, 2.1,-0.4,
1145 -0.6,0.1, -0.1,0.1, 1.1,0.1, 2.1,0.1,
1146 -0.6,1.1, -0.1,1.1};
1147 int targetConn[16]={0,4,5,1, 1,5,6,2, 2,6,7,3, 4,8,9,5};
1148 MEDCouplingUMesh *targetMesh=MEDCouplingUMesh::New();
1149 targetMesh->setMeshDimension(2);
1150 targetMesh->allocateCells(4);
1151 for(int i=0;i<4;i++)
1152 targetMesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,targetConn+4*i);
1153 targetMesh->finishInsertingCells();
1154 DataArrayDouble *myCoords=DataArrayDouble::New();
1155 myCoords->alloc(10,2);
1156 std::copy(targetCoords,targetCoords+20,myCoords->getPointer());
1157 targetMesh->setCoords(myCoords);
1158 myCoords->decrRef();
1162 MEDCouplingUMesh *MEDCouplingRemapperTest::build3DExtrudedUMesh_1(MEDCouplingUMesh *&mesh2D)
1164 double coords[180]={
1165 0.,0.,0., 1.,1.,0., 1.,1.25,0., 0.,1.,0., 1.,1.5,0., 2.,0.,0., 2.,1.,0., 1.,2.,0., 0.,2.,0., 3.,1.,0.,
1166 3.,2.,0., 0.,1.,0., 1.,3.,0., 2.,2.,0., 2.,3.,0.,
1167 0.,0.,1., 1.,1.,1., 1.,1.25,1., 0.,1.,1., 1.,1.5,1., 2.,0.,1., 2.,1.,1., 1.,2.,1., 0.,2.,1., 3.,1.,1.,
1168 3.,2.,1., 0.,1.,1., 1.,3.,1., 2.,2.,1., 2.,3.,1.,
1169 0.,0.,2., 1.,1.,2., 1.,1.25,2., 0.,1.,2., 1.,1.5,2., 2.,0.,2., 2.,1.,2., 1.,2.,2., 0.,2.,2., 3.,1.,2.,
1170 3.,2.,2., 0.,1.,2., 1.,3.,2., 2.,2.,2., 2.,3.,2.,
1171 0.,0.,3., 1.,1.,3., 1.,1.25,3., 0.,1.,3., 1.,1.5,3., 2.,0.,3., 2.,1.,3., 1.,2.,3., 0.,2.,3., 3.,1.,3.,
1172 3.,2.,3., 0.,1.,3., 1.,3.,3., 2.,2.,3., 2.,3.,3.};
1176 0,11,1,3,15,26,16,18, 1,2,4,7,13,6,-1,1,16,21,6,-1,6,21,28,13,-1,13,7,22,28,-1,7,4,19,22,-1,4,2,17,19,-1,2,1,16,17,-1,16,21,28,22,19,17,
1177 1,6,5,3,16,21,20,18, 13,10,9,6,28,25,24,21,
1178 11,8,7,4,2,1,-1,11,26,16,1,-1,1,16,17,2,-1,2,17,19,4,-1,4,19,22,7,-1,7,8,23,22,-1,8,11,26,23,-1,26,16,17,19,22,23,
1179 7,12,14,13,22,27,29,28,
1181 15,26,16,18,30,41,31,33, 16,17,19,22,28,21,-1,16,31,36,21,-1,21,36,43,28,-1,28,22,37,43,-1,22,19,34,37,-1,19,17,32,34,-1,17,16,31,32,-1,31,36,43,37,34,32,
1182 16,21,20,18,31,36,35,33, 28,25,24,21,43,40,39,36,
1183 26,23,22,19,17,16,-1,26,41,31,16,-1,16,31,32,17,-1,17,32,34,19,-1,19,34,37,22,-1,22,23,38,37,-1,23,26,41,38,-1,41,31,32,34,37,38,
1184 22,27,29,28,37,42,44,43,
1186 30,41,31,33,45,56,46,48, 31,32,34,37,43,36,-1,31,46,51,36,-1,36,51,58,43,-1,43,37,52,58,-1,37,34,49,52,-1,34,32,47,49,-1,32,31,46,47,-1,46,51,58,52,49,47,
1187 31,36,35,33,46,51,50,48, 43,40,39,36,58,55,54,51,
1188 41,38,37,34,32,31,-1,41,56,46,31,-1,31,46,47,32,-1,32,47,49,34,-1,34,49,52,37,-1,37,38,53,52,-1,38,41,56,53,-1,56,46,47,49,52,53,
1189 37,42,44,43,52,57,59,58
1191 int conn2[28]={7,12,14,13, 11,8,7,4,2,1, 13,10,9,6, 1,6,5,3, 1,2,4,7,13,6, 0,11,1,3};
1193 MEDCouplingUMesh *ret=MEDCouplingUMesh::New();
1194 ret->setMeshDimension(3);
1195 ret->allocateCells(18);
1197 ret->insertNextCell(INTERP_KERNEL::NORM_HEXA8,8,conn);
1198 ret->insertNextCell(INTERP_KERNEL::NORM_POLYHED,43,conn+8);
1199 ret->insertNextCell(INTERP_KERNEL::NORM_HEXA8,8,conn+51);
1200 ret->insertNextCell(INTERP_KERNEL::NORM_HEXA8,8,conn+59);
1201 ret->insertNextCell(INTERP_KERNEL::NORM_POLYHED,43,conn+67);
1202 ret->insertNextCell(INTERP_KERNEL::NORM_HEXA8,8,conn+110);
1204 ret->insertNextCell(INTERP_KERNEL::NORM_HEXA8,8,conn+118);
1205 ret->insertNextCell(INTERP_KERNEL::NORM_POLYHED,43,conn+126);
1206 ret->insertNextCell(INTERP_KERNEL::NORM_HEXA8,8,conn+169);
1207 ret->insertNextCell(INTERP_KERNEL::NORM_HEXA8,8,conn+177);
1208 ret->insertNextCell(INTERP_KERNEL::NORM_POLYHED,43,conn+185);
1209 ret->insertNextCell(INTERP_KERNEL::NORM_HEXA8,8,conn+228);
1211 ret->insertNextCell(INTERP_KERNEL::NORM_HEXA8,8,conn+236);
1212 ret->insertNextCell(INTERP_KERNEL::NORM_POLYHED,43,conn+244);
1213 ret->insertNextCell(INTERP_KERNEL::NORM_HEXA8,8,conn+287);
1214 ret->insertNextCell(INTERP_KERNEL::NORM_HEXA8,8,conn+295);
1215 ret->insertNextCell(INTERP_KERNEL::NORM_POLYHED,43,conn+303);
1216 ret->insertNextCell(INTERP_KERNEL::NORM_HEXA8,8,conn+346);
1218 ret->finishInsertingCells();
1219 DataArrayDouble *myCoords=DataArrayDouble::New();
1220 myCoords->alloc(60,3);
1221 std::copy(coords,coords+180,myCoords->getPointer());
1222 ret->setCoords(myCoords);
1224 mesh2D=MEDCouplingUMesh::New();
1225 mesh2D->setMeshDimension(2);
1226 mesh2D->allocateCells(6);
1227 mesh2D->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn2);
1228 mesh2D->insertNextCell(INTERP_KERNEL::NORM_POLYGON,6,conn2+4);
1229 mesh2D->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn2+10);
1230 mesh2D->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn2+14);
1231 mesh2D->insertNextCell(INTERP_KERNEL::NORM_POLYGON,6,conn2+18);
1232 mesh2D->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn2+24);
1233 mesh2D->setCoords(myCoords);
1234 myCoords->decrRef();
1238 void MEDCouplingRemapperTest::testPartialTransfer1()
1240 MEDCouplingRemapper remapper;
1241 MEDCouplingUMesh *sourceMesh=build1DTargetMesh_2();
1242 MEDCouplingUMesh *targetMesh=MEDCouplingBasicsTest::build2DTargetMesh_1();
1243 remapper.setIntersectionType(INTERP_KERNEL::PointLocator);
1244 CPPUNIT_ASSERT_EQUAL(1,remapper.prepare(sourceMesh,targetMesh,"P0P0"));
1245 MEDCouplingFieldDouble *srcField=MEDCouplingFieldDouble::New(ON_CELLS);
1246 srcField->setNature(ConservativeVolumic);
1247 srcField->setMesh(sourceMesh);
1248 DataArrayDouble *array=DataArrayDouble::New();
1249 array->alloc(sourceMesh->getNumberOfCells(),1);
1250 srcField->setArray(array);
1251 double *ptr=array->getPointer();
1252 for(int i=0;i<sourceMesh->getNumberOfCells();i++)
1253 ptr[i]=(double)(i+7);
1255 MEDCouplingFieldDouble *trgField=MEDCouplingFieldDouble::New(ON_CELLS);
1256 trgField->setNature(ConservativeVolumic);
1257 trgField->setMesh(targetMesh);
1258 array=DataArrayDouble::New();
1259 array->alloc(targetMesh->getNumberOfCells(),1);
1260 ptr=array->getPointer();
1261 std::fill(ptr,ptr+targetMesh->getNumberOfCells(),96.3);
1262 trgField->setArray(array);
1264 remapper.partialTransfer(srcField,trgField);
1265 const double valuesExpected9[5]={10.,8.,7.,96.3,10.};
1266 const double *values=trgField->getArray()->getConstPointer();
1267 for(int i0=0;i0<5;i0++)
1268 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected9[i0],values[i0],1e-12);
1269 trgField->decrRef();
1270 srcField->decrRef();
1271 sourceMesh->decrRef();
1272 targetMesh->decrRef();