ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/toIbrep/src/toibrep.cpp
Revision: 106
Committed: Mon Jun 16 08:02:08 2008 UTC (16 years, 11 months ago) by francois
Original Path: magic/lib/toxfem/toxfem/src/toxfem.cpp
File size: 16279 byte(s)
Log Message:
Dans fichier exportation des couleurs de vectorisation dans GMSH
Dans template ajout d.un tag dans la grille plus ajout de keycode pour coder une cellule
dans mailleur possibilite d ajouter un maillage octal dans un fichier magic existant

File Contents

# User Rev Content
1 bechet 105 #include "gestionversion.h"
2 francois 104 #include "toxfem.h"
3     #include "MagXchange.h"
4     #include "mg_file.h"
5     #include "ot_mathematique.h"
6     #include "tpl_map_entite.h"
7     #include "tpl_octree.h"
8 francois 106 #include "toxfem_point.h"
9     #include "vct.h"
10 francois 104 #include <math.h>
11    
12 francois 106 #define NPAS 50
13 francois 104
14 francois 106 TOXFEM::TOXFEM()
15 francois 104 {
16     }
17    
18    
19 francois 106 TOXFEM::~TOXFEM()
20 francois 104 {
21     }
22    
23    
24    
25 francois 106 int TOXFEM::estdansletetra(MG_TETRA *tet,double x,double y, double z)
26 francois 104 {
27     double* xyz1=tet->get_noeud1()->get_coord();
28     double* xyz2=tet->get_noeud2()->get_coord();
29     double* xyz3=tet->get_noeud3()->get_coord();
30     double* xyz4=tet->get_noeud4()->get_coord();
31     OT_VECTEUR_3D v1(xyz2[0]-xyz1[0],xyz2[1]-xyz1[1],xyz2[2]-xyz1[2]);
32     OT_VECTEUR_3D v2(xyz3[0]-xyz1[0],xyz3[1]-xyz1[1],xyz3[2]-xyz1[2]);
33     OT_VECTEUR_3D v3(xyz4[0]-xyz1[0],xyz4[1]-xyz1[1],xyz4[2]-xyz1[2]);
34     OT_VECTEUR_3D v4(x-xyz1[0],y-xyz1[1],z-xyz1[2]);
35     OT_MATRICE_3D mat(v1,v2,v3);
36     OT_MATRICE_3D mat1(v4,v2,v3);
37     OT_MATRICE_3D mat2(v1,v4,v3);
38     OT_MATRICE_3D mat3(v1,v2,v4);
39     double det=mat.get_determinant();
40     double xsi=mat1.get_determinant()/det;
41     double eta=mat2.get_determinant()/det;
42     double dseta=mat3.get_determinant()/det;
43     int reponse=1;
44     if (xsi<-0.000001) reponse=0;
45     if (eta<-0.000001) reponse=0;
46     if (dseta<-0.000001) reponse=0;
47     if (xsi+eta+dseta>1.000001) reponse=0;
48     return reponse;
49    
50     }
51    
52 francois 106 double TOXFEM::calculdist(double *n,double x,double y,double z,MG_NOEUD* noeud,MG_TETRA* tet)
53 francois 104 {
54     double* xyz=noeud->get_coord();
55     /*double t=(-n[0]*xyz[0]-n[1]*xyz[1]-n[2]*xyz[2]-n[3])/(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
56     double xyz1[3];
57     xyz1[0]=xyz[0]+t*n[0];
58     xyz1[1]=xyz[1]+t*n[1];
59     xyz1[2]=xyz[2]+t*n[2];
60     double dist;
61     if (estdansletetra(tet,xyz1[0],xyz1[1],xyz1[2]))
62     dist=sqrt((xyz[0]-xyz1[0])*(xyz[0]-xyz1[0])+(xyz[1]-xyz1[1])*(xyz[1]-xyz1[1])+(xyz[2]-xyz1[2])*(xyz[2]-xyz1[2]));
63     else*/
64     double dist=sqrt((xyz[0]-x)*(xyz[0]-x)+(xyz[1]-y)*(xyz[1]-y)+(xyz[2]-z)*(xyz[2]-z));
65     OT_VECTEUR_3D vec1(n[0],n[1],n[2]);
66     OT_VECTEUR_3D vec2(xyz[0]-x,xyz[1]-y,xyz[2]-z);
67     double ps=vec1*vec2;
68     if (ps<0.) dist=-dist;
69     return dist;
70     }
71    
72 francois 106 void TOXFEM::importer(std::string nomfichier,class MagXchange* data,std::string nomfichierout)
73 francois 104 {
74     MG_FILE gest((char*)nomfichier.c_str());
75 francois 106 mai=gest.get_mg_maillage(1);
76     geo=gest.get_mg_geometrie(0);
77     int nbface=geo->get_nb_mg_face();
78 francois 104 int nb_noeud=mai->get_nb_mg_noeud();
79     std::string nomfichier2=nomfichier+".sol";
80 francois 106 MG_SOLUTION* solution=new MG_SOLUTION(mai,nbface+1,(char*)nomfichier2.c_str(),nb_noeud,"VL");
81     solution->change_legende(0,"Peau");
82     for (int i=0;i<nbface;i++)
83     {
84     char mess[255];
85     sprintf(mess,"Face%d",i);
86     solution->change_legende(i+1,mess);
87     }
88 francois 104 gest.ajouter_mg_solution(solution);
89     double xmin=1e300,ymin=1e300,zmin=1e308;
90     double xmax=-1e300,ymax=-1e300,zmax=-1e308;
91     TPL_MAP_ENTITE<MG_NOEUD*> lst_noeud;
92     for (int i=0;i<nb_noeud;i++)
93     {
94     MG_NOEUD* noeud=mai->get_mg_noeud(i);
95     double* xyz=noeud->get_coord();
96     if (xyz[0]<xmin) xmin=xyz[0];
97     if (xyz[1]<ymin) ymin=xyz[1];
98     if (xyz[2]<zmin) zmin=xyz[2];
99     if (xyz[0]>xmax) xmax=xyz[0];
100     if (xyz[1]>ymax) ymax=xyz[1];
101     if (xyz[2]>zmax) zmax=xyz[2];
102 francois 106 for (int j=0;j<nbface+1;j++)
103     solution->ecrire(i,j,1e300);
104 francois 104 lst_noeud.ajouter(noeud);
105     }
106     octree.initialiser(&lst_noeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
107     int nb_tetra=mai->get_nb_mg_tetra();
108     for (int i=0;i<nb_tetra;i++)
109     {
110     MG_TETRA* tet=mai->get_mg_tetra(i);
111     octree.inserer(tet);
112     }
113 francois 106 levelset0(solution,0);
114     for (int i=0;i<nbface;i++)
115     {
116     vector<MG_FACE*> lstface;
117     MG_FACE* face=geo->get_mg_face(i);
118     TPL_LISTE_ENTITE<double> lst;
119     int type=face->get_surface()->get_type_geometrique(lst);
120     int idem=0;
121     for (int j=0;j<i;j++)
122     {
123     TPL_LISTE_ENTITE<double> lst2;
124     MG_FACE* face2=geo->get_mg_face(j);
125     int type2=face2->get_surface()->get_type_geometrique(lst2);
126     if (type==type2)
127     if (lst.get_nb()==lst2.get_nb())
128     {
129     int diff=0;
130     for (int i=0;i<lst.get_nb();i++)
131     if (fabs(lst.get(i)-lst2.get(i))>0.000001) diff=1;
132     if (diff==0) idem=1;
133     }
134     }
135     if (!idem) lstface.push_back(geo->get_mg_face(i));
136     for (int j=i+1;j<nbface;j++)
137     {
138     TPL_LISTE_ENTITE<double> lst2;
139     MG_FACE* face2=geo->get_mg_face(j);
140     int type2=face2->get_surface()->get_type_geometrique(lst2);
141     if (type==type2)
142     if (lst.get_nb()==lst2.get_nb())
143     {
144     int diff=0;
145     for (int i=0;i<lst.get_nb();i++)
146     if (fabs(lst.get(i)-lst2.get(i))>0.000001) diff=1;
147     if (diff==0) lstface.push_back(face2);
148     }
149     }
150     levelsetn(&lstface,solution,i+1);
151     }
152     if (nomfichierout!="") gest.enregistrer((char*)nomfichierout.c_str());
153     if (data==NULL) return;
154     for (int i=0;i<nb_noeud;i++)
155     {
156     MG_NOEUD* noeud=mai->get_mg_noeud(i);
157     MagNode *xfemnode;
158     int nbsol=0;
159     for (int j=0;j<nbface+1;j++)
160     if (solution->lire(i,j)<1e200) nbsol++;
161     if (nbsol>0)
162     {
163     xfemnode=new MagNode(nbsol);
164     int isol=0;
165     for (int j=0;j<nbface+1;j++)
166     if (solution->lire(i,j)<1e200)
167     {
168     xfemnode->values()[isol]=solution->lire(i,j);
169     xfemnode->idvalues()[isol]=j;
170     isol++;
171     }
172     } // 1 valeur de levelset
173     else
174     xfemnode=new MagNode(0); // 0 valeur de levelset
175     double * posxfem=xfemnode->position();
176     for (int i=0;i<3;++i) posxfem[i]=noeud->get_coord()[i];
177     xfemnode->id(noeud->get_id());
178     data->addnode(*xfemnode,true);
179     delete xfemnode;
180     }
181     int nbtetra=mai->get_nb_mg_tetra();
182     for (int i=0;i<nbtetra;i++)
183     {
184     MG_TETRA* tet=mai->get_mg_tetra(i);
185     MagElement xfemele(MagElement::TETRAHEDRON);
186     xfemele.nodes()[0]=tet->get_noeud1()->get_id();
187     xfemele.nodes()[1]=tet->get_noeud2()->get_id();
188     xfemele.nodes()[2]=tet->get_noeud3()->get_id();
189     xfemele.nodes()[3]=tet->get_noeud4()->get_id();
190     data->addelement(xfemele);
191     }
192     }
193    
194     void TOXFEM::levelset0(MG_SOLUTION *solution,int numsol)
195     {
196     solution->active_solution(numsol);
197 francois 104 int nbface=geo->get_nb_mg_face();
198 francois 106 vector<TOXFEM_POINT*> lst;
199 francois 104 for (int iface=0;iface<nbface;iface++)
200     {
201 francois 106 MG_FACE* face=geo->get_mg_face(iface);
202     int nbpoint=lst.size();
203 francois 104 TPL_SET<MG_ELEMENT_MAILLAGE*>::ITERATEUR it;
204     for (MG_ELEMENT_MAILLAGE* ele=face->get_lien_maillage()->get_premier(it);ele!=NULL;ele=face->get_lien_maillage()->get_suivant(it))
205     {
206     MG_TRIANGLE *tri=(MG_TRIANGLE*)ele;
207 francois 106 TOXFEM_POINT *pt1=new TOXFEM_POINT(tri->get_noeud1()->get_x(),tri->get_noeud1()->get_y(),tri->get_noeud1()->get_z(),tri->get_noeud1()->get_lien_topologie());
208     TOXFEM_POINT *pt2=new TOXFEM_POINT(tri->get_noeud2()->get_x(),tri->get_noeud2()->get_y(),tri->get_noeud2()->get_z(),tri->get_noeud2()->get_lien_topologie());
209     TOXFEM_POINT *pt3=new TOXFEM_POINT(tri->get_noeud3()->get_x(),tri->get_noeud3()->get_y(),tri->get_noeud3()->get_z(),tri->get_noeud3()->get_lien_topologie());
210     lst.push_back(pt1);
211     lst.push_back(pt2);
212     lst.push_back(pt3);
213 francois 104 }
214 francois 106 calcullevelsetpremierepasse(solution,numsol,face,&lst,nbpoint,lst.size());
215     }
216     calcullevelsetdeuxiemepasse(solution,numsol,&lst);
217     }
218     void TOXFEM::calcullevelsetpremierepasse(MG_SOLUTION *solution,int numsol,MG_FACE* face,vector<TOXFEM_POINT*> *lst,int n1,int n2)
219     {
220     for (int i=n1;i<n2;i++)
221 francois 104 {
222 francois 106 TOXFEM_POINT* pt=(*lst)[i];
223 francois 104 double uv[2];
224 francois 106 double xyz[3];
225     pt->get_coord3(xyz);
226 francois 104 double normal[4];
227     face->inverser(uv,xyz);
228 francois 106 normal[0]=normal[0]*face->get_mg_coface(0)->get_orientation();
229     normal[1]=normal[1]*face->get_mg_coface(0)->get_orientation();
230     normal[2]=normal[2]*face->get_mg_coface(0)->get_orientation();
231 francois 104 face->calcul_normale_unitaire(uv,normal);
232     TPL_MAP_ENTITE<MG_TETRA*> liste;
233     octree.rechercher(xyz[0],xyz[1],xyz[2],0.,liste);
234     int nb=liste.get_nb();
235     for (int k=0;k<nb;k++)
236     {
237     MG_TETRA* tet=liste.get(k);
238     if ( estdansletetra(tet,xyz[0],xyz[1],xyz[2]))
239     {
240     normal[3]=-normal[0]*xyz[0]-normal[1]*xyz[1]-normal[2]*xyz[2];
241     double dist=calculdist(normal,xyz[0],xyz[1],xyz[2],tet->get_noeud1(),tet);
242     if (fabs(dist)<fabs(tet->get_noeud1()->get_solution()))
243 francois 106 {
244 francois 104 tet->get_noeud1()->change_solution(dist);
245 francois 106 tet->get_noeud1()->change_nouveau_numero(pt->get_id());
246     pt->change_coord2(uv);
247     }
248 francois 104 dist=calculdist(normal,xyz[0],xyz[1],xyz[2],tet->get_noeud2(),tet);
249     if (fabs(dist)<fabs(tet->get_noeud2()->get_solution()))
250 francois 106 {
251 francois 104 tet->get_noeud2()->change_solution(dist);
252 francois 106 tet->get_noeud2()->change_nouveau_numero(pt->get_id());
253     pt->change_coord2(uv);
254     }
255 francois 104 dist=calculdist(normal,xyz[0],xyz[1],xyz[2],tet->get_noeud3(),tet);
256     if (fabs(dist)<fabs(tet->get_noeud3()->get_solution()))
257 francois 106 {
258 francois 104 tet->get_noeud3()->change_solution(dist);
259 francois 106 tet->get_noeud3()->change_nouveau_numero(pt->get_id());
260     pt->change_coord2(uv);
261     }
262 francois 104 dist=calculdist(normal,xyz[0],xyz[1],xyz[2],tet->get_noeud4(),tet);
263     if (fabs(dist)<fabs(tet->get_noeud4()->get_solution()))
264 francois 106 {
265 francois 104 tet->get_noeud4()->change_solution(dist);
266 francois 106 tet->get_noeud4()->change_nouveau_numero(pt->get_id());
267     pt->change_coord2(uv);
268     }
269 francois 104
270     }
271     }
272     }
273 francois 106 }
274    
275     void TOXFEM::calcullevelsetdeuxiemepasse(MG_SOLUTION *solution,int numsol,vector<TOXFEM_POINT*> *lst)
276     {
277     LISTE_MG_TETRA::iterator ittet;
278     for (MG_TETRA* tet=mai->get_premier_tetra(ittet);tet!=NULL;tet=mai->get_suivant_tetra(ittet))
279     {
280     MG_NOEUD *noeud[4];
281     noeud[0]=tet->get_noeud1();
282     noeud[1]=tet->get_noeud2();
283     noeud[2]=tet->get_noeud3();
284     noeud[3]=tet->get_noeud4();
285     for (int i=0;i<4;i++)
286     if (noeud[i]->get_solution()<1e250)
287     {
288     TOXFEM_POINT* pt=(*lst)[noeud[i]->get_nouveau_numero()];
289     int dim=pt->get_mg_element_topologique()->get_dimension();
290     if (dim==2)
291     {
292     MG_FACE* face=(MG_FACE*)pt->get_mg_element_topologique();
293     double dist=calcul_distance(noeud[i],face,pt);
294     int signe=1;
295     if (noeud[i]->get_solution()<0) signe=-1;
296     noeud[i]->change_solution(signe*dist);
297     }
298     if (dim==1)
299     {
300     MG_ARETE* arete=(MG_ARETE*)pt->get_mg_element_topologique();
301     double dist=calcul_distance(noeud[i],arete,pt);
302     noeud[i]->change_solution(dist);
303     }
304     if (dim==0)
305     {
306     MG_SOMMET* sommet=(MG_SOMMET*)pt->get_mg_element_topologique();
307     MG_ARETE* arete=sommet->get_mg_cosommet(0)->get_arete();
308     double dist=calcul_distance(noeud[i],arete,pt);
309     noeud[i]->change_solution(dist);
310     }
311    
312     }
313 francois 104 }
314 francois 106 int nb_noeud=mai->get_nb_mg_noeud();
315 francois 104 for (int i=0;i<nb_noeud;i++)
316     {
317     MG_NOEUD* noeud=mai->get_mg_noeud(i);
318 francois 106 solution->ecrire(i,numsol,noeud->get_solution());
319 francois 104 }
320 francois 106 int nbpt=(*lst).size();
321     for (int i=0;i<nbpt;i++) delete (*lst)[i];
322     TOXFEM_POINT::remisecompteurid();
323 francois 104
324 francois 106 }
325    
326     double TOXFEM::calcul_distance(MG_NOEUD* noeud,MG_ARETE* are,TOXFEM_POINT* pt,double precision)
327     {
328     double tii,eps;
329     are->inverser(tii,noeud->get_coord());
330     int compteur=0;
331     OT_VECTEUR_3D Pt(noeud->get_x(),noeud->get_y(),noeud->get_z());
332     do
333     {
334     compteur++;
335     double ti=tii;
336     double xyz[3],dxyz[3],ddxyz[3];
337     are->deriver_seconde(ti,ddxyz,dxyz,xyz);
338     OT_VECTEUR_3D Ct(xyz[0],xyz[1],xyz[2]);
339     OT_VECTEUR_3D Ct_deriver(dxyz[0],dxyz[1],dxyz[2]);
340     OT_VECTEUR_3D Ct_deriver_seconde(ddxyz[0],ddxyz[1],ddxyz[2]);
341     OT_VECTEUR_3D Distance = Ct-Pt;
342     tii=ti-Ct_deriver*Distance/(Ct_deriver_seconde*Distance+Ct_deriver.get_longueur2());
343     eps=fabs(tii-ti);
344     if (compteur>500) return 1e300;
345     if (tii<are->get_tmin())
346     {
347     tii=are->get_tmin();
348     eps=0.;
349     }
350     if (tii>are->get_tmax())
351     {
352     tii=are->get_tmax();
353     eps=0.;
354     }
355     }
356     while (eps>precision);
357     double xyz[3],dxyz[3];
358     are->evaluer(tii,xyz);
359     OT_VECTEUR_3D Ct(xyz[0],xyz[1],xyz[2]);
360     double distance=(Ct-Pt).get_longueur();
361     MG_FACE* face1=are->get_mg_coarete(0)->get_boucle()->get_mg_face();
362     MG_FACE* face2=are->get_mg_coarete(1)->get_boucle()->get_mg_face();
363     are->deriver(tii,dxyz);
364     OT_VECTEUR_3D x1(dxyz[0],dxyz[1],dxyz[2]);
365     OT_VECTEUR_3D x2(dxyz[0],dxyz[1],dxyz[2]);
366     x1=are->get_mg_coarete(0)->get_orientation()*x1;
367     x2=are->get_mg_coarete(1)->get_orientation()*x2;
368     x1.norme();
369     x2.norme();
370     double uv1[2],uv2[2];
371     double normal1[3],normal2[3];
372     face1->inverser(uv1,xyz);
373     face2->inverser(uv2,xyz);
374     face1->calcul_normale_unitaire(uv1,normal1);
375     face2->calcul_normale_unitaire(uv2,normal2);
376     OT_VECTEUR_3D z1(normal1[0],normal1[1],normal1[2]);
377     OT_VECTEUR_3D z2(normal2[0],normal2[1],normal2[2]);
378     z1=face1->get_mg_coface(0)->get_orientation()*z1;
379     z2=face2->get_mg_coface(0)->get_orientation()*z2;
380     OT_VECTEUR_3D y1=z1&x1;
381     OT_VECTEUR_3D y2=z2&x2;
382     double test=(z1&z2)*x1;
383     int signe=-1;
384     OT_VECTEUR_3D dirpt=Pt-Ct;
385     if (test>0)
386     {if ((z1*dirpt>0.) || (z2*dirpt>0.)) signe=1;}
387     else
388     {if ((z1*dirpt>0.) && (z2*dirpt>0.)) signe=1;}
389     return signe*distance;
390     }
391    
392     double TOXFEM::calcul_distance(MG_NOEUD* noeud,MG_FACE* face,TOXFEM_POINT* pt,double precision)
393     {
394     double uvii[2],eps;
395     pt->get_coord2(uvii);
396     int compteur=0;
397     OT_VECTEUR_3D Pt(noeud->get_x(),noeud->get_y(),noeud->get_z());
398     double delta_u,delta_v;
399     do
400     {
401     compteur++;
402     double uvi[2];
403     uvi[0]=uvii[0];
404     uvi[1]=uvii[1];
405     double xyzduu[3],xyzdvv[3],xyzduv[3],xyzdu[3],xyzdv[3],xyz[3];
406     face->deriver_seconde(uvi,xyzduu,xyzduv,xyzdvv,xyz,xyzdu,xyzdv);
407     OT_VECTEUR_3D S(xyz[0],xyz[1],xyz[2]);
408     OT_VECTEUR_3D Su(xyzdu[0],xyzdu[1],xyzdu[2]);
409     OT_VECTEUR_3D Sv(xyzdv[0],xyzdv[1],xyzdv[2]);
410     OT_VECTEUR_3D Suu(xyzduu[0],xyzduu[1],xyzduu[2]);
411     OT_VECTEUR_3D Suv(xyzduv[0],xyzduv[1],xyzduv[2]);
412     OT_VECTEUR_3D Svv(xyzdvv[0],xyzdvv[1],xyzdvv[2]);
413     OT_VECTEUR_3D Distance = S-Pt;
414     double a[4],b[2];
415     a[0]=Su.get_longueur2()+Distance*Suu;
416     a[1]=Su*Sv+Distance*Suv;
417     a[2]=Su*Sv+Distance*Suv;
418     a[3]=Sv.get_longueur2()+Distance*Svv;
419     b[0]=Distance*Su;b[0]=-b[0];
420     b[1]=Distance*Sv;b[1]=-b[1];
421     double deltau,deltav;
422     double denominateur_delta=(a[0]*a[3]-a[2]*a[1]);
423     if (a[0]<1E-12)
424     deltau=0;
425     else delta_u=(b[0]*a[3]-b[1]*a[1])/denominateur_delta;
426     if (a[3]<1E-12)
427     deltav=0;
428     else delta_v=(a[0]*b[1]-a[2]*b[0])/denominateur_delta;
429     /*if (fabs(denominateur_delta) < ( (fabs(a[0])+fabs(a[1])+fabs(a[2])+fabs(a[3]))*1e-12 ) )
430     return 1e300;*/
431     uvii[0]=uvi[0]+delta_u;
432     uvii[1]=uvi[1]+delta_v;
433     if (face->get_surface()->est_periodique_u()==1)
434     {
435     if(uvii[0]<0.) uvii[0]=face->get_surface()->get_periode_u()-uvii[0];
436     if(uvii[0]>face->get_surface()->get_periode_u()) uvii[0]=uvii[0]-face->get_surface()->get_periode_u();
437     }
438     if (face->get_surface()->est_periodique_v()==1)
439     {
440     if(uvii[1]<0.) uvii[0]=face->get_surface()->get_periode_v()-uvii[1];
441     if(uvii[1]>face->get_surface()->get_periode_v()) uvii[1]=uvii[1]-face->get_surface()->get_periode_v();
442     }
443     delta_u=uvii[0]-uvi[0];
444     delta_v=uvii[1]-uvi[1];
445     if (compteur>500) return 1e300;
446     }
447    
448     while ((fabs(delta_u)>precision)||(fabs(delta_v)>precision));
449     double xyz[3];
450     face->evaluer(uvii,xyz);
451     OT_VECTEUR_3D S(xyz[0],xyz[1],xyz[2]);
452     double distance=(S-Pt).get_longueur();
453     return distance;
454     }
455    
456     void TOXFEM::levelsetn(vector<MG_FACE*> *lstface,class MG_SOLUTION* solution,int numsol)
457     {
458     solution->active_solution(numsol);
459     int nbface=lstface->size();
460     if (nbface==0) return;
461     vector<TOXFEM_POINT*> lst;
462     for (int iface=0;iface<nbface;iface++)
463     {
464     MG_FACE* face=(*lstface)[iface];
465     double umin=1e300,vmin=1e300,umax=-1e300,vmax=-1e300;
466     int nbboucle=face->get_nb_mg_boucle();
467     for (int i=0;i<nbboucle;i++)
468 francois 104 {
469 francois 106 MG_BOUCLE *boucle=face->get_mg_boucle(i);
470     int nbarete=boucle->get_nb_mg_coarete();
471     for (int j=0;j<nbarete;j++)
472 francois 104 {
473 francois 106 MG_ARETE* are=boucle->get_mg_coarete(j)->get_arete();
474     double tmin=are->get_tmin();
475     double tmax=are->get_tmax();
476     for (int k=0;k<NPAS;k++)
477     {
478     double t=tmin+k*1.0/NPAS*(tmax-tmin);
479     double xyz[3],uv[2];
480     are->evaluer(t,xyz);
481     face->inverser(uv,xyz);
482     if (uv[0]>umax) umax=uv[0];
483     if (uv[1]>vmax) vmax=uv[1];
484     if (uv[0]<umin) umin=uv[0];
485     if (uv[1]<vmin) vmin=uv[1];
486     }
487     }
488 francois 104 }
489 francois 106 if (face->get_surface()->est_periodique_u())
490 francois 104 {
491 francois 106 umin=0;
492     umax=face->get_surface()->get_periode_u();
493 francois 104 }
494 francois 106 if (face->get_surface()->est_periodique_v())
495     {
496     vmin=0;
497     vmax=face->get_surface()->get_periode_v();
498     }
499     for (int i=-5;i<NPAS+5;i++)
500     for (int j=-5;j<NPAS+5;j++)
501     {
502     double uv[0];
503     uv[0]=umin+i*1.0/NPAS*(umax-umin);
504     uv[1]=vmin+j*1.0/NPAS*(vmax-vmin);
505     double xyz[3];
506     if ((face->valide_parametre_u(uv[0])) && (face->valide_parametre_u(uv[1])))
507     {
508     face->evaluer(uv,xyz);
509     TOXFEM_POINT *pt=new TOXFEM_POINT(xyz[0],xyz[1],xyz[2],face);
510     lst.push_back(pt);
511     }
512     }
513 francois 104 }
514 francois 106 calcullevelsetpremierepasse(solution,numsol,(*lstface)[0],&lst,0,lst.size());
515     calcullevelsetdeuxiemepasse(solution,numsol,&lst);
516    
517     }