Salome HOME
Merge from V6_main 15/03/2013
[modules/med.git] / src / MEDCoupling / Test / MEDCouplingExamplesTest.cxx
1 // Copyright (C) 2007-2012  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.
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 "MEDCouplingBasicsTest.hxx"
22 #include "MEDCouplingUMesh.hxx"
23 #include "MEDCouplingCMesh.hxx"
24 #include "MEDCouplingExtrudedMesh.hxx"
25 #include "MEDCouplingFieldDouble.hxx"
26 #include "MEDCouplingMemArray.hxx"
27 #include "MEDCouplingMultiFields.hxx"
28
29 void CppExample_DataArrayInt_buildPermutationArr()
30 {
31   using namespace ParaMEDMEM;
32   //! [CppSnippet_DataArrayInt_buildPermutationArr_1]
33   DataArrayInt *a=DataArrayInt::New();
34   const int vala[5]={4,5,6,7,8};
35   a->alloc(5,1);
36   std::copy(vala,vala+5,a->getPointer());
37   DataArrayInt *b=DataArrayInt::New();
38   const int valb[5]={5,4,8,6,7};
39   b->alloc(5,1);
40   std::copy(valb,valb+5,b->getPointer());
41   DataArrayInt *c=a->buildPermutationArr(*b);
42   //! [CppSnippet_DataArrayInt_buildPermutationArr_1]
43   const int expect1[5]={1,0,4,2,3};
44   CPPUNIT_ASSERT_EQUAL(5,c->getNumberOfTuples());
45   CPPUNIT_ASSERT_EQUAL(1,c->getNumberOfComponents());
46   CPPUNIT_ASSERT(std::equal(expect1,expect1+5,c->getConstPointer()));
47   CPPUNIT_ASSERT(a->isEqualWithoutConsideringStrAndOrder(*b));
48   a->decrRef();
49   b->decrRef();
50   c->decrRef();
51 }
52
53 void CppExample_DataArrayInt_invertArrayO2N2N2O()
54 {
55   using namespace ParaMEDMEM;
56   //! [CppSnippet_DataArrayInt_invertArrayO2N2N2O_1]
57   const int arr1[6]={2,0,4,1,5,3};
58   DataArrayInt *da=DataArrayInt::New();
59   da->alloc(6,1);
60   std::copy(arr1,arr1+6,da->getPointer());
61   DataArrayInt *da2=da->invertArrayO2N2N2O(6);
62   const int expected1[6]={1,3,0,5,2,4};
63   for(int i=0;i<6;i++)
64     CPPUNIT_ASSERT_EQUAL(expected1[i],da2->getIJ(i,0));
65   //! [CppSnippet_DataArrayInt_invertArrayO2N2N2O_1]
66   da->decrRef();
67   da2->decrRef();
68 }
69
70 void CppExample_DataArrayInt_invertArrayN2O2O2N()
71 {
72   using namespace ParaMEDMEM;
73   //! [CppSnippet_DataArrayInt_invertArrayN2O2O2N_1]
74   const int arr1[6]={2,0,4,1,5,3};
75   DataArrayInt *da=DataArrayInt::New();
76   da->alloc(6,1);
77   std::copy(arr1,arr1+6,da->getPointer());
78   DataArrayInt *da2=da->invertArrayN2O2O2N(6);
79   const int expected1[6]={1,3,0,5,2,4};
80   for(int i=0;i<6;i++)
81     CPPUNIT_ASSERT_EQUAL(expected1[i],da2->getIJ(i,0));
82   //! [CppSnippet_DataArrayInt_invertArrayN2O2O2N_1]
83   da->decrRef();
84   da2->decrRef();
85 }
86
87 void CppExample_DataArrayDouble_getIdsInRange()
88 {
89   using namespace ParaMEDMEM;
90   //! [CppSnippet_DataArrayDouble_getIdsInRange_1]
91   DataArrayDouble *da=DataArrayDouble::New();
92   da->alloc(10,1);
93   da->iota();
94
95   DataArrayInt* da2 = da->getIdsInRange( 2.5, 6 );
96   //! [CppSnippet_DataArrayDouble_getIdsInRange_1]
97   da->decrRef();
98   da2->decrRef();
99 }
100
101 void CppExample_DataArrayDouble_findCommonTuples()
102 {
103   using namespace ParaMEDMEM;
104   //! [CppSnippet_DataArrayDouble_findCommonTuples1]
105   DataArrayDouble *da=DataArrayDouble::New();
106   da->alloc(6,2);
107   const double array2[12]={2.3,2.3, // 0
108                            1.2,1.2, // 1
109                            1.3,1.3, // 2
110                            2.3,2.3, // 3
111                            2.301,   // 4
112                            2.301,   // 5
113                            0.8,0.8};// 6
114   std::copy(array2,array2+12,da->getPointer());
115   //! [CppSnippet_DataArrayDouble_findCommonTuples1]
116   //! [CppSnippet_DataArrayDouble_findCommonTuples2]
117   DataArrayInt *c=0,*cI=0;
118   da->findCommonTuples(1e-1,-1,c,cI);
119
120   const int expected3[5]={0,3,4,1,2};
121   const int expected4[3]={0,3,5};
122   CPPUNIT_ASSERT(std::equal(expected3,expected3+5,c->getConstPointer()));
123   CPPUNIT_ASSERT(std::equal(expected4,expected4+3,cI->getConstPointer()));
124   c->decrRef();
125   cI->decrRef();
126   da->decrRef();
127   //! [CppSnippet_DataArrayDouble_findCommonTuples2]
128 }
129
130 void CppExample_DataArrayDouble_Meld1()
131 {
132   using namespace ParaMEDMEM;
133   //! [CppSnippet_DataArrayDouble_Meld1_1]
134   const int sameNbTuples = 7;
135
136   DataArrayDouble *da1=DataArrayDouble::New();
137   da1->alloc(sameNbTuples,2);
138   da1->fillWithValue(7.);
139   da1->setInfoOnComponent(0,"c0da1");
140   da1->setInfoOnComponent(1,"c1da1");
141
142   DataArrayDouble *da2=DataArrayDouble::New();
143   da2->alloc(sameNbTuples,1);
144   da2->iota(0.);
145   da2->setInfoOnComponent(0,"c0da2");
146
147   da1->meldWith(da2);
148   //! [CppSnippet_DataArrayDouble_Meld1_1]
149   //! [CppSnippet_DataArrayDouble_Meld1_2]
150   da1->decrRef();
151   da2->decrRef();
152   //! [CppSnippet_DataArrayDouble_Meld1_2]
153 }
154
155 void CppExample_DataArrayInt_Meld1()
156 {
157   using namespace ParaMEDMEM;
158   //! [CppSnippet_DataArrayInt_Meld1_1]
159   const int sameNbTuples = 7;
160
161   DataArrayInt *da1=DataArrayInt::New();
162   da1->alloc(sameNbTuples,2);
163   da1->fillWithValue(7);
164   da1->setInfoOnComponent(0,"c0da1");
165   da1->setInfoOnComponent(1,"c1da1");
166
167   DataArrayInt *da2=DataArrayInt::New();
168   da2->alloc(sameNbTuples,1);
169   da2->iota(0);
170   da2->setInfoOnComponent(0,"c0da2");
171
172   da1->meldWith(da2);
173   //! [CppSnippet_DataArrayInt_Meld1_1]
174   //! [CppSnippet_DataArrayInt_Meld1_2]
175   da1->decrRef();
176   da2->decrRef();
177   //! [CppSnippet_DataArrayInt_Meld1_2]
178 }
179
180 void CppExampleFieldDoubleBuildSubPart1()
181 {
182   //! [CppSnippetFieldDoubleBuildSubPart1_1]
183   ParaMEDMEM::MEDCouplingUMesh *mesh1=ParaMEDMEM::MEDCouplingBasicsTest::build2DTargetMesh_1();
184   ParaMEDMEM::MEDCouplingFieldDouble *f1=ParaMEDMEM::MEDCouplingFieldDouble::New(ParaMEDMEM::ON_CELLS,ParaMEDMEM::ONE_TIME);
185   f1->setTime(2.3,5,6);
186   f1->setMesh(mesh1);
187   ParaMEDMEM::DataArrayDouble *array=ParaMEDMEM::DataArrayDouble::New();
188   array->alloc(mesh1->getNumberOfCells(),2);
189   const double arr1[10]={3.,103.,4.,104.,5.,105.,6.,106.,7.,107.};
190   std::copy(arr1,arr1+10,array->getPointer());
191   f1->setArray(array);
192   array->decrRef();
193   //! [CppSnippetFieldDoubleBuildSubPart1_1]
194   //! [CppSnippetFieldDoubleBuildSubPart1_2]
195   const int part1[3]={2,1,4};
196   ParaMEDMEM::MEDCouplingFieldDouble *f2=f1->buildSubPart(part1,part1+3);
197   //! [CppSnippetFieldDoubleBuildSubPart1_2]
198   f2->zipCoords();
199   CPPUNIT_ASSERT_EQUAL(3,f2->getMesh()->getNumberOfCells());
200   CPPUNIT_ASSERT_EQUAL(6,f2->getMesh()->getNumberOfNodes());
201   CPPUNIT_ASSERT_EQUAL(2,f2->getMesh()->getSpaceDimension());
202   CPPUNIT_ASSERT_EQUAL(2,f2->getMesh()->getMeshDimension());
203   ParaMEDMEM::MEDCouplingUMesh *m2C=dynamic_cast<ParaMEDMEM::MEDCouplingUMesh *>(const_cast<ParaMEDMEM::MEDCouplingMesh *>(f2->getMesh()));
204   CPPUNIT_ASSERT_EQUAL(13,m2C->getMeshLength());
205   const double expected2[12]={0.2, -0.3, 0.7, -0.3, 0.2, 0.2, 0.7, 0.2, 0.2, 0.7, 0.7, 0.7};
206   for(int i=0;i<12;i++)
207     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],m2C->getCoords()->getIJ(0,i),1.e-12);
208   const double expected3[13]={3,2,3,1,3,0,2,1,4,4,5,3,2};
209   CPPUNIT_ASSERT(std::equal(expected3,expected3+13,m2C->getNodalConnectivity()->getConstPointer()));
210   const double expected4[4]={0,4,8,13};
211   CPPUNIT_ASSERT(std::equal(expected4,expected4+4,m2C->getNodalConnectivityIndex()->getConstPointer()));
212   f2->decrRef();
213   f1->decrRef();
214   //! [CppSnippetFieldDoubleBuildSubPart1_3]
215   f1=ParaMEDMEM::MEDCouplingFieldDouble::New(ParaMEDMEM::ON_NODES,ParaMEDMEM::ONE_TIME);
216   f1->setTime(2.3,5,6);
217   f1->setMesh(mesh1);
218   array=ParaMEDMEM::DataArrayDouble::New();
219   array->alloc(mesh1->getNumberOfNodes(),2);
220   const double arr2[18]={3.,103.,4.,104.,5.,105.,6.,106.,7.,107.,8.,108.,9.,109.,10.,110.,11.,111.};
221   std::copy(arr2,arr2+18,array->getPointer());  
222   f1->setArray(array);
223   array->decrRef();
224   //! [CppSnippetFieldDoubleBuildSubPart1_3]
225   //! [CppSnippetFieldDoubleBuildSubPart1_4]
226   const int part2[2]={1,2};
227   f2=f1->buildSubPart(part2,part2+2);
228   //! [CppSnippetFieldDoubleBuildSubPart1_4]
229   f2->decrRef();
230   //idem previous because nodes of cell#4 are not fully present in part3 
231   const int part3[2]={1,2};
232   ParaMEDMEM::DataArrayInt *arrr=ParaMEDMEM::DataArrayInt::New();
233   arrr->alloc(2,1);
234   std::copy(part3,part3+2,arrr->getPointer());
235   f2=f1->buildSubPart(arrr);
236   arrr->decrRef();
237   f2->decrRef();
238   //
239   const int part4[3]={1,2,4};
240   f2=f1->buildSubPart(part4,part4+3);
241   f2->decrRef();
242   //
243   f1->decrRef();
244   mesh1->decrRef();
245   return;
246 }
247
248 void CppSnippetUMeshStdBuild1()
249 {
250   //! [CppSnippetUMeshStdBuild1_1]
251   double coords[27]={-0.3,-0.3,0.,   0.2,-0.3,0.,   0.7,-0.3,0.,   -0.3,0.2,0.,   0.2,0.2,0., 
252                      0.7,0.2,0.,    -0.3,0.7,0.,    0.2,0.7,0.,     0.7,0.7,0. };
253   int nodalConnPerCell[18]={0,3,4,1, 1,4,2, 4,5,2, 6,7,4,3, 7,8,5,4};
254   //! [CppSnippetUMeshStdBuild1_1]
255   //! [CppSnippetUMeshStdBuild1_2]
256   ParaMEDMEM::MEDCouplingUMesh *mesh=ParaMEDMEM::MEDCouplingUMesh::New("My2DMesh",2);
257   //! [CppSnippetUMeshStdBuild1_2]
258   //! [CppSnippetUMeshStdBuild1_3]
259   mesh->allocateCells(5);//You can put more than 5 if you want but not less.
260   mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,nodalConnPerCell);
261   mesh->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,nodalConnPerCell+4);
262   mesh->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,nodalConnPerCell+7);
263   mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,nodalConnPerCell+10);
264   mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,nodalConnPerCell+14);
265   mesh->finishInsertingCells();
266   //! [CppSnippetUMeshStdBuild1_3]
267   //! [CppSnippetUMeshStdBuild1_4]
268   ParaMEDMEM::DataArrayDouble *myCoords=ParaMEDMEM::DataArrayDouble::New();
269   myCoords->alloc(9,3);//here myCoords are declared to have 3 components, mesh will deduce that its spaceDim==3. 
270   std::copy(coords,coords+27,myCoords->getPointer());
271   mesh->setCoords(myCoords);//myCorrds contains 9 tuples, that is to say mesh contains 9 nodes.
272   myCoords->decrRef();
273   //! [CppSnippetUMeshStdBuild1_4]
274   mesh->checkCoherency();
275   //! [CppSnippetUMeshStdBuild1_5]
276   mesh->decrRef();
277   //! [CppSnippetUMeshStdBuild1_5]
278 }
279
280 void CppSnippetCMeshStdBuild1()
281 {
282   //! [CppSnippetCMeshStdBuild1_1]
283   double XCoords[9]={-0.3,0.,0.1,0.3,0.45,0.47,0.49,1.,1.22};
284   double YCoords[7]={0.,0.1,0.37,0.45,0.47,0.49,1.007};
285   ParaMEDMEM::DataArrayDouble *arrX=ParaMEDMEM::DataArrayDouble::New();
286   arrX->alloc(9,1);
287   std::copy(XCoords,XCoords+9,arrX->getPointer());
288   arrX->setInfoOnComponent(0,"X [m]");
289   ParaMEDMEM::DataArrayDouble *arrY=ParaMEDMEM::DataArrayDouble::New();
290   arrY->alloc(7,1);
291   std::copy(YCoords,YCoords+7,arrY->getPointer());
292   arrY->setInfoOnComponent(0,"Y [m]");
293   //! [CppSnippetCMeshStdBuild1_1]
294   //! [CppSnippetCMeshStdBuild1_2]
295   ParaMEDMEM::MEDCouplingCMesh *mesh=ParaMEDMEM::MEDCouplingCMesh::New("My2D_CMesh");
296   mesh->setCoords(arrX,arrY);
297   arrX->decrRef();
298   arrY->decrRef();
299   //! [CppSnippetCMeshStdBuild1_2]
300   //! [CppSnippetCMeshStdBuild1_3]
301   CPPUNIT_ASSERT_EQUAL(8*6,mesh->getNumberOfCells());
302   CPPUNIT_ASSERT_EQUAL(9*7,mesh->getNumberOfNodes());
303   CPPUNIT_ASSERT_EQUAL(2,mesh->getSpaceDimension());
304   CPPUNIT_ASSERT_EQUAL(2,mesh->getMeshDimension());
305   //! [CppSnippetCMeshStdBuild1_3]
306   mesh->decrRef();
307   mesh=ParaMEDMEM::MEDCouplingCMesh::New("My2D_CMesh");
308   arrX=ParaMEDMEM::DataArrayDouble::New(); arrX->alloc(9,1); std::copy(XCoords,XCoords+9,arrX->getPointer()); arrX->setInfoOnComponent(0,"X [m]");
309   arrY=ParaMEDMEM::DataArrayDouble::New(); arrY->alloc(7,1); std::copy(YCoords,YCoords+7,arrY->getPointer()); arrY->setInfoOnComponent(0,"Y [m]");
310   //! [CppSnippetCMeshStdBuild1_2bis]
311   mesh->setCoordsAt(0,arrX);
312   arrX->decrRef();
313   mesh->setCoordsAt(1,arrY);
314   arrY->decrRef();
315   //! [CppSnippetCMeshStdBuild1_2bis]
316   CPPUNIT_ASSERT_EQUAL(8*6,mesh->getNumberOfCells());
317   CPPUNIT_ASSERT_EQUAL(9*7,mesh->getNumberOfNodes());
318   CPPUNIT_ASSERT_EQUAL(2,mesh->getSpaceDimension());
319   CPPUNIT_ASSERT_EQUAL(2,mesh->getMeshDimension());
320   //! [CppSnippetCMeshStdBuild1_4]
321   mesh->decrRef();
322   //! [CppSnippetCMeshStdBuild1_4]
323 }
324
325 void CppSnippetUMeshAdvBuild1()
326 {
327   //! [CppSnippetUMeshAdvBuild1_1]
328   double coords[27]={-0.3,-0.3,0.,   0.2,-0.3,0.,   0.7,-0.3,0.,   -0.3,0.2,0.,   0.2,0.2,0., 
329                      0.7,0.2,0.,    -0.3,0.7,0.,    0.2,0.7,0.,     0.7,0.7,0. };
330   int nodalConnPerCell[23]={4,0,3,4,1, 3,1,4,2, 3,4,5,2, 4,6,7,4,3, 4,7,8,5,4};
331   int nodalConnPerCellIndex[6]={0,5,9,13,18,23};
332   //! [CppSnippetUMeshAdvBuild1_1]
333   //! [CppSnippetUMeshAdvBuild1_2]
334   ParaMEDMEM::MEDCouplingUMesh *mesh=ParaMEDMEM::MEDCouplingUMesh::New("My2DMesh",2);
335   //! [CppSnippetUMeshAdvBuild1_2]
336   //! [CppSnippetUMeshAdvBuild1_3]
337   ParaMEDMEM::DataArrayInt *nodalConn=ParaMEDMEM::DataArrayInt::New();
338   nodalConn->alloc(23,1);
339   std::copy(nodalConnPerCell,nodalConnPerCell+23,nodalConn->getPointer());
340   ParaMEDMEM::DataArrayInt *nodalConnI=ParaMEDMEM::DataArrayInt::New();
341   nodalConnI->alloc(6,1);
342   std::copy(nodalConnPerCellIndex,nodalConnPerCellIndex+6,nodalConnI->getPointer());
343   mesh->setConnectivity(nodalConn,nodalConnI,true);
344   nodalConn->decrRef();// nodalConn DataArrayInt instance is owned by mesh after call to setConnectivity method. No more need here -> decrRef()
345   nodalConnI->decrRef();// nodalConnI DataArrayInt instance is owned by mesh after call to setConnectivity method. No more need here -> decrRef()
346   //! [CppSnippetUMeshAdvBuild1_3]
347   //! [CppSnippetUMeshAdvBuild1_4]
348   ParaMEDMEM::DataArrayDouble *myCoords=ParaMEDMEM::DataArrayDouble::New();
349   myCoords->alloc(9,3);//here myCoords are declared to have 3 components, mesh will deduce that its spaceDim==3. 
350   std::copy(coords,coords+27,myCoords->getPointer());
351   mesh->setCoords(myCoords);//myCorrds contains 9 tuples, that is to say mesh contains 9 nodes.
352   myCoords->decrRef();
353   //! [CppSnippetUMeshAdvBuild1_4]
354   mesh->checkCoherency();
355   //! [CppSnippetUMeshAdvBuild1_5]
356   mesh->decrRef();
357   //! [CppSnippetUMeshAdvBuild1_5]
358 }
359
360 void CppSnippetDataArrayBuild1()
361 {
362   //! [CppSnippetDataArrayBuild1_0]
363   const int nbOfNodes=12;
364   double coords[3*nbOfNodes]={2.,3.,4.,3.,4.,5.,4.,5.,6.,5.,6.,7.,6.,7.,8.,7.,8.,9.,8.,9.,10.,9.,10.,11.,10.,11.,12.,11.,12.,13.,12.,13.,14.,13.,14.,15.};
365   //
366   ParaMEDMEM::DataArrayDouble *myCoords=0;
367   double *tmp=0;
368   //! [CppSnippetDataArrayBuild1_0]
369   //
370   //! [CppSnippetDataArrayBuild1_1]
371   myCoords=ParaMEDMEM::DataArrayDouble::New();
372   myCoords->useArray(coords,false,ParaMEDMEM::CPP_DEALLOC,nbOfNodes,3);
373   //now use myCoords as you need
374   //...
375   //myCoords is no more useful here : release it
376   myCoords->decrRef();
377   //! [CppSnippetDataArrayBuild1_1]
378   //! [CppSnippetDataArrayBuild1_2]
379   myCoords=ParaMEDMEM::DataArrayDouble::New();
380   tmp=new double[3*nbOfNodes];
381   std::copy(coords,coords+3*nbOfNodes,tmp);
382   myCoords->useArray(tmp,true,ParaMEDMEM::CPP_DEALLOC,nbOfNodes,3);
383   //now use myCoords as you need
384   //...
385   //myCoords is no more useful, release it
386   myCoords->decrRef();
387   //! [CppSnippetDataArrayBuild1_2]
388   //! [CppSnippetDataArrayBuild1_3]
389   myCoords=ParaMEDMEM::DataArrayDouble::New();
390   tmp=(double *)malloc(3*nbOfNodes*sizeof(double));
391   std::copy(coords,coords+3*nbOfNodes,tmp);
392   myCoords->useArray(tmp,true,ParaMEDMEM::C_DEALLOC,nbOfNodes,3);
393   //now use myCoords as you need
394   //...
395   //myCoords is no more useful here : release it
396   myCoords->decrRef();
397   //! [CppSnippetDataArrayBuild1_3]
398   //! [CppSnippetDataArrayBuild1_4]
399   myCoords=ParaMEDMEM::DataArrayDouble::New();
400   myCoords->alloc(nbOfNodes,3);
401   tmp=myCoords->getPointer();
402   std::copy(coords,coords+3*nbOfNodes,tmp);
403   myCoords->declareAsNew();//you have modified data pointed by internal pointer notify object
404   //now use myCoords as you need
405   //...
406   //myCoords is no more useful here : release it
407   myCoords->decrRef();
408   //! [CppSnippetDataArrayBuild1_4]
409   myCoords=ParaMEDMEM::DataArrayDouble::New();
410   myCoords->alloc(nbOfNodes,3);
411   tmp=myCoords->getPointer();
412   std::copy(coords,coords+3*nbOfNodes,tmp);
413   ParaMEDMEM::DataArrayDouble *myCoordsCpy=0;
414   //! [CppSnippetDataArrayBuild1_5]
415   myCoordsCpy=myCoords->deepCpy();
416   //! [CppSnippetDataArrayBuild1_5]
417   //! [CppSnippetDataArrayBuild1_6]
418   CPPUNIT_ASSERT(myCoordsCpy->isEqual(*myCoords,1e-12));
419   myCoordsCpy->setIJ(0,0,1000.);
420   CPPUNIT_ASSERT(!myCoordsCpy->isEqual(*myCoords,1e-12));//myCoordsCpy only has been modified
421   //! [CppSnippetDataArrayBuild1_6]
422   //! [CppSnippetDataArrayBuild1_7]
423   myCoordsCpy->decrRef();
424   //! [CppSnippetDataArrayBuild1_7]
425   //! [CppSnippetDataArrayBuild1_5bis]
426   myCoordsCpy=myCoords->performCpy(true);
427   //! [CppSnippetDataArrayBuild1_5bis]
428   CPPUNIT_ASSERT(myCoordsCpy->isEqual(*myCoords,1e-12));
429   myCoordsCpy->setIJ(0,0,1000.);
430   CPPUNIT_ASSERT(!myCoordsCpy->isEqual(*myCoords,1e-12));//myCoordsCpy only has been modified
431   myCoordsCpy->decrRef();
432   //! [CppSnippetDataArrayBuild1_8]
433   myCoordsCpy=myCoords->performCpy(false);
434   //! [CppSnippetDataArrayBuild1_8]
435   //! [CppSnippetDataArrayBuild1_9]
436   CPPUNIT_ASSERT(myCoordsCpy->isEqual(*myCoords,1e-12));
437   myCoordsCpy->setIJ(0,0,1000.);
438   CPPUNIT_ASSERT(myCoordsCpy->isEqual(*myCoords,1e-12));//myCoords and myCoordsCpy have been modified simultaneously
439   //! [CppSnippetDataArrayBuild1_9]
440   //! [CppSnippetDataArrayBuild1_10]
441   myCoordsCpy->decrRef();
442   //! [CppSnippetDataArrayBuild1_10]
443   //! [CppSnippetDataArrayBuild1_11]
444   myCoordsCpy=ParaMEDMEM::DataArrayDouble::New();
445   //! [CppSnippetDataArrayBuild1_11]
446   //! [CppSnippetDataArrayBuild1_12]
447   myCoordsCpy->cpyFrom(*myCoords);
448   //! [CppSnippetDataArrayBuild1_12]
449   //! [CppSnippetDataArrayBuild1_13]
450   CPPUNIT_ASSERT(myCoordsCpy->isEqual(*myCoords,1e-12));
451   myCoordsCpy->setIJ(0,0,2000.);
452   CPPUNIT_ASSERT(!myCoordsCpy->isEqual(*myCoords,1e-12));//myCoordsCpy only has been modified
453   //! [CppSnippetDataArrayBuild1_13]
454   //! [CppSnippetDataArrayBuild1_14]
455   myCoordsCpy->decrRef();
456   //! [CppSnippetDataArrayBuild1_14]
457   myCoords->decrRef();
458   //! [CppSnippetDataArrayBuild1_14]
459 }
460
461 void CppSnippetFieldDoubleBuild1()
462 {
463   double XCoords[9]={-0.3,0.07,0.1,0.3,0.45,0.47,0.49,1.,1.22};
464   double YCoords[7]={0.07,0.1,0.37,0.45,0.47,0.49,1.007};
465   ParaMEDMEM::DataArrayDouble *arrX=ParaMEDMEM::DataArrayDouble::New(); arrX->alloc(9,1); std::copy(XCoords,XCoords+9,arrX->getPointer()); arrX->setInfoOnComponent(0,"X [m]");
466   ParaMEDMEM::DataArrayDouble *arrY=ParaMEDMEM::DataArrayDouble::New(); arrY->alloc(7,1); std::copy(YCoords,YCoords+7,arrY->getPointer()); arrY->setInfoOnComponent(0,"Y [m]"); 
467   ParaMEDMEM::MEDCouplingCMesh *mesh=ParaMEDMEM::MEDCouplingCMesh::New("My2D_CMesh");
468   mesh->setCoords(arrX,arrY); arrX->decrRef(); arrY->decrRef();
469   //! [CppSnippetFieldDoubleBuild1_1]
470   ParaMEDMEM::MEDCouplingFieldDouble* fieldOnCells=ParaMEDMEM::MEDCouplingFieldDouble::New(ParaMEDMEM::ON_CELLS,ParaMEDMEM::NO_TIME);
471   fieldOnCells->setName("MyTensorFieldOnCellNoTime");
472   fieldOnCells->setMesh(mesh);
473   mesh->decrRef(); // no more need of mesh because mesh has been attached to fieldOnCells
474   ParaMEDMEM::DataArrayDouble *array=ParaMEDMEM::DataArrayDouble::New();
475   array->alloc(fieldOnCells->getMesh()->getNumberOfCells(),9);//Implicitely fieldOnCells will be a 9 components field.
476   array->fillWithValue(7.);
477   fieldOnCells->setArray(array);
478   array->decrRef();
479   // fieldOnCells is now usable
480   // ...
481   // fieldOnCells is no more useful here : release it
482   fieldOnCells->decrRef();
483   //! [CppSnippetFieldDoubleBuild1_1]
484   arrX=ParaMEDMEM::DataArrayDouble::New(); arrX->alloc(9,1); std::copy(XCoords,XCoords+9,arrX->getPointer()); arrX->setInfoOnComponent(0,"X [m]");
485   arrY=ParaMEDMEM::DataArrayDouble::New(); arrY->alloc(7,1); std::copy(YCoords,YCoords+7,arrY->getPointer()); arrY->setInfoOnComponent(0,"Y [m]"); 
486   mesh=ParaMEDMEM::MEDCouplingCMesh::New("My2D_CMesh");
487   mesh->setCoords(arrX,arrY); arrX->decrRef(); arrY->decrRef();
488   //! [CppSnippetFieldDoubleBuild1_2]
489   ParaMEDMEM::MEDCouplingFieldDouble *f1=mesh->fillFromAnalytic(ParaMEDMEM::ON_CELLS,1,"x*x+y*y*3+2.*x");//f1 is scalar
490   ParaMEDMEM::MEDCouplingFieldDouble *f2=mesh->fillFromAnalytic(ParaMEDMEM::ON_CELLS,1,"cos(x+y/x)");//f2 is scalar too
491   ParaMEDMEM::MEDCouplingFieldDouble *f2bis=mesh->fillFromAnalytic(ParaMEDMEM::ON_CELLS,2,"x*x*IVec+3*y*JVec");//f2bis is a vectors field
492   ParaMEDMEM::MEDCouplingFieldDouble *f3=(*f1)+(*f2);//f3 scalar
493   ParaMEDMEM::MEDCouplingFieldDouble *f4=(*f3)/(*f2);//f4 scalar
494   f2bis->applyFunc(1,"sqrt(x*x+y*y)");//f2bis becomes scalar
495   ParaMEDMEM::MEDCouplingFieldDouble *f5=(*f2bis)*(*f4);//f5 scalar
496   const double pos1[2]={0.48,0.38};
497   double res;
498   f4->getValueOn(pos1,&res);//f4 is scalar so the returned value is of size 1.
499   // ...
500   //! [CppSnippetFieldDoubleBuild1_2]
501   mesh->decrRef();
502   //! [CppSnippetFieldDoubleBuild1_3]
503   // f1, f2, f2bis, f3, f4, f5 are no more useful here : release them
504   f1->decrRef();
505   f2->decrRef();
506   f2bis->decrRef();
507   f3->decrRef();
508   f4->decrRef();
509   f5->decrRef();
510   //! [CppSnippetFieldDoubleBuild1_3]
511 }
512
513 void CppSnippetFieldDoubleBuild2()
514 {
515   double XCoords[9]={-0.3,0.,0.1,0.3,0.45,0.47,0.49,1.,1.22};
516   double YCoords[7]={0.,0.1,0.37,0.45,0.47,0.49,1.007};
517   ParaMEDMEM::DataArrayDouble *arrX=ParaMEDMEM::DataArrayDouble::New(); arrX->alloc(9,1); std::copy(XCoords,XCoords+9,arrX->getPointer()); arrX->setInfoOnComponent(0,"X [m]");
518   ParaMEDMEM::DataArrayDouble *arrY=ParaMEDMEM::DataArrayDouble::New(); arrY->alloc(7,1); std::copy(YCoords,YCoords+7,arrY->getPointer()); arrY->setInfoOnComponent(0,"Y [m]"); 
519   ParaMEDMEM::MEDCouplingCMesh *mesh=ParaMEDMEM::MEDCouplingCMesh::New("My2D_CMesh");
520   mesh->setCoords(arrX,arrY); arrX->decrRef(); arrY->decrRef();
521   //! [CppSnippetFieldDoubleBuild2_1]
522   ParaMEDMEM::MEDCouplingFieldDouble* fieldOnNodes=ParaMEDMEM::MEDCouplingFieldDouble::New(ParaMEDMEM::ON_NODES,ParaMEDMEM::NO_TIME);
523   fieldOnNodes->setName("MyScalarFieldOnNodeNoTime");
524   fieldOnNodes->setMesh(mesh);
525   mesh->decrRef(); // no more need of mesh because mesh has been attached to fieldOnNodes
526   ParaMEDMEM::DataArrayDouble *array=ParaMEDMEM::DataArrayDouble::New();
527   array->alloc(fieldOnNodes->getMesh()->getNumberOfNodes(),1);//Implicitely fieldOnNodes will be a 1 component field.
528   array->fillWithValue(8.);
529   fieldOnNodes->setArray(array);
530   array->decrRef();
531   // fieldOnNodes is now usable
532   // ...
533   // fieldOnNodes is no more useful here : release it
534   fieldOnNodes->decrRef();
535   //! [CppSnippetFieldDoubleBuild2_1]
536 }
537
538 void CppSnippetFieldDoubleBuild3()
539 {
540   double XCoords[9]={-0.3,0.,0.1,0.3,0.45,0.47,0.49,1.,1.22};
541   double YCoords[7]={0.,0.1,0.37,0.45,0.47,0.49,1.007};
542   ParaMEDMEM::DataArrayDouble *arrX=ParaMEDMEM::DataArrayDouble::New(); arrX->alloc(9,1); std::copy(XCoords,XCoords+9,arrX->getPointer()); arrX->setInfoOnComponent(0,"X [m]");
543   ParaMEDMEM::DataArrayDouble *arrY=ParaMEDMEM::DataArrayDouble::New(); arrY->alloc(7,1); std::copy(YCoords,YCoords+7,arrY->getPointer()); arrY->setInfoOnComponent(0,"Y [m]"); 
544   ParaMEDMEM::MEDCouplingCMesh *mesh=ParaMEDMEM::MEDCouplingCMesh::New("My2D_CMesh");
545   mesh->setCoords(arrX,arrY); arrX->decrRef(); arrY->decrRef();
546   //! [CppSnippetFieldDoubleBuild3_1]
547   ParaMEDMEM::MEDCouplingFieldDouble* fieldOnCells=ParaMEDMEM::MEDCouplingFieldDouble::New(ParaMEDMEM::ON_CELLS,ParaMEDMEM::ONE_TIME);
548   fieldOnCells->setName("MyTensorFieldOnCellNoTime");
549   fieldOnCells->setTimeUnit("ms"); // Time unit is ms.
550   fieldOnCells->setTime(4.22,2,-1); // Time attached is 4.22 ms, iteration id is 2 and order id (or sub iteration id) is -1
551   fieldOnCells->setMesh(mesh);
552   mesh->decrRef(); // no more need of mesh because mesh has been attached to fieldOnCells
553   ParaMEDMEM::DataArrayDouble *array=ParaMEDMEM::DataArrayDouble::New();
554   array->alloc(fieldOnCells->getMesh()->getNumberOfCells(),2);//Implicitely fieldOnCells will be a 2 components field.
555   array->fillWithValue(7.);
556   fieldOnCells->setArray(array);
557   array->decrRef();
558   // fieldOnCells is now usable
559   // ...
560   // fieldOnCells is no more useful here : release it
561   fieldOnCells->decrRef();
562   //! [CppSnippetFieldDoubleBuild3_1]
563 }
564
565 void CppSnippetFieldDoubleBuild4()
566 {
567   double XCoords[9]={-0.3,0.,0.1,0.3,0.45,0.47,0.49,1.,1.22};
568   double YCoords[7]={0.,0.1,0.37,0.45,0.47,0.49,1.007};
569   ParaMEDMEM::DataArrayDouble *arrX=ParaMEDMEM::DataArrayDouble::New(); arrX->alloc(9,1); std::copy(XCoords,XCoords+9,arrX->getPointer()); arrX->setInfoOnComponent(0,"X [m]");
570   ParaMEDMEM::DataArrayDouble *arrY=ParaMEDMEM::DataArrayDouble::New(); arrY->alloc(7,1); std::copy(YCoords,YCoords+7,arrY->getPointer()); arrY->setInfoOnComponent(0,"Y [m]"); 
571   ParaMEDMEM::MEDCouplingCMesh *mesh=ParaMEDMEM::MEDCouplingCMesh::New("My2D_CMesh");
572   mesh->setCoords(arrX,arrY); arrX->decrRef(); arrY->decrRef();
573   //! [CppSnippetFieldDoubleBuild4_1]
574   ParaMEDMEM::MEDCouplingFieldDouble* fieldOnNodes=ParaMEDMEM::MEDCouplingFieldDouble::New(ParaMEDMEM::ON_NODES,ParaMEDMEM::CONST_ON_TIME_INTERVAL);
575   fieldOnNodes->setName("MyVecFieldOnNodeWithConstTime");
576   fieldOnNodes->setTimeUnit("ms"); // Time unit is ms.
577   fieldOnNodes->setStartTime(4.22,2,-1);
578   fieldOnNodes->setEndTime(6.44,4,-1); // fieldOnNodes is defined in interval [4.22 ms,6.44 ms] 
579   fieldOnNodes->setMesh(mesh);
580   mesh->decrRef(); // no more need of mesh because mesh has been attached to fieldOnNodes
581   ParaMEDMEM::DataArrayDouble *array=ParaMEDMEM::DataArrayDouble::New();
582   array->alloc(fieldOnNodes->getMesh()->getNumberOfNodes(),3);//Implicitely fieldOnNodes will be a 3 components field.
583   array->fillWithValue(8.);
584   fieldOnNodes->setArray(array);
585   array->decrRef();
586   // fieldOnNodes is now usable
587   // ...
588   // fieldOnNodes is no more useful here : release it
589   fieldOnNodes->decrRef();
590   //! [CppSnippetFieldDoubleBuild4_1]
591 }
592
593 int main(int argc, char *argv[])
594 {
595   CppExample_DataArrayInt_buildPermutationArr();
596   CppExample_DataArrayInt_invertArrayO2N2N2O();
597   CppExample_DataArrayInt_invertArrayN2O2O2N();
598   CppExample_DataArrayDouble_getIdsInRange();
599   CppExample_DataArrayDouble_findCommonTuples();
600   CppExample_DataArrayDouble_Meld1();
601   CppExampleFieldDoubleBuildSubPart1();
602   CppSnippetUMeshStdBuild1();
603   CppSnippetUMeshAdvBuild1();
604   CppSnippetDataArrayBuild1();
605   CppSnippetCMeshStdBuild1();
606   CppSnippetFieldDoubleBuild1();
607   CppSnippetFieldDoubleBuild2();
608   CppSnippetFieldDoubleBuild3();
609   CppSnippetFieldDoubleBuild4();
610   return 0;
611 }