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