ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/app/criaqoperation/src/criaqoperators.cpp
Revision: 761
Committed: Wed Nov 18 21:28:15 2015 UTC (9 years, 8 months ago) by sattarpa
File size: 141284 byte(s)
Log Message:
modification sur "bumparea_calcul" et "ins_point_withbc".

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