1 // SMESH DriverMED : driver to read and write 'med' files
3 // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
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.
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.
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
20 // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
24 // File : DriverMED_W_SMDS_Mesh.cxx
28 #include "DriverMED_W_SMDS_Mesh.h"
30 #include "SMDS_MeshElement.hxx"
31 #include "SMDS_MeshNode.hxx"
32 #include "SMDS_MeshFacesIterator.hxx"
33 #include "SMDS_MeshNodesIterator.hxx"
34 #include "SMDS_MeshVolumesIterator.hxx"
36 #include "utilities.h"
39 DriverMED_W_SMDS_Mesh::DriverMED_W_SMDS_Mesh() {
43 DriverMED_W_SMDS_Mesh::~DriverMED_W_SMDS_Mesh() {
47 void DriverMED_W_SMDS_Mesh::SetMesh(Handle(SMDS_Mesh)& aMesh) {
51 void DriverMED_W_SMDS_Mesh::SetFile(string aFile) {
55 void DriverMED_W_SMDS_Mesh::SetFileId(med_idt aFileId) {
59 void DriverMED_W_SMDS_Mesh::SetMeshId(int aMeshId) {
63 void DriverMED_W_SMDS_Mesh::Add() {
67 void DriverMED_W_SMDS_Mesh::Write() {
74 /* nombre d'objets MED */
75 char nom_universel[MED_TAILLE_LNOM+1];
76 med_int long_fichier_en_tete;
77 char *fichier_en_tete;
80 med_int nmaa,mdim,nnoe;
81 med_int nmai[MED_NBR_GEOMETRIE_MAILLE],nfac[MED_NBR_GEOMETRIE_FACE];
82 med_int nare[MED_NBR_GEOMETRIE_ARETE];
84 char nommaa[MED_TAILLE_NOM+1];
87 char nomcoo[3*MED_TAILLE_PNOM+1];
88 char unicoo[3*MED_TAILLE_PNOM+1];
93 med_booleen inonoe,inunoe;
94 med_mode_switch mode_coo;
95 char str[MED_TAILLE_PNOM+1];
101 med_int elem_id,myId;
102 med_int *connectivite;
106 med_booleen inoele, inuele;
107 med_connectivite typ_con;
108 med_geometrie_element typgeo;
109 med_geometrie_element typmai[MED_NBR_GEOMETRIE_MAILLE] = {MED_POINT1,MED_SEG2,
112 MED_QUAD8,MED_TETRA4,
113 MED_TETRA10,MED_HEXA8,
114 MED_HEXA20,MED_PENTA6,
115 MED_PENTA15,MED_PYRA5,
117 med_int desmai[MED_NBR_GEOMETRIE_MAILLE] = {0,2,3,3,3,4,4,4,4,6,6,5,5,5,5};
118 med_int nmailles[MED_NBR_GEOMETRIE_MAILLE];
119 char nommai[MED_NBR_GEOMETRIE_MAILLE] [MED_TAILLE_NOM+1] = {"MED_POINT1",
134 med_geometrie_element typfac[MED_NBR_GEOMETRIE_FACE] = {MED_TRIA3,MED_TRIA6,
135 MED_QUAD4,MED_QUAD8};
136 med_int desfac[MED_NBR_GEOMETRIE_FACE] = {3,3,4,4};
137 med_int nfaces[MED_NBR_GEOMETRIE_FACE];
138 char nomfac[MED_NBR_GEOMETRIE_FACE][MED_TAILLE_NOM+1] = {"MED_TRIA3","MED_TRIA6",
139 "MED_QUAD4","MED_QUAD8"};
140 med_geometrie_element typare[MED_NBR_GEOMETRIE_ARETE] = {MED_SEG2,MED_SEG3};
141 med_int desare[MED_NBR_GEOMETRIE_ARETE] = {2,3};
142 med_int naretes[MED_NBR_GEOMETRIE_ARETE];
143 char nomare[MED_NBR_GEOMETRIE_ARETE] [MED_TAILLE_NOM+1] = {"MED_SEG2","MED_SEG3"};
148 med_int *attval,*attide;
149 char nomfam[MED_TAILLE_NOM+1];
151 char str1[MED_TAILLE_DESC+1];
152 char str2[MED_TAILLE_LNOM+1];
154 /****************************************************************************
155 * OUVERTURE DU FICHIER EN ECRITURE *
156 ****************************************************************************/
157 /*! char* file2Read = (char*)myFile.c_str();
158 myFileId = MEDouvrir(file2Read,MED_REMP);
161 fprintf(stderr,">> ERREUR : ouverture du fichier %s \n",file2Read);
166 mode_coo = MED_FULL_INTERLACE;
169 /****************************************************************************
170 * NOMBRES D'OBJETS MED *
171 ****************************************************************************/
172 fprintf(stdout,"\n(****************************)\n");
173 fprintf(stdout,"(* INFORMATIONS GENERALES : *)\n");
174 fprintf(stdout,"(****************************)\n");
176 /* creation du maillage */
178 //nommaa = QString("Mesh "+myMeshId).latin1();
180 //plutot recuperer le nom du maillage dans l'etude
182 ret = MEDmaaCr(myFileId,nommaa,mdim);
186 /* Combien de noeuds ? */
187 nnoe = myMesh->NbNodes();
189 /* Combien de mailles, faces ou aretes ? */
190 for (i=0;i<MED_NBR_GEOMETRIE_MAILLE;i++)
193 SMDS_MeshFacesIterator itFaces(myMesh);
194 Standard_Integer nb_of_nodes, nb_of_faces;
195 nb_of_faces = myMesh->NbFaces();
196 //SCRUTE(nb_of_faces);
198 //med_int elem_Id[MED_NBR_GEOMETRIE_FACE][nb_of_faces];
199 vector<int> elem_Id[MED_NBR_GEOMETRIE_MAILLE];
200 //typedef vector<int> Integer_vector;
201 //vector<Integer_vector> elem_Id;
202 //elem_Id.resize(MED_NBR_GEOMETRIE_MAILLE);
204 for (;itFaces.More();itFaces.Next()) {
205 const Handle(SMDS_MeshElement)& elem = itFaces.Value();
207 nb_of_nodes = elem->NbNodes();
209 switch (nb_of_nodes) {
211 //elem_Id[3][nmailles[3]] = elem->GetID();
212 elem_Id[3].push_back(elem->GetID());
217 //elem_Id[5][nmailles[5]] = elem->GetID();
218 elem_Id[5].push_back(elem->GetID());
223 //elem_Id[4][nmailles[4]] = elem->GetID();
224 elem_Id[4].push_back(elem->GetID());
232 SMDS_MeshVolumesIterator itVolumes(myMesh);
234 for (;itVolumes.More();itVolumes.Next()) {
235 const Handle(SMDS_MeshElement)& elem = itVolumes.Value();
237 nb_of_nodes = elem->NbNodes();
238 switch (nb_of_nodes) {
240 //elem_Id[9][nmailles[9]] = elem->GetID();
241 elem_Id[9].push_back(elem->GetID());
248 /****************************************************************************
249 * ECRITURE DES NOEUDS *
250 ****************************************************************************/
251 fprintf(stdout,"\n(************************)\n");
252 fprintf(stdout,"(* NOEUDS DU MAILLAGE : *)\n");
253 fprintf(stdout,"(************************)\n");
255 /* Allocations memoires */
256 /* table des coordonnees
257 profil : (dimension * nombre de noeuds ) */
258 coo = (med_float*) malloc(sizeof(med_float)*nnoe*mdim);
259 /* table des numeros, des numeros de familles des noeuds
260 profil : (nombre de noeuds) */
261 numnoe = (med_int*) malloc(sizeof(med_int)*nnoe);
262 nufano = (med_int*) malloc(sizeof(med_int)*nnoe);
263 /* table des noms des noeuds
264 profil : (nnoe*MED_TAILLE_PNOM+1) */
268 SMDS_MeshNodesIterator itNodes(myMesh);
269 for (;itNodes.More();itNodes.Next()) {
270 const Handle(SMDS_MeshElement)& elem = itNodes.Value();
271 const Handle(SMDS_MeshNode)& node = myMesh->GetNode(1,elem);
274 coo[i*3+1]=node->Y();
275 coo[i*3+2]=node->Z();
276 numnoe[i]=node->GetID();
281 /* ecriture des noeuds :
283 - noms (optionnel dans un fichier MED)
284 - numeros (optionnel dans un fichier MED)
285 - numeros des familles */
286 ret = MEDnoeudsEcr(myFileId,nommaa,mdim,coo,mode_coo,MED_CART,
287 nomcoo,unicoo,nomnoe,MED_FAUX,numnoe,MED_VRAI,
288 nufano,nnoe,MED_REMP);
290 /* liberation memoire */
296 /****************************************************************************
297 * ECRITURE DES ELEMENTS *
298 ****************************************************************************/
299 fprintf(stdout,"\n(**************************)\n");
300 fprintf(stdout,"(* ELEMENTS DU MAILLAGE : *)\n");
301 fprintf(stdout,"(**************************)");
302 //fprintf(Out,"CELLS\n");
303 /* Ecriture des connectivites, noms, numeros des mailles */
306 for (i=0;i<MED_NBR_GEOMETRIE_MAILLE;i++)
308 if (nmailles[i] > 0 && ret == 0)
310 MESSAGE ( " Start "<<typmai[i]);
311 /* dimension de la maille */
312 edim = typmai[i] / 100;
314 if (mdim == 2 || mdim == 3)
321 taille = nsup+typmai[i]%100;
322 //taille = typmai[i]%100;
324 /* allocation memoire */
325 connectivite = (med_int*)malloc(sizeof(med_int)*
327 nomele = (char*)malloc(sizeof(char)*MED_TAILLE_PNOM*
329 numele = (med_int*)malloc(sizeof(med_int)*
331 nufael = (med_int*)malloc(sizeof(med_int)*
334 nbNodes=typmai[i]%100;
336 //penser a mater les (taille-nsup)
337 for (j=0;j<nmailles[i];j++) {
338 myId = elem_Id[i][j];
339 const Handle(SMDS_MeshElement)& elem = myMesh->FindElement(myId);
341 //elem_id=*(numele+j);
342 //fprintf(stdout,"%d \n",myId);
344 for (k=0; k<nbNodes; k++) {
345 //*(connectivite+j*(taille-1)+k)=cnx[k];
346 *(connectivite+j*(taille-nsup)+k) = elem->GetConnection(k+1);
347 //fprintf(stdout,"%d ",*(connectivite+j*(taille-nsup)+k));
350 //fprintf(stdout,"\n");
353 /* ecriture des données */
355 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);
358 MESSAGE(">> ERREUR : lecture des mailles \n");
360 /* liberation memoire */
365 MESSAGE ( " End "<<typmai[i]);
369 /****************************************************************************
370 * FERMETURE DU FICHIER *
371 ****************************************************************************/
373 /*! ret = MEDfermer(myFileId);
376 fprintf(stderr,">> ERREUR : erreur a la fermeture du fichier %s\n",file2Read);