Salome HOME
Merge from V6_main_20120808 08Aug12
[tools/medcoupling.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
20 #include "MEDCouplingBasicsTest.hxx"
21 #include "MEDCouplingUMesh.hxx"
22 #include "MEDCouplingCMesh.hxx"
23 #include "MEDCouplingExtrudedMesh.hxx"
24 #include "MEDCouplingFieldDouble.hxx"
25 #include "MEDCouplingMemArray.hxx"
26 #include "MEDCouplingMultiFields.hxx"
27
28 void CppExampleFieldDoubleBuildSubPart1()
29 {
30   //! [CppSnippetFieldDoubleBuildSubPart1_1]
31   ParaMEDMEM::MEDCouplingUMesh *mesh1=ParaMEDMEM::MEDCouplingBasicsTest::build2DTargetMesh_1();
32   ParaMEDMEM::MEDCouplingFieldDouble *f1=ParaMEDMEM::MEDCouplingFieldDouble::New(ParaMEDMEM::ON_CELLS,ParaMEDMEM::ONE_TIME);
33   f1->setTime(2.3,5,6);
34   f1->setMesh(mesh1);
35   ParaMEDMEM::DataArrayDouble *array=ParaMEDMEM::DataArrayDouble::New();
36   array->alloc(mesh1->getNumberOfCells(),2);
37   const double arr1[10]={3.,103.,4.,104.,5.,105.,6.,106.,7.,107.};
38   std::copy(arr1,arr1+10,array->getPointer());
39   f1->setArray(array);
40   array->decrRef();
41   //! [CppSnippetFieldDoubleBuildSubPart1_1]
42   //! [CppSnippetFieldDoubleBuildSubPart1_2]
43   const int part1[3]={2,1,4};
44   ParaMEDMEM::MEDCouplingFieldDouble *f2=f1->buildSubPart(part1,part1+3);
45   //! [CppSnippetFieldDoubleBuildSubPart1_2]
46   f2->zipCoords();
47   CPPUNIT_ASSERT_EQUAL(3,f2->getMesh()->getNumberOfCells());
48   CPPUNIT_ASSERT_EQUAL(6,f2->getMesh()->getNumberOfNodes());
49   CPPUNIT_ASSERT_EQUAL(2,f2->getMesh()->getSpaceDimension());
50   CPPUNIT_ASSERT_EQUAL(2,f2->getMesh()->getMeshDimension());
51   ParaMEDMEM::MEDCouplingUMesh *m2C=dynamic_cast<ParaMEDMEM::MEDCouplingUMesh *>(const_cast<ParaMEDMEM::MEDCouplingMesh *>(f2->getMesh()));
52   CPPUNIT_ASSERT_EQUAL(13,m2C->getMeshLength());
53   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};
54   for(int i=0;i<12;i++)
55     CPPUNIT_ASSERT_DOUBLES_EQUAL(expected2[i],m2C->getCoords()->getIJ(0,i),1.e-12);
56   const double expected3[13]={3,2,3,1,3,0,2,1,4,4,5,3,2};
57   CPPUNIT_ASSERT(std::equal(expected3,expected3+13,m2C->getNodalConnectivity()->getConstPointer()));
58   const double expected4[4]={0,4,8,13};
59   CPPUNIT_ASSERT(std::equal(expected4,expected4+4,m2C->getNodalConnectivityIndex()->getConstPointer()));
60   f2->decrRef();
61   f1->decrRef();
62   //! [CppSnippetFieldDoubleBuildSubPart1_3]
63   f1=ParaMEDMEM::MEDCouplingFieldDouble::New(ParaMEDMEM::ON_NODES,ParaMEDMEM::ONE_TIME);
64   f1->setTime(2.3,5,6);
65   f1->setMesh(mesh1);
66   array=ParaMEDMEM::DataArrayDouble::New();
67   array->alloc(mesh1->getNumberOfNodes(),2);
68   const double arr2[18]={3.,103.,4.,104.,5.,105.,6.,106.,7.,107.,8.,108.,9.,109.,10.,110.,11.,111.};
69   std::copy(arr2,arr2+18,array->getPointer());  
70   f1->setArray(array);
71   array->decrRef();
72   //! [CppSnippetFieldDoubleBuildSubPart1_3]
73   //! [CppSnippetFieldDoubleBuildSubPart1_4]
74   const int part2[2]={1,2};
75   f2=f1->buildSubPart(part2,part2+2);
76   //! [CppSnippetFieldDoubleBuildSubPart1_4]
77   f2->decrRef();
78   //idem previous because nodes of cell#4 are not fully present in part3 
79   const int part3[2]={1,2};
80   ParaMEDMEM::DataArrayInt *arrr=ParaMEDMEM::DataArrayInt::New();
81   arrr->alloc(2,1);
82   std::copy(part3,part3+2,arrr->getPointer());
83   f2=f1->buildSubPart(arrr);
84   arrr->decrRef();
85   f2->decrRef();
86   //
87   const int part4[3]={1,2,4};
88   f2=f1->buildSubPart(part4,part4+3);
89   f2->decrRef();
90   //
91   f1->decrRef();
92   mesh1->decrRef();
93   return;
94 }
95
96 void CppSnippetUMeshStdBuild1()
97 {
98   //! [CppSnippetUMeshStdBuild1_1]
99   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., 
100                      0.7,0.2,0.,    -0.3,0.7,0.,    0.2,0.7,0.,     0.7,0.7,0. };
101   int nodalConnPerCell[18]={0,3,4,1, 1,4,2, 4,5,2, 6,7,4,3, 7,8,5,4};
102   //! [CppSnippetUMeshStdBuild1_1]
103   //! [CppSnippetUMeshStdBuild1_2]
104   ParaMEDMEM::MEDCouplingUMesh *mesh=ParaMEDMEM::MEDCouplingUMesh::New("My2DMesh",2);
105   //! [CppSnippetUMeshStdBuild1_2]
106   //! [CppSnippetUMeshStdBuild1_3]
107   mesh->allocateCells(5);//You can put more than 5 if you want but not less.
108   mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,nodalConnPerCell);
109   mesh->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,nodalConnPerCell+4);
110   mesh->insertNextCell(INTERP_KERNEL::NORM_TRI3,3,nodalConnPerCell+7);
111   mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,nodalConnPerCell+10);
112   mesh->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,nodalConnPerCell+14);
113   mesh->finishInsertingCells();
114   //! [CppSnippetUMeshStdBuild1_3]
115   //! [CppSnippetUMeshStdBuild1_4]
116   ParaMEDMEM::DataArrayDouble *myCoords=ParaMEDMEM::DataArrayDouble::New();
117   myCoords->alloc(9,3);//here myCoords are declared to have 3 components, mesh will deduce that its spaceDim==3. 
118   std::copy(coords,coords+27,myCoords->getPointer());
119   mesh->setCoords(myCoords);//myCorrds contains 9 tuples, that is to say mesh contains 9 nodes.
120   myCoords->decrRef();
121   //! [CppSnippetUMeshStdBuild1_4]
122   mesh->checkCoherency();
123   //! [CppSnippetUMeshStdBuild1_5]
124   mesh->decrRef();
125   //! [CppSnippetUMeshStdBuild1_5]
126 }
127
128 void CppSnippetCMeshStdBuild1()
129 {
130   //! [CppSnippetCMeshStdBuild1_1]
131   double XCoords[9]={-0.3,0.,0.1,0.3,0.45,0.47,0.49,1.,1.22};
132   double YCoords[7]={0.,0.1,0.37,0.45,0.47,0.49,1.007};
133   ParaMEDMEM::DataArrayDouble *arrX=ParaMEDMEM::DataArrayDouble::New();
134   arrX->alloc(9,1);
135   std::copy(XCoords,XCoords+9,arrX->getPointer());
136   arrX->setInfoOnComponent(0,"X [m]");
137   ParaMEDMEM::DataArrayDouble *arrY=ParaMEDMEM::DataArrayDouble::New();
138   arrY->alloc(7,1);
139   std::copy(YCoords,YCoords+7,arrY->getPointer());
140   arrY->setInfoOnComponent(0,"Y [m]");
141   //! [CppSnippetCMeshStdBuild1_1]
142   //! [CppSnippetCMeshStdBuild1_2]
143   ParaMEDMEM::MEDCouplingCMesh *mesh=ParaMEDMEM::MEDCouplingCMesh::New("My2D_CMesh");
144   mesh->setCoords(arrX,arrY);
145   arrX->decrRef();
146   arrY->decrRef();
147   //! [CppSnippetCMeshStdBuild1_2]
148   //! [CppSnippetCMeshStdBuild1_3]
149   CPPUNIT_ASSERT_EQUAL(8*6,mesh->getNumberOfCells());
150   CPPUNIT_ASSERT_EQUAL(9*7,mesh->getNumberOfNodes());
151   CPPUNIT_ASSERT_EQUAL(2,mesh->getSpaceDimension());
152   CPPUNIT_ASSERT_EQUAL(2,mesh->getMeshDimension());
153   //! [CppSnippetCMeshStdBuild1_3]
154   mesh->decrRef();
155   mesh=ParaMEDMEM::MEDCouplingCMesh::New("My2D_CMesh");
156   arrX=ParaMEDMEM::DataArrayDouble::New(); arrX->alloc(9,1); std::copy(XCoords,XCoords+9,arrX->getPointer()); arrX->setInfoOnComponent(0,"X [m]");
157   arrY=ParaMEDMEM::DataArrayDouble::New(); arrY->alloc(7,1); std::copy(YCoords,YCoords+7,arrY->getPointer()); arrY->setInfoOnComponent(0,"Y [m]");
158   //! [CppSnippetCMeshStdBuild1_2bis]
159   mesh->setCoordsAt(0,arrX);
160   arrX->decrRef();
161   mesh->setCoordsAt(1,arrY);
162   arrY->decrRef();
163   //! [CppSnippetCMeshStdBuild1_2bis]
164   CPPUNIT_ASSERT_EQUAL(8*6,mesh->getNumberOfCells());
165   CPPUNIT_ASSERT_EQUAL(9*7,mesh->getNumberOfNodes());
166   CPPUNIT_ASSERT_EQUAL(2,mesh->getSpaceDimension());
167   CPPUNIT_ASSERT_EQUAL(2,mesh->getMeshDimension());
168   //! [CppSnippetCMeshStdBuild1_4]
169   mesh->decrRef();
170   //! [CppSnippetCMeshStdBuild1_4]
171 }
172
173 void CppSnippetUMeshAdvBuild1()
174 {
175   //! [CppSnippetUMeshAdvBuild1_1]
176   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., 
177                      0.7,0.2,0.,    -0.3,0.7,0.,    0.2,0.7,0.,     0.7,0.7,0. };
178   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};
179   int nodalConnPerCellIndex[6]={0,5,9,13,18,23};
180   //! [CppSnippetUMeshAdvBuild1_1]
181   //! [CppSnippetUMeshAdvBuild1_2]
182   ParaMEDMEM::MEDCouplingUMesh *mesh=ParaMEDMEM::MEDCouplingUMesh::New("My2DMesh",2);
183   //! [CppSnippetUMeshAdvBuild1_2]
184   //! [CppSnippetUMeshAdvBuild1_3]
185   ParaMEDMEM::DataArrayInt *nodalConn=ParaMEDMEM::DataArrayInt::New();
186   nodalConn->alloc(23,1);
187   std::copy(nodalConnPerCell,nodalConnPerCell+23,nodalConn->getPointer());
188   ParaMEDMEM::DataArrayInt *nodalConnI=ParaMEDMEM::DataArrayInt::New();
189   nodalConnI->alloc(6,1);
190   std::copy(nodalConnPerCellIndex,nodalConnPerCellIndex+6,nodalConnI->getPointer());
191   mesh->setConnectivity(nodalConn,nodalConnI,true);
192   nodalConn->decrRef();// nodalConn DataArrayInt instance is owned by mesh after call to setConnectivity method. No more need here -> decrRef()
193   nodalConnI->decrRef();// nodalConnI DataArrayInt instance is owned by mesh after call to setConnectivity method. No more need here -> decrRef()
194   //! [CppSnippetUMeshAdvBuild1_3]
195   //! [CppSnippetUMeshAdvBuild1_4]
196   ParaMEDMEM::DataArrayDouble *myCoords=ParaMEDMEM::DataArrayDouble::New();
197   myCoords->alloc(9,3);//here myCoords are declared to have 3 components, mesh will deduce that its spaceDim==3. 
198   std::copy(coords,coords+27,myCoords->getPointer());
199   mesh->setCoords(myCoords);//myCorrds contains 9 tuples, that is to say mesh contains 9 nodes.
200   myCoords->decrRef();
201   //! [CppSnippetUMeshAdvBuild1_4]
202   mesh->checkCoherency();
203   //! [CppSnippetUMeshAdvBuild1_5]
204   mesh->decrRef();
205   //! [CppSnippetUMeshAdvBuild1_5]
206 }
207
208 void CppSnippetDataArrayBuild1()
209 {
210   //! [CppSnippetDataArrayBuild1_0]
211   const int nbOfNodes=12;
212   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.};
213   //
214   ParaMEDMEM::DataArrayDouble *myCoords=0;
215   double *tmp=0;
216   //! [CppSnippetDataArrayBuild1_0]
217   //
218   //! [CppSnippetDataArrayBuild1_1]
219   myCoords=ParaMEDMEM::DataArrayDouble::New();
220   myCoords->useArray(coords,false,ParaMEDMEM::CPP_DEALLOC,nbOfNodes,3);
221   //now use myCoords as you need
222   //...
223   //myCoords is no more usefully here : release it
224   myCoords->decrRef();
225   //! [CppSnippetDataArrayBuild1_1]
226   //! [CppSnippetDataArrayBuild1_2]
227   myCoords=ParaMEDMEM::DataArrayDouble::New();
228   tmp=new double[3*nbOfNodes];
229   std::copy(coords,coords+3*nbOfNodes,tmp);
230   myCoords->useArray(tmp,true,ParaMEDMEM::CPP_DEALLOC,nbOfNodes,3);
231   //now use myCoords as you need
232   //...
233   //myCoords is no more usefully, release it
234   myCoords->decrRef();
235   //! [CppSnippetDataArrayBuild1_2]
236   //! [CppSnippetDataArrayBuild1_3]
237   myCoords=ParaMEDMEM::DataArrayDouble::New();
238   tmp=(double *)malloc(3*nbOfNodes*sizeof(double));
239   std::copy(coords,coords+3*nbOfNodes,tmp);
240   myCoords->useArray(tmp,true,ParaMEDMEM::C_DEALLOC,nbOfNodes,3);
241   //now use myCoords as you need
242   //...
243   //myCoords is no more usefully here : release it
244   myCoords->decrRef();
245   //! [CppSnippetDataArrayBuild1_3]
246   //! [CppSnippetDataArrayBuild1_4]
247   myCoords=ParaMEDMEM::DataArrayDouble::New();
248   myCoords->alloc(nbOfNodes,3);
249   tmp=myCoords->getPointer();
250   std::copy(coords,coords+3*nbOfNodes,tmp);
251   myCoords->declareAsNew();//you have modified data pointed by internal pointer notify object
252   //now use myCoords as you need
253   //...
254   //myCoords is no more usefully here : release it
255   myCoords->decrRef();
256   //! [CppSnippetDataArrayBuild1_4]
257   myCoords=ParaMEDMEM::DataArrayDouble::New();
258   myCoords->alloc(nbOfNodes,3);
259   tmp=myCoords->getPointer();
260   std::copy(coords,coords+3*nbOfNodes,tmp);
261   ParaMEDMEM::DataArrayDouble *myCoordsCpy=0;
262   //! [CppSnippetDataArrayBuild1_5]
263   myCoordsCpy=myCoords->deepCpy();
264   //! [CppSnippetDataArrayBuild1_5]
265   //! [CppSnippetDataArrayBuild1_6]
266   CPPUNIT_ASSERT(myCoordsCpy->isEqual(*myCoords,1e-12));
267   myCoordsCpy->setIJ(0,0,1000.);
268   CPPUNIT_ASSERT(!myCoordsCpy->isEqual(*myCoords,1e-12));//myCoordsCpy only has been modified
269   //! [CppSnippetDataArrayBuild1_6]
270   //! [CppSnippetDataArrayBuild1_7]
271   myCoordsCpy->decrRef();
272   //! [CppSnippetDataArrayBuild1_7]
273   //! [CppSnippetDataArrayBuild1_5bis]
274   myCoordsCpy=myCoords->performCpy(true);
275   //! [CppSnippetDataArrayBuild1_5bis]
276   CPPUNIT_ASSERT(myCoordsCpy->isEqual(*myCoords,1e-12));
277   myCoordsCpy->setIJ(0,0,1000.);
278   CPPUNIT_ASSERT(!myCoordsCpy->isEqual(*myCoords,1e-12));//myCoordsCpy only has been modified
279   myCoordsCpy->decrRef();
280   //! [CppSnippetDataArrayBuild1_8]
281   myCoordsCpy=myCoords->performCpy(false);
282   //! [CppSnippetDataArrayBuild1_8]
283   //! [CppSnippetDataArrayBuild1_9]
284   CPPUNIT_ASSERT(myCoordsCpy->isEqual(*myCoords,1e-12));
285   myCoordsCpy->setIJ(0,0,1000.);
286   CPPUNIT_ASSERT(myCoordsCpy->isEqual(*myCoords,1e-12));//myCoords and myCoordsCpy have been modified simultaneously
287   //! [CppSnippetDataArrayBuild1_9]
288   //! [CppSnippetDataArrayBuild1_10]
289   myCoordsCpy->decrRef();
290   //! [CppSnippetDataArrayBuild1_10]
291   //! [CppSnippetDataArrayBuild1_11]
292   myCoordsCpy=ParaMEDMEM::DataArrayDouble::New();
293   //! [CppSnippetDataArrayBuild1_11]
294   //! [CppSnippetDataArrayBuild1_12]
295   myCoordsCpy->cpyFrom(*myCoords);
296   //! [CppSnippetDataArrayBuild1_12]
297   //! [CppSnippetDataArrayBuild1_13]
298   CPPUNIT_ASSERT(myCoordsCpy->isEqual(*myCoords,1e-12));
299   myCoordsCpy->setIJ(0,0,2000.);
300   CPPUNIT_ASSERT(!myCoordsCpy->isEqual(*myCoords,1e-12));//myCoordsCpy only has been modified
301   //! [CppSnippetDataArrayBuild1_13]
302   //! [CppSnippetDataArrayBuild1_14]
303   myCoordsCpy->decrRef();
304   //! [CppSnippetDataArrayBuild1_14]
305   myCoords->decrRef();
306 }
307
308 void CppSnippetFieldDoubleBuild1()
309 {
310   double XCoords[9]={-0.3,0.07,0.1,0.3,0.45,0.47,0.49,1.,1.22};
311   double YCoords[7]={0.07,0.1,0.37,0.45,0.47,0.49,1.007};
312   ParaMEDMEM::DataArrayDouble *arrX=ParaMEDMEM::DataArrayDouble::New(); arrX->alloc(9,1); std::copy(XCoords,XCoords+9,arrX->getPointer()); arrX->setInfoOnComponent(0,"X [m]");
313   ParaMEDMEM::DataArrayDouble *arrY=ParaMEDMEM::DataArrayDouble::New(); arrY->alloc(7,1); std::copy(YCoords,YCoords+7,arrY->getPointer()); arrY->setInfoOnComponent(0,"Y [m]"); 
314   ParaMEDMEM::MEDCouplingCMesh *mesh=ParaMEDMEM::MEDCouplingCMesh::New("My2D_CMesh");
315   mesh->setCoords(arrX,arrY); arrX->decrRef(); arrY->decrRef();
316   //! [CppSnippetFieldDoubleBuild1_1]
317   ParaMEDMEM::MEDCouplingFieldDouble* fieldOnCells=ParaMEDMEM::MEDCouplingFieldDouble::New(ParaMEDMEM::ON_CELLS,ParaMEDMEM::NO_TIME);
318   fieldOnCells->setName("MyTensorFieldOnCellNoTime");
319   fieldOnCells->setMesh(mesh);
320   mesh->decrRef(); // no more need of mesh because mesh has been attached to fieldOnCells
321   ParaMEDMEM::DataArrayDouble *array=ParaMEDMEM::DataArrayDouble::New();
322   array->alloc(fieldOnCells->getMesh()->getNumberOfCells(),9);//Implicitely fieldOnCells will be a 9 components field.
323   array->fillWithValue(7.);
324   fieldOnCells->setArray(array);
325   array->decrRef();
326   // fieldOnCells is now usable
327   // ...
328   // fieldOnCells is no more usefully here : release it
329   fieldOnCells->decrRef();
330   //! [CppSnippetFieldDoubleBuild1_1]
331   arrX=ParaMEDMEM::DataArrayDouble::New(); arrX->alloc(9,1); std::copy(XCoords,XCoords+9,arrX->getPointer()); arrX->setInfoOnComponent(0,"X [m]");
332   arrY=ParaMEDMEM::DataArrayDouble::New(); arrY->alloc(7,1); std::copy(YCoords,YCoords+7,arrY->getPointer()); arrY->setInfoOnComponent(0,"Y [m]"); 
333   mesh=ParaMEDMEM::MEDCouplingCMesh::New("My2D_CMesh");
334   mesh->setCoords(arrX,arrY); arrX->decrRef(); arrY->decrRef();
335   //! [CppSnippetFieldDoubleBuild1_2]
336   ParaMEDMEM::MEDCouplingFieldDouble *f1=mesh->fillFromAnalytic(ParaMEDMEM::ON_CELLS,1,"x*x+y*y*3+2.*x");//f1 is scalar
337   ParaMEDMEM::MEDCouplingFieldDouble *f2=mesh->fillFromAnalytic(ParaMEDMEM::ON_CELLS,1,"cos(x+y/x)");//f2 is scalar too
338   ParaMEDMEM::MEDCouplingFieldDouble *f2bis=mesh->fillFromAnalytic(ParaMEDMEM::ON_CELLS,2,"x*x*IVec+3*y*JVec");//f2bis is a vectors field
339   ParaMEDMEM::MEDCouplingFieldDouble *f3=(*f1)+(*f2);//f3 scalar
340   ParaMEDMEM::MEDCouplingFieldDouble *f4=(*f3)/(*f2);//f4 scalar
341   f2bis->applyFunc(1,"sqrt(x*x+y*y)");//f2bis becomes scalar
342   ParaMEDMEM::MEDCouplingFieldDouble *f5=(*f2bis)*(*f4);//f5 scalar
343   const double pos1[2]={0.48,0.38};
344   double res;
345   f4->getValueOn(pos1,&res);//f4 is scalar so the returned value is of size 1.
346   // ...
347   //! [CppSnippetFieldDoubleBuild1_2]
348   mesh->decrRef();
349   //! [CppSnippetFieldDoubleBuild1_3]
350   // f1, f2, f2bis, f3, f4, f5 are no more usefully here : release them
351   f1->decrRef();
352   f2->decrRef();
353   f2bis->decrRef();
354   f3->decrRef();
355   f4->decrRef();
356   f5->decrRef();
357   //! [CppSnippetFieldDoubleBuild1_3]
358 }
359
360 void CppSnippetFieldDoubleBuild2()
361 {
362   double XCoords[9]={-0.3,0.,0.1,0.3,0.45,0.47,0.49,1.,1.22};
363   double YCoords[7]={0.,0.1,0.37,0.45,0.47,0.49,1.007};
364   ParaMEDMEM::DataArrayDouble *arrX=ParaMEDMEM::DataArrayDouble::New(); arrX->alloc(9,1); std::copy(XCoords,XCoords+9,arrX->getPointer()); arrX->setInfoOnComponent(0,"X [m]");
365   ParaMEDMEM::DataArrayDouble *arrY=ParaMEDMEM::DataArrayDouble::New(); arrY->alloc(7,1); std::copy(YCoords,YCoords+7,arrY->getPointer()); arrY->setInfoOnComponent(0,"Y [m]"); 
366   ParaMEDMEM::MEDCouplingCMesh *mesh=ParaMEDMEM::MEDCouplingCMesh::New("My2D_CMesh");
367   mesh->setCoords(arrX,arrY); arrX->decrRef(); arrY->decrRef();
368   //! [CppSnippetFieldDoubleBuild2_1]
369   ParaMEDMEM::MEDCouplingFieldDouble* fieldOnNodes=ParaMEDMEM::MEDCouplingFieldDouble::New(ParaMEDMEM::ON_NODES,ParaMEDMEM::NO_TIME);
370   fieldOnNodes->setName("MyScalarFieldOnNodeNoTime");
371   fieldOnNodes->setMesh(mesh);
372   mesh->decrRef(); // no more need of mesh because mesh has been attached to fieldOnNodes
373   ParaMEDMEM::DataArrayDouble *array=ParaMEDMEM::DataArrayDouble::New();
374   array->alloc(fieldOnNodes->getMesh()->getNumberOfNodes(),1);//Implicitely fieldOnNodes will be a 1 component field.
375   array->fillWithValue(8.);
376   fieldOnNodes->setArray(array);
377   array->decrRef();
378   // fieldOnNodes is now usable
379   // ...
380   // fieldOnNodes is no more usefully here : release it
381   fieldOnNodes->decrRef();
382   //! [CppSnippetFieldDoubleBuild2_1]
383 }
384
385 void CppSnippetFieldDoubleBuild3()
386 {
387   double XCoords[9]={-0.3,0.,0.1,0.3,0.45,0.47,0.49,1.,1.22};
388   double YCoords[7]={0.,0.1,0.37,0.45,0.47,0.49,1.007};
389   ParaMEDMEM::DataArrayDouble *arrX=ParaMEDMEM::DataArrayDouble::New(); arrX->alloc(9,1); std::copy(XCoords,XCoords+9,arrX->getPointer()); arrX->setInfoOnComponent(0,"X [m]");
390   ParaMEDMEM::DataArrayDouble *arrY=ParaMEDMEM::DataArrayDouble::New(); arrY->alloc(7,1); std::copy(YCoords,YCoords+7,arrY->getPointer()); arrY->setInfoOnComponent(0,"Y [m]"); 
391   ParaMEDMEM::MEDCouplingCMesh *mesh=ParaMEDMEM::MEDCouplingCMesh::New("My2D_CMesh");
392   mesh->setCoords(arrX,arrY); arrX->decrRef(); arrY->decrRef();
393   //! [CppSnippetFieldDoubleBuild3_1]
394   ParaMEDMEM::MEDCouplingFieldDouble* fieldOnCells=ParaMEDMEM::MEDCouplingFieldDouble::New(ParaMEDMEM::ON_CELLS,ParaMEDMEM::ONE_TIME);
395   fieldOnCells->setName("MyTensorFieldOnCellNoTime");
396   fieldOnCells->setTimeUnit("ms"); // Time unit is ms.
397   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
398   fieldOnCells->setMesh(mesh);
399   mesh->decrRef(); // no more need of mesh because mesh has been attached to fieldOnCells
400   ParaMEDMEM::DataArrayDouble *array=ParaMEDMEM::DataArrayDouble::New();
401   array->alloc(fieldOnCells->getMesh()->getNumberOfCells(),2);//Implicitely fieldOnCells will be a 2 components field.
402   array->fillWithValue(7.);
403   fieldOnCells->setArray(array);
404   array->decrRef();
405   // fieldOnCells is now usable
406   // ...
407   // fieldOnCells is no more usefully here : release it
408   fieldOnCells->decrRef();
409   //! [CppSnippetFieldDoubleBuild3_1]
410 }
411
412 void CppSnippetFieldDoubleBuild4()
413 {
414   double XCoords[9]={-0.3,0.,0.1,0.3,0.45,0.47,0.49,1.,1.22};
415   double YCoords[7]={0.,0.1,0.37,0.45,0.47,0.49,1.007};
416   ParaMEDMEM::DataArrayDouble *arrX=ParaMEDMEM::DataArrayDouble::New(); arrX->alloc(9,1); std::copy(XCoords,XCoords+9,arrX->getPointer()); arrX->setInfoOnComponent(0,"X [m]");
417   ParaMEDMEM::DataArrayDouble *arrY=ParaMEDMEM::DataArrayDouble::New(); arrY->alloc(7,1); std::copy(YCoords,YCoords+7,arrY->getPointer()); arrY->setInfoOnComponent(0,"Y [m]"); 
418   ParaMEDMEM::MEDCouplingCMesh *mesh=ParaMEDMEM::MEDCouplingCMesh::New("My2D_CMesh");
419   mesh->setCoords(arrX,arrY); arrX->decrRef(); arrY->decrRef();
420   //! [CppSnippetFieldDoubleBuild4_1]
421   ParaMEDMEM::MEDCouplingFieldDouble* fieldOnNodes=ParaMEDMEM::MEDCouplingFieldDouble::New(ParaMEDMEM::ON_NODES,ParaMEDMEM::CONST_ON_TIME_INTERVAL);
422   fieldOnNodes->setName("MyVecFieldOnNodeWithConstTime");
423   fieldOnNodes->setTimeUnit("ms"); // Time unit is ms.
424   fieldOnNodes->setStartTime(4.22,2,-1);
425   fieldOnNodes->setEndTime(6.44,4,-1); // fieldOnNodes is defined in interval [4.22 ms,6.44 ms] 
426   fieldOnNodes->setMesh(mesh);
427   mesh->decrRef(); // no more need of mesh because mesh has been attached to fieldOnNodes
428   ParaMEDMEM::DataArrayDouble *array=ParaMEDMEM::DataArrayDouble::New();
429   array->alloc(fieldOnNodes->getMesh()->getNumberOfNodes(),3);//Implicitely fieldOnNodes will be a 3 components field.
430   array->fillWithValue(8.);
431   fieldOnNodes->setArray(array);
432   array->decrRef();
433   // fieldOnNodes is now usable
434   // ...
435   // fieldOnNodes is no more usefully here : release it
436   fieldOnNodes->decrRef();
437   //! [CppSnippetFieldDoubleBuild4_1]
438 }
439
440 int main(int argc, char *argv[])
441 {
442   CppExampleFieldDoubleBuildSubPart1();
443   CppSnippetUMeshStdBuild1();
444   CppSnippetUMeshAdvBuild1();
445   CppSnippetDataArrayBuild1();
446   CppSnippetCMeshStdBuild1();
447   CppSnippetFieldDoubleBuild1();
448   CppSnippetFieldDoubleBuild2();
449   CppSnippetFieldDoubleBuild3();
450   CppSnippetFieldDoubleBuild4();
451   return 0;
452 }