1 #include "HomardMedCommun.h"
13 #include "utilities.h"
14 // =======================================================================
15 std::set<std::string> GetListeGroupesInMedFile(const char * aFile)
16 // =======================================================================
18 std::set<std::string> ListeGroupes;
19 int MedIdt = MEDouvrir(const_cast<char *>(aFile),MED_LECTURE);
20 if ( MedIdt < 0 ) { return ListeGroupes; };
22 char maa[MED_TAILLE_NOM+1];
23 char desc[MED_TAILLE_DESC+1];
24 char nomfam[MED_TAILLE_NOM+1];
29 med_int numMaillage=1;
30 if ( MEDmaaInfo(MedIdt,numMaillage,maa,&mdim,&type,desc) < 0 ) { return ListeGroupes; };
31 med_int nfam, ngro, natt;
32 if ((nfam = MEDnFam(MedIdt,maa)) < 0) { return ListeGroupes; };
33 for (int i=0;i<nfam;i++)
35 if ((ngro = MEDnGroupe(MedIdt,maa,i+1)) < 0)
37 // GERALD -- QMESSAGE BOX
38 std::cerr << " Error : Families are unreadable" << std::endl;
39 std::cerr << "Pb avec la famille : " << i << std::endl;
42 if (ngro == 0) continue;
44 if ((natt = MEDnAttribut(MedIdt,maa,i+1)) < 0)
46 // GERALD -- QMESSAGE BOX
47 std::cerr << " Error : Families are unreadable" << std::endl;
48 std::cerr << "Pb avec la famille : " << i << std::endl;
52 med_int* attide = (med_int*) malloc(sizeof(med_int)*natt);
53 med_int* attval = (med_int*) malloc(sizeof(med_int)*natt);
54 char* attdes = (char *) malloc(MED_TAILLE_DESC*natt+1);
55 char* gro = (char*) malloc(MED_TAILLE_LNOM*ngro+1);
56 if (MEDfamInfo(MedIdt,maa,i+1,nomfam,&numfam,attide,attval,attdes,
59 // GERALD -- QMESSAGE BOX
60 std::cerr << " Error : Families are unreadable" << std::endl;
61 std::cerr << "Pb avec la famille : " << i << std::endl;
67 if ((numfam )> 0) { continue;} // On ne garde que les familles d elts
69 for (int j=0;j<ngro;j++)
71 char str2[MED_TAILLE_LNOM+1];
72 strncpy(str2,gro+j*MED_TAILLE_LNOM,MED_TAILLE_LNOM);
73 str2[MED_TAILLE_LNOM] = '\0';
74 ListeGroupes.insert(std::string(str2));
83 // =======================================================================
84 std::vector<double> GetBoundingBoxInMedFile(const char * aFile)
85 // =======================================================================
87 // Le vecteur en retour contiendra les informations suivantes :
88 // en position 0 et 1 Xmin, Xmax et en position 2 Dx si < 0 2D
89 // en position 3 et 4 Ymin, Ymax et en position 5 Dy si < 0 2D
90 // en position 6 et 7 Zmin, Zmax et en position 8 Dz si < 0 2D
91 // 9 distance max dans le maillage
93 std::vector<double> LesExtremes;
95 // Ouverture du Fichier Med
96 int MedIdt = MEDouvrir(const_cast<char *>(aFile),MED_LECTURE);
99 // GERALD -- QMESSAGE BOX
100 std::cerr << "Error : mesh is unreadable" << std::endl;
104 // Le fichier Med est lisible
105 // Boucle sur les noms de maillage
106 int numberOfMeshes = MEDnMaa(MedIdt) ;
107 if (numberOfMeshes != 1 )
109 // GERALD -- QMESSAGE BOX
110 std::cerr << "Error : file contains more than one mesh" << std::endl;
114 char maa[MED_TAILLE_NOM+1];
115 char desc[MED_TAILLE_DESC+1];
116 char nomcoo[3*MED_TAILLE_PNOM+1];
117 char unicoo[3*MED_TAILLE_PNOM+1];
120 med_booleen inonoe,inunoe;
123 med_int numMaillage=1;
125 if (MEDmaaInfo(MedIdt,numMaillage,maa,&dim,&type,desc) < 0)
127 // GERALD -- QMESSAGE BOX
128 std::cerr << "Error : mesh " << numMaillage << " is unreadable" << std::endl;
132 med_int nnoe = MEDnEntMaa(MedIdt,maa,MED_COOR,MED_NOEUD,(med_geometrie_element)0,(med_connectivite)0);
135 // GERALD -- QMESSAGE BOX
136 std::cerr << "Error : mesh " << numMaillage << " is unreadable" << std::endl;
140 med_float* coo = (med_float*) malloc(sizeof(med_float)*nnoe*dim);
141 med_int* numnoe = (med_int*) malloc(sizeof(med_int)*nnoe);
142 med_int* nufano = (med_int*) malloc(sizeof(med_int)*nnoe);
143 char * nomnoe = (char*) malloc(MED_TAILLE_PNOM*nnoe+1);
145 MEDnoeudsLire(MedIdt,maa,dim,coo,MED_NO_INTERLACE,&rep,
146 nomcoo,unicoo,nomnoe,&inonoe,numnoe,&inunoe,
149 med_float xmin,xmax,ymin,ymax,zmin,zmax;
153 for (int i=1;i<nnoe;i++)
155 xmin = min(xmin,coo[i]);
156 xmax = max(xmax,coo[i]);
161 ymin=coo[nnoe]; ymax=coo[nnoe];
162 for (int i=nnoe+1;i<2*nnoe;i++)
164 ymin = min(ymin,coo[i]);
165 ymax = max(ymax,coo[i]);
178 zmin=coo[2*nnoe]; zmax=coo[2*nnoe];
179 for (int i=2*nnoe+1;i<3*nnoe;i++)
181 zmin = min(zmin,coo[i]);
182 zmax = max(zmax,coo[i]);
192 MESSAGE( "_______________________________________");
193 MESSAGE( "xmin : " << xmin << " xmax : " << xmax );
194 MESSAGE( "ymin : " << ymin << " ymax : " << ymax );
195 MESSAGE( "zmin : " << zmin << " zmax : " << zmax );
196 MESSAGE( "_______________________________________" );
197 double epsilon = 1.e-6 ;
198 LesExtremes.push_back(xmin);
199 LesExtremes.push_back(xmax);
200 LesExtremes.push_back(0);
201 LesExtremes.push_back(ymin);
202 LesExtremes.push_back(ymax);
203 LesExtremes.push_back(0);
204 LesExtremes.push_back(zmin);
205 LesExtremes.push_back(zmax);
206 LesExtremes.push_back(0);
209 double max1=max ( LesExtremes[1] - LesExtremes[0] , LesExtremes[4] - LesExtremes[3] ) ;
210 double max2=max ( max1 , LesExtremes[7] - LesExtremes[6] ) ;
211 LesExtremes.push_back(max2);
213 // LesExtremes[0] = Xmini du maillage
214 // LesExtremes[1] = Xmaxi du maillage
215 // LesExtremes[2] = increment de progression en X
216 // LesExtremes[3,4,5] : idem pour Y
217 // LesExtremes[6,7,8] : idem pour Z
218 // LesExtremes[9] = ecart maximal entre coordonnees
219 // On fait un traitement pour dans le cas d'une coordonnee constante
220 // inhiber ce cas en mettant un increment negatif
222 double diff = LesExtremes[1] - LesExtremes[0];
223 if (fabs(diff) > epsilon*max2)
225 LesExtremes[2] = diff/100.;
229 LesExtremes[2] = -1. ;
232 diff = LesExtremes[4] - LesExtremes[3];
233 if (fabs(diff) > epsilon*max2)
235 LesExtremes[5]=diff/100.;
239 LesExtremes[5] = -1. ;
242 diff = LesExtremes[7] - LesExtremes[6];
243 if (fabs(diff) > epsilon*max2)
245 LesExtremes[8]=diff/100.;
249 LesExtremes[8] = -1. ;
252 MESSAGE ( "_______________________________________" );
253 MESSAGE ( "xmin : " << LesExtremes[0] << " xmax : " << LesExtremes[1] << " xincr : " << LesExtremes[2] );
254 MESSAGE ( "ymin : " << LesExtremes[3] << " ymax : " << LesExtremes[4] << " yincr : " << LesExtremes[5] );
255 MESSAGE ( "zmin : " << LesExtremes[6] << " zmax : " << LesExtremes[7] << " zincr : " << LesExtremes[8] );
256 MESSAGE ( "dmax : " << LesExtremes[9] );
257 MESSAGE ( "_______________________________________" );