Salome HOME
MEDMEM suppression
[modules/med.git] / doc / MEDMEM / MESHINGexample.cxx
1 // Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22
23 #include "MEDMEM_Meshing.hxx"
24 #include "MEDMEM_Group.hxx"
25
26 using namespace MEDMEM ;
27 using namespace MED_EN ;
28
29 using namespace std;
30
31 int main (int argc, char ** argv) {
32
33   // filename to save the generated MESH
34   string filename = "meshing.med" ;
35
36   MESHING* myMeshing = new MESHING;
37   myMeshing->setName("meshing") ;
38
39   // define coordinates
40
41   int SpaceDimension = 3 ;
42   int NumberOfNodes = 19 ;
43   double Coordinates[57] = {
44     0.0, 0.0, 0.0, 
45     0.0, 0.0, 1.0, 
46     2.0, 0.0, 1.0, 
47     0.0, 2.0, 1.0, 
48     -2.0, 0.0, 1.0, 
49     0.0, -2.0, 1.0, 
50     1.0, 1.0, 2.0, 
51     -1.0, 1.0, 2.0, 
52     -1.0, -1.0, 2.0, 
53     1.0, -1.0, 2.0, 
54     1.0, 1.0, 3.0, 
55     -1.0, 1.0, 3.0, 
56     -1.0, -1.0, 3.0, 
57     1.0, -1.0, 3.0, 
58     1.0, 1.0, 4.0, 
59     -1.0, 1.0, 4.0, 
60     -1.0, -1.0, 4.0, 
61     1.0, -1.0, 4.0,
62     0.0, 0.0, 5.0
63   };
64
65   myMeshing->setCoordinates(SpaceDimension,NumberOfNodes,Coordinates,"CARTESIAN",MED_FULL_INTERLACE);
66
67   string Names[3] = { "X","Y","Z" } ;
68   myMeshing->setCoordinatesNames(Names);
69
70   string Units[3] = { "cm","cm","cm" } ;
71   myMeshing->setCoordinatesUnits(Units) ;
72
73   // define conectivities
74
75   // cell part
76   
77   const int NumberOfTypes = 3 ;
78   medGeometryElement Types[NumberOfTypes] = {MED_TETRA4,MED_PYRA5,MED_HEXA8} ;
79   const int NumberOfElements[NumberOfTypes] = {12,2,2} ;
80
81   myMeshing->setNumberOfTypes(NumberOfTypes,MED_CELL);
82   myMeshing->setTypes(Types,MED_CELL);
83   myMeshing->setNumberOfElements(NumberOfElements,MED_CELL);
84
85   const int sizeTetra = 12*4 ;
86   int ConnectivityTetra[sizeTetra]=
87   {
88     1,2,3,6,
89     1,2,4,3,
90     1,2,5,4,
91     1,2,6,5,
92     2,7,4,3,
93     2,8,5,4,
94     2,9,6,5,
95     2,10,3,6,
96     2,7,3,10,
97     2,8,4,7,
98     2,9,5,8,
99     2,10,6,9
100   };
101   
102   myMeshing->setConnectivity(MED_CELL,MED_TETRA4,ConnectivityTetra);
103
104   int ConnectivityPyra[2*5]=
105   {
106     7,8,9,10,2,
107     15,18,17,16,19
108   };
109
110   myMeshing->setConnectivity(MED_CELL,MED_PYRA5,ConnectivityPyra);
111
112   int ConnectivityHexa[2*8]=
113   {
114     11,12,13,14,7,8,9,10,
115     15,16,17,18,11,12,13,14
116   };
117
118   myMeshing->setConnectivity(MED_CELL,MED_HEXA8,ConnectivityHexa);
119
120   // face part
121
122   const int NumberOfFacesTypes = 2 ;
123   medGeometryElement FacesTypes[NumberOfFacesTypes] = {MED_TRIA3,MED_QUAD4} ;
124   const int NumberOfFacesElements[NumberOfFacesTypes] = {4,4} ;
125
126   myMeshing->setNumberOfTypes(NumberOfFacesTypes,MED_FACE);
127   myMeshing->setTypes(FacesTypes,MED_FACE);
128   myMeshing->setNumberOfElements(NumberOfFacesElements,MED_FACE);
129
130   const int sizeTria = 3*4 ;
131   int ConnectivityTria[sizeTria]=
132   {
133     1,4,3,
134     1,5,4,
135     1,6,5,
136     1,3,6
137   };
138   
139   myMeshing->setConnectivity(MED_FACE,MED_TRIA3,ConnectivityTria);
140
141   int ConnectivityQua[4*4]=
142   {
143     7,8,9,10,
144     11,12,13,14,
145     11,7,8,12,
146     12,8,9,13
147   };
148
149   myMeshing->setConnectivity(MED_FACE,MED_QUAD4,ConnectivityQua);
150
151   // edge part
152
153   // not yet implemented : if set, results are unpredictable.
154
155   // Some groups :
156
157   // Node :
158   {
159     GROUP* myGroup = new GROUP;
160     myGroup->setName("SomeNodes");
161     myGroup->setMesh(myMeshing);
162     myGroup->setEntity(MED_NODE);
163     myGroup->setNumberOfGeometricType(1);
164     medGeometryElement myTypes[1] = {MED_NONE};
165     myGroup->setGeometricType(myTypes);
166     const int myNumberOfElements[1] = {4} ;
167     myGroup->setNumberOfElements(myNumberOfElements);
168     const int index[1+1] = {1,5} ;
169     const int value[4]= { 1,4,5,7} ;
170     myGroup->setNumber(index,value);
171     
172     myMeshing->addGroup(*myGroup);
173     myGroup->removeReference();
174   }
175   {
176     GROUP* myGroup = new GROUP;
177     myGroup->setName("OtherNodes");
178     myGroup->setMesh(myMeshing);
179     myGroup->setEntity(MED_NODE);
180     myGroup->setNumberOfGeometricType(1);
181     medGeometryElement myTypes[1] = {MED_NONE};
182     myGroup->setGeometricType(myTypes);
183     const int myNumberOfElements[1] = {3} ;
184     myGroup->setNumberOfElements(myNumberOfElements);
185     const int index[1+1] = {1,4} ;
186     const int value[3]= { 2,3,6} ;
187     myGroup->setNumber(index,value);
188     
189     myMeshing->addGroup(*myGroup);
190     myGroup->removeReference();
191   }
192
193   // Cell :
194   {
195     GROUP* myGroup = new GROUP;
196     myGroup->setName("SomeCells");
197     myGroup->setMesh(myMeshing);
198     myGroup->setEntity(MED_CELL);
199     myGroup->setNumberOfGeometricType(3);
200     medGeometryElement myTypes[3] = {MED_TETRA4,MED_PYRA5,MED_HEXA8};
201     myGroup->setGeometricType(myTypes);
202     const int myNumberOfElements[3] = {4,1,2} ;
203     myGroup->setNumberOfElements(myNumberOfElements);
204     const int index[3+1] = {1,5,6,8} ;
205     const int value[4+1+2]=
206     {
207       2,7,8,12,
208       13,
209       15,16
210     };
211     myGroup->setNumber(index,value);
212     
213     myMeshing->addGroup(*myGroup);
214     myGroup->removeReference();
215   }
216   {
217     GROUP* myGroup = new GROUP;
218     myGroup->setName("OtherCells");
219     myGroup->setMesh(myMeshing);
220     myGroup->setEntity(MED_CELL);
221     myGroup->setNumberOfGeometricType(2);
222     medGeometryElement myTypes[] = {MED_TETRA4,MED_PYRA5};
223     myGroup->setGeometricType(myTypes);
224     const int myNumberOfElements[] = {4,1} ;
225     myGroup->setNumberOfElements(myNumberOfElements);
226     const int index[3+1] = {1,5,6} ;
227     const int value[4+1]=
228     {
229       3,4,5,9,
230       14
231     };
232     myGroup->setNumber(index,value);
233     
234     myMeshing->addGroup(*myGroup);
235     myGroup->removeReference();
236   }
237
238   // Face :
239   {
240     GROUP* myGroup = new GROUP;
241     myGroup->setName("SomeFaces");
242     myGroup->setMesh(myMeshing);
243     myGroup->setEntity(MED_FACE);
244     myGroup->setNumberOfGeometricType(2);
245     medGeometryElement myTypes[2] = {MED_TRIA3,MED_QUAD4};
246     myGroup->setGeometricType(myTypes);
247     const int myNumberOfElements[2] = {2,3} ;
248     myGroup->setNumberOfElements(myNumberOfElements);
249     const int index[2+1] = {1,3,6} ;
250     const int value[2+3]=
251     {
252       2,4,
253       5,6,8
254     } ;
255     myGroup->setNumber(index,value);
256     
257     myMeshing->addGroup(*myGroup);
258     myGroup->removeReference();
259   }
260   {
261     GROUP* myGroup = new GROUP;
262     myGroup->setName("OtherFaces");
263     myGroup->setMesh(myMeshing);
264     myGroup->setEntity(MED_FACE);
265     myGroup->setNumberOfGeometricType(1);
266     medGeometryElement myTypes[1] = {MED_TRIA3};
267     myGroup->setGeometricType(myTypes);
268     const int myNumberOfElements[1] = {2} ;
269     myGroup->setNumberOfElements(myNumberOfElements);
270     const int index[1+1] = {1,3} ;
271     const int value[2]=
272     {
273       1,3
274     } ;
275     myGroup->setNumber(index,value);
276     
277     myMeshing->addGroup(*myGroup);
278     myGroup->removeReference();
279   }
280
281   // all rigtht, we save it !
282
283   int id = myMeshing->addDriver(MED_DRIVER,filename,myMeshing->getName());
284   myMeshing->write(id) ;
285   myMeshing->removeReference();
286 }