Salome HOME
Merge from V6_main 01/04/2013
[modules/med.git] / src / MEDCoupling / Test / MEDCouplingExamplesTest.cxx
1 // Copyright (C) 2007-2013  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
30 void CppExample_MEDCouplingPointSet_scale()
31 {
32   using namespace ParaMEDMEM;
33   //! [CppSnippet_MEDCouplingPointSet_scale_1]
34   double coords[4*2]={0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0}; // 2D coordinates of 4 nodes
35   DataArrayDouble *coordsArr=DataArrayDouble::New();
36   coordsArr->useExternalArrayWithRWAccess(coords, 4,2);
37   MEDCouplingUMesh *mesh=MEDCouplingUMesh::New();
38   mesh->setCoords(coordsArr);
39   DataArrayDouble *initCoords = coordsArr->deepCpy();
40   //! [CppSnippet_MEDCouplingPointSet_scale_1]
41   //! [CppSnippet_MEDCouplingPointSet_scale_2]
42   const double center[2] = {0.,0.};
43   const double factor = 2.;
44   mesh->scale( center, factor );
45   //! [CppSnippet_MEDCouplingPointSet_scale_2]
46   //! [CppSnippet_MEDCouplingPointSet_scale_3]
47   const DataArrayDouble * coordsArr2 = mesh->getCoords();
48   CPPUNIT_ASSERT( coordsArr2->isEqualWithoutConsideringStr( *initCoords, 1.0 ));
49   CPPUNIT_ASSERT( !coordsArr2->isEqualWithoutConsideringStr( *initCoords, 0.9 ));
50   // release data
51   mesh->decrRef();
52   coordsArr->decrRef();
53   initCoords->decrRef();
54   //! [CppSnippet_MEDCouplingPointSet_scale_3]
55 }
56
57 void CppExample_MEDCouplingPointSet_translate()
58 {
59   using namespace ParaMEDMEM;
60   //! [CppSnippet_MEDCouplingPointSet_translate_1]
61   double coords[4*2]={0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0}; // 2D coordinates of 4 nodes
62   DataArrayDouble *coordsArr=DataArrayDouble::New();
63   coordsArr->useExternalArrayWithRWAccess(coords, 4,2);
64   MEDCouplingUMesh *mesh=MEDCouplingUMesh::New();
65   mesh->setCoords(coordsArr);
66   DataArrayDouble *initCoords = coordsArr->deepCpy();
67   //! [CppSnippet_MEDCouplingPointSet_translate_1]
68   //! [CppSnippet_MEDCouplingPointSet_translate_2]
69   double vector[2] = {1.,1.};
70   mesh->translate( vector );
71   //! [CppSnippet_MEDCouplingPointSet_translate_2]
72   //! [CppSnippet_MEDCouplingPointSet_translate_3]
73   const DataArrayDouble * coordsArr2 = mesh->getCoords();
74   CPPUNIT_ASSERT( coordsArr2->isEqualWithoutConsideringStr( *initCoords, 1.0 ));
75   CPPUNIT_ASSERT( !coordsArr2->isEqualWithoutConsideringStr( *initCoords, 0.9 ));
76   // release data
77   mesh->decrRef();
78   coordsArr->decrRef();
79   initCoords->decrRef();
80   //! [CppSnippet_MEDCouplingPointSet_translate_3]
81 }
82
83 void CppExample_MEDCouplingPointSet_rotate()
84 {
85   using namespace ParaMEDMEM;
86   //! [CppSnippet_MEDCouplingPointSet_rotate_1]
87   double coords[4*2]={0.0,0.0, 0.1,0.0, 0.1,0.1, 0.0,0.1}; // 2D coordinates of 4 nodes
88   DataArrayDouble *coordsArr=DataArrayDouble::New();
89   coordsArr->useExternalArrayWithRWAccess(coords, 4,2);
90   MEDCouplingUMesh *mesh=MEDCouplingUMesh::New();
91   mesh->setCoords(coordsArr);
92   //! [CppSnippet_MEDCouplingPointSet_rotate_1]
93   //! [CppSnippet_MEDCouplingPointSet_rotate_2]
94   double center[3] = {0.,0.,0.}; // it suits for 2D as well
95   double vector[3] = {0.,0.,1.}; // it is not used in 2D
96   mesh->rotate( center, vector, -M_PI/2);
97   //! [CppSnippet_MEDCouplingPointSet_rotate_2]
98   //! [CppSnippet_MEDCouplingPointSet_rotate_3]
99   mesh->changeSpaceDimension(3);
100   mesh->rotate( center, vector, +M_PI/2);
101   //! [CppSnippet_MEDCouplingPointSet_rotate_3]
102   //! [CppSnippet_MEDCouplingPointSet_rotate_4]
103   mesh->changeSpaceDimension(2);
104   const DataArrayDouble * coordsArr2 = mesh->getCoords();
105   CPPUNIT_ASSERT( coordsArr2->isEqualWithoutConsideringStr( *coordsArr, 1e-13 ));
106   // release data
107   mesh->decrRef();
108   coordsArr->decrRef();
109   //! [CppSnippet_MEDCouplingPointSet_rotate_4]
110 }
111
112 void CppExample_MEDCouplingPointSet_getBoundingBox()
113 {
114   using namespace ParaMEDMEM;
115   //! [CppSnippet_MEDCouplingPointSet_getBoundingBox_1]
116   double cc[2*3]={0.0, 0.1, 0.2, // 3D coordinates of 2 nodes
117                   2.0, 2.1, 2.2};
118   DataArrayDouble *coordsArr=DataArrayDouble::New();
119   coordsArr->useExternalArrayWithRWAccess(cc, 2,3);
120   MEDCouplingUMesh *mesh=MEDCouplingUMesh::New();
121   mesh->setCoords(coordsArr);
122   coordsArr->decrRef();
123   //! [CppSnippet_MEDCouplingPointSet_getBoundingBox_1]
124   //! [CppSnippet_MEDCouplingPointSet_getBoundingBox_2]
125   double bbox[3][2];
126   mesh->getBoundingBox( (double*) bbox );
127   mesh->decrRef();
128
129   // check the returned coordinates of extremum points of the bounding box
130   for ( int i = 0; i < 2; ++i )   // point id
131     for ( int j = 0; j < 3; ++j ) // component
132       CPPUNIT_ASSERT_DOUBLES_EQUAL( cc[ i*3 + j ], bbox[j][i], 1e-13);
133   //! [CppSnippet_MEDCouplingPointSet_getBoundingBox_2]
134 }
135
136 void CppExample_MEDCouplingPointSet_getNodeIdsNearPoint()
137 {
138   using namespace ParaMEDMEM;
139   //! [CppSnippet_MEDCouplingPointSet_getNodeIdsNearPoint_1]
140   // 2D coordinates of 5 nodes
141   double coords[5*2]={0.3,-0.301, // #0
142                       0.2,-0.3,   // #1
143                       0.3,-0.302, // #2
144                       1.1,0.0,    // #3
145                       0.3,-0.303};// #4
146   DataArrayDouble *coordsArr=DataArrayDouble::New();
147   coordsArr->useExternalArrayWithRWAccess(coords, 5,2);
148   MEDCouplingUMesh *mesh=MEDCouplingUMesh::New();
149   mesh->setCoords(coordsArr);
150   coordsArr->decrRef();
151   //! [CppSnippet_MEDCouplingPointSet_getNodeIdsNearPoint_1]
152   //! [CppSnippet_MEDCouplingPointSet_getNodeIdsNearPoint_2]
153   double point [2]={0.3, -0.3}; // point close to nodes #0, #2 and #4
154   DataArrayInt *ids = mesh->getNodeIdsNearPoint(point, 1e-13);
155
156   // check found ids
157   const int expectedIDs[3] = {0,2,4};
158   DataArrayInt * okIDs = ids->getIdsEqualList ( expectedIDs, expectedIDs+3 );
159   CPPUNIT_ASSERT_EQUAL(3, okIDs->getNumberOfTuples());
160
161   // release data
162   mesh->decrRef();
163   ids->decrRef();
164   okIDs->decrRef();
165   //! [CppSnippet_MEDCouplingPointSet_getNodeIdsNearPoint_2]
166 }
167 void CppExample_MEDCouplingPointSet_getNodeIdsNearPoints()
168 {
169   using namespace ParaMEDMEM;
170   //! [CppSnippet_MEDCouplingPointSet_getNodeIdsNearPoints_1]
171   // 2D coordinates of 7 nodes
172   double coords[7*2]={0.3,-0.301, // #0
173                       0.2,-0.3,   // #1
174                       0.3,-0.302, // #2
175                       1.1,0.0,    // #3
176                       1.1,0.0,    // #4
177                       1.1,0.002,  // #5
178                       0.3,-0.303};// #6
179   DataArrayDouble *coordsArr=DataArrayDouble::New();
180   coordsArr->useExternalArrayWithRWAccess(coords, 7,2);
181   MEDCouplingUMesh *mesh=MEDCouplingUMesh::New();
182   mesh->setCoords(coordsArr);
183   coordsArr->decrRef();
184   //! [CppSnippet_MEDCouplingPointSet_getNodeIdsNearPoints_1]
185   //! [CppSnippet_MEDCouplingPointSet_getNodeIdsNearPoints_2]
186   const int nbOfPoints = 3;
187   double points [nbOfPoints*2]={0.2,-0.301,  // ~ node #1
188                                 0.0, 0.0,
189                                 1.1, 0.002}; // ~ nodes #3, #4 and #5
190   DataArrayInt *ids, *idsIndex;
191   mesh->getNodeIdsNearPoints(points, nbOfPoints, 1e-13,ids,idsIndex);
192
193   // check found ids (i.e. contents of 'ids' array)
194   const int expectedIDs[4] = {1, 3, 4, 5};
195   DataArrayInt * okIDs = ids->getIdsEqualList ( expectedIDs, expectedIDs+4 );
196   CPPUNIT_ASSERT_EQUAL(4, okIDs->getNumberOfTuples());
197
198   // release data
199   mesh->decrRef();
200   ids->decrRef();
201   idsIndex->decrRef();
202   okIDs->decrRef();
203   //! [CppSnippet_MEDCouplingPointSet_getNodeIdsNearPoints_2]
204 }
205
206 void CppExample_MEDCouplingPointSet_findCommonNodes()
207 {
208   using namespace ParaMEDMEM;
209   //! [CppSnippet_MEDCouplingPointSet_findCommonNodes_1]
210   double coords[6*2]={0.3,-0.301, // 0
211                       0.2,-0.3,   // 1
212                       0.3,-0.302, // 2
213                       1.1,0.0,    // 3
214                       1.1,0.0,    // 4
215                       0.3,-0.303};// 5
216   DataArrayDouble *coordsArr=DataArrayDouble::New();
217   coordsArr->useExternalArrayWithRWAccess(coords, 6,2);
218   MEDCouplingUMesh *mesh=MEDCouplingUMesh::New();
219   mesh->setCoords(coordsArr);
220   coordsArr->decrRef();
221   //! [CppSnippet_MEDCouplingPointSet_findCommonNodes_1]
222   //! [CppSnippet_MEDCouplingPointSet_findCommonNodes_2]
223   DataArrayInt *com, *comI;
224   mesh->findCommonNodes(1e-13,-1,com,comI);
225   CPPUNIT_ASSERT_EQUAL(2, com->getNumberOfTuples());
226   mesh->findCommonNodes(0.004,-1,com,comI);
227   CPPUNIT_ASSERT_EQUAL(5, com->getNumberOfTuples());
228   //! [CppSnippet_MEDCouplingPointSet_findCommonNodes_2]
229   mesh->decrRef();
230   com->decrRef();
231   comI->decrRef();
232 }
233
234 void CppExample_MEDCouplingPointSet_getCoordinatesOfNode()
235 {
236   using namespace ParaMEDMEM;
237   //! [CppSnippet_MEDCouplingPointSet_getCoordinatesOfNode_1]
238   double coords[18]={-0.3,-0.3, 0.2,-0.3, 0.7,-0.3};
239   DataArrayDouble *coordsArr=DataArrayDouble::New();
240   coordsArr->useExternalArrayWithRWAccess(coords, 3,2);
241   MEDCouplingUMesh *mesh=MEDCouplingUMesh::New();
242   mesh->setCoords(coordsArr);
243   coordsArr->decrRef();
244   //! [CppSnippet_MEDCouplingPointSet_getCoordinatesOfNode_1]
245   //! [CppSnippet_MEDCouplingPointSet_getCoordinatesOfNode_2]
246   std::vector<double> coords2;
247   mesh->getCoordinatesOfNode(1,coords2);
248   CPPUNIT_ASSERT_DOUBLES_EQUAL(coords[0],coords2[0],1e-13);
249   CPPUNIT_ASSERT_DOUBLES_EQUAL(coords[1],coords2[1],1e-13);
250   //! [CppSnippet_MEDCouplingPointSet_getCoordinatesOfNode_2]
251   mesh->decrRef();
252 }
253
254 void CppExample_DataArrayInt_buildPermutationArr()
255 {
256   using namespace ParaMEDMEM;
257   //! [CppSnippet_DataArrayInt_buildPermutationArr_1]
258   DataArrayInt *a=DataArrayInt::New();
259   const int vala[5]={4,5,6,7,8};
260   a->alloc(5,1);
261   std::copy(vala,vala+5,a->getPointer());
262   DataArrayInt *b=DataArrayInt::New();
263   const int valb[5]={5,4,8,6,7};
264   b->alloc(5,1);
265   std::copy(valb,valb+5,b->getPointer());
266   DataArrayInt *c=a->buildPermutationArr(*b);
267   //! [CppSnippet_DataArrayInt_buildPermutationArr_1]
268   const int expect1[5]={1,0,4,2,3};
269   CPPUNIT_ASSERT_EQUAL(5,c->getNumberOfTuples());
270   CPPUNIT_ASSERT_EQUAL(1,c->getNumberOfComponents());
271   CPPUNIT_ASSERT(std::equal(expect1,expect1+5,c->getConstPointer()));
272   CPPUNIT_ASSERT(a->isEqualWithoutConsideringStrAndOrder(*b));
273   a->decrRef();
274   b->decrRef();
275   c->decrRef();
276 }
277
278 void CppExample_DataArrayInt_invertArrayO2N2N2O()
279 {
280   using namespace ParaMEDMEM;
281   //! [CppSnippet_DataArrayInt_invertArrayO2N2N2O_1]
282   const int arr1[6]={2,0,4,1,5,3};
283   DataArrayInt *da=DataArrayInt::New();
284   da->alloc(6,1);
285   std::copy(arr1,arr1+6,da->getPointer());
286   DataArrayInt *da2=da->invertArrayO2N2N2O(6);
287   const int expected1[6]={1,3,0,5,2,4};
288   for(int i=0;i<6;i++)
289     CPPUNIT_ASSERT_EQUAL(expected1[i],da2->getIJ(i,0));
290   //! [CppSnippet_DataArrayInt_invertArrayO2N2N2O_1]
291   da->decrRef();
292   da2->decrRef();
293 }
294
295 void CppExample_DataArrayInt_invertArrayN2O2O2N()
296 {
297   using namespace ParaMEDMEM;
298   //! [CppSnippet_DataArrayInt_invertArrayN2O2O2N_1]
299   const int arr1[6]={2,0,4,1,5,3};
300   DataArrayInt *da=DataArrayInt::New();
301   da->alloc(6,1);
302   std::copy(arr1,arr1+6,da->getPointer());
303   DataArrayInt *da2=da->invertArrayN2O2O2N(6);
304   const int expected1[6]={1,3,0,5,2,4};
305   for(int i=0;i<6;i++)
306     CPPUNIT_ASSERT_EQUAL(expected1[i],da2->getIJ(i,0));
307   //! [CppSnippet_DataArrayInt_invertArrayN2O2O2N_1]
308   da->decrRef();
309   da2->decrRef();
310 }
311
312 void CppExample_DataArrayDouble_getIdsInRange()
313 {
314   using namespace ParaMEDMEM;
315   //! [CppSnippet_DataArrayDouble_getIdsInRange_1]
316   DataArrayDouble *da=DataArrayDouble::New();
317   da->alloc(10,1);
318   da->iota();
319
320   DataArrayInt* da2 = da->getIdsInRange( 2.5, 6 );
321   //! [CppSnippet_DataArrayDouble_getIdsInRange_1]
322   da->decrRef();
323   da2->decrRef();
324 }
325
326 void CppExample_DataArrayDouble_findCommonTuples()
327 {
328   using namespace ParaMEDMEM;
329   //! [CppSnippet_DataArrayDouble_findCommonTuples1]
330   DataArrayDouble *da=DataArrayDouble::New();
331   da->alloc(6,2);
332   const double array2[12]={2.3,2.3, // 0
333                            1.2,1.2, // 1
334                            1.3,1.3, // 2
335                            2.3,2.3, // 3
336                            2.301,   // 4
337                            2.301,   // 5
338                            0.8,0.8};// 6
339   std::copy(array2,array2+12,da->getPointer());
340   //! [CppSnippet_DataArrayDouble_findCommonTuples1]
341   //! [CppSnippet_DataArrayDouble_findCommonTuples2]
342   DataArrayInt *c=0,*cI=0;
343   da->findCommonTuples(1e-1,-1,c,cI);
344
345   const int expected3[5]={0,3,4,1,2};
346   const int expected4[3]={0,3,5};
347   CPPUNIT_ASSERT(std::equal(expected3,expected3+5,c->getConstPointer()));
348   CPPUNIT_ASSERT(std::equal(expected4,expected4+3,cI->getConstPointer()));
349   c->decrRef();
350   cI->decrRef();
351   da->decrRef();
352   //! [CppSnippet_DataArrayDouble_findCommonTuples2]
353 }
354
355 void CppExample_DataArrayDouble_Meld1()
356 {
357   using namespace ParaMEDMEM;
358   //! [CppSnippet_DataArrayDouble_Meld1_1]
359   const int sameNbTuples = 7;
360
361   DataArrayDouble *da1=DataArrayDouble::New();
362   da1->alloc(sameNbTuples,2);
363   da1->fillWithValue(7.);
364   da1->setInfoOnComponent(0,"c0da1");
365   da1->setInfoOnComponent(1,"c1da1");
366
367   DataArrayDouble *da2=DataArrayDouble::New();
368   da2->alloc(sameNbTuples,1);
369   da2->iota(0.);
370   da2->setInfoOnComponent(0,"c0da2");
371
372   da1->meldWith(da2);
373   //! [CppSnippet_DataArrayDouble_Meld1_1]
374   //! [CppSnippet_DataArrayDouble_Meld1_2]
375   da1->decrRef();
376   da2->decrRef();
377   //! [CppSnippet_DataArrayDouble_Meld1_2]
378 }
379
380 void CppExample_DataArrayInt_Meld1()
381 {
382   using namespace ParaMEDMEM;
383   //! [CppSnippet_DataArrayInt_Meld1_1]
384   const int sameNbTuples = 7;
385
386   DataArrayInt *da1=DataArrayInt::New();
387   da1->alloc(sameNbTuples,2);
388   da1->fillWithValue(7);
389   da1->setInfoOnComponent(0,"c0da1");
390   da1->setInfoOnComponent(1,"c1da1");
391
392   DataArrayInt *da2=DataArrayInt::New();
393   da2->alloc(sameNbTuples,1);
394   da2->iota(0);
395   da2->setInfoOnComponent(0,"c0da2");
396
397   da1->meldWith(da2);
398   //! [CppSnippet_DataArrayInt_Meld1_1]
399   //! [CppSnippet_DataArrayInt_Meld1_2]
400   da1->decrRef();
401   da2->decrRef();
402   //! [CppSnippet_DataArrayInt_Meld1_2]
403 }
404
405 void CppExampleFieldDoubleBuildSubPart1()
406 {
407   //! [CppSnippetFieldDoubleBuildSubPart1_1]
408   ParaMEDMEM::MEDCouplingUMesh *mesh1=ParaMEDMEM::MEDCouplingBasicsTest::build2DTargetMesh_1();
409   ParaMEDMEM::MEDCouplingFieldDouble *f1=ParaMEDMEM::MEDCouplingFieldDouble::New(ParaMEDMEM::ON_CELLS,ParaMEDMEM::ONE_TIME);
410   f1->setTime(2.3,5,6);
411   f1->setMesh(mesh1);
412   ParaMEDMEM::DataArrayDouble *array=ParaMEDMEM::DataArrayDouble::New();
413   array->alloc(mesh1->getNumberOfCells(),2);
414   const double arr1[10]={3.,103.,4.,104.,5.,105.,6.,106.,7.,107.};
415   std::copy(arr1,arr1+10,array->getPointer());
416   f1->setArray(array);
417   array->decrRef();
418   //! [CppSnippetFieldDoubleBuildSubPart1_1]
419   //! [CppSnippetFieldDoubleBuildSubPart1_2]
420   const int part1[3]={2,1,4};
421   ParaMEDMEM::MEDCouplingFieldDouble *f2=f1->buildSubPart(part1,part1+3);
422   //! [CppSnippetFieldDoubleBuildSubPart1_2]
423   f2->zipCoords();
424   CPPUNIT_ASSERT_EQUAL(3,f2->getMesh()->getNumberOfCells());
425   CPPUNIT_ASSERT_EQUAL(6,f2->getMesh()->getNumberOfNodes());
426   CPPUNIT_ASSERT_EQUAL(2,f2->getMesh()->getSpaceDimension());
427   CPPUNIT_ASSERT_EQUAL(2,f2->getMesh()->getMeshDimension());
428   ParaMEDMEM::MEDCouplingUMesh *m2C=dynamic_cast<ParaMEDMEM::MEDCouplingUMesh *>(const_cast<ParaMEDMEM::MEDCouplingMesh *>(f2->getMesh()));
429   CPPUNIT_ASSERT_EQUAL(13,m2C->getMeshLength());
430   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};
431   for(int i=0;i<12;i++)
432     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],m2C->getCoords()->getIJ(0,i),1.e-12);
433   const double expected3[13]={3,2,3,1,3,0,2,1,4,4,5,3,2};
434   CPPUNIT_ASSERT(std::equal(expected3,expected3+13,m2C->getNodalConnectivity()->getConstPointer()));
435   const double expected4[4]={0,4,8,13};
436   CPPUNIT_ASSERT(std::equal(expected4,expected4+4,m2C->getNodalConnectivityIndex()->getConstPointer()));
437   f2->decrRef();
438   f1->decrRef();
439   //! [CppSnippetFieldDoubleBuildSubPart1_3]
440   f1=ParaMEDMEM::MEDCouplingFieldDouble::New(ParaMEDMEM::ON_NODES,ParaMEDMEM::ONE_TIME);
441   f1->setTime(2.3,5,6);
442   f1->setMesh(mesh1);
443   array=ParaMEDMEM::DataArrayDouble::New();
444   array->alloc(mesh1->getNumberOfNodes(),2);
445   const double arr2[18]={3.,103.,4.,104.,5.,105.,6.,106.,7.,107.,8.,108.,9.,109.,10.,110.,11.,111.};
446   std::copy(arr2,arr2+18,array->getPointer());  
447   f1->setArray(array);
448   array->decrRef();
449   //! [CppSnippetFieldDoubleBuildSubPart1_3]
450   //! [CppSnippetFieldDoubleBuildSubPart1_4]
451   const int part2[2]={1,2};
452   f2=f1->buildSubPart(part2,part2+2);
453   //! [CppSnippetFieldDoubleBuildSubPart1_4]
454   f2->decrRef();
455   //idem previous because nodes of cell#4 are not fully present in part3 
456   const int part3[2]={1,2};
457   ParaMEDMEM::DataArrayInt *arrr=ParaMEDMEM::DataArrayInt::New();
458   arrr->alloc(2,1);
459   std::copy(part3,part3+2,arrr->getPointer());
460   f2=f1->buildSubPart(arrr);
461   arrr->decrRef();
462   f2->decrRef();
463   //
464   const int part4[3]={1,2,4};
465   f2=f1->buildSubPart(part4,part4+3);
466   f2->decrRef();
467   //
468   f1->decrRef();
469   mesh1->decrRef();
470   return;
471 }
472
473 void CppSnippetUMeshStdBuild1()
474 {
475   //! [CppSnippetUMeshStdBuild1_1]
476   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., 
477                      0.7,0.2,0.,    -0.3,0.7,0.,    0.2,0.7,0.,     0.7,0.7,0. };
478   int nodalConnPerCell[18]={0,3,4,1, 1,4,2, 4,5,2, 6,7,4,3, 7,8,5,4};
479   //! [CppSnippetUMeshStdBuild1_1]
480   //! [CppSnippetUMeshStdBuild1_2]
481   ParaMEDMEM::MEDCouplingUMesh *mesh=ParaMEDMEM::MEDCouplingUMesh::New("My2DMesh",2);
482   //! [CppSnippetUMeshStdBuild1_2]
483   //! [CppSnippetUMeshStdBuild1_3]
484   mesh->allocateCells(5);//You can put more than 5 if you want but not less.
485   mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,nodalConnPerCell);
486   mesh->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,nodalConnPerCell+4);
487   mesh->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,nodalConnPerCell+7);
488   mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,nodalConnPerCell+10);
489   mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,nodalConnPerCell+14);
490   mesh->finishInsertingCells();
491   //! [CppSnippetUMeshStdBuild1_3]
492   //! [CppSnippetUMeshStdBuild1_4]
493   ParaMEDMEM::DataArrayDouble *myCoords=ParaMEDMEM::DataArrayDouble::New();
494   myCoords->alloc(9,3);//here myCoords are declared to have 3 components, mesh will deduce that its spaceDim==3. 
495   std::copy(coords,coords+27,myCoords->getPointer());
496   mesh->setCoords(myCoords);//myCorrds contains 9 tuples, that is to say mesh contains 9 nodes.
497   myCoords->decrRef();
498   //! [CppSnippetUMeshStdBuild1_4]
499   mesh->checkCoherency();
500   //! [CppSnippetUMeshStdBuild1_5]
501   mesh->decrRef();
502   //! [CppSnippetUMeshStdBuild1_5]
503 }
504
505 void CppSnippetCMeshStdBuild1()
506 {
507   //! [CppSnippetCMeshStdBuild1_1]
508   double XCoords[9]={-0.3,0.,0.1,0.3,0.45,0.47,0.49,1.,1.22};
509   double YCoords[7]={0.,0.1,0.37,0.45,0.47,0.49,1.007};
510   ParaMEDMEM::DataArrayDouble *arrX=ParaMEDMEM::DataArrayDouble::New();
511   arrX->alloc(9,1);
512   std::copy(XCoords,XCoords+9,arrX->getPointer());
513   arrX->setInfoOnComponent(0,"X [m]");
514   ParaMEDMEM::DataArrayDouble *arrY=ParaMEDMEM::DataArrayDouble::New();
515   arrY->alloc(7,1);
516   std::copy(YCoords,YCoords+7,arrY->getPointer());
517   arrY->setInfoOnComponent(0,"Y [m]");
518   //! [CppSnippetCMeshStdBuild1_1]
519   //! [CppSnippetCMeshStdBuild1_2]
520   ParaMEDMEM::MEDCouplingCMesh *mesh=ParaMEDMEM::MEDCouplingCMesh::New("My2D_CMesh");
521   mesh->setCoords(arrX,arrY);
522   arrX->decrRef();
523   arrY->decrRef();
524   //! [CppSnippetCMeshStdBuild1_2]
525   //! [CppSnippetCMeshStdBuild1_3]
526   CPPUNIT_ASSERT_EQUAL(8*6,mesh->getNumberOfCells());
527   CPPUNIT_ASSERT_EQUAL(9*7,mesh->getNumberOfNodes());
528   CPPUNIT_ASSERT_EQUAL(2,mesh->getSpaceDimension());
529   CPPUNIT_ASSERT_EQUAL(2,mesh->getMeshDimension());
530   //! [CppSnippetCMeshStdBuild1_3]
531   mesh->decrRef();
532   mesh=ParaMEDMEM::MEDCouplingCMesh::New("My2D_CMesh");
533   arrX=ParaMEDMEM::DataArrayDouble::New(); arrX->alloc(9,1); std::copy(XCoords,XCoords+9,arrX->getPointer()); arrX->setInfoOnComponent(0,"X [m]");
534   arrY=ParaMEDMEM::DataArrayDouble::New(); arrY->alloc(7,1); std::copy(YCoords,YCoords+7,arrY->getPointer()); arrY->setInfoOnComponent(0,"Y [m]");
535   //! [CppSnippetCMeshStdBuild1_2bis]
536   mesh->setCoordsAt(0,arrX);
537   arrX->decrRef();
538   mesh->setCoordsAt(1,arrY);
539   arrY->decrRef();
540   //! [CppSnippetCMeshStdBuild1_2bis]
541   CPPUNIT_ASSERT_EQUAL(8*6,mesh->getNumberOfCells());
542   CPPUNIT_ASSERT_EQUAL(9*7,mesh->getNumberOfNodes());
543   CPPUNIT_ASSERT_EQUAL(2,mesh->getSpaceDimension());
544   CPPUNIT_ASSERT_EQUAL(2,mesh->getMeshDimension());
545   //! [CppSnippetCMeshStdBuild1_4]
546   mesh->decrRef();
547   //! [CppSnippetCMeshStdBuild1_4]
548 }
549
550 void CppSnippetUMeshAdvBuild1()
551 {
552   //! [CppSnippetUMeshAdvBuild1_1]
553   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., 
554                      0.7,0.2,0.,    -0.3,0.7,0.,    0.2,0.7,0.,     0.7,0.7,0. };
555   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};
556   int nodalConnPerCellIndex[6]={0,5,9,13,18,23};
557   //! [CppSnippetUMeshAdvBuild1_1]
558   //! [CppSnippetUMeshAdvBuild1_2]
559   ParaMEDMEM::MEDCouplingUMesh *mesh=ParaMEDMEM::MEDCouplingUMesh::New("My2DMesh",2);
560   //! [CppSnippetUMeshAdvBuild1_2]
561   //! [CppSnippetUMeshAdvBuild1_3]
562   ParaMEDMEM::DataArrayInt *nodalConn=ParaMEDMEM::DataArrayInt::New();
563   nodalConn->alloc(23,1);
564   std::copy(nodalConnPerCell,nodalConnPerCell+23,nodalConn->getPointer());
565   ParaMEDMEM::DataArrayInt *nodalConnI=ParaMEDMEM::DataArrayInt::New();
566   nodalConnI->alloc(6,1);
567   std::copy(nodalConnPerCellIndex,nodalConnPerCellIndex+6,nodalConnI->getPointer());
568   mesh->setConnectivity(nodalConn,nodalConnI,true);
569   nodalConn->decrRef();// nodalConn DataArrayInt instance is owned by mesh after call to setConnectivity method. No more need here -> decrRef()
570   nodalConnI->decrRef();// nodalConnI DataArrayInt instance is owned by mesh after call to setConnectivity method. No more need here -> decrRef()
571   //! [CppSnippetUMeshAdvBuild1_3]
572   //! [CppSnippetUMeshAdvBuild1_4]
573   ParaMEDMEM::DataArrayDouble *myCoords=ParaMEDMEM::DataArrayDouble::New();
574   myCoords->alloc(9,3);//here myCoords are declared to have 3 components, mesh will deduce that its spaceDim==3. 
575   std::copy(coords,coords+27,myCoords->getPointer());
576   mesh->setCoords(myCoords);//myCorrds contains 9 tuples, that is to say mesh contains 9 nodes.
577   myCoords->decrRef();
578   //! [CppSnippetUMeshAdvBuild1_4]
579   mesh->checkCoherency();
580   //! [CppSnippetUMeshAdvBuild1_5]
581   mesh->decrRef();
582   //! [CppSnippetUMeshAdvBuild1_5]
583 }
584
585 void CppSnippetDataArrayBuild1()
586 {
587   //! [CppSnippetDataArrayBuild1_0]
588   const int nbOfNodes=12;
589   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.};
590   //
591   ParaMEDMEM::DataArrayDouble *myCoords=0;
592   double *tmp=0;
593   //! [CppSnippetDataArrayBuild1_0]
594   //
595   //! [CppSnippetDataArrayBuild1_1]
596   myCoords=ParaMEDMEM::DataArrayDouble::New();
597   myCoords->useArray(coords,false,ParaMEDMEM::CPP_DEALLOC,nbOfNodes,3);
598   //now use myCoords as you need
599   //...
600   //myCoords is no more useful here : release it
601   myCoords->decrRef();
602   //! [CppSnippetDataArrayBuild1_1]
603   //! [CppSnippetDataArrayBuild1_2]
604   myCoords=ParaMEDMEM::DataArrayDouble::New();
605   tmp=new double[3*nbOfNodes];
606   std::copy(coords,coords+3*nbOfNodes,tmp);
607   myCoords->useArray(tmp,true,ParaMEDMEM::CPP_DEALLOC,nbOfNodes,3);
608   //now use myCoords as you need
609   //...
610   //myCoords is no more useful, release it
611   myCoords->decrRef();
612   //! [CppSnippetDataArrayBuild1_2]
613   //! [CppSnippetDataArrayBuild1_3]
614   myCoords=ParaMEDMEM::DataArrayDouble::New();
615   tmp=(double *)malloc(3*nbOfNodes*sizeof(double));
616   std::copy(coords,coords+3*nbOfNodes,tmp);
617   myCoords->useArray(tmp,true,ParaMEDMEM::C_DEALLOC,nbOfNodes,3);
618   //now use myCoords as you need
619   //...
620   //myCoords is no more useful here : release it
621   myCoords->decrRef();
622   //! [CppSnippetDataArrayBuild1_3]
623   //! [CppSnippetDataArrayBuild1_4]
624   myCoords=ParaMEDMEM::DataArrayDouble::New();
625   myCoords->alloc(nbOfNodes,3);
626   tmp=myCoords->getPointer();
627   std::copy(coords,coords+3*nbOfNodes,tmp);
628   myCoords->declareAsNew();//you have modified data pointed by internal pointer notify object
629   //now use myCoords as you need
630   //...
631   //myCoords is no more useful here : release it
632   myCoords->decrRef();
633   //! [CppSnippetDataArrayBuild1_4]
634   myCoords=ParaMEDMEM::DataArrayDouble::New();
635   myCoords->alloc(nbOfNodes,3);
636   tmp=myCoords->getPointer();
637   std::copy(coords,coords+3*nbOfNodes,tmp);
638   ParaMEDMEM::DataArrayDouble *myCoordsCpy=0;
639   //! [CppSnippetDataArrayBuild1_5]
640   myCoordsCpy=myCoords->deepCpy();
641   //! [CppSnippetDataArrayBuild1_5]
642   //! [CppSnippetDataArrayBuild1_6]
643   CPPUNIT_ASSERT(myCoordsCpy->isEqual(*myCoords,1e-12));
644   myCoordsCpy->setIJ(0,0,1000.);
645   CPPUNIT_ASSERT(!myCoordsCpy->isEqual(*myCoords,1e-12));//myCoordsCpy only has been modified
646   //! [CppSnippetDataArrayBuild1_6]
647   //! [CppSnippetDataArrayBuild1_7]
648   myCoordsCpy->decrRef();
649   //! [CppSnippetDataArrayBuild1_7]
650   //! [CppSnippetDataArrayBuild1_5bis]
651   myCoordsCpy=myCoords->performCpy(true);
652   //! [CppSnippetDataArrayBuild1_5bis]
653   CPPUNIT_ASSERT(myCoordsCpy->isEqual(*myCoords,1e-12));
654   myCoordsCpy->setIJ(0,0,1000.);
655   CPPUNIT_ASSERT(!myCoordsCpy->isEqual(*myCoords,1e-12));//myCoordsCpy only has been modified
656   myCoordsCpy->decrRef();
657   //! [CppSnippetDataArrayBuild1_8]
658   myCoordsCpy=myCoords->performCpy(false);
659   //! [CppSnippetDataArrayBuild1_8]
660   //! [CppSnippetDataArrayBuild1_9]
661   CPPUNIT_ASSERT(myCoordsCpy->isEqual(*myCoords,1e-12));
662   myCoordsCpy->setIJ(0,0,1000.);
663   CPPUNIT_ASSERT(myCoordsCpy->isEqual(*myCoords,1e-12));//myCoords and myCoordsCpy have been modified simultaneously
664   //! [CppSnippetDataArrayBuild1_9]
665   //! [CppSnippetDataArrayBuild1_10]
666   myCoordsCpy->decrRef();
667   //! [CppSnippetDataArrayBuild1_10]
668   //! [CppSnippetDataArrayBuild1_11]
669   myCoordsCpy=ParaMEDMEM::DataArrayDouble::New();
670   //! [CppSnippetDataArrayBuild1_11]
671   //! [CppSnippetDataArrayBuild1_12]
672   myCoordsCpy->cpyFrom(*myCoords);
673   //! [CppSnippetDataArrayBuild1_12]
674   //! [CppSnippetDataArrayBuild1_13]
675   CPPUNIT_ASSERT(myCoordsCpy->isEqual(*myCoords,1e-12));
676   myCoordsCpy->setIJ(0,0,2000.);
677   CPPUNIT_ASSERT(!myCoordsCpy->isEqual(*myCoords,1e-12));//myCoordsCpy only has been modified
678   //! [CppSnippetDataArrayBuild1_13]
679   //! [CppSnippetDataArrayBuild1_14]
680   myCoordsCpy->decrRef();
681   //! [CppSnippetDataArrayBuild1_14]
682   myCoords->decrRef();
683   //! [CppSnippetDataArrayBuild1_14]
684 }
685
686 void CppSnippetFieldDoubleBuild1()
687 {
688   double XCoords[9]={-0.3,0.07,0.1,0.3,0.45,0.47,0.49,1.,1.22};
689   double YCoords[7]={0.07,0.1,0.37,0.45,0.47,0.49,1.007};
690   ParaMEDMEM::DataArrayDouble *arrX=ParaMEDMEM::DataArrayDouble::New(); arrX->alloc(9,1); std::copy(XCoords,XCoords+9,arrX->getPointer()); arrX->setInfoOnComponent(0,"X [m]");
691   ParaMEDMEM::DataArrayDouble *arrY=ParaMEDMEM::DataArrayDouble::New(); arrY->alloc(7,1); std::copy(YCoords,YCoords+7,arrY->getPointer()); arrY->setInfoOnComponent(0,"Y [m]"); 
692   ParaMEDMEM::MEDCouplingCMesh *mesh=ParaMEDMEM::MEDCouplingCMesh::New("My2D_CMesh");
693   mesh->setCoords(arrX,arrY); arrX->decrRef(); arrY->decrRef();
694   //! [CppSnippetFieldDoubleBuild1_1]
695   ParaMEDMEM::MEDCouplingFieldDouble* fieldOnCells=ParaMEDMEM::MEDCouplingFieldDouble::New(ParaMEDMEM::ON_CELLS,ParaMEDMEM::NO_TIME);
696   fieldOnCells->setName("MyTensorFieldOnCellNoTime");
697   fieldOnCells->setMesh(mesh);
698   mesh->decrRef(); // no more need of mesh because mesh has been attached to fieldOnCells
699   ParaMEDMEM::DataArrayDouble *array=ParaMEDMEM::DataArrayDouble::New();
700   array->alloc(fieldOnCells->getMesh()->getNumberOfCells(),9);//Implicitely fieldOnCells will be a 9 components field.
701   array->fillWithValue(7.);
702   fieldOnCells->setArray(array);
703   array->decrRef();
704   // fieldOnCells is now usable
705   // ...
706   // fieldOnCells is no more useful here : release it
707   fieldOnCells->decrRef();
708   //! [CppSnippetFieldDoubleBuild1_1]
709   arrX=ParaMEDMEM::DataArrayDouble::New(); arrX->alloc(9,1); std::copy(XCoords,XCoords+9,arrX->getPointer()); arrX->setInfoOnComponent(0,"X [m]");
710   arrY=ParaMEDMEM::DataArrayDouble::New(); arrY->alloc(7,1); std::copy(YCoords,YCoords+7,arrY->getPointer()); arrY->setInfoOnComponent(0,"Y [m]"); 
711   mesh=ParaMEDMEM::MEDCouplingCMesh::New("My2D_CMesh");
712   mesh->setCoords(arrX,arrY); arrX->decrRef(); arrY->decrRef();
713   //! [CppSnippetFieldDoubleBuild1_2]
714   ParaMEDMEM::MEDCouplingFieldDouble *f1=mesh->fillFromAnalytic(ParaMEDMEM::ON_CELLS,1,"x*x+y*y*3+2.*x");//f1 is scalar
715   ParaMEDMEM::MEDCouplingFieldDouble *f2=mesh->fillFromAnalytic(ParaMEDMEM::ON_CELLS,1,"cos(x+y/x)");//f2 is scalar too
716   ParaMEDMEM::MEDCouplingFieldDouble *f2bis=mesh->fillFromAnalytic(ParaMEDMEM::ON_CELLS,2,"x*x*IVec+3*y*JVec");//f2bis is a vectors field
717   ParaMEDMEM::MEDCouplingFieldDouble *f3=(*f1)+(*f2);//f3 scalar
718   ParaMEDMEM::MEDCouplingFieldDouble *f4=(*f3)/(*f2);//f4 scalar
719   f2bis->applyFunc(1,"sqrt(x*x+y*y)");//f2bis becomes scalar
720   ParaMEDMEM::MEDCouplingFieldDouble *f5=(*f2bis)*(*f4);//f5 scalar
721   const double pos1[2]={0.48,0.38};
722   double res;
723   f4->getValueOn(pos1,&res);//f4 is scalar so the returned value is of size 1.
724   // ...
725   //! [CppSnippetFieldDoubleBuild1_2]
726   mesh->decrRef();
727   //! [CppSnippetFieldDoubleBuild1_3]
728   // f1, f2, f2bis, f3, f4, f5 are no more useful here : release them
729   f1->decrRef();
730   f2->decrRef();
731   f2bis->decrRef();
732   f3->decrRef();
733   f4->decrRef();
734   f5->decrRef();
735   //! [CppSnippetFieldDoubleBuild1_3]
736 }
737
738 void CppSnippetFieldDoubleBuild2()
739 {
740   double XCoords[9]={-0.3,0.,0.1,0.3,0.45,0.47,0.49,1.,1.22};
741   double YCoords[7]={0.,0.1,0.37,0.45,0.47,0.49,1.007};
742   ParaMEDMEM::DataArrayDouble *arrX=ParaMEDMEM::DataArrayDouble::New(); arrX->alloc(9,1); std::copy(XCoords,XCoords+9,arrX->getPointer()); arrX->setInfoOnComponent(0,"X [m]");
743   ParaMEDMEM::DataArrayDouble *arrY=ParaMEDMEM::DataArrayDouble::New(); arrY->alloc(7,1); std::copy(YCoords,YCoords+7,arrY->getPointer()); arrY->setInfoOnComponent(0,"Y [m]"); 
744   ParaMEDMEM::MEDCouplingCMesh *mesh=ParaMEDMEM::MEDCouplingCMesh::New("My2D_CMesh");
745   mesh->setCoords(arrX,arrY); arrX->decrRef(); arrY->decrRef();
746   //! [CppSnippetFieldDoubleBuild2_1]
747   ParaMEDMEM::MEDCouplingFieldDouble* fieldOnNodes=ParaMEDMEM::MEDCouplingFieldDouble::New(ParaMEDMEM::ON_NODES,ParaMEDMEM::NO_TIME);
748   fieldOnNodes->setName("MyScalarFieldOnNodeNoTime");
749   fieldOnNodes->setMesh(mesh);
750   mesh->decrRef(); // no more need of mesh because mesh has been attached to fieldOnNodes
751   ParaMEDMEM::DataArrayDouble *array=ParaMEDMEM::DataArrayDouble::New();
752   array->alloc(fieldOnNodes->getMesh()->getNumberOfNodes(),1);//Implicitely fieldOnNodes will be a 1 component field.
753   array->fillWithValue(8.);
754   fieldOnNodes->setArray(array);
755   array->decrRef();
756   // fieldOnNodes is now usable
757   // ...
758   // fieldOnNodes is no more useful here : release it
759   fieldOnNodes->decrRef();
760   //! [CppSnippetFieldDoubleBuild2_1]
761 }
762
763 void CppSnippetFieldDoubleBuild3()
764 {
765   double XCoords[9]={-0.3,0.,0.1,0.3,0.45,0.47,0.49,1.,1.22};
766   double YCoords[7]={0.,0.1,0.37,0.45,0.47,0.49,1.007};
767   ParaMEDMEM::DataArrayDouble *arrX=ParaMEDMEM::DataArrayDouble::New(); arrX->alloc(9,1); std::copy(XCoords,XCoords+9,arrX->getPointer()); arrX->setInfoOnComponent(0,"X [m]");
768   ParaMEDMEM::DataArrayDouble *arrY=ParaMEDMEM::DataArrayDouble::New(); arrY->alloc(7,1); std::copy(YCoords,YCoords+7,arrY->getPointer()); arrY->setInfoOnComponent(0,"Y [m]"); 
769   ParaMEDMEM::MEDCouplingCMesh *mesh=ParaMEDMEM::MEDCouplingCMesh::New("My2D_CMesh");
770   mesh->setCoords(arrX,arrY); arrX->decrRef(); arrY->decrRef();
771   //! [CppSnippetFieldDoubleBuild3_1]
772   ParaMEDMEM::MEDCouplingFieldDouble* fieldOnCells=ParaMEDMEM::MEDCouplingFieldDouble::New(ParaMEDMEM::ON_CELLS,ParaMEDMEM::ONE_TIME);
773   fieldOnCells->setName("MyTensorFieldOnCellNoTime");
774   fieldOnCells->setTimeUnit("ms"); // Time unit is ms.
775   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
776   fieldOnCells->setMesh(mesh);
777   mesh->decrRef(); // no more need of mesh because mesh has been attached to fieldOnCells
778   ParaMEDMEM::DataArrayDouble *array=ParaMEDMEM::DataArrayDouble::New();
779   array->alloc(fieldOnCells->getMesh()->getNumberOfCells(),2);//Implicitely fieldOnCells will be a 2 components field.
780   array->fillWithValue(7.);
781   fieldOnCells->setArray(array);
782   array->decrRef();
783   // fieldOnCells is now usable
784   // ...
785   // fieldOnCells is no more useful here : release it
786   fieldOnCells->decrRef();
787   //! [CppSnippetFieldDoubleBuild3_1]
788 }
789
790 void CppSnippetFieldDoubleBuild4()
791 {
792   double XCoords[9]={-0.3,0.,0.1,0.3,0.45,0.47,0.49,1.,1.22};
793   double YCoords[7]={0.,0.1,0.37,0.45,0.47,0.49,1.007};
794   ParaMEDMEM::DataArrayDouble *arrX=ParaMEDMEM::DataArrayDouble::New(); arrX->alloc(9,1); std::copy(XCoords,XCoords+9,arrX->getPointer()); arrX->setInfoOnComponent(0,"X [m]");
795   ParaMEDMEM::DataArrayDouble *arrY=ParaMEDMEM::DataArrayDouble::New(); arrY->alloc(7,1); std::copy(YCoords,YCoords+7,arrY->getPointer()); arrY->setInfoOnComponent(0,"Y [m]"); 
796   ParaMEDMEM::MEDCouplingCMesh *mesh=ParaMEDMEM::MEDCouplingCMesh::New("My2D_CMesh");
797   mesh->setCoords(arrX,arrY); arrX->decrRef(); arrY->decrRef();
798   //! [CppSnippetFieldDoubleBuild4_1]
799   ParaMEDMEM::MEDCouplingFieldDouble* fieldOnNodes=ParaMEDMEM::MEDCouplingFieldDouble::New(ParaMEDMEM::ON_NODES,ParaMEDMEM::CONST_ON_TIME_INTERVAL);
800   fieldOnNodes->setName("MyVecFieldOnNodeWithConstTime");
801   fieldOnNodes->setTimeUnit("ms"); // Time unit is ms.
802   fieldOnNodes->setStartTime(4.22,2,-1);
803   fieldOnNodes->setEndTime(6.44,4,-1); // fieldOnNodes is defined in interval [4.22 ms,6.44 ms] 
804   fieldOnNodes->setMesh(mesh);
805   mesh->decrRef(); // no more need of mesh because mesh has been attached to fieldOnNodes
806   ParaMEDMEM::DataArrayDouble *array=ParaMEDMEM::DataArrayDouble::New();
807   array->alloc(fieldOnNodes->getMesh()->getNumberOfNodes(),3);//Implicitely fieldOnNodes will be a 3 components field.
808   array->fillWithValue(8.);
809   fieldOnNodes->setArray(array);
810   array->decrRef();
811   // fieldOnNodes is now usable
812   // ...
813   // fieldOnNodes is no more useful here : release it
814   fieldOnNodes->decrRef();
815   //! [CppSnippetFieldDoubleBuild4_1]
816 }
817
818 int main(int argc, char *argv[])
819 {
820   CppExample_DataArrayInt_buildPermutationArr();
821   CppExample_DataArrayInt_invertArrayO2N2N2O();
822   CppExample_DataArrayInt_invertArrayN2O2O2N();
823   CppExample_DataArrayDouble_getIdsInRange();
824   CppExample_DataArrayDouble_findCommonTuples();
825   CppExample_DataArrayDouble_Meld1();
826   CppExampleFieldDoubleBuildSubPart1();
827   CppSnippetUMeshStdBuild1();
828   CppSnippetUMeshAdvBuild1();
829   CppSnippetDataArrayBuild1();
830   CppSnippetCMeshStdBuild1();
831   CppSnippetFieldDoubleBuild1();
832   CppSnippetFieldDoubleBuild2();
833   CppSnippetFieldDoubleBuild3();
834   CppSnippetFieldDoubleBuild4();
835   return 0;
836 }