ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/app/criaqoperation/src/criaqoperators.cpp
Revision: 809
Committed: Thu Jul 21 20:23:34 2016 UTC (9 years ago) by sattarpa
File size: 152040 byte(s)
Log Message:
ajouter le code "ksol_bumpnds" pour generer des data pour chaque bump (actuel et estime) pour utilizer dans K-S test.

File Contents

# User Rev Content
1 sattarpa 554 #include <stdio.h>
2     #include "mg_file.h"
3     #include "criaqoperators.h"
4 sattarpa 596 #include "tpl_grille.h"
5     #include "ot_mathematique.h"
6     #include <math.h>
7     #include "tpl_octree.h"
8 sattarpa 609 #include "fem_maillage_outils.h"
9     #include "mg_maillage_outils.h"
10 sattarpa 646 #include <sstream>
11     #include <string.h>
12 sattarpa 761 #include <stdlib.h>
13 sattarpa 554
14 sattarpa 596 CRIAQOPERATORS::CRIAQOPERATORS():MAILLEUR(false)
15 sattarpa 554 {
16     }
17 sattarpa 596 CRIAQOPERATORS::~CRIAQOPERATORS()
18 sattarpa 554 {
19     }
20 sattarpa 673
21 sattarpa 809 void CRIAQOPERATORS::ksol_bumpnds(char* magicfilename_actual,char* magicfilename_estimate,double comp_threshold,int solidact,int solidest,char* ksoloutput_act,char* ksoloutput_est,int ndmaxbumpidact,int ndmaxbumpidest,int indiv_actref)
22     {
23     MG_FILE gest1(magicfilename_actual);
24     MG_MAILLAGE* mai1=gest1.get_mg_maillageid(1);
25     MG_SOLUTION* mgsol1=gest1.get_mg_solutionid(solidact);
26     MG_FILE gest2(magicfilename_estimate);
27     MG_MAILLAGE* mai2=gest2.get_mg_maillageid(1);
28     MG_SOLUTION* mgsol2=gest2.get_mg_solutionid(solidest);
29     mgsol1->active_solution(0);
30     mgsol2->active_solution(0);
31    
32     if(indiv_actref==0)
33     {
34     MG_NOEUD* bact=mai1->get_mg_noeudid(ndmaxbumpidact);
35     TPL_MAP_ENTITE<MG_NOEUD*> ndsonactbump;
36     ndsonactbump.ajouter(bact);
37     for(int i=0;i<bact->get_lien_segment()->get_nb();i++)
38     {
39     MG_NOEUD* sgnd1=bact->get_lien_segment()->get(i)->get_noeud1();
40     MG_NOEUD* sgnd2=bact->get_lien_segment()->get(i)->get_noeud2();
41     if(sgnd1!=bact && sgnd1->get_solution()>comp_threshold)
42     ndsonactbump.ajouter(sgnd1);
43     if(sgnd2!=bact && sgnd2->get_solution()>comp_threshold)
44     ndsonactbump.ajouter(sgnd2);
45     }
46     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itndsonactbump;
47     int stoplvl=0;
48     while (ndsonactbump.get_nb()>stoplvl)
49     {
50     stoplvl=ndsonactbump.get_nb();
51     for(MG_NOEUD* nd=ndsonactbump.get_premier(itndsonactbump);nd!=NULL;nd=ndsonactbump.get_suivant(itndsonactbump))
52     {
53     for(int i=0;i<nd->get_lien_segment()->get_nb();i++)
54     {
55     MG_NOEUD* sgnd1=nd->get_lien_segment()->get(i)->get_noeud1();
56     MG_NOEUD* sgnd2=nd->get_lien_segment()->get(i)->get_noeud2();
57     if(sgnd1!=nd && sgnd1->get_solution()>comp_threshold)
58     ndsonactbump.ajouter(sgnd1);
59     if(sgnd2!=nd && sgnd2->get_solution()>comp_threshold)
60     ndsonactbump.ajouter(sgnd2);
61     }
62     }
63     }
64    
65    
66     MG_NOEUD* best=mai2->get_mg_noeudid(ndmaxbumpidest);
67     TPL_MAP_ENTITE<MG_NOEUD*> ndsonestbump;
68     ndsonestbump.ajouter(best);
69     for(int i=0;i<best->get_lien_segment()->get_nb();i++)
70     {
71     MG_NOEUD* sgnd1=best->get_lien_segment()->get(i)->get_noeud1();
72     MG_NOEUD* sgnd2=best->get_lien_segment()->get(i)->get_noeud2();
73     if(sgnd1!=best && sgnd1->get_solution()>comp_threshold)
74     ndsonestbump.ajouter(sgnd1);
75     if(sgnd2!=best && sgnd2->get_solution()>comp_threshold)
76     ndsonestbump.ajouter(sgnd2);
77     }
78     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itndsonestbump;
79     stoplvl=0;
80     while (ndsonestbump.get_nb()>stoplvl)
81     {
82     stoplvl=ndsonestbump.get_nb();
83     for(MG_NOEUD* nd=ndsonestbump.get_premier(itndsonestbump);nd!=NULL;nd=ndsonestbump.get_suivant(itndsonestbump))
84     {
85     for(int i=0;i<nd->get_lien_segment()->get_nb();i++)
86     {
87     MG_NOEUD* sgnd1=nd->get_lien_segment()->get(i)->get_noeud1();
88     MG_NOEUD* sgnd2=nd->get_lien_segment()->get(i)->get_noeud2();
89     if(sgnd1!=nd && sgnd1->get_solution()>comp_threshold)
90     ndsonestbump.ajouter(sgnd1);
91     if(sgnd2!=nd && sgnd2->get_solution()>comp_threshold)
92     ndsonestbump.ajouter(sgnd2);
93     }
94     }
95     }
96    
97     FILE* insmp5=fopen(ksoloutput_act,"wt");
98     for(MG_NOEUD* nd=ndsonactbump.get_premier(itndsonactbump);nd!=NULL;nd=ndsonactbump.get_suivant(itndsonactbump))
99     fprintf(insmp5,"%le \n",nd->get_solution());
100     fclose(insmp5);
101    
102     FILE* insmp6=fopen(ksoloutput_est,"wt");
103     for(MG_NOEUD* nd=ndsonestbump.get_premier(itndsonestbump);nd!=NULL;nd=ndsonestbump.get_suivant(itndsonestbump))
104     fprintf(insmp6,"%le \n",nd->get_solution());
105     fclose(insmp6);
106    
107     }
108     if(indiv_actref>0)
109     {
110     MG_NOEUD* bdB1=mai1->get_mg_noeudid(ndmaxbumpidact);
111     TPL_MAP_ENTITE<MG_NOEUD*> ndsonB1flatA;
112     ndsonB1flatA.ajouter(bdB1);
113     for(int i=0;i<bdB1->get_lien_segment()->get_nb();i++)
114     {
115     MG_NOEUD* sgnd1=bdB1->get_lien_segment()->get(i)->get_noeud1();
116     MG_NOEUD* sgnd2=bdB1->get_lien_segment()->get(i)->get_noeud2();
117     if(sgnd1!=bdB1 && sgnd1->get_solution()>comp_threshold)
118     ndsonB1flatA.ajouter(sgnd1);
119     if(sgnd2!=bdB1 && sgnd2->get_solution()>comp_threshold)
120     ndsonB1flatA.ajouter(sgnd2);
121     }
122     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itndsonB1flatA;
123     int stoplvl=0;
124     while (ndsonB1flatA.get_nb()>stoplvl)
125     {
126     stoplvl=ndsonB1flatA.get_nb();
127     for(MG_NOEUD* nd=ndsonB1flatA.get_premier(itndsonB1flatA);nd!=NULL;nd=ndsonB1flatA.get_suivant(itndsonB1flatA))
128     {
129     for(int i=0;i<nd->get_lien_segment()->get_nb();i++)
130     {
131     MG_NOEUD* sgnd1=nd->get_lien_segment()->get(i)->get_noeud1();
132     MG_NOEUD* sgnd2=nd->get_lien_segment()->get(i)->get_noeud2();
133     if(sgnd1!=nd && sgnd1->get_solution()>comp_threshold)
134     ndsonB1flatA.ajouter(sgnd1);
135     if(sgnd2!=nd && sgnd2->get_solution()>comp_threshold)
136     ndsonB1flatA.ajouter(sgnd2);
137     }
138     }
139     }
140    
141     FILE* insmp5=fopen(ksoloutput_act,"wt");
142     for(MG_NOEUD* nd=ndsonB1flatA.get_premier(itndsonB1flatA);nd!=NULL;nd=ndsonB1flatA.get_suivant(itndsonB1flatA))
143     fprintf(insmp5,"%le \n",nd->get_solution());
144     fclose(insmp5);
145    
146     FILE* insmp6=fopen(ksoloutput_est,"wt");
147     for(MG_NOEUD* nd=ndsonB1flatA.get_premier(itndsonB1flatA);nd!=NULL;nd=ndsonB1flatA.get_suivant(itndsonB1flatA))
148     {
149     for(int i=0;i<nd->get_lien_triangle()->get_nb();i++)
150     {
151     nd->get_lien_triangle()->get(i)->change_origine(MAGIC::ORIGINE::IMPOSE);
152     }
153     MG_NOEUD* nd2=mai2->get_mg_noeudid((nd->get_id()));
154     fprintf(insmp6,"%le \n",nd2->get_solution());
155     }
156     fclose(insmp6);
157     }
158    
159    
160     }
161    
162    
163    
164     void CRIAQOPERATORS::gmsh_magic_corres(int femmeshno,char* magicfilename,char* correstxtfilename)
165     {/*
166     MG_FILE gest(magicfilename);
167     FEM_MAILLAGE* femmai;
168     if (femmeshno==0) femmai=gest.get_fem_maillage(femmeshno); else femmai=gest.get_fem_maillageid(femmeshno);
169    
170     FILE* in1=fopen(correstxtfilename,"wt");
171     LISTE_FEM_NOEUD::iterator itnod;
172     unsigned long firstno=femai->get_premier_noeud(itnod)->get_id();
173    
174     cout<<"mai->get_nb_mg_noeud()="<<femai->get_nb_fem_noeud()<<endl;
175     for (FEM_NOEUD* nod=femai->get_premier_noeud(itnod);nod!=NULL;nod=femai->get_suivant_noeud(itnod))
176     {
177     nod->get_numero_opt();
178     nod->get_mg_element_maillage()->change_nouveau_numero(counter1);
179     fprintf(in1,"%19d%32.9le%16.9le%8d\n",nod->get_mg_element_maillage()->get_nouveau_numero(), nod->get_x(),nod->get_y(),nod->get_mg_element_maillage()->get_nouveau_numero());
180     }
181    
182     LISTE_FEM_NOEUD::iterator it;
183     for (FEM_NOEUD* noeud=mai->get_premier_noeud(it);noeud;noeud=mai->get_suivant_noeud(it)) //sasan
184     {
185     if (noeud->get_numero_opt()!=-1) numopt=true;
186     if (numopt)
187     {
188     f << "NO-" << noeud->get_numero() << " " << noeud->get_numero_opt() << " " << noeud->get_id() << std::endl;;
189     }*/
190    
191     }
192    
193 sattarpa 673 void CRIAQOPERATORS::bumparea_calcul(char* magicfilename,int nummai,int mgsolid,double tolerance,char* areamagicfilename,int defnodid)
194     {
195     MG_FILE gest(magicfilename);
196     MG_MAILLAGE* mai;
197     if (nummai==0) mai=gest.get_mg_maillage(nummai); else mai=gest.get_mg_maillageid(nummai);
198 sattarpa 695
199 sattarpa 673 MG_SOLUTION* mgsol=gest.get_mg_solutionid(mgsolid);
200     mgsol->active_solution(0);
201     MG_NOEUD* defnd;
202     LISTE_MG_NOEUD::iterator itnd;
203     for(MG_NOEUD* nd=mai->get_premier_noeud(itnd);nd!=NULL;nd=mai->get_suivant_noeud(itnd))
204     {
205     if (nd->get_id()==defnodid)
206     defnd=nd;
207     }
208 sattarpa 761 //cout<<defnd->get_solution()<<endl;
209 sattarpa 673 double max_dist=defnd->get_solution();
210     TPL_MAP_ENTITE<MG_TRIANGLE*> areatris;
211     for (int i=0;i<defnd->get_lien_triangle()->get_nb();i++)
212     {
213     MG_TRIANGLE* trii=defnd->get_lien_triangle()->get(i);
214 sattarpa 695 double avdis=(trii->get_noeud1()->get_solution()+trii->get_noeud2()->get_solution()+trii->get_noeud3()->get_solution())/3.;
215     if (avdis>tolerance)
216     areatris.ajouter(trii);
217 sattarpa 673 }
218     int stoplvl=0;
219     while (areatris.get_nb()>stoplvl)
220     {
221     stoplvl=areatris.get_nb();
222     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR itareatris;
223     for(MG_TRIANGLE* trii=areatris.get_premier(itareatris);trii!=NULL;trii=areatris.get_suivant(itareatris))
224     {
225     for(int i=0;i<trii->get_segment1()->get_lien_triangle()->get_nb();i++)
226     {
227     MG_TRIANGLE* trineib=trii->get_segment1()->get_lien_triangle()->get(i);
228     double avdis=(trineib->get_noeud1()->get_solution()+trineib->get_noeud2()->get_solution()+trineib->get_noeud3()->get_solution())/3.;
229     if (avdis>tolerance)
230     areatris.ajouter(trineib);
231     }
232     for(int i=0;i<trii->get_segment2()->get_lien_triangle()->get_nb();i++)
233     {
234     MG_TRIANGLE* trineib=trii->get_segment2()->get_lien_triangle()->get(i);
235     double avdis=(trineib->get_noeud1()->get_solution()+trineib->get_noeud2()->get_solution()+trineib->get_noeud3()->get_solution())/3.;
236     if (avdis>tolerance)
237     areatris.ajouter(trineib);
238     }
239     for(int i=0;i<trii->get_segment3()->get_lien_triangle()->get_nb();i++)
240     {
241     MG_TRIANGLE* trineib=trii->get_segment3()->get_lien_triangle()->get(i);
242     double avdis=(trineib->get_noeud1()->get_solution()+trineib->get_noeud2()->get_solution()+trineib->get_noeud3()->get_solution())/3.;
243     if (avdis>tolerance)
244     areatris.ajouter(trineib);
245     }
246     }
247     }
248     double area=0.;
249 sattarpa 761 multimap<double,MG_NOEUD*,std::greater<double> > maxamplitude;
250 sattarpa 673 TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR itareatris;
251     for(MG_TRIANGLE* tri=areatris.get_premier(itareatris);tri!=NULL;tri=areatris.get_suivant(itareatris))
252     {
253 sattarpa 761 maxamplitude.insert(pair<double,MG_NOEUD*> (tri->get_noeud1()->get_solution(),tri->get_noeud1()));
254     maxamplitude.insert(pair<double,MG_NOEUD*> (tri->get_noeud2()->get_solution(),tri->get_noeud2()));
255     maxamplitude.insert(pair<double,MG_NOEUD*> (tri->get_noeud3()->get_solution(),tri->get_noeud3()));
256 sattarpa 673 OT_VECTEUR_3D v1(tri->get_noeud1()->get_coord(),tri->get_noeud2()->get_coord());
257     OT_VECTEUR_3D v2(tri->get_noeud1()->get_coord(),tri->get_noeud3()->get_coord());
258     OT_VECTEUR_3D area1=v1&v2;
259     double area2=0.5*area1.get_longueur();
260     area=area+area2;
261     }
262     cout<<"area= "<<area<<endl;
263 sattarpa 761 multimap<double,MG_NOEUD*,std::greater<double> >::iterator itmaxamplitude=maxamplitude.begin();
264     cout<<"maxamplitude= "<< (*itmaxamplitude).first<<endl;
265 sattarpa 673
266     MG_MAILLAGE* mai1;
267     if (nummai==0) mai1=gest.get_mg_maillage(nummai); else mai1=gest.get_mg_maillageid(nummai);
268     TPL_MAP_ENTITE<MG_TRIANGLE*> deltris;
269     LISTE_MG_TRIANGLE::iterator ittri;
270     for (MG_TRIANGLE* tri=mai1->get_premier_triangle(ittri);tri!=NULL;tri=mai1->get_suivant_triangle(ittri))
271     {
272 sattarpa 695 //int triexist=0;
273 sattarpa 673 for(MG_TRIANGLE* triarea=areatris.get_premier(itareatris);triarea!=NULL;triarea=areatris.get_suivant(itareatris))
274     {
275     if (triarea==tri)
276 francois 791 tri->change_origine(MAGIC::ORIGINE::IMPOSE);
277 sattarpa 695 //triexist++;
278 sattarpa 673 }
279 sattarpa 695 //if (triexist<1)
280     //deltris.ajouter(tri);
281 sattarpa 673 }
282 sattarpa 695 /* for(MG_TRIANGLE* tridel=deltris.get_premier(itareatris);tridel!=NULL;tridel=deltris.get_suivant(itareatris))
283 sattarpa 673 {
284 sattarpa 695 tridel->change_origine(IMPOSE);
285     //mai1->supprimer_mg_triangleid(tridel->get_id());
286     }*/
287 sattarpa 673
288     gest.ajouter_mg_maillage(mai1);
289     gest.enregistrer(areamagicfilename);
290     }
291 sattarpa 662 void CRIAQOPERATORS::samplepoints_compare(char* samplepoints1,char* samplepoints2,char* sortedsmplpnts)
292     {
293     std::vector<double*> lstsamplepoints1;
294     FILE *in1=fopen(samplepoints1,"rt");
295     if (in1==NULL) affiche((char*) "file is not available");
296     while(!feof(in1))
297     {
298     char chaine[500];
299     char* res=fgets(chaine,500,in1);
300     if(res!=NULL)
301     {
302     double x,y,z;
303     double q1,q2,q3;
304     double* pcoordbc=new double[6];
305     int nb=sscanf(chaine,"%le %le %le %le %le %le",&x,&y,&z,&q1,&q2,&q3);
306     if (nb!=-1 && nb!=6) cout<<"Wrong file format"<<endl;
307     else if(nb==6)
308     {
309     pcoordbc[0]=x; pcoordbc[1]=y; pcoordbc[2]=z; pcoordbc[3]=q1; pcoordbc[4]=q2; pcoordbc[5]=q3;
310     lstsamplepoints1.push_back(pcoordbc);
311     }
312     }
313     }
314     fclose(in1);
315     std::vector<double*> lstsamplepoints2;
316     FILE *in2=fopen(samplepoints2,"rt");
317     if (in2==NULL) affiche((char*) "file is not available");
318     while(!feof(in2))
319     {
320     char chaine[500];
321     char* res=fgets(chaine,500,in2);
322     if(res!=NULL)
323     {
324     double x,y,z;
325     double q1,q2,q3;
326     double* pcoordbc=new double[6];
327     int nb=sscanf(chaine,"%le %le %le %le %le %le",&x,&y,&z,&q1,&q2,&q3);
328     if (nb!=-1 && nb!=6) cout<<"Wrong file format"<<endl;
329     else if(nb==6)
330     {
331     pcoordbc[0]=x; pcoordbc[1]=y; pcoordbc[2]=z; pcoordbc[3]=q1; pcoordbc[4]=q2; pcoordbc[5]=q3;
332     lstsamplepoints2.push_back(pcoordbc);
333     }
334     }
335     }
336     fclose(in2);
337     cout<<lstsamplepoints1.size()<<endl;
338     cout<<lstsamplepoints2.size()<<endl;
339    
340     std::vector<double*> lstsortedsmplpnts;
341     for(std::vector<double*>::iterator itlstsamplepoints1=lstsamplepoints1.begin();itlstsamplepoints1!=lstsamplepoints1.end();itlstsamplepoints1++)
342     {
343     double* pcoordbc=new double[7];
344     int countsmpcomp=0;
345     double* xyzsmp1=(*itlstsamplepoints1);
346     for(std::vector<double*>::iterator itlstsamplepoints2=lstsamplepoints2.begin();itlstsamplepoints2!=lstsamplepoints2.end();itlstsamplepoints2++)
347     {
348     double* xyzsmp2=(*itlstsamplepoints2);
349     if(xyzsmp1[0]==xyzsmp2[0] && xyzsmp1[1]==xyzsmp2[1] && xyzsmp1[2]==xyzsmp2[2] && xyzsmp1[3]==xyzsmp2[3] && xyzsmp1[4]==xyzsmp2[4] && xyzsmp1[5]==xyzsmp2[5])
350     countsmpcomp++;
351     }
352     if(countsmpcomp==0)
353     {
354     pcoordbc[0]=0; pcoordbc[1]=xyzsmp1[0]; pcoordbc[2]=xyzsmp1[1]; pcoordbc[3]=xyzsmp1[2]; pcoordbc[4]=xyzsmp1[3]; pcoordbc[5]=xyzsmp1[4]; pcoordbc[6]=xyzsmp1[5];
355     lstsortedsmplpnts.push_back(pcoordbc);
356     }
357     else if (countsmpcomp>0)
358     {
359     pcoordbc[0]=1; pcoordbc[1]=xyzsmp1[0]; pcoordbc[2]=xyzsmp1[1]; pcoordbc[3]=xyzsmp1[2]; pcoordbc[4]=xyzsmp1[3]; pcoordbc[5]=xyzsmp1[4]; pcoordbc[6]=xyzsmp1[5];
360     lstsortedsmplpnts.push_back(pcoordbc);
361     }
362    
363    
364     }
365     cout<<lstsortedsmplpnts.size()<<endl;
366    
367    
368     FILE* insmp=fopen(sortedsmplpnts,"wt");
369     for(std::vector<double*>::iterator itlstsortedsmplpnts=lstsortedsmplpnts.begin();itlstsortedsmplpnts!=lstsortedsmplpnts.end();itlstsortedsmplpnts++)
370     {
371     double* xyzsmpsort=(*itlstsortedsmplpnts);
372     //cout<<xyzsmpsort[0]<<" "<<xyzsmpsort[1]<<endl;
373     fprintf(insmp,"%le %le %le %le %le %le %le \n",xyzsmpsort[0],xyzsmpsort[1],xyzsmpsort[2],xyzsmpsort[3],xyzsmpsort[4],xyzsmpsort[5],xyzsmpsort[6]);
374     }
375     fclose(insmp);
376    
377     }
378    
379 sattarpa 695 void CRIAQOPERATORS::meshdistance_compare(char* referencemagicfilename,int refmeshno,char* comparemagicfilename,int compmeshno,char* outputcomparefile,char* solfilename)
380 sattarpa 554 {
381 sattarpa 596 MG_FILE refgest(referencemagicfilename);
382     MG_MAILLAGE* refmgmai;
383 sattarpa 600 if (refmeshno==0) refmgmai=refgest.get_mg_maillage(refmeshno); else refmgmai=refgest.get_mg_maillageid(refmeshno);
384 sattarpa 596 MG_FILE compgest(comparemagicfilename);
385     MG_MAILLAGE* compmgmai;
386 sattarpa 600 if (compmeshno==0) compmgmai=compgest.get_mg_maillage(compmeshno); else compmgmai=compgest.get_mg_maillageid(compmeshno);
387 sattarpa 658
388     //octree initialization
389 sattarpa 596 double xmin=1e308,ymin=1e308,zmin=1e308,xmax=-1e308,ymax=-1e308,zmax=-1e308;
390     TPL_MAP_ENTITE<MG_NOEUD*> lstnoeud;
391     LISTE_MG_NOEUD::iterator it;
392     for (MG_NOEUD* no=refmgmai->get_premier_noeud(it);no!=NULL;no=refmgmai->get_suivant_noeud(it))
393     {
394     if (no->get_x()<xmin) xmin=no->get_x();
395     if (no->get_y()<ymin) ymin=no->get_y();
396     if (no->get_z()<zmin) zmin=no->get_z();
397     if (no->get_x()>xmax) xmax=no->get_x();
398     if (no->get_y()>ymax) ymax=no->get_y();
399     if (no->get_z()>zmax) zmax=no->get_z();
400     }
401     for (MG_NOEUD* no=compmgmai->get_premier_noeud(it);no!=NULL;no=compmgmai->get_suivant_noeud(it))
402     {
403     if (no->get_x()<xmin) xmin=no->get_x();
404     if (no->get_y()<ymin) ymin=no->get_y();
405     if (no->get_z()<zmin) zmin=no->get_z();
406     if (no->get_x()>xmax) xmax=no->get_x();
407     if (no->get_y()>ymax) ymax=no->get_y();
408     if (no->get_z()>zmax) zmax=no->get_z();
409     lstnoeud.ajouter(no);
410     }
411     OT_VECTEUR_3D vecmin(xmin,ymin,zmin);OT_VECTEUR_3D vecmmax(xmax,ymax,zmax);
412     OT_VECTEUR_3D vec(vecmmax,vecmin);
413    
414     //double search_radius=0.001*(vec.get_longueur());
415     double search_radius=3.;
416     OT_VECTEUR_3D min(xmin,ymin,zmin); OT_VECTEUR_3D max(xmax,ymax,zmax); OT_VECTEUR_3D average=(min+max)/2.; OT_VECTEUR_3D lengthvec(min,max);
417     double length=sqrt(lengthvec*lengthvec); double bxr=1.1;
418     xmin=average.get_x()-(length*bxr);ymin=average.get_y()-(length*bxr);zmin=average.get_z()-(length*bxr);
419     xmax=average.get_x()+(length*bxr);ymax=average.get_y()+(length*bxr);zmax=average.get_z()+(length*bxr);
420    
421     TPL_OCTREE<MG_NOEUD*,MG_NOEUD*> octree;
422     octree.initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
423     for (MG_NOEUD* no=compmgmai->get_premier_noeud(it);no!=NULL;no=compmgmai->get_suivant_noeud(it))
424     octree.inserer(no);
425    
426 sattarpa 695 MG_SOLUTION* mgsol=new MG_SOLUTION(refmgmai,1,solfilename,1,(char*)"Normaldistance",MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD,MAGIC::TYPE_SOLUTION::SCALAIRE);
427 sattarpa 596 refgest.ajouter_mg_solution(mgsol);
428     mgsol->change_legende(0,"Normaldistance");
429     int i=0;
430     for (MG_NOEUD* nop=refmgmai->get_premier_noeud(it);nop!=NULL;nop=refmgmai->get_suivant_noeud(it))
431     {
432     TPL_MAP_ENTITE<MG_NOEUD*> lstneiclose;
433     int neindnb=lstneiclose.get_nb();
434     while(neindnb==0)
435     {
436     octree.rechercher(nop->get_x(),nop->get_y(),nop->get_z(),search_radius,lstneiclose);
437     neindnb=lstneiclose.get_nb();
438     }
439     map<double,MG_NOEUD*,std::less<double> > lstdist;
440     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itnop;
441     for(MG_NOEUD* no=lstneiclose.get_premier(itnop);no!=NULL;no=lstneiclose.get_suivant(itnop))
442     {
443     OT_VECTEUR_3D w_n_tot(0.,0.,0.);
444     double norme_w_n_tot=0.;
445     OT_VECTEUR_3D w2_n_tot(0.,0.,0.);
446     double norme_w2_n_tot=0.;
447 sattarpa 761 //int nbtri=nop->get_lien_triangle()->get_nb();//put sol on cad model
448 sattarpa 679 int nbtri=no->get_lien_triangle()->get_nb();
449 sattarpa 596 for (int i=0;i<nbtri;i++)
450     {
451 sattarpa 761 //MG_TRIANGLE* tri=(MG_TRIANGLE*)nop->get_lien_triangle()->get(i);//put sol on cad model
452 sattarpa 679 MG_TRIANGLE* tri=(MG_TRIANGLE*)no->get_lien_triangle()->get(i);
453 sattarpa 596 double *xyzn1=tri->get_noeud1()->get_coord();
454     double *xyzn2=tri->get_noeud2()->get_coord();
455     double *xyzn3=tri->get_noeud3()->get_coord();
456    
457     OT_VECTEUR_3D vec1(xyzn1,xyzn3);
458     OT_VECTEUR_3D vec2(xyzn1,xyzn2);
459     OT_VECTEUR_3D n_tri=vec1&vec2; // Normale au triangle
460    
461     double w=n_tri.get_longueur(); // 2 fois l'aire du triangle (pour éviter une division par 2)
462     n_tri.norme();
463     OT_VECTEUR_3D w_n=w*n_tri;
464     double norme_w_n=w_n.get_longueur();
465     w_n_tot=w_n_tot+w_n;
466     norme_w_n_tot=norme_w_n_tot+norme_w_n;
467     }
468    
469     OT_VECTEUR_3D n=w_n_tot/norme_w_n_tot; // Normale à la surface au noeud
470     n.norme();
471     OT_VECTEUR_3D distvec(nop->get_coord(),no->get_coord());
472     double normaldistance=distvec*n;
473     double normaldistanceabs=fabs(normaldistance);
474     //cout<<"normaldistanceabs= "<<normaldistanceabs<<endl;
475     lstdist.insert(pair<double,MG_NOEUD*>(normaldistanceabs,nop));
476     }
477     map<double,MG_NOEUD*,std::less<double> >::iterator itlstdist=lstdist.begin();
478     double distnsclos=(*itlstdist).first;
479     MG_NOEUD* nodcls=(*itlstdist).second;
480     mgsol->ecrire(distnsclos,i,0,0);
481     i++;
482 sattarpa 554 }
483 sattarpa 596 refgest.enregistrer(outputcomparefile);
484     }
485 sattarpa 761 void CRIAQOPERATORS::deformed_correspond_mgmaiadd(char* magicfilename,int meshno,int numsol1,int numsol2,int numsol3,int numchamp1,int numchamp2,int numchamp3,double coef,char* correspondfilename)
486 sattarpa 609 {
487     MG_FILE gest(magicfilename);
488     FEM_MAILLAGE* femmai;
489     if (meshno==0) femmai=gest.get_fem_maillage(meshno); else femmai=gest.get_fem_maillageid(meshno);
490     FEM_SOLUTION* sol1=gest.get_fem_solutionid(numsol1);
491     FEM_SOLUTION* sol2=gest.get_fem_solutionid(numsol2);
492     FEM_SOLUTION* sol3=gest.get_fem_solutionid(numsol3);
493     femmai->calcul_deforme(sol1,numchamp1,sol2,numchamp2,sol3,numchamp3);
494     if (coef>1e-16)
495     {
496     cout<<" Création du maillage deforme avec correspondence text file"<<endl;
497     MG_MAILLAGE* defmgmai=new MG_MAILLAGE(gest.get_mg_geometrie(0));
498     gest.ajouter_mg_maillage(defmgmai);
499     {
500     if (femmai->get_degre()==1)
501     {
502     //gest=femmai->get_mg_maillage()->get_gestionnaire();
503     //gest->ajouter_mg_maillage(this);
504     std::vector<unsigned long*> lstcores;//sasan
505     LISTE_FEM_NOEUD::iterator it;
506     for (FEM_NOEUD* no=femmai->get_premier_noeud(it);no!=NULL;no=femmai->get_suivant_noeud(it))
507     {
508     double x=no->get_x(coef);
509     double y=no->get_y(coef);
510     double z=no->get_z(coef);
511 francois 791 MG_NOEUD *newno=new MG_NOEUD(no->get_lien_topologie(),x,y,z,MAGIC::ORIGINE::DEFORME);
512 sattarpa 609 defmgmai->ajouter_mg_noeud(newno);
513     no->change_numero(newno->get_id());
514     unsigned long* correscad_defcad=new unsigned long[2];//sasan
515     correscad_defcad[0]=no->get_mg_element_maillage()->get_id();//sasan
516     correscad_defcad[1]=newno->get_id();//sasan
517     lstcores.push_back(correscad_defcad);//sasan
518     }
519     //sasan
520 sattarpa 761 FILE* in1=fopen(correspondfilename,"wt");
521 sattarpa 659 fprintf(in1,"MG_MAILLAGE No. : deformed_MAILLAGE No.\n");
522 sattarpa 609 fprintf(in1,"%lu %lu\n",femmai->get_mg_maillage()->get_id(),defmgmai->get_id());
523     for(std::vector<unsigned long*>::iterator itlstpinsert=lstcores.begin();itlstpinsert!=lstcores.end();itlstpinsert++)
524     {
525     unsigned long* xyzpins1;
526     xyzpins1=(*itlstpinsert);
527     //cout<<" xyzpins1[0]= "<<xyzpins1[0]<<" xyzpins1[1]= "<<xyzpins1[1]<<endl;
528     fprintf(in1,"%lu %lu\n",xyzpins1[0],xyzpins1[1]);
529     }
530     fclose(in1);
531     //sasan till
532     LISTE_FEM_ELEMENT1::iterator it1;
533     for (FEM_ELEMENT1 *ele=femmai->get_premier_element1(it1);ele!=NULL;ele=femmai->get_suivant_element1(it1))
534     {
535     MG_NOEUD* no1=defmgmai->get_mg_noeudid(ele->get_fem_noeud(0)->get_numero());
536     MG_NOEUD* no2=defmgmai->get_mg_noeudid(ele->get_fem_noeud(1)->get_numero());
537 francois 791 MG_SEGMENT *seg=new MG_SEGMENT(ele->get_lien_topologie(),no1,no2,MAGIC::ORIGINE::DEFORME);
538 sattarpa 609 defmgmai->ajouter_mg_segment(seg);
539     }
540     LISTE_FEM_ELEMENT2::iterator it2;
541     for (FEM_ELEMENT2 *ele=femmai->get_premier_element2(it2);ele!=NULL;ele=femmai->get_suivant_element2(it2))
542     {
543     if (ele->get_nb_fem_noeud()==3)
544     {
545     MG_NOEUD* no1=defmgmai->get_mg_noeudid(ele->get_fem_noeud(0)->get_numero());
546     MG_NOEUD* no2=defmgmai->get_mg_noeudid(ele->get_fem_noeud(1)->get_numero());
547     MG_NOEUD* no3=defmgmai->get_mg_noeudid(ele->get_fem_noeud(2)->get_numero());
548 francois 791 defmgmai->ajouter_mg_triangle(ele->get_lien_topologie(),no1,no2,no3,MAGIC::ORIGINE::DEFORME);
549 sattarpa 609 }
550     if (ele->get_nb_fem_noeud()==4)
551     {
552     MG_NOEUD* no1=defmgmai->get_mg_noeudid(ele->get_fem_noeud(0)->get_numero());
553     MG_NOEUD* no2=defmgmai->get_mg_noeudid(ele->get_fem_noeud(1)->get_numero());
554     MG_NOEUD* no3=defmgmai->get_mg_noeudid(ele->get_fem_noeud(2)->get_numero());
555     MG_NOEUD* no4=defmgmai->get_mg_noeudid(ele->get_fem_noeud(3)->get_numero());
556 francois 791 defmgmai->ajouter_mg_quadrangle(ele->get_lien_topologie(),no1,no2,no3,no4,MAGIC::ORIGINE::DEFORME);
557 sattarpa 609 }
558     }
559     LISTE_FEM_ELEMENT3::iterator it3;
560     for (FEM_ELEMENT3 *ele=femmai->get_premier_element3(it3);ele!=NULL;ele=femmai->get_suivant_element3(it3))
561     {
562     if (ele->get_nb_fem_noeud()==4)
563     {
564     MG_NOEUD* no1=defmgmai->get_mg_noeudid(ele->get_fem_noeud(0)->get_numero());
565     MG_NOEUD* no2=defmgmai->get_mg_noeudid(ele->get_fem_noeud(1)->get_numero());
566     MG_NOEUD* no3=defmgmai->get_mg_noeudid(ele->get_fem_noeud(2)->get_numero());
567     MG_NOEUD* no4=defmgmai->get_mg_noeudid(ele->get_fem_noeud(3)->get_numero());
568 francois 791 defmgmai->ajouter_mg_tetra(ele->get_lien_topologie(),no1,no2,no3,no4,MAGIC::ORIGINE::DEFORME);
569 sattarpa 609 }
570     if (ele->get_nb_fem_noeud()==8)
571     {
572     MG_NOEUD* no1=defmgmai->get_mg_noeudid(ele->get_fem_noeud(0)->get_numero());
573     MG_NOEUD* no2=defmgmai->get_mg_noeudid(ele->get_fem_noeud(1)->get_numero());
574     MG_NOEUD* no3=defmgmai->get_mg_noeudid(ele->get_fem_noeud(2)->get_numero());
575     MG_NOEUD* no4=defmgmai->get_mg_noeudid(ele->get_fem_noeud(3)->get_numero());
576     MG_NOEUD* no5=defmgmai->get_mg_noeudid(ele->get_fem_noeud(4)->get_numero());
577     MG_NOEUD* no6=defmgmai->get_mg_noeudid(ele->get_fem_noeud(5)->get_numero());
578     MG_NOEUD* no7=defmgmai->get_mg_noeudid(ele->get_fem_noeud(6)->get_numero());
579     MG_NOEUD* no8=defmgmai->get_mg_noeudid(ele->get_fem_noeud(7)->get_numero());
580 francois 791 defmgmai->ajouter_mg_hexa(ele->get_lien_topologie(),no1,no2,no3,no4,no5,no6,no7,no8,MAGIC::ORIGINE::DEFORME);
581 sattarpa 609 }
582     }
583    
584     }
585     }
586     }
587     cout<<" Enregistrement"<<endl;
588     gest.enregistrer(magicfilename);
589     }
590 sattarpa 650 void CRIAQOPERATORS::curvtur_crit_remvsmp(char* magicfilename,char* correspondfilename,char* gnifinspointfile,char* out_gnifinspointfile_removondefect,double search_radius,double curvdif_coef,int gmsh_affiche,double relet_search_rad,int relet_curvature)
591 sattarpa 609 {
592     MG_FILE gest(magicfilename);
593     map<unsigned long, unsigned long> coresspondndidlst;
594     FILE* in1=fopen(correspondfilename,"rt");
595     if (in1==NULL) cout<<"correspondfile is not available"<<endl;
596     char mess[500];
597     char *res=fgets(mess,500,in1);
598 sattarpa 655 if(feof(in1))
599     cout<<"correspondfile has not been well written"<<endl;
600 sattarpa 609 res=fgets(mess,500,in1);
601 sattarpa 655 if(feof(in1))
602     cout<<"correspondfile has not been well written"<<endl;
603 sattarpa 609 int cadmeshno;
604     int defcadmeshno;
605 sattarpa 659 int nb1=sscanf(mess,"%d %d",&cadmeshno,&defcadmeshno);
606 sattarpa 609 while (!feof(in1))
607     {
608     char chaine[500];
609 sattarpa 655 res=fgets(chaine,500,in1);
610     if(res!=NULL)
611     {
612 sattarpa 609 unsigned long cadndid;
613     unsigned long defcadndid;
614     int nb=sscanf(chaine,"%lu %lu",&cadndid,&defcadndid);
615     if (nb!=-1 && nb!=2) cout<<"Wrong file format"<<endl;
616     else if (nb==2)
617     {
618     coresspondndidlst.insert(pair<unsigned long, unsigned long> (defcadndid,cadndid) );
619     }
620 sattarpa 655 }
621 sattarpa 609 }
622     fclose(in1);
623 sattarpa 650
624     cout<<"cadmeshno= "<<cadmeshno<<" defcadmeshno= "<<defcadmeshno<<endl;
625 sattarpa 609 MG_MAILLAGE* cadmgmai;
626     if (cadmeshno==0) cadmgmai=gest.get_mg_maillage(cadmeshno); else cadmgmai=gest.get_mg_maillageid(cadmeshno);
627     MG_MAILLAGE* defcadmgmai;
628     if (defcadmeshno==0) defcadmgmai=gest.get_mg_maillage(defcadmeshno); else defcadmgmai=gest.get_mg_maillageid(defcadmeshno);
629 sattarpa 650
630     cout<<"octree initialization "<<endl;
631     //CAD octree initialization
632     LISTE_MG_NOEUD::iterator itcadndcurv;
633     double xmincad=1e308,ymincad=1e308,zmincad=1e308,xmaxcad=-1e308,ymaxcad=-1e308,zmaxcad=-1e308;
634     TPL_MAP_ENTITE<MG_NOEUD*> lstcadnoeud;
635     for(MG_NOEUD* cadndcurv=cadmgmai->get_premier_noeud(itcadndcurv);cadndcurv!=NULL;cadndcurv=cadmgmai->get_suivant_noeud(itcadndcurv))
636     {
637     if (cadndcurv->get_x()<xmincad) xmincad=cadndcurv->get_x();
638     if (cadndcurv->get_y()<ymincad) ymincad=cadndcurv->get_y();
639     if (cadndcurv->get_z()<zmincad) zmincad=cadndcurv->get_z();
640     if (cadndcurv->get_x()>xmaxcad) xmaxcad=cadndcurv->get_x();
641     if (cadndcurv->get_y()>ymaxcad) ymaxcad=cadndcurv->get_y();
642     if (cadndcurv->get_z()>zmaxcad) zmaxcad=cadndcurv->get_z();
643     lstcadnoeud.ajouter(cadndcurv);
644     }
645     OT_VECTEUR_3D vecmincad(xmincad,ymincad,zmincad);
646     OT_VECTEUR_3D vecmmaxcad(xmaxcad,ymaxcad,zmaxcad);
647     OT_VECTEUR_3D vecad(vecmmaxcad,vecmincad);
648     OT_VECTEUR_3D mincad(xmincad,ymincad,zmincad); OT_VECTEUR_3D maxcad(xmaxcad,ymaxcad,zmaxcad); OT_VECTEUR_3D averagecad=(mincad+maxcad)/2.; OT_VECTEUR_3D lengthvecad(mincad,maxcad);
649     double lengthcad=sqrt(lengthvecad*lengthvecad); double bxrcad=1.1;
650     xmincad=averagecad.get_x()-(lengthcad*bxrcad);ymincad=averagecad.get_y()-(lengthcad*bxrcad);zmincad=averagecad.get_z()-(lengthcad*bxrcad);
651     xmaxcad=averagecad.get_x()+(lengthcad*bxrcad);ymaxcad=averagecad.get_y()+(lengthcad*bxrcad);zmaxcad=averagecad.get_z()+(lengthcad*bxrcad);
652     TPL_OCTREE<MG_NOEUD*,MG_NOEUD*> octreecad;
653     octreecad.initialiser(&lstcadnoeud,1,xmincad,ymincad,zmincad,xmaxcad,ymaxcad,zmaxcad);
654     for(MG_NOEUD* cadndcurv=cadmgmai->get_premier_noeud(itcadndcurv);cadndcurv!=NULL;cadndcurv=cadmgmai->get_suivant_noeud(itcadndcurv))
655     octreecad.inserer(cadndcurv);
656     //deformed_CAD octree initialization
657     LISTE_MG_NOEUD::iterator itdefcadndcurv;
658     double xmindefcad=1e308,ymindefcad=1e308,zmindefcad=1e308,xmaxdefcad=-1e308,ymaxdefcad=-1e308,zmaxdefcad=-1e308;
659     TPL_MAP_ENTITE<MG_NOEUD*> lstdefcadnoeud;
660     for(MG_NOEUD* defcadndcurv=defcadmgmai->get_premier_noeud(itdefcadndcurv);defcadndcurv!=NULL;defcadndcurv=defcadmgmai->get_suivant_noeud(itdefcadndcurv))
661     {
662     if (defcadndcurv->get_x()<xmindefcad) xmindefcad=defcadndcurv->get_x();
663     if (defcadndcurv->get_y()<ymindefcad) ymindefcad=defcadndcurv->get_y();
664     if (defcadndcurv->get_z()<zmindefcad) zmindefcad=defcadndcurv->get_z();
665     if (defcadndcurv->get_x()>xmaxdefcad) xmaxdefcad=defcadndcurv->get_x();
666     if (defcadndcurv->get_y()>ymaxdefcad) ymaxdefcad=defcadndcurv->get_y();
667     if (defcadndcurv->get_z()>zmaxdefcad) zmaxdefcad=defcadndcurv->get_z();
668     lstdefcadnoeud.ajouter(defcadndcurv);
669     }
670     OT_VECTEUR_3D vecmindefcad(xmindefcad,ymindefcad,zmindefcad);OT_VECTEUR_3D vecmmaxdefcad(xmaxdefcad,ymaxdefcad,zmaxdefcad);
671     OT_VECTEUR_3D vecdefcad(vecmmaxdefcad,vecmindefcad);
672     OT_VECTEUR_3D mindefcad(xmindefcad,ymindefcad,zmindefcad); OT_VECTEUR_3D maxdefcad(xmaxdefcad,ymaxdefcad,zmaxdefcad); OT_VECTEUR_3D averagedefcad=(mindefcad+maxdefcad)/2.; OT_VECTEUR_3D lengthvecdefcad(mindefcad,maxdefcad);
673     double lengthdefcad=sqrt(lengthvecdefcad*lengthvecdefcad); double bxrdefcad=1.1;
674     xmindefcad=averagedefcad.get_x()-(lengthdefcad*bxrdefcad);ymindefcad=averagedefcad.get_y()-(lengthdefcad*bxrdefcad);zmindefcad=averagedefcad.get_z()-(lengthdefcad*bxrdefcad);
675     xmaxdefcad=averagedefcad.get_x()+(lengthdefcad*bxrdefcad);ymaxdefcad=averagedefcad.get_y()+(lengthdefcad*bxrdefcad);zmaxdefcad=averagedefcad.get_z()+(lengthdefcad*bxrdefcad);
676     TPL_OCTREE<MG_NOEUD*,MG_NOEUD*> octreedefcad;
677     octreedefcad.initialiser(&lstdefcadnoeud,1,xmindefcad,ymindefcad,zmindefcad,xmaxdefcad,ymaxdefcad,zmaxdefcad);
678     for(MG_NOEUD* defcadndcurv=defcadmgmai->get_premier_noeud(itdefcadndcurv);defcadndcurv!=NULL;defcadndcurv=defcadmgmai->get_suivant_noeud(itdefcadndcurv))
679     octreedefcad.inserer(defcadndcurv);
680    
681 sattarpa 609 multimap<double,MG_NOEUD*,std::greater<double> > lstkmin_cadmgmai;
682     multimap<double,MG_NOEUD*,std::greater<double> > lstkmax_cadmgmai;
683 sattarpa 646 multimap<double,MG_NOEUD*,std::greater<double> > lstkgau_cadmgmai;
684 sattarpa 609 multimap<double,MG_NOEUD*,std::greater<double> > lstkmin_defcadmgmai;
685     multimap<double,MG_NOEUD*,std::greater<double> > lstkmax_defcadmgmai;
686 sattarpa 646 multimap<double,MG_NOEUD*,std::greater<double> > lstkgau_defcadmgmai;
687 sattarpa 650 map<MG_NOEUD*,double > lstkmin_cad;
688     map<MG_NOEUD*,double > lstkmax_cad;
689     map<MG_NOEUD*,double > lstkgau_cad;
690     map<MG_NOEUD*,double > lstkmin_defcad;
691     map<MG_NOEUD*,double > lstkmax_defcad;
692     map<MG_NOEUD*,double > lstkgau_defcad;
693     multimap<double,MG_NOEUD*,std::greater<double> > lstkmin_relt_cadmgmai;
694     multimap<double,MG_NOEUD*,std::greater<double> > lstkmax_relt_cadmgmai;
695     multimap<double,MG_NOEUD*,std::greater<double> > lstkgau_relt_cadmgmai;
696     multimap<double,MG_NOEUD*,std::greater<double> > lstkmin_relt_defcadmgmai;
697     multimap<double,MG_NOEUD*,std::greater<double> > lstkmax_relt_defcadmgmai;
698     multimap<double,MG_NOEUD*,std::greater<double> > lstkgau_relt_defcadmgmai;
699 sattarpa 609 std::map<std::string,double> liste_kmin;
700     std::map<std::string,double> liste_kmax;
701     std::map<std::string,double> liste_gau;
702     std::map<std::string,double> liste_courburemax1;
703     std::map<std::string,double> liste_courburemax2;
704     std::map<std::string,double> liste_courburemax3;
705     std::map<std::string,double> liste_courburemax4;
706     std::map<std::string,double> liste_courburemax5;
707     int opensurafece=1;
708 sattarpa 650
709 sattarpa 609 cout<<"calcul courbure cadmgmai"<<endl;
710     // calcul courbure cadmgmai ********************************
711     for (MG_NOEUD* cadmgnd=cadmgmai->get_premier_noeud(itcadndcurv);cadmgnd!=NULL;cadmgnd=cadmgmai->get_suivant_noeud(itcadndcurv))
712     {
713     double kmin1=0.;
714     double kmax1=0.;
715     double kmin2=0.;
716     double kmax2=0.;
717     MG_MAILLAGE_OUTILS *cou;
718     cou->calcul_courbure_face_arete_sommet(cadmgnd,kmin1,kmax1,kmin2,kmax2,liste_kmin,liste_kmax,liste_gau,liste_courburemax1,liste_courburemax2,liste_courburemax3,liste_courburemax4,liste_courburemax5,opensurafece);
719     }
720     for (MG_NOEUD* cadmgnd=cadmgmai->get_premier_noeud(itcadndcurv);cadmgnd!=NULL;cadmgnd=cadmgmai->get_suivant_noeud(itcadndcurv))
721     {
722 sattarpa 650
723 sattarpa 609 unsigned long idface=cadmgnd->get_lien_topologie()->get_id();
724     unsigned long idnoeud=cadmgnd->get_id();
725     char mess[500];
726     sprintf(mess,"%lu_%lu",idnoeud,idface);
727     for(std::map<std::string,double>::iterator itkmin=liste_kmin.begin();itkmin!=liste_kmin.end();itkmin++)
728     {
729     if(mess==(*itkmin).first)
730 sattarpa 650 {
731 sattarpa 609 lstkmin_cadmgmai.insert(pair<double,MG_NOEUD*>((*itkmin).second,cadmgnd) );
732 sattarpa 650 lstkmin_cad.insert(pair<MG_NOEUD*,double>(cadmgnd,(*itkmin).second));
733     }
734 sattarpa 609 }
735     for(std::map<std::string,double>::iterator itkmax=liste_kmax.begin();itkmax!=liste_kmax.end();itkmax++)
736     {
737     if(mess==(*itkmax).first)
738 sattarpa 650 {
739 sattarpa 609 lstkmax_cadmgmai.insert(pair<double,MG_NOEUD*>((*itkmax).second,cadmgnd) );
740 sattarpa 650 lstkmax_cad.insert(pair<MG_NOEUD*,double>(cadmgnd,(*itkmax).second));
741     }
742 sattarpa 609 }
743 sattarpa 646 for(std::map<std::string,double>::iterator itkgau=liste_gau.begin();itkgau!=liste_gau.end();itkgau++)
744     {
745     if(mess==(*itkgau).first)
746 sattarpa 650 {
747 sattarpa 646 lstkgau_cadmgmai.insert(pair<double,MG_NOEUD*>((*itkgau).second,cadmgnd) );
748 sattarpa 650 lstkgau_cad.insert(pair<MG_NOEUD*,double>(cadmgnd,(*itkgau).second));
749     }
750 sattarpa 646 }
751 sattarpa 609 }
752 sattarpa 650 //calc reletive curvature CAD
753     map<MG_NOEUD*,double >::iterator itlstkmin_cad;
754     map<MG_NOEUD*,double >::iterator itlstkmax_cad;
755     map<MG_NOEUD*,double >::iterator itlstkgau_cad;
756     for (MG_NOEUD* cadmgnd=cadmgmai->get_premier_noeud(itcadndcurv);cadmgnd!=NULL;cadmgnd=cadmgmai->get_suivant_noeud(itcadndcurv))
757     {
758     itlstkmin_cad=lstkmin_cad.find(cadmgnd);
759     double relet_kmincad=(*itlstkmin_cad).second;
760     itlstkmax_cad=lstkmax_cad.find(cadmgnd);
761     double relet_kmaxcad=(*itlstkmax_cad).second;
762     itlstkgau_cad=lstkgau_cad.find(cadmgnd);
763     double relet_kgaucad=(*itlstkgau_cad).second;
764     TPL_MAP_ENTITE<MG_NOEUD*> lstnei_relcad;
765     int relcad_neindnb=lstnei_relcad.get_nb();
766     double relet_search_rad1=relet_search_rad;
767     while(relcad_neindnb<1)
768     {
769     octreecad.rechercher(cadmgnd->get_x(),cadmgnd->get_y(),cadmgnd->get_z(),relet_search_rad1,lstnei_relcad);
770     relcad_neindnb=lstnei_relcad.get_nb();
771     relet_search_rad1=relet_search_rad1+0.1*relet_search_rad;
772     }
773     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itndnei;
774     for(MG_NOEUD* cadndnei=lstnei_relcad.get_premier(itndnei);cadndnei!=NULL;cadndnei=lstnei_relcad.get_suivant(itndnei))
775     {
776     itlstkmin_cad=lstkmin_cad.find(cadndnei);
777     relet_kmincad=relet_kmincad+(*itlstkmin_cad).second;
778     itlstkmax_cad=lstkmax_cad.find(cadndnei);
779     relet_kmaxcad=relet_kmaxcad+(*itlstkmax_cad).second;
780     itlstkgau_cad=lstkgau_cad.find(cadndnei);
781     relet_kgaucad=relet_kgaucad+(*itlstkgau_cad).second;
782     }
783     relet_kmincad=relet_kmincad/lstnei_relcad.get_nb();
784     relet_kmaxcad=relet_kmaxcad/lstnei_relcad.get_nb();
785     relet_kgaucad=relet_kgaucad/lstnei_relcad.get_nb();
786     lstkmin_relt_cadmgmai.insert(pair<double,MG_NOEUD*> (relet_kmincad,cadmgnd));
787     lstkmax_relt_cadmgmai.insert(pair<double,MG_NOEUD*> (relet_kmaxcad,cadmgnd));
788     lstkgau_relt_cadmgmai.insert(pair<double,MG_NOEUD*> (relet_kgaucad,cadmgnd));
789     }
790     // affichage reletive sur GMSH ******************************
791     if (gmsh_affiche>1)
792     {
793     cout<<"affiche: calcul_courbure_cadmgmai_relet "<<endl;
794     std::ostringstream oss;
795     oss << "calcul_courbure_cadmgmai_curvdif_relet_coef:" <<curvdif_coef ;
796     std::string namefic = oss.str();
797     char *cstr = new char[namefic.length() + 1];
798     strcpy(cstr, namefic.c_str());
799     MG_SOLUTION* sol1=new MG_SOLUTION(cadmgmai,3,cstr,1,(char*)"discrete_curboure_solution",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_NOEUD,MAGIC::TYPE_SOLUTION::SCALAIRE);
800     gest.ajouter_mg_solution(sol1);
801     sol1->change_legende(0,"Kmin_relet");
802     sol1->change_legende(1,"Kmax_relet");
803     sol1->change_legende(2,"K_gau_relet");
804     LISTE_MG_TRIANGLE::iterator ittri;
805     int compte=0;
806     for (MG_TRIANGLE* tri=cadmgmai->get_premier_triangle(ittri);tri!=NULL;tri=cadmgmai->get_suivant_triangle(ittri))
807     {
808     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmin_relt_cadmgmai;
809     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmax_relt_cadmgmai;
810     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkgau_relt_cadmgmai;
811     MG_NOEUD *no1=tri->get_noeud1();
812     MG_NOEUD *no2=tri->get_noeud2();
813     MG_NOEUD *no3=tri->get_noeud3();
814     double valeur0;
815     double valeur1;
816     double valeur2;
817     for(itlstkmin_relt_cadmgmai=lstkmin_relt_cadmgmai.begin();itlstkmin_relt_cadmgmai!=lstkmin_relt_cadmgmai.end();itlstkmin_relt_cadmgmai++)
818     {
819     if (no1==(*itlstkmin_relt_cadmgmai).second)
820     valeur0=(*itlstkmin_relt_cadmgmai).first;
821     }
822     for(itlstkmax_relt_cadmgmai=lstkmax_relt_cadmgmai.begin();itlstkmax_relt_cadmgmai!=lstkmax_relt_cadmgmai.end();itlstkmax_relt_cadmgmai++)
823     {
824     if (no1==(*itlstkmax_relt_cadmgmai).second)
825     valeur1=(*itlstkmax_relt_cadmgmai).first;
826     }
827     for(itlstkgau_relt_cadmgmai=lstkgau_relt_cadmgmai.begin();itlstkgau_relt_cadmgmai!=lstkgau_relt_cadmgmai.end();itlstkgau_relt_cadmgmai++)
828     {
829     if (no1==(*itlstkgau_relt_cadmgmai).second)
830     valeur2=(*itlstkgau_relt_cadmgmai).first;
831     }
832     sol1->ecrire(valeur0,compte,0,0);
833     sol1->ecrire(valeur1,compte,1,0);
834     sol1->ecrire(valeur2,compte,2,0);
835     for(itlstkmin_relt_cadmgmai=lstkmin_relt_cadmgmai.begin();itlstkmin_relt_cadmgmai!=lstkmin_relt_cadmgmai.end();itlstkmin_relt_cadmgmai++)
836     {
837     if (no2==(*itlstkmin_relt_cadmgmai).second)
838     valeur0=(*itlstkmin_relt_cadmgmai).first;
839     }
840     for(itlstkmax_relt_cadmgmai=lstkmax_relt_cadmgmai.begin();itlstkmax_relt_cadmgmai!=lstkmax_relt_cadmgmai.end();itlstkmax_relt_cadmgmai++)
841     {
842     if (no2==(*itlstkmax_relt_cadmgmai).second)
843     valeur1=(*itlstkmax_relt_cadmgmai).first;
844     }
845     for(itlstkgau_relt_cadmgmai=lstkgau_relt_cadmgmai.begin();itlstkgau_relt_cadmgmai!=lstkgau_relt_cadmgmai.end();itlstkgau_relt_cadmgmai++)
846     {
847     if (no2==(*itlstkgau_relt_cadmgmai).second)
848     valeur2=(*itlstkgau_relt_cadmgmai).first;
849     }
850     sol1->ecrire(valeur0,compte,0,1);
851     sol1->ecrire(valeur1,compte,1,1);
852     sol1->ecrire(valeur2,compte,2,1);
853     for(itlstkmin_relt_cadmgmai=lstkmin_relt_cadmgmai.begin();itlstkmin_relt_cadmgmai!=lstkmin_relt_cadmgmai.end();itlstkmin_relt_cadmgmai++)
854     {
855     if (no3==(*itlstkmin_relt_cadmgmai).second)
856     valeur0=(*itlstkmin_relt_cadmgmai).first;
857     }
858     for(itlstkmax_relt_cadmgmai=lstkmax_relt_cadmgmai.begin();itlstkmax_relt_cadmgmai!=lstkmax_relt_cadmgmai.end();itlstkmax_relt_cadmgmai++)
859     {
860     if (no3==(*itlstkmax_relt_cadmgmai).second)
861     valeur1=(*itlstkmax_relt_cadmgmai).first;
862     }
863     for(itlstkgau_relt_cadmgmai=lstkgau_relt_cadmgmai.begin();itlstkgau_relt_cadmgmai!=lstkgau_relt_cadmgmai.end();itlstkgau_relt_cadmgmai++)
864     {
865     if (no3==(*itlstkgau_relt_cadmgmai).second)
866     valeur2=(*itlstkgau_relt_cadmgmai).first;
867     }
868     sol1->ecrire(valeur0,compte,0,2);
869     sol1->ecrire(valeur1,compte,1,2);
870     sol1->ecrire(valeur2,compte,2,2);
871     compte++;
872     }
873     }
874 sattarpa 646 // affichage sur GMSH ******************************
875     if (gmsh_affiche>1)
876     {
877     cout<<"affiche: calcul_courbure_cadmgmai "<<endl;
878     std::ostringstream oss;
879     oss << "calcul_courbure_cadmgmai_curvdif_coef:" <<curvdif_coef ;
880     std::string namefic = oss.str();
881     char *cstr = new char[namefic.length() + 1];
882     strcpy(cstr, namefic.c_str());
883     MG_SOLUTION* sol1=new MG_SOLUTION(cadmgmai,3,cstr,1,(char*)"discrete_curboure_solution",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_NOEUD,MAGIC::TYPE_SOLUTION::SCALAIRE);
884     gest.ajouter_mg_solution(sol1);
885     sol1->change_legende(0,"Kmin");
886     sol1->change_legende(1,"Kmax");
887     sol1->change_legende(2,"K_gau");
888     LISTE_MG_TRIANGLE::iterator ittri;
889     int compte=0;
890     for (MG_TRIANGLE* tri=cadmgmai->get_premier_triangle(ittri);tri!=NULL;tri=cadmgmai->get_suivant_triangle(ittri))
891     {
892     MG_NOEUD *no1=tri->get_noeud1();
893     MG_NOEUD *no2=tri->get_noeud2();
894     MG_NOEUD *no3=tri->get_noeud3();
895     char mess[500];
896     sprintf(mess,"%lu_%lu",no1->get_id(),tri->get_lien_topologie()->get_id());
897     double valeur0=liste_kmin[mess];
898     double valeur1=liste_kmax[mess];
899     double valeur2=liste_gau[mess];
900     sol1->ecrire(valeur0,compte,0,0);
901     sol1->ecrire(valeur1,compte,1,0);
902     sol1->ecrire(valeur2,compte,2,0);
903     sprintf(mess,"%lu_%lu",no2->get_id(),tri->get_lien_topologie()->get_id());
904     valeur0=liste_kmin[mess];
905     valeur1=liste_kmax[mess];
906     valeur2=liste_gau[mess];
907     sol1->ecrire(valeur0,compte,0,1);
908     sol1->ecrire(valeur1,compte,1,1);
909     sol1->ecrire(valeur2,compte,2,1);
910     sprintf(mess,"%lu_%lu",no3->get_id(),tri->get_lien_topologie()->get_id());
911     valeur0=liste_kmin[mess];
912     valeur1=liste_kmax[mess];
913     valeur2=liste_gau[mess];
914     sol1->ecrire(valeur0,compte,0,2);
915     sol1->ecrire(valeur1,compte,1,2);
916     sol1->ecrire(valeur2,compte,2,2);
917     compte++;
918     }
919     }
920 sattarpa 609 liste_kmin.clear();liste_kmax.clear();liste_gau.clear();liste_courburemax1.clear();liste_courburemax2.clear();liste_courburemax3.clear();liste_courburemax4.clear();liste_courburemax5.clear();
921 sattarpa 650
922     cout<<"calcul courbure defcadmgmai"<<endl;
923 sattarpa 609 // calcul courbure defcadmgmai ********************************
924 sattarpa 554
925 sattarpa 609 for (MG_NOEUD* defcadmgnd=defcadmgmai->get_premier_noeud(itdefcadndcurv);defcadmgnd!=NULL;defcadmgnd=defcadmgmai->get_suivant_noeud(itdefcadndcurv))
926     {
927     double kmin1=0.;
928     double kmax1=0.;
929     double kmin2=0.;
930     double kmax2=0.;
931     MG_MAILLAGE_OUTILS *cou;
932     cou->calcul_courbure_face_arete_sommet(defcadmgnd,kmin1,kmax1,kmin2,kmax2,liste_kmin,liste_kmax,liste_gau,liste_courburemax1,liste_courburemax2,liste_courburemax3,liste_courburemax4,liste_courburemax5,opensurafece);
933     }
934     for (MG_NOEUD* defcadmgnd=defcadmgmai->get_premier_noeud(itdefcadndcurv);defcadmgnd!=NULL;defcadmgnd=defcadmgmai->get_suivant_noeud(itdefcadndcurv))
935     {
936     unsigned long idface=defcadmgnd->get_lien_topologie()->get_id();
937     unsigned long idnoeud=defcadmgnd->get_id();
938     char mess[500];
939     sprintf(mess,"%lu_%lu",idnoeud,idface);
940     for(std::map<std::string,double>::iterator itkmin=liste_kmin.begin();itkmin!=liste_kmin.end();itkmin++)
941     {
942     if(mess==(*itkmin).first)
943 sattarpa 650 {
944 sattarpa 609 lstkmin_defcadmgmai.insert(pair<double,MG_NOEUD*>((*itkmin).second,defcadmgnd) );
945 sattarpa 650 lstkmin_defcad.insert(pair<MG_NOEUD*,double>(defcadmgnd,(*itkmin).second));
946     }
947 sattarpa 609 }
948     for(std::map<std::string,double>::iterator itkmax=liste_kmax.begin();itkmax!=liste_kmax.end();itkmax++)
949     {
950     if(mess==(*itkmax).first)
951 sattarpa 650 {
952 sattarpa 609 lstkmax_defcadmgmai.insert(pair<double,MG_NOEUD*>((*itkmax).second,defcadmgnd) );
953 sattarpa 650 lstkmax_defcad.insert(pair<MG_NOEUD*,double>(defcadmgnd,(*itkmax).second));
954     }
955 sattarpa 609 }
956 sattarpa 646 for(std::map<std::string,double>::iterator itkgau=liste_gau.begin();itkgau!=liste_gau.end();itkgau++)
957     {
958     if(mess==(*itkgau).first)
959 sattarpa 650 {
960 sattarpa 646 lstkgau_defcadmgmai.insert(pair<double,MG_NOEUD*>((*itkgau).second,defcadmgnd) );
961 sattarpa 650 lstkgau_defcad.insert(pair<MG_NOEUD*,double>(defcadmgnd,(*itkgau).second));
962     }
963 sattarpa 646 }
964 sattarpa 609 }
965 sattarpa 650 //calc reletive curvature defCAD
966     map<MG_NOEUD*,double >::iterator itlstkmin_defcad;
967     map<MG_NOEUD*,double >::iterator itlstkmax_defcad;
968     map<MG_NOEUD*,double >::iterator itlstkgau_defcad;
969     for (MG_NOEUD* defcadmgnd=defcadmgmai->get_premier_noeud(itdefcadndcurv);defcadmgnd!=NULL;defcadmgnd=defcadmgmai->get_suivant_noeud(itdefcadndcurv))
970     {
971     itlstkmin_defcad=lstkmin_defcad.find(defcadmgnd);
972     double relet_kmindefcad=(*itlstkmin_defcad).second;
973     itlstkmax_defcad=lstkmax_defcad.find(defcadmgnd);
974     double relet_kmaxdefcad=(*itlstkmax_defcad).second;
975     itlstkgau_defcad=lstkgau_cad.find(defcadmgnd);
976     double relet_kgaudefcad=(*itlstkgau_defcad).second;
977     TPL_MAP_ENTITE<MG_NOEUD*> lstnei_reldefcad;
978     int reldefcad_neindnb=lstnei_reldefcad.get_nb();
979     double relet_search_rad1=relet_search_rad;
980     while(reldefcad_neindnb<1)
981     {
982     octreecad.rechercher(defcadmgnd->get_x(),defcadmgnd->get_y(),defcadmgnd->get_z(),relet_search_rad1,lstnei_reldefcad);
983     reldefcad_neindnb=lstnei_reldefcad.get_nb();
984     relet_search_rad1=relet_search_rad1+0.1*relet_search_rad;
985     }
986     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itndnei;
987     for(MG_NOEUD* defcadndnei=lstnei_reldefcad.get_premier(itndnei);defcadndnei!=NULL;defcadndnei=lstnei_reldefcad.get_suivant(itndnei))
988     {
989     itlstkmin_cad=lstkmin_cad.find(defcadndnei);
990     relet_kmindefcad=relet_kmindefcad+(*itlstkmin_defcad).second;
991     itlstkmax_cad=lstkmax_cad.find(defcadndnei);
992     relet_kmaxdefcad=relet_kmaxdefcad+(*itlstkmax_defcad).second;
993     itlstkgau_cad=lstkgau_cad.find(defcadndnei);
994     relet_kgaudefcad=relet_kgaudefcad+(*itlstkgau_defcad).second;
995     }
996     relet_kmindefcad=relet_kmindefcad/lstnei_reldefcad.get_nb();
997     relet_kmaxdefcad=relet_kmaxdefcad/lstnei_reldefcad.get_nb();
998     relet_kgaudefcad=relet_kgaudefcad/lstnei_reldefcad.get_nb();
999     lstkmin_relt_defcadmgmai.insert(pair<double,MG_NOEUD*> (relet_kmindefcad,defcadmgnd));
1000     lstkmax_relt_defcadmgmai.insert(pair<double,MG_NOEUD*> (relet_kmaxdefcad,defcadmgnd));
1001     lstkgau_relt_defcadmgmai.insert(pair<double,MG_NOEUD*> (relet_kgaudefcad,defcadmgnd));
1002     }
1003     // affichage reletive defcad sur GMSH ******************************
1004     if (gmsh_affiche>1)
1005     {
1006     cout<<"affiche: calcul_courbure_cadmgmai_relet "<<endl;
1007     std::ostringstream oss;
1008     oss << "calcul_courbure_cadmgmai_curvdif_relet_coef:" <<curvdif_coef ;
1009     std::string namefic = oss.str();
1010     char *cstr = new char[namefic.length() + 1];
1011     strcpy(cstr, namefic.c_str());
1012     MG_SOLUTION* sol1=new MG_SOLUTION(cadmgmai,3,cstr,1,(char*)"discrete_curboure_solution",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_NOEUD,MAGIC::TYPE_SOLUTION::SCALAIRE);
1013     gest.ajouter_mg_solution(sol1);
1014     sol1->change_legende(0,"Kmin_relet");
1015     sol1->change_legende(1,"Kmax_relet");
1016     sol1->change_legende(2,"K_gau_relet");
1017     LISTE_MG_TRIANGLE::iterator ittri;
1018     int compte=0;
1019     for (MG_TRIANGLE* tri=cadmgmai->get_premier_triangle(ittri);tri!=NULL;tri=cadmgmai->get_suivant_triangle(ittri))
1020     {
1021     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmin_relt_cadmgmai;
1022     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmax_relt_cadmgmai;
1023     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkgau_relt_cadmgmai;
1024     MG_NOEUD *no1=tri->get_noeud1();
1025     MG_NOEUD *no2=tri->get_noeud2();
1026     MG_NOEUD *no3=tri->get_noeud3();
1027     double valeur0;
1028     double valeur1;
1029     double valeur2;
1030     for(itlstkmin_relt_cadmgmai=lstkmin_relt_cadmgmai.begin();itlstkmin_relt_cadmgmai!=lstkmin_relt_cadmgmai.end();itlstkmin_relt_cadmgmai++)
1031     {
1032     if (no1==(*itlstkmin_relt_cadmgmai).second)
1033     valeur0=(*itlstkmin_relt_cadmgmai).first;
1034     }
1035     for(itlstkmax_relt_cadmgmai=lstkmax_relt_cadmgmai.begin();itlstkmax_relt_cadmgmai!=lstkmax_relt_cadmgmai.end();itlstkmax_relt_cadmgmai++)
1036     {
1037     if (no1==(*itlstkmax_relt_cadmgmai).second)
1038     valeur1=(*itlstkmax_relt_cadmgmai).first;
1039     }
1040     for(itlstkgau_relt_cadmgmai=lstkgau_relt_cadmgmai.begin();itlstkgau_relt_cadmgmai!=lstkgau_relt_cadmgmai.end();itlstkgau_relt_cadmgmai++)
1041     {
1042     if (no1==(*itlstkgau_relt_cadmgmai).second)
1043     valeur2=(*itlstkgau_relt_cadmgmai).first;
1044     }
1045     sol1->ecrire(valeur0,compte,0,0);
1046     sol1->ecrire(valeur1,compte,1,0);
1047     sol1->ecrire(valeur2,compte,2,0);
1048     for(itlstkmin_relt_cadmgmai=lstkmin_relt_cadmgmai.begin();itlstkmin_relt_cadmgmai!=lstkmin_relt_cadmgmai.end();itlstkmin_relt_cadmgmai++)
1049     {
1050     if (no2==(*itlstkmin_relt_cadmgmai).second)
1051     valeur0=(*itlstkmin_relt_cadmgmai).first;
1052     }
1053     for(itlstkmax_relt_cadmgmai=lstkmax_relt_cadmgmai.begin();itlstkmax_relt_cadmgmai!=lstkmax_relt_cadmgmai.end();itlstkmax_relt_cadmgmai++)
1054     {
1055     if (no2==(*itlstkmax_relt_cadmgmai).second)
1056     valeur1=(*itlstkmax_relt_cadmgmai).first;
1057     }
1058     for(itlstkgau_relt_cadmgmai=lstkgau_relt_cadmgmai.begin();itlstkgau_relt_cadmgmai!=lstkgau_relt_cadmgmai.end();itlstkgau_relt_cadmgmai++)
1059     {
1060     if (no2==(*itlstkgau_relt_cadmgmai).second)
1061     valeur2=(*itlstkgau_relt_cadmgmai).first;
1062     }
1063     sol1->ecrire(valeur0,compte,0,1);
1064     sol1->ecrire(valeur1,compte,1,1);
1065     sol1->ecrire(valeur2,compte,2,1);
1066     for(itlstkmin_relt_cadmgmai=lstkmin_relt_cadmgmai.begin();itlstkmin_relt_cadmgmai!=lstkmin_relt_cadmgmai.end();itlstkmin_relt_cadmgmai++)
1067     {
1068     if (no3==(*itlstkmin_relt_cadmgmai).second)
1069     valeur0=(*itlstkmin_relt_cadmgmai).first;
1070     }
1071     for(itlstkmax_relt_cadmgmai=lstkmax_relt_cadmgmai.begin();itlstkmax_relt_cadmgmai!=lstkmax_relt_cadmgmai.end();itlstkmax_relt_cadmgmai++)
1072     {
1073     if (no3==(*itlstkmax_relt_cadmgmai).second)
1074     valeur1=(*itlstkmax_relt_cadmgmai).first;
1075     }
1076     for(itlstkgau_relt_cadmgmai=lstkgau_relt_cadmgmai.begin();itlstkgau_relt_cadmgmai!=lstkgau_relt_cadmgmai.end();itlstkgau_relt_cadmgmai++)
1077     {
1078     if (no3==(*itlstkgau_relt_cadmgmai).second)
1079     valeur2=(*itlstkgau_relt_cadmgmai).first;
1080     }
1081     sol1->ecrire(valeur0,compte,0,2);
1082     sol1->ecrire(valeur1,compte,1,2);
1083     sol1->ecrire(valeur2,compte,2,2);
1084     compte++;
1085     }
1086     }
1087 sattarpa 646 // affichage sur GMSH ******************************
1088     if (gmsh_affiche>1)
1089     {
1090     cout<<"affiche: calcul_courbure_defcadmgmai "<<endl;
1091     std::ostringstream oss;
1092     oss << "calcul_courbure_defcadmgmai_curvdif_coef:" <<curvdif_coef ;
1093     std::string namefic = oss.str();
1094     char *cstr = new char[namefic.length() + 1];
1095     strcpy(cstr, namefic.c_str());
1096     MG_SOLUTION* sol2=new MG_SOLUTION(defcadmgmai,3,cstr,1,(char*)"discrete_curboure_solution",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_NOEUD,MAGIC::TYPE_SOLUTION::SCALAIRE);
1097     gest.ajouter_mg_solution(sol2);
1098     sol2->change_legende(0,"Kmin");
1099     sol2->change_legende(1,"Kmax");
1100     sol2->change_legende(2,"K_gau");
1101     LISTE_MG_TRIANGLE::iterator ittri;
1102     int compte=0;
1103     for (MG_TRIANGLE* tri=defcadmgmai->get_premier_triangle(ittri);tri!=NULL;tri=defcadmgmai->get_suivant_triangle(ittri))
1104     {
1105     MG_NOEUD *no1=tri->get_noeud1();
1106     MG_NOEUD *no2=tri->get_noeud2();
1107     MG_NOEUD *no3=tri->get_noeud3();
1108     char mess[500];
1109     sprintf(mess,"%lu_%lu",no1->get_id(),tri->get_lien_topologie()->get_id());
1110     double valeur0=liste_kmin[mess];
1111     double valeur1=liste_kmax[mess];
1112     double valeur2=liste_gau[mess];
1113     sol2->ecrire(valeur0,compte,0,0);
1114     sol2->ecrire(valeur1,compte,1,0);
1115     sol2->ecrire(valeur2,compte,2,0);
1116     sprintf(mess,"%lu_%lu",no2->get_id(),tri->get_lien_topologie()->get_id());
1117     valeur0=liste_kmin[mess];
1118     valeur1=liste_kmax[mess];
1119     valeur2=liste_gau[mess];
1120     sol2->ecrire(valeur0,compte,0,1);
1121     sol2->ecrire(valeur1,compte,1,1);
1122     sol2->ecrire(valeur2,compte,2,1);
1123     sprintf(mess,"%lu_%lu",no3->get_id(),tri->get_lien_topologie()->get_id());
1124     valeur0=liste_kmin[mess];
1125     valeur1=liste_kmax[mess];
1126     valeur2=liste_gau[mess];
1127     sol2->ecrire(valeur0,compte,0,2);
1128     sol2->ecrire(valeur1,compte,1,2);
1129     sol2->ecrire(valeur2,compte,2,2);
1130     compte++;
1131     }
1132 sattarpa 673
1133 sattarpa 646 }
1134     liste_kmin.clear();liste_kmax.clear();liste_gau.clear();liste_courburemax1.clear();liste_courburemax2.clear();liste_courburemax3.clear();liste_courburemax4.clear();liste_courburemax5.clear();
1135    
1136    
1137     ///make correspondence between cadmgmai and defcadmgmai nodes
1138 sattarpa 609 map<unsigned long, unsigned long>::iterator itcoresspondndidlst;
1139     for(MG_NOEUD* defcadndcurv=defcadmgmai->get_premier_noeud(itdefcadndcurv);defcadndcurv!=NULL;defcadndcurv=defcadmgmai->get_suivant_noeud(itdefcadndcurv))
1140     {
1141     itcoresspondndidlst=coresspondndidlst.find(defcadndcurv->get_id());
1142     defcadndcurv->change_nouveau_numero((*itcoresspondndidlst).second);
1143     }
1144    
1145     cout<<"solution calculation"<<endl;
1146     multimap<double,MG_NOEUD*,std::greater<double> > lstkmin_diff;
1147     multimap<double,MG_NOEUD*,std::greater<double> > lstkmax_diff;
1148 sattarpa 646 multimap<double,MG_NOEUD*,std::greater<double> > lstkgau_diff;
1149 sattarpa 609 multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmin_cadmgmai;
1150     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmax_cadmgmai;
1151 sattarpa 646 multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkgau_cadmgmai;
1152 sattarpa 609 multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmin_defcadmgmai;
1153     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmax_defcadmgmai;
1154 sattarpa 646 multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkgau_defcadmgmai;
1155 sattarpa 609 cout<<"lstkmin_cadmgmai.size()= "<<lstkmin_cadmgmai.size()<<endl;
1156     cout<<"lstkmin_defcadmgmai.size()= "<<lstkmin_defcadmgmai.size()<<endl;
1157 sattarpa 646 cout<<"kmin diff. calc. started"<<endl;
1158 sattarpa 650
1159 sattarpa 609 for(itlstkmin_cadmgmai=lstkmin_cadmgmai.begin();itlstkmin_cadmgmai!=lstkmin_cadmgmai.end();itlstkmin_cadmgmai++)
1160 sattarpa 554 {
1161 sattarpa 609 MG_NOEUD* cadndcurv=(*itlstkmin_cadmgmai).second;
1162     double kmindcad;
1163     double kmindcad_def;
1164     kmindcad=(*itlstkmin_cadmgmai).first;
1165     for(itlstkmin_defcadmgmai=lstkmin_defcadmgmai.begin();itlstkmin_defcadmgmai!=lstkmin_defcadmgmai.end();itlstkmin_defcadmgmai++)
1166     {
1167     MG_NOEUD* defcadndcurv=(*itlstkmin_defcadmgmai).second;
1168     if(defcadndcurv->get_nouveau_numero()==cadndcurv->get_id())
1169     kmindcad_def=(*itlstkmin_defcadmgmai).first;
1170     }
1171    
1172     double kmin_diff=kmindcad_def-kmindcad;
1173     lstkmin_diff.insert(pair<double,MG_NOEUD*>(kmin_diff,cadndcurv) );
1174     }
1175 sattarpa 646 cout<<"kmax diff. calc. started"<<endl;
1176 sattarpa 609 for(itlstkmax_cadmgmai=lstkmax_cadmgmai.begin();itlstkmax_cadmgmai!=lstkmax_cadmgmai.end();itlstkmax_cadmgmai++)
1177     {
1178     MG_NOEUD* cadndcurv=(*itlstkmax_cadmgmai).second;
1179     double kmaxndcad;
1180     double kmaxndcad_def;
1181     kmaxndcad=(*itlstkmax_cadmgmai).first;
1182     for(itlstkmax_defcadmgmai=lstkmax_defcadmgmai.begin();itlstkmax_defcadmgmai!=lstkmax_defcadmgmai.end();itlstkmax_defcadmgmai++)
1183     {
1184     MG_NOEUD* defcadndcurv=(*itlstkmax_defcadmgmai).second;
1185     if(defcadndcurv->get_nouveau_numero()==cadndcurv->get_id())
1186     {
1187     kmaxndcad_def=(*itlstkmax_defcadmgmai).first;
1188     }
1189     }
1190     double kmax_diff=kmaxndcad_def-kmaxndcad;
1191     lstkmax_diff.insert(pair<double,MG_NOEUD*>(kmax_diff,cadndcurv) );
1192     }
1193 sattarpa 646 cout<<"kgau diff. calc. started"<<endl;
1194     for(itlstkgau_cadmgmai=lstkgau_cadmgmai.begin();itlstkgau_cadmgmai!=lstkgau_cadmgmai.end();itlstkgau_cadmgmai++)
1195     {
1196     MG_NOEUD* cadndcurv=(*itlstkgau_cadmgmai).second;
1197     double kgaundcad;
1198     double kgaundcad_def;
1199     kgaundcad=(*itlstkgau_cadmgmai).first;
1200     for(itlstkgau_defcadmgmai=lstkgau_defcadmgmai.begin();itlstkgau_defcadmgmai!=lstkgau_defcadmgmai.end();itlstkgau_defcadmgmai++)
1201     {
1202     MG_NOEUD* defcadndcurv=(*itlstkgau_defcadmgmai).second;
1203     if(defcadndcurv->get_nouveau_numero()==cadndcurv->get_id())
1204     {
1205     kgaundcad_def=(*itlstkgau_defcadmgmai).first;
1206     }
1207     }
1208     double kgau_diff=kgaundcad_def-kgaundcad;
1209     lstkgau_diff.insert(pair<double,MG_NOEUD*>(kgau_diff,cadndcurv) );
1210     }
1211 sattarpa 673 // mean diff
1212 sattarpa 650 multimap<double,MG_NOEUD*,std::greater<double> > lstkmin_relt_diff;
1213     multimap<double,MG_NOEUD*,std::greater<double> > lstkmax_relt_diff;
1214     multimap<double,MG_NOEUD*,std::greater<double> > lstkgau_relt_diff;
1215     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmin_relt_cadmgmai;
1216     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmax_relt_cadmgmai;
1217     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkgau_relt_cadmgmai;
1218     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmin_relt_defcadmgmai;
1219     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmax_relt_defcadmgmai;
1220     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkgau_relt_defcadmgmai;
1221 sattarpa 658 cout<<"kmin _relt diff. calc. started"<<endl;
1222     for(itlstkmin_relt_cadmgmai=lstkmin_relt_cadmgmai.begin();itlstkmin_relt_cadmgmai!=lstkmin_relt_cadmgmai.end();itlstkmin_relt_cadmgmai++)
1223 sattarpa 650 {
1224     MG_NOEUD* cadndcurv=(*itlstkmin_relt_cadmgmai).second;
1225     double kmindcad;
1226     double kmindcad_relt_def;
1227     kmindcad=(*itlstkmin_relt_cadmgmai).first;
1228     for(itlstkmin_relt_defcadmgmai=lstkmin_relt_defcadmgmai.begin();itlstkmin_relt_defcadmgmai!=lstkmin_relt_defcadmgmai.end();itlstkmin_relt_defcadmgmai++)
1229     {
1230     MG_NOEUD* defcadndcurv=(*itlstkmin_relt_defcadmgmai).second;
1231     if(defcadndcurv->get_nouveau_numero()==cadndcurv->get_id())
1232     kmindcad_relt_def=(*itlstkmin_relt_defcadmgmai).first;
1233     }
1234    
1235     double kmin_relt_diff=kmindcad_relt_def-kmindcad;
1236     lstkmin_relt_diff.insert(pair<double,MG_NOEUD*>(kmin_relt_diff,cadndcurv) );
1237     }
1238     cout<<"kmax _relt diff. calc. started"<<endl;
1239     for(itlstkmax_relt_cadmgmai=lstkmax_relt_cadmgmai.begin();itlstkmax_relt_cadmgmai!=lstkmax_relt_cadmgmai.end();itlstkmax_relt_cadmgmai++)
1240     {
1241     MG_NOEUD* cadndcurv=(*itlstkmax_relt_cadmgmai).second;
1242     double kmaxndcad;
1243     double kmaxndcad_relt_def;
1244     kmaxndcad=(*itlstkmax_relt_cadmgmai).first;
1245     for(itlstkmax_relt_defcadmgmai=lstkmax_relt_defcadmgmai.begin();itlstkmax_relt_defcadmgmai!=lstkmax_relt_defcadmgmai.end();itlstkmax_relt_defcadmgmai++)
1246     {
1247     MG_NOEUD* defcadndcurv=(*itlstkmax_relt_defcadmgmai).second;
1248     if(defcadndcurv->get_nouveau_numero()==cadndcurv->get_id())
1249     {
1250     kmaxndcad_relt_def=(*itlstkmax_relt_defcadmgmai).first;
1251     }
1252     }
1253     double kmax_relt_diff=kmaxndcad_relt_def-kmaxndcad;
1254     lstkmax_relt_diff.insert(pair<double,MG_NOEUD*>(kmax_relt_diff,cadndcurv) );
1255     }
1256     cout<<"kgau_relt diff. calc. started"<<endl;
1257     for(itlstkgau_relt_cadmgmai=lstkgau_relt_cadmgmai.begin();itlstkgau_relt_cadmgmai!=lstkgau_relt_cadmgmai.end();itlstkgau_relt_cadmgmai++)
1258     {
1259     MG_NOEUD* cadndcurv=(*itlstkgau_relt_cadmgmai).second;
1260     double kgaundcad;
1261     double kgaundcad_relt_def;
1262     kgaundcad=(*itlstkgau_relt_cadmgmai).first;
1263     for(itlstkgau_relt_defcadmgmai=lstkgau_relt_defcadmgmai.begin();itlstkgau_relt_defcadmgmai!=lstkgau_relt_defcadmgmai.end();itlstkgau_relt_defcadmgmai++)
1264     {
1265     MG_NOEUD* defcadndcurv=(*itlstkgau_relt_defcadmgmai).second;
1266     if(defcadndcurv->get_nouveau_numero()==cadndcurv->get_id())
1267     {
1268     kgaundcad_relt_def=(*itlstkgau_relt_defcadmgmai).first;
1269     }
1270     }
1271     double kgau_relt_diff=kgaundcad_relt_def-kgaundcad;
1272     lstkgau_relt_diff.insert(pair<double,MG_NOEUD*>(kgau_relt_diff,cadndcurv) );
1273     }
1274     // affichage reletive diff sur GMSH ******************************
1275     if (gmsh_affiche>0)
1276     {
1277     cout<<"affiche: calcul_relet_difference_courbure "<<endl;
1278     std::ostringstream oss;
1279     oss << "KMaxMinGaudiff_curvdifcoef_relet:" <<curvdif_coef ;
1280     std::string namefic = oss.str();
1281     char *cstr = new char[namefic.length() + 1];
1282     strcpy(cstr, namefic.c_str());
1283     MG_SOLUTION* sol4=new MG_SOLUTION(cadmgmai,3,cstr,1,(char*)"Kdiff_relt_solution",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_NOEUD,MAGIC::TYPE_SOLUTION::SCALAIRE);
1284     gest.ajouter_mg_solution(sol4);
1285     sol4->change_legende(0,"Kmin_diff");
1286     sol4->change_legende(1,"Kmax_diff");
1287     sol4->change_legende(2,"Kgau_diff");
1288     LISTE_MG_TRIANGLE::iterator ittri;
1289     int compte=0;
1290     for (MG_TRIANGLE* tri=cadmgmai->get_premier_triangle(ittri);tri!=NULL;tri=cadmgmai->get_suivant_triangle(ittri))
1291     {
1292     MG_NOEUD *no1=tri->get_noeud1();
1293     MG_NOEUD *no2=tri->get_noeud2();
1294     MG_NOEUD *no3=tri->get_noeud3();
1295     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmin_relt_diff;
1296     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmax_relt_diff;
1297     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkgau_relt_diff;
1298     double valeurKmin1, valeurKmin2, valeurKmin3;
1299     double valeurKmax1, valeurKmax2, valeurKmax3;
1300     double valeurKgau1, valeurKgau2, valeurKgau3;
1301     for (itlstkmin_relt_diff=lstkmin_relt_diff.begin();itlstkmin_relt_diff!=lstkmin_relt_diff.end();itlstkmin_relt_diff++)
1302     {
1303     if (no1==(*itlstkmin_relt_diff).second)
1304     valeurKmin1=(*itlstkmin_relt_diff).first;
1305     if (no2==(*itlstkmin_relt_diff).second)
1306     valeurKmin2=(*itlstkmin_relt_diff).first;
1307     if (no3==(*itlstkmin_relt_diff).second)
1308     valeurKmin3=(*itlstkmin_relt_diff).first;
1309     }
1310     for (itlstkmax_relt_diff=lstkmax_relt_diff.begin();itlstkmax_relt_diff!=lstkmax_relt_diff.end();itlstkmax_relt_diff++)
1311     {
1312     if (no1==(*itlstkmax_relt_diff).second)
1313     valeurKmax1=(*itlstkmax_relt_diff).first;
1314     if (no2==(*itlstkmax_relt_diff).second)
1315     valeurKmax2=(*itlstkmax_relt_diff).first;
1316     if (no3==(*itlstkmax_relt_diff).second)
1317     valeurKmax3=(*itlstkmax_relt_diff).first;
1318     }
1319     for (itlstkgau_relt_diff=lstkgau_relt_diff.begin();itlstkgau_relt_diff!=lstkgau_relt_diff.end();itlstkgau_relt_diff++)
1320     {
1321     if (no1==(*itlstkgau_relt_diff).second)
1322     valeurKgau1=(*itlstkgau_relt_diff).first;
1323     if (no2==(*itlstkgau_relt_diff).second)
1324     valeurKgau2=(*itlstkgau_relt_diff).first;
1325     if (no3==(*itlstkgau_relt_diff).second)
1326     valeurKgau3=(*itlstkgau_relt_diff).first;
1327     }
1328     sol4->ecrire(valeurKmin1,compte,0,0);
1329     sol4->ecrire(valeurKmax1,compte,1,0);
1330     sol4->ecrire(valeurKgau1,compte,2,0);
1331    
1332     sol4->ecrire(valeurKmin2,compte,0,1);
1333     sol4->ecrire(valeurKmax2,compte,1,1);
1334     sol4->ecrire(valeurKgau2,compte,2,1);
1335    
1336     sol4->ecrire(valeurKmin3,compte,0,2);
1337     sol4->ecrire(valeurKmax3,compte,1,2);
1338     sol4->ecrire(valeurKgau3,compte,2,2);
1339     compte++;
1340     }
1341     }
1342    
1343 sattarpa 646 // affichage sur GMSH ******************************
1344 sattarpa 658 if (gmsh_affiche>1)
1345 sattarpa 646 {
1346     cout<<"affiche: calcul_difference_courbure "<<endl;
1347     std::ostringstream oss;
1348     oss << "KMaxMinGaudiff_curvdifcoef:" <<curvdif_coef ;
1349     std::string namefic = oss.str();
1350     char *cstr = new char[namefic.length() + 1];
1351     strcpy(cstr, namefic.c_str());
1352     MG_SOLUTION* sol3=new MG_SOLUTION(cadmgmai,3,cstr,1,(char*)"Kdiff_solution",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_NOEUD,MAGIC::TYPE_SOLUTION::SCALAIRE);
1353     gest.ajouter_mg_solution(sol3);
1354     sol3->change_legende(0,"Kmin_diff");
1355     sol3->change_legende(1,"Kmax_diff");
1356     sol3->change_legende(2,"Kgau_diff");
1357     LISTE_MG_TRIANGLE::iterator ittri;
1358     int compte=0;
1359     for (MG_TRIANGLE* tri=cadmgmai->get_premier_triangle(ittri);tri!=NULL;tri=cadmgmai->get_suivant_triangle(ittri))
1360     {
1361     MG_NOEUD *no1=tri->get_noeud1();
1362     MG_NOEUD *no2=tri->get_noeud2();
1363     MG_NOEUD *no3=tri->get_noeud3();
1364     //char mess[500];
1365     //sprintf(mess,"%lu_%lu",no1->get_id(),tri->get_lien_topologie()->get_id());
1366     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmin_diff;
1367     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmax_diff;
1368     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkgau_diff;
1369     double valeurKmin1, valeurKmin2, valeurKmin3;
1370     double valeurKmax1, valeurKmax2, valeurKmax3;
1371     double valeurKgau1, valeurKgau2, valeurKgau3;
1372     for (itlstkmin_diff=lstkmin_diff.begin();itlstkmin_diff!=lstkmin_diff.end();itlstkmin_diff++)
1373     {
1374     if (no1==(*itlstkmin_diff).second)
1375     valeurKmin1=(*itlstkmin_diff).first;
1376     if (no2==(*itlstkmin_diff).second)
1377     valeurKmin2=(*itlstkmin_diff).first;
1378     if (no3==(*itlstkmin_diff).second)
1379     valeurKmin3=(*itlstkmin_diff).first;
1380     }
1381     for (itlstkmax_diff=lstkmax_diff.begin();itlstkmax_diff!=lstkmax_diff.end();itlstkmax_diff++)
1382     {
1383     if (no1==(*itlstkmax_diff).second)
1384     valeurKmax1=(*itlstkmax_diff).first;
1385     if (no2==(*itlstkmax_diff).second)
1386     valeurKmax2=(*itlstkmax_diff).first;
1387     if (no3==(*itlstkmax_diff).second)
1388     valeurKmax3=(*itlstkmax_diff).first;
1389     }
1390     for (itlstkgau_diff=lstkgau_diff.begin();itlstkgau_diff!=lstkgau_diff.end();itlstkgau_diff++)
1391     {
1392     if (no1==(*itlstkgau_diff).second)
1393     valeurKgau1=(*itlstkgau_diff).first;
1394     if (no2==(*itlstkgau_diff).second)
1395     valeurKgau2=(*itlstkgau_diff).first;
1396     if (no3==(*itlstkgau_diff).second)
1397     valeurKgau3=(*itlstkgau_diff).first;
1398     }
1399     sol3->ecrire(valeurKmin1,compte,0,0);
1400     sol3->ecrire(valeurKmax1,compte,1,0);
1401     sol3->ecrire(valeurKgau1,compte,2,0);
1402 sattarpa 609
1403 sattarpa 646 sol3->ecrire(valeurKmin2,compte,0,1);
1404     sol3->ecrire(valeurKmax2,compte,1,1);
1405     sol3->ecrire(valeurKgau2,compte,2,1);
1406    
1407     sol3->ecrire(valeurKmin3,compte,0,2);
1408     sol3->ecrire(valeurKmax3,compte,1,2);
1409     sol3->ecrire(valeurKgau3,compte,2,2);
1410     compte++;
1411     }
1412 sattarpa 673
1413     }
1414    
1415     char chaine[1000];
1416 sattarpa 646 char* p;
1417     p=strrchr(magicfilename,'.');
1418     strncpy(chaine,magicfilename,p-magicfilename);
1419     std::string namfic=chaine;
1420     namfic=namfic + "courbcal.magic";
1421     gest.enregistrer(namfic.c_str());
1422 sattarpa 673 cout<<"read insert points in lstpinsert"<<endl;
1423 sattarpa 609 //read insert points in lstpinsert
1424     std::vector<double*> lstpinsert;
1425     double prop=0.001;
1426     FILE *in=fopen(gnifinspointfile,"rt");
1427     if (in==NULL) cout<<"file is not available"<<endl;
1428     while (!feof(in))
1429     {
1430     char chaine[500];
1431 sattarpa 655 char* res=fgets(chaine,500,in);
1432     if(res!=NULL)
1433     {
1434 sattarpa 609 double x,y,z;
1435     double q1,q2,q3;
1436     int nb=sscanf(chaine,"%le %le %le %le %le %le",&x,&y,&z,&q1,&q2,&q3);
1437     q1=prop*q1;
1438     q2=prop*q2;
1439     q3=prop*q3;
1440     if (nb!=-1 && nb!=6) cout<<"Wrong file format"<<endl;
1441     else if (nb==6)
1442     {
1443     double* pcoordbc=new double[6];
1444     pcoordbc[0]=x; pcoordbc[1]=y; pcoordbc[2]=z; pcoordbc[3]=q1; pcoordbc[4]=q2; pcoordbc[5]=q3;
1445     lstpinsert.push_back(pcoordbc);
1446     }
1447 sattarpa 655 }
1448 sattarpa 609 }
1449     fclose(in);
1450 sattarpa 650 if (relet_curvature<1)
1451     {
1452 sattarpa 609 //criterion
1453 sattarpa 761 multimap<double,MG_NOEUD*,std::greater<double> >::reverse_iterator ritlstkmin_diff;
1454     multimap<double,MG_NOEUD*,std::greater<double> >::reverse_iterator ritlstkmax_diff;
1455     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmin_diff;
1456     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmax_diff;
1457     ritlstkmin_diff=lstkmin_diff.rbegin();
1458 sattarpa 658 double kmin_diff_min=(*ritlstkmin_diff).first;
1459 sattarpa 761 itlstkmin_diff=lstkmin_diff.begin();
1460 sattarpa 658 double kmin_diff_max=(*itlstkmin_diff).first;
1461 sattarpa 761 ritlstkmax_diff=lstkmax_diff.rbegin();
1462 sattarpa 658 double kmax_diff_min=(*ritlstkmax_diff).first;
1463 sattarpa 761 itlstkmax_diff=lstkmax_diff.begin();
1464 sattarpa 658 double kmax_diff_max=(*itlstkmax_diff).first;
1465     cout<<"kmin_diff_min= "<<kmin_diff_min<<" kmin_diff_max= "<<kmin_diff_max<<endl;
1466     cout<<"kmax_diff_min= "<<kmax_diff_min<<" kmax_diff_max= "<<kmax_diff_max<<endl;
1467    
1468 sattarpa 739 double crikmin_min=curvdif_coef;//sasan*kmin_diff_min;
1469     double crikmin_max=curvdif_coef;//sasan*kmin_diff_max;
1470     double crikmax_min=curvdif_coef;//sasan*kmax_diff_min;
1471     double crikmax_max=curvdif_coef;//sasan*kmax_diff_max;
1472 sattarpa 658 cout<<"crikmin_min= "<<crikmin_min<<" crikmin_max= "<<crikmin_max<<" crikmax_min= "<<crikmax_min<<" crikmax_max= "<<crikmax_max<<endl;
1473 sattarpa 609 cout<<"lstkmin_diff.size()= "<<lstkmin_diff.size()<<endl;
1474     cout<<"lstkmax_diff.size()= "<<lstkmax_diff.size()<<endl;
1475 sattarpa 650
1476     cout<<"for Kmin"<<endl;
1477 sattarpa 761 int Kmin_positive_nb=0;
1478     double Kmin_positive_mean=0.;
1479     double Kmin_positive_stdev=0.;
1480     int Kmin_negative_nb=0;
1481     double Kmin_negative_mean=0.;
1482     double Kmin_negative_stdev=0.;
1483     for (itlstkmin_diff=lstkmin_diff.begin();itlstkmin_diff!=lstkmin_diff.end();itlstkmin_diff++)
1484     {
1485     if(((*itlstkmin_diff).first)>=0.)
1486     {
1487     Kmin_positive_nb++;
1488     Kmin_positive_mean += (*itlstkmin_diff).first;
1489     }
1490     if(((*itlstkmin_diff).first)<=0.)
1491     {
1492     Kmin_negative_nb++;
1493     Kmin_negative_mean += (*itlstkmin_diff).first;
1494     }
1495     }
1496     Kmin_positive_mean /= (1.*Kmin_positive_nb);
1497     Kmin_negative_mean /= (1.*Kmin_negative_nb);
1498     cout<<"Kmin_positive_mean= "<<Kmin_positive_mean<<" Kmin_negative_mean= "<<Kmin_negative_mean<<endl;
1499    
1500 sattarpa 609 TPL_MAP_ENTITE<MG_NOEUD*> lstneipdefect;
1501     for (itlstkmin_diff=lstkmin_diff.begin();itlstkmin_diff!=lstkmin_diff.end();itlstkmin_diff++)
1502     {
1503     {
1504     if((crikmin_max<(*itlstkmin_diff).first) || (crikmin_min>(*itlstkmin_diff).first))
1505     {
1506     MG_NOEUD* piefect=(*itlstkmin_diff).second;
1507     int neindnb=lstneipdefect.get_nb();
1508     double search_radius1=search_radius;
1509     while(neindnb==0)
1510     {
1511 sattarpa 650 octreecad.rechercher(piefect->get_x(),piefect->get_y(),piefect->get_z(),search_radius1,lstneipdefect);
1512 sattarpa 609 neindnb=lstneipdefect.get_nb();
1513     search_radius1=search_radius1+0.1*search_radius;
1514     }
1515     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itndnei;
1516     for(MG_NOEUD* ndnei=lstneipdefect.get_premier(itndnei);ndnei!=NULL;ndnei=lstneipdefect.get_suivant(itndnei))
1517     {
1518     for(std::vector<double*>::iterator itlstpinsert=lstpinsert.begin();itlstpinsert!=lstpinsert.end();itlstpinsert++)
1519     {
1520     double* xyzpins;
1521     xyzpins=(*itlstpinsert);
1522 sattarpa 650 if(ndnei->get_x()==xyzpins[0] && ndnei->get_y()==xyzpins[1] && ndnei->get_z()==xyzpins[2])
1523     lstpinsert.erase(itlstpinsert);
1524 sattarpa 609 }
1525     }
1526     lstneipdefect.vide();
1527     }
1528     }
1529     }
1530     cout<<"for Kmax"<<endl;
1531 sattarpa 761 int Kmax_positive_nb=0;
1532     double Kmax_positive_mean=0.;
1533     double Kmax_positive_stdev=0.;
1534     int Kmax_negative_nb=0;
1535     double Kmax_negative_mean=0.;
1536     double Kmax_negative_stdev=0.;
1537 sattarpa 609 for (itlstkmax_diff=lstkmax_diff.begin();itlstkmax_diff!=lstkmax_diff.end();itlstkmax_diff++)
1538     {
1539 sattarpa 761 if(((*itlstkmax_diff).first)>=0.)
1540     {
1541     Kmax_positive_nb++;
1542     Kmax_positive_mean += (*itlstkmax_diff).first;
1543     }
1544     if(((*itlstkmax_diff).first)<=0.)
1545     {
1546     Kmax_negative_nb++;
1547     Kmax_negative_mean += (*itlstkmax_diff).first;
1548     }
1549     }
1550     Kmax_positive_mean /= (1.*Kmax_positive_nb);
1551     Kmax_negative_mean /= (1.*Kmax_negative_nb);
1552     cout<<"Kmax_positive_mean= "<<Kmax_positive_mean<<" Kmax_negative_mean= "<<Kmax_negative_mean<<endl;
1553    
1554     for (itlstkmax_diff=lstkmax_diff.begin();itlstkmax_diff!=lstkmax_diff.end();itlstkmax_diff++)
1555     {
1556 sattarpa 609 if((crikmax_max<(*itlstkmax_diff).first) || (crikmax_min>(*itlstkmax_diff).first))
1557     {
1558     MG_NOEUD* piefect=(*itlstkmax_diff).second;
1559     TPL_MAP_ENTITE<MG_NOEUD*> lstneipdefect;
1560     int neindnb=lstneipdefect.get_nb();
1561     double search_radius1=search_radius;
1562     while(neindnb==0)
1563     {
1564 sattarpa 650 octreecad.rechercher(piefect->get_x(),piefect->get_y(),piefect->get_z(),search_radius1,lstneipdefect);
1565 sattarpa 609 neindnb=lstneipdefect.get_nb();
1566     search_radius1=search_radius1+0.1*search_radius;
1567     }
1568     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itndnei;
1569     for(MG_NOEUD* ndnei=lstneipdefect.get_premier(itndnei);ndnei!=NULL;ndnei=lstneipdefect.get_suivant(itndnei))
1570     {
1571     for(std::vector<double*>::iterator itlstpinsert=lstpinsert.begin();itlstpinsert!=lstpinsert.end();itlstpinsert++)
1572     {
1573     double* xyzpins;
1574     xyzpins=(*itlstpinsert);
1575     if(ndnei->get_x()==xyzpins[0] && ndnei->get_y()==xyzpins[1] && ndnei->get_z()==xyzpins[2])
1576     lstpinsert.erase(itlstpinsert);
1577     }
1578     }
1579    
1580     }
1581     }
1582 sattarpa 650 }
1583     if (relet_curvature>0)
1584     {
1585     //criterion
1586 sattarpa 658 multimap<double,MG_NOEUD*,std::greater<double> >::reverse_iterator ritlstkmin_relt_diff=lstkmin_relt_diff.rbegin();
1587     multimap<double,MG_NOEUD*,std::greater<double> >::reverse_iterator ritlstkmax_relt_diff=lstkmax_relt_diff.rbegin();
1588     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmin_relt_diff=lstkmin_relt_diff.begin();
1589     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmax_relt_diff=lstkmax_relt_diff.begin();
1590     double kmin_relt_diff_min=(*ritlstkmin_relt_diff).first;
1591     double kmin_relt_diff_max=(*itlstkmin_relt_diff).first;
1592     double kmax_relt_diff_min=(*ritlstkmax_relt_diff).first;
1593     double kmax_relt_diff_max=(*itlstkmax_relt_diff).first;
1594     cout<<"kmin_relt_diff_min= "<<kmin_relt_diff_min<<" kmin_relt_diff_max= "<<kmin_relt_diff_max<<endl;
1595     cout<<"kmax_relt_diff_min= "<<kmax_relt_diff_min<<" kmax_relt_diff_max= "<<kmax_relt_diff_max<<endl;
1596 sattarpa 761
1597     double crikmin_min;
1598     double crikmin_max;
1599     double crikmax_min;
1600     double crikmax_max;
1601 sattarpa 673
1602 sattarpa 658 cout<<"crikmin_min= "<<crikmin_min<<" crikmin_max= "<<crikmin_max<<" crikmax_min= "<<crikmax_min<<" crikmax_max= "<<crikmax_max<<endl;
1603 sattarpa 650 cout<<"lstkmin_diff.size()= "<<lstkmin_diff.size()<<endl;
1604     cout<<"lstkmax_diff.size()= "<<lstkmax_diff.size()<<endl;
1605    
1606 sattarpa 658 cout<<"for Kmin_relet_diff"<<endl;
1607     cout<<"lstkmin_relt_diff.size()= "<<lstkmin_relt_diff.size()<<endl;
1608 sattarpa 761 int Kmin_positive_nb=0;
1609     double Kmin_positive_mean=0.;
1610     double Kmin_positive_stdev=0.;
1611     int Kmin_negative_nb=0;
1612     double Kmin_negative_mean=0.;
1613     double Kmin_negative_stdev=0.;
1614     int kmin_nb=0;
1615     double kmin_mean=0.;
1616 sattarpa 650 for (itlstkmin_relt_diff=lstkmin_relt_diff.begin();itlstkmin_relt_diff!=lstkmin_relt_diff.end();itlstkmin_relt_diff++)
1617     {
1618 sattarpa 761 kmin_nb++;
1619     kmin_mean += (*itlstkmin_relt_diff).first;
1620     if(((*itlstkmin_relt_diff).first)>=0.)
1621 sattarpa 650 {
1622 sattarpa 761 Kmin_positive_nb++;
1623     Kmin_positive_mean += (*itlstkmin_relt_diff).first;
1624     }
1625     if(((*itlstkmin_relt_diff).first)<=0.)
1626     {
1627     Kmin_negative_nb++;
1628     Kmin_negative_mean += (*itlstkmin_relt_diff).first;
1629     }
1630     }
1631     Kmin_positive_mean /= (1.*Kmin_positive_nb);
1632     Kmin_negative_mean /= (1.*Kmin_negative_nb);
1633     kmin_mean /= (1.*kmin_nb);
1634     cout<<"Kmin_positive_mean= "<<Kmin_positive_mean<<" Kmin_negative_mean= "<<Kmin_negative_mean<<" Kmin_mean= "<<kmin_mean<<endl;
1635     crikmin_min=curvdif_coef*Kmin_negative_mean;
1636     crikmin_max=curvdif_coef*Kmin_positive_mean;
1637    
1638    
1639     for (itlstkmin_relt_diff=lstkmin_relt_diff.begin();itlstkmin_relt_diff!=lstkmin_relt_diff.end();itlstkmin_relt_diff++)
1640     {
1641 sattarpa 650 if((crikmin_max<(*itlstkmin_relt_diff).first) || (crikmin_min>(*itlstkmin_relt_diff).first))
1642     {
1643     MG_NOEUD* piefect=(*itlstkmin_relt_diff).second;
1644 sattarpa 761 TPL_MAP_ENTITE<MG_NOEUD*> lstneipdefect;
1645     /*int neindnb=lstneipdefect.get_nb();
1646     double search_radius1=1.;
1647 sattarpa 650 while(neindnb==0)
1648     {
1649     octreecad.rechercher(piefect->get_x(),piefect->get_y(),piefect->get_z(),search_radius1,lstneipdefect);
1650     neindnb=lstneipdefect.get_nb();
1651 sattarpa 761 search_radius1=search_radius1+0.1*1.;
1652     }*/
1653     for (int itt=0;itt<piefect->get_lien_segment()->get_nb();itt++)
1654     {
1655     MG_SEGMENT* segpiefect=piefect->get_lien_segment()->get(itt);
1656     if (segpiefect->get_noeud1()!=piefect)
1657     lstneipdefect.ajouter(segpiefect->get_noeud1());
1658     else if (segpiefect->get_noeud2()!=piefect)
1659     lstneipdefect.ajouter(segpiefect->get_noeud2());
1660 sattarpa 650 }
1661 sattarpa 761
1662    
1663 sattarpa 650 TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itndnei;
1664 sattarpa 761 int locnd_nb=0;
1665     double loc_curv=0.;
1666 sattarpa 650 for(MG_NOEUD* ndnei=lstneipdefect.get_premier(itndnei);ndnei!=NULL;ndnei=lstneipdefect.get_suivant(itndnei))
1667     {
1668 sattarpa 761 double curv=0.;
1669     if(ndnei!=piefect)
1670     {
1671     for (multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmin_relt_diffnei=lstkmin_relt_diff.begin();itlstkmin_relt_diffnei!=lstkmin_relt_diff.end();itlstkmin_relt_diffnei++)
1672     {
1673     if ((*itlstkmin_relt_diffnei).second==ndnei)
1674     {
1675     locnd_nb++;
1676     curv += (*itlstkmin_relt_diffnei).first;
1677     }
1678     }
1679     }
1680     curv /= locnd_nb;
1681     loc_curv=curv;
1682     }
1683    
1684     int pass_kmin=0;
1685     if ((*itlstkmin_relt_diff).first>=0)
1686     {
1687     if((*itlstkmin_relt_diff).first<=4.*loc_curv)
1688     pass_kmin++;
1689     }
1690     else if ((*itlstkmin_relt_diff).first<=0)
1691     {
1692     if((*itlstkmin_relt_diff).first>=4.*loc_curv)
1693     pass_kmin++;
1694     }
1695     if (pass_kmin>0)//(loc_curv>(0.2*(*itlstkmin_relt_diff).first) || loc_curv<(0.2*(*itlstkmin_relt_diff).first))
1696     {
1697     cout<<"loc_curv= "<<loc_curv<<" (*itlstkmin_relt_diff).first= "<<(*itlstkmin_relt_diff).first<<endl;
1698     TPL_MAP_ENTITE<MG_NOEUD*> lstneipdefect2;
1699     int neindnb2=lstneipdefect2.get_nb();
1700     double search_radius2=search_radius;
1701     while(neindnb2==0)
1702     {
1703     octreecad.rechercher(piefect->get_x(),piefect->get_y(),piefect->get_z(),search_radius2,lstneipdefect2);
1704     neindnb2=lstneipdefect2.get_nb();
1705     search_radius2=search_radius2+0.1*search_radius;
1706     }
1707     for(MG_NOEUD* ndnei=lstneipdefect2.get_premier(itndnei);ndnei!=NULL;ndnei=lstneipdefect2.get_suivant(itndnei))
1708     {
1709     double curv=0.;
1710     for (multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmin_relt_diffnei=lstkmin_relt_diff.begin();itlstkmin_relt_diffnei!=lstkmin_relt_diff.end();itlstkmin_relt_diffnei++)
1711     {
1712     if ((*itlstkmin_relt_diffnei).second==ndnei)
1713     {
1714     curv =(*itlstkmin_relt_diffnei).first;
1715     }
1716     }
1717     if(crikmin_max<curv || crikmin_min>curv)
1718     {
1719 sattarpa 650 for(std::vector<double*>::iterator itlstpinsert=lstpinsert.begin();itlstpinsert!=lstpinsert.end();itlstpinsert++)
1720     {
1721     double* xyzpins;
1722     xyzpins=(*itlstpinsert);
1723     if(ndnei->get_x()==xyzpins[0] && ndnei->get_y()==xyzpins[1] && ndnei->get_z()==xyzpins[2])
1724 sattarpa 658 {
1725 sattarpa 650 lstpinsert.erase(itlstpinsert);
1726 sattarpa 658 itlstpinsert=lstpinsert.begin();
1727     }
1728 sattarpa 761 }
1729 sattarpa 650 }
1730     }
1731     lstneipdefect.vide();
1732 sattarpa 761 }
1733 sattarpa 650 }
1734     }
1735 sattarpa 658 cout<<"for Kmax_relet_diff"<<endl;
1736 sattarpa 761 int Kmax_positive_nb=0;
1737     double Kmax_positive_mean=0.;
1738     double Kmax_positive_stdev=0.;
1739     int Kmax_negative_nb=0;
1740     double Kmax_negative_mean=0.;
1741     double Kmax_negative_stdev=0.;
1742     int Kmax_nb=0;
1743     double Kmax_mean=0.;
1744 sattarpa 650 for (itlstkmax_relt_diff=lstkmax_relt_diff.begin();itlstkmax_relt_diff!=lstkmax_relt_diff.end();itlstkmax_relt_diff++)
1745     {
1746 sattarpa 761 Kmax_nb++;
1747     Kmax_mean += (*itlstkmax_relt_diff).first;
1748     if(((*itlstkmax_relt_diff).first)>=0.)
1749     {
1750     Kmax_positive_nb++;
1751     Kmax_positive_mean += (*itlstkmax_relt_diff).first;
1752     }
1753     if(((*itlstkmax_relt_diff).first)<=0.)
1754     {
1755     Kmax_negative_nb++;
1756     Kmax_negative_mean += (*itlstkmax_relt_diff).first;
1757     }
1758     }
1759     Kmax_positive_mean /= (1.*Kmax_positive_nb);
1760     Kmax_negative_mean /= (1.*Kmax_negative_nb);
1761     Kmax_mean /= (1.*Kmax_nb);
1762     cout<<"Kmax_positive_mean= "<<Kmax_positive_mean<<" Kmax_negative_mean= "<<Kmax_negative_mean<<" Kmax_mean= "<<Kmax_mean<<endl;
1763     crikmax_min=curvdif_coef*Kmax_negative_mean;
1764     crikmax_max=curvdif_coef*Kmax_positive_mean;
1765    
1766     for (itlstkmax_relt_diff=lstkmax_relt_diff.begin();itlstkmax_relt_diff!=lstkmax_relt_diff.end();itlstkmax_relt_diff++)
1767     {
1768 sattarpa 650 if((crikmax_max<(*itlstkmax_relt_diff).first) || (crikmax_min>(*itlstkmax_relt_diff).first))
1769     {
1770     MG_NOEUD* piefect=(*itlstkmax_relt_diff).second;
1771     TPL_MAP_ENTITE<MG_NOEUD*> lstneipdefect;
1772 sattarpa 761 /*int neindnb=lstneipdefect.get_nb();
1773     double search_radius1=1.;
1774 sattarpa 650 while(neindnb==0)
1775     {
1776     octreecad.rechercher(piefect->get_x(),piefect->get_y(),piefect->get_z(),search_radius1,lstneipdefect);
1777     neindnb=lstneipdefect.get_nb();
1778 sattarpa 761 search_radius1=search_radius1+0.1*1.;
1779     }*/
1780     for (int itt=0;itt<piefect->get_lien_segment()->get_nb();itt++)
1781     {
1782     MG_SEGMENT* segpiefect=piefect->get_lien_segment()->get(itt);
1783     if (segpiefect->get_noeud1()!=piefect)
1784     lstneipdefect.ajouter(segpiefect->get_noeud1());
1785     else if (segpiefect->get_noeud2()!=piefect)
1786     lstneipdefect.ajouter(segpiefect->get_noeud2());
1787 sattarpa 650 }
1788 sattarpa 761
1789    
1790 sattarpa 650 TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itndnei;
1791 sattarpa 761 int locnd_nb=0;
1792     double loc_curv=0.;
1793 sattarpa 650 for(MG_NOEUD* ndnei=lstneipdefect.get_premier(itndnei);ndnei!=NULL;ndnei=lstneipdefect.get_suivant(itndnei))
1794     {
1795 sattarpa 761 double curv=0.;
1796     if(ndnei!=piefect)
1797     {
1798     for (multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmax_relt_diffnei=lstkmax_relt_diff.begin();itlstkmax_relt_diffnei!=lstkmax_relt_diff.end();itlstkmax_relt_diffnei++)
1799     {
1800     if ((*itlstkmax_relt_diffnei).second==ndnei)
1801     {
1802     locnd_nb++;
1803     curv += (*itlstkmax_relt_diffnei).first;
1804     }
1805     }
1806     }
1807     curv /= locnd_nb;
1808     loc_curv=curv;
1809     }
1810    
1811     int pass_kmax=0;
1812     if ((*itlstkmax_relt_diff).first>=0)
1813     {
1814     if((*itlstkmax_relt_diff).first<=4.*loc_curv)
1815     pass_kmax++;
1816     }
1817     else if ((*itlstkmax_relt_diff).first<=0)
1818     {
1819     if((*itlstkmax_relt_diff).first>=4.*loc_curv)
1820     pass_kmax++;
1821     }
1822    
1823     if (pass_kmax>0)
1824     {
1825     cout<<"loc_curv= "<<loc_curv<<" (*itlstkmax_relt_diff).first= "<<(*itlstkmax_relt_diff).first<<endl;
1826     TPL_MAP_ENTITE<MG_NOEUD*> lstneipdefect2;
1827     int neindnb2=lstneipdefect2.get_nb();
1828     double search_radius2=search_radius;
1829     while(neindnb2==0)
1830     {
1831     octreecad.rechercher(piefect->get_x(),piefect->get_y(),piefect->get_z(),search_radius2,lstneipdefect2);
1832     neindnb2=lstneipdefect2.get_nb();
1833     search_radius2=search_radius2+0.1*search_radius;
1834     }
1835     for(MG_NOEUD* ndnei=lstneipdefect2.get_premier(itndnei);ndnei!=NULL;ndnei=lstneipdefect2.get_suivant(itndnei))
1836     {
1837     double curv=0.;
1838     for (multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmax_relt_diffnei=lstkmax_relt_diff.begin();itlstkmax_relt_diffnei!=lstkmax_relt_diff.end();itlstkmax_relt_diffnei++)
1839     {
1840     if ((*itlstkmax_relt_diffnei).second==ndnei)
1841     {
1842     curv=(*itlstkmax_relt_diffnei).first;
1843     }
1844     }
1845     if(crikmax_max<curv || crikmax_min>curv)
1846     {
1847 sattarpa 650 for(std::vector<double*>::iterator itlstpinsert=lstpinsert.begin();itlstpinsert!=lstpinsert.end();itlstpinsert++)
1848     {
1849     double* xyzpins;
1850     xyzpins=(*itlstpinsert);
1851     if(ndnei->get_x()==xyzpins[0] && ndnei->get_y()==xyzpins[1] && ndnei->get_z()==xyzpins[2])
1852 sattarpa 658 {
1853     lstpinsert.erase(itlstpinsert);
1854     itlstpinsert=lstpinsert.begin();
1855     }
1856 sattarpa 650 }
1857 sattarpa 761 }
1858 sattarpa 650 }
1859 sattarpa 761 }
1860 sattarpa 650 }
1861     }
1862     }
1863 sattarpa 609 FILE* in2=fopen(out_gnifinspointfile_removondefect,"wt");
1864 sattarpa 655 int countfuck=0;
1865 sattarpa 609 for(std::vector<double*>::iterator itlstpinsert=lstpinsert.begin();itlstpinsert!=lstpinsert.end();itlstpinsert++)
1866     {
1867     double* xyzpins1;
1868     xyzpins1=(*itlstpinsert);
1869 sattarpa 658 fprintf(in2,"%le %le %le %le %le %le\n",xyzpins1[0],xyzpins1[1],xyzpins1[2],xyzpins1[3]*1000.,xyzpins1[4]*1000.,xyzpins1[5]*1000.);
1870 sattarpa 609 }
1871 sattarpa 650 fclose(in2);
1872 sattarpa 609 }
1873     void CRIAQOPERATORS::vm_crit_remvsmp(int femmeshno,char* magicfilename,int femsolid,int femsubsolno,char* gnifinspointfile,char* out_gnifinspointfile_removondefect,double search_radius,double vm_coef)
1874     {
1875 sattarpa 554 MG_FILE gest(magicfilename);
1876 sattarpa 596 FEM_MAILLAGE* femmai;
1877     if (femmeshno==0) femmai=gest.get_fem_maillage(femmeshno); else femmai=gest.get_fem_maillageid(femmeshno);
1878     FEM_SOLUTION* femsol=gest.get_fem_solutionid(femsolid);
1879     femsol->active_solution(femsubsolno);
1880    
1881     std::map<double,FEM_NOEUD*,std::greater<double> > mpsol;
1882     LISTE_FEM_NOEUD::iterator itfemnds;
1883     for(FEM_NOEUD* nod=femmai->get_premier_noeud(itfemnds);nod!=NULL;nod=femmai->get_suivant_noeud(itfemnds))
1884     {
1885 sattarpa 761 //if(((MG_NOEUD*) nod->get_mg_element_maillage())->get_origine()==IMPOSE) // only calculate VM_mean for inserted nodes its good for models with noise but not good for models without noise
1886     mpsol.insert(pair<double,FEM_NOEUD*> (nod->get_solution(),nod));
1887    
1888 sattarpa 596 }
1889 sattarpa 761 std::map<double,FEM_NOEUD*,std::greater<double> >::iterator itmpsol;
1890     double vm_sum=0.;
1891     for(itmpsol=mpsol.begin();itmpsol!=mpsol.end();itmpsol++)
1892     {
1893     double vm=(*itmpsol).first;
1894     vm_sum=vm_sum+vm;
1895     }
1896     double vm_mean=vm_sum/(mpsol.size());
1897     double vm_sigma=0.;
1898     for(itmpsol=mpsol.begin();itmpsol!=mpsol.end();itmpsol++)
1899     {
1900     double vm=(*itmpsol).first;
1901     vm_sigma=vm_sigma+((vm-vm_mean)*(vm-vm_mean));
1902     }
1903     vm_sigma=vm_sigma/(mpsol.size());
1904     double vm_stdev=sqrt(vm_sigma);
1905     itmpsol=mpsol.begin();
1906 sattarpa 596
1907 sattarpa 761 cout<<"VM_maximum= "<<(*itmpsol).first<<" vm_stdev= "<<vm_stdev<<" vm_mean= "<<vm_mean<<" VM_max_overSD= "<<(vm_mean/(vm_mean+vm_stdev)) <<" VM_difmax-vmsdoverVM___= "<<((*itmpsol).first-vm_stdev)/(((*itmpsol).first)/vm_mean)<<" VM___= "<<(((*itmpsol).first)/vm_mean)<<" 3*vm_stdev= "<<3*vm_stdev<<endl;
1908     double crit=vm_coef*(vm_mean+(vm_stdev*(vm_mean/(vm_mean+vm_stdev))));//(vm_mean/(vm_mean+vm_stdev))*vm_stdev;
1909 sattarpa 673 cout<<"critreion value= "<<crit<<endl;
1910 sattarpa 596 std::vector<double*> lstpinsert;
1911     double prop=0.001;
1912     FILE *in=fopen(gnifinspointfile,"rt");
1913     if (in==NULL) cout<<"file is not available"<<endl;
1914     while (!feof(in))
1915     {
1916     char chaine[500];
1917 sattarpa 655 char* res=fgets(chaine,500,in);
1918     if(res!=NULL)
1919     {
1920 sattarpa 596 double x,y,z;
1921     double q1,q2,q3;
1922     int nb=sscanf(chaine,"%le %le %le %le %le %le",&x,&y,&z,&q1,&q2,&q3);
1923     q1=prop*q1;
1924     q2=prop*q2;
1925     q3=prop*q3;
1926     if (nb!=-1 && nb!=6) cout<<"Wrong file format"<<endl;
1927     else if (nb==6)
1928     {
1929     double* pcoordbc=new double[6];
1930     pcoordbc[0]=x; pcoordbc[1]=y; pcoordbc[2]=z; pcoordbc[3]=q1; pcoordbc[4]=q2; pcoordbc[5]=q3;
1931     lstpinsert.push_back(pcoordbc);
1932     }
1933 sattarpa 655 }
1934 sattarpa 596 }
1935     fclose(in);
1936    
1937    
1938     //octree initialization
1939     double xmin=1e308,ymin=1e308,zmin=1e308,xmax=-1e308,ymax=-1e308,zmax=-1e308;
1940     TPL_MAP_ENTITE<FEM_NOEUD*> lstnoeud;
1941     LISTE_FEM_NOEUD::iterator it;
1942     for (FEM_NOEUD* no=femmai->get_premier_noeud(it);no!=NULL;no=femmai->get_suivant_noeud(it))
1943     {
1944     if (no->get_x()<xmin) xmin=no->get_x();
1945     if (no->get_y()<ymin) ymin=no->get_y();
1946     if (no->get_z()<zmin) zmin=no->get_z();
1947     if (no->get_x()>xmax) xmax=no->get_x();
1948     if (no->get_y()>ymax) ymax=no->get_y();
1949     if (no->get_z()>zmax) zmax=no->get_z();
1950     lstnoeud.ajouter(no);
1951     }
1952     OT_VECTEUR_3D vecmin(xmin,ymin,zmin);OT_VECTEUR_3D vecmmax(xmax,ymax,zmax);
1953     OT_VECTEUR_3D vec(vecmmax,vecmin);
1954    
1955     OT_VECTEUR_3D min(xmin,ymin,zmin); OT_VECTEUR_3D max(xmax,ymax,zmax); OT_VECTEUR_3D average=(min+max)/2.; OT_VECTEUR_3D lengthvec(min,max);
1956     double length=sqrt(lengthvec*lengthvec); double bxr=1.1;
1957     xmin=average.get_x()-(length*bxr);ymin=average.get_y()-(length*bxr);zmin=average.get_z()-(length*bxr);
1958     xmax=average.get_x()+(length*bxr);ymax=average.get_y()+(length*bxr);zmax=average.get_z()+(length*bxr);
1959    
1960     TPL_OCTREE<FEM_NOEUD*,FEM_NOEUD*> octree;
1961     octree.initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
1962     for (FEM_NOEUD* no=femmai->get_premier_noeud(it);no!=NULL;no=femmai->get_suivant_noeud(it))
1963     octree.inserer(no);
1964    
1965     for (itmpsol=mpsol.begin();itmpsol!=mpsol.end();itmpsol++)
1966     {
1967     if(crit<(*itmpsol).first)
1968     {
1969     FEM_NOEUD* pdefect=(*itmpsol).second;
1970     TPL_MAP_ENTITE<FEM_NOEUD*> lstneipdefect;
1971     int neindnb=lstneipdefect.get_nb();
1972 sattarpa 609 double search_radius1=search_radius;
1973 sattarpa 596 while(neindnb==0)
1974     {
1975 sattarpa 609 octree.rechercher(pdefect->get_x(),pdefect->get_y(),pdefect->get_z(),search_radius1,lstneipdefect);
1976 sattarpa 596 neindnb=lstneipdefect.get_nb();
1977 sattarpa 609 search_radius1=search_radius1+0.1*search_radius;
1978 sattarpa 596 }
1979     TPL_MAP_ENTITE<FEM_NOEUD*>::ITERATEUR itfendnei;
1980     for(FEM_NOEUD* fendnei=lstneipdefect.get_premier(itfendnei);fendnei!=NULL;fendnei=lstneipdefect.get_suivant(itfendnei))
1981     {
1982     // std::map<double*,double*,std::less<double*> >::iterator itlstpinsert=lstpinsert.begin();//itlstpinsert!=lstpinsert.end();itlstpinsert++
1983     for(std::vector<double*>::iterator itlstpinsert=lstpinsert.begin();itlstpinsert!=lstpinsert.end();itlstpinsert++)
1984     {
1985     double* xyzpins;
1986     xyzpins=(*itlstpinsert);
1987     if(fendnei->get_x()==xyzpins[0] && fendnei->get_y()==xyzpins[1] && fendnei->get_z()==xyzpins[2])
1988     {
1989     lstpinsert.erase(itlstpinsert);
1990 sattarpa 658 itlstpinsert=lstpinsert.begin();
1991 sattarpa 596 }
1992     }
1993     }
1994    
1995     }
1996    
1997     }
1998    
1999     FILE* in1=fopen(out_gnifinspointfile_removondefect,"wt");
2000     for(std::vector<double*>::iterator itlstpinsert=lstpinsert.begin();itlstpinsert!=lstpinsert.end();itlstpinsert++)
2001     {
2002     double* xyzpins1;
2003     xyzpins1=(*itlstpinsert);
2004 sattarpa 658 fprintf(in1,"%le %le %le %le %le %le\n",xyzpins1[0],xyzpins1[1],xyzpins1[2],xyzpins1[3]*1000.,xyzpins1[4]*1000.,xyzpins1[5]*1000.);
2005 sattarpa 596 }
2006     fclose(in1);
2007     }
2008     void CRIAQOPERATORS::surfmaker_e1(char* outputfilename,int meshno,char* magicfilename)
2009     {
2010     MG_FILE gest(magicfilename);
2011 sattarpa 554 MG_GEOMETRIE* geo=gest.get_mg_geometrie(0);
2012     MG_MAILLAGE* mai;
2013     if (meshno==0) mai=gest.get_mg_maillage(meshno); else mai=gest.get_mg_maillageid(meshno);
2014     //MG_FILE gest((char*)"longflxprtwithpockets_3d_3mm.magic");
2015     //MG_GEOMETRIE* geo=gest.get_mg_geometrieid(1);
2016     //MG_MAILLAGE* mai=gest.get_mg_maillageid(5674824);
2017     MG_GESTIONNAIRE* gestnew=new MG_GESTIONNAIRE();
2018     MG_GEOMETRIE* geonew=mai->get_mg_geometrie();
2019     gestnew->ajouter_mg_geometrie(geonew);
2020     MG_MAILLAGE* mainew=new MG_MAILLAGE(geonew);
2021     gestnew->ajouter_mg_maillage(mainew);
2022    
2023     LISTE_MG_NOEUD::iterator itnod;
2024     for (MG_NOEUD* vertices=mai->get_premier_noeud(itnod);vertices!=NULL;vertices=mai->get_suivant_noeud(itnod))
2025     {
2026     MG_ELEMENT_TOPOLOGIQUE *topnd=vertices->get_lien_topologie();
2027     MG_FACE* facevert=(MG_FACE*) (vertices->get_lien_topologie());
2028     MG_ARETE* aretver=(MG_ARETE*) (vertices->get_lien_topologie());
2029     MG_SOMMET* sometver=(MG_SOMMET*) (vertices->get_lien_topologie());
2030 sattarpa 596
2031     if(facevert->get_id()==76
2032     || aretver->get_id()==84 || aretver->get_id()==103|| aretver->get_id()==91|| aretver->get_id()==13 || aretver->get_id()==110||aretver->get_id()==98
2033     || aretver->get_id()==81 || aretver->get_id()==83 || aretver->get_id()==10|| aretver->get_id()==12|| aretver->get_id()==90|| aretver->get_id()==97
2034     /* facevert->get_id()==133
2035 sattarpa 554 || aretver->get_id()==355 || aretver->get_id()==362|| aretver->get_id()==374|| aretver->get_id()==298 || aretver->get_id()==291||aretver->get_id()==338
2036     || aretver->get_id()==326 || aretver->get_id()==333|| aretver->get_id()==319|| aretver->get_id()==312 || aretver->get_id()==305||aretver->get_id()==169
2037     || aretver->get_id()==162 || aretver->get_id()==141|| aretver->get_id()==174|| aretver->get_id()==148 || aretver->get_id()==155||aretver->get_id()==217
2038     || aretver->get_id()==212 || aretver->get_id()==191|| aretver->get_id()==184|| aretver->get_id()==64 || aretver->get_id()==280||aretver->get_id()==32
2039     || aretver->get_id()==387 || aretver->get_id()==198|| aretver->get_id()==205|| aretver->get_id()==269 || aretver->get_id()==262||aretver->get_id()==234
2040     || aretver->get_id()==227 || aretver->get_id()==255|| aretver->get_id()==248|| aretver->get_id()==241 || aretver->get_id()==380||aretver->get_id()==96
2041     || aretver->get_id()==369 || aretver->get_id()==344|| aretver->get_id()==128|| aretver->get_id()==274
2042     || sometver->get_id()==368|| sometver->get_id()==361|| sometver->get_id()==106|| sometver->get_id()==122|| sometver->get_id()==74|| sometver->get_id()==90
2043     || sometver->get_id()==233|| sometver->get_id()==240|| sometver->get_id()==247|| sometver->get_id()==254|| sometver->get_id()==261|| sometver->get_id()==268
2044     || sometver->get_id()==226|| sometver->get_id()==224|| sometver->get_id()==190|| sometver->get_id()==197|| sometver->get_id()==204|| sometver->get_id()==211
2045     || sometver->get_id()==183|| sometver->get_id()==181|| sometver->get_id()==154|| sometver->get_id()==147|| sometver->get_id()==140|| sometver->get_id()==161
2046     || sometver->get_id()==168|| sometver->get_id()==138|| sometver->get_id()==318|| sometver->get_id()==311|| sometver->get_id()==304|| sometver->get_id()==297
2047     || sometver->get_id()==325|| sometver->get_id()==332|| sometver->get_id()==290|| sometver->get_id()==288|| sometver->get_id()==42|| sometver->get_id()==58
2048 sattarpa 596 || sometver->get_id()==352|| sometver->get_id()==354|| sometver->get_id()==10|| sometver->get_id()==26*/
2049    
2050     )
2051 sattarpa 554 {
2052     double x=vertices->get_x();
2053     double y=vertices->get_y();
2054     double z=vertices->get_z();
2055     //MG_NOEUD *newno=new MG_NOEUD(NULL,x,y,z,vertices->get_origine());
2056     MG_NOEUD *newno=new MG_NOEUD(vertices->get_lien_topologie(),x,y,z,vertices->get_origine());
2057     mainew->ajouter_mg_noeud(newno);
2058     vertices->change_nouveau_numero(newno->get_id()); // what does this do?
2059     }
2060     }
2061    
2062     LISTE_MG_SEGMENT::iterator itSeg;
2063     for (MG_SEGMENT * segment =mai->get_premier_segment(itSeg); segment; segment=mai->get_suivant_segment(itSeg))
2064     {
2065     //%275=NOEUD($10,93.94800850483597,-250.0000000000000,0.000000000000000,1010);
2066     //NOEUD linked with a topology (get_lien_topologie => $10 ) -> and %10=SOMMET(1,$9,0); %9=POINT_OCC(1);
2067     //%390=SEGMENT($13,$275,$277,1010); => %13=ARETE(3,$8,$14,$15,1,0); %275=NOEUD($10,93.94800850483597,-250.0000000000000,0.000000000000000,1010); %277=NOEUD($13,89.09047601136933,-249.4243468871926,0.000000000000000,1010);
2068     MG_FACE* faceseg=(MG_FACE*) (segment->get_lien_topologie());
2069     MG_ARETE* aretver=(MG_ARETE*) (segment->get_lien_topologie());
2070 sattarpa 596 if (faceseg->get_id()==76
2071     || aretver->get_id()==84 || aretver->get_id()==103|| aretver->get_id()==91|| aretver->get_id()==13 || aretver->get_id()==110||aretver->get_id()==98
2072     //faceseg->get_id()==133
2073     //|| aretver->get_id()==355 || aretver->get_id()==362|| aretver->get_id()==374|| aretver->get_id()==298 || aretver->get_id()==291||aretver->get_id()==338
2074     //|| aretver->get_id()==326 || aretver->get_id()==333|| aretver->get_id()==319|| aretver->get_id()==312 || aretver->get_id()==305||aretver->get_id()==169
2075     //|| aretver->get_id()==162 || aretver->get_id()==141|| aretver->get_id()==174|| aretver->get_id()==148 || aretver->get_id()==155||aretver->get_id()==217
2076     //|| aretver->get_id()==212 || aretver->get_id()==191|| aretver->get_id()==184|| aretver->get_id()==64 || aretver->get_id()==280||aretver->get_id()==32
2077     //|| aretver->get_id()==387 || aretver->get_id()==198|| aretver->get_id()==205|| aretver->get_id()==269 || aretver->get_id()==262||aretver->get_id()==234
2078     // || aretver->get_id()==227 || aretver->get_id()==255|| aretver->get_id()==248|| aretver->get_id()==241 || aretver->get_id()==380||aretver->get_id()==96
2079     // || aretver->get_id()==369 || aretver->get_id()==344|| aretver->get_id()==128|| aretver->get_id()==274
2080    
2081     )
2082 sattarpa 554 {
2083     MG_NOEUD* no1=mainew->get_mg_noeudid(segment->get_noeud1()->get_nouveau_numero());
2084     MG_NOEUD* no2=mainew->get_mg_noeudid(segment->get_noeud2()->get_nouveau_numero());
2085     MG_SEGMENT *seg=new MG_SEGMENT(segment->get_lien_topologie(),no1,no2,segment->get_origine());
2086     //MG_SEGMENT *seg=new MG_SEGMENT(NULL,no1,no2,segment->get_origine());
2087     mainew->ajouter_mg_segment(seg);
2088     }
2089     }
2090    
2091     LISTE_MG_TRIANGLE::iterator itTri;
2092     for (MG_TRIANGLE * triangle =mai->get_premier_triangle(itTri); triangle; triangle=mai->get_suivant_triangle(itTri))
2093     {
2094     MG_FACE* facetri=(MG_FACE*) (triangle->get_lien_topologie());
2095 sattarpa 596 if (facetri->get_id()==76)
2096 sattarpa 554 {
2097     MG_NOEUD* no1=mainew->get_mg_noeudid(triangle->get_noeud1()->get_nouveau_numero());
2098     MG_NOEUD* no2=mainew->get_mg_noeudid(triangle->get_noeud2()->get_nouveau_numero());
2099     MG_NOEUD* no3=mainew->get_mg_noeudid(triangle->get_noeud3()->get_nouveau_numero());
2100     mainew->ajouter_mg_triangle(triangle->get_lien_topologie(),no1,no2,no3,triangle->get_origine());
2101     }
2102     }
2103    
2104     //gestnew->enregistrer("scnsurf_longflxprtwithpockets_3d_3mm_8mmdef_0bump.magic");
2105     gestnew->enregistrer(outputfilename);
2106     //////////////////
2107    
2108     ////////////////////////
2109    
2110    
2111     /*
2112     mainew->supprimer_mg_triangleid(106625);
2113     mainew->supprimer_mg_triangleid(106662);
2114     mainew->supprimer_mg_triangleid(106626);
2115     mainew->supprimer_mg_triangleid(106701);
2116     mainew->supprimer_mg_triangleid(106702);
2117     mainew->supprimer_mg_triangleid(106639);*/
2118     //cout<<"output mesh no.= 495557 "<<endl;
2119     //gest.enregistrer("2dsurfmesh_cad.magic"); //CAD model output
2120     //scanned part output
2121    
2122    
2123     }
2124 sattarpa 596 void CRIAQOPERATORS::surfmaker_e2(char* outputfilename,int meshno,char* magicfilename)
2125 sattarpa 554 {
2126     // surfmeshgenerator a partially scanned (deformed CAD model) for GNIF examples for simple exam with hole (badisplacenmentvector + smplwithpocket)
2127     MG_FILE gest(magicfilename);
2128     MG_GEOMETRIE* geo=gest.get_mg_geometrie(0);
2129     MG_MAILLAGE* mai;
2130     if (meshno==0) mai=gest.get_mg_maillage(meshno); else mai=gest.get_mg_maillageid(meshno);
2131     //MG_FILE gest((char*)"2d_smplwithole_23mm.magic");
2132     //MG_GEOMETRIE* geo=gest.get_mg_geometrieid(1);
2133     //MG_MAILLAGE* mai=gest.get_mg_maillageid(1197);
2134     MG_GESTIONNAIRE* gestnew=new MG_GESTIONNAIRE();
2135     MG_GEOMETRIE* geonew=mai->get_mg_geometrie();
2136     gestnew->ajouter_mg_geometrie(geonew);
2137     MG_MAILLAGE* mainew=new MG_MAILLAGE(geonew);
2138     gestnew->ajouter_mg_maillage(mainew);
2139    
2140     LISTE_MG_NOEUD::iterator itnod;
2141     for (MG_NOEUD* vertices=mai->get_premier_noeud(itnod);vertices!=NULL;vertices=mai->get_suivant_noeud(itnod))
2142     {
2143     MG_ELEMENT_TOPOLOGIQUE *topnd=vertices->get_lien_topologie();
2144     MG_FACE* facevert=(MG_FACE*) (vertices->get_lien_topologie());
2145     MG_ARETE* aretver=(MG_ARETE*) (vertices->get_lien_topologie());
2146     MG_SOMMET* sometver=(MG_SOMMET*) (vertices->get_lien_topologie());
2147     if(facevert->get_id()==76
2148     || aretver->get_id()==84 || aretver->get_id()==103|| aretver->get_id()==91|| aretver->get_id()==98 || aretver->get_id()==13||aretver->get_id()==110
2149     || sometver->get_id()==10|| sometver->get_id()==12|| sometver->get_id()==81|| sometver->get_id()==83|| sometver->get_id()==90|| sometver->get_id()==97)
2150     {
2151     double x=vertices->get_x();
2152     double y=vertices->get_y();
2153     double z=vertices->get_z();
2154     //MG_NOEUD *newno=new MG_NOEUD(NULL,x,y,z,vertices->get_origine());
2155     MG_NOEUD *newno=new MG_NOEUD(vertices->get_lien_topologie(),x,y,z,vertices->get_origine());
2156     mainew->ajouter_mg_noeud(newno);
2157     vertices->change_nouveau_numero(newno->get_id()); // what does this do?
2158     }
2159     }
2160    
2161     LISTE_MG_SEGMENT::iterator itSeg;
2162     for (MG_SEGMENT * segment =mai->get_premier_segment(itSeg); segment; segment=mai->get_suivant_segment(itSeg))
2163     {
2164     //%275=NOEUD($10,93.94800850483597,-250.0000000000000,0.000000000000000,1010);
2165     //NOEUD linked with a topology (get_lien_topologie => $10 ) -> and %10=SOMMET(1,$9,0); %9=POINT_OCC(1);
2166     //%390=SEGMENT($13,$275,$277,1010); => %13=ARETE(3,$8,$14,$15,1,0); %275=NOEUD($10,93.94800850483597,-250.0000000000000,0.000000000000000,1010); %277=NOEUD($13,89.09047601136933,-249.4243468871926,0.000000000000000,1010);
2167     MG_FACE* faceseg=(MG_FACE*) (segment->get_lien_topologie());
2168     //cout<<"faceseg->get_id()= "<<faceseg->get_id()<<endl;
2169     MG_ARETE* aretver=(MG_ARETE*) (segment->get_lien_topologie());
2170     //cout<<"aretver->get_id()= "<<aretver->get_id()<<endl;
2171     if (faceseg->get_id()==76 ||
2172     aretver->get_id()==84 || aretver->get_id()==103|| aretver->get_id()==91|| aretver->get_id()==98 || aretver->get_id()==13|| aretver->get_id()==110)
2173     {
2174     MG_NOEUD* no1=mainew->get_mg_noeudid(segment->get_noeud1()->get_nouveau_numero());
2175     MG_NOEUD* no2=mainew->get_mg_noeudid(segment->get_noeud2()->get_nouveau_numero());
2176     MG_SEGMENT *seg=new MG_SEGMENT(segment->get_lien_topologie(),no1,no2,segment->get_origine());
2177     //MG_SEGMENT *seg=new MG_SEGMENT(NULL,no1,no2,segment->get_origine());
2178     mainew->ajouter_mg_segment(seg);
2179     }
2180     }
2181    
2182     LISTE_MG_TRIANGLE::iterator itTri;
2183     for (MG_TRIANGLE * triangle =mai->get_premier_triangle(itTri); triangle; triangle=mai->get_suivant_triangle(itTri))
2184     {
2185     MG_FACE* facetri=(MG_FACE*) (triangle->get_lien_topologie());
2186     if (facetri->get_id()==76)
2187     {
2188     MG_NOEUD* no1=mainew->get_mg_noeudid(triangle->get_noeud1()->get_nouveau_numero());
2189     MG_NOEUD* no2=mainew->get_mg_noeudid(triangle->get_noeud2()->get_nouveau_numero());
2190     MG_NOEUD* no3=mainew->get_mg_noeudid(triangle->get_noeud3()->get_nouveau_numero());
2191     mainew->ajouter_mg_triangle(triangle->get_lien_topologie(),no1,no2,no3,triangle->get_origine());
2192     }
2193     }
2194    
2195     //gestnew->enregistrer("cadsurfmsh_smplwithole_23mm.magic");
2196     gestnew->enregistrer(outputfilename);
2197     }
2198 sattarpa 596 void CRIAQOPERATORS::surfmaker_e2t(char* outputfilename,int meshno,char* magicfilename)
2199 sattarpa 554 {
2200     // surfmeshgenerator a partially scanned (deformed CAD model) for GNIF examples for simple exam with hole (badisplacenmentvector + smplwithpocket)
2201     MG_FILE gest(magicfilename);
2202     MG_GEOMETRIE* geo=gest.get_mg_geometrie(0);
2203     MG_MAILLAGE* mai;
2204     if (meshno==0) mai=gest.get_mg_maillage(meshno); else mai=gest.get_mg_maillageid(meshno);
2205     //MG_FILE gest((char*)"2d_smplwithole_23mm.magic");
2206     //MG_GEOMETRIE* geo=gest.get_mg_geometrieid(1);
2207     //MG_MAILLAGE* mai=gest.get_mg_maillageid(1197);
2208     MG_GESTIONNAIRE* gestnew=new MG_GESTIONNAIRE();
2209     MG_GEOMETRIE* geonew=mai->get_mg_geometrie();
2210     gestnew->ajouter_mg_geometrie(geonew);
2211     MG_MAILLAGE* mainew=new MG_MAILLAGE(geonew);
2212     gestnew->ajouter_mg_maillage(mainew);
2213    
2214     LISTE_MG_NOEUD::iterator itnod;
2215     for (MG_NOEUD* vertices=mai->get_premier_noeud(itnod);vertices!=NULL;vertices=mai->get_suivant_noeud(itnod))
2216     {
2217     MG_ELEMENT_TOPOLOGIQUE *topnd=vertices->get_lien_topologie();
2218     MG_FACE* facevert=(MG_FACE*) (vertices->get_lien_topologie());
2219     MG_ARETE* aretver=(MG_ARETE*) (vertices->get_lien_topologie());
2220     MG_SOMMET* sometver=(MG_SOMMET*) (vertices->get_lien_topologie());
2221     if(facevert->get_id()==37
2222     || aretver->get_id()==20 || aretver->get_id()==108|| aretver->get_id()==113|| aretver->get_id()==101 || aretver->get_id()==59||aretver->get_id()==64
2223     || aretver->get_id()==45 || aretver->get_id()==52|| aretver->get_id()==93|| aretver->get_id()==74 || aretver->get_id()==81||aretver->get_id()==88
2224     || sometver->get_id()==10|| sometver->get_id()==19|| sometver->get_id()==51|| sometver->get_id()==58|| sometver->get_id()==42|| sometver->get_id()==44
2225     || sometver->get_id()==87|| sometver->get_id()==73|| sometver->get_id()==80|| sometver->get_id()==71|| sometver->get_id()==100|| sometver->get_id()==107
2226     //for e2t
2227     //|| aretver->get_id()==20 || aretver->get_id()==141|| aretver->get_id()==129|| aretver->get_id()==136 || aretver->get_id()==66||aretver->get_id()==59
2228     //|| aretver->get_id()==73 || aretver->get_id()==78|| aretver->get_id()==45|| aretver->get_id()==52 || aretver->get_id()==95||aretver->get_id()==102
2229     //|| aretver->get_id()==88 || aretver->get_id()==121|| aretver->get_id()==116|| aretver->get_id()==109
2230     //|| sometver->get_id()==10|| sometver->get_id()==19|| sometver->get_id()==65|| sometver->get_id()==58|| sometver->get_id()==51|| sometver->get_id()==42
2231     //|| sometver->get_id()==44|| sometver->get_id()==72|| sometver->get_id()==115|| sometver->get_id()==87|| sometver->get_id()==108|| sometver->get_id()==101
2232     //|| sometver->get_id()==94|| sometver->get_id()==85|| sometver->get_id()==128|| sometver->get_id()==135
2233     )
2234     {
2235     double x=vertices->get_x();
2236     double y=vertices->get_y();
2237     double z=vertices->get_z();
2238     //MG_NOEUD *newno=new MG_NOEUD(NULL,x,y,z,vertices->get_origine());
2239     MG_NOEUD *newno=new MG_NOEUD(vertices->get_lien_topologie(),x,y,z,vertices->get_origine());
2240     mainew->ajouter_mg_noeud(newno);
2241     vertices->change_nouveau_numero(newno->get_id()); // what does this do?
2242     }
2243     }
2244    
2245     LISTE_MG_SEGMENT::iterator itSeg;
2246     for (MG_SEGMENT * segment =mai->get_premier_segment(itSeg); segment; segment=mai->get_suivant_segment(itSeg))
2247     {
2248     //%275=NOEUD($10,93.94800850483597,-250.0000000000000,0.000000000000000,1010);
2249     //NOEUD linked with a topology (get_lien_topologie => $10 ) -> and %10=SOMMET(1,$9,0); %9=POINT_OCC(1);
2250     //%390=SEGMENT($13,$275,$277,1010); => %13=ARETE(3,$8,$14,$15,1,0); %275=NOEUD($10,93.94800850483597,-250.0000000000000,0.000000000000000,1010); %277=NOEUD($13,89.09047601136933,-249.4243468871926,0.000000000000000,1010);
2251     MG_FACE* faceseg=(MG_FACE*) (segment->get_lien_topologie());
2252     //cout<<"faceseg->get_id()= "<<faceseg->get_id()<<endl;
2253     MG_ARETE* aretver=(MG_ARETE*) (segment->get_lien_topologie());
2254     //cout<<"aretver->get_id()= "<<aretver->get_id()<<endl;
2255     if (faceseg->get_id()==37
2256     || aretver->get_id()==20 || aretver->get_id()==108|| aretver->get_id()==113|| aretver->get_id()==101 || aretver->get_id()==59||aretver->get_id()==64
2257     || aretver->get_id()==45 || aretver->get_id()==52|| aretver->get_id()==93|| aretver->get_id()==74 || aretver->get_id()==81||aretver->get_id()==88
2258     //|| aretver->get_id()==20 || aretver->get_id()==141|| aretver->get_id()==129|| aretver->get_id()==136 || aretver->get_id()==66||aretver->get_id()==59
2259     //|| aretver->get_id()==73 || aretver->get_id()==78|| aretver->get_id()==45|| aretver->get_id()==52 || aretver->get_id()==95||aretver->get_id()==102
2260     //|| aretver->get_id()==88 || aretver->get_id()==121|| aretver->get_id()==116|| aretver->get_id()==109
2261    
2262     )
2263     {
2264     MG_NOEUD* no1=mainew->get_mg_noeudid(segment->get_noeud1()->get_nouveau_numero());
2265     MG_NOEUD* no2=mainew->get_mg_noeudid(segment->get_noeud2()->get_nouveau_numero());
2266     MG_SEGMENT *seg=new MG_SEGMENT(segment->get_lien_topologie(),no1,no2,segment->get_origine());
2267     //MG_SEGMENT *seg=new MG_SEGMENT(NULL,no1,no2,segment->get_origine());
2268     mainew->ajouter_mg_segment(seg);
2269     }
2270     }
2271    
2272     LISTE_MG_TRIANGLE::iterator itTri;
2273     for (MG_TRIANGLE * triangle =mai->get_premier_triangle(itTri); triangle; triangle=mai->get_suivant_triangle(itTri))
2274     {
2275     MG_FACE* facetri=(MG_FACE*) (triangle->get_lien_topologie());
2276     if (facetri->get_id()==37)
2277     {
2278     MG_NOEUD* no1=mainew->get_mg_noeudid(triangle->get_noeud1()->get_nouveau_numero());
2279     MG_NOEUD* no2=mainew->get_mg_noeudid(triangle->get_noeud2()->get_nouveau_numero());
2280     MG_NOEUD* no3=mainew->get_mg_noeudid(triangle->get_noeud3()->get_nouveau_numero());
2281     mainew->ajouter_mg_triangle(triangle->get_lien_topologie(),no1,no2,no3,triangle->get_origine());
2282     }
2283     }
2284    
2285     //gestnew->enregistrer("cadsurfmsh_smplwithole_23mm.magic");
2286     gestnew->enregistrer(outputfilename);
2287     }
2288 sattarpa 596 void CRIAQOPERATORS::surfmaker_e3(char* outputfilename,int meshno,char* magicfilename)
2289 sattarpa 554 {
2290     //surfmesh maker (smplwithpocket+smpl withpocket)
2291     MG_FILE gest(magicfilename);
2292     MG_GEOMETRIE* geo=gest.get_mg_geometrie(0);
2293     MG_MAILLAGE* mai;
2294     if (meshno==0) mai=gest.get_mg_maillage(meshno); else mai=gest.get_mg_maillageid(meshno);
2295     //MG_FILE gest((char*)"smplwithpocket_3d_13mm.magic");
2296     //MG_GEOMETRIE* geo=gest.get_mg_geometrieid(1);
2297     //MG_MAILLAGE* mai=gest.get_mg_maillageid(2982821);
2298     MG_GESTIONNAIRE* gestnew=new MG_GESTIONNAIRE();
2299     MG_GEOMETRIE* geonew=mai->get_mg_geometrie();
2300     gestnew->ajouter_mg_geometrie(geonew);
2301     MG_MAILLAGE* mainew=new MG_MAILLAGE(geonew);
2302     gestnew->ajouter_mg_maillage(mainew);
2303    
2304     LISTE_MG_NOEUD::iterator itnod;
2305     for (MG_NOEUD* vertices=mai->get_premier_noeud(itnod);vertices!=NULL;vertices=mai->get_suivant_noeud(itnod))
2306     {
2307     MG_ELEMENT_TOPOLOGIQUE *topnd=vertices->get_lien_topologie();
2308     MG_FACE* facevert=(MG_FACE*) (vertices->get_lien_topologie());
2309     MG_ARETE* aretver=(MG_ARETE*) (vertices->get_lien_topologie());
2310     MG_SOMMET* sometver=(MG_SOMMET*) (vertices->get_lien_topologie());
2311     if(facevert->get_id()==5
2312     || aretver->get_id()==32 || aretver->get_id()==61|| aretver->get_id()==42|| aretver->get_id()==56 || aretver->get_id()==49||aretver->get_id()==27
2313     || aretver->get_id()==85 || aretver->get_id()==90|| aretver->get_id()==78|| aretver->get_id()==71 || aretver->get_id()==20||aretver->get_id()==13
2314     || sometver->get_id()==10|| sometver->get_id()==26|| sometver->get_id()==41|| sometver->get_id()==55|| sometver->get_id()==39|| sometver->get_id()==48
2315     || sometver->get_id()==84|| sometver->get_id()==77|| sometver->get_id()==70|| sometver->get_id()==68|| sometver->get_id()==12|| sometver->get_id()==19)
2316     {
2317     double x=vertices->get_x();
2318     double y=vertices->get_y();
2319     double z=vertices->get_z();
2320     //MG_NOEUD *newno=new MG_NOEUD(NULL,x,y,z,vertices->get_origine());
2321     MG_NOEUD *newno=new MG_NOEUD(vertices->get_lien_topologie(),x,y,z,vertices->get_origine());
2322     mainew->ajouter_mg_noeud(newno);
2323     vertices->change_nouveau_numero(newno->get_id()); // what does this do?
2324     }
2325     }
2326    
2327     LISTE_MG_SEGMENT::iterator itSeg;
2328     for (MG_SEGMENT * segment =mai->get_premier_segment(itSeg); segment; segment=mai->get_suivant_segment(itSeg))
2329     {
2330     //%275=NOEUD($10,93.94800850483597,-250.0000000000000,0.000000000000000,1010);
2331     //NOEUD linked with a topology (get_lien_topologie => $10 ) -> and %10=SOMMET(1,$9,0); %9=POINT_OCC(1);
2332     //%390=SEGMENT($13,$275,$277,1010); => %13=ARETE(3,$8,$14,$15,1,0); %275=NOEUD($10,93.94800850483597,-250.0000000000000,0.000000000000000,1010); %277=NOEUD($13,89.09047601136933,-249.4243468871926,0.000000000000000,1010);
2333     MG_FACE* faceseg=(MG_FACE*) (segment->get_lien_topologie());
2334     //cout<<"faceseg->get_id()= "<<faceseg->get_id()<<endl;
2335     MG_ARETE* aretver=(MG_ARETE*) (segment->get_lien_topologie());
2336     //cout<<"aretver->get_id()= "<<aretver->get_id()<<endl;
2337     if (faceseg->get_id()==5
2338     || aretver->get_id()==32 || aretver->get_id()==61|| aretver->get_id()==42|| aretver->get_id()==56 || aretver->get_id()==49||aretver->get_id()==27
2339     || aretver->get_id()==85 || aretver->get_id()==90|| aretver->get_id()==78|| aretver->get_id()==71 || aretver->get_id()==20||aretver->get_id()==13)
2340     {
2341     MG_NOEUD* no1=mainew->get_mg_noeudid(segment->get_noeud1()->get_nouveau_numero());
2342     MG_NOEUD* no2=mainew->get_mg_noeudid(segment->get_noeud2()->get_nouveau_numero());
2343     MG_SEGMENT *seg=new MG_SEGMENT(segment->get_lien_topologie(),no1,no2,segment->get_origine());
2344     //MG_SEGMENT *seg=new MG_SEGMENT(NULL,no1,no2,segment->get_origine());
2345     mainew->ajouter_mg_segment(seg);
2346     }
2347     }
2348    
2349     LISTE_MG_TRIANGLE::iterator itTri;
2350     for (MG_TRIANGLE * triangle =mai->get_premier_triangle(itTri); triangle; triangle=mai->get_suivant_triangle(itTri))
2351     {
2352     MG_FACE* facetri=(MG_FACE*) (triangle->get_lien_topologie());
2353     if (facetri->get_id()==5)
2354     {
2355     MG_NOEUD* no1=mainew->get_mg_noeudid(triangle->get_noeud1()->get_nouveau_numero());
2356     MG_NOEUD* no2=mainew->get_mg_noeudid(triangle->get_noeud2()->get_nouveau_numero());
2357     MG_NOEUD* no3=mainew->get_mg_noeudid(triangle->get_noeud3()->get_nouveau_numero());
2358     mainew->ajouter_mg_triangle(triangle->get_lien_topologie(),no1,no2,no3,triangle->get_origine());
2359     }
2360     }
2361    
2362     //gestnew->enregistrer("scnsurf_smplwithpocket_3d_13mm_232mmdeform.magic");
2363     gestnew->enregistrer(outputfilename);
2364     }
2365 sattarpa 809 void CRIAQOPERATORS::gnifformatmaker(char* elementxtoutfile,char* nodtxtoutfile,int meshno,char* magicfilename, int geometric)
2366 sattarpa 554 {
2367     // gnifformatmaker
2368     MG_FILE gest(magicfilename);
2369 sattarpa 809 if(geometric>0)
2370     {
2371     FEM_MAILLAGE* femai;
2372     if (meshno==0) femai=gest.get_fem_maillage(meshno); else femai=gest.get_fem_maillageid(meshno);
2373     FILE* in1=fopen(nodtxtoutfile,"wt");
2374     LISTE_FEM_NOEUD::iterator itnod;
2375     unsigned long firstno=femai->get_premier_noeud(itnod)->get_id();
2376     firstno=firstno-1;
2377     cout<<firstno<<endl;
2378     int counter1=1;
2379     cout<<"mai->get_nb_mg_noeud()="<<femai->get_nb_fem_noeud()<<endl;
2380     for (FEM_NOEUD* nod=femai->get_premier_noeud(itnod);nod!=NULL;nod=femai->get_suivant_noeud(itnod))
2381     {
2382     nod->get_numero_opt();
2383     nod->get_mg_element_maillage()->change_nouveau_numero(counter1);
2384     fprintf(in1,"%19d%32.9le%16.9le%8d\n",nod->get_mg_element_maillage()->get_nouveau_numero(), nod->get_x(),nod->get_y(),nod->get_mg_element_maillage()->get_nouveau_numero());
2385     fprintf(in1,"%7d%16.9le\n",nod->get_mg_element_maillage()->get_nouveau_numero(), nod->get_z());
2386     counter1++;
2387     }
2388     FILE* in2=fopen(elementxtoutfile,"wt");
2389     int counter=1;
2390     LISTE_FEM_ELEMENT2::iterator ittri;
2391     for (FEM_ELEMENT2* tri=femai->get_premier_element2(ittri);tri!=NULL;tri=femai->get_suivant_element2(ittri))
2392     {
2393     FEM_NOEUD* fend1=tri->get_fem_noeud(0);
2394     FEM_NOEUD* fend2=tri->get_fem_noeud(1);
2395     FEM_NOEUD* fend3=tri->get_fem_noeud(2);
2396     fprintf(in2,"%10d 1%8d%8d%8d\n",counter,fend1->get_mg_element_maillage()->get_nouveau_numero(),fend2->get_mg_element_maillage()->get_nouveau_numero(),fend3->get_mg_element_maillage()->get_nouveau_numero());
2397     counter++;
2398     }
2399     fclose(in1);
2400     fclose(in2);
2401     }
2402     else
2403     {
2404 sattarpa 554 MG_MAILLAGE* mai;
2405     if (meshno==0) mai=gest.get_mg_maillage(meshno); else mai=gest.get_mg_maillageid(meshno);
2406     //MG_FILE gest((char*)"scnsurf_longflxprtwithpockets_3d_3mm_8mmdef_0bump.magic");
2407     // MG_MAILLAGE* mai=gest.get_mg_maillageid(2);
2408     //std::string fichiermaillage="CAD_output_elements.txt";
2409     //FILE* in=fopen(fichiermaillage.c_str(),"wt");
2410     //FILE* in1=fopen("scnsurf_longflxprtwithpockets_3d_3mm_8mmdef_0bump_nodes.txt","wt");
2411     FILE* in1=fopen(nodtxtoutfile,"wt");
2412     //FILE* in1=fopen("scannedsurface_nodes.txt","wt");
2413     LISTE_MG_NOEUD::iterator itnod;
2414     unsigned long firstno=mai->get_premier_noeud(itnod)->get_id();
2415     firstno=firstno-1;
2416     cout<<firstno<<endl;
2417     int counter1=1;
2418     cout<<"mai->get_nb_mg_noeud()="<<mai->get_nb_mg_noeud()<<endl;
2419     for (MG_NOEUD* nod=mai->get_premier_noeud(itnod);nod!=NULL;nod=mai->get_suivant_noeud(itnod))
2420     {
2421     nod->change_nouveau_numero(counter1);
2422     //nod->change_id(counter1);
2423     //fprintf(in1,"%d node coordinate %le %le %le\n",nod->get_id(), nod->get_x(),nod->get_y(), nod->get_z() );
2424 sattarpa 658 //fprintf(in,"%d node coordinate %le %le %le\n",nod->get_id(), nod->get_x(),nod->get_y(), nod->get_z() );
2425     fprintf(in1,"%19d%32.9le%16.9le%8d\n",nod->get_nouveau_numero(), nod->get_x(),nod->get_y(),nod->get_nouveau_numero());
2426     fprintf(in1,"%7d%16.9le\n",nod->get_nouveau_numero(), nod->get_z());
2427 sattarpa 554 counter1++;
2428     }
2429     //FILE* in2=fopen("scnsurf_longflxprtwithpockets_3d_3mm_8mmdef_0bump_elements.txt","wt"); // CAD text output elements
2430     FILE* in2=fopen(elementxtoutfile,"wt");
2431     //FILE* in2=fopen("scannedsurface_elements.txt","wt"); //scanned text output elements
2432     int counter=1;
2433     LISTE_MG_TRIANGLE::iterator ittri;
2434     for (MG_TRIANGLE* tri=mai->get_premier_triangle(ittri);tri!=NULL;tri=mai->get_suivant_triangle(ittri))
2435     {
2436     fprintf(in2,"%10d 1%8d%8d%8d\n",counter,tri->get_noeud1()->get_nouveau_numero(),tri->get_noeud2()->get_nouveau_numero(),tri->get_noeud3()->get_nouveau_numero() );
2437     counter++;
2438     }
2439     fclose(in1);
2440     fclose(in2);
2441 sattarpa 809 }
2442 sattarpa 554 }
2443 sattarpa 596 void CRIAQOPERATORS::rmovscnprtfromdefrmdcad(char* outputfilename,int meshno,char* magicfilename)
2444 sattarpa 554 {
2445     MG_FILE gest(magicfilename);
2446     MG_MAILLAGE* mai;
2447     if (meshno==0) mai=gest.get_mg_maillage(meshno); else mai=gest.get_mg_maillageid(meshno);
2448 sattarpa 596 MG_GESTIONNAIRE* newgest=new MG_GESTIONNAIRE();
2449 sattarpa 554 MG_GEOMETRIE* geonew=mai->get_mg_geometrie();
2450 sattarpa 596 newgest->ajouter_mg_geometrie(geonew);
2451 sattarpa 554 MG_MAILLAGE* mainew=new MG_MAILLAGE(geonew);
2452 sattarpa 596 newgest->ajouter_mg_maillage(mainew);
2453    
2454 sattarpa 554 LISTE_MG_NOEUD::iterator itnod;
2455     for (MG_NOEUD* vertices=mai->get_premier_noeud(itnod);vertices!=NULL;vertices=mai->get_suivant_noeud(itnod))
2456     {
2457     MG_ELEMENT_TOPOLOGIQUE *topnd=vertices->get_lien_topologie();
2458     MG_FACE* facevert=(MG_FACE*) (vertices->get_lien_topologie());
2459 sattarpa 596 //if(facevert->get_id()!=76 && topnd->get_dimension()!=3) //e1
2460     //if(facevert->get_id()!=5 && topnd->get_dimension()!=3) //e2
2461 sattarpa 554 {
2462     double x=vertices->get_x();
2463     double y=vertices->get_y();
2464     double z=vertices->get_z();
2465     MG_NOEUD *newno=new MG_NOEUD(vertices->get_lien_topologie(),x,y,z,vertices->get_origine());
2466     mainew->ajouter_mg_noeud(newno);
2467     vertices->change_nouveau_numero(newno->get_id()); // what does this do?
2468     }
2469     }
2470 sattarpa 596
2471 sattarpa 554 LISTE_MG_SEGMENT::iterator itSeg;
2472     for (MG_SEGMENT * segment =mai->get_premier_segment(itSeg); segment; segment=mai->get_suivant_segment(itSeg))
2473     {
2474     MG_ELEMENT_TOPOLOGIQUE *topseg=segment->get_lien_topologie();
2475     MG_FACE* faceseg=(MG_FACE*) (segment->get_lien_topologie());
2476 sattarpa 596 //if (faceseg->get_id()!=76 && topseg->get_dimension()!=3)
2477     if(faceseg->get_id()!=5 && topseg->get_dimension()!=3) //e2
2478 sattarpa 554 {
2479     MG_NOEUD* no1=mainew->get_mg_noeudid(segment->get_noeud1()->get_nouveau_numero());
2480     MG_NOEUD* no2=mainew->get_mg_noeudid(segment->get_noeud2()->get_nouveau_numero());
2481     MG_SEGMENT *seg=new MG_SEGMENT(segment->get_lien_topologie(),no1,no2,segment->get_origine());
2482     mainew->ajouter_mg_segment(seg);
2483     }
2484     }
2485 sattarpa 596
2486 sattarpa 554 LISTE_MG_TRIANGLE::iterator itTri;
2487     for (MG_TRIANGLE * triangle =mai->get_premier_triangle(itTri); triangle; triangle=mai->get_suivant_triangle(itTri))
2488     {
2489     MG_ELEMENT_TOPOLOGIQUE *toptri=triangle->get_lien_topologie();
2490     MG_FACE* facetri=(MG_FACE*) (triangle->get_lien_topologie());
2491 sattarpa 596 // if (facetri->get_id()!=76 && toptri->get_dimension()!=3)
2492     if (facetri->get_id()!=5 && toptri->get_dimension()!=3) //e2
2493 sattarpa 554 {
2494     MG_NOEUD* no1=mainew->get_mg_noeudid(triangle->get_noeud1()->get_nouveau_numero());
2495     MG_NOEUD* no2=mainew->get_mg_noeudid(triangle->get_noeud2()->get_nouveau_numero());
2496     MG_NOEUD* no3=mainew->get_mg_noeudid(triangle->get_noeud3()->get_nouveau_numero());
2497     mainew->ajouter_mg_triangle(triangle->get_lien_topologie(),no1,no2,no3,triangle->get_origine());
2498     }
2499     }
2500 sattarpa 596 newgest->enregistrer(outputfilename);
2501 sattarpa 554 //gest.enregistrer("deformedcad_sansscannedpart.magic");
2502    
2503     }
2504 sattarpa 596 void CRIAQOPERATORS::msh2dmakerfrommsh3d(char* outputfilename,int meshno,char* magicfilename)
2505 sattarpa 554 {
2506     //to make a 2D mesh out of 3D mesh :)
2507     /*
2508     MG_MAILLAGE* mainew=mai->dupliquer(&gest);
2509     LISTE_MG_TETRA::iterator ittet;
2510     for(MG_TETRA* )
2511     {
2512    
2513     }
2514    
2515     cout<<"mainew->get_nb_mg_noeud()= "<<mainew->get_nb_mg_noeud()<<endl;
2516     cout<<"mainew->get_nb_mg_segment()= "<<mainew->get_nb_mg_segment()<<endl;
2517     cout<<"mainew->get_nb_mg_triangle()= "<<mainew->get_nb_mg_triangle()<<endl;
2518     cout<<"mainew->get_nb_mg_tetra()= "<<mainew->get_nb_mg_tetra()<<endl;
2519    
2520     LISTE_MG_TRIANGLE::iterator ittri;
2521     for (MG_TRIANGLE* triangle=mainew->get_premier_triangle(ittri);triangle!=NULL;triangle=mainew->get_suivant_triangle(ittri))
2522     {
2523     MG_ELEMENT_TOPOLOGIQUE *top=triangle->get_lien_topologie();
2524     int topdimension=top->get_dimension();
2525     if (topdimension==3)
2526     mainew->supprimer_mg_triangleid(triangle->get_id());
2527     }
2528    
2529     LISTE_MG_TETRA::iterator ittet;
2530     for (MG_TETRA* tetra=mainew->get_premier_tetra(ittet);tetra!=NULL;tetra=mainew->get_suivant_tetra(ittet))
2531     mainew->supprimer_mg_tetraid(tetra->get_id());
2532     //MG_FACE* face=geo->get_mg_faceid(5);
2533    
2534    
2535     LISTE_MG_SEGMENT::iterator itseg;
2536     for (MG_SEGMENT* segment=mainew->get_premier_segment(itseg);segment!=NULL;segment=mainew->get_suivant_segment(itseg))
2537     {
2538     MG_FACE* faceseg=(MG_FACE*) (segment->get_lien_topologie());
2539     if (faceseg->get_id()!=181)
2540     mainew->supprimer_mg_segmentid(segment->get_id());
2541    
2542     MG_ELEMENT_TOPOLOGIQUE *topseg=segment->get_lien_topologie();
2543     if(topseg->get_dimension()==3)
2544     cout<<"topseg->get_dimension()==3"<<endl;
2545     }
2546    
2547     LISTE_MG_NOEUD::iterator itnod;
2548     for (MG_NOEUD* vertices=mainew->get_premier_noeud(itnod);vertices!=NULL;vertices=mainew->get_suivant_noeud(itnod))
2549     {
2550     MG_ELEMENT_TOPOLOGIQUE *topnd=vertices->get_lien_topologie();
2551     MG_FACE* facevert=(MG_FACE*) (vertices->get_lien_topologie());
2552     //if (facevert->get_id()!=181)
2553     if (topnd->get_dimension()==0)
2554     mainew->supprimer_mg_segmentid(vertices->get_id());
2555     }
2556    
2557     for (MG_TRIANGLE* triangle=mainew->get_premier_triangle(ittri);triangle!=NULL;triangle=mainew->get_suivant_triangle(ittri))
2558     {
2559     MG_FACE* facetri=(MG_FACE*) (triangle->get_lien_topologie());
2560     if (facetri->get_id()!=181)
2561     mainew->supprimer_mg_triangleid(triangle->get_id());
2562     }
2563     */
2564 sattarpa 596
2565     MG_FILE gest(magicfilename);
2566     MG_MAILLAGE* mai;
2567     if (meshno==0) mai=gest.get_mg_maillage(meshno); else mai=gest.get_mg_maillageid(meshno);
2568 sattarpa 554 MG_GESTIONNAIRE* newgest=new MG_GESTIONNAIRE();
2569     MG_GEOMETRIE* geonew=mai->get_mg_geometrie();
2570     newgest->ajouter_mg_geometrie(geonew);
2571     MG_MAILLAGE* mainew=new MG_MAILLAGE(geonew);
2572     newgest->ajouter_mg_maillage(mainew);
2573    
2574     LISTE_MG_NOEUD::iterator itNod;
2575     for (MG_NOEUD* nd=mai->get_premier_noeud(itNod);nd!=NULL;nd=mai->get_suivant_noeud(itNod))
2576     {
2577     MG_ELEMENT_TOPOLOGIQUE *topnd=nd->get_lien_topologie();
2578     if(topnd->get_dimension()<3)
2579     {
2580     double x=nd->get_x();
2581     double y=nd->get_y();
2582     double z=nd->get_z();
2583     MG_NOEUD *newno=new MG_NOEUD(nd->get_lien_topologie(),x,y,z,nd->get_origine());
2584     mainew->ajouter_mg_noeud(newno);
2585     nd->change_nouveau_numero(newno->get_id());
2586     }
2587     }
2588     LISTE_MG_SEGMENT::iterator itSeg;
2589     for (MG_SEGMENT* segment =mai->get_premier_segment(itSeg); segment; segment=mai->get_suivant_segment(itSeg))
2590     {
2591     MG_ELEMENT_TOPOLOGIQUE *topseg=segment->get_lien_topologie();
2592     if(topseg->get_dimension()<3)
2593     {
2594     MG_NOEUD* no1=mainew->get_mg_noeudid(segment->get_noeud1()->get_nouveau_numero());
2595     MG_NOEUD* no2=mainew->get_mg_noeudid(segment->get_noeud2()->get_nouveau_numero());
2596     MG_SEGMENT *seg=new MG_SEGMENT(segment->get_lien_topologie(),no1,no2,segment->get_origine());
2597     mainew->ajouter_mg_segment(seg);
2598     }
2599     }
2600     LISTE_MG_TRIANGLE::iterator itTri;
2601     for (MG_TRIANGLE * triangle =mai->get_premier_triangle(itTri); triangle; triangle=mai->get_suivant_triangle(itTri))
2602     {
2603     MG_ELEMENT_TOPOLOGIQUE *toptri=triangle->get_lien_topologie();
2604     if(toptri->get_dimension()<3)
2605     {
2606     MG_NOEUD* no1=mainew->get_mg_noeudid(triangle->get_noeud1()->get_nouveau_numero());
2607     MG_NOEUD* no2=mainew->get_mg_noeudid(triangle->get_noeud2()->get_nouveau_numero());
2608     MG_NOEUD* no3=mainew->get_mg_noeudid(triangle->get_noeud3()->get_nouveau_numero());
2609     mainew->ajouter_mg_triangle(triangle->get_lien_topologie(),no1,no2,no3,triangle->get_origine());
2610     }
2611     }
2612 sattarpa 596 newgest->enregistrer(outputfilename);
2613 sattarpa 554 }
2614 sattarpa 596 void CRIAQOPERATORS::bumpmaker(char* outputfilename,int bumpndid, double bumptip,int meshno,char* magicfilename)
2615 sattarpa 554 {
2616     MG_FILE gest(magicfilename);
2617     //MG_GEOMETRIE* geo=gest.get_mg_geometrie(0);
2618     MG_MAILLAGE* mai;
2619     if (meshno==0) mai=gest.get_mg_maillage(meshno); else mai=gest.get_mg_maillageid(meshno);
2620     //MG_FILE gest((char*)"scnsurf_smplwithpocket_3d_13mm_64mmdeform.magic");
2621     //MG_GEOMETRIE* geo=gest.get_mg_geometrieid(1);
2622     //MG_MAILLAGE* mai=gest.get_mg_maillageid(2);
2623     MG_NOEUD* bptipnd;
2624     TPL_MAP_ENTITE<MG_NOEUD*> usednd;
2625     LISTE_MG_NOEUD::iterator itnod;
2626     for (MG_NOEUD* nd=mai->get_premier_noeud(itnod);nd!=NULL;nd=mai->get_suivant_noeud(itnod))
2627     {
2628     MG_ELEMENT_TOPOLOGIQUE *topnd=nd->get_lien_topologie();
2629     if (topnd->get_dimension() <3 && nd->get_id()==bumpndid)
2630     {
2631     bptipnd=nd;
2632     double new_xyz[3];
2633     new_xyz[0]=nd->get_x(); new_xyz[1]=nd->get_y(); new_xyz[2]=nd->get_z()+bumptip;
2634     nd->change_coord(new_xyz);
2635     usednd.ajouter(nd);
2636     }
2637     }
2638     TPL_MAP_ENTITE<MG_NOEUD*> usedndnd;
2639     TPL_MAP_ENTITE<MG_NOEUD*> neignd;
2640     for(int ineignd=0;ineignd<bptipnd->get_lien_segment()->get_nb();ineignd++)
2641     {
2642     MG_SEGMENT* segnei=bptipnd->get_lien_segment()->get(ineignd);
2643     if(segnei->get_noeud1()!=bptipnd) neignd.ajouter(segnei->get_noeud1());
2644     else if(segnei->get_noeud2()!=bptipnd) neignd.ajouter(segnei->get_noeud2());
2645     }
2646     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itneignd;
2647     for (MG_NOEUD* nd=neignd.get_premier(itneignd);nd!=NULL;nd=neignd.get_suivant(itneignd))
2648     {
2649     double new_xyz[3];
2650     new_xyz[0]=nd->get_x(); new_xyz[1]=nd->get_y(); new_xyz[2]=nd->get_z()+(bumptip*3./4.);
2651     nd->change_coord(new_xyz);
2652     usednd.ajouter(nd);
2653     usedndnd.ajouter(nd);
2654     }
2655    
2656     TPL_MAP_ENTITE<MG_NOEUD*> neignd1;
2657     TPL_MAP_ENTITE<MG_NOEUD*> usedndnd1;
2658     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itusednd;
2659     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itusedndnd;
2660     for(MG_NOEUD* nd=usedndnd.get_premier(itusedndnd);nd!=NULL;nd=usedndnd.get_suivant(itusedndnd))
2661     {
2662     for(int ineignd=0;ineignd<nd->get_lien_segment()->get_nb();ineignd++)
2663     {
2664     MG_SEGMENT* segnei=nd->get_lien_segment()->get(ineignd);
2665     int sgnd1=0;
2666     int sgnd2=0;
2667     for(MG_NOEUD* nd1=usednd.get_premier(itusednd);nd1!=NULL;nd1=usednd.get_suivant(itusednd))
2668     {
2669     if(segnei->get_noeud1()==nd1) sgnd1++;
2670     }
2671     for(MG_NOEUD* nd1=usednd.get_premier(itusednd);nd1!=NULL;nd1=usednd.get_suivant(itusednd))
2672     {
2673     if(segnei->get_noeud2()==nd1) sgnd2++;
2674     }
2675     if(sgnd1==0) neignd1.ajouter(segnei->get_noeud1());
2676     else if(sgnd2==0) neignd1.ajouter(segnei->get_noeud2());
2677     }
2678     }
2679     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itneignd1;
2680     for (MG_NOEUD* nd=neignd1.get_premier(itneignd1);nd!=NULL;nd=neignd1.get_suivant(itneignd1))
2681     {
2682     double new_xyz[3];
2683     new_xyz[0]=nd->get_x(); new_xyz[1]=nd->get_y(); new_xyz[2]=nd->get_z()+(bumptip*2./4.);
2684     nd->change_coord(new_xyz);
2685     usednd.ajouter(nd);
2686     usedndnd1.ajouter(nd);
2687     }
2688    
2689     TPL_MAP_ENTITE<MG_NOEUD*> neignd2;
2690     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itusedndnd1;
2691     for(MG_NOEUD* nd=usedndnd1.get_premier(itusedndnd1);nd!=NULL;nd=usedndnd1.get_suivant(itusedndnd1))
2692     {
2693     for(int ineignd=0;ineignd<nd->get_lien_segment()->get_nb();ineignd++)
2694     {
2695     MG_SEGMENT* segnei=nd->get_lien_segment()->get(ineignd);
2696     int sgnd1=0;
2697     int sgnd2=0;
2698     for(MG_NOEUD* nd1=usednd.get_premier(itusednd);nd1!=NULL;nd1=usednd.get_suivant(itusednd))
2699     {
2700     if(segnei->get_noeud1()==nd1) sgnd1++;
2701     }
2702     for(MG_NOEUD* nd1=usednd.get_premier(itusednd);nd1!=NULL;nd1=usednd.get_suivant(itusednd))
2703     {
2704     if(segnei->get_noeud2()==nd1) sgnd2++;
2705     }
2706     if(sgnd1==0) neignd2.ajouter(segnei->get_noeud1());
2707     else if(sgnd2==0) neignd2.ajouter(segnei->get_noeud2());
2708     }
2709     }
2710     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itneignd2;
2711     for (MG_NOEUD* nd=neignd2.get_premier(itneignd2);nd!=NULL;nd=neignd2.get_suivant(itneignd2))
2712     {
2713     double new_xyz[3];
2714     new_xyz[0]=nd->get_x(); new_xyz[1]=nd->get_y(); new_xyz[2]=nd->get_z()+(bumptip*1./4.);
2715     nd->change_coord(new_xyz);
2716     }
2717    
2718    
2719     //gest.enregistrer("scnsurf_smplwithpocket_3d_13mm_64mmdeform_withbump5mm.magic");
2720     gest.enregistrer(outputfilename);
2721     }
2722 sattarpa 596 int CRIAQOPERATORS::import_triangulation_gnif(char* outputfilename,char* triangulationfile)
2723     {
2724     FILE* in=fopen(triangulationfile,"rt");
2725     if (in==NULL) return 0;
2726 sattarpa 554
2727    
2728 sattarpa 596 MG_GESTIONNAIRE gesttmp;
2729     MG_MAILLAGE* mai=new MG_MAILLAGE(NULL);
2730     gesttmp.ajouter_mg_maillage(mai);
2731     char mess[500];
2732 sattarpa 554
2733 sattarpa 596 double xmax=-1e308;
2734     double xmin=1e308;
2735     double ymax=-1e308;
2736     double ymin=1e308;
2737     double zmax=-1e308;
2738     double zmin=1e308;
2739     while (!feof(in))
2740     {
2741     double x,y,z;
2742     char nom[20];
2743     char *res=fgets(mess,500,in);
2744     if (feof(in)) break;
2745 sattarpa 655 if(res!=NULL)
2746     {
2747 sattarpa 658 sscanf(mess,"%le %le %le",&x,&y,&z);
2748 sattarpa 596 if (x<xmin) xmin=x;
2749     if (x>xmax) xmax=x;
2750     if (y<ymin) ymin=y;
2751     if (y>ymax) ymax=y;
2752     if (z<zmin) zmin=z;
2753     if (z>zmax) zmax=z;
2754     if (feof(in)) return 1;
2755 francois 791 MG_NOEUD* noeud1=mai->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::TRIANGULATION);
2756 sattarpa 596 noeud1->change_nouveau_numero(-1);
2757     res=fgets(mess,500,in);
2758     if (feof(in)) break;
2759 sattarpa 658 sscanf(mess,"%le %le %le",&x,&y,&z);
2760 sattarpa 596 if (x<xmin) xmin=x;
2761     if (x>xmax) xmax=x;
2762     if (y<ymin) ymin=y;
2763     if (y>ymax) ymax=y;
2764     if (z<zmin) zmin=z;
2765     if (z>zmax) zmax=z;
2766     if (feof(in)) return 1;
2767     res=fgets(mess,500,in);
2768     if (feof(in)) break;
2769 francois 791 MG_NOEUD* noeud2=mai->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::TRIANGULATION);
2770 sattarpa 596 noeud2->change_nouveau_numero(-1);
2771 sattarpa 658 sscanf(mess,"%le %le %le",&x,&y,&z);
2772 sattarpa 596 if (x<xmin) xmin=x;
2773     if (x>xmax) xmax=x;
2774     if (y<ymin) ymin=y;
2775     if (y>ymax) ymax=y;
2776     if (z<zmin) zmin=z;
2777     if (z>zmax) zmax=z;
2778     if (feof(in)) return 1;
2779 francois 791 MG_NOEUD* noeud3=mai->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::TRIANGULATION);
2780 sattarpa 596 noeud3->change_nouveau_numero(-1);
2781 francois 791 mai->ajouter_mg_triangle(NULL,noeud1,noeud2,noeud3,MAGIC::ORIGINE::TRIANGULATION);
2782 sattarpa 655 }
2783 sattarpa 596 }
2784     fclose(in);
2785     //to merge the nodes of each triangulation which are close (the same)
2786     double eps=1e-4;
2787     BOITE_3D boite(xmin,ymin,zmin,xmax,ymax,zmax);
2788     double rayon=boite.get_rayon()*1.1;
2789     double x=boite.get_xcentre();
2790     double y=boite.get_ycentre();
2791     double z=boite.get_zcentre();
2792     boite.reinit(x-rayon,y-rayon,z-rayon,x+rayon,y+rayon,z+rayon);
2793     TPL_GRILLE<MG_NOEUD*> grille;
2794     int nb_noeud=mai->get_nb_mg_noeud();
2795     int pas=(int)(pow(nb_noeud,0.33333333333333333))+1;
2796     grille.initialiser(boite.get_xmin(),boite.get_ymin(),boite.get_zmin(),boite.get_xmax(),boite.get_ymax(),boite.get_zmax(),pas,pas,pas);
2797     std::vector<MG_NOEUD*> lst_noeud;
2798     LISTE_MG_NOEUD::iterator it;
2799     int i=0;
2800     for (MG_NOEUD* noeud=mai->get_premier_noeud(it);noeud!=NULL;noeud=mai->get_suivant_noeud(it))
2801     {
2802     //MG_NOEUD* noeud=mai->get_mg_noeud(i);
2803     grille.inserer(noeud);
2804     noeud->change_nouveau_numero(i);
2805     lst_noeud.insert(lst_noeud.end(),noeud);
2806     i++;
2807     }
2808 sattarpa 554
2809 sattarpa 596 int nb_cell=grille.get_nb_cellule();
2810     for (int i=0;i<nb_cell;i++)
2811     {
2812     TPL_CELLULE_GRILLE<MG_NOEUD*> *cell=grille.get_cellule(i);
2813     int nb_noeud_cell=cell->get_nb_entite();
2814     for (int j=0;j<nb_noeud_cell;j++)
2815     {
2816     MG_NOEUD* noeud1=cell->get_entite(j);
2817     // if (noeud1->get_nouveau_numero()!=(-1)) continue;
2818     // noeud1->change_nouveau_numero(noeud1->get_id());
2819     double *xyz1=noeud1->get_coord();
2820     int nb=noeud1->get_lien_segment()->get_nb();
2821     double longref=0.;
2822     for (int jj=0;jj<nb;jj++)
2823     longref=longref+noeud1->get_lien_segment()->get(jj)->get_longueur();
2824     longref=longref/nb;
2825     for (int k=j+1;k<nb_noeud_cell;k++)
2826     {
2827     MG_NOEUD* noeud2=cell->get_entite(k);
2828     double *xyz2=noeud2->get_coord();
2829     OT_VECTEUR_3D vec(xyz1,xyz2);
2830     double longueur=vec.get_longueur();
2831     if (longueur<eps*longref)
2832     {
2833     lst_noeud[noeud2->get_nouveau_numero()]=noeud1;
2834     }
2835     }
2836     }
2837     }
2838     MG_GESTIONNAIRE gest;
2839     MG_MAILLAGE* mai2=new MG_MAILLAGE(NULL);
2840     gest.ajouter_mg_maillage(mai2);
2841     for (int i=0;i<nb_noeud;i++)
2842     {
2843     MG_NOEUD* noeud=lst_noeud[i];
2844     MG_NOEUD* nvnoeud;
2845 francois 791 if (noeud->get_nouveau_numero()==i) nvnoeud=mai2->ajouter_mg_noeud(NULL,noeud->get_x(),noeud->get_y(),noeud->get_z(),MAGIC::ORIGINE::TRIANGULATION);
2846 sattarpa 596 else nvnoeud=lst_noeud[noeud->get_nouveau_numero()];
2847     lst_noeud[i]=nvnoeud;
2848     }
2849     int nb_tri=mai->get_nb_mg_triangle();
2850     for (int i=0;i<nb_tri;i++)
2851     {
2852     MG_TRIANGLE* tri=mai->get_mg_triangle(i);
2853     MG_NOEUD* noeud1=tri->get_noeud1();
2854     MG_NOEUD* noeud2=tri->get_noeud2();
2855     MG_NOEUD* noeud3=tri->get_noeud3();
2856 francois 791 mai2->ajouter_mg_triangle(NULL,lst_noeud[noeud1->get_nouveau_numero()],lst_noeud[noeud2->get_nouveau_numero()],lst_noeud[noeud3->get_nouveau_numero()],MAGIC::ORIGINE::TRIANGULATION);
2857 sattarpa 596 }
2858     gest.enregistrer(outputfilename);
2859     return 1;
2860     }
2861 sattarpa 699 std::vector<double*> CRIAQOPERATORS::sp_project_onCAD(char* magicfilename,int nummai,char* samplepoints1)
2862 sattarpa 695 {
2863     std::vector<double*> lstsmplpoints;
2864 sattarpa 809 std::vector<double*> lstsmplpoints_afterprojectioncad;
2865    
2866 sattarpa 695 FILE *in=fopen(samplepoints1,"rt");
2867     if (in==NULL) cout<<"file is not available"<<endl;//affiche((char*) "file is not available");
2868     while(!feof(in))
2869     {
2870     char chaine[500];
2871     char* res=fgets(chaine,500,in);
2872     if(res!=NULL)
2873     {
2874     double x,y,z;
2875     int nb=sscanf(chaine,"%le %le %le",&x,&y,&z);
2876     double* pcoordbc=new double[3];
2877     if (nb!=-1 && nb!=3)
2878     cout<<"Wrong file format"<<endl;
2879     if(nb==3)
2880     {
2881     pcoordbc[0]=x; pcoordbc[1]=y; pcoordbc[2]=z;
2882     lstsmplpoints.push_back(pcoordbc);
2883     }
2884     }
2885     }
2886 sattarpa 809 cout<<"CAD lstsmplpoints.size()= "<<lstsmplpoints.size()<<endl;
2887    
2888    
2889 sattarpa 695 MG_FILE gest(magicfilename);
2890     MG_MAILLAGE* mai=gest.get_mg_maillageid(nummai);
2891     int geonb=gest.get_nb_mg_geometrie();
2892     int nogeo=0;
2893     MG_GEOMETRIE* geo;
2894     if(geonb>0)
2895     geo=gest.get_mg_geometrie(0);
2896     else if(geonb<1)
2897     {
2898     nogeo++;
2899     cout<<"no geometry is found !!!"<<endl;
2900     }
2901    
2902     double xmin=1e308,ymin=1e308,zmin=1e308,xmax=-1e308,ymax=-1e308,zmax=-1e308;
2903     TPL_MAP_ENTITE<MG_NOEUD*> lstnoeud;
2904     LISTE_MG_NOEUD::iterator it;
2905     for (MG_NOEUD* no=mai->get_premier_noeud(it);no!=NULL;no=mai->get_suivant_noeud(it))
2906     {
2907     if (no->get_x()<xmin) xmin=no->get_x();
2908     if (no->get_y()<ymin) ymin=no->get_y();
2909     if (no->get_z()<zmin) zmin=no->get_z();
2910     if (no->get_x()>xmax) xmax=no->get_x();
2911     if (no->get_y()>ymax) ymax=no->get_y();
2912     if (no->get_z()>zmax) zmax=no->get_z();
2913     lstnoeud.ajouter(no);
2914     }
2915     OT_VECTEUR_3D vecmin(xmin,ymin,zmin);
2916     OT_VECTEUR_3D vecmax(xmax,ymax,zmax);
2917     OT_VECTEUR_3D lengthvec(vecmin,vecmax);
2918     double search_radius=0.0000001;
2919     //double search_radius=0.001*(lengthvec.get_longueur());
2920     //char bboxdiag[1000];
2921     //sprintf(bboxdiag,"the bounding box diagonal is: %lf , and the neighborhood search radius is: %lf ",vec.get_longueur(),search_radius);
2922     //affiche((char*) bboxdiag);
2923     OT_VECTEUR_3D average=(vecmin+vecmax)/2.;
2924     double length=sqrt(lengthvec*lengthvec);
2925     double bxr=1.1;
2926     xmin=average.get_x()-(length*bxr);ymin=average.get_y()-(length*bxr);zmin=average.get_z()-(length*bxr);
2927     xmax=average.get_x()+(length*bxr);ymax=average.get_y()+(length*bxr);zmax=average.get_z()+(length*bxr);
2928     TPL_OCTREE<MG_TRIANGLE*,MG_NOEUD*> octree;
2929     octree.initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
2930     LISTE_MG_TRIANGLE::iterator it9;
2931     for (MG_TRIANGLE* tri=mai->get_premier_triangle(it9);tri!=NULL;tri=mai->get_suivant_triangle(it9))
2932     octree.inserer(tri);
2933     TPL_OCTREE<MG_NOEUD*,MG_NOEUD*> octreends;
2934     octreends.initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
2935     for (MG_NOEUD* no=mai->get_premier_noeud(it);no!=NULL;no=mai->get_suivant_noeud(it))
2936     octreends.inserer(no);
2937    
2938 sattarpa 809
2939     for(std::vector<double*>::iterator ilstsmplpoints=lstsmplpoints.begin();ilstsmplpoints!=lstsmplpoints.end();ilstsmplpoints++)
2940     {
2941     double* p=(*ilstsmplpoints);
2942     ///cout<<"p[0]= "<<p[0]<<" p[0]= "<<p[1]<<" p[0]= "<<p[2]<<endl;
2943    
2944 sattarpa 695 // determine the normal of geometry in the inserting point coordination and saving in "normale"
2945     double normale[3];
2946     std::multimap<double,MG_TRIANGLE*,std::less<double> > delinsqualtri;
2947     int insideface=0;
2948     std::multimap<double,MG_FACE*,std::less<double> > lstfacepointdist;
2949     int facenb=geo->get_nb_mg_face();
2950     LISTE_MG_FACE::iterator itf;
2951     double xyz[3];
2952     xyz[0]=p[0];
2953     xyz[1]=p[1];
2954     xyz[2]=p[2];
2955     for(MG_FACE* fac=geo->get_premier_face(itf);fac!=NULL;fac=geo->get_suivant_face(itf))
2956     {
2957     double uv[2];
2958     fac->inverser(uv,xyz);
2959     double xyz2[3];
2960     fac->evaluer(uv,xyz2);
2961     OT_VECTEUR_3D vechk(xyz,xyz2);
2962     lstfacepointdist.insert(pair<double,MG_FACE*> (vechk.get_longueur(),fac));
2963     //double dis;
2964     //MG_GEOMETRIE_OUTILS f1;
2965     //int ch=f1.calcule_distance_contour_face_xyz(xyz,fac,&dis);
2966     ////cout<<"xyz= "<<xyz[0]<<" xyz= "<<xyz[1]<<" xyz= "<<xyz[2]<<" xyz2= "<<xyz2[0]<<" xyz2= "<<xyz2[1]<<" xyz2= "<<xyz2[2]<<endl;
2967     //cout<<"dis= "<<dis<<" vechk.get_longueur()= "<<vechk.get_longueur()<<endl;
2968     //if (ch==1 && dis>=0.)
2969     // if (vechk.get_longueur()<5e-3)
2970     }
2971     std::multimap<double,MG_FACE*,std::less<double> >::iterator itlstfacepointdist=lstfacepointdist.begin();
2972     if (lstfacepointdist.size()>0)
2973     {
2974 sattarpa 707 //cout<<"lstfacepointdist.size()= "<<lstfacepointdist.size()<<endl;
2975 sattarpa 695 //cout<<"(*itlstfacepointdist).first= "<<(*itlstfacepointdist).first<<endl;
2976     MG_FACE* face=(*itlstfacepointdist).second;
2977     double uv[2];
2978     face->inverser(uv,xyz);
2979     face->calcul_normale_unitaire(uv,normale);
2980     MG_COFACE *coface=face->get_mg_coface(0);
2981     int signe=coface->get_orientation();
2982    
2983     TPL_MAP_ENTITE<MG_TRIANGLE*> lstneitri;
2984     int neitrinb=lstneitri.get_nb();
2985     while(neitrinb==0)
2986     {
2987     octree.rechercher(p[0],p[1],p[2],search_radius,lstneitri);
2988     neitrinb=lstneitri.get_nb();
2989     search_radius=search_radius+0.01*search_radius;
2990     }
2991     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR itnormtst;
2992     OT_VECTEUR_3D normale_discrete(0.,0.,0.);
2993     for (MG_TRIANGLE* tri1=lstneitri.get_premier(itnormtst);tri1!=NULL;tri1=lstneitri.get_suivant(itnormtst))
2994     {
2995     OT_VECTEUR_3D vec1(tri1->get_noeud1()->get_coord(),tri1->get_noeud2()->get_coord());
2996     OT_VECTEUR_3D vec2(tri1->get_noeud1()->get_coord(),tri1->get_noeud3()->get_coord());
2997     OT_VECTEUR_3D normtst=(vec1&vec2); normtst.norme();
2998     normale_discrete=normtst+normale_discrete;
2999     }
3000     normale_discrete.norme();
3001     double n_ps=normale_discrete*normale;
3002     n_ps=n_ps*-1;
3003     if (n_ps>1.) n_ps=1.;
3004     if (n_ps<-1.) n_ps=-1.;
3005     double n_angle=acos(n_ps);
3006     //cout<<"n_angle= "<<n_angle<<endl;
3007     if(n_angle<(0.5*3.14159265358979323846) || n_angle>-(0.5*3.14159265358979323846))
3008     insideface++;
3009     }
3010 sattarpa 739
3011 sattarpa 695 //cout<<"insideface= "<<insideface<<endl;
3012     if(insideface<1)
3013     cout<<"insideface is not found !!!"<<endl;
3014     if(insideface>0)
3015     {
3016     TPL_MAP_ENTITE<MG_TRIANGLE*> lstneitri1;
3017     int neitrinb=lstneitri1.get_nb();
3018     double search_radius1=0.01;
3019     while(neitrinb==0)
3020     {
3021 sattarpa 699 octree.rechercher(p[0],p[1],p[2],500.*search_radius1,lstneitri1);//sasan
3022 sattarpa 695 neitrinb=lstneitri1.get_nb();
3023     search_radius1=search_radius1+0.00001*search_radius1;
3024     }
3025     //cout<<"lstneitri1.get_nb()= "<<lstneitri1.get_nb()<<endl;
3026     double pproj[3];
3027     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR inspi;
3028     int tri_found=0;
3029     int beshmar=0;
3030    
3031 sattarpa 809 int virtual_project=0;
3032 sattarpa 695 for (MG_TRIANGLE* insphertri=lstneitri1.get_premier(inspi);insphertri!=NULL;insphertri=lstneitri1.get_suivant(inspi))
3033     {
3034 sattarpa 699 //cout<<insphertri->get_id()<<endl;
3035 sattarpa 695 //while (tri_found<1 || beshmar<lstneitri.get_nb())
3036     {
3037     beshmar++;
3038     MG_NOEUD* inspnd1=insphertri->get_noeud1();
3039     MG_NOEUD* inspnd2=insphertri->get_noeud2();
3040     MG_NOEUD* inspnd3=insphertri->get_noeud3();
3041     OT_VECTEUR_3D tvec1(inspnd1->get_coord(),inspnd2->get_coord());
3042     OT_VECTEUR_3D tvec2(inspnd1->get_coord(),inspnd3->get_coord());
3043     OT_VECTEUR_3D tnorm=(tvec1&tvec2); tnorm.norme();
3044 sattarpa 739 OT_VECTEUR_3D norm=normale;
3045 sattarpa 695
3046     double parallel=norm*tnorm;
3047     //cout<<"parallel= "<<parallel<<endl;
3048 sattarpa 809
3049 sattarpa 695 if (parallel>0.7 || parallel<-0.7)
3050     {
3051 sattarpa 739
3052 sattarpa 695 //cout<<"itis"<<endl;
3053     OT_VECTEUR_3D vvec(inspnd1->get_coord(),p);
3054     double t= (tnorm*vvec)/parallel;
3055     t=-t;
3056     pproj[0]=p[0]+t*norm.get_x();
3057     pproj[1]=p[1]+t*norm.get_y();
3058     pproj[2]=p[2]+t*norm.get_z();
3059     //////////////////////////////////////////////////////////////
3060     //check if the projected p is inside the triangle !!!!!
3061     MG_MAILLAGE_OUTILS tribas;
3062     int tribasval=tribas.estdansletriangle(insphertri,pproj[0],pproj[1],pproj[2]);
3063     int intri=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::INTERIEUR);
3064     int insidtri=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::STRICTINTERIEUR);
3065     int onedge=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::SUR_ARETE);
3066     //printf("projection before is: %16.14lf %16.14lf %16.14lf \n",pproj[0],pproj[1],pproj[2]);
3067 sattarpa 699 //cout<<"intri= "<<intri<<endl;
3068 sattarpa 695 if(intri==1)
3069     {
3070 sattarpa 809 virtual_project++;
3071 sattarpa 739 //cout<<"normale= "<<norm.get_x()<<" normale= "<<norm.get_y()<<" normale= "<<norm.get_z()<<endl;
3072 sattarpa 699 //printf("projection is: %16.14lf %16.14lf %16.14lf \n",pproj[0],pproj[1],pproj[2]);
3073 sattarpa 809 double* proj=new double[4];
3074     proj[0]=pproj[0]; proj[1]=pproj[1]; proj[2]=pproj[2]; proj[3]=1;
3075 sattarpa 739 OT_VECTEUR_3D disprojp(p,pproj);
3076 sattarpa 809 //cout<<"CAD distance proj-p= "<<disprojp.get_longueur()<<endl;
3077 sattarpa 699 lstsmplpoints_afterprojectioncad.push_back(proj);
3078 sattarpa 695 tri_found++;
3079     }
3080    
3081 sattarpa 809
3082     }
3083    
3084 sattarpa 695 }
3085     }
3086 sattarpa 809 if(virtual_project==0)
3087     {
3088     double* proj_virt=new double[4];
3089     proj_virt[0]=0; proj_virt[1]=0; proj_virt[2]=0; proj_virt[3]=0;
3090     lstsmplpoints_afterprojectioncad.push_back(proj_virt);
3091    
3092 sattarpa 695 }
3093     }
3094     }
3095 sattarpa 699
3096     //for(std::vector<double*>::iterator itsprojcad=lstsmplpoints_afterprojectioncad.begin();itsprojcad!=lstsmplpoints_afterprojectioncad.end();itsprojcad++)
3097     {
3098     //double* xyz_cadproj=(*itsprojcad);
3099     //cout<<"xyz_cadproj[0]= "<<xyz_cadproj[0]<<" xyz_cadproj[1]= "<<xyz_cadproj[1]<<" xyz_cadproj[2]= "<<xyz_cadproj[2]<<endl;
3100    
3101     }
3102     return lstsmplpoints_afterprojectioncad;
3103 sattarpa 695 }
3104 sattarpa 809
3105 sattarpa 699 std::vector<double*> CRIAQOPERATORS::sp_project_onSCAN(char* magicfilename,int nummai,char* samplepoints1)
3106 sattarpa 695 {
3107     std::vector<double*> lstsmplpoints;
3108     std::vector<double*> lstsmplpoints_afterprojection;
3109     FILE *in=fopen(samplepoints1,"rt");
3110     if (in==NULL) cout<<"file is not available"<<endl;//affiche((char*) "file is not available");
3111     while(!feof(in))
3112     {
3113     char chaine[500];
3114     char* res=fgets(chaine,500,in);
3115     if(res!=NULL)
3116     {
3117     double x,y,z;
3118     int nb=sscanf(chaine,"%le %le %le",&x,&y,&z);
3119     double* pcoordbc=new double[3];
3120     if (nb!=-1 && nb!=3)
3121     cout<<"Wrong file format"<<endl;
3122     if(nb==3)
3123     {
3124     pcoordbc[0]=x; pcoordbc[1]=y; pcoordbc[2]=z;
3125     lstsmplpoints.push_back(pcoordbc);
3126     }
3127     }
3128     }
3129 sattarpa 809 cout<<"SCN lstsmplpoints.size()= "<<lstsmplpoints.size()<<endl;
3130    
3131    
3132 sattarpa 695 MG_FILE gest(magicfilename);
3133     MG_MAILLAGE* mai=gest.get_mg_maillageid(nummai);
3134     double xmin=1e308,ymin=1e308,zmin=1e308,xmax=-1e308,ymax=-1e308,zmax=-1e308;
3135     TPL_MAP_ENTITE<MG_NOEUD*> lstnoeud;
3136     LISTE_MG_NOEUD::iterator it;
3137     for (MG_NOEUD* no=mai->get_premier_noeud(it);no!=NULL;no=mai->get_suivant_noeud(it))
3138     {
3139     if (no->get_x()<xmin) xmin=no->get_x();
3140     if (no->get_y()<ymin) ymin=no->get_y();
3141     if (no->get_z()<zmin) zmin=no->get_z();
3142     if (no->get_x()>xmax) xmax=no->get_x();
3143     if (no->get_y()>ymax) ymax=no->get_y();
3144     if (no->get_z()>zmax) zmax=no->get_z();
3145     lstnoeud.ajouter(no);
3146     }
3147     OT_VECTEUR_3D vecmin(xmin,ymin,zmin);
3148     OT_VECTEUR_3D vecmax(xmax,ymax,zmax);
3149     OT_VECTEUR_3D lengthvec(vecmin,vecmax);
3150 sattarpa 809 double search_radius=10.1;//0.0000001;
3151 sattarpa 695 //double search_radius=0.001*(lengthvec.get_longueur());
3152     //char bboxdiag[1000];
3153     //sprintf(bboxdiag,"the bounding box diagonal is: %lf , and the neighborhood search radius is: %lf ",vec.get_longueur(),search_radius);
3154     //affiche((char*) bboxdiag);
3155     OT_VECTEUR_3D average=(vecmin+vecmax)/2.;
3156     double length=sqrt(lengthvec*lengthvec);
3157 sattarpa 809 double bxr=1.1; //this can be changed sasan
3158 sattarpa 695 xmin=average.get_x()-(length*bxr);ymin=average.get_y()-(length*bxr);zmin=average.get_z()-(length*bxr);
3159     xmax=average.get_x()+(length*bxr);ymax=average.get_y()+(length*bxr);zmax=average.get_z()+(length*bxr);
3160     TPL_OCTREE<MG_TRIANGLE*,MG_NOEUD*> octree;
3161     octree.initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
3162     LISTE_MG_TRIANGLE::iterator it9;
3163     for (MG_TRIANGLE* tri=mai->get_premier_triangle(it9);tri!=NULL;tri=mai->get_suivant_triangle(it9))
3164     octree.inserer(tri);
3165     TPL_OCTREE<MG_NOEUD*,MG_NOEUD*> octreends;
3166     octreends.initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
3167     for (MG_NOEUD* no=mai->get_premier_noeud(it);no!=NULL;no=mai->get_suivant_noeud(it))
3168     octreends.inserer(no);
3169    
3170 sattarpa 809
3171     for(std::vector<double*>::iterator ilstsmplpoints=lstsmplpoints.begin();ilstsmplpoints!=lstsmplpoints.end();ilstsmplpoints++)
3172     {
3173     int virtual_project=0;
3174     double* p=(*ilstsmplpoints);
3175     //cout<<"p[0]= "<<p[0]<<" p[0]= "<<p[1]<<" p[0]= "<<p[2]<<endl;
3176 sattarpa 695 // determine the normal of geometry in the inserting point coordination and saving in "normale"
3177     double normale[3];
3178     //////////////////////////////// if no geometry
3179 sattarpa 809 TPL_MAP_ENTITE<MG_NOEUD*> lstneind;
3180     int neitrinbmp=lstneind.get_nb();
3181     while(neitrinbmp==0)
3182     {
3183     octreends.rechercher(p[0],p[1],p[2],search_radius,lstneind);
3184     neitrinbmp=lstneind.get_nb();
3185     search_radius=search_radius+0.00001*search_radius;
3186     }
3187     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itnormtstnd;
3188 sattarpa 695
3189 sattarpa 809 std::multimap<double,MG_NOEUD*,std::less<double>> lstmpneind;
3190     for (MG_NOEUD* ndnei1=lstneind.get_premier(itnormtstnd);ndnei1!=NULL;ndnei1=lstneind.get_suivant(itnormtstnd))
3191     {
3192     double dist=sqrt((ndnei1->get_x()-p[0])*(ndnei1->get_x()-p[0])+(ndnei1->get_y()-p[1])*(ndnei1->get_y()-p[1])+(ndnei1->get_z()-p[2])*(ndnei1->get_z()-p[2]));
3193     lstmpneind.insert(pair<double,MG_NOEUD*>(dist,ndnei1));
3194     }
3195     std::multimap<double,MG_NOEUD*,std::less<double>>::iterator itlstmpneind=lstmpneind.begin();
3196     //cout<<"cls dist= "<< (*itlstmpneind).first<<endl;
3197     MG_NOEUD* clsnd=(*itlstmpneind).second;
3198     TPL_MAP_ENTITE<MG_TRIANGLE*> lstneitrindcls;
3199     for(int iitlstmpneind=0;iitlstmpneind<clsnd->get_lien_triangle()->get_nb();iitlstmpneind++)
3200     lstneitrindcls.ajouter(clsnd->get_lien_triangle()->get(iitlstmpneind));
3201    
3202     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR itnormtst;
3203     OT_VECTEUR_3D normale_discrete(0.,0.,0.);
3204     for (MG_TRIANGLE* tri1=lstneitrindcls.get_premier(itnormtst);tri1!=NULL;tri1=lstneitrindcls.get_suivant(itnormtst))
3205     {
3206     OT_VECTEUR_3D vec1(tri1->get_noeud1()->get_coord(),tri1->get_noeud2()->get_coord());
3207     OT_VECTEUR_3D vec2(tri1->get_noeud1()->get_coord(),tri1->get_noeud3()->get_coord());
3208     OT_VECTEUR_3D normtst=(vec1&vec2); normtst.norme();
3209     normale_discrete=normtst+normale_discrete;
3210     }
3211     normale_discrete.norme();
3212     /*
3213 sattarpa 695 TPL_MAP_ENTITE<MG_TRIANGLE*> lstneitri;
3214     int neitrinb=lstneitri.get_nb();
3215     while(neitrinb==0)
3216     {
3217 sattarpa 739 octree.rechercher(p[0],p[1],p[2],search_radius,lstneitri);
3218 sattarpa 695 neitrinb=lstneitri.get_nb();
3219 sattarpa 809 //cout<<"neitrinb= "<<neitrinb<<endl;
3220 sattarpa 695 search_radius=search_radius+0.00001*search_radius;
3221     }
3222     //cout<<"lstneitri.get_nb()= "<<lstneitri.get_nb()<<endl;
3223     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR itnormtst;
3224     OT_VECTEUR_3D normale_discrete(0.,0.,0.);
3225     for (MG_TRIANGLE* tri1=lstneitri.get_premier(itnormtst);tri1!=NULL;tri1=lstneitri.get_suivant(itnormtst))
3226     {
3227     OT_VECTEUR_3D vec1(tri1->get_noeud1()->get_coord(),tri1->get_noeud2()->get_coord());
3228     OT_VECTEUR_3D vec2(tri1->get_noeud1()->get_coord(),tri1->get_noeud3()->get_coord());
3229     OT_VECTEUR_3D normtst=(vec1&vec2); normtst.norme();
3230     //cout<<"normtst.get_x()= "<<normtst.get_x()<<" normtst.get_y()= "<<normtst.get_y()<<" normtst.get_z()= "<<normtst.get_z()<<endl;
3231     normale_discrete=normtst+normale_discrete;
3232     }
3233     normale_discrete.norme();
3234 sattarpa 809 */
3235 sattarpa 695 normale[0]=normale_discrete.get_x(); normale[1]=normale_discrete.get_y(); normale[2]=normale_discrete.get_z();
3236 sattarpa 739 ///cout<<"normale[0]= "<<normale[0]<<" normale[1]= "<<normale[1]<<" normale[2]= "<<normale[2]<<endl;
3237 sattarpa 695 ////////////////////////////////
3238    
3239     TPL_MAP_ENTITE<MG_TRIANGLE*> lstneitri1;
3240     int neitrinb1=lstneitri1.get_nb();
3241 sattarpa 739 double search_radius1=2.;//sasan
3242 sattarpa 695 while(neitrinb1==0)
3243     {
3244     octree.rechercher(p[0],p[1],p[2],search_radius1,lstneitri1);
3245     neitrinb1=lstneitri1.get_nb();
3246     search_radius1=search_radius1+0.00001*search_radius1;
3247     }
3248     //cout<<"lstneitri1.get_nb()= "<<lstneitri1.get_nb()<<endl;
3249     double pproj[3];
3250     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR inspi;
3251    
3252     for (MG_TRIANGLE* insphertri=lstneitri1.get_premier(inspi);insphertri!=NULL;insphertri=lstneitri1.get_suivant(inspi))
3253     {
3254     //while (tri_found<1 || beshmar<lstneitri.get_nb())
3255     MG_NOEUD* inspnd1=insphertri->get_noeud1();
3256     MG_NOEUD* inspnd2=insphertri->get_noeud2();
3257     MG_NOEUD* inspnd3=insphertri->get_noeud3();
3258     OT_VECTEUR_3D tvec1(inspnd1->get_coord(),inspnd2->get_coord());
3259     OT_VECTEUR_3D tvec2(inspnd1->get_coord(),inspnd3->get_coord());
3260     OT_VECTEUR_3D tnorm=(tvec1&tvec2); tnorm.norme();
3261     OT_VECTEUR_3D norm=normale;
3262 sattarpa 809 //norm.change_x(0.854556);norm.change_y(0.499603);norm.change_z(-0.141879);
3263     //cout<<"norm= "<<norm<<endl;
3264 sattarpa 695 double parallel=norm*tnorm;
3265     //cout<<"parallel= "<<parallel<<endl;
3266 sattarpa 809
3267 sattarpa 695 if (parallel>0.7 || parallel<-0.7)
3268     {
3269     //cout<<"itis"<<endl;
3270     OT_VECTEUR_3D vvec(inspnd1->get_coord(),p);
3271     double t= (tnorm*vvec)/parallel;
3272     t=-t;
3273     pproj[0]=p[0]+t*norm.get_x();
3274     pproj[1]=p[1]+t*norm.get_y();
3275     pproj[2]=p[2]+t*norm.get_z();
3276     //////////////////////////////////////////////////////////////
3277     //check if the projected p is inside the triangle !!!!!
3278     MG_MAILLAGE_OUTILS tribas;
3279     int tribasval=tribas.estdansletriangle(insphertri,pproj[0],pproj[1],pproj[2]);
3280     int intri=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::INTERIEUR);
3281     int insidtri=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::STRICTINTERIEUR);
3282     int onedge=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::SUR_ARETE);
3283     //printf("projection before is: %16.14lf %16.14lf %16.14lf \n",pproj[0],pproj[1],pproj[2]);
3284 sattarpa 739 //cout<<"intri= "<<intri<<endl;
3285 sattarpa 695 if(intri==1)
3286     {
3287 sattarpa 809 virtual_project++;
3288     //cout<<"intri==1"<<endl;
3289 sattarpa 699 //printf("projection is: %16.14lf %16.14lf %16.14lf \n",pproj[0],pproj[1],pproj[2]);
3290 sattarpa 739 OT_VECTEUR_3D disprojp(p,pproj);
3291 sattarpa 809 //cout<<"V1 SCAN distance proj-p= "<<disprojp.get_longueur()<<" p[0]" << p[0]<<" p[1] " << p[1] <<" p[2] "<< p[2] <<endl;
3292     double* proj=new double[4];
3293     proj[0]=pproj[0]; proj[1]=pproj[1]; proj[2]=pproj[2]; proj[3]=1;
3294     //lstsmplpoints_afterprojection.insert(pair<double,double*> (disprojp.get_longueur(),proj));
3295 sattarpa 699 lstsmplpoints_afterprojection.push_back(proj);
3296 sattarpa 695 }
3297 sattarpa 809
3298 sattarpa 739 }
3299 sattarpa 695
3300     }
3301 sattarpa 809
3302     if(virtual_project==0)
3303     {
3304     double* proj_virt=new double[4];
3305     proj_virt[0]=0; proj_virt[1]=0; proj_virt[2]=0; proj_virt[3]=0;
3306     lstsmplpoints_afterprojection.push_back(proj_virt);
3307     //cout<<"V0 SCAN distance proj-p= "<<0<<" p[0]" << p[0]<<" p[1] " << p[1] <<" p[2] "<< p[2] <<endl;
3308     }
3309    
3310 sattarpa 695 }
3311 sattarpa 699 return lstsmplpoints_afterprojection;
3312     }
3313 sattarpa 809
3314    
3315 sattarpa 699 void CRIAQOPERATORS::sp_project_onCAD_SCAN(char* magicfilenamecad,int nummaicad,char* samplepointscad,char* magicfilenamescn,int nummaiscn,char* samplepointsscn,char* outputspbcfilename)
3316     {
3317     std::vector<double*> sprojcad;
3318     sprojcad=sp_project_onCAD(magicfilenamecad,nummaicad,samplepointscad);
3319     std::vector<double*> sprojscn;
3320     sprojscn=sp_project_onSCAN(magicfilenamescn,nummaiscn,samplepointsscn);
3321    
3322     int sizesm;
3323     if(sprojcad.size()==sprojscn.size())
3324     sizesm=sprojcad.size();
3325     else
3326 sattarpa 809 cout<<"not sprojcad.size()==sprojscn.size() !!!!!!!!!!!"<<endl;
3327 sattarpa 699 cout<<"sprojcad.size()= "<<sprojcad.size()<<endl;
3328     cout<<"sprojscn.size()= "<<sprojscn.size()<<endl;
3329     FILE* insmp=fopen(outputspbcfilename,"wt");/*
3330     for(std::vector<double*>::iterator itsprojcad=sprojcad.begin();itsprojcad!=sprojcad.end();itsprojcad++)
3331     {
3332     double* xyz_cadproj=(*itsprojcad);
3333     cout<<"xyz_cadproj[0]= "<<xyz_cadproj[0]<<endl;
3334    
3335     }*/
3336     std::vector<double*>::iterator itsprojcad=sprojcad.begin();
3337     std::vector<double*>::iterator itsprojscn=sprojscn.begin();
3338    
3339     for(int iitt=0;iitt<sizesm;iitt++)
3340     {
3341     if(iitt>0)
3342     {
3343     itsprojcad++;
3344     itsprojscn++;
3345     }
3346     double* xyz_cadproj=(*itsprojcad);
3347     double* xyz_scnproj=(*itsprojscn);
3348 sattarpa 809 if(xyz_cadproj[3]==1 && xyz_scnproj[3]==1)
3349     {
3350     fprintf(insmp,"%le %le %le %le %le %le \n",xyz_cadproj[0],xyz_cadproj[1],xyz_cadproj[2],(xyz_scnproj[0]-xyz_cadproj[0]),(xyz_scnproj[1]-xyz_cadproj[1]),(xyz_scnproj[2]-xyz_cadproj[2]));
3351     }
3352    
3353 sattarpa 699 }
3354     fclose(insmp);
3355    
3356    
3357 sattarpa 739 }
3358    
3359     void CRIAQOPERATORS::ajouter_nois_normdir(char* magicfilename,int nummai,char* noisefile,char* outputfilename)
3360     {
3361     MG_FILE gest(magicfilename);
3362 sattarpa 761 MG_MAILLAGE* mai;
3363     if (nummai==0) mai=gest.get_mg_maillage(nummai); else mai=gest.get_mg_maillageid(nummai);
3364 sattarpa 739 /*
3365     double xmin=1e308,ymin=1e308,zmin=1e308,xmax=-1e308,ymax=-1e308,zmax=-1e308;
3366     TPL_MAP_ENTITE<MG_NOEUD*> lstnoeud;
3367     LISTE_MG_NOEUD::iterator it;
3368     for (MG_NOEUD* no=mai->get_premier_noeud(it);no!=NULL;no=mai->get_suivant_noeud(it))
3369     {
3370     if (no->get_x()<xmin) xmin=no->get_x();
3371     if (no->get_y()<ymin) ymin=no->get_y();
3372     if (no->get_z()<zmin) zmin=no->get_z();
3373     if (no->get_x()>xmax) xmax=no->get_x();
3374     if (no->get_y()>ymax) ymax=no->get_y();
3375     if (no->get_z()>zmax) zmax=no->get_z();
3376     lstnoeud.ajouter(no);
3377     }
3378     OT_VECTEUR_3D vecmin(xmin,ymin,zmin);
3379     OT_VECTEUR_3D vecmax(xmax,ymax,zmax);
3380     OT_VECTEUR_3D lengthvec(vecmin,vecmax);
3381     double search_radius=5.0;//0.0000001;
3382     //double search_radius=0.001*(lengthvec.get_longueur());
3383     //char bboxdiag[1000];
3384     //sprintf(bboxdiag,"the bounding box diagonal is: %lf , and the neighborhood search radius is: %lf ",vec.get_longueur(),search_radius);
3385     //affiche((char*) bboxdiag);
3386     OT_VECTEUR_3D average=(vecmin+vecmax)/2.;
3387     double length=sqrt(lengthvec*lengthvec);
3388     double bxr=2.0; //this can be changed sasan
3389     xmin=average.get_x()-(length*bxr);ymin=average.get_y()-(length*bxr);zmin=average.get_z()-(length*bxr);
3390     xmax=average.get_x()+(length*bxr);ymax=average.get_y()+(length*bxr);zmax=average.get_z()+(length*bxr);
3391     TPL_OCTREE<MG_TRIANGLE*,MG_NOEUD*> octree;
3392     octree.initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
3393     LISTE_MG_TRIANGLE::iterator it9;
3394     for (MG_TRIANGLE* tri=mai->get_premier_triangle(it9);tri!=NULL;tri=mai->get_suivant_triangle(it9))
3395     octree.inserer(tri);
3396     TPL_OCTREE<MG_NOEUD*,MG_NOEUD*> octreends;
3397     octreends.initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
3398     for (MG_NOEUD* no=mai->get_premier_noeud(it);no!=NULL;no=mai->get_suivant_noeud(it))
3399     octreends.inserer(no);
3400     */
3401    
3402     TPL_LISTE_ENTITE<double> randomnumbr;
3403     FILE *in=fopen(noisefile,"rt");
3404     if (in==NULL)
3405     cout<< "file is not available"<<endl;
3406     while (!feof(in))
3407     {
3408     char chaine[500];
3409     char* res=fgets(chaine,500,in);
3410     if(res!=NULL)
3411     {
3412     double rndnbr;
3413     int nb=sscanf(chaine,"%le",&rndnbr);
3414     if (nb!=-1 && nb!=1)
3415     cout<<"Wrong file format"<<endl;
3416     else if (nb!=-1 && nb==1)
3417     {
3418     randomnumbr.ajouter(rndnbr);
3419     }
3420     }
3421     }
3422     fclose(in);
3423     cout<<"randomnumbr.get_nb()= "<<randomnumbr.get_nb()<<endl;
3424     cout<<"mai->get_nb_mg_noeud()= "<<mai->get_nb_mg_noeud()<<endl;
3425     LISTE_MG_NOEUD::iterator itnd;
3426     MG_NOEUD* noeu=mai->get_premier_noeud(itnd);
3427     for(int i=0;i<randomnumbr.get_nb();i++)
3428     {
3429     //cout<<"i= "<<i<<endl;
3430     double rndno=randomnumbr.get(i);
3431     //for(MG_NOEUD* noeu=mai->get_premier_noeud(itnd);noeu!=NULL;noeu=mai->get_suivant_noeud(itnd))
3432     {
3433     TPL_MAP_ENTITE<MG_TRIANGLE*> lstneitri;
3434     /*double search_rad1=search_radius;
3435     int neitrinb=lstneitri.get_nb();
3436     while(neitrinb==0)
3437     {
3438     octree.rechercher(noeu->get_x(),noeu->get_y(),noeu->get_z(),search_rad1,lstneitri);
3439     neitrinb=lstneitri.get_nb();
3440     search_rad1=search_rad1+0.00001*search_rad1;
3441     }
3442     cout<<"lstneitri.get_nb()= "<<lstneitri.get_nb()<<endl;
3443     */
3444     OT_VECTEUR_3D w_n_tot(0.,0.,0.);
3445     double norme_w_n_tot=0.;
3446     OT_VECTEUR_3D w2_n_tot(0.,0.,0.);
3447     double norme_w2_n_tot=0.;
3448     int nbtri=noeu->get_lien_triangle()->get_nb();
3449     for (int ii=0;ii<nbtri;ii++)
3450     {
3451     MG_TRIANGLE* tri=(MG_TRIANGLE*)noeu->get_lien_triangle()->get(ii);
3452     //tri->change_origine(IMPOSE);
3453     double *xyzn1=tri->get_noeud1()->get_coord();
3454     double *xyzn2=tri->get_noeud2()->get_coord();
3455     double *xyzn3=tri->get_noeud3()->get_coord();
3456     OT_VECTEUR_3D vec1(xyzn1,xyzn3);
3457     OT_VECTEUR_3D vec2(xyzn1,xyzn2);
3458     OT_VECTEUR_3D n_tri=vec1&vec2; // Normale au triangle
3459    
3460     double w=n_tri.get_longueur(); // 2 fois l'aire du triangle (pour éviter une division par 2)
3461     n_tri.norme();
3462     OT_VECTEUR_3D w_n=w*n_tri;
3463     double norme_w_n=w_n.get_longueur();
3464     w_n_tot=w_n_tot+w_n;
3465     norme_w_n_tot=norme_w_n_tot+norme_w_n;
3466     }
3467    
3468     OT_VECTEUR_3D normale_discrete=w_n_tot/norme_w_n_tot; // Normale à la surface au noeud
3469     normale_discrete.norme();
3470    
3471     double xyz_new[3];
3472     xyz_new[0]=noeu->get_x()+(rndno*normale_discrete.get_x());
3473     xyz_new[1]=noeu->get_y()+(rndno*normale_discrete.get_y());
3474     xyz_new[2]=noeu->get_z()+(rndno*normale_discrete.get_z());
3475     noeu->change_coord(xyz_new);
3476     }
3477     noeu=mai->get_suivant_noeud(itnd);
3478     }
3479     gest.enregistrer(outputfilename);
3480     }
3481    
3482    
3483