1 #include "DriverMED_W_SMESHDS_Mesh.h"
2 #include "DriverMED_W_SMDS_Mesh.h"
4 #include "SMDS_MeshElement.hxx"
5 #include "SMDS_MeshNode.hxx"
6 #include "SMDS_MeshFacesIterator.hxx"
7 #include "SMDS_MeshEdgesIterator.hxx"
8 #include "SMDS_MeshNodesIterator.hxx"
9 #include "SMDS_MeshVolumesIterator.hxx"
10 #include "SMESHDS_SubMesh.hxx"
11 #include "SMDS_MapIteratorOfExtendedMap.hxx"
12 #include "SMDS_MapOfMeshElement.hxx"
13 #include "SMDS_Position.hxx"
16 #include <TopExp_Explorer.hxx>
18 #include <TopoDS_Iterator.hxx>
19 #include <TopoDS_Compound.hxx>
20 #include <TopoDS_CompSolid.hxx>
21 #include <TopoDS_Solid.hxx>
22 #include <TopoDS_Shell.hxx>
23 #include <TopoDS_Face.hxx>
24 #include <TopoDS_Wire.hxx>
25 #include <TopoDS_Edge.hxx>
26 #include <TopoDS_Vertex.hxx>
27 #include <TopoDS_Shape.hxx>
28 #include <TopTools_MapOfShape.hxx>
29 #include <TColStd_ListIteratorOfListOfInteger.hxx>
35 #include "utilities.h"
37 DriverMED_W_SMESHDS_Mesh::DriverMED_W_SMESHDS_Mesh() {
41 DriverMED_W_SMESHDS_Mesh::~DriverMED_W_SMESHDS_Mesh() {
45 void DriverMED_W_SMESHDS_Mesh::SetMesh(Handle(SMDS_Mesh)& aMesh) {
49 void DriverMED_W_SMESHDS_Mesh::SetFile(string aFile) {
53 void DriverMED_W_SMESHDS_Mesh::SetFileId(med_idt aFileId) {
57 void DriverMED_W_SMESHDS_Mesh::SetMeshId(int aMeshId) {
61 void DriverMED_W_SMESHDS_Mesh::Write() {
63 string myClass = string("SMDS_Mesh");
64 string myExtension = string("MED");
66 DriverMED_W_SMDS_Mesh* myWriter = new DriverMED_W_SMDS_Mesh;
68 myWriter->SetMesh(myMesh);
69 // myWriter->SetFile(myFile);
70 myWriter->SetMeshId(myMeshId);
71 myWriter->SetFileId(myFileId);
78 void DriverMED_W_SMESHDS_Mesh::Add() {
85 /* nombre d'objets MED */
86 char nom_universel[MED_TAILLE_LNOM+1];
87 med_int long_fichier_en_tete;
88 char *fichier_en_tete;
91 med_int nmaa,mdim,nnoe;
92 med_int nmai[MED_NBR_GEOMETRIE_MAILLE],nfac[MED_NBR_GEOMETRIE_FACE];
93 med_int nare[MED_NBR_GEOMETRIE_ARETE];
95 char nommaa[MED_TAILLE_NOM+1];
98 // PN : Initilialisation de nomcoo et unicoo pour lisibilite du maillage
99 char nomcoo[3*MED_TAILLE_PNOM+1]="x y z ";
100 char unicoo[3*MED_TAILLE_PNOM+1]="m m m ";
105 med_booleen inonoe,inunoe;
106 med_mode_switch mode_coo;
107 char str[MED_TAILLE_PNOM+1];
113 med_int elem_id,myId;
114 med_int *connectivite;
118 med_booleen inoele, inuele;
119 med_connectivite typ_con;
120 med_geometrie_element typgeo;
121 med_geometrie_element typmai[MED_NBR_GEOMETRIE_MAILLE] = {MED_POINT1,MED_SEG2,
124 MED_QUAD8,MED_TETRA4,
125 MED_TETRA10,MED_HEXA8,
126 MED_HEXA20,MED_PENTA6,
127 MED_PENTA15,MED_PYRA5,
129 med_int desmai[MED_NBR_GEOMETRIE_MAILLE] = {0,2,3,3,3,4,4,4,4,6,6,5,5,5,5};
130 med_int nmailles[MED_NBR_GEOMETRIE_MAILLE];
131 char nommai[MED_NBR_GEOMETRIE_MAILLE] [MED_TAILLE_NOM+1] = {"MED_POINT1",
146 med_geometrie_element typfac[MED_NBR_GEOMETRIE_FACE] = {MED_TRIA3,MED_TRIA6,
147 MED_QUAD4,MED_QUAD8};
148 med_int desfac[MED_NBR_GEOMETRIE_FACE] = {3,3,4,4};
149 med_int nfaces[MED_NBR_GEOMETRIE_FACE];
150 char nomfac[MED_NBR_GEOMETRIE_FACE][MED_TAILLE_NOM+1] = {"MED_TRIA3","MED_TRIA6",
151 "MED_QUAD4","MED_QUAD8"};
152 med_geometrie_element typare[MED_NBR_GEOMETRIE_ARETE] = {MED_SEG2,MED_SEG3};
153 med_int desare[MED_NBR_GEOMETRIE_ARETE] = {2,3};
154 med_int naretes[MED_NBR_GEOMETRIE_ARETE];
155 char nomare[MED_NBR_GEOMETRIE_ARETE] [MED_TAILLE_NOM+1] = {"MED_SEG2","MED_SEG3"};
158 mode_coo = MED_FULL_INTERLACE;
161 //---- provisoire : switch pour ecrire les familles de mailles
162 int besoinfamilledemaille=1;
163 //---- provisoire : switch pour ecrire les familles de mailles
165 /****************************************************************************
166 * OUVERTURE DU FICHIER EN ECRITURE *
167 ****************************************************************************/
168 char* file2Read = (char*)myFile.c_str();
170 MESSAGE ( " file2Read " << file2Read )
172 myFileId = MEDouvrir(file2Read,MED_REMP);
175 fprintf(stderr,">> ERREUR : ouverture du fichier %s \n",file2Read);
179 /****************************************************************************
180 * NOMBRES D'OBJETS MED *
181 ****************************************************************************/
182 fprintf(stdout,"\n(****************************)\n");
183 fprintf(stdout,"(* INFORMATIONS GENERALES : *)\n");
184 fprintf(stdout,"(****************************)\n");
186 /* calcul de la dimension */
188 double epsilon=0.00001;
189 SMDS_MeshNodesIterator myItNodes(myMesh);
190 for (;myItNodes.More();myItNodes.Next()) {
191 const Handle(SMDS_MeshElement)& elem = myItNodes.Value();
192 const Handle(SMDS_MeshNode)& node = myMesh->GetNode(1,elem);
193 if ( fabs(node->Z()) > epsilon ) {
198 MESSAGE ( " mdim " << mdim );
200 /* creation du maillage */
202 sprintf(nommaa,"Mesh %d",numero);
204 ret = MEDmaaCr(myFileId,nommaa,mdim);
209 /* Combien de noeuds ? */
210 nnoe = myMesh->NbNodes();
212 /* Combien de mailles, faces ou aretes ? */
213 for (i=0;i<MED_NBR_GEOMETRIE_MAILLE;i++)
216 Standard_Integer nb_of_nodes, nb_of_faces, nb_of_edges;
217 vector<int> elem_Id[MED_NBR_GEOMETRIE_MAILLE];
219 SMDS_MeshEdgesIterator itEdges(myMesh);
220 nb_of_edges = myMesh->NbEdges();
221 for (;itEdges.More();itEdges.Next()) {
222 const Handle(SMDS_MeshElement)& elem = itEdges.Value();
224 nb_of_nodes = elem->NbNodes();
226 switch (nb_of_nodes) {
228 elem_Id[1].push_back(elem->GetID());
233 elem_Id[2].push_back(elem->GetID());
241 SMDS_MeshFacesIterator itFaces(myMesh);
242 nb_of_faces = myMesh->NbFaces();
243 for (;itFaces.More();itFaces.Next()) {
244 const Handle(SMDS_MeshElement)& elem = itFaces.Value();
246 nb_of_nodes = elem->NbNodes();
248 switch (nb_of_nodes) {
250 elem_Id[3].push_back(elem->GetID());
255 elem_Id[5].push_back(elem->GetID());
260 elem_Id[4].push_back(elem->GetID());
268 SMDS_MeshVolumesIterator itVolumes(myMesh);
269 for (;itVolumes.More();itVolumes.Next()) {
270 const Handle(SMDS_MeshElement)& elem = itVolumes.Value();
272 nb_of_nodes = elem->NbNodes();
273 switch (nb_of_nodes) {
275 elem_Id[9].push_back(elem->GetID());
284 /****************************************************************************
285 * ECRITURE DES NOEUDS *
286 ****************************************************************************/
287 fprintf(stdout,"\n(************************)\n");
288 fprintf(stdout,"(* NOEUDS DU MAILLAGE : *)\n");
289 fprintf(stdout,"(************************)\n");
291 /* Allocations memoires */
292 /* table des coordonnees
293 profil : (dimension * nombre de noeuds ) */
294 coo = (med_float*) malloc(sizeof(med_float)*nnoe*mdim);
295 /* table des numeros, des numeros de familles des noeuds
296 profil : (nombre de noeuds) */
297 numnoe = (med_int*) malloc(sizeof(med_int)*nnoe);
298 nufano = (med_int*) malloc(sizeof(med_int)*nnoe);
299 /* table des noms des noeuds
300 profil : (nnoe*MED_TAILLE_PNOM+1) */
303 /* PN pour aster, il faut une famille 0 pour les noeuds et une autre pour les elements*/
304 /* PN : Creation de la famille 0 */
305 char * nomfam="FAMILLE_0";
314 ret = MEDfamCr(myFileId,nommaa,nomfam,numfam, &attide,&attval,attdes,natt,gro,ngro);
318 /* PN : FIN Creation de la famille 0 */
320 map < int, int > mapNoeud;
321 typedef pair<set<int>::iterator, bool> IsFamily;
328 int verifienbnoeuds = 0;
331 SMDS_MeshNodesIterator itNodes(myMesh);
332 for (;itNodes.More();itNodes.Next())
334 const Handle(SMDS_MeshElement)& elem = itNodes.Value();
335 const Handle(SMDS_MeshNode)& node = myMesh->GetNode(1,elem);
339 coo[i*3+1]=node->Y();
340 coo[i*3+2]=node->Z();
343 coo[i*2+1]=node->Y();
345 mapNoeud[node->GetID()] = i+1;
347 // renvoie 0 pour les noeuds internes du volume
348 int numfamille=node->GetPosition()->GetShapeId();
349 nufano[i]=numfamille;
354 //SCRUTE(coo[i*3+1]);
355 //SCRUTE(coo[i*3+2]);
356 if ( nufano[i] != 0 )
358 IsFamily deja = FamilySet.insert(nufano[i]); // insert if new, or gives existant
359 if (deja.second) // actually inserted
361 char famille[MED_TAILLE_NOM+1];
362 sprintf(famille,"F%d",nufano[i]);
363 // CreateFamily(strdup(nommaa),strdup(famille),nufano[i],attvalabs++);
365 CreateFamily(strdup(nommaa),strdup(famille),nufano[i],numfamille);
366 //MESSAGE("---famille-noeud--- "<<nbFamillesNoeud<<" "<<nufano[i]);
374 ret = MEDnoeudsEcr(myFileId,nommaa,mdim,coo,mode_coo,MED_CART,
375 nomcoo,unicoo,nomnoe,MED_FAUX,rien,MED_FAUX,
376 nufano,nnoe,MED_REMP);
378 MESSAGE("--- Creation de " << verifienbnoeuds << " noeuds");
379 ASSERT(verifienbnoeuds == nnoe);
380 MESSAGE("--- Creation de " << nbFamillesNoeud << " familles de noeuds");
382 /* liberation memoire */
387 /****************************************************************************
388 * ECRITURE DES ELEMENTS *
389 ****************************************************************************/
390 fprintf(stdout,"\n(**************************)\n");
391 fprintf(stdout,"(* ELEMENTS DU MAILLAGE : *)\n");
392 fprintf(stdout,"(**************************)\n");
394 /* Ecriture des connectivites, noms, numeros des mailles */
398 int nbFamillesElts =0;
399 Handle(SMESHDS_Mesh) mySMESHDSMesh = Handle(SMESHDS_Mesh)::DownCast(myMesh);
400 TopTools_IndexedMapOfShape myIndexToShape;
401 TopExp::MapShapes(mySMESHDSMesh->ShapeToMesh(),myIndexToShape);
403 map < int, int > mapFamille;
405 if (besoinfamilledemaille == 1)
408 for (t =1; t <= myIndexToShape.Extent(); t++)
410 const TopoDS_Shape S = myIndexToShape(t);
411 if (mySMESHDSMesh->HasMeshElements(S))
413 //MESSAGE ("********* Traitement de la Famille "<<-t);
415 Handle(SMESHDS_SubMesh) SM = mySMESHDSMesh->MeshElements(S);
416 const TColStd_ListOfInteger& indElt = SM->GetIDElements();
417 TColStd_ListIteratorOfListOfInteger ite(indElt);
420 for (; ite.More(); ite.Next())
422 int eltId = ite.Value();
423 mapFamille [eltId] = - t;
429 char famille[MED_TAILLE_NOM+1];
430 sprintf(famille,"E%d",t);
431 CreateFamily(strdup(nommaa),strdup(famille),-t,attvalabs++);
438 for (i=0;i<MED_NBR_GEOMETRIE_MAILLE;i++)
440 if (nmailles[i] > 0 && ret == 0)
442 MESSAGE ( " Start "<<typmai[i]);
444 /* dimension de la maille */
445 edim = typmai[i] / 100;
447 if (mdim == 2 || mdim == 3)
448 if (edim == 1) nsup = 1;
450 if (edim == 2) nsup = 1;
453 taille = nsup+typmai[i]%100;
456 /* allocation memoire */
457 connectivite = (med_int*)malloc(sizeof(med_int)* taille*nmailles[i]);
458 nomele = (char*)malloc(sizeof(char)*MED_TAILLE_PNOM* nmailles[i]+1);
459 numele = (med_int*)malloc(sizeof(med_int)* nmailles[i]);
460 nufael = (med_int*)malloc(sizeof(med_int)* nmailles[i]);
462 nbNodes=typmai[i]%100;
464 for (j=0;j<nmailles[i];j++)
466 myId = elem_Id[i][j];
467 const Handle(SMDS_MeshElement)& elem = myMesh->FindElement(myId);
468 //*(numele+j) = myId;
469 *(numele+j) = indice ++;
471 for (k=0; k<nbNodes; k++)
473 *(connectivite+j*taille+k) = mapNoeud[elem->GetConnection(k+1)];
474 //SCRUTE(*(connectivite+j*taille+k));
476 if (nsup) *(connectivite+j*taille + nbNodes) = 0;
478 if (besoinfamilledemaille == 1)
480 if (mapFamille.find(myId)!=mapFamille.end())
482 nufael[j]=mapFamille[myId];
499 /* ecriture des données */
502 ret=MEDelementsEcr( myFileId,nommaa,mdim,connectivite,mode_coo,nomele,MED_FAUX,numele,
503 MED_VRAI,nufael,nmailles[i],MED_MAILLE,typmai[i],typ_con,MED_REMP);
507 if (ret < 0) MESSAGE(">> ERREUR : ecriture des mailles \n");
509 /* liberation memoire */
513 MESSAGE ( " End "<<typmai[i]);
516 MESSAGE("--- Creation de " << nbFamillesElts << " familles d elements");
520 /****************************************************************************
521 * FERMETURE DU FICHIER *
522 ****************************************************************************/
524 ret = MEDfermer(myFileId);
527 fprintf(stderr,">> ERREUR : erreur a la fermeture du fichier %s\n",file2Read);
528 MESSAGE ("fichier ferme");
533 void DriverMED_W_SMESHDS_Mesh::CreateFamily(char* nommaa, char* famille, int i,med_int k) {
539 char attdes[MED_TAILLE_DESC+1];
540 char gro[MED_TAILLE_LNOM+1];
541 char fam2[MED_TAILLE_LNOM+1];
545 strcpy(fam2,famille);
547 med_int * attide=new med_int[1];
548 med_int * attval=new med_int[1];
553 //MESSAGE("-------- Creation de la Famille : "<< famille << "numero " << i << " --------------");
554 med_int ret = MEDfamCr(myFileId, nommaa, fam2, i, attide, attval, attdes, natt, gro, ngro);