1 // Copyright (C) 2007-2013 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"
30 void CppExample_MEDCouplingPointSet_scale()
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 ));
53 initCoords->decrRef();
54 //! [CppSnippet_MEDCouplingPointSet_scale_3]
57 void CppExample_MEDCouplingPointSet_translate()
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 ));
79 initCoords->decrRef();
80 //! [CppSnippet_MEDCouplingPointSet_translate_3]
83 void CppExample_MEDCouplingPointSet_rotate()
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 ));
108 coordsArr->decrRef();
109 //! [CppSnippet_MEDCouplingPointSet_rotate_4]
112 void CppExample_MEDCouplingPointSet_getBoundingBox()
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
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]
126 mesh->getBoundingBox( (double*) bbox );
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]
136 void CppExample_MEDCouplingPointSet_getNodeIdsNearPoint()
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
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);
157 const int expectedIDs[3] = {0,2,4};
158 DataArrayInt * okIDs = ids->getIdsEqualList ( expectedIDs, expectedIDs+3 );
159 CPPUNIT_ASSERT_EQUAL(3, okIDs->getNumberOfTuples());
165 //! [CppSnippet_MEDCouplingPointSet_getNodeIdsNearPoint_2]
167 void CppExample_MEDCouplingPointSet_getNodeIdsNearPoints()
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
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
189 1.1, 0.002}; // ~ nodes #3, #4 and #5
190 DataArrayInt *ids, *idsIndex;
191 mesh->getNodeIdsNearPoints(points, nbOfPoints, 1e-13,ids,idsIndex);
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());
203 //! [CppSnippet_MEDCouplingPointSet_getNodeIdsNearPoints_2]
206 void CppExample_MEDCouplingPointSet_findCommonNodes()
208 using namespace ParaMEDMEM;
209 //! [CppSnippet_MEDCouplingPointSet_findCommonNodes_1]
210 double coords[6*2]={0.3,-0.301, // 0
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]
234 void CppExample_MEDCouplingPointSet_getCoordinatesOfNode()
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]
254 void CppExample_DataArrayInt_buildPermutationArr()
256 using namespace ParaMEDMEM;
257 //! [CppSnippet_DataArrayInt_buildPermutationArr_1]
258 DataArrayInt *a=DataArrayInt::New();
259 const int vala[5]={4,5,6,7,8};
261 std::copy(vala,vala+5,a->getPointer());
262 DataArrayInt *b=DataArrayInt::New();
263 const int valb[5]={5,4,8,6,7};
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));
278 void CppExample_DataArrayInt_invertArrayO2N2N2O()
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();
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};
289 CPPUNIT_ASSERT_EQUAL(expected1[i],da2->getIJ(i,0));
290 //! [CppSnippet_DataArrayInt_invertArrayO2N2N2O_1]
295 void CppExample_DataArrayInt_invertArrayN2O2O2N()
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();
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};
306 CPPUNIT_ASSERT_EQUAL(expected1[i],da2->getIJ(i,0));
307 //! [CppSnippet_DataArrayInt_invertArrayN2O2O2N_1]
312 void CppExample_DataArrayDouble_getIdsInRange()
314 using namespace ParaMEDMEM;
315 //! [CppSnippet_DataArrayDouble_getIdsInRange_1]
316 DataArrayDouble *da=DataArrayDouble::New();
320 DataArrayInt* da2 = da->getIdsInRange( 2.5, 6 );
321 //! [CppSnippet_DataArrayDouble_getIdsInRange_1]
326 void CppExample_DataArrayDouble_findCommonTuples()
328 using namespace ParaMEDMEM;
329 //! [CppSnippet_DataArrayDouble_findCommonTuples1]
330 DataArrayDouble *da=DataArrayDouble::New();
332 const double array2[12]={2.3,2.3, // 0
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);
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()));
352 //! [CppSnippet_DataArrayDouble_findCommonTuples2]
355 void CppExample_DataArrayDouble_Meld1()
357 using namespace ParaMEDMEM;
358 //! [CppSnippet_DataArrayDouble_Meld1_1]
359 const int sameNbTuples = 7;
361 DataArrayDouble *da1=DataArrayDouble::New();
362 da1->alloc(sameNbTuples,2);
363 da1->fillWithValue(7.);
364 da1->setInfoOnComponent(0,"c0da1");
365 da1->setInfoOnComponent(1,"c1da1");
367 DataArrayDouble *da2=DataArrayDouble::New();
368 da2->alloc(sameNbTuples,1);
370 da2->setInfoOnComponent(0,"c0da2");
373 //! [CppSnippet_DataArrayDouble_Meld1_1]
374 //! [CppSnippet_DataArrayDouble_Meld1_2]
377 //! [CppSnippet_DataArrayDouble_Meld1_2]
380 void CppExample_DataArrayInt_Meld1()
382 using namespace ParaMEDMEM;
383 //! [CppSnippet_DataArrayInt_Meld1_1]
384 const int sameNbTuples = 7;
386 DataArrayInt *da1=DataArrayInt::New();
387 da1->alloc(sameNbTuples,2);
388 da1->fillWithValue(7);
389 da1->setInfoOnComponent(0,"c0da1");
390 da1->setInfoOnComponent(1,"c1da1");
392 DataArrayInt *da2=DataArrayInt::New();
393 da2->alloc(sameNbTuples,1);
395 da2->setInfoOnComponent(0,"c0da2");
398 //! [CppSnippet_DataArrayInt_Meld1_1]
399 //! [CppSnippet_DataArrayInt_Meld1_2]
402 //! [CppSnippet_DataArrayInt_Meld1_2]
405 void CppExampleFieldDoubleBuildSubPart1()
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);
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());
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]
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()));
439 //! [CppSnippetFieldDoubleBuildSubPart1_3]
440 f1=ParaMEDMEM::MEDCouplingFieldDouble::New(ParaMEDMEM::ON_NODES,ParaMEDMEM::ONE_TIME);
441 f1->setTime(2.3,5,6);
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());
449 //! [CppSnippetFieldDoubleBuildSubPart1_3]
450 //! [CppSnippetFieldDoubleBuildSubPart1_4]
451 const int part2[2]={1,2};
452 f2=f1->buildSubPart(part2,part2+2);
453 //! [CppSnippetFieldDoubleBuildSubPart1_4]
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();
459 std::copy(part3,part3+2,arrr->getPointer());
460 f2=f1->buildSubPart(arrr);
464 const int part4[3]={1,2,4};
465 f2=f1->buildSubPart(part4,part4+3);
473 void CppSnippetUMeshStdBuild1()
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.
498 //! [CppSnippetUMeshStdBuild1_4]
499 mesh->checkCoherency();
500 //! [CppSnippetUMeshStdBuild1_5]
502 //! [CppSnippetUMeshStdBuild1_5]
505 void CppSnippetCMeshStdBuild1()
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();
512 std::copy(XCoords,XCoords+9,arrX->getPointer());
513 arrX->setInfoOnComponent(0,"X [m]");
514 ParaMEDMEM::DataArrayDouble *arrY=ParaMEDMEM::DataArrayDouble::New();
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);
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]
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);
538 mesh->setCoordsAt(1,arrY);
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]
547 //! [CppSnippetCMeshStdBuild1_4]
550 void CppSnippetUMeshAdvBuild1()
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.
578 //! [CppSnippetUMeshAdvBuild1_4]
579 mesh->checkCoherency();
580 //! [CppSnippetUMeshAdvBuild1_5]
582 //! [CppSnippetUMeshAdvBuild1_5]
585 void CppSnippetDataArrayBuild1()
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.};
591 ParaMEDMEM::DataArrayDouble *myCoords=0;
593 //! [CppSnippetDataArrayBuild1_0]
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
600 //myCoords is no more useful here : release it
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
610 //myCoords is no more useful, release it
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
620 //myCoords is no more useful here : release it
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
631 //myCoords is no more useful here : release it
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]
683 //! [CppSnippetDataArrayBuild1_14]
686 void CppSnippetFieldDoubleBuild1()
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);
704 // fieldOnCells is now usable
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};
723 f4->getValueOn(pos1,&res);//f4 is scalar so the returned value is of size 1.
725 //! [CppSnippetFieldDoubleBuild1_2]
727 //! [CppSnippetFieldDoubleBuild1_3]
728 // f1, f2, f2bis, f3, f4, f5 are no more useful here : release them
735 //! [CppSnippetFieldDoubleBuild1_3]
738 void CppSnippetFieldDoubleBuild2()
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);
756 // fieldOnNodes is now usable
758 // fieldOnNodes is no more useful here : release it
759 fieldOnNodes->decrRef();
760 //! [CppSnippetFieldDoubleBuild2_1]
763 void CppSnippetFieldDoubleBuild3()
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);
783 // fieldOnCells is now usable
785 // fieldOnCells is no more useful here : release it
786 fieldOnCells->decrRef();
787 //! [CppSnippetFieldDoubleBuild3_1]
790 void CppSnippetFieldDoubleBuild4()
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);
811 // fieldOnNodes is now usable
813 // fieldOnNodes is no more useful here : release it
814 fieldOnNodes->decrRef();
815 //! [CppSnippetFieldDoubleBuild4_1]
818 int main(int argc, char *argv[])
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();