1 // Copyright (C) 2007-2016 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 // Author : Anthony Geay (CEA/DEN)
21 #include "MEDCouplingBasicsTest2.hxx"
22 #include "MEDCouplingUMesh.hxx"
23 #include "MEDCouplingCMesh.hxx"
24 #include "MEDCouplingMappedExtrudedMesh.hxx"
25 #include "MEDCouplingFieldDouble.hxx"
26 #include "MEDCouplingMemArray.hxx"
27 #include "MEDCouplingGaussLocalization.hxx"
34 using namespace MEDCoupling;
36 void MEDCouplingBasicsTest2::testGaussPointField1()
38 const double _a=0.446948490915965;
39 const double _b=0.091576213509771;
40 const double _p1=0.11169079483905;
41 const double _p2=0.0549758718227661;
42 const double refCoo1[6]={ 0.,0., 1.,0., 0.,1. };
43 const double gsCoo1[12]={ 2*_b-1, 1-4*_b, 2*_b-1, 2.07*_b-1, 1-4*_b,
44 2*_b-1, 1-4*_a, 2*_a-1, 2*_a-1, 1-4*_a, 2*_a-1, 2*_a-1 };
45 const double wg1[6]={ 4*_p2, 4*_p2, 4*_p2, 4*_p1, 4*_p1, 4*_p1 };
46 std::vector<double> _refCoo1(refCoo1,refCoo1+6);
47 std::vector<double> _gsCoo1(gsCoo1,gsCoo1+12);
48 std::vector<double> _wg1(wg1,wg1+6);
50 MEDCouplingUMesh *m=build2DTargetMesh_1();
51 MEDCouplingFieldDouble *f=MEDCouplingFieldDouble::New(ON_GAUSS_PT,NO_TIME);
52 CPPUNIT_ASSERT_THROW(f->getNumberOfTuples(), INTERP_KERNEL::Exception); // Sanity check!
54 CPPUNIT_ASSERT_EQUAL(5,f->getNumberOfMeshPlacesExpected());
55 CPPUNIT_ASSERT_EQUAL(0,f->getNbOfGaussLocalization());
56 f->setGaussLocalizationOnType(INTERP_KERNEL::NORM_TRI3,_refCoo1,_gsCoo1,_wg1);
57 f->setGaussLocalizationOnType(INTERP_KERNEL::NORM_TRI3,_refCoo1,_gsCoo1,_wg1); // not a bug only to check that it works well
58 CPPUNIT_ASSERT_THROW(f->setGaussLocalizationOnType(INTERP_KERNEL::NORM_QUAD4,_refCoo1,_gsCoo1,_wg1),INTERP_KERNEL::Exception);
59 CPPUNIT_ASSERT_EQUAL(1,f->getNbOfGaussLocalization());
60 const double refCoo2[8]={ 0.,0., 1.,0., 1.,1., 0.,1. };
61 std::vector<double> _refCoo2(refCoo2,refCoo2+8);
62 _gsCoo1.resize(4); _wg1.resize(2);
63 f->setGaussLocalizationOnType(INTERP_KERNEL::NORM_QUAD4,_refCoo2,_gsCoo1,_wg1);
64 CPPUNIT_ASSERT_EQUAL(2,f->getNbOfGaussLocalization());
65 DataArrayDouble *array=DataArrayDouble::New();
67 double *ptr=array->getPointer();
68 for(int i=0;i<18*2;i++)
71 f->setName("MyFirstFieldOnGaussPoint");
73 f->checkConsistencyLight();
74 CPPUNIT_ASSERT_DOUBLES_EQUAL(27.,f->getIJK(2,5,0),1e-14);
75 CPPUNIT_ASSERT_DOUBLES_EQUAL(16.,f->getIJK(1,5,1),1e-14);
77 f->clearGaussLocalizations();
78 CPPUNIT_ASSERT_EQUAL(0,f->getNbOfGaussLocalization());
79 CPPUNIT_ASSERT_THROW(f->checkConsistencyLight(),INTERP_KERNEL::Exception);
80 int ids1[4]={0,1,3,4};
81 CPPUNIT_ASSERT_THROW(f->setGaussLocalizationOnCells(ids1,ids1+4,_refCoo2,_gsCoo1,_wg1),INTERP_KERNEL::Exception);
82 CPPUNIT_ASSERT_EQUAL(0,f->getNbOfGaussLocalization());
84 f->setGaussLocalizationOnCells(ids2,ids2+2,_refCoo2,_gsCoo1,_wg1);
85 CPPUNIT_ASSERT_EQUAL(1,f->getNbOfGaussLocalization());
86 CPPUNIT_ASSERT_EQUAL(0,f->getGaussLocalizationIdOfOneCell(0));
87 CPPUNIT_ASSERT_THROW(f->getGaussLocalizationIdOfOneCell(1),INTERP_KERNEL::Exception);
89 f->setGaussLocalizationOnCells(ids3,ids3+2,_refCoo1,_gsCoo1,_wg1);
90 CPPUNIT_ASSERT_EQUAL(2,f->getNbOfGaussLocalization());
91 CPPUNIT_ASSERT_EQUAL(0,f->getGaussLocalizationIdOfOneCell(0));
92 CPPUNIT_ASSERT_EQUAL(1,f->getGaussLocalizationIdOfOneCell(1));
93 CPPUNIT_ASSERT_EQUAL(1,f->getGaussLocalizationIdOfOneCell(2));
94 CPPUNIT_ASSERT_THROW(f->checkConsistencyLight(),INTERP_KERNEL::Exception);//<- cell 3 has no localization
96 std::vector<double> _gsCoo2(_gsCoo1);
97 std::vector<double> _wg2(_wg1);
98 _gsCoo2[0]=0.8888777776666; _wg2[0]=0.1234567892377;
99 f->setGaussLocalizationOnCells(ids4,ids4+1,_refCoo2,_gsCoo2,_wg2);
100 CPPUNIT_ASSERT_EQUAL(3,f->getNbOfGaussLocalization());
101 std::vector<int> tmpIds;
102 f->getCellIdsHavingGaussLocalization(0,tmpIds);
103 CPPUNIT_ASSERT_EQUAL(2,(int)tmpIds.size());
104 CPPUNIT_ASSERT(std::equal(ids2,ids2+2,tmpIds.begin()));
105 CPPUNIT_ASSERT_THROW(f->checkConsistencyLight(),INTERP_KERNEL::Exception);//<- it's always not ok because undelying array not with the good size.
106 DataArrayDouble *array2=f->getArray()->subArray(0,10);
109 f->checkConsistencyLight();//<- here it is OK
110 MEDCouplingFieldDouble *f2=f->clone(true);
111 CPPUNIT_ASSERT(f->isEqual(f2,1e-14,1e-14));
112 MEDCouplingGaussLocalization& gl1=f2->getGaussLocalization(0);
113 double tmp=gl1.getGaussCoord(1,1);
114 CPPUNIT_ASSERT_DOUBLES_EQUAL(2.07*_b-1,tmp,1e-14);
115 gl1.setGaussCoord(1,1,0.07);
116 CPPUNIT_ASSERT(!f->isEqual(f2,1e-14,1e-14));
117 gl1.setGaussCoord(1,1,tmp);
118 CPPUNIT_ASSERT(f->isEqual(f2,1e-14,1e-14));
120 f2->checkConsistencyLight();
126 void MEDCouplingBasicsTest2::testGaussPointNEField1()
128 MEDCouplingUMesh *m=build2DTargetMesh_1();
129 MEDCouplingFieldDouble *f=MEDCouplingFieldDouble::New(ON_GAUSS_NE,NO_TIME);
131 CPPUNIT_ASSERT_EQUAL(5,f->getNumberOfMeshPlacesExpected());
132 f->setName("MyFirstFieldOnNE");
133 f->setDescription("MyDescriptionNE");
134 DataArrayDouble *array=DataArrayDouble::New();
136 double *ptr=array->getPointer();
137 for(int i=0;i<18*2;i++)
138 ptr[i]=(double)(i+7);
142 f->checkConsistencyLight();
143 MEDCouplingFieldDouble *f2=f->clone(true);
144 CPPUNIT_ASSERT(f->isEqual(f2,1e-14,1e-14));
145 CPPUNIT_ASSERT_DOUBLES_EQUAL(21.,f->getIJK(2,0,0),1e-14);
146 CPPUNIT_ASSERT_DOUBLES_EQUAL(18.,f->getIJK(1,1,1),1e-14);
153 void MEDCouplingBasicsTest2::testCellOrientation1()
155 MEDCouplingUMesh *m=build2DTargetMesh_1();
156 double vec[3]={0.,0.,-1.};
157 std::vector<int> res1;
158 CPPUNIT_ASSERT_THROW(m->are2DCellsNotCorrectlyOriented(vec,false,res1),INTERP_KERNEL::Exception);
159 m->changeSpaceDimension(3);
161 m->are2DCellsNotCorrectlyOriented(vec,false,res1);
162 CPPUNIT_ASSERT(res1.empty());
164 m->are2DCellsNotCorrectlyOriented(vec,false,res1);
165 CPPUNIT_ASSERT_EQUAL(5,(int)res1.size());
169 // connectivity inversion
170 int *conn=m->getNodalConnectivity()->getPointer();
174 m->are2DCellsNotCorrectlyOriented(vec,false,res1);
175 CPPUNIT_ASSERT_EQUAL(1,(int)res1.size());
176 CPPUNIT_ASSERT_EQUAL(2,res1[0]);
178 m->orientCorrectly2DCells(vec,false);
179 m->are2DCellsNotCorrectlyOriented(vec,false,res1);
180 CPPUNIT_ASSERT(res1.empty());
181 MEDCouplingUMesh *m2=build2DTargetMesh_1();
182 m2->changeSpaceDimension(3);
183 CPPUNIT_ASSERT(m->isEqual(m2,1e-12));
189 void MEDCouplingBasicsTest2::testCellOrientation2()
191 MEDCouplingUMesh *m1=0;
192 MEDCouplingUMesh *m2=build3DExtrudedUMesh_1(m1);
194 std::vector<int> res1;
195 m2->arePolyhedronsNotCorrectlyOriented(res1);
196 CPPUNIT_ASSERT_EQUAL(6,(int)res1.size());
197 m2->orientCorrectlyPolyhedrons();
199 m2->arePolyhedronsNotCorrectlyOriented(res1);
200 CPPUNIT_ASSERT(res1.empty());
201 m2->checkConsistencyLight();
202 CPPUNIT_ASSERT_EQUAL(18,(int)m2->getNumberOfCells());
203 int cellIds[3]={0,6,12};
204 std::vector<int> cellIds2(cellIds,cellIds+3);
205 m2->convertToPolyTypes(&cellIds2[0],&cellIds2[0]+cellIds2.size());
206 m2->orientCorrectlyPolyhedrons();
208 m2->arePolyhedronsNotCorrectlyOriented(res1);
209 CPPUNIT_ASSERT(res1.empty());
210 MEDCouplingFieldDouble *f2=m2->getMeasureField(false);
211 //Test to check global reverse in MEDCouplingUMesh::tryToCorrectPolyhedronOrientation
212 MEDCouplingUMesh *m3=build2DTargetMesh_1();
213 double vec[3]={0.,0.,1.};
214 m3->changeSpaceDimension(3);
215 const int ids1[5]={0,1,2,3,4};
216 std::vector<int> ids2(ids1,ids1+5);
217 m3->convertToPolyTypes(&ids2[0],&ids2[0]+ids2.size());
218 m3->orientCorrectly2DCells(vec,false);
219 MEDCouplingUMesh *m4=buildCU1DMesh_U();
220 m4->changeSpaceDimension(3);
221 double center[3]={0.,0.,0.};
222 double vector[3]={0.,1.,0.};
223 m4->rotate(center,vector,-M_PI/2.);
224 MEDCouplingUMesh *m5=m3->buildExtrudedMesh(m4,0);
226 m5->arePolyhedronsNotCorrectlyOriented(res1);
227 CPPUNIT_ASSERT_EQUAL(15,(int)res1.size());
228 m5->orientCorrectlyPolyhedrons();
230 m5->arePolyhedronsNotCorrectlyOriented(res1);
231 CPPUNIT_ASSERT(res1.empty());
232 MEDCouplingFieldDouble *f3=m5->getMeasureField(false);
233 CPPUNIT_ASSERT_EQUAL(15,(int)f3->getArray()->getNumberOfTuples());
234 CPPUNIT_ASSERT_EQUAL(1,(int)f3->getNumberOfComponents());
235 const double *f3Ptr=f3->getArray()->getConstPointer();
236 const double expected1[15]={
237 0.075,0.0375,0.0375,0.075,0.075,
238 0.1125,0.05625,0.05625,0.1125,0.1125,
239 0.0625,0.03125,0.03125,0.0625,0.0625
241 for(int i=0;i<15;i++)
242 CPPUNIT_ASSERT_DOUBLES_EQUAL(std::abs(expected1[i]),f3Ptr[i],1e-12);
244 DataArrayDouble *f4=m5->computeCellCenterOfMass();
245 CPPUNIT_ASSERT_EQUAL(15,(int)f4->getNumberOfTuples());
246 CPPUNIT_ASSERT_EQUAL(3,(int)f4->getNumberOfComponents());
247 const double *f4Ptr=f4->getConstPointer();
248 const double expected2[45]={
249 -0.05,-0.05,0.15, 0.3666666666666667,-0.13333333333333333,0.15, 0.53333333333333333,0.033333333333333333,0.15, -0.05,0.45,0.15, 0.45,0.45,0.15,
250 -0.05,-0.05,0.525, 0.3666666666666667,-0.13333333333333333,0.525, 0.53333333333333333,0.033333333333333333,0.525, -0.05,0.45,0.525, 0.45,0.45,0.525,
251 -0.05,-0.05,0.875, 0.3666666666666667,-0.13333333333333333,0.875, 0.53333333333333333,0.033333333333333333,0.875, -0.05,0.45,0.875, 0.45,0.45,0.875
253 for(int i=0;i<45;i++)
254 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],f4Ptr[i],1e-12);
264 void MEDCouplingBasicsTest2::testCellOrientation3()
266 MEDCouplingUMesh *m = MEDCouplingUMesh::New("circle", 2);
268 double coords[8]={ 0.,0., 0.,0., 0.,0., 0.,0.};
269 coords[0] = cos(-M_PI/4.0); coords[1] = sin(-M_PI/4.0);
270 coords[2] = cos(3*M_PI/4.0); coords[3] = sin(3*M_PI/4.0);
271 coords[4] = cos(5*M_PI/4.0); coords[5] = sin(5*M_PI/4.0);
272 coords[6] = cos(M_PI/4.0); coords[7] = sin(M_PI/4.0);
274 int conn[4]= { 0,1,2,3 };
275 double vec[3]={0.,0.,-1.};
277 m->insertNextCell(INTERP_KERNEL::NORM_QPOLYG,4,conn);
278 m->finishInsertingCells();
279 DataArrayDouble *myCoords=DataArrayDouble::New();
280 myCoords->alloc(4,2);
281 std::copy(coords,coords+8,myCoords->getPointer());
282 m->setCoords(myCoords);
284 m->changeSpaceDimension(3);
286 std::vector<int> res1;
287 m->are2DCellsNotCorrectlyOriented(vec,false,res1);
288 CPPUNIT_ASSERT(res1.empty());
291 m->are2DCellsNotCorrectlyOriented(vec,false,res1);
292 CPPUNIT_ASSERT_EQUAL(1,(int)res1.size());
297 * This test check polyhedron true barycenter computation.
299 void MEDCouplingBasicsTest2::testPolyhedronBarycenter()
301 int connN[]={0,3,2,1, -1, 4,5,6,7, -1, 0,4,7,3, -1, 3,7,6,2, -1, 2,6,5,1, -1, 1,5,4,0};
302 double coords[]={0.,0.,0., 1.,0.,0., 1.,1.,0., 0.,1.,0., 0.,0.,1., 1.,0.,1., 1.,1.,1., 0.,1.,1., 0.5, 0.5, 0.5};
303 MEDCouplingUMesh *meshN=MEDCouplingUMesh::New();
304 meshN->setName("ForBary");
305 meshN->setMeshDimension(3);
306 meshN->allocateCells(4);
307 meshN->insertNextCell(INTERP_KERNEL::NORM_POLYHED,29,connN);
308 meshN->finishInsertingCells();
309 DataArrayDouble *myCoords=DataArrayDouble::New();
310 myCoords->alloc(9,3);
311 std::copy(coords,coords+27,myCoords->getPointer());
312 meshN->setCoords(myCoords);
314 meshN->checkConsistencyLight();
316 std::vector<int> res1;
317 meshN->arePolyhedronsNotCorrectlyOriented(res1);
318 meshN->orientCorrectlyPolyhedrons();
319 CPPUNIT_ASSERT(res1.empty());
320 const double *ref,*daPtr;
321 DataArrayDouble *da=meshN->computeCellCenterOfMass();
322 CPPUNIT_ASSERT_EQUAL(1,(int)da->getNumberOfTuples());
323 CPPUNIT_ASSERT_EQUAL(3,(int)da->getNumberOfComponents());
324 daPtr=da->getConstPointer();
325 ref=meshN->getCoords()->getConstPointer()+24;
327 CPPUNIT_ASSERT_DOUBLES_EQUAL(ref[i],daPtr[i],1e-12);
330 const double center[]={0.,0.,0.};
331 const double vec[]={0.,2.78,0.};
332 da=meshN->computeCellCenterOfMass();
333 daPtr=da->getConstPointer();
334 ref=meshN->getCoords()->getConstPointer()+24;
336 CPPUNIT_ASSERT_DOUBLES_EQUAL(ref[i],daPtr[i],1e-12);
339 meshN->rotate(center,vec,M_PI/7.);
340 meshN->translate(vec);
341 da=meshN->computeCellCenterOfMass();
342 daPtr=da->getConstPointer();
343 ref=meshN->getCoords()->getConstPointer()+24;
345 CPPUNIT_ASSERT_DOUBLES_EQUAL(ref[i],daPtr[i],1e-12);
348 const double center2[]={1.12,3.45,6.78};
349 const double vec2[]={4.5,9.3,2.8};
350 meshN->rotate(center2,vec2,M_E);
351 meshN->translate(vec2);
352 da=meshN->computeCellCenterOfMass();
353 daPtr=da->getConstPointer();
354 ref=meshN->getCoords()->getConstPointer()+24;
356 CPPUNIT_ASSERT_DOUBLES_EQUAL(ref[i],daPtr[i],1e-10);
362 void MEDCouplingBasicsTest2::testNormL12Integ1D()
364 MEDCouplingUMesh *m1=build1DTargetMesh_3();
365 MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME);
367 DataArrayDouble *array=DataArrayDouble::New();
368 array->alloc(m1->getNumberOfCells(),3);
369 const double arr[12]={-5.23,15.45,-25.56,6.67,-16.78,26.89,-7.91,17.23,-27.43,8.21,-18.63,28.72};
370 std::copy(arr,arr+12,array->getPointer());
375 DataArrayDouble *f3=m1->computeCellCenterOfMass();
376 CPPUNIT_ASSERT_EQUAL(4,(int)f3->getNumberOfTuples());
377 CPPUNIT_ASSERT_EQUAL(1,(int)f3->getNumberOfComponents());
378 double expected9[4]={0.75,5.105,0.8,5.155};
379 ptr=f3->getConstPointer();
381 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected9[i],ptr[i],1e-12);
384 MEDCouplingFieldDouble *f2=m1->getMeasureField(false);
385 CPPUNIT_ASSERT_EQUAL(4,(int)f2->getArray()->getNumberOfTuples());
386 CPPUNIT_ASSERT_EQUAL(1,(int)f2->getNumberOfComponents());
387 double expected1[4]={0.5,0.21,-0.6,-0.31};
388 ptr=f2->getArray()->getConstPointer();
390 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],ptr[i],1e-12);
392 double expected2[4]={0.5,0.21,0.6,0.31};
393 f2=m1->getMeasureField(true);
394 ptr=f2->getArray()->getConstPointer();
396 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],ptr[i],1e-12);
400 f1->integral(false,res);
401 double expected3[3]={0.9866,-0.3615,0.4217};
403 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected3[i],res[i],1e-12);
404 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected3[0],f1->integral(0,false),1e-12);
405 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected3[1],f1->integral(1,false),1e-12);
406 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected3[2],f1->integral(2,false),1e-12);
407 f1->integral(true,res);
408 double expected4[3]={-3.4152,8.7639,-14.6879};
410 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected4[i],res[i],1e-12);
413 double expected5[3]={6.979506172839505, 16.89018518518518, 27.02969135802469};
415 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected5[i],res[i],1e-12);
416 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected5[0],f1->normL1(0),1e-12);
417 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected5[1],f1->normL1(1),1e-12);
418 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected5[2],f1->normL1(2),1e-12);
421 double expected7[3]={7.090910979452395, 16.9275542960123, 27.053271464160858};
423 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected7[i],res[i],1e-9);
424 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected7[0],f1->normL2(0),1e-9);
425 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected7[1],f1->normL2(1),1e-9);
426 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected7[2],f1->normL2(2),1e-9);
428 MEDCouplingFieldDouble *f4=f1->buildMeasureField(false);
429 CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.2,f4->accumulate(0),1e-12);
431 f4=f1->buildMeasureField(true);
432 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.62,f4->accumulate(0),1e-12);
437 // Testing with 2D Curve
438 m1=build2DCurveTargetMesh_3();
439 f2=m1->getMeasureField(false);
440 CPPUNIT_ASSERT_EQUAL(4,(int)f2->getArray()->getNumberOfTuples());
441 CPPUNIT_ASSERT_EQUAL(1,(int)f2->getNumberOfComponents());
442 ptr=f2->getArray()->getConstPointer();
444 CPPUNIT_ASSERT_DOUBLES_EQUAL(sqrt(2.)*expected2[i],ptr[i],1e-12);
446 f2=m1->getMeasureField(true);
447 CPPUNIT_ASSERT_EQUAL(4,(int)f2->getArray()->getNumberOfTuples());
448 CPPUNIT_ASSERT_EQUAL(1,(int)f2->getNumberOfComponents());
449 ptr=f2->getArray()->getConstPointer();
451 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i]*sqrt(2.),ptr[i],1e-12);
454 f3=m1->computeCellCenterOfMass();
455 CPPUNIT_ASSERT_EQUAL(4,(int)f3->getNumberOfTuples());
456 CPPUNIT_ASSERT_EQUAL(2,(int)f3->getNumberOfComponents());
457 double expected10[8]={0.75,0.75,5.105,5.105,0.8,0.8,5.155,5.155};
458 ptr=f3->getConstPointer();
460 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected10[i],ptr[i],1e-12);
463 f1=MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME);
465 array=DataArrayDouble::New();
466 array->alloc(m1->getNumberOfCells(),3);
467 std::copy(arr,arr+12,array->getPointer());
470 f1->integral(false,res);
472 CPPUNIT_ASSERT_DOUBLES_EQUAL(sqrt(2.)*expected4[i],res[i],1e-12);
473 f1->integral(true,res);
475 CPPUNIT_ASSERT_DOUBLES_EQUAL(sqrt(2.)*expected4[i],res[i],1e-12);
478 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected5[i],res[i],1e-12);
481 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected7[i],res[i],1e-12);
487 void MEDCouplingBasicsTest2::testAreaBary2D()
489 MEDCouplingUMesh *m1=build2DTargetMesh_3();
490 MEDCouplingFieldDouble *f1=m1->getMeasureField(false);
491 CPPUNIT_ASSERT_EQUAL(10,(int)f1->getArray()->getNumberOfTuples());
492 CPPUNIT_ASSERT_EQUAL(1,(int)f1->getNumberOfComponents());
493 double expected1[10]={-0.5,-1,-1.5,-0.5,-1, 0.5,1,1.5,0.5,1};
494 const double *ptr=f1->getArray()->getConstPointer();
495 for(int i=0;i<10;i++)
496 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],ptr[i],1e-12);
498 f1=m1->getMeasureField(true);
499 ptr=f1->getArray()->getConstPointer();
500 for(int i=0;i<10;i++)
501 CPPUNIT_ASSERT_DOUBLES_EQUAL(std::abs(expected1[i]),ptr[i],1e-12);
503 DataArrayDouble *f2=m1->computeCellCenterOfMass();
504 CPPUNIT_ASSERT_EQUAL(10,(int)f2->getNumberOfTuples());
505 CPPUNIT_ASSERT_EQUAL(2,(int)f2->getNumberOfComponents());
506 double expected2[20]={
507 0.5,0.3333333333333333,0.5,0.5,0.5,0.77777777777777777,0.5,0.3333333333333333,0.5,0.5,
508 0.5,0.3333333333333333,0.5,0.5,0.5,0.77777777777777777,0.5,0.3333333333333333,0.5,0.5,
510 ptr=f2->getConstPointer();
511 for(int i=0;i<20;i++)
512 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],ptr[i],1e-12);
514 m1->changeSpaceDimension(3);
515 f1=m1->getMeasureField(false);
516 CPPUNIT_ASSERT_EQUAL(10,(int)f1->getArray()->getNumberOfTuples());
517 CPPUNIT_ASSERT_EQUAL(1,(int)f1->getNumberOfComponents());
518 ptr=f1->getArray()->getConstPointer();
519 for(int i=0;i<10;i++)
520 CPPUNIT_ASSERT_DOUBLES_EQUAL(std::abs(expected1[i]),ptr[i],1e-12);
522 f2=m1->computeCellCenterOfMass();
523 CPPUNIT_ASSERT_EQUAL(10,(int)f2->getNumberOfTuples());
524 CPPUNIT_ASSERT_EQUAL(3,(int)f2->getNumberOfComponents());
525 ptr=f2->getConstPointer();
526 double expected3[30]={
527 0.5,0.3333333333333333,0.,0.5,0.5,0.,0.5,0.77777777777777777,0.,0.5,0.3333333333333333,0.,0.5,0.5,0.,
528 0.5,0.3333333333333333,0.,0.5,0.5,0.,0.5,0.77777777777777777,0.,0.5,0.3333333333333333,0.,0.5,0.5,0.
530 for(int i=0;i<30;i++)
531 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected3[i],ptr[i],1e-12);
537 * This test check polyhedron true barycenter computation 2.
539 void MEDCouplingBasicsTest2::testAreaBary3D()
541 double coords [] = { 0.241310763507 , 0.0504777305619 , 0.0682283524903 , 0.252501053866 , -0.0625176732937 , 0.137272639894 ,
542 0.152262663601 , 0.241816569527 , 0.133812556197 , 0.18047750211 , -0.0789949051358 , 0.339098173401 ,
543 0.151741971857 , 0.238885278571 , 0.137715037333 , 0.242532155481 , -0.0928169086456 , 0.0678043417367 ,
544 0.240941965335 , -0.015461491464 , 0.0617186345825 , 0.24127650112 , 0.0499427876717 , 0.0679634099148 ,
545 -0.145828917428 , 0.206291632565 , 0.0310071927543 , 0.0125651775307 , 0.266262085828 , 0.105228430543 ,
546 -0.0994066533286 , 0.233224271238 , 0.0572213839567 , -0.0951345338317 , 0.234819509426 , 0.0592126284538 ,
547 0.136580574205 , -0.205486212579 , 0.0572866072014 , 0.0637270784978 , -0.168886355238 , 0.446614057077 ,
548 0.041337157151 , -0.213402568198 , 0.372407095999 , 0.0411601970268 , -0.202387875756 , 0.411334979491 ,
549 -0.108355701857 , 0.193636239335 , 0.204886756738 , 0.00639779029829 , 0.155296981517 , 0.252585892979 ,
550 0.0262473111702 , -0.112919732543 , 0.424286639249 ,-0.224103052733 , -0.139430015438 , -0.0122352295701 ,
551 -0.0312760589481 , -0.274272003594 , 0.0323959636568 , -0.166663422532 , -0.217754445175 , 0.00392109070364 ,
552 -0.30586619777 , -0.0475168041091 , -0.0144585228182 , -0.280881480586 , 0.135571293538 , 0.00623923647986 ,
553 -0.25548538234 , 0.156819217766 , 0.0645277879769 , -0.131567009284 , 0.184133752309 , 0.206021802753 ,
554 -0.196204010965 , 0.151602971681 , 0.212974777736 , -0.183713879463 , 0.0802946639531 , 0.260115662599 ,
555 -0.244241178767 , -0.0738873389604 , 0.144590565817 , -0.155804057829 , -0.164892720025 , 0.210613950558 ,
556 -0.170950800428 , -0.215099334026 , 0.00610122860092 , -0.30552634869 , -0.0490020791904 , -0.0132786533145 ,
557 0.271831011884 , 0.15105657296 , 0.0230534827908 , 0.281919192283 , 0.0898544306288 , -0.0625201489143 ,
558 0.260240727276 , -0.0120688706637 , -0.0532316588626 , 0.244947737722 , 0.0197984684293 , 0.0309341209233 ,
559 0.23439631578 , 0.229825279875 , 0.0508520585381 , 0.160921316875 , 0.265078502128 , 0.121716560626 ,
560 -0.315088694175 , 0.0747700471918 , -0.245836615071 , -0.327728781776 , 0.0857114674649 , -0.239431905957 ,
561 -0.308385460634 , 0.145142997084 , -0.149886828433 , 0.0488236045164 , 0.309462801914 , 0.0849169148265 ,
562 -0.0244964803395 , 0.33145611751 , -0.0476415818061 , 0.0060567994229 , 0.32418412014 , 0.0367779543812 ,
563 -0.0950221448063 , 0.236675326003 , 0.0572594453983 , 0.248723023186 , 0.0886648784791 , -0.176629430538 ,
564 0.116796984 , 0.256596599567 , -0.292863523603 , 0.118024552914 , 0.229154257843 , -0.34233232501 ,
565 0.217507892549 , -0.0417822335742 , -0.176771782888 , -0.224429321304 , 0.0125595300114 , -0.362064725588 ,
566 0.0937301100955 , -0.0500824832657 , -0.299713548444 , -0.244162220397 , 0.0383853931293 , -0.389856984411 ,
567 -0.0281989366102 , 0.097392811563 , -0.458244577284 , -0.385010847162 , 0.10122766194 , -0.140052859922 ,
568 -0.377936358012 , 0.110875172128 , -0.176207095463 , 0.244483045556 , -0.0991073977045 , 0.0575134372934 ,
569 0.262605120167 , -0.100243191645 , -0.0495620806935 , 0.240306880972 , -0.136153701579 , -0.114745281696 ,
570 0.215763176129 , -0.0836766059189 , -0.183249640616 , 0.237870396603 , -0.132449578286 , -0.121598854639 ,
571 -0.0637683083097 , -0.27921020214 , -0.149112321992 , -0.0856211014977 , -0.2973233473 , -0.0446878139589 ,
572 0.104675342288 , -0.0625908305324 , -0.290346256534 , 0.0248264249186 , -0.247797708548 , -0.165830884019 ,
573 0.0719302438309 , -0.178468260473 , -0.211432157345 , 0.142871843159 , -0.208769948542 , 0.0454101128246 ,
574 0.167803379307 , -0.207851396623 , -0.088802726124 , 0.12868717152 , -0.230920439715 , 0.00760508389036 ,
575 -0.0372812069535 , -0.286740286332 , 0.00963701291166 };
577 int connN [] = { /*polyhedron 0*/
578 0 , 1 , 3 , 4 , 2 , -1 , 1 , 5 , 6 , 7 , 0 , -1 , 0 , 7 , 8 , 10 , 11 , 9 , 2 , -1 , 1 , 5 , 12 , 14 , 15 , 13 , 3 , -1 , 16 , 9 , 2 , 4 , 17 , -1
579 , 4 , 3 , 13 , 18 , 17 , -1 , 5 , 6 , 19 , 21 , 20 , 12 , -1 , 6 , 7 , 8 , 23 , 22 , 19 , -1 , 23 , 24 , 10 , 8 , -1 , 25 , 11 , 9 , 16 , -1
580 , 24 , 26 , 25 , 11 , 10 , -1 , 12 , 14 , 20 , -1 , 27 , 28 , 29 , 15 , 13 , 18 , -1 , 14 , 15 , 29 , 30 , 21 , 20 , -1 , 26 , 27 , 18 , 17 , 16 , 25 , -1
581 , 22 , 19 , 21 , 30 , 31 , -1 , 22 , 31 , 28 , 27 , 26 , 24 , 23 , -1 , 31 , 30 , 29 , 28,
583 0 , 7 , 8 , 10 , 11 , 9 , 2 , -1 , 32 , 0 , 7 , 35 , 34 , 33 , -1 , 32 , 0 , 2 , 37 , 36 , -1 , 35 , 7 , 8 , 40 , 39 , 38 , -1
584 , 2 , 37 , 41 , 9 , -1 , 40 , 8 , 10 , 44 , 43 , 42 , -1 , 41 , 9 , 11 , 44 , 43 , -1 , 44 , 11 , 10 , -1 , 32 , 33 , 45 , 47 , 46 , 36 , -1
585 , 33 , 34 , 48 , 45 , -1 , 35 , 34 , 48 , 50 , 49 , 38 , -1 , 41 , 43 , 42 , 46 , 36 , 37 , -1 , 38 , 39 , 51 , 49 , -1
586 , 39 , 40 , 42 , 46 , 47 , 52 , 51 , -1 , 45 , 47 , 52 , 50 , 48 , -1 , 52 , 51 , 49 , 50,
588 6 , 7 , 8 , 23 , 22 , 19 , -1 , 6 , 35 , 7 , -1 , 6 , 35 , 38 , 19 , -1 , 35 , 7 , 8 , 40 , 39 , 38 , -1 , 53 , 22 , 19 , 38 , 39 , 54 , -1
589 , 23 , 53 , 54 , 40 , 8 , -1 , 53 , 22 , 23 , -1 , 39 , 54 , 40,
591 35 , 34 , 48 , 50 , 49 , 38 , -1 , 6 , 35 , 34 , 56 , 55 , 5 , -1 , 6 , 35 , 38 , 19 , -1 , 34 , 56 , 57 , 59 , 58 , 48 , -1
592 , 60 , 61 , 21 , 19 , 38 , 49 , -1 , 62 , 50 , 48 , 58 , -1 , 60 , 63 , 64 , 62 , 50 , 49 , -1 , 5 , 6 , 19 , 21 , 20 , 12 , -1
593 , 55 , 5 , 12 , 65 , -1 , 66 , 67 , 65 , 55 , 56 , 57 , -1 , 63 , 66 , 57 , 59 , 64 , -1 , 64 , 62 , 58 , 59 , -1
594 , 60 , 63 , 66 , 67 , 68 , 61 , -1 , 61 , 68 , 20 , 21 , -1 , 67 , 68 , 20 , 12 , 65};
596 double barys[]={ -0.0165220465527 , -0.0190922868195 , 0.158882733414 ,
597 0.0287618656076 , 0.135874379934 , -0.14601588119 ,
598 -0.147128055553 , 0.0465995097041 , -0.049391174453 ,
599 -0.00142506732317 , -0.0996953090351 , -0.115159183132 };
600 MEDCouplingUMesh *meshN=MEDCouplingUMesh::New();
601 meshN->setName("ForBary");
602 meshN->setMeshDimension(3);
603 meshN->allocateCells(4);
604 meshN->insertNextCell(INTERP_KERNEL::NORM_POLYHED,113,connN);
605 meshN->insertNextCell(INTERP_KERNEL::NORM_POLYHED,99,connN+113);
606 meshN->insertNextCell(INTERP_KERNEL::NORM_POLYHED,43,connN+212);
607 meshN->insertNextCell(INTERP_KERNEL::NORM_POLYHED,92,connN+255);
608 meshN->finishInsertingCells();
609 DataArrayDouble *myCoords=DataArrayDouble::New();
610 myCoords->alloc(69,3);
611 std::copy(coords,coords+207,myCoords->getPointer());
612 meshN->setCoords(myCoords);
614 meshN->checkConsistencyLight();
615 std::vector<int> res1;
616 meshN->arePolyhedronsNotCorrectlyOriented(res1);
617 meshN->orientCorrectlyPolyhedrons();
619 meshN->arePolyhedronsNotCorrectlyOriented(res1);
620 CPPUNIT_ASSERT(res1.empty());
622 DataArrayDouble *da=meshN->computeCellCenterOfMass();
623 CPPUNIT_ASSERT_EQUAL(4,(int)da->getNumberOfTuples());
624 CPPUNIT_ASSERT_EQUAL(3,(int)da->getNumberOfComponents());
625 const double *daPtr=da->getConstPointer();
626 for(int i=0;i<12;i++)
627 CPPUNIT_ASSERT_DOUBLES_EQUAL(barys[i],daPtr[i],1e-12);
633 void MEDCouplingBasicsTest2::testRenumberCellsForFields()
635 MEDCouplingUMesh *m=build2DTargetMesh_1();
636 MEDCouplingFieldDouble *f=MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME);
638 DataArrayDouble *arr=DataArrayDouble::New();
639 int nbOfCells=m->getNumberOfCells();
640 arr->alloc(nbOfCells,3);
643 const double values1[15]={7.,107.,10007.,8.,108.,10008.,9.,109.,10009.,10.,110.,10010.,11.,111.,10011.};
644 std::copy(values1,values1+15,arr->getPointer());
645 const int renumber1[5]={3,1,0,4,2};
647 const double loc[]={-0.05,-0.05, 0.55,-0.25, 0.55,0.15, -0.05,0.45, 0.45,0.45};
650 f->getValueOn(loc+2*j,res);
652 CPPUNIT_ASSERT_DOUBLES_EQUAL(values1[i+3*j],res[i],1e-12);
654 f->renumberCells(renumber1,false);
655 const double *ptr=f->getArray()->getConstPointer();
656 const double expected1[15]={9.,109.,10009.,8.,108.,10008.,11.,111.,10011.,7.,107.,10007.,10.,110.,10010.};
657 for(int i=0;i<15;i++)
658 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],ptr[i],1e-12);
659 //check that fields remains the same geometrically
662 f->getValueOn(loc+2*j,res);
664 CPPUNIT_ASSERT_DOUBLES_EQUAL(values1[i+3*j],res[i],1e-12);
668 f=MEDCouplingFieldDouble::New(ON_GAUSS_PT,NO_TIME);
670 const double _a=0.446948490915965;
671 const double _b=0.091576213509771;
672 const double _p1=0.11169079483905;
673 const double _p2=0.0549758718227661;
674 const double refCoo1[6]={ 0.,0., 1.,0., 0.,1. };
675 const double gsCoo1[12]={ 2*_b-1, 1-4*_b, 2*_b-1, 2.07*_b-1, 1-4*_b,
676 2*_b-1, 1-4*_a, 2*_a-1, 2*_a-1, 1-4*_a, 2*_a-1, 2*_a-1 };
677 const double wg1[6]={ 4*_p2, 4*_p2, 4*_p2, 4*_p1, 4*_p1, 4*_p1 };
678 std::vector<double> _refCoo1(refCoo1,refCoo1+6);
679 std::vector<double> _gsCoo1(gsCoo1,gsCoo1+12);
680 std::vector<double> _wg1(wg1,wg1+6);
681 f->setGaussLocalizationOnType(INTERP_KERNEL::NORM_TRI3,_refCoo1,_gsCoo1,_wg1);
682 const double refCoo2[8]={ 0.,0., 1.,0., 1.,1., 0.,1. };
683 std::vector<double> _refCoo2(refCoo2,refCoo2+8);
684 _gsCoo1.resize(4); _wg1.resize(2);
685 f->setGaussLocalizationOnType(INTERP_KERNEL::NORM_QUAD4,_refCoo2,_gsCoo1,_wg1);
686 arr=DataArrayDouble::New();
688 const double values2[36]={1.,1001.,2.,1002., 11.,1011.,12.,1012.,13.,1013.,14.,1014.,15.,1015.,16.,1016., 21.,1021.,22.,1022.,23.,1023.,24.,1024.,25.,1025.,26.,1026., 31.,1031.,32.,1032., 41.,1041.,42.,1042.};
689 std::copy(values2,values2+36,arr->getPointer());
692 f->checkConsistencyLight();
693 MEDCouplingFieldDouble *fCpy=f->clone(true);
694 CPPUNIT_ASSERT(f->isEqual(fCpy,1e-12,1e-12));
695 f->renumberCells(renumber1,false);
696 CPPUNIT_ASSERT(!f->isEqual(fCpy,1e-12,1e-12));
697 double expected2[36]={21.,1021.,22.,1022.,23.,1023.,24.,1024.,25.,1025.,26.,1026., 11.,1011.,12.,1012.,13.,1013.,14.,1014.,15.,1015.,16.,1016., 41.,1041.,42.,1042., 1.,1001.,2.,1002., 31.,1031.,32.,1032.};
698 ptr=f->getArray()->getConstPointer();
699 for(int i=0;i<36;i++)
700 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],ptr[i],1e-12);
701 const int renumber2[5]={2,1,4,0,3};//reverse renumber1
702 f->renumberCells(renumber2,false);
703 CPPUNIT_ASSERT(f->isEqual(fCpy,1e-12,1e-12));
707 f=MEDCouplingFieldDouble::New(ON_GAUSS_NE,NO_TIME);
709 arr=DataArrayDouble::New();
711 const double values3[36]={1.,1001.,2.,1002.,3.,1003.,4.,1004., 11.,1011.,12.,1012.,13.,1013., 21.,1021.,22.,1022.,23.,1023., 31.,1031.,32.,1032.,33.,1033.,34.,1034., 41.,1041.,42.,1042.,43.,1043.,44.,1044.};
712 std::copy(values3,values3+36,arr->getPointer());
715 f->checkConsistencyLight();
717 CPPUNIT_ASSERT(f->isEqual(fCpy,1e-12,1e-12));
718 f->renumberCells(renumber1,false);
719 CPPUNIT_ASSERT(!f->isEqual(fCpy,1e-12,1e-12));
720 double expected3[36]={21.,1021.,22.,1022.,23.,1023.,11.,1011.,12.,1012.,13.,1013.,41.,1041.,42.,1042.,43.,1043.,44.,1044.,1.,1001.,2.,1002.,3.,1003.,4.,1004.,31.,1031.,32.,1032.,33.,1033.,34.,1034.};
721 ptr=f->getArray()->getConstPointer();
722 for(int i=0;i<36;i++)
723 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected3[i],ptr[i],1e-12);
724 f->renumberCells(renumber2,false);//perform reverse operation of renumbering to check that the resulting field is equal.
725 CPPUNIT_ASSERT(f->isEqual(fCpy,1e-12,1e-12));
732 void MEDCouplingBasicsTest2::testRenumberNodesForFields()
734 MEDCouplingUMesh *m=build2DTargetMesh_1();
735 MEDCouplingFieldDouble *f=MEDCouplingFieldDouble::New(ON_NODES,NO_TIME);
737 CPPUNIT_ASSERT_EQUAL(9,f->getNumberOfMeshPlacesExpected());
738 DataArrayDouble *arr=DataArrayDouble::New();
739 int nbOfNodes=m->getNumberOfNodes();
740 arr->alloc(nbOfNodes,3);
743 const double values1[27]={7.,107.,10007.,8.,108.,10008.,9.,109.,10009.,10.,110.,10010.,11.,111.,10011.,12.,112.,10012.,13.,113.,10013.,14.,114.,10014.,15.,115.,10015.};
744 std::copy(values1,values1+27,arr->getPointer());
745 f->checkConsistencyLight();
746 const int renumber1[9]={0,4,1,3,5,2,6,7,8};
748 const double loc[]={0.5432,-0.2432, 0.5478,0.1528};
749 const double expected1[6]={9.0272, 109.0272, 10009.0272, 11.4124,111.4124,10011.4124};
752 f->getValueOn(loc+2*j,res);
754 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i+3*j],res[i],1e-12);
756 MEDCouplingFieldDouble *fCpy=f->clone(true);
757 CPPUNIT_ASSERT(f->isEqual(fCpy,1e-12,1e-12));
758 f->renumberNodes(renumber1);
759 CPPUNIT_ASSERT(!f->isEqual(fCpy,1e-12,1e-12));
762 f->getValueOn(loc+2*j,res);
764 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i+3*j],res[i],1e-12);
766 const double expected2[27]={7.,107.,10007.,9.,109.,10009.,12.,112.,10012.,10.,110.,10010.,8.,108.,10008.,11.,111.,10011.,13.,113.,10013.,14.,114.,10014.,15.,115.,10015.};
767 for(int i=0;i<27;i++)
768 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],f->getArray()->getConstPointer()[i],1e-12);
769 const int renumber2[9]={0,2,5,3,1,4,6,7,8};//reverse of renumber2
770 f->renumberNodes(renumber2);
771 CPPUNIT_ASSERT(f->isEqual(fCpy,1e-12,1e-12));
778 void MEDCouplingBasicsTest2::testConvertQuadraticCellsToLinear()
780 MEDCouplingUMesh *mesh=build2DTargetMesh_3();
781 mesh->checkConsistencyLight();
782 std::set<INTERP_KERNEL::NormalizedCellType> types=mesh->getAllGeoTypes();
783 CPPUNIT_ASSERT_EQUAL(5,(int)types.size());
784 INTERP_KERNEL::NormalizedCellType expected1[5]={INTERP_KERNEL::NORM_POLYGON, INTERP_KERNEL::NORM_TRI3, INTERP_KERNEL::NORM_QUAD4, INTERP_KERNEL::NORM_TRI6, INTERP_KERNEL::NORM_QUAD8};
785 std::set<INTERP_KERNEL::NormalizedCellType> expected1Bis(expected1,expected1+5);
786 CPPUNIT_ASSERT(expected1Bis==types);
787 CPPUNIT_ASSERT(mesh->isPresenceOfQuadratic());
788 CPPUNIT_ASSERT_EQUAL(62,mesh->getNodalConnectivityArrayLen());
789 MEDCouplingFieldDouble *f1=mesh->getMeasureField(false);
791 mesh->convertQuadraticCellsToLinear();
792 CPPUNIT_ASSERT(!mesh->isPresenceOfQuadratic());
794 mesh->checkConsistencyLight();
795 MEDCouplingFieldDouble *f2=mesh->getMeasureField(false);
796 CPPUNIT_ASSERT(f1->getArray()->isEqual(*f2->getArray(),1e-12));
797 CPPUNIT_ASSERT_EQUAL(48,mesh->getNodalConnectivityArrayLen());
798 std::set<INTERP_KERNEL::NormalizedCellType> types2=mesh->getAllGeoTypes();
799 CPPUNIT_ASSERT_EQUAL(3,(int)types2.size());
800 INTERP_KERNEL::NormalizedCellType expected2[3]={INTERP_KERNEL::NORM_POLYGON, INTERP_KERNEL::NORM_TRI3, INTERP_KERNEL::NORM_QUAD4};
801 std::set<INTERP_KERNEL::NormalizedCellType> expected2Bis(expected2,expected2+3);
802 CPPUNIT_ASSERT(expected2Bis==types2);
809 void MEDCouplingBasicsTest2::testCheckGeoEquivalWith()
811 MEDCouplingUMesh *mesh1=build2DTargetMesh_3();
812 MEDCouplingUMesh *mesh2=build2DTargetMesh_3();
813 DataArrayInt *cellCor,*nodeCor;
815 mesh1->checkGeoEquivalWith(mesh1,0,1e-12,cellCor,nodeCor);//deepEqual
816 CPPUNIT_ASSERT(cellCor==0);
817 CPPUNIT_ASSERT(nodeCor==0);
818 mesh1->checkGeoEquivalWith(mesh1,1,1e-12,cellCor,nodeCor);//fastEqual
819 CPPUNIT_ASSERT(cellCor==0);
820 CPPUNIT_ASSERT(nodeCor==0);
821 mesh1->checkGeoEquivalWith(mesh1,10,1e-12,cellCor,nodeCor);//deepEqual with geo permutations
822 CPPUNIT_ASSERT(cellCor==0);
823 CPPUNIT_ASSERT(nodeCor==0);
824 //Second test mesh1 and mesh2 are 2 different meshes instance
825 mesh1->checkGeoEquivalWith(mesh2,0,1e-12,cellCor,nodeCor);//deepEqual
826 CPPUNIT_ASSERT(cellCor==0);
827 CPPUNIT_ASSERT(nodeCor==0);
828 mesh1->checkGeoEquivalWith(mesh2,1,1e-12,cellCor,nodeCor);//fastEqual
829 CPPUNIT_ASSERT(cellCor==0);
830 CPPUNIT_ASSERT(nodeCor==0);
831 mesh1->checkGeoEquivalWith(mesh2,10,1e-12,cellCor,nodeCor);//deepEqual with geo permutations
832 CPPUNIT_ASSERT(cellCor==0);
833 CPPUNIT_ASSERT(nodeCor==0);
834 //Third test : cell permutation by keeping the first the middle and the last as it is.
835 const int renum[]={0,2,1,3,4,5,6,8,7,9};
836 mesh2->renumberCells(renum,false);
837 CPPUNIT_ASSERT_THROW(mesh1->checkGeoEquivalWith(mesh2,0,1e-12,cellCor,nodeCor),INTERP_KERNEL::Exception);//deepEqual fails
838 CPPUNIT_ASSERT(cellCor==0);
839 CPPUNIT_ASSERT(nodeCor==0);
840 mesh1->checkGeoEquivalWith(mesh2,1,1e-12,cellCor,nodeCor);//fastEqual do not see anything
841 CPPUNIT_ASSERT(cellCor==0);
842 CPPUNIT_ASSERT(nodeCor==0);
843 mesh1->checkGeoEquivalWith(mesh2,10,1e-12,cellCor,nodeCor);//deepEqual with geo permutations
844 CPPUNIT_ASSERT(cellCor);
845 CPPUNIT_ASSERT_EQUAL(10,(int)cellCor->getNumberOfTuples());
846 CPPUNIT_ASSERT_EQUAL(1,(int)cellCor->getNumberOfComponents());
847 CPPUNIT_ASSERT(std::equal(renum,renum+10,cellCor->getConstPointer()));
848 CPPUNIT_ASSERT(nodeCor==0);
851 CPPUNIT_ASSERT(nodeCor==0);
852 //4th test : cell and node permutation by keeping the first the middle and the last as it is.
854 mesh2=build2DTargetMesh_3();
855 const int renum2[]={0,2,1,3,4,5,6,8,7,9,10};
856 mesh2->renumberCells(renum,false);
857 mesh2->renumberNodes(renum2,11);
858 CPPUNIT_ASSERT_THROW(mesh1->checkGeoEquivalWith(mesh2,0,1e-12,cellCor,nodeCor),INTERP_KERNEL::Exception);//deepEqual fails
859 CPPUNIT_ASSERT(cellCor==0);
860 CPPUNIT_ASSERT(nodeCor==0);
861 mesh1->checkGeoEquivalWith(mesh2,1,1e-12,cellCor,nodeCor);//fastEqual do not see anything
862 CPPUNIT_ASSERT(cellCor==0);
863 CPPUNIT_ASSERT(nodeCor==0);
864 mesh1->checkGeoEquivalWith(mesh2,10,1e-12,cellCor,nodeCor);//deepEqual with geo permutations
865 CPPUNIT_ASSERT(cellCor);
866 CPPUNIT_ASSERT_EQUAL(10,(int)cellCor->getNumberOfTuples());
867 CPPUNIT_ASSERT_EQUAL(1,(int)cellCor->getNumberOfComponents());
868 CPPUNIT_ASSERT(std::equal(renum,renum+10,cellCor->getConstPointer()));
869 CPPUNIT_ASSERT(nodeCor);
870 CPPUNIT_ASSERT_EQUAL(11,(int)nodeCor->getNumberOfTuples());
871 CPPUNIT_ASSERT_EQUAL(1,(int)nodeCor->getNumberOfComponents());
872 CPPUNIT_ASSERT(std::equal(renum2,renum2+11,nodeCor->getConstPointer()));
877 //5th test : modification of the last cell to check fastCheck detection.
879 mesh2=build2DTargetMesh_3();
880 const int renum3[]={0,2,1,3,4,5,6,8,9,7};
881 mesh2->renumberCells(renum3,false);
882 mesh2->renumberNodes(renum2,11);
884 try { mesh1->checkGeoEquivalWith(mesh2,0,1e-12,cellCor,nodeCor);//deepEqual fails
886 catch(INTERP_KERNEL::Exception& e) { isExcep=true; }
887 CPPUNIT_ASSERT(isExcep); isExcep=false;
888 CPPUNIT_ASSERT(cellCor==0);
889 CPPUNIT_ASSERT(nodeCor==0);
890 try { mesh1->checkGeoEquivalWith(mesh2,1,1e-12,cellCor,nodeCor);//fastEqual has detected something
892 catch(INTERP_KERNEL::Exception& e) { isExcep=true; }
893 CPPUNIT_ASSERT(isExcep); isExcep=false;
894 CPPUNIT_ASSERT(cellCor==0);
895 CPPUNIT_ASSERT(nodeCor==0);
896 mesh2->checkGeoEquivalWith(mesh1,10,1e-12,cellCor,nodeCor);//deepEqual with geo permutations
897 CPPUNIT_ASSERT(cellCor);
898 CPPUNIT_ASSERT_EQUAL(10,(int)cellCor->getNumberOfTuples());
899 CPPUNIT_ASSERT_EQUAL(1,(int)cellCor->getNumberOfComponents());
900 CPPUNIT_ASSERT(std::equal(renum3,renum3+10,cellCor->getConstPointer()));
901 CPPUNIT_ASSERT(nodeCor);
902 CPPUNIT_ASSERT_EQUAL(11,(int)nodeCor->getNumberOfTuples());
903 CPPUNIT_ASSERT_EQUAL(1,(int)nodeCor->getNumberOfComponents());
904 CPPUNIT_ASSERT(std::equal(renum2,renum2+11,nodeCor->getConstPointer()));
914 void MEDCouplingBasicsTest2::testCheckGeoEquivalWith2()
916 MEDCouplingUMesh *mesh1=build2DTargetMesh_4();
917 MEDCouplingUMesh *mesh2=build2DTargetMesh_1();
918 DataArrayInt *cellCor,*nodeCor;
919 mesh1->checkGeoEquivalWith(mesh2,10,1e-12,cellCor,nodeCor);
920 CPPUNIT_ASSERT(cellCor==0);
921 CPPUNIT_ASSERT(nodeCor!=0);
922 const int expected1[9]={0, 1, 3, 4, 5, 6, 7, 8, 9};
924 CPPUNIT_ASSERT_EQUAL(expected1[i],nodeCor->getIJ(i,0));
931 void MEDCouplingBasicsTest2::testCopyTinyStringsFromOnFields()
933 MEDCouplingUMesh *m=build3DSurfTargetMesh_1();
934 int nbOfCells=m->getNumberOfCells();
935 MEDCouplingFieldDouble *f=MEDCouplingFieldDouble::New(ON_CELLS,LINEAR_TIME);
937 CPPUNIT_ASSERT_EQUAL(5,f->getNumberOfMeshPlacesExpected());
939 f->setDescription("b");
940 DataArrayDouble *a1=DataArrayDouble::New();
941 a1->alloc(nbOfCells,2);
943 a1->setInfoOnComponent(0,"c");
944 a1->setInfoOnComponent(1,"d");
945 DataArrayDouble *a2=a1->deepCopy();
946 a2->setInfoOnComponent(0,"e");
947 a2->setInfoOnComponent(1,"f");
950 f->setEndTime(3.,3,4);
954 m->getCoords()->setInfoOnComponent(0,"h");
955 m->getCoords()->setInfoOnComponent(1,"i");
956 m->getCoords()->setInfoOnComponent(2,"j");
958 f->checkConsistencyLight();
959 MEDCouplingFieldDouble *f2=f->clone(true);
960 CPPUNIT_ASSERT(f2->isEqual(f,1e-12,1e-12));
962 CPPUNIT_ASSERT(!f2->isEqual(f,1e-12,1e-12));
963 f2->copyTinyStringsFrom(f);
964 CPPUNIT_ASSERT(f2->isEqual(f,1e-12,1e-12));
965 f2->setDescription("GGG");
966 CPPUNIT_ASSERT(!f2->isEqual(f,1e-12,1e-12));
967 f2->copyTinyStringsFrom(f);
968 CPPUNIT_ASSERT(f2->isEqual(f,1e-12,1e-12));
969 f2->getArray()->setInfoOnComponent(0,"mmmm");
970 CPPUNIT_ASSERT(!f2->isEqual(f,1e-12,1e-12));
971 f2->copyTinyStringsFrom(f);
972 CPPUNIT_ASSERT(f2->isEqual(f,1e-12,1e-12));
973 f2->getEndArray()->setInfoOnComponent(1,"mmmm");
974 CPPUNIT_ASSERT(!f2->isEqual(f,1e-12,1e-12));
975 f2->copyTinyStringsFrom(f);
976 CPPUNIT_ASSERT(f2->isEqual(f,1e-12,1e-12));
978 MEDCouplingUMesh *m2=m->clone(true);
979 CPPUNIT_ASSERT(m2->isEqual(m,1e-12));
981 CPPUNIT_ASSERT(!m2->isEqual(m,1e-12));
982 m2->copyTinyStringsFrom(m);
983 CPPUNIT_ASSERT(m2->isEqual(m,1e-12));
984 m2->getCoords()->setInfoOnComponent(1,"eee");
985 CPPUNIT_ASSERT(!m2->isEqual(m,1e-12));
986 m2->copyTinyStringsFrom(m);
987 CPPUNIT_ASSERT(m2->isEqual(m,1e-12));
994 void MEDCouplingBasicsTest2::testTryToShareSameCoordsPermute()
996 MEDCouplingUMesh *m=build3DSurfTargetMesh_1();
997 MEDCouplingUMesh *m2=build3DSurfTargetMesh_1();
998 CPPUNIT_ASSERT(m->getCoords()!=m2->getCoords());
999 m->tryToShareSameCoordsPermute(*m2,1e-12);
1000 CPPUNIT_ASSERT(m->getCoords()==m2->getCoords());
1001 CPPUNIT_ASSERT(m2->isEqual(m,1e-12));
1002 const int renum1[9]={1,2,0,5,8,7,4,3,6};
1003 m->renumberNodes(renum1,9);
1004 CPPUNIT_ASSERT(m->getCoords()!=m2->getCoords());
1005 CPPUNIT_ASSERT(!m2->isEqual(m,1e-12));
1006 m->tryToShareSameCoordsPermute(*m2,1e-12);
1007 CPPUNIT_ASSERT(m->getCoords()==m2->getCoords());
1008 CPPUNIT_ASSERT(m2->isEqual(m,1e-12));
1013 void MEDCouplingBasicsTest2::testTryToShareSameCoordsPermute2()
1015 MEDCouplingUMesh *m1=build2DTargetMesh_4();
1016 double targetCoords[8]={-0.3,-0.3, 0.2,-0.3, -0.3,0.2, 0.2,0.2 };
1017 int targetConn[4]={0,2,3,1};
1018 MEDCouplingUMesh *m2=MEDCouplingUMesh::New();
1019 m2->setMeshDimension(2);
1020 m2->allocateCells(1);
1021 m2->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,targetConn);
1022 m2->finishInsertingCells();
1023 DataArrayDouble *myCoords=DataArrayDouble::New();
1024 myCoords->alloc(4,2);
1025 std::copy(targetCoords,targetCoords+8,myCoords->getPointer());
1026 m2->setCoords(myCoords);
1027 myCoords->decrRef();
1028 m2->checkConsistencyLight();
1029 m1->checkConsistencyLight();
1031 const double expected1[5]={0.25,0.125,0.125,0.25,0.25};
1032 MEDCouplingFieldDouble *f1=m1->getMeasureField(false);
1033 MEDCouplingFieldDouble *f2=m2->getMeasureField(false);
1034 CPPUNIT_ASSERT_EQUAL(5,(int)f1->getArray()->getNumberOfTuples());
1035 CPPUNIT_ASSERT_EQUAL(1,(int)f2->getArray()->getNumberOfTuples());
1036 for(int i=0;i<5;i++)
1037 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],f1->getIJ(i,0),1e-12);
1038 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[0],f2->getIJ(0,0),1e-12);
1041 CPPUNIT_ASSERT_THROW(m1->tryToShareSameCoordsPermute(*m2,1e-12),INTERP_KERNEL::Exception);// <- here in this order the sharing is impossible.
1042 // Let's go for deeper test of tryToShareSameCoordsPermute
1043 m2->tryToShareSameCoordsPermute(*m1,1e-12);
1044 f1=m1->getMeasureField(false);
1045 f2=m2->getMeasureField(false);
1046 CPPUNIT_ASSERT_EQUAL(5,(int)f1->getArray()->getNumberOfTuples());
1047 CPPUNIT_ASSERT_EQUAL(1,(int)f2->getArray()->getNumberOfTuples());
1048 for(int i=0;i<5;i++)
1049 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],f1->getIJ(i,0),1e-12);
1050 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[0],f2->getIJ(0,0),1e-12);
1059 void MEDCouplingBasicsTest2::testChangeUnderlyingMesh1()
1061 MEDCouplingUMesh *mesh1=build2DTargetMesh_3();
1062 MEDCouplingUMesh *mesh2=build2DTargetMesh_3();
1063 MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME);
1065 DataArrayDouble *array=DataArrayDouble::New();
1066 array->alloc(mesh1->getNumberOfCells(),2);
1067 const double arr[20]={7.,107.,8.,108.,9.,109.,10.,110.,11.,111.,12.,112.,13.,113.,14.,114.,15.,115.,16.,116.};
1068 std::copy(arr,arr+20,array->getPointer());
1069 f1->setArray(array);
1072 const int renum[]={0,2,1,3,4,5,6,8,7,9};
1073 mesh2->renumberCells(renum,false);
1074 CPPUNIT_ASSERT(f1->getMesh()==mesh1);
1075 f1->changeUnderlyingMesh(mesh1,10,1e-12);// nothing done only to check that nothing done.
1076 CPPUNIT_ASSERT(f1->getMesh()==mesh1);
1077 f1->changeUnderlyingMesh(mesh2,10,1e-12);
1078 CPPUNIT_ASSERT(f1->getMesh()==mesh2);
1079 const double expected1[20]={7.,107.,9.,109.,8.,108.,10.,110.,11.,111.,12.,112.,13.,113.,15.,115.,14.,114.,16.,116.};
1080 for(int i=0;i<20;i++)
1081 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],f1->getArray()->getIJ(0,i),1e-12);
1084 f1=MEDCouplingFieldDouble::New(ON_NODES,NO_TIME);
1086 array=DataArrayDouble::New();
1087 array->alloc(mesh1->getNumberOfNodes(),2);
1088 const double arr2[22]={7.,107.,8.,108.,9.,109.,10.,110.,11.,111.,12.,112.,13.,113.,14.,114.,15.,115.,16.,116.,17.,117.};
1089 std::copy(arr2,arr2+22,array->getPointer());
1090 f1->setArray(array);
1093 const int renum2[]={0,2,10,3,4,5,6,8,7,9,1};
1094 mesh2->renumberNodes(renum2,11);
1095 CPPUNIT_ASSERT(f1->getMesh()==mesh1);
1096 f1->changeUnderlyingMesh(mesh2,10,1e-12);
1097 CPPUNIT_ASSERT(f1->getMesh()==mesh2);
1098 const double expected2[22]={7.,107.,17.,117.,8.,108.,10.,110.,11.,111.,12.,112.,13.,113.,15.,115.,14.,114.,16.,116.,9.,109.};
1099 for(int i=0;i<22;i++)
1100 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],f1->getArray()->getIJ(0,i),1e-12);
1107 void MEDCouplingBasicsTest2::testGetMaxValue1()
1109 MEDCouplingUMesh *m=build3DSurfTargetMesh_1();
1110 int nbOfCells=m->getNumberOfCells();
1111 MEDCouplingFieldDouble *f=MEDCouplingFieldDouble::New(ON_CELLS,LINEAR_TIME);
1113 DataArrayDouble *a1=DataArrayDouble::New();
1114 a1->alloc(nbOfCells,1);
1115 const double val1[5]={3.,4.,5.,6.,7.};
1116 std::copy(val1,val1+5,a1->getPointer());
1117 DataArrayDouble *a2=DataArrayDouble::New();
1118 a2->alloc(nbOfCells,1);
1119 const double val2[5]={0.,1.,2.,8.,7.};
1120 std::copy(val2,val2+5,a2->getPointer());
1123 f->setEndTime(3.,3,4);
1124 f->checkConsistencyLight();
1126 CPPUNIT_ASSERT_DOUBLES_EQUAL(8.,f->getMaxValue(),1e-14);
1127 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,f->getMinValue(),1e-14);
1128 CPPUNIT_ASSERT_DOUBLES_EQUAL(5.,f->getAverageValue(),1e-14);
1129 CPPUNIT_ASSERT_DOUBLES_EQUAL(5.125,f->getWeightedAverageValue(0),1e-14);
1131 CPPUNIT_ASSERT_DOUBLES_EQUAL(9.5,f->getMaxValue(),1e-14);
1132 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,f->getMinValue(),1e-14);
1134 CPPUNIT_ASSERT_DOUBLES_EQUAL(9.5,f->getMaxValue(),1e-14);
1135 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,f->getMinValue(),1e-14);
1143 void MEDCouplingBasicsTest2::testSubstractInPlaceDM1()
1145 MEDCouplingUMesh *mesh1=build2DTargetMesh_3();
1146 MEDCouplingUMesh *mesh2=build2DTargetMesh_3();
1147 MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME);
1149 DataArrayDouble *array=DataArrayDouble::New();
1150 array->alloc(mesh1->getNumberOfCells(),2);
1151 const double arr[20]={7.,107.,8.,108.,9.,109.,10.,110.,11.,111.,12.,112.,13.,113.,14.,114.,15.,115.,16.,116.};
1152 std::copy(arr,arr+20,array->getPointer());
1153 f1->setArray(array);
1156 CPPUNIT_ASSERT_EQUAL(10,(int)f1->getNumberOfTuples());
1157 CPPUNIT_ASSERT_EQUAL(2,(int)f1->getNumberOfComponents());
1158 CPPUNIT_ASSERT_EQUAL(20,(int)f1->getNumberOfValues());
1160 const int renum[]={0,2,3,1,4,5,6,8,7,9};
1161 mesh2->renumberCells(renum,false);
1163 MEDCouplingFieldDouble *f2=MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME);
1165 array=DataArrayDouble::New();
1166 array->alloc(mesh2->getNumberOfCells(),2);
1167 const double arr2[20]={7.1,107.1,10.1,110.1,8.1,108.1,9.1,109.1,11.1,111.1,12.1,112.1,13.1,113.1,15.1,115.1,14.1,114.1,16.1,116.1};
1168 std::copy(arr2,arr2+20,array->getPointer());
1169 f2->setArray(array);
1172 f1->substractInPlaceDM(f2,10,1e-12);
1173 f1->applyFunc(1,"abs(x+y+0.2)");
1174 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,f1->getMaxValue(),1e-14);
1182 void MEDCouplingBasicsTest2::testDotCrossProduct1()
1184 MEDCouplingUMesh *mesh1=build2DTargetMesh_3();
1185 MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,ONE_TIME);
1186 f1->setTime(2.3,5,6);
1188 DataArrayDouble *array=DataArrayDouble::New();
1189 array->alloc(mesh1->getNumberOfCells(),3);
1190 const double arr1[30]={7.,107.,207.,8.,108.,208.,9.,109.,209.,10.,110.,210.,11.,111.,211.,12.,112.,212.,13.,113.,213.,14.,114.,214.,15.,115.,215.,16.,116.,216.};
1191 std::copy(arr1,arr1+30,array->getPointer());
1192 f1->setArray(array);
1194 MEDCouplingFieldDouble *f2=MEDCouplingFieldDouble::New(ON_CELLS,ONE_TIME);
1195 f2->setTime(7.8,4,5);
1197 array=DataArrayDouble::New();
1198 array->alloc(mesh1->getNumberOfCells(),3);
1199 const double arr2[30]={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.,29.,30.};
1200 std::copy(arr2,arr2+30,array->getPointer());
1201 f2->setArray(array);
1204 MEDCouplingFieldDouble *f3=f1->dot(*f2);
1205 const double expected1[10]={842.,1820.,2816.,3830.,4862.,5912.,6980.,8066.,9170.,10292.};
1206 for(int i=0;i<10;i++)
1207 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],f3->getIJ(i,0),1e-9);
1210 MEDCouplingFieldDouble *f4=f1->crossProduct(*f2);
1211 const double expected2[30]={-93., 186., -93., -392., 784., -392., -691., 1382., -691., -990., 1980., -990., -1289., 2578., -1289., -1588., 3176., -1588., -1887., 3774., -1887., -2186., 4372., -2186., -2485., 4970., -2485., -2784., 5568., -2784.};
1212 for(int i=0;i<30;i++)
1213 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],f4->getIJ(0,i),1e-9);
1221 void MEDCouplingBasicsTest2::testMinMaxFields1()
1223 MEDCouplingUMesh *mesh1=build2DTargetMesh_3();
1224 MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,ONE_TIME);
1225 f1->setTime(2.3,5,6);
1227 DataArrayDouble *array=DataArrayDouble::New();
1228 array->alloc(mesh1->getNumberOfCells(),3);
1229 const double arr1[30]={7.,107.,207.,8.,108.,208.,9.,109.,209.,10.,110.,210.,11.,111.,211.,12.,112.,212.,13.,113.,213.,14.,114.,214.,15.,115.,215.,16.,116.,216.};
1230 std::copy(arr1,arr1+30,array->getPointer());
1231 f1->setArray(array);
1233 MEDCouplingFieldDouble *f2=MEDCouplingFieldDouble::New(ON_CELLS,ONE_TIME);
1234 f2->setTime(7.8,4,5);
1236 array=DataArrayDouble::New();
1237 array->alloc(mesh1->getNumberOfCells(),3);
1238 const double arr2[30]={6.,108.,206.,9.,107.,209.,8.,110.,208.,11.,109.,211.,10.,112.,210.,13.,111.,213.,12.,114.,212.,15.,113.,215.,14.,116.,214.,17.,115.,217.};
1239 std::copy(arr2,arr2+30,array->getPointer());
1240 f2->setArray(array);
1243 MEDCouplingFieldDouble *f3=f1->max(*f2);
1244 const double expected1[30]={7.,108.,207.,9.,108.,209.,9.,110.,209.,11.,110.,211.,11.,112.,211.,13.,112.,213.,13.,114.,213.,15.,114.,215.,15.,116.,215.,17.,116.,217.};
1245 for(int i=0;i<30;i++)
1246 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],f3->getIJ(0,i),1e-9);
1249 MEDCouplingFieldDouble *f4=f1->min(*f2);
1250 const double expected2[30]={6.,107.,206.,8.,107.,208.,8.,109.,208.,10.,109.,210.,10.,111.,210.,12.,111.,212.,12.,113.,212.,14.,113.,214.,14.,115.,214.,16.,115.,216.};
1251 for(int i=0;i<30;i++)
1252 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],f4->getIJ(0,i),1e-9);
1260 void MEDCouplingBasicsTest2::testApplyLin1()
1262 MEDCouplingUMesh *mesh1=build2DTargetMesh_3();
1263 MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,LINEAR_TIME);
1265 DataArrayDouble *array=DataArrayDouble::New();
1266 array->alloc(mesh1->getNumberOfCells(),2);
1267 const double arr[20]={7.,107.,8.,108.,9.,109.,10.,110.,11.,111.,12.,112.,13.,113.,14.,114.,15.,115.,16.,116.};
1268 std::copy(arr,arr+20,array->getPointer());
1269 f1->setArray(array);
1272 f1->applyLin(2.,3.,0);
1273 const double expected1[20]={17.,107.,19.,108.,21.,109.,23.,110.,25.,111.,27.,112.,29.,113.,31.,114.,33.,115.,35.,116.};
1274 for(int i=0;i<20;i++)
1275 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],f1->getIJ(0,i),1e-9);
1277 const double arr2[20]={2.,102.,3.,103.,4.,104.,5.,105.,6.,106.,7.,107.,8.,108.,9.,109.,10.,110.,11.,111.};
1278 array=DataArrayDouble::New();
1279 array->alloc(mesh1->getNumberOfCells(),2);
1280 std::copy(arr2,arr2+20,array->getPointer());
1281 f1->setEndArray(array);
1284 f1->applyLin(4.,5.,1);
1286 const double expected2[20]={17.,433.,19.,437.,21.,441.,23.,445.,25.,449.,27.,453.,29.,457.,31.,461.,33.,465.,35.,469.};
1287 for(int i=0;i<20;i++)
1288 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],f1->getIJ(0,i),1e-9);
1289 const double expected3[20]={2.,413.,3.,417.,4.,421.,5.,425.,6.,429.,7.,433.,8.,437.,9.,441.,10.,445.,11.,449.};
1290 for(int i=0;i<20;i++)
1291 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected3[i],f1->getEndArray()->getIJ(0,i),1e-9);
1297 void MEDCouplingBasicsTest2::testGetIdsInRange1()
1299 MEDCouplingUMesh *mesh1=build2DTargetMesh_3();
1300 MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,ONE_TIME);
1301 f1->setTime(2.3,5,6);
1303 DataArrayDouble *array=DataArrayDouble::New();
1304 array->alloc(mesh1->getNumberOfCells(),1);
1305 const double arr1[10]={2.,8.,6.,5.,11.,7.,9.,3.,10.,4.};
1306 std::copy(arr1,arr1+10,array->getPointer());
1307 f1->setArray(array);
1310 f1->checkConsistencyLight();
1311 DataArrayInt *da=f1->findIdsInRange(2.9,7.1);
1312 CPPUNIT_ASSERT_EQUAL((std::size_t)5,da->getNbOfElems());
1313 const int expected1[5]={2,3,5,7,9};
1314 CPPUNIT_ASSERT(std::equal(expected1,expected1+5,da->getConstPointer()));
1316 da=f1->findIdsInRange(8.,12.);
1317 CPPUNIT_ASSERT_EQUAL((std::size_t)4,da->getNbOfElems());
1318 const int expected2[4]={1,4,6,8};
1319 CPPUNIT_ASSERT(std::equal(expected2,expected2+4,da->getConstPointer()));
1326 void MEDCouplingBasicsTest2::testBuildSubPart1()
1328 MEDCouplingUMesh *mesh1=build2DTargetMesh_1();
1329 MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,ONE_TIME);
1330 f1->setTime(2.3,5,6);
1332 DataArrayDouble *array=DataArrayDouble::New();
1333 array->alloc(mesh1->getNumberOfCells(),2);
1334 const double arr1[10]={3.,103.,4.,104.,5.,105.,6.,106.,7.,107.};
1335 std::copy(arr1,arr1+10,array->getPointer());
1336 f1->setArray(array);
1339 const int part1[3]={2,1,4};
1340 MEDCouplingFieldDouble *f2=f1->buildSubPart(part1,part1+3);
1342 CPPUNIT_ASSERT_EQUAL(3,(int)f2->getNumberOfTuples());
1343 CPPUNIT_ASSERT_EQUAL(2,(int)f2->getNumberOfComponents());
1344 const double expected1[6]={5.,105.,4.,104.,7.,107.};
1345 for(int i=0;i<6;i++)
1346 CPPUNIT_ASSERT_DOUBLES_EQUAL(f2->getIJ(0,i),expected1[i],1e-12);
1347 CPPUNIT_ASSERT_EQUAL(3,(int)f2->getMesh()->getNumberOfCells());
1348 CPPUNIT_ASSERT_EQUAL(6,(int)f2->getMesh()->getNumberOfNodes());
1349 CPPUNIT_ASSERT_EQUAL(2,f2->getMesh()->getSpaceDimension());
1350 CPPUNIT_ASSERT_EQUAL(2,f2->getMesh()->getMeshDimension());
1351 MEDCouplingUMesh *m2C=dynamic_cast<MEDCouplingUMesh *>(const_cast<MEDCouplingMesh *>(f2->getMesh()));
1352 CPPUNIT_ASSERT_EQUAL(13,m2C->getNodalConnectivityArrayLen());
1353 const double expected2[12]={0.2, -0.3, 0.7, -0.3, 0.2, 0.2, 0.7, 0.2, 0.2, 0.7, 0.7, 0.7};
1354 for(int i=0;i<12;i++)
1355 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],m2C->getCoords()->getIJ(0,i),1.e-12);
1356 const double expected3[13]={3,2,3,1,3,0,2,1,4,4,5,3,2};
1357 CPPUNIT_ASSERT(std::equal(expected3,expected3+13,m2C->getNodalConnectivity()->getConstPointer()));
1358 const double expected4[4]={0,4,8,13};
1359 CPPUNIT_ASSERT(std::equal(expected4,expected4+4,m2C->getNodalConnectivityIndex()->getConstPointer()));
1362 // Test with field on nodes.
1363 f1=MEDCouplingFieldDouble::New(ON_NODES,ONE_TIME);
1364 f1->setTime(2.3,5,6);
1366 array=DataArrayDouble::New();
1367 array->alloc(mesh1->getNumberOfNodes(),2);
1368 const double arr2[18]={3.,103.,4.,104.,5.,105.,6.,106.,7.,107.,8.,108.,9.,109.,10.,110.,11.,111.};
1369 std::copy(arr2,arr2+18,array->getPointer());
1370 f1->setArray(array);
1372 const int part2[2]={1,2};
1373 f2=f1->buildSubPart(part2,part2+2);
1374 CPPUNIT_ASSERT_EQUAL(4,(int)f2->getNumberOfTuples());
1375 CPPUNIT_ASSERT_EQUAL(2,(int)f2->getNumberOfComponents());
1376 const double expected5[8]={4.,104.,5.,105.,7.,107.,8.,108.};
1377 for(int i=0;i<8;i++)
1378 CPPUNIT_ASSERT_DOUBLES_EQUAL(f2->getIJ(0,i),expected5[i],1e-12);
1379 CPPUNIT_ASSERT_EQUAL(2,(int)f2->getMesh()->getNumberOfCells());
1380 CPPUNIT_ASSERT_EQUAL(4,f2->getMesh()->getNumberOfNodes());
1381 CPPUNIT_ASSERT_EQUAL(2,f2->getMesh()->getSpaceDimension());
1382 CPPUNIT_ASSERT_EQUAL(2,f2->getMesh()->getMeshDimension());
1383 m2C=dynamic_cast<MEDCouplingUMesh *>(const_cast<MEDCouplingMesh *>(f2->getMesh()));
1384 CPPUNIT_ASSERT_EQUAL(8,m2C->getNodalConnectivityArrayLen());
1385 for(int i=0;i<8;i++)//8 is not an error
1386 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],m2C->getCoords()->getIJ(0,i),1.e-12);
1387 CPPUNIT_ASSERT(std::equal(expected3,expected3+4,m2C->getNodalConnectivity()->getConstPointer()+4));
1388 CPPUNIT_ASSERT(std::equal(expected3+4,expected3+8,m2C->getNodalConnectivity()->getConstPointer()));
1389 CPPUNIT_ASSERT(std::equal(expected4,expected4+3,m2C->getNodalConnectivityIndex()->getConstPointer()));
1391 //idem previous because nodes of cell#4 are not fully present in part3
1392 const int part3[2]={1,2};
1393 DataArrayInt *arrr=DataArrayInt::New();
1395 std::copy(part3,part3+2,arrr->getPointer());
1396 f2=f1->buildSubPart(arrr);
1398 CPPUNIT_ASSERT_EQUAL(4,(int)f2->getNumberOfTuples());
1399 CPPUNIT_ASSERT_EQUAL(2,(int)f2->getNumberOfComponents());
1400 for(int i=0;i<8;i++)
1401 CPPUNIT_ASSERT_DOUBLES_EQUAL(f2->getIJ(0,i),expected5[i],1e-12);
1402 CPPUNIT_ASSERT_EQUAL(2,(int)f2->getMesh()->getNumberOfCells());
1403 CPPUNIT_ASSERT_EQUAL(4,f2->getMesh()->getNumberOfNodes());
1404 CPPUNIT_ASSERT_EQUAL(2,f2->getMesh()->getSpaceDimension());
1405 CPPUNIT_ASSERT_EQUAL(2,f2->getMesh()->getMeshDimension());
1406 m2C=dynamic_cast<MEDCouplingUMesh *>(const_cast<MEDCouplingMesh *>(f2->getMesh()));
1407 CPPUNIT_ASSERT_EQUAL(8,m2C->getNodalConnectivityArrayLen());
1408 for(int i=0;i<8;i++)//8 is not an error
1409 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],m2C->getCoords()->getIJ(0,i),1.e-12);
1410 CPPUNIT_ASSERT(std::equal(expected3,expected3+4,m2C->getNodalConnectivity()->getConstPointer()+4));
1411 CPPUNIT_ASSERT(std::equal(expected3+4,expected3+8,m2C->getNodalConnectivity()->getConstPointer()));
1412 CPPUNIT_ASSERT(std::equal(expected4,expected4+3,m2C->getNodalConnectivityIndex()->getConstPointer()));
1415 const int part4[3]={1,2,4};
1416 f2=f1->buildSubPart(part4,part4+3);
1417 CPPUNIT_ASSERT_EQUAL(6,(int)f2->getNumberOfTuples());
1418 CPPUNIT_ASSERT_EQUAL(2,(int)f2->getNumberOfComponents());
1419 const double expected6[12]={4.,104.,5.,105.,7.,107.,8.,108.,10.,110.,11.,111.};
1420 for(int i=0;i<12;i++)
1421 CPPUNIT_ASSERT_DOUBLES_EQUAL(f2->getIJ(0,i),expected6[i],1e-12);
1422 CPPUNIT_ASSERT_EQUAL(3,(int)f2->getMesh()->getNumberOfCells());
1423 CPPUNIT_ASSERT_EQUAL(6,f2->getMesh()->getNumberOfNodes());
1424 CPPUNIT_ASSERT_EQUAL(2,f2->getMesh()->getSpaceDimension());
1425 CPPUNIT_ASSERT_EQUAL(2,f2->getMesh()->getMeshDimension());
1426 m2C=dynamic_cast<MEDCouplingUMesh *>(const_cast<MEDCouplingMesh *>(f2->getMesh()));
1427 CPPUNIT_ASSERT_EQUAL(13,m2C->getNodalConnectivityArrayLen());
1428 for(int i=0;i<12;i++)
1429 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],m2C->getCoords()->getIJ(0,i),1.e-12);
1430 CPPUNIT_ASSERT(std::equal(expected3,expected3+4,m2C->getNodalConnectivity()->getConstPointer()+4));
1431 CPPUNIT_ASSERT(std::equal(expected3+4,expected3+8,m2C->getNodalConnectivity()->getConstPointer()));
1432 CPPUNIT_ASSERT(std::equal(expected3+8,expected3+13,m2C->getNodalConnectivity()->getConstPointer()+8));
1433 CPPUNIT_ASSERT(std::equal(expected4,expected4+4,m2C->getNodalConnectivityIndex()->getConstPointer()));
1440 void MEDCouplingBasicsTest2::testDoublyContractedProduct1()
1442 MEDCouplingUMesh *mesh1=build2DTargetMesh_1();
1443 MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME);
1445 DataArrayDouble *array=DataArrayDouble::New();
1446 array->alloc(mesh1->getNumberOfCells(),6);
1447 const double arr1[30]={7.8,8.9,9.1,10.2,23.4,34.5, 7.8,8.9,9.1,10.2,23.4,34.5, 7.8,8.9,9.1,10.2,23.4,34.5, 7.8,8.9,9.1,10.2,23.4,34.5, 7.8,8.9,9.1,10.2,23.4,34.5};
1448 std::copy(arr1,arr1+30,array->getPointer());
1449 f1->setArray(array);
1451 f1->checkConsistencyLight();
1453 MEDCouplingFieldDouble *f2=f1->doublyContractedProduct();
1454 f2->checkConsistencyLight();
1455 CPPUNIT_ASSERT_EQUAL(1,(int)f2->getNumberOfComponents());
1456 CPPUNIT_ASSERT_EQUAL(5,(int)f2->getNumberOfTuples());
1457 for(int i=0;i<5;i++)
1458 CPPUNIT_ASSERT_DOUBLES_EQUAL(3906.56,f2->getIJ(i,0),1e-9);
1465 void MEDCouplingBasicsTest2::testDeterminant1()
1467 MEDCouplingUMesh *mesh1=build2DTargetMesh_1();
1468 MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,CONST_ON_TIME_INTERVAL);
1469 f1->setTime(2.3,5,6);
1470 f1->setEndTime(3.8,7,3);
1472 DataArrayDouble *array=DataArrayDouble::New();
1473 array->alloc(mesh1->getNumberOfCells(),4);
1474 const double arr1[20]={1.2,2.3,3.4,4.5, 1.2,2.3,3.4,4.5, 1.2,2.3,3.4,4.5, 1.2,2.3,3.4,4.5, 1.2,2.3,3.4,4.5};
1475 std::copy(arr1,arr1+20,array->getPointer());
1476 f1->setArray(array);
1479 f1->checkConsistencyLight();
1480 MEDCouplingFieldDouble *f2=f1->determinant();
1481 f2->checkConsistencyLight();
1482 CPPUNIT_ASSERT_EQUAL(CONST_ON_TIME_INTERVAL,f2->getTimeDiscretization());
1483 CPPUNIT_ASSERT_EQUAL(1,(int)f2->getNumberOfComponents());
1484 CPPUNIT_ASSERT_EQUAL(5,(int)f2->getNumberOfValues());
1485 for(int i=0;i<5;i++)
1486 CPPUNIT_ASSERT_DOUBLES_EQUAL(-2.42,f2->getIJ(i,0),1e-13);
1489 //6 components multi arrays with end array not defined
1490 f1=MEDCouplingFieldDouble::New(ON_NODES,LINEAR_TIME);
1491 f1->setTime(2.3,5,6);
1492 f1->setEndTime(3.8,7,3);
1494 array=DataArrayDouble::New();
1495 array->alloc(mesh1->getNumberOfNodes(),6);
1496 const double arr2[54]={1.2,2.3,3.4,4.5,5.6,6.7, 1.2,2.3,3.4,4.5,5.6,6.7, 1.2,2.3,3.4,4.5,5.6,6.7, 1.2,2.3,3.4,4.5,5.6,6.7, 1.2,2.3,3.4,4.5,5.6,6.7,
1497 1.2,2.3,3.4,4.5,5.6,6.7, 1.2,2.3,3.4,4.5,5.6,6.7, 1.2,2.3,3.4,4.5,5.6,6.7, 1.2,2.3,3.4,4.5,5.6,6.7};
1498 std::copy(arr2,arr2+54,array->getPointer());
1499 f1->setArray(array);
1501 CPPUNIT_ASSERT_THROW(f1->checkConsistencyLight(),INTERP_KERNEL::Exception);//no end array specified !
1503 f2=f1->determinant();
1504 CPPUNIT_ASSERT_EQUAL(LINEAR_TIME,f2->getTimeDiscretization());
1505 CPPUNIT_ASSERT_EQUAL(1,(int)f2->getArray()->getNumberOfComponents());
1506 CPPUNIT_ASSERT_EQUAL(9,(int)f2->getNumberOfTuples());
1507 for(int i=0;i<9;i++)
1508 CPPUNIT_ASSERT_DOUBLES_EQUAL(137.335,f2->getIJ(i,0),1e-10);
1510 //6 components multi arrays with end array defined
1511 array=DataArrayDouble::New();
1512 array->alloc(mesh1->getNumberOfNodes(),6);
1513 const double arr3[54]={7.8,8.9,9.1,10.2,23.4,34.5, 7.8,8.9,9.1,10.2,23.4,34.5, 7.8,8.9,9.1,10.2,23.4,34.5, 7.8,8.9,9.1,10.2,23.4,34.5, 7.8,8.9,9.1,10.2,23.4,34.5,
1514 7.8,8.9,9.1,10.2,23.4,34.5, 7.8,8.9,9.1,10.2,23.4,34.5, 7.8,8.9,9.1,10.2,23.4,34.5, 7.8,8.9,9.1,10.2,23.4,34.5};
1515 std::copy(arr3,arr3+54,array->getPointer());
1516 f1->setEndArray(array);
1518 f1->checkConsistencyLight();
1519 f2=f1->determinant();
1520 f2->checkConsistencyLight();
1521 CPPUNIT_ASSERT_EQUAL(LINEAR_TIME,f2->getTimeDiscretization());
1522 CPPUNIT_ASSERT_EQUAL(1,(int)f2->getNumberOfComponents());
1523 CPPUNIT_ASSERT_EQUAL(9,(int)f2->getNumberOfTuples());
1525 CPPUNIT_ASSERT_DOUBLES_EQUAL(2.3,f2->getTime(it,order),1e-12);
1526 CPPUNIT_ASSERT_EQUAL(5,it); CPPUNIT_ASSERT_EQUAL(6,order);
1527 CPPUNIT_ASSERT_DOUBLES_EQUAL(3.8,f2->getEndTime(it,order),1e-12);
1528 CPPUNIT_ASSERT_EQUAL(7,it); CPPUNIT_ASSERT_EQUAL(3,order);
1529 for(int i=0;i<9;i++)
1531 CPPUNIT_ASSERT_DOUBLES_EQUAL(137.335,f2->getIJ(i,0),1e-10);
1532 CPPUNIT_ASSERT_DOUBLES_EQUAL(1289.685,f2->getEndArray()->getIJ(i,0),1e-9);
1537 f1=MEDCouplingFieldDouble::New(ON_CELLS,ONE_TIME);
1538 f1->setTime(7.8,10,2);
1540 array=DataArrayDouble::New();
1541 array->alloc(mesh1->getNumberOfCells(),9);
1542 const double arr4[45]={1.2,2.3,3.4,4.5,5.6,6.7,7.8,8.9,9.1, 1.2,2.3,3.4,4.5,5.6,6.7,7.8,8.9,9.1, 1.2,2.3,3.4,4.5,5.6,6.7,7.8,8.9,9.1, 1.2,2.3,3.4,4.5,5.6,6.7,7.8,8.9,9.1, 1.2,2.3,3.4,4.5,5.6,6.7,7.8,8.9,9.1};
1543 std::copy(arr4,arr4+45,array->getPointer());
1544 f1->setArray(array);
1547 f1->checkConsistencyLight();
1548 f2=f1->determinant();
1549 f2->checkConsistencyLight();
1550 CPPUNIT_ASSERT_EQUAL(ONE_TIME,f2->getTimeDiscretization());
1551 CPPUNIT_ASSERT_EQUAL(1,(int)f2->getNumberOfComponents());
1552 CPPUNIT_ASSERT_EQUAL(5,(int)f2->getNumberOfTuples());
1553 CPPUNIT_ASSERT_DOUBLES_EQUAL(7.8,f2->getTime(it,order),1e-12);
1554 CPPUNIT_ASSERT_EQUAL(10,it); CPPUNIT_ASSERT_EQUAL(2,order);
1555 for(int i=0;i<5;i++)
1556 CPPUNIT_ASSERT_DOUBLES_EQUAL(3.267,f2->getIJ(i,0),1e-13);
1563 void MEDCouplingBasicsTest2::testEigenValues1()
1565 MEDCouplingUMesh *mesh1=build2DTargetMesh_1();
1566 MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME);
1568 DataArrayDouble *array=DataArrayDouble::New();
1569 array->alloc(mesh1->getNumberOfCells(),6);
1570 const double arr1[30]={1.2,2.3,3.4,4.5,5.6,6.7, 1.2,2.3,3.4,4.5,5.6,6.7, 1.2,2.3,3.4,4.5,5.6,6.7, 1.2,2.3,3.4,4.5,5.6,6.7, 1.2,2.3,3.4,4.5,5.6,6.7};
1571 std::copy(arr1,arr1+30,array->getPointer());
1572 f1->setArray(array);
1574 f1->checkConsistencyLight();
1576 MEDCouplingFieldDouble *f2=f1->eigenValues();
1577 f2->checkConsistencyLight();
1578 CPPUNIT_ASSERT_EQUAL(3,(int)f2->getNumberOfComponents());
1579 CPPUNIT_ASSERT_EQUAL(5,(int)f2->getNumberOfTuples());
1580 const double expected1[3]={13.638813677891717,-4.502313844635971,-2.2364998332557486};
1581 for(int i=0;i<5;i++)
1583 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[0],f2->getIJ(i,0),1e-13);
1584 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[1],f2->getIJ(i,1),1e-13);
1585 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[2],f2->getIJ(i,2),1e-13);
1593 void MEDCouplingBasicsTest2::testEigenVectors1()
1595 MEDCouplingUMesh *mesh1=build2DTargetMesh_1();
1596 MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME);
1598 DataArrayDouble *array=DataArrayDouble::New();
1599 array->alloc(mesh1->getNumberOfCells(),6);
1600 const double arr1[30]={1.2,2.3,3.4,4.5,5.6,6.7, 1.2,2.3,3.4,4.5,5.6,6.7, 1.2,2.3,3.4,4.5,5.6,6.7, 1.2,2.3,3.4,4.5,5.6,6.7, 1.2,2.3,3.4,4.5,5.6,6.7};
1601 std::copy(arr1,arr1+30,array->getPointer());
1602 f1->setArray(array);
1604 f1->checkConsistencyLight();
1606 MEDCouplingFieldDouble *f2=f1->eigenVectors();
1607 f2->checkConsistencyLight();
1608 CPPUNIT_ASSERT_EQUAL(9,(int)f2->getNumberOfComponents());
1609 CPPUNIT_ASSERT_EQUAL(5,(int)f2->getNumberOfTuples());
1610 const double expected1[9]={
1611 0.5424262364180696, 0.5351201064614425, 0.6476266283176001,//eigenvect 0
1612 0.7381111277307373, 0.06458838384003074, -0.6715804522117897,//eigenvect 1
1613 -0.4012053603397987, 0.8423032781211455, -0.3599436712889738//eigenvect 2
1615 for(int i=0;i<5;i++)
1617 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[0],f2->getIJ(i,0),1e-13);
1618 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[1],f2->getIJ(i,1),1e-13);
1619 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[2],f2->getIJ(i,2),1e-13);
1620 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[3],f2->getIJ(i,3),1e-13);
1621 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[4],f2->getIJ(i,4),1e-13);
1622 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[5],f2->getIJ(i,5),1e-13);
1623 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[6],f2->getIJ(i,6),1e-13);
1624 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[7],f2->getIJ(i,7),1e-13);
1625 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[8],f2->getIJ(i,8),1e-13);
1633 void MEDCouplingBasicsTest2::testInverse1()
1635 MEDCouplingUMesh *mesh1=build2DTargetMesh_1();
1636 MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME);
1638 DataArrayDouble *array=DataArrayDouble::New();
1639 array->alloc(mesh1->getNumberOfCells(),9);
1640 const double arr1[45]={1.2,2.3,3.4,4.5,5.6,6.7,7.8,8.9,9.1, 1.2,2.3,3.4,4.5,5.6,6.7,7.8,8.9,9.1, 1.2,2.3,3.4,4.5,5.6,6.7,7.8,8.9,9.1, 1.2,2.3,3.4,4.5,5.6,6.7,7.8,8.9,9.1, 1.2,2.3,3.4,4.5,5.6,6.7,7.8,8.9,9.1};
1641 std::copy(arr1,arr1+45,array->getPointer());
1642 f1->setArray(array);
1644 f1->checkConsistencyLight();
1646 MEDCouplingFieldDouble *f2=f1->inverse();
1647 f2->checkConsistencyLight();
1648 CPPUNIT_ASSERT_EQUAL(9,(int)f2->getNumberOfComponents());
1649 CPPUNIT_ASSERT_EQUAL(5,(int)f2->getNumberOfTuples());
1650 const double expected1[9]={-2.6538108356290113, 2.855831037649208, -1.1111111111111067, 3.461891643709813, -4.775022956841121, 2.2222222222222143, -1.1111111111111054, 2.222222222222214, -1.1111111111111072};
1651 for(int i=0;i<5;i++)
1653 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[0],f2->getIJ(i,0),1e-13);
1654 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[1],f2->getIJ(i,1),1e-13);
1655 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[2],f2->getIJ(i,2),1e-13);
1656 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[3],f2->getIJ(i,3),1e-13);
1657 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[4],f2->getIJ(i,4),1e-13);
1658 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[5],f2->getIJ(i,5),1e-13);
1659 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[6],f2->getIJ(i,6),1e-13);
1660 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[7],f2->getIJ(i,7),1e-13);
1661 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[8],f2->getIJ(i,8),1e-13);
1665 array=DataArrayDouble::New();
1666 array->alloc(mesh1->getNumberOfCells(),6);
1667 const double arr3[30]={7.8,8.9,9.1,10.2,23.4,34.5, 7.8,8.9,9.1,10.2,23.4,34.5, 7.8,8.9,9.1,10.2,23.4,34.5, 7.8,8.9,9.1,10.2,23.4,34.5, 7.8,8.9,9.1,10.2,23.4,34.5};
1668 std::copy(arr3,arr3+30,array->getPointer());
1669 f1->setArray(array);
1671 f1->checkConsistencyLight();
1674 f2->checkConsistencyLight();
1675 CPPUNIT_ASSERT_EQUAL(6,(int)f2->getNumberOfComponents());
1676 CPPUNIT_ASSERT_EQUAL(5,(int)f2->getNumberOfTuples());
1677 const double expected3[6]={-0.3617705098531818, -0.8678630828458127, -0.026843764174972983, 0.5539957431465833, 0.13133439560823013, -0.05301294502145887};
1678 for(int i=0;i<5;i++)
1680 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected3[0],f2->getIJ(i,0),1e-13);
1681 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected3[1],f2->getIJ(i,1),1e-13);
1682 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected3[2],f2->getIJ(i,2),1e-13);
1683 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected3[3],f2->getIJ(i,3),1e-13);
1684 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected3[4],f2->getIJ(i,4),1e-13);
1685 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected3[5],f2->getIJ(i,5),1e-13);
1689 array=DataArrayDouble::New();
1690 array->alloc(mesh1->getNumberOfCells(),4);
1691 const double arr2[20]={1.2,2.3,3.4,4.5, 1.2,2.3,3.4,4.5, 1.2,2.3,3.4,4.5, 1.2,2.3,3.4,4.5, 1.2,2.3,3.4,4.5};
1692 std::copy(arr2,arr2+20,array->getPointer());
1693 f1->setArray(array);
1695 f1->checkConsistencyLight();
1698 f2->checkConsistencyLight();
1699 CPPUNIT_ASSERT_EQUAL(4,(int)f2->getNumberOfComponents());
1700 CPPUNIT_ASSERT_EQUAL(5,(int)f2->getNumberOfTuples());
1701 const double expected2[4]={-1.8595041322314059, 0.9504132231404963, 1.404958677685951, -0.49586776859504156};
1702 for(int i=0;i<5;i++)
1704 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[0],f2->getIJ(i,0),1e-13);
1705 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[1],f2->getIJ(i,1),1e-13);
1706 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[2],f2->getIJ(i,2),1e-13);
1707 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[3],f2->getIJ(i,3),1e-13);
1715 void MEDCouplingBasicsTest2::testTrace1()
1717 MEDCouplingUMesh *mesh1=build2DTargetMesh_1();
1718 MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME);
1720 DataArrayDouble *array=DataArrayDouble::New();
1721 array->alloc(mesh1->getNumberOfCells(),9);
1722 const double arr1[45]={1.2,2.3,3.4,4.5,5.6,6.7,7.8,8.9,9.1, 1.2,2.3,3.4,4.5,5.6,6.7,7.8,8.9,9.1, 1.2,2.3,3.4,4.5,5.6,6.7,7.8,8.9,9.1, 1.2,2.3,3.4,4.5,5.6,6.7,7.8,8.9,9.1, 1.2,2.3,3.4,4.5,5.6,6.7,7.8,8.9,9.1};
1723 std::copy(arr1,arr1+45,array->getPointer());
1724 f1->setArray(array);
1726 f1->checkConsistencyLight();
1728 MEDCouplingFieldDouble *f2=f1->trace();
1729 f2->checkConsistencyLight();
1730 CPPUNIT_ASSERT_EQUAL(1,(int)f2->getNumberOfComponents());
1731 CPPUNIT_ASSERT_EQUAL(5,(int)f2->getNumberOfTuples());
1732 for(int i=0;i<5;i++)
1733 CPPUNIT_ASSERT_DOUBLES_EQUAL(15.9,f2->getIJ(i,0),1e-13);
1736 array=DataArrayDouble::New();
1737 array->alloc(mesh1->getNumberOfCells(),6);
1738 const double arr3[30]={7.8,8.9,9.1,10.2,23.4,34.5, 7.8,8.9,9.1,10.2,23.4,34.5, 7.8,8.9,9.1,10.2,23.4,34.5, 7.8,8.9,9.1,10.2,23.4,34.5, 7.8,8.9,9.1,10.2,23.4,34.5};
1739 std::copy(arr3,arr3+30,array->getPointer());
1740 f1->setArray(array);
1742 f1->checkConsistencyLight();
1745 f2->checkConsistencyLight();
1746 CPPUNIT_ASSERT_EQUAL(1,(int)f2->getNumberOfComponents());
1747 CPPUNIT_ASSERT_EQUAL(5,(int)f2->getNumberOfTuples());
1748 for(int i=0;i<5;i++)
1749 CPPUNIT_ASSERT_DOUBLES_EQUAL(25.8,f2->getIJ(i,0),1e-13);
1752 array=DataArrayDouble::New();
1753 array->alloc(mesh1->getNumberOfCells(),4);
1754 const double arr2[20]={1.2,2.3,3.4,4.5, 1.2,2.3,3.4,4.5, 1.2,2.3,3.4,4.5, 1.2,2.3,3.4,4.5, 1.2,2.3,3.4,4.5};
1755 std::copy(arr2,arr2+20,array->getPointer());
1756 f1->setArray(array);
1758 f1->checkConsistencyLight();
1761 f2->checkConsistencyLight();
1762 CPPUNIT_ASSERT_EQUAL(1,(int)f2->getNumberOfComponents());
1763 CPPUNIT_ASSERT_EQUAL(5,(int)f2->getNumberOfTuples());
1764 for(int i=0;i<5;i++)
1765 CPPUNIT_ASSERT_DOUBLES_EQUAL(5.7,f2->getIJ(i,0),1e-13);
1772 void MEDCouplingBasicsTest2::testDeviator1()
1774 MEDCouplingUMesh *mesh1=build2DTargetMesh_1();
1775 MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME);
1777 DataArrayDouble *array=DataArrayDouble::New();
1778 array->alloc(mesh1->getNumberOfCells(),6);
1779 const double arr1[30]={1.2,2.3,3.4,4.5,5.6,6.7, 1.2,2.3,3.4,4.5,5.6,6.7, 1.2,2.3,3.4,4.5,5.6,6.7, 1.2,2.3,3.4,4.5,5.6,6.7, 1.2,2.3,3.4,4.5,5.6,6.7};
1780 std::copy(arr1,arr1+30,array->getPointer());
1781 f1->setArray(array);
1783 f1->checkConsistencyLight();
1785 MEDCouplingFieldDouble *f2=f1->deviator();
1786 f2->checkConsistencyLight();
1787 CPPUNIT_ASSERT_EQUAL(6,(int)f2->getNumberOfComponents());
1788 CPPUNIT_ASSERT_EQUAL(5,(int)f2->getNumberOfTuples());
1789 const double expected1[6]={-1.1,0.,1.1,4.5,5.6,6.7};
1790 for(int i=0;i<5;i++)
1792 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[0],f2->getIJ(i,0),1e-13);
1793 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[1],f2->getIJ(i,1),1e-13);
1794 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[2],f2->getIJ(i,2),1e-13);
1795 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[3],f2->getIJ(i,3),1e-13);
1796 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[4],f2->getIJ(i,4),1e-13);
1797 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[5],f2->getIJ(i,5),1e-13);
1805 void MEDCouplingBasicsTest2::testMagnitude1()
1807 MEDCouplingUMesh *mesh1=build2DTargetMesh_1();
1808 MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME);
1810 DataArrayDouble *array=DataArrayDouble::New();
1811 array->alloc(mesh1->getNumberOfCells(),5);
1812 const double arr1[25]={1.2,2.3,3.4,4.5,5.6, 1.2,2.3,3.4,4.5,5.6, 1.2,2.3,3.4,4.5,5.6, 1.2,2.3,3.4,4.5,5.6, 1.2,2.3,3.4,4.5,5.6};
1813 std::copy(arr1,arr1+25,array->getPointer());
1814 f1->setArray(array);
1816 f1->checkConsistencyLight();
1818 MEDCouplingFieldDouble *f2=f1->magnitude();
1819 f2->checkConsistencyLight();
1820 CPPUNIT_ASSERT_EQUAL(1,(int)f2->getNumberOfComponents());
1821 CPPUNIT_ASSERT_EQUAL(5,(int)f2->getNumberOfTuples());
1822 for(int i=0;i<5;i++)
1823 CPPUNIT_ASSERT_DOUBLES_EQUAL(8.3606219864313918,f2->getIJ(i,0),1e-13);
1830 void MEDCouplingBasicsTest2::testMaxPerTuple1()
1832 MEDCouplingUMesh *mesh1=build2DTargetMesh_1();
1833 MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME);
1835 DataArrayDouble *array=DataArrayDouble::New();
1836 array->alloc(mesh1->getNumberOfCells(),5);
1837 const double arr1[25]={1.2,2.3,3.4,4.5,5.6, 1.2,3.4,4.5,5.6,2.3, 3.4,4.5,5.6,1.2,2.3, 5.6,1.2,2.3,3.4,4.5, 4.5,5.6,1.2,2.3,3.4};
1838 std::copy(arr1,arr1+25,array->getPointer());
1839 f1->setArray(array);
1841 f1->checkConsistencyLight();
1843 MEDCouplingFieldDouble *f2=f1->maxPerTuple();
1844 f2->checkConsistencyLight();
1845 CPPUNIT_ASSERT_EQUAL(1,(int)f2->getNumberOfComponents());
1846 CPPUNIT_ASSERT_EQUAL(5,(int)f2->getNumberOfTuples());
1847 for(int i=0;i<5;i++)
1848 CPPUNIT_ASSERT_DOUBLES_EQUAL(5.6,f2->getIJ(i,0),1e-13);
1851 DataArrayInt *d2I=0;
1852 DataArrayDouble *d2=array->maxPerTupleWithCompoId(d2I);
1853 CPPUNIT_ASSERT_EQUAL(1,(int)d2->getNumberOfComponents());
1854 CPPUNIT_ASSERT_EQUAL(5,(int)d2->getNumberOfTuples());
1855 const int expected2[5]={4,3,2,0,1};
1856 for(int i=0;i<5;i++)
1858 CPPUNIT_ASSERT_DOUBLES_EQUAL(5.6,d2->getIJ(i,0),1e-13);
1859 CPPUNIT_ASSERT_EQUAL(expected2[i],d2I->getIJ(i,0));
1861 d2->decrRef(); d2I->decrRef();
1867 void MEDCouplingBasicsTest2::testChangeNbOfComponents()
1869 MEDCouplingUMesh *mesh1=build2DTargetMesh_1();
1870 MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME);
1872 DataArrayDouble *array=DataArrayDouble::New();
1873 array->alloc(mesh1->getNumberOfCells(),5);
1874 const double arr1[25]={1.2,2.3,3.4,4.5,5.6, 1.2,3.4,4.5,5.6,2.3, 3.4,4.5,5.6,1.2,2.3, 5.6,1.2,2.3,3.4,4.5, 4.5,5.6,1.2,2.3,3.4};
1875 std::copy(arr1,arr1+25,array->getPointer());
1876 f1->setArray(array);
1878 f1->checkConsistencyLight();
1880 f1->changeNbOfComponents(3,7.77);
1881 f1->checkConsistencyLight();
1882 CPPUNIT_ASSERT_EQUAL(3,(int)f1->getNumberOfComponents());
1883 CPPUNIT_ASSERT_EQUAL(5,(int)f1->getNumberOfTuples());
1884 const double expected1[15]={1.2,2.3,3.4, 1.2,3.4,4.5, 3.4,4.5,5.6, 5.6,1.2,2.3, 4.5,5.6,1.2};
1885 for(int i=0;i<15;i++)
1886 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],f1->getIJ(0,i),1e-13);
1887 f1->changeNbOfComponents(4,7.77);
1888 f1->checkConsistencyLight();
1889 CPPUNIT_ASSERT_EQUAL(4,(int)f1->getNumberOfComponents());
1890 CPPUNIT_ASSERT_EQUAL(5,(int)f1->getNumberOfTuples());
1891 const double expected2[20]={1.2,2.3,3.4,7.77, 1.2,3.4,4.5,7.77, 3.4,4.5,5.6,7.77, 5.6,1.2,2.3,7.77, 4.5,5.6,1.2,7.77};
1892 for(int i=0;i<20;i++)
1893 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],f1->getIJ(0,i),1e-13);
1899 void MEDCouplingBasicsTest2::testSortPerTuple1()
1901 MEDCouplingUMesh *mesh1=build2DTargetMesh_1();
1902 MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME);
1904 DataArrayDouble *array=DataArrayDouble::New();
1905 array->alloc(mesh1->getNumberOfCells(),5);
1906 const double arr1[25]={1.2,2.3,3.4,4.5,5.6, 1.2,3.4,4.5,5.6,2.3, 3.4,4.5,5.6,1.2,2.3, 5.6,1.2,2.3,3.4,4.5, 4.5,5.6,1.2,2.3,3.4};
1907 std::copy(arr1,arr1+25,array->getPointer());
1908 f1->setArray(array);
1910 f1->checkConsistencyLight();
1912 f1->sortPerTuple(true);
1913 f1->checkConsistencyLight();
1914 CPPUNIT_ASSERT_EQUAL(5,(int)f1->getNumberOfComponents());
1915 CPPUNIT_ASSERT_EQUAL(5,(int)f1->getNumberOfTuples());
1916 for(int i=0;i<5;i++)
1918 CPPUNIT_ASSERT_DOUBLES_EQUAL(arr1[0],f1->getIJ(i,0),1e-13);
1919 CPPUNIT_ASSERT_DOUBLES_EQUAL(arr1[1],f1->getIJ(i,1),1e-13);
1920 CPPUNIT_ASSERT_DOUBLES_EQUAL(arr1[2],f1->getIJ(i,2),1e-13);
1921 CPPUNIT_ASSERT_DOUBLES_EQUAL(arr1[3],f1->getIJ(i,3),1e-13);
1922 CPPUNIT_ASSERT_DOUBLES_EQUAL(arr1[4],f1->getIJ(i,4),1e-13);
1925 f1->sortPerTuple(false);
1926 f1->checkConsistencyLight();
1927 CPPUNIT_ASSERT_EQUAL(5,(int)f1->getNumberOfComponents());
1928 CPPUNIT_ASSERT_EQUAL(5,(int)f1->getNumberOfTuples());
1929 for(int i=0;i<5;i++)
1931 CPPUNIT_ASSERT_DOUBLES_EQUAL(arr1[4],f1->getIJ(i,0),1e-13);
1932 CPPUNIT_ASSERT_DOUBLES_EQUAL(arr1[3],f1->getIJ(i,1),1e-13);
1933 CPPUNIT_ASSERT_DOUBLES_EQUAL(arr1[2],f1->getIJ(i,2),1e-13);
1934 CPPUNIT_ASSERT_DOUBLES_EQUAL(arr1[1],f1->getIJ(i,3),1e-13);
1935 CPPUNIT_ASSERT_DOUBLES_EQUAL(arr1[0],f1->getIJ(i,4),1e-13);
1942 void MEDCouplingBasicsTest2::testIsEqualWithoutConsideringStr1()
1944 MEDCouplingUMesh *mesh1=build2DTargetMesh_1();
1945 MEDCouplingUMesh *mesh2=build2DTargetMesh_1();
1946 DataArrayInt *da1,*da2;
1948 CPPUNIT_ASSERT(mesh1->isEqual(mesh2,1e-12));
1949 CPPUNIT_ASSERT(mesh1->isEqualWithoutConsideringStr(mesh2,1e-12));
1950 mesh2->setName("rr");
1951 CPPUNIT_ASSERT(!mesh1->isEqual(mesh2,1e-12));
1952 CPPUNIT_ASSERT(mesh1->isEqualWithoutConsideringStr(mesh2,1e-12));
1953 mesh1->checkDeepEquivalWith(mesh2,2,1e-12,da1,da2);
1954 CPPUNIT_ASSERT_THROW(mesh1->checkGeoEquivalWith(mesh2,0,1e-12,da1,da2),INTERP_KERNEL::Exception);
1956 CPPUNIT_ASSERT(mesh1->isEqual(mesh2,1e-12));
1957 CPPUNIT_ASSERT(mesh1->isEqualWithoutConsideringStr(mesh2,1e-12));
1958 mesh2->getCoords()->setInfoOnComponent(0,"tty");
1959 CPPUNIT_ASSERT(!mesh1->isEqual(mesh2,1e-12));
1960 CPPUNIT_ASSERT(mesh1->isEqualWithoutConsideringStr(mesh2,1e-12));
1961 mesh2->getCoords()->setInfoOnComponent(0,"");
1962 CPPUNIT_ASSERT(mesh1->isEqual(mesh2,1e-12));
1963 CPPUNIT_ASSERT(mesh1->isEqualWithoutConsideringStr(mesh2,1e-12));
1964 mesh2->getCoords()->setInfoOnComponent(1,"tty");
1965 CPPUNIT_ASSERT(!mesh1->isEqual(mesh2,1e-12));
1966 CPPUNIT_ASSERT(mesh1->isEqualWithoutConsideringStr(mesh2,1e-12));
1967 mesh2->getCoords()->setInfoOnComponent(1,"");
1968 CPPUNIT_ASSERT(mesh1->isEqual(mesh2,1e-12));
1969 CPPUNIT_ASSERT(mesh1->isEqualWithoutConsideringStr(mesh2,1e-12));
1970 double tmp=mesh2->getCoords()->getIJ(0,3);
1971 mesh2->getCoords()->setIJ(0,3,9999.);
1972 CPPUNIT_ASSERT(!mesh1->isEqual(mesh2,1e-12));
1973 CPPUNIT_ASSERT(!mesh1->isEqualWithoutConsideringStr(mesh2,1e-12));
1974 mesh2->getCoords()->setIJ(0,3,tmp);
1975 CPPUNIT_ASSERT(mesh1->isEqual(mesh2,1e-12));
1976 CPPUNIT_ASSERT(mesh1->isEqualWithoutConsideringStr(mesh2,1e-12));
1977 int tmp2=mesh2->getNodalConnectivity()->getIJ(0,4);
1978 mesh2->getNodalConnectivity()->setIJ(0,4,0);
1979 CPPUNIT_ASSERT(!mesh1->isEqual(mesh2,1e-12));
1980 CPPUNIT_ASSERT(!mesh1->isEqualWithoutConsideringStr(mesh2,1e-12));
1981 mesh2->getNodalConnectivity()->setIJ(0,4,tmp2);
1982 CPPUNIT_ASSERT(mesh1->isEqual(mesh2,1e-12));
1983 CPPUNIT_ASSERT(mesh1->isEqualWithoutConsideringStr(mesh2,1e-12));
1985 MEDCouplingFieldDouble *f1=mesh1->getMeasureField(true);
1986 MEDCouplingFieldDouble *f2=mesh2->getMeasureField(true);
1987 CPPUNIT_ASSERT(f1->isEqual(f2,1e-12,1e-12));
1988 CPPUNIT_ASSERT(f1->isEqualWithoutConsideringStr(f2,1e-12,1e-12));
1989 f2->setName("ftest");
1990 CPPUNIT_ASSERT(!f1->isEqual(f2,1e-12,1e-12));
1991 CPPUNIT_ASSERT(f1->isEqualWithoutConsideringStr(f2,1e-12,1e-12));
1992 f1->setName("ftest");
1993 CPPUNIT_ASSERT(f1->isEqual(f2,1e-12,1e-12));
1994 CPPUNIT_ASSERT(f1->isEqualWithoutConsideringStr(f2,1e-12,1e-12));
1996 f2->getArray()->setInfoOnComponent(0,"eee");
1997 CPPUNIT_ASSERT(!f1->isEqual(f2,1e-12,1e-12));
1998 CPPUNIT_ASSERT(f1->isEqualWithoutConsideringStr(f2,1e-12,1e-12));
1999 f2->getArray()->setInfoOnComponent(0,"");
2000 CPPUNIT_ASSERT(f1->isEqual(f2,1e-12,1e-12));
2001 CPPUNIT_ASSERT(f1->isEqualWithoutConsideringStr(f2,1e-12,1e-12));
2003 f2->getArray()->setIJ(1,0,0.123);
2004 CPPUNIT_ASSERT(!f1->isEqual(f2,1e-12,1e-12));
2005 CPPUNIT_ASSERT(!f1->isEqualWithoutConsideringStr(f2,1e-12,1e-12));
2006 f2->getArray()->setIJ(1,0,0.125);
2007 CPPUNIT_ASSERT(f1->isEqual(f2,1e-12,1e-12));
2008 CPPUNIT_ASSERT(f1->isEqualWithoutConsideringStr(f2,1e-12,1e-12));
2017 void MEDCouplingBasicsTest2::testGetNodeIdsOfCell1()
2019 MEDCouplingUMesh *mesh1=build2DTargetMesh_1();
2020 std::vector<int> nodeIds;
2021 mesh1->getNodeIdsOfCell(1,nodeIds);
2022 CPPUNIT_ASSERT_EQUAL(3,(int)nodeIds.size());
2023 CPPUNIT_ASSERT_EQUAL(1,nodeIds[0]);
2024 CPPUNIT_ASSERT_EQUAL(4,nodeIds[1]);
2025 CPPUNIT_ASSERT_EQUAL(2,nodeIds[2]);
2026 std::vector<double> coords;
2027 mesh1->getCoordinatesOfNode(4,coords);
2028 CPPUNIT_ASSERT_EQUAL(2,(int)coords.size());
2029 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.2,coords[0],1e-13);
2030 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.2,coords[1],1e-13);
2034 void MEDCouplingBasicsTest2::testGetEdgeRatioField1()
2036 MEDCouplingUMesh *m1=build2DTargetMesh_1();
2037 m1->setTime(3.4,5,6); m1->setTimeUnit("us");
2039 MEDCouplingFieldDouble *f1=m1->getEdgeRatioField();
2040 CPPUNIT_ASSERT_DOUBLES_EQUAL(3.4,f1->getTime(a,b),1.e-14);
2041 CPPUNIT_ASSERT_EQUAL(5,a); CPPUNIT_ASSERT_EQUAL(6,b);
2042 CPPUNIT_ASSERT_EQUAL(std::string(f1->getTimeUnit()),std::string("us"));
2043 CPPUNIT_ASSERT_EQUAL((int)m1->getNumberOfCells(),(int)f1->getNumberOfTuples());
2044 CPPUNIT_ASSERT_EQUAL(5,(int)f1->getNumberOfTuples());
2045 CPPUNIT_ASSERT_EQUAL(1,(int)f1->getNumberOfComponents());
2046 const double expected1[5]={1.,1.4142135623730951, 1.4142135623730951,1.,1.};
2047 for(int i=0;i<5;i++)
2048 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],f1->getIJ(i,0),1e-14);
2052 m1=build3DSurfTargetMesh_1();
2053 f1=m1->getEdgeRatioField();
2054 CPPUNIT_ASSERT_EQUAL((int)m1->getNumberOfCells(),(int)f1->getNumberOfTuples());
2055 CPPUNIT_ASSERT_EQUAL(5,(int)f1->getNumberOfTuples());
2056 CPPUNIT_ASSERT_EQUAL(1,(int)f1->getNumberOfComponents());
2057 const double expected2[5]={1.4142135623730951, 1.7320508075688772, 1.7320508075688772, 1.4142135623730951, 1.4142135623730951};
2058 for(int i=0;i<5;i++)
2059 CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],f1->getIJ(i,0),1e-14);
2064 void MEDCouplingBasicsTest2::testFillFromAnalytic3()
2066 MEDCouplingUMesh *m=build2DTargetMesh_1();
2067 MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,ONE_TIME);
2068 CPPUNIT_ASSERT_THROW(f1->fillFromAnalytic(1,"y+x"),INTERP_KERNEL::Exception);
2070 f1->setName("myField");
2071 f1->fillFromAnalytic(1,"y+x");
2072 f1->checkConsistencyLight();
2073 CPPUNIT_ASSERT(std::string(f1->getName())=="myField");
2074 CPPUNIT_ASSERT(f1->getTypeOfField()==ON_CELLS);
2075 CPPUNIT_ASSERT(f1->getTimeDiscretization()==ONE_TIME);
2076 CPPUNIT_ASSERT_EQUAL(1,(int)f1->getNumberOfComponents());
2077 CPPUNIT_ASSERT_EQUAL(5,(int)f1->getNumberOfTuples());
2078 double values1[5]={-0.1,0.23333333333333336,0.56666666666666665,0.4,0.9};
2079 const double *tmp=f1->getArray()->getConstPointer();
2080 std::transform(tmp,tmp+5,values1,values1,std::minus<double>());
2081 std::transform(values1,values1+5,values1,std::ptr_fun<double,double>(fabs));
2082 double max=*std::max_element(values1,values1+5);
2083 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,max,1.e-12);
2086 f1=MEDCouplingFieldDouble::New(ON_NODES,CONST_ON_TIME_INTERVAL);
2088 f1->setEndTime(1.2,3,4);
2089 f1->fillFromAnalytic(1,"y+2*x");
2090 f1->checkConsistencyLight();
2091 CPPUNIT_ASSERT(f1->getTypeOfField()==ON_NODES);
2092 CPPUNIT_ASSERT(f1->getTimeDiscretization()==CONST_ON_TIME_INTERVAL);
2093 CPPUNIT_ASSERT_EQUAL(1,(int)f1->getNumberOfComponents());
2094 CPPUNIT_ASSERT_EQUAL(9,(int)f1->getNumberOfTuples());
2095 double values2[9]={-0.9,0.1,1.1,-0.4,0.6,1.6,0.1,1.1,2.1};
2096 tmp=f1->getArray()->getConstPointer();
2097 std::transform(tmp,tmp+9,values2,values2,std::minus<double>());
2098 std::transform(values2,values2+9,values2,std::ptr_fun<double,double>(fabs));
2099 max=*std::max_element(values2,values2+9);
2100 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,max,1.e-12);
2102 f1=MEDCouplingFieldDouble::New(ON_NODES,LINEAR_TIME);
2104 f1->setEndTime(1.2,3,4);
2105 f1->fillFromAnalytic(1,"2.*x+y");
2106 f1->checkConsistencyLight();
2107 CPPUNIT_ASSERT(f1->getTypeOfField()==ON_NODES);
2108 CPPUNIT_ASSERT(f1->getTimeDiscretization()==LINEAR_TIME);
2109 CPPUNIT_ASSERT_EQUAL(1,(int)f1->getNumberOfComponents());
2110 CPPUNIT_ASSERT_EQUAL(9,(int)f1->getNumberOfTuples());
2111 tmp=f1->getArray()->getConstPointer();
2112 double values2Bis[9]={-0.9,0.1,1.1,-0.4,0.6,1.6,0.1,1.1,2.1};
2113 double values2BisBis[9];
2114 std::transform(tmp,tmp+9,values2Bis,values2BisBis,std::minus<double>());
2115 std::transform(values2,values2+9,values2BisBis,std::ptr_fun<double,double>(fabs));
2116 max=*std::max_element(values2BisBis,values2BisBis+9);
2117 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,max,1.e-12);
2118 tmp=f1->getEndArray()->getConstPointer();
2119 std::transform(tmp,tmp+9,values2Bis,values2BisBis,std::minus<double>());
2120 std::transform(values2,values2+9,values2BisBis,std::ptr_fun<double,double>(fabs));
2121 max=*std::max_element(values2BisBis,values2BisBis+9);
2122 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,max,1.e-12);
2125 f1=MEDCouplingFieldDouble::New(ON_NODES,NO_TIME);
2127 f1->fillFromAnalytic(2,"(x+y)*IVec+2*(x+y)*JVec");
2128 f1->checkConsistencyLight();
2129 CPPUNIT_ASSERT(f1->getTypeOfField()==ON_NODES);
2130 CPPUNIT_ASSERT(f1->getTimeDiscretization()==NO_TIME);
2131 CPPUNIT_ASSERT_EQUAL(2,(int)f1->getNumberOfComponents());
2132 CPPUNIT_ASSERT_EQUAL(9,(int)f1->getNumberOfTuples());
2133 double values3[18]={-0.6,-1.2,-0.1,-0.2,0.4,0.8,-0.1,-0.2,0.4,0.8,0.9,1.8,0.4,0.8,0.9,1.8,1.4,2.8};
2134 tmp=f1->getArray()->getConstPointer();
2135 std::transform(tmp,tmp+18,values3,values3,std::minus<double>());
2136 std::transform(values3,values3+18,values3,std::ptr_fun<double,double>(fabs));
2137 max=*std::max_element(values3,values3+18);
2138 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,max,1.e-12);
2140 f1->accumulate(values4);
2141 CPPUNIT_ASSERT_DOUBLES_EQUAL(3.6,values4[0],1.e-12);
2142 CPPUNIT_ASSERT_DOUBLES_EQUAL(7.2,values4[1],1.e-12);
2143 f1->integral(true,values4);
2144 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.5,values4[0],1.e-12);
2145 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,values4[1],1.e-12);
2148 f1=MEDCouplingFieldDouble::New(ON_NODES,NO_TIME);
2150 CPPUNIT_ASSERT_THROW(f1->fillFromAnalytic(1,"1./(x-0.2)"),INTERP_KERNEL::Exception);
2156 void MEDCouplingBasicsTest2::testFieldDoubleOpEqual1()
2158 MEDCouplingUMesh *m=build2DTargetMesh_1();
2159 MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,ONE_TIME);
2160 CPPUNIT_ASSERT_THROW((*f1)=0.07,INTERP_KERNEL::Exception);
2163 f1->checkConsistencyLight();
2164 CPPUNIT_ASSERT_EQUAL(1,(int)f1->getNumberOfComponents());
2165 CPPUNIT_ASSERT_EQUAL(5,(int)f1->getNumberOfTuples());
2166 for(int i=0;i<5;i++)
2167 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.07,f1->getIJ(i,0),1e-16);
2169 f1->checkConsistencyLight();
2170 CPPUNIT_ASSERT_EQUAL(1,(int)f1->getNumberOfComponents());
2171 CPPUNIT_ASSERT_EQUAL(5,(int)f1->getNumberOfTuples());
2172 for(int i=0;i<5;i++)
2173 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.09,f1->getIJ(i,0),1e-16);
2176 f1=MEDCouplingFieldDouble::New(ON_NODES,LINEAR_TIME);
2177 f1->setEndTime(4.5,2,3);
2180 f1->checkConsistencyLight();
2181 CPPUNIT_ASSERT_EQUAL(1,(int)f1->getNumberOfComponents());
2182 CPPUNIT_ASSERT_EQUAL(9,(int)f1->getNumberOfTuples());
2183 for(int i=0;i<9;i++)
2184 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.08,f1->getIJ(i,0),1e-16);
2185 CPPUNIT_ASSERT_EQUAL(1,(int)f1->getEndArray()->getNumberOfComponents());
2186 CPPUNIT_ASSERT_EQUAL(9,(int)f1->getEndArray()->getNumberOfTuples());
2187 for(int i=0;i<9;i++)
2188 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.08,f1->getEndArray()->getIJ(i,0),1e-16);
2194 void MEDCouplingBasicsTest2::testAreaBary3D2()
2196 const double coordsForHexa8[24]={
2197 -75.45749305371, 180.95495078401, 39.515472018008,
2198 -9.755591679144, 23.394927935279, 5.108794294848,
2199 14.337630157832, 61.705351002702, 160.42422501908,
2200 -27.273893776752, 167.567731083961, 192.830034145464,
2202 99.857193154796,264.499264735586,-8.287335493412,
2203 144.939882761126,156.38626563134,-31.896173894226,
2204 161.34096835726,182.4654895809,73.832387065572,
2205 132.680430393685,255.37973247196,96.15235602819
2207 const double volHexa8=3258520.29637466;
2208 const double baryHexa8[3]={43.925705821778, 155.31893955289, 65.874418109644};
2210 const double coordsForPenta6[18]={
2211 -68.199829618726,178.938498373416,62.608505919588,
2212 8.461744647847,76.653979804423,165.00018874933,
2213 -27.273893776752,167.567731083961,192.830034145464,
2215 106.586501038965,262.629609408327,13.124533008813,
2216 155.465082847275,197.414118382622,78.408350795821,
2217 132.680430393685,255.37973247196,96.15235602819
2219 const double volPenta6=944849.868507338;
2220 const double baryPenta6[3]={39.631002313543,182.692711783428,106.98540473964};
2222 const double coordsForPyra5[15]={
2223 132.680430393685,255.37973247196,96.15235602819,
2224 -27.273893776752,167.567731083961,192.830034145464,
2225 8.461744647847,76.653979804423,165.00018874933,
2226 155.465082847275,197.414118382622,78.408350795821,
2228 -68.199829618726,178.938498373416,62.608505919588
2230 const double volPyra5=756943.92980254;
2231 const double baryPyra5[3]={29.204294116618,172.540129749156,118.01035951483};
2232 MEDCouplingUMesh *mesh=MEDCouplingUMesh::New("Bary3D2",3);
2233 DataArrayDouble *coo=DataArrayDouble::New();
2235 double *tmp=std::copy(coordsForHexa8,coordsForHexa8+24,coo->getPointer());
2236 tmp=std::copy(coordsForPenta6,coordsForPenta6+18,tmp);
2237 std::copy(coordsForPyra5,coordsForPyra5+15,tmp);
2238 mesh->setCoords(coo);
2241 int tmpConn[8]={0,1,2,3,4,5,6,7};
2242 mesh->allocateCells(3);
2243 mesh->insertNextCell(INTERP_KERNEL::NORM_HEXA8,8,tmpConn);
2244 std::transform(tmpConn,tmpConn+8,tmpConn,std::bind2nd(std::plus<int>(),8));
2245 mesh->insertNextCell(INTERP_KERNEL::NORM_PENTA6,6,tmpConn);
2246 std::transform(tmpConn,tmpConn+8,tmpConn,std::bind2nd(std::plus<int>(),6));
2247 mesh->insertNextCell(INTERP_KERNEL::NORM_PYRA5,5,tmpConn);
2248 mesh->finishInsertingCells();
2249 mesh->checkConsistencyLight();
2252 DataArrayInt *da=mesh->mergeNodes(1e-7,isMerged,newNebOfNodes);
2254 CPPUNIT_ASSERT_EQUAL(12,newNebOfNodes);
2255 MEDCouplingFieldDouble *vols=mesh->getMeasureField(true);
2256 CPPUNIT_ASSERT_EQUAL(3,(int)vols->getNumberOfTuples());
2257 CPPUNIT_ASSERT_EQUAL(1,(int)vols->getNumberOfComponents());
2258 CPPUNIT_ASSERT_DOUBLES_EQUAL(volHexa8,vols->getIJ(0,0),1e-6);
2259 CPPUNIT_ASSERT_DOUBLES_EQUAL(volPenta6,vols->getIJ(1,0),1e-7);
2260 CPPUNIT_ASSERT_DOUBLES_EQUAL(volPyra5,vols->getIJ(2,0),1e-7);
2262 DataArrayDouble *bary=mesh->computeCellCenterOfMass();
2263 CPPUNIT_ASSERT_EQUAL(3,(int)bary->getNumberOfTuples());
2264 CPPUNIT_ASSERT_EQUAL(3,(int)bary->getNumberOfComponents());
2265 CPPUNIT_ASSERT_DOUBLES_EQUAL(baryHexa8[0],bary->getIJ(0,0),1e-11);
2266 CPPUNIT_ASSERT_DOUBLES_EQUAL(baryHexa8[1],bary->getIJ(0,1),1e-11);
2267 CPPUNIT_ASSERT_DOUBLES_EQUAL(baryHexa8[2],bary->getIJ(0,2),1e-11);
2268 CPPUNIT_ASSERT_DOUBLES_EQUAL(baryPenta6[0],bary->getIJ(1,0),1e-11);
2269 CPPUNIT_ASSERT_DOUBLES_EQUAL(baryPenta6[1],bary->getIJ(1,1),1e-11);
2270 CPPUNIT_ASSERT_DOUBLES_EQUAL(baryPenta6[2],bary->getIJ(1,2),1e-11);
2271 CPPUNIT_ASSERT_DOUBLES_EQUAL(baryPyra5[0],bary->getIJ(2,0),1e-11);
2272 CPPUNIT_ASSERT_DOUBLES_EQUAL(baryPyra5[1],bary->getIJ(2,1),1e-11);
2273 CPPUNIT_ASSERT_DOUBLES_EQUAL(baryPyra5[2],bary->getIJ(2,2),1e-11);