Salome HOME
Initialisation module SMESH_SRC de la base SMESH
[modules/smesh.git] / src / DriverMED / DriverMED_W_SMDS_Mesh.cxx
1 #include "DriverMED_W_SMDS_Mesh.h"
2
3 #include "SMDS_MeshElement.hxx"
4 #include "SMDS_MeshNode.hxx"
5 #include "SMDS_MeshFacesIterator.hxx"
6 #include "SMDS_MeshNodesIterator.hxx"
7 #include "SMDS_MeshVolumesIterator.hxx"
8
9 #include "utilities.h"
10 #include <vector>
11
12 DriverMED_W_SMDS_Mesh::DriverMED_W_SMDS_Mesh() {
13 ;
14 }
15
16 DriverMED_W_SMDS_Mesh::~DriverMED_W_SMDS_Mesh() {
17 ;
18 }
19
20 void DriverMED_W_SMDS_Mesh::SetMesh(Handle(SMDS_Mesh)& aMesh) {
21   myMesh = aMesh;
22 }
23
24 void DriverMED_W_SMDS_Mesh::SetFile(string aFile) {
25   myFile = aFile;
26 }
27
28 void DriverMED_W_SMDS_Mesh::SetFileId(med_idt aFileId) {
29   myFileId = aFileId;
30 }
31
32 void DriverMED_W_SMDS_Mesh::SetMeshId(int aMeshId) {
33   myMeshId = aMeshId;
34 }
35
36 void DriverMED_W_SMDS_Mesh::Add() {
37   ;
38 }
39
40 void DriverMED_W_SMDS_Mesh::Write() {
41
42   med_err ret = 0;
43   int i,j,k,l;
44   int numero;
45   char message[200];
46   Standard_Boolean ok;
47   /* nombre d'objets MED */
48   char nom_universel[MED_TAILLE_LNOM+1];
49   med_int long_fichier_en_tete; 
50   char *fichier_en_tete;
51   char version_hdf[10];
52   char version_med[10];
53   med_int nmaa,mdim,nnoe;
54   med_int nmai[MED_NBR_GEOMETRIE_MAILLE],nfac[MED_NBR_GEOMETRIE_FACE];
55   med_int nare[MED_NBR_GEOMETRIE_ARETE];
56   /* nom du maillage */
57   char nommaa[MED_TAILLE_NOM+1];
58   /* noeuds */
59   med_float *coo;
60   char nomcoo[3*MED_TAILLE_PNOM+1];
61   char unicoo[3*MED_TAILLE_PNOM+1];
62   char *nomnoe;
63   med_int *numnoe;
64   med_int *nufano; 
65   med_repere rep;
66   med_booleen inonoe,inunoe;
67   med_mode_switch mode_coo;
68   char str[MED_TAILLE_PNOM+1];
69   med_int nbNodes;
70   /* elements */
71   med_int nsup;
72   med_int edim;
73   med_int taille;
74   med_int elem_id,myId;
75   med_int *connectivite;
76   char *nomele;
77   med_int *numele;
78   med_int *nufael;
79   med_booleen inoele, inuele;
80   med_connectivite typ_con;
81   med_geometrie_element typgeo;
82   med_geometrie_element typmai[MED_NBR_GEOMETRIE_MAILLE] = {MED_POINT1,MED_SEG2, 
83                                                    MED_SEG3,MED_TRIA3,
84                                                    MED_TRIA6,MED_QUAD4,
85                                                    MED_QUAD8,MED_TETRA4,
86                                                    MED_TETRA10,MED_HEXA8,
87                                                    MED_HEXA20,MED_PENTA6,
88                                                    MED_PENTA15,MED_PYRA5,
89                                                    MED_PYRA13};
90   med_int desmai[MED_NBR_GEOMETRIE_MAILLE] = {0,2,3,3,3,4,4,4,4,6,6,5,5,5,5};
91   med_int nmailles[MED_NBR_GEOMETRIE_MAILLE];
92   char nommai[MED_NBR_GEOMETRIE_MAILLE] [MED_TAILLE_NOM+1] = {"MED_POINT1",
93                                                           "MED_SEG2", 
94                                                           "MED_SEG3",
95                                                           "MED_TRIA3",
96                                                           "MED_TRIA6",
97                                                           "MED_QUAD4",
98                                                           "MED_QUAD8",
99                                                           "MED_TETRA4",
100                                                           "MED_TETRA10",
101                                                           "MED_HEXA8",
102                                                           "MED_HEXA20",
103                                                           "MED_PENTA6",
104                                                           "MED_PENTA15",
105                                                           "MED_PYRA5",
106                                                           "MED_PYRA13"};
107   med_geometrie_element typfac[MED_NBR_GEOMETRIE_FACE] = {MED_TRIA3,MED_TRIA6,
108                                                  MED_QUAD4,MED_QUAD8};
109   med_int desfac[MED_NBR_GEOMETRIE_FACE] = {3,3,4,4};
110   med_int nfaces[MED_NBR_GEOMETRIE_FACE];
111   char nomfac[MED_NBR_GEOMETRIE_FACE][MED_TAILLE_NOM+1] = {"MED_TRIA3","MED_TRIA6",
112                                                        "MED_QUAD4","MED_QUAD8"};
113   med_geometrie_element typare[MED_NBR_GEOMETRIE_ARETE] = {MED_SEG2,MED_SEG3};
114   med_int desare[MED_NBR_GEOMETRIE_ARETE] = {2,3};
115   med_int naretes[MED_NBR_GEOMETRIE_ARETE];
116   char nomare[MED_NBR_GEOMETRIE_ARETE] [MED_TAILLE_NOM+1] = {"MED_SEG2","MED_SEG3"};
117   /* familles */
118   med_int nfam;
119   med_int natt,ngro;
120   char *attdes,*gro;
121   med_int *attval,*attide;
122   char nomfam[MED_TAILLE_NOM+1];
123   med_int numfam;
124   char str1[MED_TAILLE_DESC+1];
125   char str2[MED_TAILLE_LNOM+1];
126
127   /****************************************************************************
128   *                      OUVERTURE DU FICHIER EN ECRITURE                      *
129   ****************************************************************************/
130   /*!  char* file2Read = (char*)myFile.c_str();
131   myFileId = MEDouvrir(file2Read,MED_REMP);
132   if (myFileId < 0)
133     {
134       fprintf(stderr,">> ERREUR : ouverture du fichier %s \n",file2Read);
135       exit(EXIT_FAILURE);
136     }
137   */
138   typ_con = MED_NOD;
139   mode_coo = MED_FULL_INTERLACE;
140   numero = myMeshId;
141
142   /****************************************************************************
143   *                       NOMBRES D'OBJETS MED                                *
144   ****************************************************************************/
145   fprintf(stdout,"\n(****************************)\n");
146   fprintf(stdout,"(* INFORMATIONS GENERALES : *)\n");
147   fprintf(stdout,"(****************************)\n");
148
149   /* creation du maillage */
150   mdim=3;
151   //nommaa = QString("Mesh "+myMeshId).latin1();
152   //nommaa = "";
153   //plutot recuperer le nom du maillage dans l'etude
154   if (ret == 0)
155     ret = MEDmaaCr(myFileId,nommaa,mdim);
156   printf("%d\n",ret);
157
158       
159   /* Combien de noeuds ? */
160   nnoe = myMesh->NbNodes();
161   //SCRUTE(nnoe);
162   /* Combien de mailles, faces ou aretes ? */
163   for (i=0;i<MED_NBR_GEOMETRIE_MAILLE;i++)
164     nmailles[i]=0;
165
166   SMDS_MeshFacesIterator itFaces(myMesh);
167   Standard_Integer nb_of_nodes, nb_of_faces;
168   nb_of_faces = myMesh->NbFaces();
169   //SCRUTE(nb_of_faces);
170
171   //med_int elem_Id[MED_NBR_GEOMETRIE_FACE][nb_of_faces];
172   vector<int> elem_Id[MED_NBR_GEOMETRIE_MAILLE];
173   //typedef vector<int> Integer_vector;
174   //vector<Integer_vector> elem_Id;
175   //elem_Id.resize(MED_NBR_GEOMETRIE_MAILLE);
176    
177   for (;itFaces.More();itFaces.Next()) {
178     const Handle(SMDS_MeshElement)& elem = itFaces.Value();
179
180     nb_of_nodes = elem->NbNodes();
181
182     switch (nb_of_nodes) {
183     case 3 : {
184       //elem_Id[3][nmailles[3]] = elem->GetID();
185       elem_Id[3].push_back(elem->GetID());
186       nmailles[3]++;
187       break;
188     }
189     case 4 : {
190       //elem_Id[5][nmailles[5]] = elem->GetID();
191       elem_Id[5].push_back(elem->GetID());
192       nmailles[5]++;
193       break;
194     }
195     case 6 : {
196       //elem_Id[4][nmailles[4]] = elem->GetID();
197       elem_Id[4].push_back(elem->GetID());
198       nmailles[4]++;
199       break;
200     }
201     }
202
203   }
204
205   SMDS_MeshVolumesIterator itVolumes(myMesh);
206    
207   for (;itVolumes.More();itVolumes.Next()) {
208     const Handle(SMDS_MeshElement)& elem = itVolumes.Value();
209
210     nb_of_nodes = elem->NbNodes();
211     switch (nb_of_nodes) {
212     case 8 : {
213       //elem_Id[9][nmailles[9]] = elem->GetID();
214       elem_Id[9].push_back(elem->GetID());
215       nmailles[9]++;
216       break;
217     }
218     }
219   }
220
221   /****************************************************************************
222   *                       ECRITURE DES NOEUDS                                  *
223   ****************************************************************************/
224   fprintf(stdout,"\n(************************)\n");
225   fprintf(stdout,"(* NOEUDS DU MAILLAGE : *)\n");
226   fprintf(stdout,"(************************)\n");
227
228   /* Allocations memoires */
229   /* table des coordonnees 
230      profil : (dimension * nombre de noeuds ) */
231   coo = (med_float*) malloc(sizeof(med_float)*nnoe*mdim);
232   /* table  des numeros, des numeros de familles des noeuds
233      profil : (nombre de noeuds) */
234   numnoe = (med_int*) malloc(sizeof(med_int)*nnoe);
235   nufano = (med_int*) malloc(sizeof(med_int)*nnoe);
236   /* table des noms des noeuds 
237      profil : (nnoe*MED_TAILLE_PNOM+1) */
238   nomnoe ="";
239
240   i = 0;
241   SMDS_MeshNodesIterator itNodes(myMesh);
242   for (;itNodes.More();itNodes.Next()) {
243     const Handle(SMDS_MeshElement)& elem = itNodes.Value();
244     const Handle(SMDS_MeshNode)& node = myMesh->GetNode(1,elem);
245  
246     coo[i*3]=node->X();
247     coo[i*3+1]=node->Y();
248     coo[i*3+2]=node->Z();
249     numnoe[i]=node->GetID();
250     nufano[i]=0;
251     i++;
252   }
253     
254   /* ecriture des noeuds : 
255      - coordonnees
256      - noms (optionnel dans un fichier MED) 
257      - numeros (optionnel dans un fichier MED) 
258      - numeros des familles */
259   ret = MEDnoeudsEcr(myFileId,nommaa,mdim,coo,mode_coo,MED_CART,
260                        nomcoo,unicoo,nomnoe,MED_FAUX,numnoe,MED_VRAI,
261                        nufano,nnoe,MED_REMP);
262
263   /* liberation memoire */
264   free(coo);
265   //free(nomnoe);
266   free(numnoe);
267   free(nufano);
268
269   /****************************************************************************
270   *                       ECRITURE DES ELEMENTS                                *
271   ****************************************************************************/
272   fprintf(stdout,"\n(**************************)\n");
273   fprintf(stdout,"(* ELEMENTS DU MAILLAGE : *)\n");
274   fprintf(stdout,"(**************************)");
275   //fprintf(Out,"CELLS\n");
276   /* Ecriture des connectivites, noms, numeros des mailles */
277
278   if (ret == 0)
279     for (i=0;i<MED_NBR_GEOMETRIE_MAILLE;i++)
280       {
281         if (nmailles[i] > 0 && ret == 0)
282           {
283             MESSAGE ( " Start "<<typmai[i]);
284             /* dimension de la maille */
285             edim = typmai[i] / 100;
286             nsup = 0;
287             if (mdim  == 2 || mdim == 3)
288               if (edim == 1)
289                 nsup = 1;
290             if (mdim == 3)
291               if (edim == 2)
292                 nsup = 1;
293
294             taille = nsup+typmai[i]%100;
295             //taille = typmai[i]%100;
296             
297             /* allocation memoire */
298             connectivite = (med_int*)malloc(sizeof(med_int)*
299                                             taille*nmailles[i]);
300             nomele = (char*)malloc(sizeof(char)*MED_TAILLE_PNOM*
301                                    nmailles[i]+1);
302             numele = (med_int*)malloc(sizeof(med_int)*
303                                       nmailles[i]);
304             nufael = (med_int*)malloc(sizeof(med_int)*
305                                       nmailles[i]);
306             nomele="";
307             nbNodes=typmai[i]%100;
308
309             //penser a mater les (taille-nsup)
310             for (j=0;j<nmailles[i];j++) {
311               myId = elem_Id[i][j];
312               const Handle(SMDS_MeshElement)& elem = myMesh->FindElement(myId);
313               *(numele+j) = myId;
314               //elem_id=*(numele+j);
315               //fprintf(stdout,"%d \n",myId);
316
317               for (k=0; k<nbNodes; k++) {
318                 //*(connectivite+j*(taille-1)+k)=cnx[k];
319                 *(connectivite+j*(taille-nsup)+k) = elem->GetConnection(k+1);
320                 //fprintf(stdout,"%d ",*(connectivite+j*(taille-nsup)+k));
321               }
322               nufael[j]=0;
323               //fprintf(stdout,"\n");
324             }
325
326             /* ecriture des donnĂ©es */
327
328             ret=MEDelementsEcr(myFileId,nommaa,mdim,connectivite,mode_coo,nomele,MED_FAUX,numele,MED_VRAI,nufael,nmailles[i],MED_MAILLE,typmai[i],typ_con,MED_REMP);
329
330             if (ret < 0)
331               MESSAGE(">> ERREUR : lecture des mailles \n");
332
333             /* liberation memoire */
334             free(connectivite);
335             //free(nomele);
336             free(numele);
337             free(nufael);
338             MESSAGE ( " End "<<typmai[i]);
339           }
340       }
341
342   /****************************************************************************
343   *                      FERMETURE DU FICHIER                                 *
344   ****************************************************************************/
345
346             /*!  ret = MEDfermer(myFileId);
347
348   if (ret != 0)
349     fprintf(stderr,">> ERREUR : erreur a la fermeture du fichier %s\n",file2Read);
350             */
351
352 }