Salome HOME
update due to bugs PAL8113 and another I do not remember the number ;) .
[modules/med.git] / src / MEDMEM / test_MEDMEM_Meshing.cxx
1 #include "MEDMEM_Meshing.hxx"
2 #include "MEDMEM_Group.hxx"
3 #include "MEDMEM_Field.hxx"
4
5 using namespace std;
6 using namespace MEDMEM;
7 using namespace MED_EN;
8
9 int main (int argc, char ** argv) {
10
11   if (argc <2) {
12     cerr << "Usage : " << argv[0] 
13          << " filenameRoot" << endl;
14     cerr << "        where filenameRoot is a root filename, the program will produce" << endl;
15     cerr << "        2 files filenameRoot.med and filenameRoot.vtk" << endl << endl;
16     exit(-1);
17   }
18
19   // filename to save the generated MESH
20   string filenameRoot = argv[1] ;
21
22   string filenameMed = filenameRoot+".med";
23   string filenameVtk = filenameRoot+".vtk";
24
25   MESHING myMeshing ;
26   myMeshing.setName("meshing") ;
27
28   // define coordinates
29
30   int SpaceDimension = 3 ;
31   int NumberOfNodes = 19 ;
32   double Coordinates[57] = {
33     0.0, 0.0, 0.0, 
34     0.0, 0.0, 1.0, 
35     2.0, 0.0, 1.0, 
36     0.0, 2.0, 1.0, 
37     -2.0, 0.0, 1.0, 
38     0.0, -2.0, 1.0, 
39     1.0, 1.0, 2.0, 
40     -1.0, 1.0, 2.0, 
41     -1.0, -1.0, 2.0, 
42     1.0, -1.0, 2.0, 
43     1.0, 1.0, 3.0, 
44     -1.0, 1.0, 3.0, 
45     -1.0, -1.0, 3.0, 
46     1.0, -1.0, 3.0, 
47     1.0, 1.0, 4.0, 
48     -1.0, 1.0, 4.0, 
49     -1.0, -1.0, 4.0, 
50     1.0, -1.0, 4.0,
51     0.0, 0.0, 5.0
52   };
53
54   myMeshing.setCoordinates(SpaceDimension,NumberOfNodes,Coordinates,"CARTESIAN",MED_FULL_INTERLACE);
55
56   string Names[3] = { "X","Y","Z" } ;
57   myMeshing.setCoordinatesNames(Names);
58
59   string Units[3] = { "cm","cm","cm" } ;
60   myMeshing.setCoordinatesUnits(Units) ;
61
62   // define conectivities
63
64   // cell part
65   
66   const int NumberOfTypes = 3 ;
67   medGeometryElement Types[NumberOfTypes] = {MED_TETRA4,MED_PYRA5,MED_HEXA8} ;
68   const int NumberOfElements[NumberOfTypes] = {12,2,2} ;
69
70   myMeshing.setNumberOfTypes(NumberOfTypes,MED_CELL);
71   myMeshing.setTypes(Types,MED_CELL);
72   myMeshing.setNumberOfElements(NumberOfElements,MED_CELL);
73
74   const int sizeTetra = 12*4 ;
75   int ConnectivityTetra[sizeTetra]=
76   {
77     1,2,3,6,
78     1,2,4,3,
79     1,2,5,4,
80     1,2,6,5,
81     2,7,4,3,
82     2,8,5,4,
83     2,9,6,5,
84     2,10,3,6,
85     2,7,3,10,
86     2,8,4,7,
87     2,9,5,8,
88     2,10,6,9
89   };
90   
91   myMeshing.setConnectivity(ConnectivityTetra,MED_CELL,MED_TETRA4);
92
93   int ConnectivityPyra[2*5]=
94   {
95     7,8,9,10,2,
96     15,18,17,16,19
97   };
98
99   myMeshing.setConnectivity(ConnectivityPyra,MED_CELL,MED_PYRA5);
100
101   int ConnectivityHexa[2*8]=
102   {
103     11,12,13,14,7,8,9,10,
104     15,16,17,18,11,12,13,14
105   };
106
107   myMeshing.setConnectivity(ConnectivityHexa,MED_CELL,MED_HEXA8);
108
109   // face part
110
111   const int NumberOfFacesTypes = 2 ;
112   medGeometryElement FacesTypes[NumberOfFacesTypes] = {MED_TRIA3,MED_QUAD4} ;
113   const int NumberOfFacesElements[NumberOfFacesTypes] = {4,4} ;
114
115   myMeshing.setNumberOfTypes(NumberOfFacesTypes,MED_FACE);
116   myMeshing.setTypes(FacesTypes,MED_FACE);
117   myMeshing.setNumberOfElements(NumberOfFacesElements,MED_FACE);
118
119   const int sizeTria = 3*4 ;
120   int ConnectivityTria[sizeTria]=
121   {
122     1,4,3,
123     1,5,4,
124     1,6,5,
125     1,3,6
126   };
127   
128   myMeshing.setConnectivity(ConnectivityTria,MED_FACE,MED_TRIA3);
129
130   int ConnectivityQua[4*4]=
131   {
132     7,8,9,10,
133     11,12,13,14,
134     11,7,8,12,
135     12,8,9,13
136   };
137
138   myMeshing.setConnectivity(ConnectivityQua,MED_FACE,MED_QUAD4);
139
140   // edge part
141
142   // not yet implemented : if set, results are unpredictable.
143
144   // Some groups :
145
146   // Node :
147   {
148     GROUP myGroup ;
149     myGroup.setName("SomeNodes");
150     myGroup.setMesh(&myMeshing);
151     myGroup.setEntity(MED_NODE);
152     myGroup.setNumberOfGeometricType(1);
153     medGeometryElement myTypes[1] = {MED_NONE};
154     myGroup.setGeometricType(myTypes);
155     const int myNumberOfElements[1] = {4} ;
156     myGroup.setNumberOfElements(myNumberOfElements);
157     const int index[1+1] = {1,5} ;
158     const int value[4]= { 1,4,5,7} ;
159     myGroup.setNumber(index,value);
160     
161     myMeshing.addGroup(myGroup);
162   }
163   {
164     GROUP myGroup ;
165     myGroup.setName("OtherNodes");
166     myGroup.setMesh(&myMeshing);
167     myGroup.setEntity(MED_NODE);
168     myGroup.setNumberOfGeometricType(1);
169     medGeometryElement myTypes[1] = {MED_NONE};
170     myGroup.setGeometricType(myTypes);
171     const int myNumberOfElements[1] = {3} ;
172     myGroup.setNumberOfElements(myNumberOfElements);
173     const int index[1+1] = {1,4} ;
174     const int value[3]= { 2,3,6} ;
175     myGroup.setNumber(index,value);
176     
177     myMeshing.addGroup(myGroup);
178   }
179
180   // Cell :
181   {
182     GROUP myGroup ;
183     myGroup.setName("SomeCells");
184     myGroup.setMesh(&myMeshing);
185     myGroup.setEntity(MED_CELL);
186     myGroup.setNumberOfGeometricType(3);
187     medGeometryElement myTypes[3] = {MED_TETRA4,MED_PYRA5,MED_HEXA8};
188     myGroup.setGeometricType(myTypes);
189     const int myNumberOfElements[3] = {4,1,2} ;
190     myGroup.setNumberOfElements(myNumberOfElements);
191     const int index[3+1] = {1,5,6,8} ;
192     const int value[4+1+2]=
193     {
194       2,7,8,12,
195       13,
196       15,16
197     };
198     myGroup.setNumber(index,value);
199     
200     myMeshing.addGroup(myGroup);
201   }
202   {
203     GROUP myGroup ;
204     myGroup.setName("OtherCells");
205     myGroup.setMesh(&myMeshing);
206     myGroup.setEntity(MED_CELL);
207     myGroup.setNumberOfGeometricType(2);
208     medGeometryElement myTypes[] = {MED_TETRA4,MED_PYRA5};
209     myGroup.setGeometricType(myTypes);
210     const int myNumberOfElements[] = {4,1} ;
211     myGroup.setNumberOfElements(myNumberOfElements);
212     const int index[2+1] = {1,5,6} ;
213     const int value[4+1]=
214     {
215       3,4,5,9,
216       14
217     };
218     myGroup.setNumber(index,value);
219     
220     myMeshing.addGroup(myGroup);
221   }
222
223   // Face :
224   {
225     GROUP myGroup ;
226     myGroup.setName("SomeFaces");
227     myGroup.setMesh(&myMeshing);
228     myGroup.setEntity(MED_FACE);
229     myGroup.setNumberOfGeometricType(2);
230     medGeometryElement myTypes[2] = {MED_TRIA3,MED_QUAD4};
231     myGroup.setGeometricType(myTypes);
232     const int myNumberOfElements[2] = {2,3} ;
233     myGroup.setNumberOfElements(myNumberOfElements);
234     const int index[2+1] = {1,3,6} ;
235     const int value[2+3]=
236     {
237       2,4,
238       5,6,8
239     } ;
240     myGroup.setNumber(index,value);
241     
242     myMeshing.addGroup(myGroup);
243   }
244   {
245     GROUP myGroup ;
246     myGroup.setName("OtherFaces");
247     myGroup.setMesh(&myMeshing);
248     myGroup.setEntity(MED_FACE);
249     myGroup.setNumberOfGeometricType(1);
250     medGeometryElement myTypes[1] = {MED_TRIA3};
251     myGroup.setGeometricType(myTypes);
252     const int myNumberOfElements[1] = {2} ;
253     myGroup.setNumberOfElements(myNumberOfElements);
254     const int index[1+1] = {1,3} ;
255     const int value[2]=
256     {
257       1,3
258     } ;
259     myGroup.setNumber(index,value);
260     
261     myMeshing.addGroup(myGroup);
262   }
263
264   // all rigtht, we save it !
265
266   int idMed = myMeshing.addDriver(MED_DRIVER,filenameMed,myMeshing.getName());
267   myMeshing.write(idMed) ;
268
269   int idVtk = myMeshing.addDriver(VTK_DRIVER,filenameVtk,myMeshing.getName());
270   myMeshing.write(idVtk) ;
271
272   // we build now 8 fields : 4 fields double (integer) :
273   //                         2 fields on nodes (cells) :
274   //                         1 scalar (vector)
275
276   SUPPORT * supportOnNodes = new SUPPORT(&myMeshing,"On_All_Nodes",MED_NODE);
277   int numberOfNodes = supportOnNodes->getNumberOfElements(MED_ALL_ELEMENTS);
278
279   SUPPORT * supportOnCells = new SUPPORT(&myMeshing,"On_All_Cells",MED_CELL);
280   int numberOfCells = supportOnCells->getNumberOfElements(MED_ALL_ELEMENTS);
281
282   FIELD<double> * fieldDoubleScalarOnNodes = new FIELD<double>(supportOnNodes,1);
283   fieldDoubleScalarOnNodes->setName("fieldScalarDoubleNode");
284   fieldDoubleScalarOnNodes->setIterationNumber(-1);
285   fieldDoubleScalarOnNodes->setOrderNumber(-1);
286   fieldDoubleScalarOnNodes->setTime(0.0);
287
288   fieldDoubleScalarOnNodes->setComponentName(1,"Vx");
289   fieldDoubleScalarOnNodes->setComponentDescription(1,"comp1");
290   fieldDoubleScalarOnNodes->setMEDComponentUnit(1,"unit1");
291
292   fieldDoubleScalarOnNodes->setValueType(MED_REEL64);
293
294   FIELD<double> * fieldDoubleVectorOnNodes = new FIELD<double>(supportOnNodes,SpaceDimension);
295   fieldDoubleVectorOnNodes->setName("fieldVectorDoubleNode");
296   fieldDoubleVectorOnNodes->setIterationNumber(-1);
297   fieldDoubleVectorOnNodes->setOrderNumber(-1);
298   fieldDoubleVectorOnNodes->setTime(0.0);
299
300   fieldDoubleVectorOnNodes->setComponentName(1,"Vx");
301   fieldDoubleVectorOnNodes->setComponentDescription(1,"comp1");
302   fieldDoubleVectorOnNodes->setMEDComponentUnit(1,"unit1");
303   fieldDoubleVectorOnNodes->setComponentName(2,"Vy");
304   fieldDoubleVectorOnNodes->setComponentDescription(2,"comp2");
305   fieldDoubleVectorOnNodes->setMEDComponentUnit(2,"unit2");
306   fieldDoubleVectorOnNodes->setComponentName(3,"Vz");
307   fieldDoubleVectorOnNodes->setComponentDescription(3,"comp3");
308   fieldDoubleVectorOnNodes->setMEDComponentUnit(3,"unit3");
309
310   fieldDoubleVectorOnNodes->setValueType(MED_REEL64);
311
312   FIELD<double> * fieldDoubleScalarOnCells = new FIELD<double>(supportOnCells,1);
313   fieldDoubleScalarOnCells->setName("fieldScalarDoubleCell");
314   fieldDoubleScalarOnCells->setIterationNumber(-1);
315   fieldDoubleScalarOnCells->setOrderNumber(-1);
316   fieldDoubleScalarOnCells->setTime(0.0);
317
318   fieldDoubleScalarOnCells->setComponentName(1,"Vx");
319   fieldDoubleScalarOnCells->setComponentDescription(1,"comp1");
320   fieldDoubleScalarOnCells->setMEDComponentUnit(1,"unit1");
321
322   fieldDoubleScalarOnCells->setValueType(MED_REEL64);
323
324   FIELD<double> * fieldDoubleVectorOnCells = new FIELD<double>(supportOnCells,SpaceDimension);
325   fieldDoubleVectorOnCells->setName("fieldVectorrDoubleCell");
326   fieldDoubleVectorOnCells->setIterationNumber(-1);
327   fieldDoubleVectorOnCells->setOrderNumber(-1);
328   fieldDoubleVectorOnCells->setTime(0.0);
329
330   fieldDoubleVectorOnCells->setComponentName(1,"Vx");
331   fieldDoubleVectorOnCells->setComponentDescription(1,"comp1");
332   fieldDoubleVectorOnCells->setMEDComponentUnit(1,"unit1");
333   fieldDoubleVectorOnCells->setComponentName(2,"Vy");
334   fieldDoubleVectorOnCells->setComponentDescription(2,"comp2");
335   fieldDoubleVectorOnCells->setMEDComponentUnit(2,"unit2");
336   fieldDoubleVectorOnCells->setComponentName(3,"Vz");
337   fieldDoubleVectorOnCells->setComponentDescription(3,"comp3");
338   fieldDoubleVectorOnCells->setMEDComponentUnit(3,"unit3");
339
340   fieldDoubleVectorOnCells->setValueType(MED_REEL64);
341
342   FIELD<int> * fieldIntScalarOnNodes = new FIELD<int>(supportOnNodes,1);
343   fieldIntScalarOnNodes->setName("fieldScalarIntNode");
344   fieldIntScalarOnNodes->setIterationNumber(-1);
345   fieldIntScalarOnNodes->setOrderNumber(-1);
346   fieldIntScalarOnNodes->setTime(0.0);
347
348   fieldIntScalarOnNodes->setComponentName(1,"Vx");
349   fieldIntScalarOnNodes->setComponentDescription(1,"comp1");
350   fieldIntScalarOnNodes->setMEDComponentUnit(1,"unit1");
351
352   fieldIntScalarOnNodes->setValueType(MED_INT32);
353
354   FIELD<int> * fieldIntVectorOnNodes = new FIELD<int>(supportOnNodes,SpaceDimension);
355   fieldIntVectorOnNodes->setName("fieldVectorIntNode");
356   fieldIntVectorOnNodes->setIterationNumber(-1);
357   fieldIntVectorOnNodes->setOrderNumber(-1);
358   fieldIntVectorOnNodes->setTime(0.0);
359
360   fieldIntVectorOnNodes->setComponentName(1,"Vx");
361   fieldIntVectorOnNodes->setComponentDescription(1,"comp1");
362   fieldIntVectorOnNodes->setMEDComponentUnit(1,"unit1");
363   fieldIntVectorOnNodes->setComponentName(2,"Vy");
364   fieldIntVectorOnNodes->setComponentDescription(2,"comp2");
365   fieldIntVectorOnNodes->setMEDComponentUnit(2,"unit2");
366   fieldIntVectorOnNodes->setComponentName(3,"Vz");
367   fieldIntVectorOnNodes->setComponentDescription(3,"comp3");
368   fieldIntVectorOnNodes->setMEDComponentUnit(3,"unit3");
369
370   fieldIntVectorOnNodes->setValueType(MED_INT32);
371
372   FIELD<int> * fieldIntScalarOnCells = new FIELD<int>(supportOnCells,1);
373   fieldIntScalarOnCells->setName("fieldScalarIntCell");
374   fieldIntScalarOnCells->setIterationNumber(-1);
375   fieldIntScalarOnCells->setOrderNumber(-1);
376   fieldIntScalarOnCells->setTime(0.0);
377
378   fieldIntScalarOnCells->setComponentName(1,"Vx");
379   fieldIntScalarOnCells->setComponentDescription(1,"comp1");
380   fieldIntScalarOnCells->setMEDComponentUnit(1,"unit1");
381
382   fieldIntScalarOnCells->setValueType(MED_INT32);
383
384   FIELD<int> * fieldIntVectorOnCells = new FIELD<int>(supportOnCells,SpaceDimension);
385   fieldIntVectorOnCells->setName("fieldVectorrIntCell");
386   fieldIntVectorOnCells->setIterationNumber(-1);
387   fieldIntVectorOnCells->setOrderNumber(-1);
388   fieldIntVectorOnCells->setTime(0.0);
389
390   fieldIntVectorOnCells->setComponentName(1,"Vx");
391   fieldIntVectorOnCells->setComponentDescription(1,"comp1");
392   fieldIntVectorOnCells->setMEDComponentUnit(1,"unit1");
393   fieldIntVectorOnCells->setComponentName(2,"Vy");
394   fieldIntVectorOnCells->setComponentDescription(2,"comp2");
395   fieldIntVectorOnCells->setMEDComponentUnit(2,"unit2");
396   fieldIntVectorOnCells->setComponentName(3,"Vz");
397   fieldIntVectorOnCells->setComponentDescription(3,"comp3");
398   fieldIntVectorOnCells->setMEDComponentUnit(3,"unit3");
399
400   fieldIntVectorOnCells->setValueType(MED_INT32);
401
402   for (int i = 0; i<numberOfNodes; i++)
403     {
404       double valueDbl1, valueDbl2, valueDbl3;
405       int valueInt1, valueInt2, valueInt3;
406       valueInt1 = i+1;
407       valueInt2 = i+2;
408       valueInt3 = i+3;
409       valueDbl1 = valueInt1*0.1;
410       valueDbl2 = valueInt2*0.1;
411       valueDbl3 = valueInt3*0.1;
412       fieldDoubleScalarOnNodes->setValueIJ(i+1,1,valueDbl1);
413
414       fieldIntScalarOnNodes->setValueIJ(i+1,1,valueInt1);
415
416       fieldDoubleVectorOnNodes->setValueIJ(i+1,1,valueDbl1);
417       fieldDoubleVectorOnNodes->setValueIJ(i+1,2,valueDbl2);
418       fieldDoubleVectorOnNodes->setValueIJ(i+1,3,valueDbl3);
419
420       fieldIntVectorOnNodes->setValueIJ(i+1,1,valueInt1);
421       fieldIntVectorOnNodes->setValueIJ(i+1,2,valueInt2);
422       fieldIntVectorOnNodes->setValueIJ(i+1,3,valueInt3);
423     }
424
425   for (int i = 0; i<numberOfCells; i++)
426     {
427       double valueDbl1, valueDbl2, valueDbl3;
428       int valueInt1, valueInt2, valueInt3;
429       valueInt1 = i+1;
430       valueInt2 = i+2;
431       valueInt3 = i+3;
432       valueDbl1 = valueInt1*0.1;
433       valueDbl2 = valueInt2*0.1;
434       valueDbl3 = valueInt3*0.1;
435       fieldDoubleScalarOnCells->setValueIJ(i+1,1,valueDbl1);
436
437       fieldIntScalarOnCells->setValueIJ(i+1,1,valueInt1);
438
439       fieldDoubleVectorOnCells->setValueIJ(i+1,1,valueDbl1);
440       fieldDoubleVectorOnCells->setValueIJ(i+1,2,valueDbl2);
441       fieldDoubleVectorOnCells->setValueIJ(i+1,3,valueDbl3);
442
443       fieldIntVectorOnCells->setValueIJ(i+1,1,valueInt1);
444       fieldIntVectorOnCells->setValueIJ(i+1,2,valueInt2);
445       fieldIntVectorOnCells->setValueIJ(i+1,3,valueInt3);
446     }
447
448   idMed = fieldDoubleScalarOnNodes->addDriver(MED_DRIVER,filenameMed,fieldDoubleScalarOnNodes->getName());
449   fieldDoubleScalarOnNodes->write(idMed) ;
450
451   idMed = fieldIntScalarOnNodes->addDriver(MED_DRIVER,filenameMed,fieldIntScalarOnNodes->getName());
452   fieldIntScalarOnNodes->write(idMed) ;
453
454   idMed = fieldDoubleVectorOnNodes->addDriver(MED_DRIVER,filenameMed,fieldDoubleVectorOnNodes->getName());
455   fieldDoubleVectorOnNodes->write(idMed) ;
456
457   idMed = fieldIntVectorOnNodes->addDriver(MED_DRIVER,filenameMed,fieldIntVectorOnNodes->getName());
458   fieldIntVectorOnNodes->write(idMed) ;
459
460   idMed = fieldDoubleScalarOnCells->addDriver(MED_DRIVER,filenameMed,fieldDoubleScalarOnCells->getName());
461   fieldDoubleScalarOnCells->write(idMed) ;
462
463   idMed = fieldIntScalarOnCells->addDriver(MED_DRIVER,filenameMed,fieldIntScalarOnCells->getName());
464   fieldIntScalarOnCells->write(idMed) ;
465
466   idMed = fieldDoubleVectorOnCells->addDriver(MED_DRIVER,filenameMed,fieldDoubleVectorOnCells->getName());
467   fieldDoubleVectorOnCells->write(idMed) ;
468
469   idMed = fieldIntVectorOnCells->addDriver(MED_DRIVER,filenameMed,fieldIntVectorOnCells->getName());
470   fieldIntVectorOnCells->write(idMed) ;
471
472   idVtk = fieldDoubleScalarOnNodes->addDriver(VTK_DRIVER,filenameVtk,fieldDoubleScalarOnNodes->getName());
473   fieldDoubleScalarOnNodes->writeAppend(idVtk) ;
474
475   idVtk = fieldIntScalarOnNodes->addDriver(VTK_DRIVER,filenameVtk,fieldIntScalarOnNodes->getName());
476   fieldIntScalarOnNodes->writeAppend(idVtk) ;
477
478   idVtk = fieldDoubleVectorOnNodes->addDriver(VTK_DRIVER,filenameVtk,fieldDoubleVectorOnNodes->getName());
479   fieldDoubleVectorOnNodes->writeAppend(idVtk) ;
480
481   idVtk = fieldIntVectorOnNodes->addDriver(VTK_DRIVER,filenameVtk,fieldIntVectorOnNodes->getName());
482   fieldIntVectorOnNodes->writeAppend(idVtk) ;
483
484   idVtk = fieldDoubleScalarOnCells->addDriver(VTK_DRIVER,filenameVtk,fieldDoubleScalarOnCells->getName());
485   fieldDoubleScalarOnCells->writeAppend(idVtk) ;
486
487   idVtk = fieldIntScalarOnCells->addDriver(VTK_DRIVER,filenameVtk,fieldIntScalarOnCells->getName());
488   fieldIntScalarOnCells->writeAppend(idVtk) ;
489
490   idVtk = fieldDoubleVectorOnCells->addDriver(VTK_DRIVER,filenameVtk,fieldDoubleVectorOnCells->getName());
491   fieldDoubleVectorOnCells->writeAppend(idVtk) ;
492
493   idVtk = fieldIntVectorOnCells->addDriver(VTK_DRIVER,filenameVtk,fieldIntVectorOnCells->getName());
494   fieldIntVectorOnCells->writeAppend(idVtk) ;
495
496   delete fieldDoubleScalarOnNodes;
497   delete fieldIntScalarOnNodes;
498   delete fieldDoubleVectorOnNodes;
499   delete fieldIntVectorOnNodes;
500   delete fieldDoubleScalarOnCells;
501   delete fieldIntScalarOnCells;
502   delete fieldDoubleVectorOnCells;
503   delete fieldIntVectorOnCells;
504
505   delete supportOnNodes;
506   delete supportOnCells;
507 }