Salome HOME
version 5_1_4 HOMARD_SRC
[modules/homard.git] / src / HOMARD_I / HomardMedCommun.cxx
1 #include "HomardMedCommun.h"
2 using namespace std;
3 #include <iostream>
4 #include <cstdlib>
5 #include <cmath>
6 #include <cstring>
7
8 extern "C" 
9 {
10 #include <med.h>
11 }
12
13 #include "utilities.h"
14 // =======================================================================
15 std::set<std::string> GetListeGroupesInMedFile(const char * aFile)
16 // =======================================================================
17 {
18    std::set<std::string> ListeGroupes;
19    int MedIdt = MEDouvrir(const_cast<char *>(aFile),MED_LECTURE);
20    if ( MedIdt < 0 ) { return ListeGroupes; };
21
22    char maa[MED_TAILLE_NOM+1];
23    char desc[MED_TAILLE_DESC+1];
24    char nomfam[MED_TAILLE_NOM+1];
25    med_int numfam;
26
27    med_int mdim;
28    med_maillage type;
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++) 
34    {
35       if ((ngro = MEDnGroupe(MedIdt,maa,i+1)) < 0) 
36       {
37         // GERALD -- QMESSAGE BOX
38         std::cerr << " Error : Families are unreadable" << std::endl;
39         std::cerr << "Pb avec la famille : " << i << std::endl;
40         break;
41       }
42       if (ngro == 0) continue;
43
44       if ((natt = MEDnAttribut(MedIdt,maa,i+1)) < 0) 
45       {
46         // GERALD -- QMESSAGE BOX
47         std::cerr << " Error : Families are unreadable" << std::endl;
48         std::cerr << "Pb avec la famille : " << i << std::endl;
49         break;
50       }
51
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,
57                       &natt,gro,&ngro) < 0) 
58       { 
59         // GERALD -- QMESSAGE BOX
60         std::cerr << " Error : Families are unreadable" << std::endl;
61         std::cerr << "Pb avec la famille : " << i << std::endl;
62          break;
63       }
64       free(attide);
65       free(attval);
66       free(attdes);
67       if ((numfam )> 0) { continue;} // On ne garde que les familles d elts
68
69       for (int j=0;j<ngro;j++) 
70       {
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));
75
76       }
77       free(gro);
78    }
79    MEDfermer(MedIdt);
80    return ListeGroupes;
81 }
82
83 // =======================================================================
84 std::vector<double> GetBoundingBoxInMedFile(const char * aFile)
85 // =======================================================================
86 {
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
92
93    std::vector<double> LesExtremes;
94    
95                                 // Ouverture du Fichier Med
96    int MedIdt = MEDouvrir(const_cast<char *>(aFile),MED_LECTURE);
97    if (MedIdt <0) 
98    {
99           // GERALD -- QMESSAGE BOX
100           std::cerr << "Error : mesh is unreadable" << std::endl;
101           return LesExtremes;
102    }
103
104                                 // Le fichier Med est lisible
105                                 // Boucle sur les noms de maillage
106    int numberOfMeshes = MEDnMaa(MedIdt) ;
107    if (numberOfMeshes != 1 ) 
108    {
109           // GERALD -- QMESSAGE BOX
110           std::cerr << "Error : file contains more than one mesh" << std::endl;
111           return LesExtremes;
112    }
113
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];
118    med_maillage type;
119    med_repere rep;
120    med_booleen inonoe,inunoe;
121
122    med_int dim;
123    med_int numMaillage=1;
124
125    if (MEDmaaInfo(MedIdt,numMaillage,maa,&dim,&type,desc) < 0) 
126    {
127           // GERALD -- QMESSAGE BOX
128           std::cerr << "Error : mesh " << numMaillage << " is unreadable" << std::endl;
129           return LesExtremes;
130    }
131
132    med_int nnoe  = MEDnEntMaa(MedIdt,maa,MED_COOR,MED_NOEUD,(med_geometrie_element)0,(med_connectivite)0);
133    if ( nnoe < 0) 
134    {
135           // GERALD -- QMESSAGE BOX
136           std::cerr << "Error : mesh " << numMaillage << " is unreadable" << std::endl;
137           return LesExtremes;
138    }
139
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);
144
145    MEDnoeudsLire(MedIdt,maa,dim,coo,MED_NO_INTERLACE,&rep,
146                       nomcoo,unicoo,nomnoe,&inonoe,numnoe,&inunoe,
147                       nufano,nnoe);
148
149    med_float xmin,xmax,ymin,ymax,zmin,zmax;
150    
151    xmin=coo[0];
152    xmax=coo[0];
153    for (int i=1;i<nnoe;i++)
154    {
155       xmin = min(xmin,coo[i]);
156       xmax = max(xmax,coo[i]);
157    }
158 //
159    if (dim > 1)
160    {
161        ymin=coo[nnoe]; ymax=coo[nnoe];
162        for (int i=nnoe+1;i<2*nnoe;i++)
163        {
164            ymin = min(ymin,coo[i]);
165            ymax = max(ymax,coo[i]);
166        }
167    }
168    else
169    {
170        ymin=0;
171        ymax=0;
172        zmin=0;
173        zmax=0;
174    }
175 //
176    if (dim > 2)
177    {
178        zmin=coo[2*nnoe]; zmax=coo[2*nnoe];
179        for (int i=2*nnoe+1;i<3*nnoe;i++)
180        {
181            zmin = min(zmin,coo[i]);
182            zmax = max(zmax,coo[i]);
183        }
184    }
185    else
186    {
187        zmin=0;
188        zmax=0;
189    }
190    MEDfermer(MedIdt);
191
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);
207
208
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);
212
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
221 //
222    double diff = LesExtremes[1] - LesExtremes[0];
223    if (fabs(diff)  > epsilon*max2)
224    {
225       LesExtremes[2] = diff/100.;
226    }
227    else
228    {
229       LesExtremes[2] = -1. ;
230    }
231
232    diff = LesExtremes[4] - LesExtremes[3];
233    if (fabs(diff)  > epsilon*max2)
234    {
235       LesExtremes[5]=diff/100.;
236    }
237    else
238    {
239       LesExtremes[5] = -1. ;
240    }
241
242    diff = LesExtremes[7] - LesExtremes[6];
243    if (fabs(diff)  > epsilon*max2)
244    {
245       LesExtremes[8]=diff/100.;
246    }
247    else
248    {
249       LesExtremes[8] = -1. ;
250    }
251
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 ( "_______________________________________" );
258
259    return  LesExtremes;
260 }
261