Salome HOME
Update copyrights 2014.
[modules/med.git] / src / MEDCoupling / Test / MEDCouplingBasicsTest3.cxx
1 // Copyright (C) 2007-2014  CEA/DEN, EDF R&D
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19 // Author : Anthony Geay (CEA/DEN)
20
21 #include "MEDCouplingBasicsTest3.hxx"
22 #include "MEDCouplingUMesh.hxx"
23 #include "MEDCouplingCMesh.hxx"
24 #include "MEDCouplingExtrudedMesh.hxx"
25 #include "MEDCouplingFieldDouble.hxx"
26 #include "MEDCouplingMemArray.hxx"
27 #include "MEDCouplingGaussLocalization.hxx"
28
29 #include <cmath>
30 #include <functional>
31 #include <iterator>
32
33 using namespace ParaMEDMEM;
34
35 void MEDCouplingBasicsTest3::testGetMeasureFieldCMesh1()
36 {
37   MEDCouplingCMesh *m=MEDCouplingCMesh::New();
38   DataArrayDouble *da=DataArrayDouble::New();
39   const double discX[4]={2.3,3.4,5.8,10.2};
40   const double discY[3]={12.3,23.4,45.8};
41   const double discZ[5]={-0.7,1.2,1.25,2.13,2.67};
42   da->alloc(4,1);
43   std::copy(discX,discX+4,da->getPointer());
44   m->setCoordsAt(0,da);
45   da->decrRef();
46   m->checkCoherency();
47   CPPUNIT_ASSERT_EQUAL(4,m->getNumberOfNodes());
48   CPPUNIT_ASSERT_EQUAL(3,m->getNumberOfCells());
49   CPPUNIT_ASSERT_EQUAL(1,m->getSpaceDimension());
50   MEDCouplingFieldDouble *f=m->getMeasureField(true);
51   CPPUNIT_ASSERT_EQUAL(3,f->getNumberOfTuples());
52   CPPUNIT_ASSERT_EQUAL(1,f->getNumberOfComponents());
53   const double expected1[3]={1.1,2.4,4.4};
54   for(int i=0;i<3;i++)
55     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],f->getIJ(i,0),1e-12);
56   f->decrRef();
57   DataArrayDouble *coords=m->getCoordinatesAndOwner();
58   CPPUNIT_ASSERT_EQUAL(4,coords->getNumberOfTuples());
59   CPPUNIT_ASSERT_EQUAL(1,coords->getNumberOfComponents());
60   for(int i=0;i<4;i++)
61     CPPUNIT_ASSERT_DOUBLES_EQUAL(discX[i],coords->getIJ(i,0),1e-12);
62   coords->decrRef();
63   coords=m->getBarycenterAndOwner();
64   CPPUNIT_ASSERT_EQUAL(3,coords->getNumberOfTuples());
65   CPPUNIT_ASSERT_EQUAL(1,coords->getNumberOfComponents());
66   const double expected1_3[3]={2.85,4.6,8.};
67   for(int i=0;i<3;i++)
68     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1_3[i],coords->getIJ(i,0),1e-12);
69   coords->decrRef();
70   //
71   da=DataArrayDouble::New();
72   da->alloc(3,1);
73   std::copy(discY,discY+3,da->getPointer());
74   m->setCoordsAt(1,da);
75   da->decrRef();
76   m->checkCoherency();
77   CPPUNIT_ASSERT_EQUAL(12,m->getNumberOfNodes());
78   CPPUNIT_ASSERT_EQUAL(6,m->getNumberOfCells());
79   CPPUNIT_ASSERT_EQUAL(2,m->getSpaceDimension());
80   f=m->getMeasureField(true);
81   CPPUNIT_ASSERT_EQUAL(6,f->getNumberOfTuples());
82   CPPUNIT_ASSERT_EQUAL(1,f->getNumberOfComponents());
83   const double expected2[6]={12.21,26.64,48.84,24.64,53.76,98.56};
84   for(int i=0;i<6;i++)
85     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],f->getIJ(i,0),1e-12);
86   f->decrRef();
87   coords=m->getCoordinatesAndOwner();
88   CPPUNIT_ASSERT_EQUAL(12,coords->getNumberOfTuples());
89   CPPUNIT_ASSERT_EQUAL(2,coords->getNumberOfComponents());
90   const double expected2_2[24]={2.3,12.3,3.4,12.3,5.8,12.3,10.2,12.3, 2.3,23.4,3.4,23.4,5.8,23.4,10.2,23.4, 2.3,45.8,3.4,45.8,5.8,45.8,10.2,45.8};
91   for(int i=0;i<24;i++)
92     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2_2[i],coords->getIJ(0,i),1e-12);
93   coords->decrRef();
94   coords=m->getBarycenterAndOwner();
95   CPPUNIT_ASSERT_EQUAL(6,coords->getNumberOfTuples());
96   CPPUNIT_ASSERT_EQUAL(2,coords->getNumberOfComponents());
97   const double expected2_3[12]={2.85,17.85,4.6,17.85,8.,17.85, 2.85,34.6,4.6,34.6,8.,34.6};
98   for(int i=0;i<12;i++)
99     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2_3[i],coords->getIJ(0,i),1e-12);
100   coords->decrRef();
101   //
102   da=DataArrayDouble::New();
103   da->alloc(5,1);
104   std::copy(discZ,discZ+5,da->getPointer());
105   m->setCoordsAt(2,da);
106   da->decrRef();
107   m->checkCoherency();
108   CPPUNIT_ASSERT_EQUAL(60,m->getNumberOfNodes());
109   CPPUNIT_ASSERT_EQUAL(24,m->getNumberOfCells());
110   CPPUNIT_ASSERT_EQUAL(3,m->getSpaceDimension());
111   f=m->getMeasureField(true);
112   CPPUNIT_ASSERT_EQUAL(24,f->getNumberOfTuples());
113   CPPUNIT_ASSERT_EQUAL(1,f->getNumberOfComponents());
114   const double expected3[24]={23.199, 50.616, 92.796, 46.816, 102.144, 187.264, 0.6105, 1.332, 2.442, 1.232, 2.688, 4.928, 10.7448, 23.4432, 42.9792, 21.6832, 47.3088, 86.7328, 6.5934, 14.3856, 26.3736, 13.3056, 29.0304, 53.2224};
115   for(int i=0;i<24;i++)
116     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected3[i],f->getIJ(i,0),1e-12);
117   f->decrRef();
118   coords=m->getCoordinatesAndOwner();
119   CPPUNIT_ASSERT_EQUAL(60,coords->getNumberOfTuples());
120   CPPUNIT_ASSERT_EQUAL(3,coords->getNumberOfComponents());
121   const double expected3_2[180]={
122     2.3,12.3,-0.7, 3.4,12.3,-0.7, 5.8,12.3,-0.7, 10.2,12.3,-0.7, 2.3,23.4,-0.7, 3.4,23.4,-0.7, 5.8,23.4,-0.7, 10.2,23.4,-0.7, 2.3,45.8,-0.7, 3.4,45.8,-0.7, 5.8,45.8,-0.7, 10.2,45.8,-0.7,
123     2.3,12.3,1.2, 3.4,12.3,1.2, 5.8,12.3,1.2, 10.2,12.3,1.2, 2.3,23.4,1.2, 3.4,23.4,1.2, 5.8,23.4,1.2, 10.2,23.4,1.2, 2.3,45.8,1.2, 3.4,45.8,1.2, 5.8,45.8,1.2, 10.2,45.8,1.2,
124     2.3,12.3,1.25, 3.4,12.3,1.25, 5.8,12.3,1.25, 10.2,12.3,1.25, 2.3,23.4,1.25, 3.4,23.4,1.25, 5.8,23.4,1.25, 10.2,23.4,1.25, 2.3,45.8,1.25, 3.4,45.8,1.25, 5.8,45.8,1.25, 10.2,45.8,1.25,
125     2.3,12.3,2.13, 3.4,12.3,2.13, 5.8,12.3,2.13, 10.2,12.3,2.13, 2.3,23.4,2.13, 3.4,23.4,2.13, 5.8,23.4,2.13, 10.2,23.4,2.13, 2.3,45.8,2.13, 3.4,45.8,2.13, 5.8,45.8,2.13, 10.2,45.8,2.13,
126     2.3,12.3,2.67, 3.4,12.3,2.67, 5.8,12.3,2.67, 10.2,12.3,2.67, 2.3,23.4,2.67, 3.4,23.4,2.67, 5.8,23.4,2.67, 10.2,23.4,2.67, 2.3,45.8,2.67, 3.4,45.8,2.67, 5.8,45.8,2.67, 10.2,45.8,2.67
127   };
128   for(int i=0;i<180;i++)
129     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected3_2[i],coords->getIJ(0,i),1e-12);
130   coords->decrRef();
131   coords=m->getBarycenterAndOwner();
132   CPPUNIT_ASSERT_EQUAL(24,coords->getNumberOfTuples());
133   CPPUNIT_ASSERT_EQUAL(3,coords->getNumberOfComponents());
134   const double expected3_3[72]={
135     2.85,17.85,0.25,4.6,17.85,0.25,8.,17.85,0.25, 2.85,34.6,0.25,4.6,34.6,0.25,8.,34.6,0.25,
136     2.85,17.85,1.225,4.6,17.85,1.225,8.,17.85,1.225, 2.85,34.6,1.225,4.6,34.6,1.225,8.,34.6,1.225,
137     2.85,17.85,1.69,4.6,17.85,1.69,8.,17.85,1.69, 2.85,34.6,1.69,4.6,34.6,1.69,8.,34.6,1.69,
138     2.85,17.85,2.4,4.6,17.85,2.4,8.,17.85,2.4, 2.85,34.6,2.4,4.6,34.6,2.4,8.,34.6,2.4
139   };
140   for(int i=0;i<72;i++)
141     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected3_3[i],coords->getIJ(0,i),1e-12);
142   coords->decrRef();
143   //
144   m->decrRef();
145 }
146
147 void MEDCouplingBasicsTest3::testFieldDoubleZipCoords1()
148 {
149   MEDCouplingUMesh *m=build2DTargetMeshMergeNode_1();
150   MEDCouplingFieldDouble *f=m->fillFromAnalytic(ON_NODES,2,"x*2.");
151   f->getArray()->setInfoOnComponent(0,"titi");
152   f->getArray()->setInfoOnComponent(1,"tutu");
153   f->checkCoherency();
154   CPPUNIT_ASSERT_EQUAL(18,f->getNumberOfTuples());
155   CPPUNIT_ASSERT_EQUAL(2,f->getNumberOfComponents());
156   const double expected1[36]={-0.6, -0.6, 0.4, 0.4, 1.4, 1.4, -0.6, -0.6, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 1.4, 1.4, -0.6, -0.6, 0.4, 0.4, 1.4, 1.4, -0.6, -0.6, 1.4, 1.4, -0.6, -0.6, 0.4, 0.4, 1.4, 1.4, 0.4, 0.4};
157   for(int i=0;i<36;i++)
158     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],f->getIJ(0,i),1e-12);
159   CPPUNIT_ASSERT(f->zipCoords());
160   f->checkCoherency();
161   const double expected2[30]={-0.6, -0.6, 1.4, 1.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 1.4, 1.4, -0.6, -0.6, 0.4, 0.4, 1.4, 1.4, 1.4, 1.4, -0.6, -0.6, 0.4, 0.4, 1.4, 1.4, 0.4, 0.4};
162   for(int i=0;i<30;i++)
163     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],f->getIJ(0,i),1e-12);
164   CPPUNIT_ASSERT(!f->zipCoords());
165   f->checkCoherency();
166   for(int i=0;i<30;i++)
167     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],f->getIJ(0,i),1e-12);
168   CPPUNIT_ASSERT(std::string(f->getArray()->getInfoOnComponent(0))=="titi");
169   CPPUNIT_ASSERT(std::string(f->getArray()->getInfoOnComponent(1))=="tutu");
170   f->decrRef();
171   m->decrRef();
172 }
173
174 void MEDCouplingBasicsTest3::testFieldDoubleZipConnectivity1()
175 {
176   MEDCouplingUMesh *m1=build2DTargetMesh_1();
177   MEDCouplingUMesh *m2=build2DTargetMesh_1();
178   const int cells1[3]={2,3,4};
179   MEDCouplingPointSet *m3_1=m2->buildPartOfMySelf(cells1,cells1+3,true);
180   MEDCouplingUMesh *m3=dynamic_cast<MEDCouplingUMesh *>(m3_1);
181   CPPUNIT_ASSERT(m3);
182   m2->decrRef();
183   MEDCouplingUMesh *m4=build2DSourceMesh_1();
184   MEDCouplingUMesh *m5=MEDCouplingUMesh::MergeUMeshes(m1,m3);
185   m1->decrRef();
186   m3->decrRef();
187   MEDCouplingUMesh *m6=MEDCouplingUMesh::MergeUMeshes(m5,m4);
188   m4->decrRef();
189   m5->decrRef();
190   //
191   CPPUNIT_ASSERT_EQUAL(10,m6->getNumberOfCells());
192   CPPUNIT_ASSERT_EQUAL(22,m6->getNumberOfNodes());
193   bool areNodesMerged;
194   int newNbOfNodes;
195   DataArrayInt *arr=m6->mergeNodes(1e-13,areNodesMerged,newNbOfNodes);
196   CPPUNIT_ASSERT_EQUAL(9,m6->getNumberOfNodes());
197   arr->decrRef();
198   MEDCouplingFieldDouble *f=m6->fillFromAnalytic(ON_CELLS,2,"x");
199   MEDCouplingFieldDouble *f2=m6->fillFromAnalytic(ON_NODES,2,"x");
200   CPPUNIT_ASSERT_EQUAL(10,f->getNumberOfTuples());
201   CPPUNIT_ASSERT_EQUAL(2,f->getNumberOfComponents());
202   const double expected1[20]={-0.05, -0.05, 0.3666666666666667, 0.3666666666666667, 0.53333333333333321, 0.53333333333333321,
203                               -0.05, -0.05, 0.45, 0.45, 0.53333333333333321, 0.53333333333333321, -0.05, -0.05, 0.45, 0.45,
204                               0.36666666666666659, 0.36666666666666659, 0.033333333333333326, 0.033333333333333326};
205   for(int i=0;i<20;i++)
206     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],f->getIJ(0,i),1e-12);
207   f->getArray()->setInfoOnComponent(0,"titi");
208   f->getArray()->setInfoOnComponent(1,"tutu");
209   f->checkCoherency();
210   CPPUNIT_ASSERT(f->zipConnectivity(0));
211   const double expected2[14]={-0.05, -0.05, 0.3666666666666667, 0.3666666666666667, 0.53333333333333321, 0.53333333333333321,
212                               -0.05, -0.05, 0.45, 0.45, 0.36666666666666659, 0.36666666666666659, 0.033333333333333326, 0.033333333333333326};
213   CPPUNIT_ASSERT_EQUAL(7,f->getNumberOfTuples());
214   CPPUNIT_ASSERT_EQUAL(2,f->getNumberOfComponents());
215   for(int i=0;i<14;i++)
216     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],f->getIJ(0,i),1e-12);
217   CPPUNIT_ASSERT(std::string(f->getArray()->getInfoOnComponent(0))=="titi");
218   CPPUNIT_ASSERT(std::string(f->getArray()->getInfoOnComponent(1))=="tutu");
219   CPPUNIT_ASSERT(!f->zipConnectivity(0));
220   f->decrRef();
221   //
222   const double expected3[18]={-0.3, -0.3, 0.2, 0.2, 0.7, 0.7, -0.3, -0.3, 0.2, 0.2, 0.7, 0.7, 
223                               -0.3, -0.3, 0.2, 0.2, 0.7, 0.7};
224   CPPUNIT_ASSERT_EQUAL(9,f2->getNumberOfTuples());
225   CPPUNIT_ASSERT_EQUAL(2,f2->getNumberOfComponents());
226   for(int i=0;i<18;i++)
227     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected3[i],f2->getIJ(0,i),1e-12);
228   CPPUNIT_ASSERT(f2->zipConnectivity(0));
229   CPPUNIT_ASSERT_EQUAL(9,f2->getNumberOfTuples());
230   CPPUNIT_ASSERT_EQUAL(2,f2->getNumberOfComponents());
231   for(int i=0;i<18;i++)
232     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected3[i],f2->getIJ(0,i),1e-12);
233   f2->decrRef();
234   //
235   m6->decrRef();
236 }
237
238 void MEDCouplingBasicsTest3::testDaDoubleRenumber1()
239 {
240   DataArrayDouble *a=DataArrayDouble::New();
241   a->alloc(7,2);
242   a->setInfoOnComponent(0,"toto");
243   a->setInfoOnComponent(1,"tata");
244   const double arr1[14]={1.1,11.1,2.1,12.1,3.1,13.1,4.1,14.1,5.1,15.1,6.1,16.1,7.1,17.1};
245   std::copy(arr1,arr1+14,a->getPointer());
246   //
247   const int arr2[7]={3,1,0,6,5,4,2};
248   DataArrayDouble *b=a->renumber(arr2);
249   CPPUNIT_ASSERT_EQUAL(7,b->getNumberOfTuples());
250   CPPUNIT_ASSERT_EQUAL(2,b->getNumberOfComponents());
251   CPPUNIT_ASSERT(std::string(b->getInfoOnComponent(0))=="toto");
252   CPPUNIT_ASSERT(std::string(b->getInfoOnComponent(1))=="tata");
253   const double expected1[14]={3.1, 13.1, 2.1, 12.1, 7.1, 17.1, 1.1, 11.1, 6.1, 16.1, 5.1, 15.1, 4.1, 14.1};
254   for(int i=0;i<14;i++)
255     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],b->getIJ(0,i),1e-14);
256   b->decrRef();
257   a->decrRef();
258   //
259   DataArrayInt *c=DataArrayInt::New();
260   c->alloc(7,2);
261   c->setInfoOnComponent(0,"toto");
262   c->setInfoOnComponent(1,"tata");
263   const int arr3[14]={1,11,2,12,3,13,4,14,5,15,6,16,7,17};
264   std::copy(arr3,arr3+14,c->getPointer());
265   DataArrayInt *d=c->renumber(arr2);
266   CPPUNIT_ASSERT_EQUAL(7,d->getNumberOfTuples());
267   CPPUNIT_ASSERT_EQUAL(2,d->getNumberOfComponents());
268   CPPUNIT_ASSERT(std::string(d->getInfoOnComponent(0))=="toto");
269   CPPUNIT_ASSERT(std::string(d->getInfoOnComponent(1))=="tata");
270   const int expected2[14]={3, 13, 2, 12, 7, 17, 1, 11, 6, 16, 5, 15, 4, 14};
271   for(int i=0;i<14;i++)
272     CPPUNIT_ASSERT_EQUAL(expected2[i],d->getIJ(0,i));
273   c->decrRef();
274   d->decrRef();
275 }
276
277 void MEDCouplingBasicsTest3::testDaDoubleRenumberAndReduce1()
278 {
279   DataArrayDouble *a=DataArrayDouble::New();
280   a->alloc(7,2);
281   a->setInfoOnComponent(0,"toto");
282   a->setInfoOnComponent(1,"tata");
283   const double arr1[14]={1.1,11.1,2.1,12.1,3.1,13.1,4.1,14.1,5.1,15.1,6.1,16.1,7.1,17.1};
284   std::copy(arr1,arr1+14,a->getPointer());
285   //
286   const int arr2[7]={2,-1,1,-1,0,4,3};
287   DataArrayDouble *b=a->renumberAndReduce(arr2,5);
288   CPPUNIT_ASSERT_EQUAL(5,b->getNumberOfTuples());
289   CPPUNIT_ASSERT_EQUAL(2,b->getNumberOfComponents());
290   CPPUNIT_ASSERT(std::string(b->getInfoOnComponent(0))=="toto");
291   CPPUNIT_ASSERT(std::string(b->getInfoOnComponent(1))=="tata");
292   const double expected1[10]={5.1,15.1,3.1,13.1,1.1,11.1,7.1,17.1,6.1,16.1};
293   for(int i=0;i<10;i++)
294     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],b->getIJ(0,i),1e-14);
295   b->decrRef();
296   a->decrRef();
297   //
298   DataArrayInt *c=DataArrayInt::New();
299   c->alloc(7,2);
300   c->setInfoOnComponent(0,"toto");
301   c->setInfoOnComponent(1,"tata");
302   const int arr3[14]={1,11,2,12,3,13,4,14,5,15,6,16,7,17};
303   std::copy(arr3,arr3+14,c->getPointer());
304   DataArrayInt *d=c->renumberAndReduce(arr2,5);
305   CPPUNIT_ASSERT_EQUAL(5,d->getNumberOfTuples());
306   CPPUNIT_ASSERT_EQUAL(2,d->getNumberOfComponents());
307   CPPUNIT_ASSERT(std::string(d->getInfoOnComponent(0))=="toto");
308   CPPUNIT_ASSERT(std::string(d->getInfoOnComponent(1))=="tata");
309   const int expected2[10]={5,15,3,13,1,11,7,17,6,16};
310   for(int i=0;i<10;i++)
311     CPPUNIT_ASSERT_EQUAL(expected2[i],d->getIJ(0,i));
312   c->decrRef();
313   d->decrRef();
314 }
315
316 void MEDCouplingBasicsTest3::testDaDoubleRenumberInPlace1()
317 {
318   DataArrayDouble *a=DataArrayDouble::New();
319   a->alloc(7,2);
320   const double arr1[14]={1.1,11.1,2.1,12.1,3.1,13.1,4.1,14.1,5.1,15.1,6.1,16.1,7.1,17.1};
321   std::copy(arr1,arr1+14,a->getPointer());
322   //
323   const int arr2[7]={3,1,0,6,5,4,2};
324   a->renumberInPlace(arr2);
325   CPPUNIT_ASSERT_EQUAL(7,a->getNumberOfTuples());
326   CPPUNIT_ASSERT_EQUAL(2,a->getNumberOfComponents());
327   const double expected1[14]={3.1, 13.1, 2.1, 12.1, 7.1, 17.1, 1.1, 11.1, 6.1, 16.1, 5.1, 15.1, 4.1, 14.1};
328   for(int i=0;i<14;i++)
329     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],a->getIJ(0,i),1e-14);
330   a->decrRef();
331   //
332   DataArrayInt *c=DataArrayInt::New();
333   c->alloc(7,2);
334   const int arr3[14]={1,11,2,12,3,13,4,14,5,15,6,16,7,17};
335   std::copy(arr3,arr3+14,c->getPointer());
336   c->renumberInPlace(arr2);
337   CPPUNIT_ASSERT_EQUAL(7,c->getNumberOfTuples());
338   CPPUNIT_ASSERT_EQUAL(2,c->getNumberOfComponents());
339   const int expected2[14]={3, 13, 2, 12, 7, 17, 1, 11, 6, 16, 5, 15, 4, 14};
340   for(int i=0;i<14;i++)
341     CPPUNIT_ASSERT_EQUAL(expected2[i],c->getIJ(0,i));
342   c->decrRef();
343 }
344
345 void MEDCouplingBasicsTest3::testDaDoubleRenumberR1()
346 {
347   DataArrayDouble *a=DataArrayDouble::New();
348   a->alloc(7,2);
349   a->setInfoOnComponent(0,"toto");
350   a->setInfoOnComponent(1,"tata");
351   const double arr1[14]={1.1,11.1,2.1,12.1,3.1,13.1,4.1,14.1,5.1,15.1,6.1,16.1,7.1,17.1};
352   std::copy(arr1,arr1+14,a->getPointer());
353   //
354   const int arr2[7]={3,1,0,6,5,4,2};
355   DataArrayDouble *b=a->renumberR(arr2);
356   CPPUNIT_ASSERT_EQUAL(7,b->getNumberOfTuples());
357   CPPUNIT_ASSERT_EQUAL(2,b->getNumberOfComponents());
358   CPPUNIT_ASSERT(std::string(b->getInfoOnComponent(0))=="toto");
359   CPPUNIT_ASSERT(std::string(b->getInfoOnComponent(1))=="tata");
360   const double expected1[14]={4.1, 14.1, 2.1, 12.1, 1.1, 11.1, 7.1, 17.1, 6.1, 16.1, 5.1, 15.1, 3.1, 13.1};
361   for(int i=0;i<14;i++)
362     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],b->getIJ(0,i),1e-14);
363   b->decrRef();
364   a->decrRef();
365   //
366   DataArrayInt *c=DataArrayInt::New();
367   c->alloc(7,2);
368   c->setInfoOnComponent(0,"toto");
369   c->setInfoOnComponent(1,"tata");
370   const int arr3[14]={1,11,2,12,3,13,4,14,5,15,6,16,7,17};
371   std::copy(arr3,arr3+14,c->getPointer());
372   DataArrayInt *d=c->renumberR(arr2);
373   CPPUNIT_ASSERT_EQUAL(7,d->getNumberOfTuples());
374   CPPUNIT_ASSERT_EQUAL(2,d->getNumberOfComponents());
375   CPPUNIT_ASSERT(std::string(d->getInfoOnComponent(0))=="toto");
376   CPPUNIT_ASSERT(std::string(d->getInfoOnComponent(1))=="tata");
377   const int expected2[14]={4, 14, 2, 12, 1, 11, 7, 17, 6, 16, 5, 15, 3, 13};
378   for(int i=0;i<14;i++)
379     CPPUNIT_ASSERT_EQUAL(expected2[i],d->getIJ(0,i));
380   c->decrRef();
381   d->decrRef();
382 }
383
384 void MEDCouplingBasicsTest3::testDaDoubleRenumberInPlaceR1()
385 {
386   DataArrayDouble *a=DataArrayDouble::New();
387   a->alloc(7,2);
388   const double arr1[14]={1.1,11.1,2.1,12.1,3.1,13.1,4.1,14.1,5.1,15.1,6.1,16.1,7.1,17.1};
389   std::copy(arr1,arr1+14,a->getPointer());
390   //
391   const int arr2[7]={3,1,0,6,5,4,2};
392   a->renumberInPlaceR(arr2);
393   CPPUNIT_ASSERT_EQUAL(7,a->getNumberOfTuples());
394   CPPUNIT_ASSERT_EQUAL(2,a->getNumberOfComponents());
395   const double expected1[14]={4.1, 14.1, 2.1, 12.1, 1.1, 11.1, 7.1, 17.1, 6.1, 16.1, 5.1, 15.1, 3.1, 13.1};
396   for(int i=0;i<14;i++)
397     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],a->getIJ(0,i),1e-14);
398   a->decrRef();
399   //
400   DataArrayInt *c=DataArrayInt::New();
401   c->alloc(7,2);
402   const int arr3[14]={1,11,2,12,3,13,4,14,5,15,6,16,7,17};
403   std::copy(arr3,arr3+14,c->getPointer());
404   c->renumberInPlaceR(arr2);
405   CPPUNIT_ASSERT_EQUAL(7,c->getNumberOfTuples());
406   CPPUNIT_ASSERT_EQUAL(2,c->getNumberOfComponents());
407   const int expected2[14]={4, 14, 2, 12, 1, 11, 7, 17, 6, 16, 5, 15, 3, 13};
408   for(int i=0;i<14;i++)
409     CPPUNIT_ASSERT_EQUAL(expected2[i],c->getIJ(0,i));
410   c->decrRef();
411 }
412
413 void MEDCouplingBasicsTest3::testDaDoubleSelectByTupleId1()
414 {
415   DataArrayDouble *a=DataArrayDouble::New();
416   a->alloc(7,2);
417   a->setInfoOnComponent(0,"toto");
418   a->setInfoOnComponent(1,"tata");
419   const double arr1[14]={1.1,11.1,2.1,12.1,3.1,13.1,4.1,14.1,5.1,15.1,6.1,16.1,7.1,17.1};
420   std::copy(arr1,arr1+14,a->getPointer());
421   //
422   const int arr2[7]={4,2,0,6,5};
423   DataArrayDouble *b=a->selectByTupleId(arr2,arr2+5);
424   CPPUNIT_ASSERT_EQUAL(5,b->getNumberOfTuples());
425   CPPUNIT_ASSERT_EQUAL(2,b->getNumberOfComponents());
426   CPPUNIT_ASSERT(std::string(b->getInfoOnComponent(0))=="toto");
427   CPPUNIT_ASSERT(std::string(b->getInfoOnComponent(1))=="tata");
428   const double expected1[10]={5.1,15.1,3.1,13.1,1.1,11.1,7.1,17.1,6.1,16.1};
429   for(int i=0;i<10;i++)
430     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],b->getIJ(0,i),1e-14);
431   b->decrRef();
432   a->decrRef();
433   //
434   DataArrayInt *c=DataArrayInt::New();
435   c->alloc(7,2);
436   c->setInfoOnComponent(0,"toto");
437   c->setInfoOnComponent(1,"tata");
438   const int arr3[14]={1,11,2,12,3,13,4,14,5,15,6,16,7,17};
439   std::copy(arr3,arr3+14,c->getPointer());
440   DataArrayInt *d=c->selectByTupleId(arr2,arr2+5);
441   CPPUNIT_ASSERT_EQUAL(5,d->getNumberOfTuples());
442   CPPUNIT_ASSERT_EQUAL(2,d->getNumberOfComponents());
443   CPPUNIT_ASSERT(std::string(d->getInfoOnComponent(0))=="toto");
444   CPPUNIT_ASSERT(std::string(d->getInfoOnComponent(1))=="tata");
445   const int expected2[10]={5,15,3,13,1,11,7,17,6,16};
446   for(int i=0;i<10;i++)
447     CPPUNIT_ASSERT_EQUAL(expected2[i],d->getIJ(0,i));
448   c->decrRef();
449   d->decrRef();
450 }
451
452 void MEDCouplingBasicsTest3::testDaDoubleGetMinMaxValues1()
453 {
454   DataArrayDouble *a=DataArrayDouble::New();
455   a->alloc(9,1);
456   const double arr1[9]={2.34,4.56,-6.77,4.55,4.56,2.24,2.34,1.02,4.56};
457   std::copy(arr1,arr1+9,a->getPointer());
458   int where;
459   double m=a->getMaxValue(where);
460   CPPUNIT_ASSERT_EQUAL(1,where);
461   CPPUNIT_ASSERT_DOUBLES_EQUAL(4.56,m,1e-12);
462   DataArrayInt *ws;
463   m=a->getMaxValue2(ws);
464   CPPUNIT_ASSERT_DOUBLES_EQUAL(4.56,m,1e-12);
465   CPPUNIT_ASSERT_EQUAL(3,ws->getNumberOfTuples());
466   CPPUNIT_ASSERT_EQUAL(1,ws->getNumberOfComponents());
467   const int expected1[3]={1,4,8};
468   for(int i=0;i<3;i++)
469     CPPUNIT_ASSERT_EQUAL(expected1[i],ws->getIJ(i,0));
470   ws->decrRef();
471   a->decrRef();
472   a=DataArrayDouble::New();
473   const double arr2[9]={-2.34,-4.56,6.77,-4.55,-4.56,-2.24,-2.34,-1.02,-4.56};
474   a->alloc(9,1);
475   std::copy(arr2,arr2+9,a->getPointer());
476   where=-2;
477   m=a->getMinValue(where);
478   CPPUNIT_ASSERT_EQUAL(1,where);
479   CPPUNIT_ASSERT_DOUBLES_EQUAL(-4.56,m,1e-12);
480   m=a->getMinValue2(ws);
481   CPPUNIT_ASSERT_DOUBLES_EQUAL(-4.56,m,1e-12);
482   CPPUNIT_ASSERT_EQUAL(3,ws->getNumberOfTuples());
483   CPPUNIT_ASSERT_EQUAL(1,ws->getNumberOfComponents());
484   for(int i=0;i<3;i++)
485     CPPUNIT_ASSERT_EQUAL(expected1[i],ws->getIJ(i,0));
486   ws->decrRef();
487   a->decrRef();
488 }
489
490 void MEDCouplingBasicsTest3::testFieldDoubleGetMinMaxValues2()
491 {
492   MEDCouplingUMesh *m1=0;
493   MEDCouplingUMesh *m2=build3DExtrudedUMesh_1(m1);
494   m1->decrRef();
495   CPPUNIT_ASSERT_EQUAL(18,m2->getNumberOfCells());
496   const double arr1[18]={8.71,4.53,-12.41,8.71,-8.71,8.7099,4.55,8.71,5.55,6.77,-1e-200,4.55,8.7099,0.,1.23,0.,2.22,8.71};
497   MEDCouplingFieldDouble *f=MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME);
498   DataArrayDouble *a=DataArrayDouble::New();
499   a->alloc(18,1);
500   std::copy(arr1,arr1+18,a->getPointer());
501   f->setArray(a);
502   a->decrRef();
503   f->setMesh(m2);
504   //
505   f->checkCoherency();
506   double m=f->getMaxValue();
507   CPPUNIT_ASSERT_DOUBLES_EQUAL(8.71,m,1e-12);
508   DataArrayInt *ws;
509   m=f->getMaxValue2(ws);
510   CPPUNIT_ASSERT_DOUBLES_EQUAL(8.71,m,1e-12);
511   CPPUNIT_ASSERT_EQUAL(4,ws->getNumberOfTuples());
512   CPPUNIT_ASSERT_EQUAL(1,ws->getNumberOfComponents());
513   const int expected1[4]={0,3,7,17};
514   for(int i=0;i<4;i++)
515     CPPUNIT_ASSERT_EQUAL(expected1[i],ws->getIJ(i,0));
516   ws->decrRef();
517   //
518   const double arr2[18]={-8.71,-4.53,12.41,-8.71,8.71,-8.7099,-4.55,-8.71,-5.55,-6.77,1e-200,-4.55,-8.7099,0.,-1.23,0.,-2.22,-8.71};
519   std::copy(arr2,arr2+18,a->getPointer());
520   f->checkCoherency();
521   m=f->getMinValue();
522   CPPUNIT_ASSERT_DOUBLES_EQUAL(-8.71,m,1e-12);
523   m=f->getMinValue2(ws);
524   CPPUNIT_ASSERT_DOUBLES_EQUAL(-8.71,m,1e-12);
525   CPPUNIT_ASSERT_EQUAL(4,ws->getNumberOfTuples());
526   CPPUNIT_ASSERT_EQUAL(1,ws->getNumberOfComponents());
527   for(int i=0;i<4;i++)
528     CPPUNIT_ASSERT_EQUAL(expected1[i],ws->getIJ(i,0));
529   ws->decrRef();
530   //
531   f->decrRef();
532   m2->decrRef();
533 }
534
535 void MEDCouplingBasicsTest3::testBuildUnstructuredCMesh1()
536 {
537   MEDCouplingCMesh *m=MEDCouplingCMesh::New();
538   DataArrayDouble *da=DataArrayDouble::New();
539   const double discX[4]={2.3,3.4,5.8,10.2};
540   const double discY[3]={12.3,23.4,45.8};
541   const double discZ[5]={-0.7,1.2,1.25,2.13,2.67};
542   da->alloc(4,1);
543   std::copy(discX,discX+4,da->getPointer());
544   m->setCoordsAt(0,da);
545   da->decrRef();
546   m->checkCoherency();
547   double pos=2.4;
548   CPPUNIT_ASSERT_EQUAL(0,m->getCellContainingPoint(&pos,1e-12));
549   pos=3.7;
550   CPPUNIT_ASSERT_EQUAL(1,m->getCellContainingPoint(&pos,1e-12));
551   pos=5.9;
552   CPPUNIT_ASSERT_EQUAL(2,m->getCellContainingPoint(&pos,1e-12));
553   pos=10.3;
554   CPPUNIT_ASSERT_EQUAL(-1,m->getCellContainingPoint(&pos,1e-12));
555   pos=1.3;
556   CPPUNIT_ASSERT_EQUAL(-1,m->getCellContainingPoint(&pos,1e-12));
557   //
558   MEDCouplingUMesh *m2=m->buildUnstructured();
559   m2->checkCoherency();
560   MEDCouplingFieldDouble *f1=m->getMeasureField(false);
561   MEDCouplingFieldDouble *f2=m2->getMeasureField(false);
562   CPPUNIT_ASSERT_EQUAL(f1->getNumberOfTuples(),3);
563   CPPUNIT_ASSERT_EQUAL(f2->getNumberOfTuples(),3);
564   CPPUNIT_ASSERT_EQUAL(1,m2->getMeshDimension());
565   CPPUNIT_ASSERT_EQUAL(1,m2->getSpaceDimension());
566   for(int i=0;i<3;i++)
567     CPPUNIT_ASSERT_DOUBLES_EQUAL(f1->getIJ(i,0),f2->getIJ(i,0),1e-10);
568   da=DataArrayDouble::New();
569   da->alloc(3,1);
570   std::copy(discY,discY+3,da->getPointer());
571   m->setCoordsAt(1,da);
572   da->decrRef();
573   m2->decrRef();
574   f1->decrRef();
575   f2->decrRef();
576   //
577   m2=m->buildUnstructured();
578   m2->checkCoherency();
579   f1=m->getMeasureField(false);
580   f2=m2->getMeasureField(false);
581   CPPUNIT_ASSERT_EQUAL(f1->getNumberOfTuples(),6);
582   CPPUNIT_ASSERT_EQUAL(f2->getNumberOfTuples(),6);
583   CPPUNIT_ASSERT_EQUAL(2,m2->getMeshDimension());
584   CPPUNIT_ASSERT_EQUAL(2,m2->getSpaceDimension());
585   for(int i=0;i<6;i++)
586     CPPUNIT_ASSERT_DOUBLES_EQUAL(f1->getIJ(i,0),f2->getIJ(i,0),1e-10);
587   f1->decrRef();
588   f2->decrRef();
589   m2->decrRef();
590   //
591   da=DataArrayDouble::New();
592   da->alloc(5,1);
593   std::copy(discZ,discZ+5,da->getPointer());
594   m->setCoordsAt(2,da);
595   da->decrRef();
596   m2=m->buildUnstructured();
597   m2->checkCoherency();
598   f1=m->getMeasureField(false);
599   f2=m2->getMeasureField(false);
600   CPPUNIT_ASSERT_EQUAL(f1->getNumberOfTuples(),24);
601   CPPUNIT_ASSERT_EQUAL(f2->getNumberOfTuples(),24);
602   CPPUNIT_ASSERT_EQUAL(3,m2->getMeshDimension());
603   CPPUNIT_ASSERT_EQUAL(3,m2->getSpaceDimension());
604   for(int i=0;i<24;i++)
605     CPPUNIT_ASSERT_DOUBLES_EQUAL(f1->getIJ(i,0),f2->getIJ(i,0),1e-10);
606   f1->decrRef();
607   f2->decrRef();
608   //
609   double pos1[3]={5.,30.,2.};
610   CPPUNIT_ASSERT_EQUAL(16,m->getCellContainingPoint(pos1,1e-12));
611   //
612   const double pt[3]={2.4,12.7,-3.4};
613   m->scale(pt,3.7);
614   MEDCouplingUMesh *m3=m->buildUnstructured();
615   m2->scale(pt,3.7);
616   CPPUNIT_ASSERT(m3->isEqual(m2,1e-12));
617   m2->decrRef();
618   m3->decrRef();
619   //
620   m->decrRef();
621 }
622
623 void MEDCouplingBasicsTest3::testDataArrayIntInvertO2NNO21()
624 {
625   const int arr1[6]={2,0,4,1,5,3};
626   DataArrayInt *da=DataArrayInt::New();
627   da->alloc(6,1);
628   std::copy(arr1,arr1+6,da->getPointer());
629   DataArrayInt *da2=da->invertArrayO2N2N2O(6);
630   CPPUNIT_ASSERT_EQUAL(6,da2->getNumberOfTuples());
631   CPPUNIT_ASSERT_EQUAL(1,da2->getNumberOfComponents());
632   const int expected1[6]={1,3,0,5,2,4};
633   for(int i=0;i<6;i++)
634     CPPUNIT_ASSERT_EQUAL(expected1[i],da2->getIJ(i,0));
635   DataArrayInt *da3=da2->invertArrayN2O2O2N(6);
636   for(int i=0;i<6;i++)
637     CPPUNIT_ASSERT_EQUAL(arr1[i],da3->getIJ(i,0));
638   da3->decrRef();
639   da2->decrRef();
640   da->decrRef();
641   //
642   const int arr2[10]={3,-1,5,4,-1,0,-1,1,2,-1};
643   da=DataArrayInt::New();
644   da->alloc(10,1);
645   std::copy(arr2,arr2+10,da->getPointer());
646   da2=da->invertArrayO2N2N2O(6);
647   CPPUNIT_ASSERT_EQUAL(6,da2->getNumberOfTuples());
648   CPPUNIT_ASSERT_EQUAL(1,da2->getNumberOfComponents());
649   const int expected2[10]={5,7,8,0,3,2};
650   for(int i=0;i<6;i++)
651     CPPUNIT_ASSERT_EQUAL(expected2[i],da2->getIJ(i,0));
652   da3=da2->invertArrayN2O2O2N(10);
653   for(int i=0;i<10;i++)
654     CPPUNIT_ASSERT_EQUAL(arr2[i],da3->getIJ(i,0));
655   da3->decrRef();
656   da2->decrRef();
657   da->decrRef();
658 }
659
660 void MEDCouplingBasicsTest3::testKeepSetSelectedComponent1()
661 {
662   const double arr1[20]={1.,2.,3.,4., 11.,12.,13.,14., 21.,22.,23.,24., 31.,32.,33.,34., 41.,42.,43.,44.};
663   DataArrayDouble *a1=DataArrayDouble::New();
664   a1->alloc(5,4);
665   std::copy(arr1,arr1+20,a1->getPointer());
666   a1->setInfoOnComponent(0,"aaaa");
667   a1->setInfoOnComponent(1,"bbbb");
668   a1->setInfoOnComponent(2,"cccc");
669   a1->setInfoOnComponent(3,"dddd");
670   const int arr2[6]={1,2,1,2,0,0};
671   std::vector<int> arr2V(arr2,arr2+6);
672   DataArrayDouble *a2=static_cast<DataArrayDouble *>(a1->keepSelectedComponents(arr2V));
673   CPPUNIT_ASSERT_EQUAL(6,a2->getNumberOfComponents());
674   CPPUNIT_ASSERT_EQUAL(5,a2->getNumberOfTuples());
675   CPPUNIT_ASSERT(std::string(a2->getInfoOnComponent(0))=="bbbb");
676   CPPUNIT_ASSERT(std::string(a2->getInfoOnComponent(1))=="cccc");
677   CPPUNIT_ASSERT(std::string(a2->getInfoOnComponent(2))=="bbbb");
678   CPPUNIT_ASSERT(std::string(a2->getInfoOnComponent(3))=="cccc");
679   CPPUNIT_ASSERT(std::string(a2->getInfoOnComponent(4))=="aaaa");
680   CPPUNIT_ASSERT(std::string(a2->getInfoOnComponent(5))=="aaaa");
681   const double expected1[30]={2.,3.,2.,3.,1.,1., 12.,13.,12.,13.,11.,11., 22.,23.,22.,23.,21.,21., 32.,33.,32.,33.,31.,31., 42.,43.,42.,43.,41.,41.};
682   for(int i=0;i<30;i++)
683     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],a2->getIJ(0,i),1e-14);
684   DataArrayInt *a3=a1->convertToIntArr();
685   DataArrayInt *a4=static_cast<DataArrayInt *>(a3->keepSelectedComponents(arr2V));
686   CPPUNIT_ASSERT_EQUAL(6,a4->getNumberOfComponents());
687   CPPUNIT_ASSERT_EQUAL(5,a4->getNumberOfTuples());
688   CPPUNIT_ASSERT(std::string(a4->getInfoOnComponent(0))=="bbbb");
689   CPPUNIT_ASSERT(std::string(a4->getInfoOnComponent(1))=="cccc");
690   CPPUNIT_ASSERT(std::string(a4->getInfoOnComponent(2))=="bbbb");
691   CPPUNIT_ASSERT(std::string(a4->getInfoOnComponent(3))=="cccc");
692   CPPUNIT_ASSERT(std::string(a4->getInfoOnComponent(4))=="aaaa");
693   CPPUNIT_ASSERT(std::string(a4->getInfoOnComponent(5))=="aaaa");
694   for(int i=0;i<30;i++)
695     CPPUNIT_ASSERT_EQUAL(int(expected1[i]),a4->getIJ(0,i));
696   // setSelectedComponents
697   const int arr3[2]={3,2};
698   std::vector<int> arr3V(arr3,arr3+2);
699   DataArrayDouble *a5=static_cast<DataArrayDouble *>(a1->keepSelectedComponents(arr3V));
700   a5->setInfoOnComponent(0,"eeee");
701   a5->setInfoOnComponent(1,"ffff");
702   const int arr4[2]={1,2};
703   std::vector<int> arr4V(arr4,arr4+2);
704   a2->setSelectedComponents(a5,arr4V);
705   CPPUNIT_ASSERT_EQUAL(6,a2->getNumberOfComponents());
706   CPPUNIT_ASSERT_EQUAL(5,a2->getNumberOfTuples());
707   CPPUNIT_ASSERT(std::string(a2->getInfoOnComponent(0))=="bbbb");
708   CPPUNIT_ASSERT(std::string(a2->getInfoOnComponent(1))=="eeee");
709   CPPUNIT_ASSERT(std::string(a2->getInfoOnComponent(2))=="ffff");
710   CPPUNIT_ASSERT(std::string(a2->getInfoOnComponent(3))=="cccc");
711   CPPUNIT_ASSERT(std::string(a2->getInfoOnComponent(4))=="aaaa");
712   CPPUNIT_ASSERT(std::string(a2->getInfoOnComponent(5))=="aaaa");
713   const double expected2[30]={2.,4.,3.,3.,1.,1., 12.,14.,13.,13.,11.,11., 22.,24.,23.,23.,21.,21., 32.,34.,33.,33.,31.,31., 42.,44.,43.,43.,41.,41.};
714   for(int i=0;i<30;i++)
715     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],a2->getIJ(0,i),1e-14);
716   DataArrayInt *a6=a5->convertToIntArr();
717   a6->setInfoOnComponent(0,"eeee");
718   a6->setInfoOnComponent(1,"ffff");
719   a4->setSelectedComponents(a6,arr4V);
720   CPPUNIT_ASSERT_EQUAL(6,a4->getNumberOfComponents());
721   CPPUNIT_ASSERT_EQUAL(5,a4->getNumberOfTuples());
722   CPPUNIT_ASSERT(std::string(a4->getInfoOnComponent(0))=="bbbb");
723   CPPUNIT_ASSERT(std::string(a4->getInfoOnComponent(1))=="eeee");
724   CPPUNIT_ASSERT(std::string(a4->getInfoOnComponent(2))=="ffff");
725   CPPUNIT_ASSERT(std::string(a4->getInfoOnComponent(3))=="cccc");
726   CPPUNIT_ASSERT(std::string(a4->getInfoOnComponent(4))=="aaaa");
727   CPPUNIT_ASSERT(std::string(a4->getInfoOnComponent(5))=="aaaa");
728   for(int i=0;i<30;i++)
729     CPPUNIT_ASSERT_EQUAL(int(expected2[i]),a4->getIJ(0,i));
730   // test of throw
731   const int arr5[3]={2,3,6};
732   const int arr6[3]={2,7,5};
733   const int arr7[4]={2,1,4,6};
734   std::vector<int> arr5V(arr5,arr5+3);
735   std::vector<int> arr6V(arr6,arr6+3);
736   std::vector<int> arr7V(arr7,arr7+4);
737   CPPUNIT_ASSERT_THROW(a2->keepSelectedComponents(arr5V),INTERP_KERNEL::Exception);
738   CPPUNIT_ASSERT_THROW(a2->keepSelectedComponents(arr6V),INTERP_KERNEL::Exception);
739   CPPUNIT_ASSERT_THROW(a2->setSelectedComponents(a1,arr7V),INTERP_KERNEL::Exception);
740   arr7V.resize(3);
741   CPPUNIT_ASSERT_THROW(a2->setSelectedComponents(a1,arr7V),INTERP_KERNEL::Exception);
742   //
743   a6->decrRef();
744   a5->decrRef();
745   a4->decrRef();
746   a3->decrRef();
747   a2->decrRef();
748   a1->decrRef();
749 }
750
751 void MEDCouplingBasicsTest3::testKeepSetSelectedComponent2()
752 {
753   MEDCouplingUMesh *m1=build2DTargetMesh_1();
754   const double arr1[20]={1.,2.,3.,4., 11.,12.,13.,14., 21.,22.,23.,24., 31.,32.,33.,34., 41.,42.,43.,44.};
755   DataArrayDouble *a1=DataArrayDouble::New();
756   a1->alloc(5,4);
757   std::copy(arr1,arr1+20,a1->getPointer());
758   a1->setInfoOnComponent(0,"aaaa");
759   a1->setInfoOnComponent(1,"bbbb");
760   a1->setInfoOnComponent(2,"cccc");
761   a1->setInfoOnComponent(3,"dddd");
762   MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,ONE_TIME);
763   f1->setTime(2.3,4,5);
764   f1->setMesh(m1);
765   f1->setName("f1");
766   f1->setArray(a1);
767   f1->checkCoherency();
768   //
769   const int arr2[6]={1,2,1,2,0,0};
770   std::vector<int> arr2V(arr2,arr2+6);
771   MEDCouplingFieldDouble *f2=f1->keepSelectedComponents(arr2V);
772   CPPUNIT_ASSERT(f2->getMesh()==f1->getMesh());
773   CPPUNIT_ASSERT(f2->getTimeDiscretization()==ONE_TIME);
774   int dt,it;
775   CPPUNIT_ASSERT_DOUBLES_EQUAL(2.3,f2->getTime(dt,it),1e-13);
776   CPPUNIT_ASSERT_EQUAL(4,dt);
777   CPPUNIT_ASSERT_EQUAL(5,it);
778   f2->checkCoherency();
779   CPPUNIT_ASSERT_EQUAL(6,f2->getNumberOfComponents());
780   CPPUNIT_ASSERT_EQUAL(5,f2->getNumberOfTuples());
781   CPPUNIT_ASSERT(std::string(f2->getArray()->getInfoOnComponent(0))=="bbbb");
782   CPPUNIT_ASSERT(std::string(f2->getArray()->getInfoOnComponent(1))=="cccc");
783   CPPUNIT_ASSERT(std::string(f2->getArray()->getInfoOnComponent(2))=="bbbb");
784   CPPUNIT_ASSERT(std::string(f2->getArray()->getInfoOnComponent(3))=="cccc");
785   CPPUNIT_ASSERT(std::string(f2->getArray()->getInfoOnComponent(4))=="aaaa");
786   CPPUNIT_ASSERT(std::string(f2->getArray()->getInfoOnComponent(5))=="aaaa");
787   const double expected1[30]={2.,3.,2.,3.,1.,1., 12.,13.,12.,13.,11.,11., 22.,23.,22.,23.,21.,21., 32.,33.,32.,33.,31.,31., 42.,43.,42.,43.,41.,41.};
788   for(int i=0;i<30;i++)
789     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],f2->getIJ(0,i),1e-14);
790   //setSelectedComponents
791   const int arr3[2]={3,2};
792   std::vector<int> arr3V(arr3,arr3+2);
793   MEDCouplingFieldDouble *f5=f1->keepSelectedComponents(arr3V);
794   f5->setTime(6.7,8,9);
795   f5->getArray()->setInfoOnComponent(0,"eeee");
796   f5->getArray()->setInfoOnComponent(1,"ffff");
797   f5->checkCoherency();
798   const int arr4[2]={1,2};
799   std::vector<int> arr4V(arr4,arr4+2);
800   f2->setSelectedComponents(f5,arr4V);
801   CPPUNIT_ASSERT_EQUAL(6,f2->getNumberOfComponents());
802   CPPUNIT_ASSERT_EQUAL(5,f2->getNumberOfTuples());
803   f2->checkCoherency();
804   CPPUNIT_ASSERT_DOUBLES_EQUAL(2.3,f2->getTime(dt,it),1e-13);
805   CPPUNIT_ASSERT_EQUAL(4,dt);
806   CPPUNIT_ASSERT_EQUAL(5,it);
807   CPPUNIT_ASSERT(std::string(f2->getArray()->getInfoOnComponent(0))=="bbbb");
808   CPPUNIT_ASSERT(std::string(f2->getArray()->getInfoOnComponent(1))=="eeee");
809   CPPUNIT_ASSERT(std::string(f2->getArray()->getInfoOnComponent(2))=="ffff");
810   CPPUNIT_ASSERT(std::string(f2->getArray()->getInfoOnComponent(3))=="cccc");
811   CPPUNIT_ASSERT(std::string(f2->getArray()->getInfoOnComponent(4))=="aaaa");
812   CPPUNIT_ASSERT(std::string(f2->getArray()->getInfoOnComponent(5))=="aaaa");
813   const double expected2[30]={2.,4.,3.,3.,1.,1., 12.,14.,13.,13.,11.,11., 22.,24.,23.,23.,21.,21., 32.,34.,33.,33.,31.,31., 42.,44.,43.,43.,41.,41.};
814   for(int i=0;i<30;i++)
815     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],f2->getIJ(0,i),1e-14);
816   f5->decrRef();
817   f1->decrRef();
818   f2->decrRef();
819   a1->decrRef();
820   m1->decrRef();
821 }
822
823 void MEDCouplingBasicsTest3::testElementaryDAThrowAndSpecialCases()
824 {
825   DataArrayInt *da=DataArrayInt::New();
826   CPPUNIT_ASSERT_THROW(da->checkAllocated(),INTERP_KERNEL::Exception);
827   CPPUNIT_ASSERT_THROW(da->fillWithValue(1),INTERP_KERNEL::Exception);
828   CPPUNIT_ASSERT_THROW(da->iota(1),INTERP_KERNEL::Exception);
829   da->alloc(7,1);
830   da->fillWithValue(11); //11,11,11,11...
831   da->iota(10); //10,11,12,13...
832   
833   DataArrayInt *db=DataArrayInt::New();
834   db->alloc(7,2);
835   
836   DataArrayDouble *dbl2=DataArrayDouble::New();
837   dbl2->alloc(7,2);
838   CPPUNIT_ASSERT_THROW(dbl2->isUniform(10.,1e-15),INTERP_KERNEL::Exception);
839   CPPUNIT_ASSERT_THROW(dbl2->sort(),INTERP_KERNEL::Exception);
840   CPPUNIT_ASSERT_THROW(dbl2->iota(10.),INTERP_KERNEL::Exception);
841   
842   DataArrayDouble *dbl=DataArrayDouble::New();
843   //DataArrayDouble not allocated yet
844   CPPUNIT_ASSERT_THROW(dbl->iota(10.),INTERP_KERNEL::Exception);
845   CPPUNIT_ASSERT_THROW(dbl->isUniform(10.,1e-15),INTERP_KERNEL::Exception);
846   CPPUNIT_ASSERT_THROW(dbl->sort(),INTERP_KERNEL::Exception);
847   CPPUNIT_ASSERT_THROW(dbl->reverse(),INTERP_KERNEL::Exception);
848   CPPUNIT_ASSERT_THROW(dbl->fromNoInterlace(),INTERP_KERNEL::Exception);
849   CPPUNIT_ASSERT_THROW(dbl->toNoInterlace(),INTERP_KERNEL::Exception);
850   
851   dbl->alloc(7,1);
852   dbl->iota(10.);
853   CPPUNIT_ASSERT(!dbl->isUniform(10.,1e-15));
854   dbl->sort();
855   CPPUNIT_ASSERT(dbl->isMonotonic(true, .99));
856   CPPUNIT_ASSERT(dbl->isMonotonic(true, -.99));
857   CPPUNIT_ASSERT(!dbl->isMonotonic(true, 1.1));
858   CPPUNIT_ASSERT(!dbl->isMonotonic(true, -1.1));
859   dbl->reverse();
860   CPPUNIT_ASSERT(dbl->isMonotonic(false, .99));
861   CPPUNIT_ASSERT(!dbl->isMonotonic(false, 1.1));
862   CPPUNIT_ASSERT(!dbl->isMonotonic(false, -1.1));
863   
864   DataArrayInt *dc=DataArrayInt::New();
865   dc->alloc(14,1);
866   
867   DataArrayDouble *dd=DataArrayDouble::New();
868   CPPUNIT_ASSERT_THROW(dd->checkAllocated(),INTERP_KERNEL::Exception);
869   CPPUNIT_ASSERT_THROW(dd->fillWithValue(1.),INTERP_KERNEL::Exception);
870   CPPUNIT_ASSERT_THROW(dd->iota(1.),INTERP_KERNEL::Exception);
871   CPPUNIT_ASSERT(!((dd->repr().find("No data"))==std::string::npos));
872   
873   dd->alloc(0,1); //Allocated but nbOfElements==0!
874   CPPUNIT_ASSERT(!((dd->repr().find("Number of tuples : 0"))==std::string::npos));
875   CPPUNIT_ASSERT(!((dd->repr().find("Empty Data"))==std::string::npos));
876   dd->fillWithValue(11); //?!...
877   dd->iota(10); //?!...
878   CPPUNIT_ASSERT(dd->isMonotonic(true, 1.));
879   CPPUNIT_ASSERT(dd->isMonotonic(false, 1.));
880  
881   CPPUNIT_ASSERT_THROW(db->copyStringInfoFrom(*da),INTERP_KERNEL::Exception);
882   CPPUNIT_ASSERT_THROW(db->copyStringInfoFrom(*da),INTERP_KERNEL::Exception);
883   std::vector<int> cIds(2,2);
884   CPPUNIT_ASSERT_THROW(da->copyPartOfStringInfoFrom(*db,cIds),INTERP_KERNEL::Exception);
885   cIds[0]=1;
886   cIds[0]=-1;
887   CPPUNIT_ASSERT_THROW(da->copyPartOfStringInfoFrom(*db,cIds),INTERP_KERNEL::Exception);
888   
889   std::vector<std::string> info(2,"infoOfOneComponent");
890   CPPUNIT_ASSERT_THROW(da->setInfoOnComponents(info),INTERP_KERNEL::Exception);
891   CPPUNIT_ASSERT_THROW(da->setInfoOnComponent(1,info[0].c_str()),INTERP_KERNEL::Exception);
892   db->setInfoOnComponents(info);
893   
894   CPPUNIT_ASSERT_THROW(da->getInfoOnComponent(-1),INTERP_KERNEL::Exception);
895   CPPUNIT_ASSERT_THROW(da->getInfoOnComponent(2),INTERP_KERNEL::Exception);
896   CPPUNIT_ASSERT(db->getInfoOnComponent(1)==db->getInfoOnComponent(0));
897   CPPUNIT_ASSERT_THROW(db->getVarOnComponent(-1),INTERP_KERNEL::Exception);
898   CPPUNIT_ASSERT_THROW(db->getVarOnComponent(2),INTERP_KERNEL::Exception);
899   CPPUNIT_ASSERT_THROW(db->getUnitOnComponent(-1),INTERP_KERNEL::Exception);
900   CPPUNIT_ASSERT_THROW(db->getUnitOnComponent(2),INTERP_KERNEL::Exception);
901   
902   CPPUNIT_ASSERT(da->GetVarNameFromInfo(std::string("varname unit "))==std::string("varname unit "));
903   CPPUNIT_ASSERT(da->GetVarNameFromInfo(std::string("varname]unit["))==std::string("varname]unit["));
904   CPPUNIT_ASSERT(da->GetVarNameFromInfo(std::string("[unit]"))==std::string());
905   CPPUNIT_ASSERT(da->GetVarNameFromInfo(std::string("varname [unit]"))==std::string("varname"));
906   
907   CPPUNIT_ASSERT(da->GetUnitFromInfo(std::string("varname unit "))==std::string());
908   CPPUNIT_ASSERT(da->GetUnitFromInfo(std::string("varname]unit["))==std::string());
909   CPPUNIT_ASSERT(da->GetUnitFromInfo(std::string("[unit]"))==std::string("unit"));
910   CPPUNIT_ASSERT(da->GetUnitFromInfo(std::string("varname [unit]"))==std::string("unit"));
911   
912   CPPUNIT_ASSERT_THROW(da->checkNbOfTuplesAndComp(*db,"theMessageInThrow"),INTERP_KERNEL::Exception);
913   CPPUNIT_ASSERT_THROW(da->checkNbOfTuplesAndComp(*dc,"theMessageInThrow"),INTERP_KERNEL::Exception);
914   CPPUNIT_ASSERT_THROW(db->checkNbOfTuplesAndComp(*dc,"theMessageInThrow"),INTERP_KERNEL::Exception);
915
916   CPPUNIT_ASSERT_THROW(da->checkNbOfTuplesAndComp(7,2,"theMessageInThrow"),INTERP_KERNEL::Exception);
917   da->checkNbOfTuplesAndComp(7,1,"theMessageInThrow");
918   
919   CPPUNIT_ASSERT_THROW(db->checkNbOfElems(7*2+1,"theMessageInThrow"),INTERP_KERNEL::Exception);
920   db->checkNbOfElems(7*2,"theMessageInThrow");
921   
922   CPPUNIT_ASSERT_THROW(db->GetNumberOfItemGivenBES(10,9,1,"theMessageInThrow"),INTERP_KERNEL::Exception);
923   CPPUNIT_ASSERT_THROW(db->GetNumberOfItemGivenBES(0,1,-1,"theMessageInThrow"),INTERP_KERNEL::Exception);
924   CPPUNIT_ASSERT_EQUAL(10,db->GetNumberOfItemGivenBES(0,10,1,"theMessageInThrow"));
925   CPPUNIT_ASSERT_EQUAL(5,db->GetNumberOfItemGivenBES(0,10,2,"theMessageInThrow"));
926   CPPUNIT_ASSERT_EQUAL(6,db->GetNumberOfItemGivenBES(0,11,2,"theMessageInThrow"));
927   
928   //std::cout<<"\n!!!!!!!!!\n"<<dd->repr()<<"\n!!!!!!!!!\n";
929   CPPUNIT_ASSERT(!((da->repr().find("Number of components : 1"))==std::string::npos));
930   CPPUNIT_ASSERT(!((dd->repr().find("Number of components : 1"))==std::string::npos));
931   CPPUNIT_ASSERT(!((dbl->repr().find("Number of components : 1"))==std::string::npos));
932   
933   CPPUNIT_ASSERT(!((da->reprZip().find("Number of components : 1"))==std::string::npos));
934   CPPUNIT_ASSERT(!((dd->reprZip().find("Number of components : 1"))==std::string::npos));
935   CPPUNIT_ASSERT(!((dbl->reprZip().find("Number of components : 1"))==std::string::npos));
936   
937   std::ostringstream ret;
938   dbl->writeVTK(ret,2,"file.tmp",0);
939   CPPUNIT_ASSERT(!((ret.str().find("<DataArray"))==std::string::npos));
940   CPPUNIT_ASSERT(!((ret.str().find("Float32"))==std::string::npos));
941   CPPUNIT_ASSERT(!((ret.str().find("16 15 14 13 12 11 10"))==std::string::npos));
942   
943   CPPUNIT_ASSERT_THROW(dbl->selectByTupleId2(0,1,-1),INTERP_KERNEL::Exception);
944   CPPUNIT_ASSERT_THROW(dbl->substr(-1,1),INTERP_KERNEL::Exception);
945   CPPUNIT_ASSERT_THROW(dbl->substr(8,1),INTERP_KERNEL::Exception);
946   CPPUNIT_ASSERT_THROW(dbl->substr(0,8),INTERP_KERNEL::Exception);
947   CPPUNIT_ASSERT_THROW(dbl->meldWith(dd),INTERP_KERNEL::Exception);
948   
949   CPPUNIT_ASSERT_THROW(dbl->setPartOfValuesAdv(dbl2,da),INTERP_KERNEL::Exception); //dbl dbl2 not have the same number of components
950   CPPUNIT_ASSERT_THROW(dbl->setPartOfValuesAdv(dd,da),INTERP_KERNEL::Exception);  //da tuple selector DataArrayInt instance not have exactly 2 components
951   
952   DataArrayDouble *dbl3=DataArrayDouble::New();
953   dbl3->alloc(6,2);
954   dbl3->fillWithValue(11.);
955   int tupleId;
956   //bad number of components
957   CPPUNIT_ASSERT_THROW(dbl3->getMaxValue(tupleId),INTERP_KERNEL::Exception);
958   CPPUNIT_ASSERT_THROW(dd->getMaxValue(tupleId),INTERP_KERNEL::Exception);
959   CPPUNIT_ASSERT_THROW(dbl3->getMinValue(tupleId),INTERP_KERNEL::Exception);
960   CPPUNIT_ASSERT_THROW(dd->getMinValue(tupleId),INTERP_KERNEL::Exception);
961   CPPUNIT_ASSERT_THROW(dbl3->getAverageValue(),INTERP_KERNEL::Exception);
962   CPPUNIT_ASSERT_THROW(dd->getAverageValue(),INTERP_KERNEL::Exception);
963   CPPUNIT_ASSERT_THROW(dd->accumulate(100),INTERP_KERNEL::Exception);
964   CPPUNIT_ASSERT_THROW(dbl->fromPolarToCart(),INTERP_KERNEL::Exception);
965   CPPUNIT_ASSERT_THROW(dbl3->fromCylToCart(),INTERP_KERNEL::Exception);
966   CPPUNIT_ASSERT_THROW(dbl3->fromSpherToCart(),INTERP_KERNEL::Exception);
967   CPPUNIT_ASSERT_THROW(dbl3->doublyContractedProduct(),INTERP_KERNEL::Exception);
968   CPPUNIT_ASSERT_THROW(dbl3->determinant(),INTERP_KERNEL::Exception);
969   CPPUNIT_ASSERT_THROW(dbl3->eigenValues(),INTERP_KERNEL::Exception);
970   CPPUNIT_ASSERT_THROW(dbl3->eigenVectors(),INTERP_KERNEL::Exception);
971   CPPUNIT_ASSERT_THROW(dbl3->inverse(),INTERP_KERNEL::Exception);
972   CPPUNIT_ASSERT_THROW(dbl3->trace(),INTERP_KERNEL::Exception);
973   CPPUNIT_ASSERT_THROW(dbl3->deviator(),INTERP_KERNEL::Exception);
974  
975   dbl3->setIJ(5,1,12.);
976   CPPUNIT_ASSERT(dbl3->getMaxValueInArray()==12.);
977   CPPUNIT_ASSERT(dbl3->getMinValueInArray()==11.);
978  
979   db->fillWithValue(100); //bad Ids
980   CPPUNIT_ASSERT_THROW(dbl3->setPartOfValuesAdv(dbl2,db),INTERP_KERNEL::Exception);
981   db->fillWithValue(-1); //bad Ids
982   CPPUNIT_ASSERT_THROW(dbl3->setPartOfValuesAdv(dbl2,db),INTERP_KERNEL::Exception);
983   db->fillWithValue(6); //bad Ids for dbl3
984   CPPUNIT_ASSERT_THROW(dbl3->setPartOfValuesAdv(dbl2,db),INTERP_KERNEL::Exception);
985   
986   DataArrayDouble::SetArrayIn(dbl,dbl3); //dbl->dbl3 memLeaks?
987   dbl3->checkNoNullValues();
988   dbl3->setIJ(6,0,0.);
989   CPPUNIT_ASSERT_THROW(dbl3->checkNoNullValues(),INTERP_KERNEL::Exception);
990   CPPUNIT_ASSERT_THROW(dbl3->applyInv(1.),INTERP_KERNEL::Exception);  //div by zero
991   CPPUNIT_ASSERT_THROW(dbl2->getIdsInRange(1.,2.),INTERP_KERNEL::Exception);
992   std::vector<const DataArrayDouble *> a(0); //input list must be NON EMPTY
993   CPPUNIT_ASSERT_THROW(DataArrayDouble::Aggregate(a),INTERP_KERNEL::Exception);
994   CPPUNIT_ASSERT_THROW(DataArrayDouble::Meld(a),INTERP_KERNEL::Exception);
995   
996   a.push_back(dbl2);
997   a.push_back(dbl); //Nb of components mismatch
998   CPPUNIT_ASSERT_THROW(DataArrayDouble::Aggregate(a),INTERP_KERNEL::Exception);
999   
1000   CPPUNIT_ASSERT_THROW(DataArrayDouble::Dot(dbl2,dbl),INTERP_KERNEL::Exception);
1001   
1002   CPPUNIT_ASSERT_THROW(DataArrayDouble::CrossProduct(dbl2,dbl),INTERP_KERNEL::Exception); //Nb of components mismatch
1003   CPPUNIT_ASSERT_THROW(DataArrayDouble::CrossProduct(dbl2,dbl2),INTERP_KERNEL::Exception); //Nb of components must be equal to 3 
1004   DataArrayDouble *dbl4=DataArrayDouble::New();
1005   dbl4->alloc(6,3);
1006   DataArrayDouble *dbl5=DataArrayDouble::New();
1007   dbl5->alloc(7,3);
1008   CPPUNIT_ASSERT_THROW(DataArrayDouble::CrossProduct(dbl4,dbl5),INTERP_KERNEL::Exception); //Nb of tuples mismatch
1009   
1010   a[0]=dbl4; //Nb of tuple mismatch
1011   a[1]=dbl5; //Nb of tuple mismatch
1012   CPPUNIT_ASSERT_THROW(DataArrayDouble::Meld(a),INTERP_KERNEL::Exception);
1013   CPPUNIT_ASSERT_THROW(DataArrayDouble::Dot(dbl4,dbl5),INTERP_KERNEL::Exception);
1014   
1015   da->decrRef();
1016   db->decrRef();
1017   dbl->decrRef();
1018   dbl2->decrRef();
1019   dbl3->decrRef();
1020   dbl4->decrRef();
1021   dbl5->decrRef();
1022   dc->decrRef();
1023   dd->decrRef();
1024 }
1025
1026 void MEDCouplingBasicsTest3::testDAIGetIdsEqual1()
1027 {
1028   const int tab1[7]={5,-2,-4,-2,3,2,-2};
1029   DataArrayInt *da=DataArrayInt::New();
1030   da->alloc(7,1);
1031   std::copy(tab1,tab1+7,da->getPointer());
1032   DataArrayInt *da2=da->getIdsEqual(-2);
1033   CPPUNIT_ASSERT_EQUAL(3,da2->getNumberOfTuples());
1034   CPPUNIT_ASSERT_EQUAL(1,da2->getNumberOfComponents());
1035   const int expected1[3]={1,3,6};
1036   CPPUNIT_ASSERT(std::equal(expected1,expected1+3,da2->getConstPointer()));
1037   da2->decrRef();
1038   da->decrRef();
1039 }
1040
1041 void MEDCouplingBasicsTest3::testDAIGetIdsEqualList1()
1042 {
1043   const int tab1[7]={5,-2,-4,-2,3,2,-2};
1044   DataArrayInt *da=DataArrayInt::New();
1045   da->alloc(7,1);
1046   std::copy(tab1,tab1+7,da->getPointer());
1047   const int tab2[3]={3,-2,0};
1048   std::vector<int> tab2V(tab2,tab2+3);
1049   DataArrayInt *da2=da->getIdsEqualList(&tab2V[0],&tab2V[0]+tab2V.size());
1050   CPPUNIT_ASSERT_EQUAL(4,da2->getNumberOfTuples());
1051   CPPUNIT_ASSERT_EQUAL(1,da2->getNumberOfComponents());
1052   const int expected1[4]={1,3,4,6};
1053   CPPUNIT_ASSERT(std::equal(expected1,expected1+4,da2->getConstPointer()));
1054   da2->decrRef();
1055   da->decrRef();
1056 }
1057
1058 void MEDCouplingBasicsTest3::testDAFromNoInterlace1()
1059 {
1060   const int tab1[15]={1,11,21,31,41,2,12,22,32,42,3,13,23,33,43};
1061   DataArrayInt *da=DataArrayInt::New();
1062   da->alloc(5,3);
1063   std::copy(tab1,tab1+15,da->getPointer());
1064   DataArrayInt *da2=da->fromNoInterlace();
1065   const int expected1[15]={1,2,3,11,12,13,21,22,23,31,32,33,41,42,43};
1066   CPPUNIT_ASSERT_EQUAL(5,da2->getNumberOfTuples());
1067   CPPUNIT_ASSERT_EQUAL(3,da2->getNumberOfComponents());// it's not a bug. Avoid to have 1 million components !
1068   CPPUNIT_ASSERT(std::equal(expected1,expected1+15,da2->getConstPointer()));
1069   DataArrayDouble *da3=da->convertToDblArr();
1070   DataArrayDouble *da4=da3->fromNoInterlace();
1071   CPPUNIT_ASSERT_EQUAL(5,da4->getNumberOfTuples());
1072   CPPUNIT_ASSERT_EQUAL(3,da4->getNumberOfComponents());// it's not a bug. Avoid to have 1 million components !
1073   for(int i=0;i<15;i++)
1074     CPPUNIT_ASSERT_DOUBLES_EQUAL((double)expected1[i],da4->getIJ(0,i),1e-14);
1075   da4->decrRef();
1076   da3->decrRef();
1077   da2->decrRef();
1078   da->decrRef();
1079 }
1080
1081 void MEDCouplingBasicsTest3::testDAToNoInterlace1()
1082 {
1083   const int tab1[15]={1,2,3,11,12,13,21,22,23,31,32,33,41,42,43};
1084   DataArrayInt *da=DataArrayInt::New();
1085   da->alloc(5,3);
1086   std::copy(tab1,tab1+15,da->getPointer());
1087   DataArrayInt *da2=da->toNoInterlace();
1088   const int expected1[15]={1,11,21,31,41,2,12,22,32,42,3,13,23,33,43};
1089   CPPUNIT_ASSERT_EQUAL(5,da2->getNumberOfTuples());
1090   CPPUNIT_ASSERT_EQUAL(3,da2->getNumberOfComponents());// it's not a bug. Avoid to have 1 million components !
1091   CPPUNIT_ASSERT(std::equal(expected1,expected1+15,da2->getConstPointer()));
1092   DataArrayDouble *da3=da->convertToDblArr();
1093   DataArrayDouble *da4=da3->toNoInterlace();
1094   CPPUNIT_ASSERT_EQUAL(5,da4->getNumberOfTuples());
1095   CPPUNIT_ASSERT_EQUAL(3,da4->getNumberOfComponents());// it's not a bug. Avoid to have 1 million components !
1096   for(int i=0;i<15;i++)
1097     CPPUNIT_ASSERT_DOUBLES_EQUAL((double)expected1[i],da4->getIJ(0,i),1e-14);
1098   da4->decrRef();
1099   da3->decrRef();
1100   da2->decrRef();
1101   da->decrRef();
1102 }
1103
1104 void MEDCouplingBasicsTest3::testDAIsUniform1()
1105 {
1106   const int tab1[5]={1,1,1,1,1};
1107   DataArrayInt *da=DataArrayInt::New();
1108   da->alloc(5,1);
1109   std::copy(tab1,tab1+5,da->getPointer());
1110   CPPUNIT_ASSERT(da->isUniform(1));
1111   da->setIJ(2,0,2);
1112   CPPUNIT_ASSERT(!da->isUniform(1));
1113   da->setIJ(2,0,1);
1114   CPPUNIT_ASSERT(da->isUniform(1));
1115   DataArrayDouble *da2=da->convertToDblArr();
1116   CPPUNIT_ASSERT(da2->isUniform(1.,1e-12));
1117   da2->setIJ(1,0,1.+1.e-13);
1118   CPPUNIT_ASSERT(da2->isUniform(1.,1e-12));
1119   da2->setIJ(1,0,1.+1.e-11);
1120   CPPUNIT_ASSERT(!da2->isUniform(1.,1e-12));
1121   da2->decrRef();
1122   da->decrRef();
1123 }
1124
1125 void MEDCouplingBasicsTest3::testDADFromPolarToCart1()
1126 {
1127   const double tab1[4]={2.,0.2,2.5,0.7};
1128   DataArrayDouble *da=DataArrayDouble::New();
1129   da->alloc(2,2);
1130   std::copy(tab1,tab1+4,da->getPointer());
1131   DataArrayDouble *da2=da->fromPolarToCart();
1132   const double expected1[4]={1.9601331556824833,0.39733866159012243, 1.9121054682112213,1.6105442180942275};
1133   for(int i=0;i<4;i++)
1134     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],da2->getIJ(0,i),1e-13);
1135   da2->decrRef();
1136   da->decrRef();
1137 }
1138
1139 void MEDCouplingBasicsTest3::testDADFromCylToCart1()
1140 {
1141   const double tab1[6]={2.,0.2,4.,2.5,0.7,9.};
1142   DataArrayDouble *da=DataArrayDouble::New();
1143   da->alloc(2,3);
1144   std::copy(tab1,tab1+6,da->getPointer());
1145   DataArrayDouble *da2=da->fromCylToCart();
1146   const double expected1[6]={1.9601331556824833,0.39733866159012243,4., 1.9121054682112213,1.6105442180942275,9.};
1147   for(int i=0;i<6;i++)
1148     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],da2->getIJ(0,i),1e-13);
1149   da2->decrRef();
1150   da->decrRef();
1151 }
1152
1153 void MEDCouplingBasicsTest3::testDADFromSpherToCart1()
1154 {
1155   const double tab1[6]={2.,0.2,0.3,2.5,0.7,0.8};
1156   DataArrayDouble *da=DataArrayDouble::New();
1157   da->alloc(2,3);
1158   std::copy(tab1,tab1+6,da->getPointer());
1159   DataArrayDouble *da2=da->fromSpherToCart();
1160   const double expected1[6]={0.37959212195737485,0.11742160338765303,1.9601331556824833, 1.1220769624465328,1.1553337045129035,1.9121054682112213};
1161   for(int i=0;i<6;i++)
1162     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],da2->getIJ(0,i),1e-13);
1163   da2->decrRef();
1164   da->decrRef();
1165 }
1166
1167 void MEDCouplingBasicsTest3::testUnPolyze1()
1168 {
1169   const int elts[8]={0,1,2,3,4,5,6,7};
1170   std::vector<int> eltsV(elts,elts+8);
1171   MEDCouplingUMesh *mesh=build3DTargetMesh_1();
1172   mesh->convertToPolyTypes(&eltsV[0],&eltsV[0]+eltsV.size());
1173   mesh->unPolyze();
1174   MEDCouplingUMesh *mesh2=build3DTargetMesh_1();
1175   mesh->checkCoherency();
1176   CPPUNIT_ASSERT(mesh->isEqual(mesh2,1e-12));
1177   mesh->convertToPolyTypes(&eltsV[0],&eltsV[0]+eltsV.size());
1178   CPPUNIT_ASSERT(!mesh->isEqual(mesh2,1e-12));
1179   mesh->getNodalConnectivity()->setIJ(0,6,10);
1180   mesh->getNodalConnectivity()->setIJ(0,7,9);
1181   mesh->getNodalConnectivity()->setIJ(0,8,12);
1182   mesh->getNodalConnectivity()->setIJ(0,9,13);
1183   mesh->unPolyze();
1184   CPPUNIT_ASSERT(mesh->isEqual(mesh2,1e-12));
1185   mesh->convertToPolyTypes(&eltsV[0],&eltsV[0]+eltsV.size());
1186   mesh->getNodalConnectivity()->setIJ(0,6,12);
1187   mesh->getNodalConnectivity()->setIJ(0,7,13);
1188   mesh->getNodalConnectivity()->setIJ(0,8,10);
1189   mesh->getNodalConnectivity()->setIJ(0,9,9);
1190   mesh->unPolyze();
1191   CPPUNIT_ASSERT(mesh->isEqual(mesh2,1e-12));
1192   mesh->convertToPolyTypes(&eltsV[0],&eltsV[0]+eltsV.size());
1193   mesh->getNodalConnectivity()->setIJ(0,6,12);
1194   mesh->getNodalConnectivity()->setIJ(0,7,10);
1195   mesh->getNodalConnectivity()->setIJ(0,8,13);
1196   mesh->getNodalConnectivity()->setIJ(0,9,9);
1197   mesh->unPolyze();
1198   CPPUNIT_ASSERT(!mesh->isEqual(mesh2,1e-12));
1199   mesh->decrRef();
1200   mesh2->decrRef();
1201   // Test for 2D mesh
1202   mesh=build2DTargetMesh_1();
1203   mesh2=build2DTargetMesh_1();
1204   eltsV.resize(5);
1205   mesh->convertToPolyTypes(&eltsV[0],&eltsV[0]+eltsV.size());
1206   CPPUNIT_ASSERT(!mesh->isEqual(mesh2,1e-12));
1207   mesh->unPolyze();
1208   CPPUNIT_ASSERT(mesh->isEqual(mesh2,1e-12));
1209   mesh->decrRef();
1210   mesh2->decrRef();
1211 }
1212
1213 void MEDCouplingBasicsTest3::testConvertDegeneratedCells1()
1214 {
1215   MEDCouplingUMesh *mesh=build3DTargetMesh_1();
1216   int conn[32]={0,1,3,3,9,10,12,12, 0,1,3,4,9,9,9,9, 1,1,1,1,10,12,9,10, 10,11,12,9,1,1,1,1};
1217   mesh->allocateCells(4);
1218   mesh->insertNextCell(INTERP_KERNEL::NORM_HEXA8,8,conn);
1219   mesh->insertNextCell(INTERP_KERNEL::NORM_HEXA8,8,conn+8);
1220   mesh->insertNextCell(INTERP_KERNEL::NORM_HEXA8,8,conn+16);
1221   mesh->insertNextCell(INTERP_KERNEL::NORM_HEXA8,8,conn+24);
1222   mesh->finishInsertingCells();
1223   mesh->checkCoherency();
1224   CPPUNIT_ASSERT_EQUAL(4,mesh->getNumberOfCells());
1225   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_HEXA8,mesh->getTypeOfCell(0));
1226   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_HEXA8,mesh->getTypeOfCell(1));
1227   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_HEXA8,mesh->getTypeOfCell(2));
1228   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_HEXA8,mesh->getTypeOfCell(3));
1229   MEDCouplingFieldDouble *f1=mesh->getMeasureField(true);
1230   mesh->convertDegeneratedCells();
1231   mesh->checkCoherency();
1232   MEDCouplingFieldDouble *f2=mesh->getMeasureField(true);
1233   CPPUNIT_ASSERT_EQUAL(4,mesh->getNumberOfCells());
1234   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_PENTA6,mesh->getTypeOfCell(0));
1235   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_PYRA5,mesh->getTypeOfCell(1));
1236   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_TETRA4,mesh->getTypeOfCell(2));
1237   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_PYRA5,mesh->getTypeOfCell(3));
1238   for(int i=0;i<4;i++)
1239     CPPUNIT_ASSERT_DOUBLES_EQUAL(f1->getArray()->getIJ(0,i),f2->getArray()->getIJ(0,i),1e-5);
1240   f1->decrRef();
1241   f2->decrRef();
1242   mesh->decrRef();
1243 }
1244
1245 void MEDCouplingBasicsTest3::testGetNodeIdsNearPoints1()
1246 {
1247   MEDCouplingUMesh *mesh=build2DTargetMesh_1();
1248   DataArrayDouble *coords=mesh->getCoords();
1249   DataArrayDouble *tmp=DataArrayDouble::New();
1250   tmp->alloc(3,2);
1251   const double vals[6]={0.2,0.2,0.1,0.2,0.2,0.2};
1252   std::copy(vals,vals+6,tmp->getPointer());
1253   DataArrayDouble *tmp2=DataArrayDouble::Aggregate(coords,tmp);
1254   tmp->decrRef();
1255   mesh->setCoords(tmp2);
1256   tmp2->decrRef();
1257   const double pts[6]={0.2,0.2,0.1,0.3,-0.3,0.7};
1258   DataArrayInt *c=mesh->getNodeIdsNearPoint(pts,1e-7);
1259   CPPUNIT_ASSERT_EQUAL(3,c->getNumberOfTuples());
1260   CPPUNIT_ASSERT_EQUAL(4,c->getIJ(0,0));
1261   CPPUNIT_ASSERT_EQUAL(9,c->getIJ(1,0));
1262   CPPUNIT_ASSERT_EQUAL(11,c->getIJ(2,0));
1263   c->decrRef();
1264   DataArrayInt *cI=0;
1265   mesh->getNodeIdsNearPoints(pts,3,1e-7,c,cI);
1266   CPPUNIT_ASSERT_EQUAL(4,cI->getNumberOfTuples());
1267   CPPUNIT_ASSERT_EQUAL(4,c->getNumberOfTuples());
1268   CPPUNIT_ASSERT_EQUAL(4,c->getIJ(0,0));
1269   CPPUNIT_ASSERT_EQUAL(9,c->getIJ(1,0));
1270   CPPUNIT_ASSERT_EQUAL(11,c->getIJ(2,0));
1271   CPPUNIT_ASSERT_EQUAL(6,c->getIJ(3,0));
1272   CPPUNIT_ASSERT_EQUAL(0,cI->getIJ(0,0));
1273   CPPUNIT_ASSERT_EQUAL(3,cI->getIJ(1,0));
1274   CPPUNIT_ASSERT_EQUAL(3,cI->getIJ(2,0));
1275   CPPUNIT_ASSERT_EQUAL(4,cI->getIJ(3,0));
1276   c->decrRef();
1277   cI->decrRef();
1278   mesh->decrRef();
1279 }
1280
1281 void MEDCouplingBasicsTest3::testFieldCopyTinyAttrFrom1()
1282 {
1283   MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,ONE_TIME);
1284   f1->setName("f1");
1285   f1->setTimeTolerance(1.e-5);
1286   f1->setDescription("f1Desc");
1287   f1->setTime(1.23,4,5);
1288   MEDCouplingFieldDouble *f2=MEDCouplingFieldDouble::New(ON_CELLS,ONE_TIME);
1289   f2->setName("f2");
1290   f2->setDescription("f2Desc");
1291   f2->setTime(6.78,9,10);
1292   f2->setTimeTolerance(4.556e-12);
1293   //
1294   int dt,it;
1295   f1->copyTinyAttrFrom(f2);
1296   CPPUNIT_ASSERT_DOUBLES_EQUAL(4.556e-12,f1->getTimeTolerance(),1e-24);
1297   CPPUNIT_ASSERT_DOUBLES_EQUAL(6.78,f1->getTime(dt,it),1e-12);
1298   CPPUNIT_ASSERT_EQUAL(9,dt);
1299   CPPUNIT_ASSERT_EQUAL(10,it);
1300   CPPUNIT_ASSERT(std::string(f1->getName())=="f1");//name unchanged
1301   CPPUNIT_ASSERT(std::string(f1->getDescription())=="f1Desc");//description unchanged
1302   f1->decrRef();
1303   f2->decrRef();
1304   //
1305   f1=MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME);
1306   f1->setName("f1");
1307   f1->setTimeTolerance(1.e-5);
1308   f1->setDescription("f1Desc");
1309   f2=MEDCouplingFieldDouble::New(ON_CELLS,NO_TIME);
1310   f2->setName("f2");
1311   f2->setDescription("f2Desc");
1312   f2->setTimeTolerance(4.556e-12);
1313   //
1314   f1->copyTinyAttrFrom(f2);
1315   CPPUNIT_ASSERT_DOUBLES_EQUAL(4.556e-12,f1->getTimeTolerance(),1e-24);
1316   CPPUNIT_ASSERT(std::string(f1->getName())=="f1");//name unchanged
1317   CPPUNIT_ASSERT(std::string(f1->getDescription())=="f1Desc");//description unchanged
1318   f1->decrRef();
1319   f2->decrRef();
1320   //
1321   f1=MEDCouplingFieldDouble::New(ON_CELLS,CONST_ON_TIME_INTERVAL);
1322   f1->setName("f1");
1323   f1->setTimeTolerance(1.e-5);
1324   f1->setDescription("f1Desc");
1325   f1->setTime(1.23,4,5);
1326   f1->setEndTime(5.43,2,1);
1327   f2=MEDCouplingFieldDouble::New(ON_CELLS,CONST_ON_TIME_INTERVAL);
1328   f2->setName("f2");
1329   f2->setDescription("f2Desc");
1330   f2->setTimeTolerance(4.556e-12);
1331   f2->setTime(6.78,9,10);
1332   f2->setEndTime(10.98,7,6);
1333   //
1334   f1->copyTinyAttrFrom(f2);
1335   CPPUNIT_ASSERT_DOUBLES_EQUAL(4.556e-12,f1->getTimeTolerance(),1e-24);
1336   CPPUNIT_ASSERT(std::string(f1->getName())=="f1");//name unchanged
1337   CPPUNIT_ASSERT(std::string(f1->getDescription())=="f1Desc");//description unchanged
1338   CPPUNIT_ASSERT_DOUBLES_EQUAL(6.78,f1->getTime(dt,it),1e-12);
1339   CPPUNIT_ASSERT_EQUAL(9,dt);
1340   CPPUNIT_ASSERT_EQUAL(10,it);
1341   CPPUNIT_ASSERT_DOUBLES_EQUAL(10.98,f1->getEndTime(dt,it),1e-12);
1342   CPPUNIT_ASSERT_EQUAL(7,dt);
1343   CPPUNIT_ASSERT_EQUAL(6,it);
1344   f1->decrRef();
1345   f2->decrRef();
1346   //
1347   f1=MEDCouplingFieldDouble::New(ON_CELLS,LINEAR_TIME);
1348   f1->setName("f1");
1349   f1->setTimeTolerance(1.e-5);
1350   f1->setDescription("f1Desc");
1351   f1->setTime(1.23,4,5);
1352   f1->setEndTime(5.43,2,1);
1353   f2=MEDCouplingFieldDouble::New(ON_CELLS,LINEAR_TIME);
1354   f2->setName("f2");
1355   f2->setDescription("f2Desc");
1356   f2->setTimeTolerance(4.556e-12);
1357   f2->setTime(6.78,9,10);
1358   f2->setEndTime(10.98,7,6);
1359   //
1360   f1->copyTinyAttrFrom(f2);
1361   CPPUNIT_ASSERT_DOUBLES_EQUAL(4.556e-12,f1->getTimeTolerance(),1e-24);
1362   CPPUNIT_ASSERT(std::string(f1->getName())=="f1");//name unchanged
1363   CPPUNIT_ASSERT(std::string(f1->getDescription())=="f1Desc");//description unchanged
1364   CPPUNIT_ASSERT_DOUBLES_EQUAL(6.78,f1->getTime(dt,it),1e-12);
1365   CPPUNIT_ASSERT_EQUAL(9,dt);
1366   CPPUNIT_ASSERT_EQUAL(10,it);
1367   CPPUNIT_ASSERT_DOUBLES_EQUAL(10.98,f1->getEndTime(dt,it),1e-12);
1368   CPPUNIT_ASSERT_EQUAL(7,dt);
1369   CPPUNIT_ASSERT_EQUAL(6,it);
1370   f1->decrRef();
1371   f2->decrRef();
1372 }
1373
1374 /*!
1375  * 1D -> 2D extrusion with rotation
1376  */
1377 void MEDCouplingBasicsTest3::testExtrudedMesh5()
1378 {
1379   const double coo1[4]={0.,1.,2.,3.5};
1380   DataArrayDouble *a=DataArrayDouble::New();
1381   a->alloc(4,1);
1382   std::copy(coo1,coo1+4,a->getPointer());
1383   MEDCouplingCMesh *b=MEDCouplingCMesh::New();
1384   b->setCoordsAt(0,a);
1385   MEDCouplingUMesh *c=b->buildUnstructured();
1386   CPPUNIT_ASSERT_EQUAL(1,c->getSpaceDimension());
1387   c->changeSpaceDimension(2);
1388   //
1389   DataArrayDouble *d=DataArrayDouble::New();
1390   d->alloc(13,1);
1391   d->iota();
1392   MEDCouplingCMesh *ee=MEDCouplingCMesh::New();
1393   ee->setCoordsAt(0,d);
1394   MEDCouplingUMesh *f=ee->buildUnstructured();
1395   DataArrayDouble *g=f->getCoords()->applyFunc(2,"3.5*IVec+x/6*3.14159265359*JVec");
1396   CPPUNIT_ASSERT_THROW(f->getCoords()->applyFunc(2,"3.5*IVec+x/6*3.14159265359*KVec"),INTERP_KERNEL::Exception); // KVec refers to component #2 and there is only 2 components !
1397   DataArrayDouble *h=g->fromPolarToCart();
1398   f->setCoords(h);
1399   MEDCouplingUMesh *i=c->buildExtrudedMesh(f,1);
1400   CPPUNIT_ASSERT_EQUAL(52,i->getNumberOfNodes());
1401   bool tmp2;
1402   int tmp3;
1403   DataArrayInt *tmp=i->mergeNodes(1e-9,tmp2,tmp3);
1404   CPPUNIT_ASSERT(tmp2);
1405   CPPUNIT_ASSERT_EQUAL(37,tmp3);
1406   tmp->decrRef();
1407   i->convertDegeneratedCells();
1408   i->checkCoherency();
1409   CPPUNIT_ASSERT_EQUAL(36,i->getNumberOfCells());
1410   CPPUNIT_ASSERT_EQUAL(37,i->getNumberOfNodes());
1411   CPPUNIT_ASSERT_EQUAL(12,i->getNumberOfCellsWithType(INTERP_KERNEL::NORM_TRI3));
1412   CPPUNIT_ASSERT_EQUAL(24,i->getNumberOfCellsWithType(INTERP_KERNEL::NORM_QUAD4));
1413   const double expected1[3]={0.25,0.75,2.0625};
1414   MEDCouplingFieldDouble *j=i->getMeasureField(true);
1415   for(int ii=0;ii<12;ii++)
1416     for(int k=0;k<3;k++)
1417       CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[k],j->getIJ(0,ii*3+k),1e-10);
1418   const double expected2[72]={0.62200846792814113, 0.16666666666681595, 1.4513530918323276, 0.38888888888923495, 2.6293994326053212, 0.7045454545460802, 0.45534180126145435, 0.45534180126150181, 1.0624642029433926, 1.0624642029435025, 1.9248539780597826, 1.9248539780599816, 0.16666666666661334, 0.62200846792815856, 0.38888888888876294, 1.4513530918323678, 0.70454545454522521, 2.629399432605394, -0.16666666666674007, 0.62200846792812436, -0.38888888888906142, 1.4513530918322881, -0.70454545454576778, 2.6293994326052488, -0.45534180126154766, 0.45534180126140844, -1.0624642029436118, 1.0624642029432834, -1.9248539780601803, 1.9248539780595841, -0.62200846792817499, 0.1666666666665495, -1.451353091832408, 0.388888888888613, -2.6293994326054668, 0.70454545454495332, -0.62200846792810593, -0.16666666666680507, -1.451353091832247, -0.38888888888921297, -2.6293994326051746, -0.70454545454604123, -0.45534180126135926, -0.45534180126159562, -1.0624642029431723, -1.0624642029437235, -1.9248539780593836, -1.9248539780603811, -0.1666666666664828, -0.62200846792819242, -0.38888888888846079, -1.4513530918324489, -0.70454545454467987, -2.6293994326055397, 0.16666666666687083, -0.62200846792808862, 0.38888888888936374, -1.4513530918322073, 0.70454545454631357, -2.6293994326051022, 0.45534180126164348, -0.45534180126131207, 1.0624642029438327, -1.0624642029430627, 1.9248539780605791, -1.9248539780591853, 0.62200846792821063, -0.16666666666641802, 1.4513530918324888, -0.38888888888831086, 2.6293994326056125, -0.70454545454440853};
1419   DataArrayDouble *m=i->getBarycenterAndOwner();
1420   for(int ii=0;ii<72;ii++)
1421     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[ii],m->getIJ(0,ii),1e-10);
1422   //
1423   m->decrRef();
1424   j->decrRef();
1425   i->decrRef();
1426   h->decrRef();
1427   g->decrRef();
1428   f->decrRef();
1429   ee->decrRef();
1430   d->decrRef();
1431   c->decrRef();
1432   b->decrRef();
1433   a->decrRef();
1434 }
1435
1436 /*!
1437  * 1D -> 2D extrusion without rotation
1438  */
1439 void MEDCouplingBasicsTest3::testExtrudedMesh6()
1440 {
1441   const double coo1[4]={0.,1.,2.,3.5};
1442   DataArrayDouble *a=DataArrayDouble::New();
1443   a->alloc(4,1);
1444   std::copy(coo1,coo1+4,a->getPointer());
1445   MEDCouplingCMesh *b=MEDCouplingCMesh::New();
1446   b->setCoordsAt(0,a);
1447   MEDCouplingUMesh *c=b->buildUnstructured();
1448   CPPUNIT_ASSERT_EQUAL(1,c->getSpaceDimension());
1449   c->changeSpaceDimension(2);
1450   //
1451   DataArrayDouble *d=DataArrayDouble::New();
1452   d->alloc(5,1);
1453   d->iota();
1454   MEDCouplingCMesh *e=MEDCouplingCMesh::New();
1455   e->setCoordsAt(0,d);
1456   MEDCouplingUMesh *f=e->buildUnstructured();
1457   DataArrayDouble *d2=f->getCoords()->applyFunc("x*x/2");
1458   f->setCoords(d2);
1459   f->changeSpaceDimension(2);
1460   //
1461   const double center[2]={0.,0.};
1462   f->rotate(center,0,M_PI/3);
1463   MEDCouplingUMesh *g=c->buildExtrudedMesh(f,0);
1464   g->checkCoherency();
1465   const double expected1[]={ 0.4330127018922193, 0.4330127018922193, 0.649519052838329, 1.2990381056766578, 1.299038105676658, 1.948557158514987, 2.1650635094610955, 2.1650635094610964, 3.2475952641916446, 3.031088913245533, 3.0310889132455352, 4.546633369868303 };
1466   MEDCouplingFieldDouble *f1=g->getMeasureField(true);
1467   for(int i=0;i<12;i++)
1468     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],f1->getIJ(0,i),1e-12);
1469   
1470   const double expected2[]={0.625, 0.21650635094610962, 1.625, 0.21650635094610959, 2.8750000000000004, 0.21650635094610965, 1.1250000000000002, 1.0825317547305482, 2.125, 1.0825317547305482, 3.3750000000000004, 1.0825317547305484, 2.125, 2.8145825622994254, 3.125, 2.8145825622994254, 4.375, 2.8145825622994254, 3.6250000000000009, 5.4126587736527414, 4.625, 5.4126587736527414, 5.875, 5.4126587736527414};
1471   DataArrayDouble *f2=g->getBarycenterAndOwner();
1472   for(int i=0;i<24;i++)
1473     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],f2->getIJ(0,i),1e-12);
1474   //
1475   f1->decrRef();
1476   f2->decrRef();
1477   g->decrRef();
1478   f->decrRef();
1479   e->decrRef();
1480   d->decrRef();
1481   d2->decrRef();
1482   c->decrRef();
1483   b->decrRef();
1484   a->decrRef();
1485 }
1486
1487 /*!
1488  * 2D -> 3D extrusion with rotation
1489  */
1490 void MEDCouplingBasicsTest3::testExtrudedMesh7()
1491 {
1492   const double coo1[4]={0.,1.,2.,3.5};
1493   DataArrayDouble *a=DataArrayDouble::New();
1494   a->alloc(4,1);
1495   std::copy(coo1,coo1+4,a->getPointer());
1496   MEDCouplingCMesh *b=MEDCouplingCMesh::New();
1497   b->setCoordsAt(0,a);
1498   MEDCouplingUMesh *c=b->buildUnstructured();
1499   CPPUNIT_ASSERT_EQUAL(1,c->getSpaceDimension());
1500   c->changeSpaceDimension(2);
1501   //
1502   DataArrayDouble *d=DataArrayDouble::New();
1503   d->alloc(13,1);
1504   d->iota();
1505   MEDCouplingCMesh *e=MEDCouplingCMesh::New();
1506   e->setCoordsAt(0,d);
1507   MEDCouplingUMesh *f=e->buildUnstructured();
1508   DataArrayDouble *g=f->getCoords()->applyFunc(2,"3.5*IVec+x/6*3.14159265359*JVec");
1509   DataArrayDouble *h=g->fromPolarToCart();
1510   f->setCoords(h);
1511   MEDCouplingUMesh *i=c->buildExtrudedMesh(f,1);
1512   CPPUNIT_ASSERT_EQUAL(52,i->getNumberOfNodes());
1513   bool tmp2;
1514   int tmp3;
1515   DataArrayInt *tmp=i->mergeNodes(1e-9,tmp2,tmp3);
1516   CPPUNIT_ASSERT(tmp2);
1517   CPPUNIT_ASSERT_EQUAL(37,tmp3);
1518   tmp->decrRef();
1519   i->convertDegeneratedCells();
1520   const double vec1[3]={10.,0.,0.};
1521   i->translate(vec1);
1522   DataArrayDouble *g2=h->applyFunc(3,"13.5/3.5*x*IVec+0*JVec+13.5/3.5*y*KVec");
1523   f->setCoords(g2);
1524   i->changeSpaceDimension(3);
1525   MEDCouplingUMesh *i3=i->buildExtrudedMesh(f,1);
1526   MEDCouplingFieldDouble *f2=i3->getMeasureField(true);
1527   tmp=i->mergeNodes(1e-9,tmp2,tmp3);
1528   CPPUNIT_ASSERT(tmp2);
1529   CPPUNIT_ASSERT_EQUAL(444,tmp3);
1530   tmp->decrRef();
1531   const double expected1[36]={1.327751058489274, 4.2942574094314701, 13.024068164857139, 1.3069177251569044, 4.1484240761012954, 12.297505664866796, 1.270833333332571, 3.8958333333309674, 11.039062499993179, 1.2291666666659207, 3.6041666666644425, 9.585937499993932, 1.1930822748415895, 3.3515759238941376, 8.3274943351204556, 1.1722489415082769, 3.2057425905609289, 7.6009318351210622, 1.1722489415082862, 3.2057425905609884, 7.6009318351213713, 1.1930822748416161, 3.3515759238943001, 8.3274943351212727, 1.2291666666659564, 3.6041666666646734, 9.5859374999950777, 1.2708333333326081, 3.8958333333311868, 11.039062499994293, 1.3069177251569224, 4.1484240761014384, 12.297505664867627, 1.3277510584902354, 4.2942574094346071, 13.024068164866796};
1532   int kk=0;
1533   for(int ii=0;ii<12;ii++)
1534     for(int jj=0;jj<36;jj++,kk++)
1535       CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[jj],f2->getIJ(0,kk),1e-9);
1536   //
1537   f2->decrRef();
1538   i3->decrRef();
1539   g2->decrRef();
1540   i->decrRef();
1541   h->decrRef();
1542   g->decrRef();
1543   f->decrRef();
1544   e->decrRef();
1545   d->decrRef();
1546   c->decrRef();
1547   b->decrRef();
1548   a->decrRef();
1549 }
1550
1551 void MEDCouplingBasicsTest3::testSimplexize1()
1552 {
1553   MEDCouplingUMesh *m=build3DSurfTargetMesh_1();
1554   std::vector<int> v(1);
1555   v[0]=3;
1556   m->convertToPolyTypes(&v[0],&v[0]+v.size());
1557   DataArrayInt *da=m->simplexize(0);
1558   CPPUNIT_ASSERT_EQUAL(7,da->getNumberOfTuples());
1559   CPPUNIT_ASSERT_EQUAL(1,da->getNumberOfComponents());
1560   const int expected2[7]={0,0,1,2,3,4,4};
1561   for(int i=0;i<7;i++)
1562     CPPUNIT_ASSERT_EQUAL(expected2[i],da->getIJ(i,0));
1563   m->checkCoherency();
1564   CPPUNIT_ASSERT_EQUAL(7,m->getNumberOfCells());
1565   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_TRI3,m->getTypeOfCell(0));
1566   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_TRI3,m->getTypeOfCell(1));
1567   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_TRI3,m->getTypeOfCell(2));
1568   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_TRI3,m->getTypeOfCell(3));
1569   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_POLYGON,m->getTypeOfCell(4));
1570   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_TRI3,m->getTypeOfCell(5));
1571   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_TRI3,m->getTypeOfCell(6));
1572   const double expected1[7]={0.125,0.125,0.125,0.125,0.25,0.125,0.125};
1573   MEDCouplingFieldDouble *f=m->getMeasureField(false);
1574   for(int i=0;i<7;i++)
1575     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i]*sqrt(2.),f->getIJ(i,0),1e-10);
1576   std::set<INTERP_KERNEL::NormalizedCellType> types=m->getAllGeoTypes();
1577   CPPUNIT_ASSERT_EQUAL(2,(int)types.size());
1578   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_TRI3,*(types.begin()));
1579   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_POLYGON,*(++(types.begin())));
1580   f->decrRef();
1581   da->decrRef();
1582   m->decrRef();
1583   //
1584   m=build3DSurfTargetMesh_1();
1585   v[0]=3;
1586   m->convertToPolyTypes(&v[0],&v[0]+v.size());
1587   da=m->simplexize(1);
1588   CPPUNIT_ASSERT_EQUAL(7,da->getNumberOfTuples());
1589   CPPUNIT_ASSERT_EQUAL(1,da->getNumberOfComponents());
1590   for(int i=0;i<7;i++)
1591     CPPUNIT_ASSERT_EQUAL(expected2[i],da->getIJ(i,0));
1592   m->checkCoherency();
1593   types=m->getAllGeoTypes();
1594   CPPUNIT_ASSERT_EQUAL(2,(int)types.size());
1595   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_TRI3,*(types.begin()));
1596   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_POLYGON,*(++(types.begin())));
1597   CPPUNIT_ASSERT_EQUAL(7,m->getNumberOfCells());
1598   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_TRI3,m->getTypeOfCell(0));
1599   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_TRI3,m->getTypeOfCell(1));
1600   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_TRI3,m->getTypeOfCell(2));
1601   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_TRI3,m->getTypeOfCell(3));
1602   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_POLYGON,m->getTypeOfCell(4));
1603   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_TRI3,m->getTypeOfCell(5));
1604   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_TRI3,m->getTypeOfCell(6));
1605   f=m->getMeasureField(false);
1606   for(int i=0;i<7;i++)
1607     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i]*sqrt(2.),f->getIJ(i,0),1e-10);
1608   f->decrRef();
1609   da->decrRef();
1610   m->decrRef();
1611 }
1612
1613 void MEDCouplingBasicsTest3::testSimplexize2()
1614 {
1615   MEDCouplingUMesh *m=build3DSurfTargetMesh_1();
1616   std::vector<int> v(1);
1617   v[0]=3;
1618   m->convertToPolyTypes(&v[0],&v[0]+v.size());
1619   MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,ONE_TIME);
1620   f1->setMesh(m);
1621   DataArrayDouble *arr=DataArrayDouble::New();
1622   const double arr1[10]={10.,110.,20.,120.,30.,130.,40.,140.,50.,150.};
1623   arr->alloc(5,2);
1624   std::copy(arr1,arr1+10,arr->getPointer());
1625   f1->setArray(arr);
1626   arr->decrRef();
1627   //
1628   f1->checkCoherency();
1629   CPPUNIT_ASSERT(f1->simplexize(0));
1630   f1->checkCoherency();
1631   const double expected1[14]={10.,110.,10.,110.,20.,120.,30.,130.,40.,140.,50.,150.,50.,150.};
1632   for(int i=0;i<14;i++)
1633     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],f1->getIJ(0,i),1e-10);
1634   CPPUNIT_ASSERT(!f1->simplexize(0));
1635   for(int i=0;i<14;i++)
1636     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],f1->getIJ(0,i),1e-10);
1637   //
1638   f1->decrRef();
1639   m->decrRef();
1640 }
1641
1642 void MEDCouplingBasicsTest3::testDAMeld1()
1643 {
1644   DataArrayDouble *da1=DataArrayDouble::New();
1645   da1->alloc(7,2);
1646   DataArrayDouble *da2=DataArrayDouble::New();
1647   da2->alloc(7,1);
1648   //
1649   da1->fillWithValue(7.);
1650   da2->iota(0.);
1651   DataArrayDouble *da3=da2->applyFunc(3,"10*x*IVec+100*x*JVec+1000*x*KVec");
1652   //
1653   da1->setInfoOnComponent(0,"c0da1");
1654   da1->setInfoOnComponent(1,"c1da1");
1655   da3->setInfoOnComponent(0,"c0da3");
1656   da3->setInfoOnComponent(1,"c1da3");
1657   da3->setInfoOnComponent(2,"c2da3");
1658   //
1659   DataArrayDouble *da1C=da1->deepCpy();
1660   da1->meldWith(da3);
1661   CPPUNIT_ASSERT_EQUAL(5,da1->getNumberOfComponents());
1662   CPPUNIT_ASSERT_EQUAL(7,da1->getNumberOfTuples());
1663   CPPUNIT_ASSERT(da1->getInfoOnComponent(0)=="c0da1");
1664   CPPUNIT_ASSERT(da1->getInfoOnComponent(1)=="c1da1");
1665   CPPUNIT_ASSERT(da1->getInfoOnComponent(2)=="c0da3");
1666   CPPUNIT_ASSERT(da1->getInfoOnComponent(3)=="c1da3");
1667   CPPUNIT_ASSERT(da1->getInfoOnComponent(4)=="c2da3");
1668   //
1669   const double expected1[35]={7.,7.,0.,0.,0., 7.,7.,10.,100.,1000., 7.,7.,20.,200.,2000., 7.,7.,30.,300.,3000., 7.,7.,40.,400.,4000.,7.,7.,50.,500.,5000.,7.,7.,60.,600.,6000.};
1670   for(int i=0;i<35;i++)
1671     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],da1->getIJ(0,i),1e-10);
1672   //
1673   DataArrayInt *dai1=da1C->convertToIntArr();
1674   DataArrayInt *dai3=da3->convertToIntArr();
1675   dai1->meldWith(dai3);
1676   CPPUNIT_ASSERT_EQUAL(5,dai1->getNumberOfComponents());
1677   CPPUNIT_ASSERT_EQUAL(7,dai1->getNumberOfTuples());
1678   CPPUNIT_ASSERT(dai1->getInfoOnComponent(0)=="c0da1");
1679   CPPUNIT_ASSERT(dai1->getInfoOnComponent(1)=="c1da1");
1680   CPPUNIT_ASSERT(dai1->getInfoOnComponent(2)=="c0da3");
1681   CPPUNIT_ASSERT(dai1->getInfoOnComponent(3)=="c1da3");
1682   CPPUNIT_ASSERT(dai1->getInfoOnComponent(4)=="c2da3");
1683   for(int i=0;i<35;i++)
1684     CPPUNIT_ASSERT_EQUAL((int)expected1[i],dai1->getIJ(0,i));
1685   // test of static method DataArrayDouble::meld
1686   DataArrayDouble *da4=DataArrayDouble::Meld(da1C,da3);
1687   CPPUNIT_ASSERT_EQUAL(5,da4->getNumberOfComponents());
1688   CPPUNIT_ASSERT_EQUAL(7,da4->getNumberOfTuples());
1689   CPPUNIT_ASSERT(da4->getInfoOnComponent(0)=="c0da1");
1690   CPPUNIT_ASSERT(da4->getInfoOnComponent(1)=="c1da1");
1691   CPPUNIT_ASSERT(da4->getInfoOnComponent(2)=="c0da3");
1692   CPPUNIT_ASSERT(da4->getInfoOnComponent(3)=="c1da3");
1693   CPPUNIT_ASSERT(da4->getInfoOnComponent(4)=="c2da3");
1694   for(int i=0;i<35;i++)
1695     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],da4->getIJ(0,i),1e-10);
1696   // test of static method DataArrayInt::meld
1697   dai1->decrRef();
1698   dai1=da1C->convertToIntArr();
1699   DataArrayInt *dai4=DataArrayInt::Meld(dai1,dai3);
1700   CPPUNIT_ASSERT_EQUAL(5,dai4->getNumberOfComponents());
1701   CPPUNIT_ASSERT_EQUAL(7,dai4->getNumberOfTuples());
1702   CPPUNIT_ASSERT(dai4->getInfoOnComponent(0)=="c0da1");
1703   CPPUNIT_ASSERT(dai4->getInfoOnComponent(1)=="c1da1");
1704   CPPUNIT_ASSERT(dai4->getInfoOnComponent(2)=="c0da3");
1705   CPPUNIT_ASSERT(dai4->getInfoOnComponent(3)=="c1da3");
1706   CPPUNIT_ASSERT(dai4->getInfoOnComponent(4)=="c2da3");
1707   for(int i=0;i<35;i++)
1708     CPPUNIT_ASSERT_EQUAL((int)expected1[i],dai4->getIJ(0,i));
1709   //
1710   dai4->decrRef();
1711   da4->decrRef();
1712   dai3->decrRef();
1713   dai1->decrRef();
1714   da1C->decrRef();
1715   da1->decrRef();
1716   da2->decrRef();
1717   da3->decrRef();
1718 }
1719
1720 void MEDCouplingBasicsTest3::testFieldMeld1()
1721 {
1722   MEDCouplingUMesh *m=build3DSurfTargetMesh_1();
1723   MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,ONE_TIME);
1724   f1->setMesh(m);
1725   DataArrayDouble *da1=DataArrayDouble::New();
1726   const double arr1[5]={12.,23.,34.,45.,56.};
1727   da1->alloc(5,1);
1728   std::copy(arr1,arr1+5,da1->getPointer());
1729   da1->setInfoOnComponent(0,"aaa");
1730   f1->setArray(da1);
1731   f1->setTime(3.4,2,1);
1732   f1->checkCoherency();
1733   //
1734   MEDCouplingFieldDouble *f2=f1->deepCpy();
1735   f2->setMesh(f1->getMesh());
1736   f2->checkCoherency();
1737   f2->changeNbOfComponents(2,5.);
1738   (*f2)=5.;
1739   f2->getArray()->setInfoOnComponent(0,"bbb");
1740   f2->getArray()->setInfoOnComponent(1,"ccc");
1741   f2->checkCoherency();
1742   //
1743   MEDCouplingFieldDouble *f3=MEDCouplingFieldDouble::MeldFields(f2,f1);
1744   f3->checkCoherency();
1745   CPPUNIT_ASSERT_EQUAL(5,f3->getNumberOfTuples());
1746   CPPUNIT_ASSERT_EQUAL(3,f3->getNumberOfComponents());
1747   CPPUNIT_ASSERT(f3->getArray()->getInfoOnComponent(0)=="bbb");
1748   CPPUNIT_ASSERT(f3->getArray()->getInfoOnComponent(1)=="ccc");
1749   CPPUNIT_ASSERT(f3->getArray()->getInfoOnComponent(2)=="aaa");
1750   const double expected1[15]={5.,5.,12.,5.,5.,23.,5.,5.,34.,5.,5.,45.,5.,5.,56.};
1751   for(int i=0;i<15;i++)
1752     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],f3->getIJ(0,i),1e-12);
1753   int dt,it;
1754   double time=f3->getTime(dt,it);
1755   CPPUNIT_ASSERT_DOUBLES_EQUAL(3.4,time,1e-14);
1756   CPPUNIT_ASSERT_EQUAL(2,dt);
1757   CPPUNIT_ASSERT_EQUAL(1,it);
1758   //
1759   MEDCouplingFieldDouble *f4=f2->buildNewTimeReprFromThis(NO_TIME,false);
1760   MEDCouplingFieldDouble *f5=f1->buildNewTimeReprFromThis(NO_TIME,false);
1761   MEDCouplingFieldDouble *f6=MEDCouplingFieldDouble::MeldFields(f4,f5);
1762   f6->checkCoherency();
1763   CPPUNIT_ASSERT_EQUAL(5,f6->getNumberOfTuples());
1764   CPPUNIT_ASSERT_EQUAL(3,f6->getNumberOfComponents());
1765   CPPUNIT_ASSERT(f6->getArray()->getInfoOnComponent(0)=="bbb");
1766   CPPUNIT_ASSERT(f6->getArray()->getInfoOnComponent(1)=="ccc");
1767   CPPUNIT_ASSERT(f6->getArray()->getInfoOnComponent(2)=="aaa");
1768   for(int i=0;i<15;i++)
1769     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],f6->getIJ(0,i),1e-12);
1770   //
1771   f6->decrRef();
1772   f4->decrRef();
1773   f5->decrRef();
1774   f3->decrRef();
1775   da1->decrRef();
1776   f2->decrRef();
1777   f1->decrRef();
1778   m->decrRef();
1779 }
1780
1781 void MEDCouplingBasicsTest3::testMergeNodes2()
1782 {
1783   MEDCouplingUMesh *m1=build2DTargetMesh_1();
1784   MEDCouplingUMesh *m2=build2DTargetMesh_1();
1785   const double vec[2]={0.002,0.};
1786   m2->translate(vec);
1787   //
1788   std::vector<const MEDCouplingUMesh *> tmp(2);
1789   tmp[0]=m1;
1790   tmp[1]=m2;
1791   MEDCouplingUMesh *m3=MEDCouplingUMesh::MergeUMeshes(tmp);
1792   bool b;
1793   int newNbOfNodes;
1794   DataArrayInt *da=m3->mergeNodes2(0.01,b,newNbOfNodes);
1795   CPPUNIT_ASSERT_EQUAL(9,m3->getNumberOfNodes());
1796   const double expected1[18]={-0.299,-0.3, 0.201,-0.3, 0.701,-0.3, -0.299,0.2, 0.201,0.2, 0.701,0.2, -0.299,0.7, 0.201,0.7, 0.701,0.7};
1797   for(int i=0;i<18;i++)
1798     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],m3->getCoords()->getIJ(0,i),1e-13);
1799   //
1800   da->decrRef();
1801   m3->decrRef();
1802   m1->decrRef();
1803   m2->decrRef();
1804 }
1805
1806 void MEDCouplingBasicsTest3::testMergeField2()
1807 {
1808   MEDCouplingUMesh *m=build2DTargetMesh_1();
1809   MEDCouplingFieldDouble *f1=MEDCouplingFieldDouble::New(ON_CELLS,ONE_TIME);
1810   f1->setMesh(m);
1811   DataArrayDouble *arr=DataArrayDouble::New();
1812   arr->alloc(5,2);
1813   arr->fillWithValue(2.);
1814   f1->setArray(arr);
1815   arr->decrRef();
1816   MEDCouplingFieldDouble *f2=MEDCouplingFieldDouble::New(ON_CELLS,ONE_TIME);
1817   f2->setMesh(m);
1818   arr=DataArrayDouble::New();
1819   arr->alloc(5,2);
1820   arr->fillWithValue(5.);
1821   f2->setArray(arr);
1822   arr->decrRef();
1823   MEDCouplingFieldDouble *f3=MEDCouplingFieldDouble::New(ON_CELLS,ONE_TIME);
1824   f3->setMesh(m);
1825   arr=DataArrayDouble::New();
1826   arr->alloc(5,2);
1827   arr->fillWithValue(7.);
1828   f3->setArray(arr);
1829   arr->decrRef();
1830   //
1831   std::vector<const MEDCouplingFieldDouble *> tmp(3);
1832   tmp[0]=f1; tmp[1]=f2; tmp[2]=f3;
1833   MEDCouplingFieldDouble *f4=MEDCouplingFieldDouble::MergeFields(tmp);
1834   CPPUNIT_ASSERT_EQUAL(15,f4->getMesh()->getNumberOfCells());
1835   const double expected1[30]={2.,2.,2.,2.,2.,2.,2.,2.,2.,2., 5.,5.,5.,5.,5.,5.,5.,5.,5.,5., 7.,7.,7.,7.,7.,7.,7.,7.,7.,7.};
1836   for(int i=0;i<30;i++)
1837     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],f4->getIJ(0,i),1.e-13);
1838   //
1839   f4->decrRef();
1840   f1->decrRef();
1841   f2->decrRef();
1842   f3->decrRef();
1843   m->decrRef();
1844 }
1845
1846 void MEDCouplingBasicsTest3::testDAIBuildComplement1()
1847 {
1848   DataArrayInt *a=DataArrayInt::New();
1849   const int tab[4]={3,1,7,8};
1850   a->alloc(4,1);
1851   std::copy(tab,tab+4,a->getPointer());
1852   DataArrayInt *b=a->buildComplement(12);
1853   CPPUNIT_ASSERT_EQUAL(8,b->getNumberOfTuples());
1854   CPPUNIT_ASSERT_EQUAL(1,b->getNumberOfComponents());
1855   const int expected1[8]={0,2,4,5,6,9,10,11};
1856   for(int i=0;i<8;i++)
1857     CPPUNIT_ASSERT_EQUAL(expected1[i],b->getIJ(0,i));
1858   b->decrRef();
1859   a->decrRef();
1860 }
1861
1862 void MEDCouplingBasicsTest3::testDAIBuildUnion1()
1863 {
1864   DataArrayInt *a=DataArrayInt::New();
1865   const int tab1[4]={3,1,7,8};
1866   a->alloc(4,1);
1867   std::copy(tab1,tab1+4,a->getPointer());
1868   DataArrayInt *c=DataArrayInt::New();
1869   const int tab2[5]={5,3,0,18,8};
1870   c->alloc(5,1);
1871   std::copy(tab2,tab2+5,c->getPointer());
1872   DataArrayInt *b=a->buildUnion(c);
1873   CPPUNIT_ASSERT_EQUAL(7,b->getNumberOfTuples());
1874   CPPUNIT_ASSERT_EQUAL(1,b->getNumberOfComponents());
1875   const int expected1[7]={0,1,3,5,7,8,18};
1876   for(int i=0;i<7;i++)
1877     CPPUNIT_ASSERT_EQUAL(expected1[i],b->getIJ(0,i));
1878   c->decrRef();
1879   b->decrRef();
1880   a->decrRef();
1881 }
1882
1883 void MEDCouplingBasicsTest3::testDAIBuildIntersection1()
1884 {
1885   DataArrayInt *a=DataArrayInt::New();
1886   const int tab1[4]={3,1,7,8};
1887   a->alloc(4,1);
1888   std::copy(tab1,tab1+4,a->getPointer());
1889   DataArrayInt *c=DataArrayInt::New();
1890   const int tab2[5]={5,3,0,18,8};
1891   c->alloc(5,1);
1892   std::copy(tab2,tab2+5,c->getPointer());
1893   DataArrayInt *b=a->buildIntersection(c);
1894   CPPUNIT_ASSERT_EQUAL(2,b->getNumberOfTuples());
1895   CPPUNIT_ASSERT_EQUAL(1,b->getNumberOfComponents());
1896   const int expected1[2]={3,8};
1897   for(int i=0;i<2;i++)
1898     CPPUNIT_ASSERT_EQUAL(expected1[i],b->getIJ(0,i));
1899   c->decrRef();
1900   b->decrRef();
1901   a->decrRef();
1902 }
1903
1904 void MEDCouplingBasicsTest3::testDAIDeltaShiftIndex1()
1905 {
1906   DataArrayInt *a=DataArrayInt::New();
1907   const int tab[7]={1,3,6,7,7,9,15};
1908   a->alloc(7,1);
1909   std::copy(tab,tab+7,a->getPointer());
1910   DataArrayInt *b=a->deltaShiftIndex();
1911   CPPUNIT_ASSERT_EQUAL(6,b->getNumberOfTuples());
1912   CPPUNIT_ASSERT_EQUAL(1,b->getNumberOfComponents());
1913   const int expected1[6]={2,3,1,0,2,6};
1914   for(int i=0;i<6;i++)
1915     CPPUNIT_ASSERT_EQUAL(expected1[i],b->getIJ(0,i));
1916   b->decrRef();
1917   a->decrRef();
1918 }
1919
1920 void MEDCouplingBasicsTest3::testDaDoubleSelectByTupleIdSafe1()
1921 {
1922   DataArrayDouble *a=DataArrayDouble::New();
1923   a->alloc(7,2);
1924   a->setInfoOnComponent(0,"toto");
1925   a->setInfoOnComponent(1,"tata");
1926   const double arr1[14]={1.1,11.1,2.1,12.1,3.1,13.1,4.1,14.1,5.1,15.1,6.1,16.1,7.1,17.1};
1927   std::copy(arr1,arr1+14,a->getPointer());
1928   //
1929   const int arr2[7]={4,2,0,6,5};
1930   DataArrayDouble *b=a->selectByTupleIdSafe(arr2,arr2+5);
1931   CPPUNIT_ASSERT_EQUAL(5,b->getNumberOfTuples());
1932   CPPUNIT_ASSERT_EQUAL(2,b->getNumberOfComponents());
1933   CPPUNIT_ASSERT(std::string(b->getInfoOnComponent(0))=="toto");
1934   CPPUNIT_ASSERT(std::string(b->getInfoOnComponent(1))=="tata");
1935   const double expected1[10]={5.1,15.1,3.1,13.1,1.1,11.1,7.1,17.1,6.1,16.1};
1936   for(int i=0;i<10;i++)
1937     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],b->getIJ(0,i),1e-14);
1938   const int arr4[5]={4,-1,0,6,5};
1939   CPPUNIT_ASSERT_THROW(a->selectByTupleIdSafe(arr4,arr4+5),INTERP_KERNEL::Exception);
1940   const int arr5[5]={4,2,0,6,7};
1941   CPPUNIT_ASSERT_THROW(a->selectByTupleIdSafe(arr5,arr5+5),INTERP_KERNEL::Exception);
1942   b->decrRef();
1943   a->decrRef();
1944   //
1945   DataArrayInt *c=DataArrayInt::New();
1946   c->alloc(7,2);
1947   c->setInfoOnComponent(0,"toto");
1948   c->setInfoOnComponent(1,"tata");
1949   const int arr3[14]={1,11,2,12,3,13,4,14,5,15,6,16,7,17};
1950   std::copy(arr3,arr3+14,c->getPointer());
1951   DataArrayInt *d=c->selectByTupleIdSafe(arr2,arr2+5);
1952   CPPUNIT_ASSERT_EQUAL(5,d->getNumberOfTuples());
1953   CPPUNIT_ASSERT_EQUAL(2,d->getNumberOfComponents());
1954   CPPUNIT_ASSERT(std::string(d->getInfoOnComponent(0))=="toto");
1955   CPPUNIT_ASSERT(std::string(d->getInfoOnComponent(1))=="tata");
1956   const int expected2[10]={5,15,3,13,1,11,7,17,6,16};
1957   for(int i=0;i<10;i++)
1958     CPPUNIT_ASSERT_EQUAL(expected2[i],d->getIJ(0,i));
1959   CPPUNIT_ASSERT_THROW(c->selectByTupleIdSafe(arr4,arr4+5),INTERP_KERNEL::Exception);
1960   CPPUNIT_ASSERT_THROW(c->selectByTupleIdSafe(arr5,arr5+5),INTERP_KERNEL::Exception);
1961   c->decrRef();
1962   d->decrRef();
1963 }
1964
1965 void MEDCouplingBasicsTest3::testAreCellsIncludedIn1()
1966 {
1967   MEDCouplingUMesh *m=build3DSurfTargetMesh_1();
1968   const int pt[2]={1,3};
1969   MEDCouplingUMesh *m2=(MEDCouplingUMesh *)m->buildPartOfMySelf(pt,pt+2,true);
1970   DataArrayInt *tmp;
1971   CPPUNIT_ASSERT(m->areCellsIncludedIn(m2,0,tmp));
1972   CPPUNIT_ASSERT_EQUAL(2,tmp->getNumberOfTuples());
1973   CPPUNIT_ASSERT_EQUAL(1,tmp->getNumberOfComponents());
1974   CPPUNIT_ASSERT_EQUAL(pt[0],tmp->getIJ(0,0));
1975   CPPUNIT_ASSERT_EQUAL(pt[1],tmp->getIJ(0,1));
1976   tmp->decrRef();
1977   CPPUNIT_ASSERT(!m2->areCellsIncludedIn(m,0,tmp));
1978   tmp->decrRef();
1979   m2->decrRef();
1980   m->decrRef();
1981 }
1982
1983 void MEDCouplingBasicsTest3::testDAIBuildSubstraction1()
1984 {
1985   DataArrayInt *a=DataArrayInt::New();
1986   const int aa[]={2,3,6,8,9};
1987   a->alloc(5,1);
1988   std::copy(aa,aa+5,a->getPointer());
1989   DataArrayInt *b=DataArrayInt::New();
1990   const int bb[]={1,3,5,9,11};
1991   b->alloc(5,1);
1992   std::copy(bb,bb+5,b->getPointer());
1993   //
1994   DataArrayInt *c=a->buildSubstraction(b);
1995   CPPUNIT_ASSERT_EQUAL(3,c->getNumberOfTuples());
1996   CPPUNIT_ASSERT_EQUAL(1,c->getNumberOfComponents());
1997   const int expected1[3]={2,6,8};
1998   CPPUNIT_ASSERT(std::equal(expected1,expected1+3,c->getConstPointer()));
1999   //
2000   c->decrRef();
2001   b->decrRef();
2002   a->decrRef();
2003 }
2004
2005 void MEDCouplingBasicsTest3::testBuildOrthogonalField2()
2006 {
2007   MEDCouplingUMesh *m=build2DTargetMesh_1();
2008   DataArrayInt *d1=DataArrayInt::New();
2009   DataArrayInt *d2=DataArrayInt::New();
2010   DataArrayInt *d3=DataArrayInt::New();
2011   DataArrayInt *d4=DataArrayInt::New();
2012   MEDCouplingUMesh *m1=m->buildDescendingConnectivity(d1,d2,d3,d4);
2013   //
2014   MEDCouplingFieldDouble *f1=m1->buildOrthogonalField();
2015   DataArrayDouble *da1=f1->getArray();
2016   CPPUNIT_ASSERT_EQUAL(2,da1->getNumberOfComponents());
2017   CPPUNIT_ASSERT_EQUAL(13,da1->getNumberOfTuples());
2018   //
2019   const double expected1[26]={-1.,0.,0.,1.,1.,0.,0.,-1.,0.707106781186548,0.707106781186548,0.,-1.,0.,1.,1.,0.,0.,1.,1.,0.,-1.,0.,0.,1.,1.,0.};
2020   for(int i=0;i<26;i++)
2021     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],da1->getIJ(0,i),1e-14);
2022   //
2023   f1->decrRef();
2024   m1->decrRef();
2025   d1->decrRef();
2026   d2->decrRef();
2027   d3->decrRef();
2028   d4->decrRef();
2029   m->decrRef();
2030 }
2031
2032 void MEDCouplingBasicsTest3::testUMInsertNextCell1()
2033 {
2034   double targetCoords[18]={-0.3,-0.3, 0.2,-0.3, 0.7,-0.3, -0.3,0.2, 0.2,0.2, 0.7,0.2, -0.3,0.7, 0.2,0.7, 0.7,0.7 };
2035   int targetConn[18]={0,3,4,1, 1,4,2, 4,5,2, 6,7,4,3, 7,8,5,4};
2036   MEDCouplingUMesh *targetMesh=MEDCouplingUMesh::New();
2037   targetMesh->allocateCells(5);
2038   CPPUNIT_ASSERT_THROW(targetMesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,targetConn),INTERP_KERNEL::Exception);
2039   targetMesh->setMeshDimension(2);
2040   targetMesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,targetConn);
2041   CPPUNIT_ASSERT_THROW(targetMesh->insertNextCell(INTERP_KERNEL::NORM_TETRA4,4,targetConn),INTERP_KERNEL::Exception);
2042   CPPUNIT_ASSERT_THROW(targetMesh->insertNextCell(INTERP_KERNEL::NORM_SEG2,2,targetConn),INTERP_KERNEL::Exception);
2043   CPPUNIT_ASSERT_THROW(targetMesh->insertNextCell(INTERP_KERNEL::NORM_POINT1,1,targetConn),INTERP_KERNEL::Exception);
2044   targetMesh->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,targetConn+4);
2045   targetMesh->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,targetConn+7);
2046   targetMesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,targetConn+10);
2047   targetMesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,targetConn+14);
2048   targetMesh->finishInsertingCells();
2049   DataArrayDouble *myCoords=DataArrayDouble::New();
2050   myCoords->alloc(9,2);
2051   std::copy(targetCoords,targetCoords+18,myCoords->getPointer());
2052   targetMesh->setCoords(myCoords);
2053   myCoords->decrRef();
2054   targetMesh->checkCoherency();
2055   targetMesh->decrRef();
2056 }
2057
2058 void MEDCouplingBasicsTest3::testFieldOperatorDivDiffComp1()
2059 {
2060   MEDCouplingUMesh *m=build2DTargetMesh_1();
2061   DataArrayInt *d1=DataArrayInt::New();
2062   DataArrayInt *d2=DataArrayInt::New();
2063   DataArrayInt *d3=DataArrayInt::New();
2064   DataArrayInt *d4=DataArrayInt::New();
2065   MEDCouplingUMesh *m1=m->buildDescendingConnectivity(d1,d2,d3,d4);
2066   //
2067   MEDCouplingFieldDouble *f1=m1->buildOrthogonalField();
2068   const double arr1[13]={2.,3.,4.,5.,6.,7.,8.,9.,10.,11.,12.,13.,14.};
2069   DataArrayDouble *arr=DataArrayDouble::New();
2070   arr->alloc(13,1);
2071   std::copy(arr1,arr1+13,arr->getPointer());
2072   MEDCouplingFieldDouble *f2=MEDCouplingFieldDouble::New(ON_CELLS);
2073   f2->setArray(arr);
2074   f2->setMesh(m1);
2075   f2->checkCoherency();
2076   //
2077   MEDCouplingFieldDouble *f3=(*f1)/(*f2);
2078   CPPUNIT_ASSERT_THROW((*f2)/(*f1),INTERP_KERNEL::Exception);
2079   f3->checkCoherency();
2080   (*f1)/=(*f2);
2081   CPPUNIT_ASSERT(f1->isEqual(f3,1e-10,1e-10));
2082   CPPUNIT_ASSERT_THROW((*f2)/=(*f1),INTERP_KERNEL::Exception);
2083   const double expected1[26]={-0.5, 0.0, 0.0, 0.33333333333333331, 0.25, 0.0, 0.0, -0.20000000000000001, 0.117851130197758, 0.117851130197758, 0.0, -0.14285714285714285, 0.0, 0.125, 0.1111111111111111, 0.0, 0.0, 0.10000000000000001, 0.090909090909090912, 0.0, -0.083333333333333329, 0.0, 0.0, 0.076923076923076927, 0.071428571428571425, 0.0};
2084   for(int i=0;i<26;i++)
2085     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],f3->getIJ(0,i),1e-10);
2086   //
2087   f3->decrRef();
2088   f2->decrRef();
2089   arr->decrRef();
2090   f1->decrRef();
2091   m1->decrRef();
2092   d1->decrRef();
2093   d2->decrRef();
2094   d3->decrRef();
2095   d4->decrRef();
2096   m->decrRef();
2097 }
2098
2099 void MEDCouplingBasicsTest3::testDARearrange1()
2100 {
2101   DataArrayInt *da1=DataArrayInt::New();
2102   da1->alloc(12,1);
2103   da1->iota(0);
2104   const int *ptr=da1->getConstPointer();
2105   //
2106   CPPUNIT_ASSERT_EQUAL((std::size_t)12,da1->getNbOfElems());
2107   CPPUNIT_ASSERT_EQUAL(1,da1->getNumberOfComponents());
2108   CPPUNIT_ASSERT_EQUAL(12,da1->getNumberOfTuples());
2109   da1->rearrange(4);
2110   CPPUNIT_ASSERT(ptr==da1->getConstPointer());
2111   CPPUNIT_ASSERT_EQUAL((std::size_t)12,da1->getNbOfElems());
2112   CPPUNIT_ASSERT_EQUAL(4,da1->getNumberOfComponents());
2113   CPPUNIT_ASSERT_EQUAL(3,da1->getNumberOfTuples());
2114   for(int i=0;i<12;i++)
2115     CPPUNIT_ASSERT_EQUAL(i,da1->getIJ(0,i));
2116   //
2117   da1->rearrange(6);
2118   CPPUNIT_ASSERT(ptr==da1->getConstPointer());
2119   CPPUNIT_ASSERT_EQUAL((std::size_t)12,da1->getNbOfElems());
2120   CPPUNIT_ASSERT_EQUAL(6,da1->getNumberOfComponents());
2121   CPPUNIT_ASSERT_EQUAL(2,da1->getNumberOfTuples());
2122   for(int i=0;i<12;i++)
2123     CPPUNIT_ASSERT_EQUAL(i,da1->getIJ(0,i));
2124   //
2125   CPPUNIT_ASSERT_THROW(da1->rearrange(7),INTERP_KERNEL::Exception);
2126   //
2127   da1->rearrange(12);
2128   CPPUNIT_ASSERT(ptr==da1->getConstPointer());
2129   CPPUNIT_ASSERT_EQUAL((std::size_t)12,da1->getNbOfElems());
2130   CPPUNIT_ASSERT_EQUAL(12,da1->getNumberOfComponents());
2131   CPPUNIT_ASSERT_EQUAL(1,da1->getNumberOfTuples());
2132   for(int i=0;i<12;i++)
2133     CPPUNIT_ASSERT_EQUAL(i,da1->getIJ(0,i));
2134   //
2135   da1->rearrange(3);
2136   CPPUNIT_ASSERT(ptr==da1->getConstPointer());
2137   CPPUNIT_ASSERT_EQUAL((std::size_t)12,da1->getNbOfElems());
2138   CPPUNIT_ASSERT_EQUAL(3,da1->getNumberOfComponents());
2139   CPPUNIT_ASSERT_EQUAL(4,da1->getNumberOfTuples());
2140   for(int i=0;i<12;i++)
2141     CPPUNIT_ASSERT_EQUAL(i,da1->getIJ(0,i));
2142   //double
2143   DataArrayDouble *da2=da1->convertToDblArr();
2144   da1->decrRef();
2145   const double *ptr2=da2->getConstPointer();
2146   //
2147   CPPUNIT_ASSERT_EQUAL((std::size_t)12,da2->getNbOfElems());
2148   CPPUNIT_ASSERT_EQUAL(3,da2->getNumberOfComponents());
2149   CPPUNIT_ASSERT_EQUAL(4,da2->getNumberOfTuples());
2150   da2->rearrange(4);
2151   CPPUNIT_ASSERT(ptr2==da2->getConstPointer());
2152   CPPUNIT_ASSERT_EQUAL((std::size_t)12,da2->getNbOfElems());
2153   CPPUNIT_ASSERT_EQUAL(4,da2->getNumberOfComponents());
2154   CPPUNIT_ASSERT_EQUAL(3,da2->getNumberOfTuples());
2155   for(int i=0;i<12;i++)
2156     CPPUNIT_ASSERT_DOUBLES_EQUAL((double)i,da2->getIJ(0,i),1e-14);
2157   //
2158   da2->rearrange(6);
2159   CPPUNIT_ASSERT(ptr2==da2->getConstPointer());
2160   CPPUNIT_ASSERT_EQUAL((std::size_t)12,da2->getNbOfElems());
2161   CPPUNIT_ASSERT_EQUAL(6,da2->getNumberOfComponents());
2162   CPPUNIT_ASSERT_EQUAL(2,da2->getNumberOfTuples());
2163   for(int i=0;i<12;i++)
2164     CPPUNIT_ASSERT_DOUBLES_EQUAL((double)i,da2->getIJ(0,i),1e-14);
2165   //
2166   CPPUNIT_ASSERT_THROW(da2->rearrange(7),INTERP_KERNEL::Exception);
2167   //
2168   da2->rearrange(1);
2169   CPPUNIT_ASSERT(ptr2==da2->getConstPointer());
2170   CPPUNIT_ASSERT_EQUAL((std::size_t)12,da2->getNbOfElems());
2171   CPPUNIT_ASSERT_EQUAL(1,da2->getNumberOfComponents());
2172   CPPUNIT_ASSERT_EQUAL(12,da2->getNumberOfTuples());
2173   for(int i=0;i<12;i++)
2174     CPPUNIT_ASSERT_DOUBLES_EQUAL((double)i,da2->getIJ(0,i),1e-14);
2175   //
2176   da2->rearrange(3);
2177   CPPUNIT_ASSERT(ptr2==da2->getConstPointer());
2178   CPPUNIT_ASSERT_EQUAL((std::size_t)12,da2->getNbOfElems());
2179   CPPUNIT_ASSERT_EQUAL(3,da2->getNumberOfComponents());
2180   CPPUNIT_ASSERT_EQUAL(4,da2->getNumberOfTuples());
2181   for(int i=0;i<12;i++)
2182     CPPUNIT_ASSERT_DOUBLES_EQUAL((double)i,da2->getIJ(0,i),1e-14);
2183   da2->decrRef();
2184 }
2185
2186 void MEDCouplingBasicsTest3::testGetDifferentValues1()
2187 {
2188   DataArrayInt *da1=DataArrayInt::New();
2189   const int arr[12]={1,2,3,2,2,3,5,1,5,5,2,2};
2190   da1->alloc(4,3);
2191   std::copy(arr,arr+12,da1->getPointer());
2192   DataArrayInt *s=da1->getDifferentValues();
2193   const int expected1[4]={1,2,3,5};
2194   CPPUNIT_ASSERT_EQUAL(4,s->getNumberOfTuples());
2195   CPPUNIT_ASSERT(std::equal(expected1,expected1+4,s->begin()));
2196   da1->decrRef();
2197   s->decrRef();
2198 }
2199
2200 void MEDCouplingBasicsTest3::testDAIBuildPermutationArr1()
2201 {
2202   DataArrayInt *a=DataArrayInt::New();
2203   const int vala[5]={4,5,6,7,8};
2204   a->alloc(5,1);
2205   std::copy(vala,vala+5,a->getPointer());
2206   DataArrayInt *b=DataArrayInt::New();
2207   const int valb[5]={5,4,8,6,7};
2208   b->alloc(5,1);
2209   std::copy(valb,valb+5,b->getPointer());
2210   DataArrayInt *c=a->buildPermutationArr(*b);
2211   const int expect1[5]={1,0,4,2,3};
2212   CPPUNIT_ASSERT_EQUAL(5,c->getNumberOfTuples());
2213   CPPUNIT_ASSERT_EQUAL(1,c->getNumberOfComponents());
2214   CPPUNIT_ASSERT(std::equal(expect1,expect1+5,c->getConstPointer()));
2215   CPPUNIT_ASSERT(a->isEqualWithoutConsideringStrAndOrder(*b));
2216   b->setIJ(0,0,9);
2217   CPPUNIT_ASSERT(!a->isEqualWithoutConsideringStrAndOrder(*b));
2218   CPPUNIT_ASSERT_THROW(a->buildPermutationArr(*b),INTERP_KERNEL::Exception);
2219   a->setIJ(3,0,4);
2220   b->setIJ(0,0,5);
2221   b->setIJ(4,0,4);//;a==[4,5,6,4,8] and b==[5,4,8,6,4]
2222   CPPUNIT_ASSERT(a->isEqualWithoutConsideringStrAndOrder(*b));
2223   c->decrRef();
2224   c=a->buildPermutationArr(*b);
2225   const int expect2[5]={1,3,4,2,3};
2226   CPPUNIT_ASSERT(std::equal(expect2,expect2+5,c->getConstPointer()));
2227   DataArrayDouble *d=b->convertToDblArr();
2228   b->sort();
2229   const int expect3[5]={4,4,5,6,8};
2230   CPPUNIT_ASSERT(std::equal(expect3,expect3+5,b->getConstPointer()));
2231   d->sort();
2232   CPPUNIT_ASSERT_EQUAL(5,d->getNumberOfTuples());
2233   CPPUNIT_ASSERT_EQUAL(1,d->getNumberOfComponents());
2234   for(int i=0;i<5;i++)
2235     CPPUNIT_ASSERT_DOUBLES_EQUAL(double(expect3[i]),d->getIJ(i,0),1e-14);
2236   //
2237   d->decrRef();
2238   c->decrRef();
2239   a->decrRef();
2240   b->decrRef();
2241 }
2242
2243 void MEDCouplingBasicsTest3::testAreCellsIncludedIn2()
2244 {
2245   const char myName[]="Vitoo";
2246   MEDCouplingUMesh *m=build3DSurfTargetMesh_1();
2247   MEDCouplingUMesh *m2=(MEDCouplingUMesh *)m->buildPartOfMySelf(0,0,true);
2248   CPPUNIT_ASSERT_EQUAL(0,m2->getNumberOfCells());
2249   CPPUNIT_ASSERT_EQUAL(3,m2->getSpaceDimension());
2250   CPPUNIT_ASSERT_EQUAL(2,m2->getMeshDimension());
2251   m2->setName(myName);
2252   DataArrayInt *tmp;
2253   CPPUNIT_ASSERT(m->areCellsIncludedIn(m2,0,tmp));
2254   CPPUNIT_ASSERT(std::string(myName)==tmp->getName());
2255   CPPUNIT_ASSERT_EQUAL(0,tmp->getNumberOfTuples());
2256   CPPUNIT_ASSERT_EQUAL(1,tmp->getNumberOfComponents());
2257   m->decrRef();
2258   m2->decrRef();
2259   tmp->decrRef();
2260 }
2261
2262 void MEDCouplingBasicsTest3::testUMeshGetPartBarycenterAndOwner1()
2263 {
2264   MEDCouplingUMesh *m1=build2DTargetMesh_1();
2265   const int part[3]={1,0,4};
2266   DataArrayDouble *b=m1->getPartBarycenterAndOwner(part,part+3);
2267   CPPUNIT_ASSERT_EQUAL(2,b->getNumberOfComponents());
2268   CPPUNIT_ASSERT_EQUAL(3,b->getNumberOfTuples());
2269   const double expected1[6]={0.36666666666666665,-0.13333333333333333,-0.05,-0.05,0.45,0.45};
2270   for(int i=0;i<6;i++)
2271     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],b->getIJ(0,i),1e-14);
2272   b->decrRef();
2273   m1->decrRef();
2274 }
2275
2276 void MEDCouplingBasicsTest3::testUMeshGetPartMeasureField1()
2277 {
2278   MEDCouplingUMesh *m1=build2DTargetMesh_1();
2279   const int part[3]={1,0,4};
2280   DataArrayDouble *b=m1->getPartMeasureField(true,part,part+3);
2281   CPPUNIT_ASSERT_EQUAL(1,b->getNumberOfComponents());
2282   CPPUNIT_ASSERT_EQUAL(3,b->getNumberOfTuples());
2283   const double expected1[3]={0.125,0.25,0.25};
2284   for(int i=0;i<3;i++)
2285     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],b->getIJ(0,i),1e-14);
2286   b->decrRef();
2287   m1->decrRef();
2288 }
2289
2290 void MEDCouplingBasicsTest3::testUMeshBuildPartOrthogonalField1()
2291 {
2292   MEDCouplingUMesh *m1=build2DTargetMesh_1();
2293   m1->changeSpaceDimension(3);
2294   const int part[3]={1,0,4};
2295   MEDCouplingFieldDouble *b=m1->buildPartOrthogonalField(part,part+3);
2296   CPPUNIT_ASSERT_EQUAL(3,b->getArray()->getNumberOfComponents());
2297   CPPUNIT_ASSERT_EQUAL(3,b->getArray()->getNumberOfTuples());
2298   const double expected1[9]={0.,0.,-1.,0.,0.,-1.,0.,0.,-1.};
2299   for(int i=0;i<9;i++)
2300     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected1[i],b->getArray()->getIJ(0,i),1e-14);
2301   b->decrRef();
2302   m1->decrRef();
2303 }
2304
2305 void MEDCouplingBasicsTest3::testUMeshGetTypesOfPart1()
2306 {
2307   MEDCouplingUMesh *m1=build2DTargetMesh_1();
2308   const int part1[]={0,3,4};
2309   std::set<INTERP_KERNEL::NormalizedCellType> s;
2310   s=m1->getTypesOfPart(part1,part1+3);
2311   CPPUNIT_ASSERT(s.size()==1);
2312   CPPUNIT_ASSERT(*s.begin()==INTERP_KERNEL::NORM_QUAD4);
2313   const int part2[]={2,2,2,1};
2314   s=m1->getTypesOfPart(part2,part2+4);
2315   CPPUNIT_ASSERT(s.size()==1);
2316   CPPUNIT_ASSERT(*s.begin()==INTERP_KERNEL::NORM_TRI3);
2317   const int part3[]={3,2,1};
2318   s=m1->getTypesOfPart(part3,part3+3);
2319   CPPUNIT_ASSERT(s.size()==2);
2320   CPPUNIT_ASSERT(*s.begin()==INTERP_KERNEL::NORM_TRI3);
2321   CPPUNIT_ASSERT(*(++s.begin())==INTERP_KERNEL::NORM_QUAD4);
2322   m1->decrRef();
2323 }
2324
2325 void MEDCouplingBasicsTest3::testUMeshKeepCellIdsByType1()
2326 {
2327   MEDCouplingUMesh *m1=build2DTargetMesh_1();
2328   const int part1[3]={0,3,4};
2329   DataArrayInt *a=m1->keepCellIdsByType(INTERP_KERNEL::NORM_TRI3,part1,part1+3);
2330   CPPUNIT_ASSERT_EQUAL(1,a->getNumberOfComponents());
2331   CPPUNIT_ASSERT_EQUAL(0,a->getNumberOfTuples());
2332   a->decrRef();
2333   //
2334   const int part2[5]={3,2,0,2,4};
2335   a=m1->keepCellIdsByType(INTERP_KERNEL::NORM_TRI3,part2,part2+5);
2336   CPPUNIT_ASSERT_EQUAL(1,a->getNumberOfComponents());
2337   CPPUNIT_ASSERT_EQUAL(2,a->getNumberOfTuples());
2338   CPPUNIT_ASSERT_EQUAL(2,a->getIJ(0,0));
2339   CPPUNIT_ASSERT_EQUAL(2,a->getIJ(1,0));
2340   a->decrRef();
2341   //
2342   a=m1->keepCellIdsByType(INTERP_KERNEL::NORM_QUAD4,part2,part2+5);
2343   CPPUNIT_ASSERT_EQUAL(1,a->getNumberOfComponents());
2344   CPPUNIT_ASSERT_EQUAL(3,a->getNumberOfTuples());
2345   CPPUNIT_ASSERT_EQUAL(3,a->getIJ(0,0));
2346   CPPUNIT_ASSERT_EQUAL(0,a->getIJ(1,0));
2347   CPPUNIT_ASSERT_EQUAL(4,a->getIJ(2,0));
2348   //
2349   a->decrRef();
2350   m1->decrRef();
2351 }
2352
2353 void MEDCouplingBasicsTest3::testDAIAggregateMulti1()
2354 {
2355   DataArrayInt *a=DataArrayInt::New();
2356   a->setName("aa");
2357   a->alloc(4,1);
2358   a->iota(0);
2359   a->rearrange(2);
2360   DataArrayInt *b=DataArrayInt::New();
2361   b->setName("bb");
2362   b->alloc(6,1);
2363   b->iota(0);
2364   b->rearrange(2);
2365   //
2366   std::vector<const DataArrayInt *> v(2);
2367   v[0]=a; v[1]=b;
2368   DataArrayInt *c=DataArrayInt::Aggregate(v);
2369   CPPUNIT_ASSERT_EQUAL(5,c->getNumberOfTuples());
2370   CPPUNIT_ASSERT_EQUAL(2,c->getNumberOfComponents());
2371   CPPUNIT_ASSERT(c->getName()=="aa");
2372   const int expect1[10]={0,1,2,3,0,1,2,3,4,5};
2373   for(int i=0;i<10;i++)
2374     CPPUNIT_ASSERT_EQUAL(expect1[i],c->getIJ(0,i));
2375   //
2376   c->decrRef();
2377   a->decrRef();
2378   b->decrRef();
2379 }
2380
2381 void MEDCouplingBasicsTest3::testMergeUMeshes2()
2382 {
2383   MEDCouplingUMesh *m1=build3DSurfTargetMesh_1();
2384   MEDCouplingUMesh *m2=build3DSurfTargetMesh_1();
2385   MEDCouplingUMesh *m3=build3DSurfTargetMesh_1();
2386   //
2387   const int vec1[3]={0,2,3};
2388   MEDCouplingUMesh *m2_2=(MEDCouplingUMesh *)m2->buildPartOfMySelf(vec1,vec1+3,false);
2389   const int vec2[2]={1,1};
2390   MEDCouplingUMesh *m3_2=(MEDCouplingUMesh *)m3->buildPartOfMySelf(vec2,vec2+2,false);
2391   //
2392   std::vector<const MEDCouplingUMesh *> ms(3);
2393   std::vector<const MEDCouplingMesh *> ms2(3);
2394   ms[0]=m1; ms[1]=m2_2; ms[2]=m3_2;
2395   ms2[0]=m1; ms2[1]=m2_2; ms2[2]=m3_2;
2396   //
2397   MEDCouplingUMesh *m4=MEDCouplingUMesh::MergeUMeshes(ms);
2398   m4->checkCoherency();
2399   CPPUNIT_ASSERT_EQUAL(10,m4->getNumberOfCells());
2400   CPPUNIT_ASSERT_EQUAL(20,m4->getNumberOfNodes());
2401   CPPUNIT_ASSERT_EQUAL(45,m4->getMeshLength());
2402   //
2403   MEDCouplingMesh *m4bis=MEDCouplingMesh::MergeMeshes(ms2);
2404   CPPUNIT_ASSERT(m4->isEqual(m4bis,1e-12));
2405   m4bis->decrRef();
2406   //
2407   const int vec3[5]={0,1,2,3,4};
2408   MEDCouplingUMesh *m4_1=(MEDCouplingUMesh *)m4->buildPartOfMySelf(vec3,vec3+5,false);
2409   m4_1->setName(m1->getName().c_str());
2410   CPPUNIT_ASSERT(m4_1->isEqual(m1,1e-12));
2411   m4_1->decrRef();
2412   //
2413   const int vec4[3]={5,6,7};
2414   MEDCouplingUMesh *m4_2=(MEDCouplingUMesh *)m4->buildPartOfMySelf(vec4,vec4+3,false);
2415   DataArrayInt *cellCor=0;
2416   DataArrayInt *nodeCor=0;
2417   m4_2->checkGeoEquivalWith(m2_2,10,1e-12,cellCor,nodeCor);
2418   CPPUNIT_ASSERT(cellCor==0);
2419   CPPUNIT_ASSERT(nodeCor==0);
2420   m4_2->decrRef();
2421   //
2422   const int vec5[2]={8,9};
2423   MEDCouplingUMesh *m4_3=(MEDCouplingUMesh *)m4->buildPartOfMySelf(vec5,vec5+2,false);
2424   CPPUNIT_ASSERT_EQUAL(2,m4_3->getNumberOfCells());
2425   CPPUNIT_ASSERT_EQUAL(3,m4_3->getNumberOfNodes());
2426   m3_2->zipCoords();
2427   m4_3->setName(m3_2->getName().c_str());
2428   CPPUNIT_ASSERT(m4_3->isEqual(m3_2,1e-12));
2429   m4_3->decrRef();
2430   //
2431   m4->decrRef();
2432   m1->decrRef();
2433   m2->decrRef();
2434   m2_2->decrRef();
2435   m3->decrRef();
2436   m3_2->decrRef();
2437 }
2438
2439 void MEDCouplingBasicsTest3::testBuild0DMeshFromCoords1()
2440 {
2441   const double sourceCoords[12]={-0.3,-0.3,0., 0.7,-0.3,0., -0.3,0.7,0., 0.7,0.7,0.};
2442   DataArrayDouble *coo=DataArrayDouble::New();
2443   coo->alloc(4,3);
2444   coo->setName("My0D");
2445   std::copy(sourceCoords,sourceCoords+12,coo->getPointer());
2446   MEDCouplingUMesh *m=MEDCouplingUMesh::Build0DMeshFromCoords(coo);
2447   m->checkCoherency();
2448   CPPUNIT_ASSERT_EQUAL(4,m->getNumberOfNodes());
2449   CPPUNIT_ASSERT_EQUAL(4,m->getNumberOfCells());
2450   CPPUNIT_ASSERT_EQUAL(3,m->getSpaceDimension());
2451   CPPUNIT_ASSERT_EQUAL(0,m->getMeshDimension());
2452   std::set<INTERP_KERNEL::NormalizedCellType> types=m->getAllGeoTypes();
2453   CPPUNIT_ASSERT_EQUAL(1,(int)types.size());
2454   CPPUNIT_ASSERT_EQUAL(INTERP_KERNEL::NORM_POINT1,*types.begin());
2455   for(int i=0;i<4;i++)
2456     {
2457       std::vector<int> conn;
2458       m->getNodeIdsOfCell(i,conn);
2459       CPPUNIT_ASSERT_EQUAL(1,(int)conn.size());
2460       CPPUNIT_ASSERT_EQUAL(i,conn[0]);
2461       CPPUNIT_ASSERT(INTERP_KERNEL::NORM_POINT1==m->getTypeOfCell(i));
2462     }
2463   CPPUNIT_ASSERT(std::string(m->getName())=="My0D");
2464   m->decrRef();
2465   coo->decrRef();
2466 }
2467