1 // Copyright (C) 2007-2012 CEA/DEN, EDF R&D
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.
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.
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
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 // Author : Anthony Geay (CEA/DEN)
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"
29 void CppExampleFieldDoubleBuildSubPart1()
31 //! [CppSnippetFieldDoubleBuildSubPart1_1]
32 ParaMEDMEM::MEDCouplingUMesh *mesh1=ParaMEDMEM::MEDCouplingBasicsTest::build2DTargetMesh_1();
33 ParaMEDMEM::MEDCouplingFieldDouble *f1=ParaMEDMEM::MEDCouplingFieldDouble::New(ParaMEDMEM::ON_CELLS,ParaMEDMEM::ONE_TIME);
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());
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]
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};
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()));
63 //! [CppSnippetFieldDoubleBuildSubPart1_3]
64 f1=ParaMEDMEM::MEDCouplingFieldDouble::New(ParaMEDMEM::ON_NODES,ParaMEDMEM::ONE_TIME);
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());
73 //! [CppSnippetFieldDoubleBuildSubPart1_3]
74 //! [CppSnippetFieldDoubleBuildSubPart1_4]
75 const int part2[2]={1,2};
76 f2=f1->buildSubPart(part2,part2+2);
77 //! [CppSnippetFieldDoubleBuildSubPart1_4]
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();
83 std::copy(part3,part3+2,arrr->getPointer());
84 f2=f1->buildSubPart(arrr);
88 const int part4[3]={1,2,4};
89 f2=f1->buildSubPart(part4,part4+3);
97 void CppSnippetUMeshStdBuild1()
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.
122 //! [CppSnippetUMeshStdBuild1_4]
123 mesh->checkCoherency();
124 //! [CppSnippetUMeshStdBuild1_5]
126 //! [CppSnippetUMeshStdBuild1_5]
129 void CppSnippetCMeshStdBuild1()
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();
136 std::copy(XCoords,XCoords+9,arrX->getPointer());
137 arrX->setInfoOnComponent(0,"X [m]");
138 ParaMEDMEM::DataArrayDouble *arrY=ParaMEDMEM::DataArrayDouble::New();
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);
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]
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);
162 mesh->setCoordsAt(1,arrY);
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]
171 //! [CppSnippetCMeshStdBuild1_4]
174 void CppSnippetUMeshAdvBuild1()
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.
202 //! [CppSnippetUMeshAdvBuild1_4]
203 mesh->checkCoherency();
204 //! [CppSnippetUMeshAdvBuild1_5]
206 //! [CppSnippetUMeshAdvBuild1_5]
209 void CppSnippetDataArrayBuild1()
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.};
215 ParaMEDMEM::DataArrayDouble *myCoords=0;
217 //! [CppSnippetDataArrayBuild1_0]
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
224 //myCoords is no more usefully here : release it
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
234 //myCoords is no more usefully, release it
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
244 //myCoords is no more usefully here : release it
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
255 //myCoords is no more usefully here : release it
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]
309 void CppSnippetFieldDoubleBuild1()
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);
327 // fieldOnCells is now usable
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};
346 f4->getValueOn(pos1,&res);//f4 is scalar so the returned value is of size 1.
348 //! [CppSnippetFieldDoubleBuild1_2]
350 //! [CppSnippetFieldDoubleBuild1_3]
351 // f1, f2, f2bis, f3, f4, f5 are no more usefully here : release them
358 //! [CppSnippetFieldDoubleBuild1_3]
361 void CppSnippetFieldDoubleBuild2()
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);
379 // fieldOnNodes is now usable
381 // fieldOnNodes is no more usefully here : release it
382 fieldOnNodes->decrRef();
383 //! [CppSnippetFieldDoubleBuild2_1]
386 void CppSnippetFieldDoubleBuild3()
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);
406 // fieldOnCells is now usable
408 // fieldOnCells is no more usefully here : release it
409 fieldOnCells->decrRef();
410 //! [CppSnippetFieldDoubleBuild3_1]
413 void CppSnippetFieldDoubleBuild4()
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);
434 // fieldOnNodes is now usable
436 // fieldOnNodes is no more usefully here : release it
437 fieldOnNodes->decrRef();
438 //! [CppSnippetFieldDoubleBuild4_1]
441 int main(int argc, char *argv[])
443 CppExampleFieldDoubleBuildSubPart1();
444 CppSnippetUMeshStdBuild1();
445 CppSnippetUMeshAdvBuild1();
446 CppSnippetDataArrayBuild1();
447 CppSnippetCMeshStdBuild1();
448 CppSnippetFieldDoubleBuild1();
449 CppSnippetFieldDoubleBuild2();
450 CppSnippetFieldDoubleBuild3();
451 CppSnippetFieldDoubleBuild4();