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