MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
mg_fast_marching.cpp
Aller à la documentation de ce fichier.
1 //####//------------------------------------------------------------
2 //####//------------------------------------------------------------
3 //####// MAGiC
4 //####// Jean Christophe Cuilliere et Vincent FRANCOIS
5 //####// Departement de Genie Mecanique - UQTR
6 //####//------------------------------------------------------------
7 //####// MAGIC est un projet de recherche de l equipe ERICCA
8 //####// du departement de genie mecanique de l Universite du Quebec a Trois Rivieres
9 //####// http://www.uqtr.ca/ericca
10 //####// http://www.uqtr.ca/
11 //####//------------------------------------------------------------
12 //####//------------------------------------------------------------
13 //####//
14 //####// mg_fast_marching.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:56 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 
23 
24 #include "gestionversion.h"
25 #include "mg_fast_marching.h"
26 #include "mg_gestionnaire.h"
27 #include "fem_maillage.h"
28 #include "fem_triangle3.h"
29 #include "fem_solution.h"
30 #include "tpl_map_entite.h"
32 #include "ot_mathematique.h"
33 #include <math.h>
34 #include "pars_argument.h"
35 #include "parse.h"
36 #include "fem_maillage_outils.h"
37 #include "ot_boite_3d.h"
38 
39 
40 namespace MAGIC
41 {
42 #define INFINI 1e300
43 
44 
45 
46 MG_FAST_MARCHING::MG_FAST_MARCHING(FEM_SOLUTION* solu,int numchamp):MAGIC_AFFICHE(),sol(solu),num(numchamp),fem(solu->get_maillage()),nbnoeudinit(0)
47 {
48 }
49 
50 MG_FAST_MARCHING::MG_FAST_MARCHING(MG_FAST_MARCHING &mdd):MAGIC_AFFICHE(mdd),sol(mdd.sol),num(mdd.num),fem(mdd.fem),nbnoeudinit(0)
51 {
52 }
53 
54 
56 {
57 }
58 
59 
60 
62 {
64 LISTE_FEM_NOEUD::iterator it;
65 int i=0; // pour debug
66 for (FEM_NOEUD* no=fem->get_premier_noeud(it);no!=NULL;no=fem->get_suivant_noeud(it))
67  {
68  no->change_solution(INFINI);
69  i++; // pour debug
70  no->change_numero_opt(i); // pour debug
71  }
72 
73 }
74 
75 void MG_FAST_MARCHING::init_noeud(std::vector<FEM_NOEUD*>& lst)
76 {
77 int nb=lst.size();
78 for (int i=0;i<nb;i++)
79  {
80  FEM_NOEUD* no=lst[i];
81  no->change_solution(0.0);
82  nbnoeudinit++;
83  last=lst[i];
84  }
85 }
86 
87 
88 void MG_FAST_MARCHING::init_noeud(char* entite)
89 {
90 std::vector<FEM_NOEUD*> lst;
91 PARS_ARGUMENT param[100];
92 PARSE parse;
93 parse.decode(entite,"&",param);
94 int nb=param[0].argument.size();
96 for (int i=0;i<nb;i++)
97  {
98  int num=atoi(param[0].argument[i].c_str());
99  MG_ELEMENT_TOPOLOGIQUE *ele=NULL;
100  ele=geo->get_mg_sommetid(num);
101  if (ele!=NULL)
102  {
103  int nbele=ele->get_lien_fem_maillage()->get_nb();
104  for (int j=0;j<nbele;j++)
105  {
106  FEM_NOEUD* no=(FEM_NOEUD*)ele->get_lien_fem_maillage()->get(j);
107  if (fem->get_fem_noeudid(no->get_id())==no) lst.push_back(no);
108  }
109  }
110  else
111  {
112  ele=geo->get_mg_areteid(num);
113  if (ele!=NULL)
114  {
115  int nbele=ele->get_lien_fem_maillage()->get_nb();
116  for (int j=0;j<nbele;j++)
117  {
119  if (fem->get_fem_element1id(el->get_id())==el)
120  {
121  int nbno=el->get_nb_fem_noeud();
122  for (int k=0;k<nbno;k++)
123  lst.push_back(el->get_fem_noeud(k));
124  }
125  }
126  }
127  else
128  {
129  ele=geo->get_mg_faceid(num);
130  if (ele!=NULL)
131  {
132  int nbele=ele->get_lien_fem_maillage()->get_nb();
133  for (int j=0;j<nbele;j++)
134  {
136  if (fem->get_fem_element2id(el->get_id())==el)
137  {
138  int nbno=el->get_nb_fem_noeud();
139  for (int k=0;k<nbno;k++)
140  lst.push_back(el->get_fem_noeud(k));
141  }
142  }
143  }
144  else
145  {
146  ele=geo->get_mg_volumeid(num);
147  if (ele!=NULL)
148  {
149  int nbele=ele->get_lien_fem_maillage()->get_nb();
150  for (int j=0;j<nbele;j++)
151  {
153  if (fem->get_fem_element3id(el->get_id())==el)
154  {
155  int nbno=el->get_nb_fem_noeud();
156  for (int k=0;k<nbno;k++)
157  lst.push_back(el->get_fem_noeud(k));
158  }
159  }
160  }
161 
162  }
163  }
164  }
165  }
166 init_noeud(lst);
167 }
168 
169 /*
170 void MG_FAST_MARCHING::init_coord(double x,double y,double z)
171 {
172 TPL_LISTE_ENTITE<FEM_NOEUD*> lst;
173 LISTE_FEM_NOEUD::iterator it;
174 BOITE_3D boite;
175 FEM_NOEUD* no=fem->get_premier_noeud(it);
176 boite=no->get_boite_3D();
177 for (FEM_NOEUD* no=fem->get_premier_noeud(it);no!=NULL;no=fem->get_suivant_noeud(it))
178  {
179  BOITE_3D boitetmp=no->get_boite_3D();
180  boite=boite+boitetmp;
181  lst.ajouter(no);
182  }
183 
184 boite.change_grosseur(1.05);
185 oc.initialiser(&lst,1,boite.get_xmin(),boite.get_ymin(),boite.get_zmin(),boite.get_xmax(),boite.get_ymax(),boite.get_zmax());
186 LISTE_FEM_ELEMENT2::iterator it2;
187 for (FEM_ELEMENT2* ele=fem->get_premier_element2(it2);ele!=NULL;ele=fem->get_suivant_element2(it2))
188  oc.inserer(ele);
189 TPL_MAP_ENTITE<FEM_ELEMENT2*> lst2;
190 oc.rechercher(x,y,z,0.000000001,lst2);
191 int nb=lst2.get_nb();
192 TPL_MAP_ENTITE<FEM_ELEMENT2*>::ITERATEUR ite;
193 for (FEM_ELEMENT2* ele=lst2.get_premier(ite);ele!=NULL;ele=lst2.get_suivant(ite))
194  {
195  FEM_MAILLAGE_OUTILS ot;
196  //int num=ot.estdansletriangle(ele,x,y,z);
197  int num=ot.projeteestdansletriangle(ele,x,y,z);
198  int res=OPERATEUR::compare_etat_triangle(num,OPERATEUR::INTERIEUR);
199  if (res)
200  {
201  double xyz[3]={x,y,z};
202  for (int i=0;i<3;i++)
203  {
204  double *xyz1=ele->get_fem_noeud(i)->get_coord();
205  OT_VECTEUR_3D vec(xyz,xyz1);
206  ele->get_fem_noeud(i)->change_solution(vec.get_longueur());
207  }
208  }
209  }
210 }*/
211 
212 /*
213 double MG_FAST_MARCHING::get_valeur(double x,double y,double z)
214 {
215 TPL_MAP_ENTITE<FEM_ELEMENT2*> lst2;
216 oc.rechercher(x,y,z,0.000000001,lst2);
217 TPL_MAP_ENTITE<FEM_ELEMENT2*>::ITERATEUR ite;
218 for (FEM_ELEMENT2* ele=lst2.get_premier(ite);ele!=NULL;ele=lst2.get_suivant(ite))
219  {
220  FEM_MAILLAGE_OUTILS ot;
221  //int num=ot.estdansletriangle(ele,x,y,z);
222  int num=ot.projeteestdansletriangle(ele,x,y,z);
223  int res=OPERATEUR::compare_etat_triangle(num,OPERATEUR::INTERIEUR);
224  if (res)
225  {
226  double xyz[3]={x,y,z};
227  double uvw[3];
228  ele->get_param_element_fini_2D(xyz,uvw);
229  double val=0;
230  for (int i=0;i<ele->get_nb_fem_noeud();i++)
231  val=val+ele->get_fonction_interpolation(i+1,uvw)*ele->get_fem_noeud(i)->get_solution();
232  return val;
233  }
234  }
235 return 0.;
236 }
237 */
238 
239 
241 {
242 int i=0;
243 LISTE_FEM_NOEUD::iterator it;
244 for (FEM_NOEUD* no=fem->get_premier_noeud(it);no!=NULL;no=fem->get_suivant_noeud(it))
245  {
246  sol->ecrire(no->get_solution(),i,num);
247  i++;
248  }
249 }
250 /*
251 void MG_FAST_MARCHING::propage(double vitesse)
252 {
253 if (nbnoeudinit==1)
254  {
255  int nb;
256  if (dimension==3) nb=last->get_lien_element3()->get_nb();
257  if (dimension==2) nb=last->get_lien_element2()->get_nb();
258  TPL_MAP_ENTITE<FEM_NOEUD*> noproche;
259  for (int i=0;i<nb;i++)
260  {
261  if (dimension==3)
262  {
263  FEM_ELEMENT3* ele=last->get_lien_element3()->get(i);
264  for (int j=0;j<ele->get_nb_fem_noeud();j++)
265  noproche.ajouter(ele->get_fem_noeud(j));
266  }
267  if (dimension==2)
268  {
269  FEM_ELEMENT2* ele=last->get_lien_element2()->get(i);
270  for (int j=0;j<ele->get_nb_fem_noeud();j++)
271  noproche.ajouter(ele->get_fem_noeud(j));
272  }
273  }
274  TPL_MAP_ENTITE<FEM_NOEUD*>::ITERATEUR it;
275  for (FEM_NOEUD* no=noproche.get_premier(it);no!=NULL;no=noproche.get_suivant(it))
276  if (no!=last)
277  {
278  OT_VECTEUR_3D vec(no->get_coord(),last->get_coord());
279  no->change_solution(vec.get_longueur()*vitesse);
280  }
281 
282  }
283 if (dimension==2) propage2(vitesse);
284 if (dimension==3) propage3(vitesse);
285 finalise();
286 }
287 
288 
289 void MG_FAST_MARCHING::propage2(double vitesse)
290 {
291 TPL_LISTE_ENTITE<FEM_ELEMENT2*> know,trial,far;
292 LISTE_FEM_ELEMENT2::iterator it;
293 for (FEM_ELEMENT2* ele=fem->get_premier_element2(it);ele!=NULL;ele=fem->get_suivant_element2(it))
294  {
295  int nb=ele->get_nb_fem_noeud();
296  int nbsol=0;
297  for (int i=0;i<nb;i++)
298  if (ele->get_fem_noeud(i)->get_solution()<INFINI)
299  {
300  nbsol++;
301  ele->get_fem_noeud(i)->change_numero(-1);
302  }
303  else ele->get_fem_noeud(i)->change_numero(1);
304  if ((nbsol==0)||(nbsol==1)) far.ajouter(ele);
305  if (nbsol==2) trial.ajouter(ele);
306  if (nbsol==3) know.ajouter(ele);
307  ele->change_numero(nbsol);
308  }
309 std::multimap<double,FEM_NOEUD*> trialnoeud;
310 std::map<FEM_NOEUD*,std::multimap<double,FEM_NOEUD*>::iterator> trialnoeud2;
311 
312 for (int i=0;i<trial.get_nb();i++)
313  {
314  FEM_ELEMENT2* ele=trial.get(i);
315  FEM_NOEUD* no;
316  double res;
317  int numno;
318  int erreur=resoudgradTtriangle(ele,vitesse,&no,&res);
319  no->change_solution(std::min(res,no->get_solution()));
320  std::map<FEM_NOEUD*,std::multimap<double,FEM_NOEUD*>::iterator>::iterator itf=trialnoeud2.find(no);
321  if (itf!=trialnoeud2.end())
322  {
323  trialnoeud.erase(itf->second);
324  trialnoeud2.erase(itf);
325  }
326  std::pair<double,FEM_NOEUD*> p(res,no);
327  std::multimap<double,FEM_NOEUD*>::iterator it=trialnoeud.insert(p);
328  std::pair<FEM_NOEUD*,std::multimap<double,FEM_NOEUD*>::iterator > p2(no,it);
329  trialnoeud2.insert(p2);
330  }
331 int compteur=0;
332 FEM_NOEUD* next=NULL;
333 while (trialnoeud.size()!=0)
334  {
335  compteur++;
336  if (compteur>10000000) return;
337  bool globalerreur=false;
338  if (next==NULL) next=trialnoeud.begin()->second;
339  FEM_NOEUD* no=next;
340  next=NULL;
341  int nbele=no->get_lien_element2()->get_nb();
342  no->change_numero(0);
343  std::vector<FEM_ELEMENT2*> lst;
344  for (int i=0;i<nbele;i++)
345  {
346  FEM_ELEMENT2* ele=no->get_lien_element2()->get(i);
347  int nbnum=ele->get_numero();
348  //int n1=ele->get_fem_noeud(0)->get_numero_opt();
349  //int n2=ele->get_fem_noeud(1)->get_numero_opt();
350  //int n3=ele->get_fem_noeud(2)->get_numero_opt();
351  nbnum++;
352  if (nbnum>3) nbnum=3;
353  if (nbnum==2)
354  {
355  FEM_NOEUD* nvno;
356  double res;
357  int numno;
358  int erreur=resoudgradTtriangle(ele,vitesse,&nvno,&res);
359  double T=std::min(res,nvno->get_solution());
360  nvno->change_solution(T);
361  std::map<FEM_NOEUD*,std::multimap<double,FEM_NOEUD*>::iterator>::iterator it=trialnoeud2.find(nvno);
362  if (it!=trialnoeud2.end())
363  {
364  trialnoeud.erase(it->second);
365  trialnoeud2.erase(it);
366  }
367  std::pair<double,FEM_NOEUD*> p(T,nvno);
368  std::multimap<double,FEM_NOEUD*>::iterator it2=trialnoeud.insert(p);
369  std::pair<FEM_NOEUD*,std::multimap<double,FEM_NOEUD*>::iterator > p2(nvno,it2);
370  trialnoeud2.insert(p2);
371  }
372  ele->change_numero(nbnum);
373  lst.push_back(ele);
374  }
375  if (globalerreur==false)
376  {
377  std::map<FEM_NOEUD*,std::multimap<double,FEM_NOEUD*>::iterator>::iterator it=trialnoeud2.find(no);
378  if (it!=trialnoeud2.end())
379  {
380  trialnoeud.erase(it->second);
381  trialnoeud2.erase(it);
382  }
383  }
384  }
385 }
386 */
387 /*bool MG_FAST_MARCHING::noeud_est_dans_espace_element(FEM_ELEMENT2* ele,FEM_NOEUD* noele,FEM_NOEUD* no)
388 {
389 FEM_NOEUD *noa,*nob,*noc;
390 if (ele->get_fem_noeud(0)==noele)
391  {noc=noele;noa=ele->get_fem_noeud(1);nob=ele->get_fem_noeud(2);}
392 if (ele->get_fem_noeud(1)==noele)
393  {noc=noele;noa=ele->get_fem_noeud(0);nob=ele->get_fem_noeud(2);}
394 if (ele->get_fem_noeud(2)==noele)
395  {noc=noele;noa=ele->get_fem_noeud(0);nob=ele->get_fem_noeud(1);}
396 OT_VECTEUR_3D vecca(noc->get_coord(),noa->get_coord());
397 OT_VECTEUR_3D veccb(noc->get_coord(),nob->get_coord());
398 OT_VECTEUR_3D veccn(noc->get_coord(),no->get_coord());
399 vecca.norme();
400 veccb.norme();
401 veccn.norme();
402 double psref=vecca*veccb;
403 double psa=vecca*veccn;
404 double psb=veccb*veccn;
405 if (psref>1.) psref=1.;
406 if (psa>1.) psa=1.;
407 if (psb>1.) psb=1.;
408 if (psref<-1.) psref=-1.;
409 if (psa<-1.) psa=-1.;
410 if (psb<-1.) psb=-1.;
411 double angleref=acos(psref);
412 double anglea=acos(psa);
413 double angleb=acos(psb);
414 double epsangle=2.*M_PI*1e-8;
415 if ((anglea<angleref+epsangle) && (angleb<angleref+epsangle))
416  return true;
417 return false;
418 }
419 */
420 /*bool MG_FAST_MARCHING::traite_particulier2(FEM_ELEMENT2 *ele,FEM_NOEUD* no,double v,double *res)
421 {
422 TPL_LISTE_UNIQUE_ENTITE<FEM_NOEUD*> vecnoeud;
423 
424 FEM_NOEUD* notmp;
425 if (ele->get_fem_noeud(0)->get_numero()<1) notmp=ele->get_fem_noeud(0);
426 if (ele->get_fem_noeud(1)->get_numero()<1) notmp=ele->get_fem_noeud(1);
427 if (ele->get_fem_noeud(2)->get_numero()<1) notmp=ele->get_fem_noeud(2);
428 int nbele=no->get_lien_element2()->get_nb();
429 for (int i=0;i<nbele;i++)
430  {
431  FEM_ELEMENT2* eletmp=no->get_lien_element2()->get(i);
432  if (eletmp->get_fem_noeud(0)->get_numero()<1) vecnoeud.ajouter(eletmp->get_fem_noeud(0));
433  if (eletmp->get_fem_noeud(1)->get_numero()<1) vecnoeud.ajouter(eletmp->get_fem_noeud(1));
434  if (eletmp->get_fem_noeud(2)->get_numero()<1) vecnoeud.ajouter(eletmp->get_fem_noeud(2));
435  }
436 if (notmp->get_numero()==0)
437  {
438  nbele=notmp->get_lien_element2()->get_nb();
439  for (int i=0;i<nbele;i++)
440  {
441  FEM_ELEMENT2* eletmp=notmp->get_lien_element2()->get(i);
442  if (eletmp->get_fem_noeud(0)->get_numero()<1) vecnoeud.ajouter(eletmp->get_fem_noeud(0));
443  if (eletmp->get_fem_noeud(1)->get_numero()<1) vecnoeud.ajouter(eletmp->get_fem_noeud(1));
444  if (eletmp->get_fem_noeud(2)->get_numero()<1) vecnoeud.ajouter(eletmp->get_fem_noeud(2));
445  }
446  for (int i=0;i<3;i++)
447  {
448  if (vecnoeud.get(i)->get_numero()==-1) continue;
449  nbele=vecnoeud.get(i)->get_lien_element2()->get_nb();
450  for (int j=0;j<nbele;j++)
451  {
452  FEM_ELEMENT2* eletmp=vecnoeud.get(i)->get_lien_element2()->get(j);
453  if (eletmp->get_fem_noeud(0)->get_numero()<1) vecnoeud.ajouter(eletmp->get_fem_noeud(0));
454  if (eletmp->get_fem_noeud(1)->get_numero()<1) vecnoeud.ajouter(eletmp->get_fem_noeud(1));
455  if (eletmp->get_fem_noeud(2)->get_numero()<1) vecnoeud.ajouter(eletmp->get_fem_noeud(2));
456  }
457  }
458  }
459 
460 
461 int nbsol=vecnoeud.get_nb();
462 FEM_NOEUD* nvno;
463 int erreur=1;
464 int i=0,j=1;
465 do
466  {
467  if (nbsol>1)
468  {
469  FEM_NOEUD* tab[3];
470  tab[0]=vecnoeud.get(i);
471  tab[1]=vecnoeud.get(j);
472  tab[2]=no;
473  if (noeud_est_dans_espace_element(ele,no,tab[0]))
474  if (noeud_est_dans_espace_element(ele,no,tab[1]))
475  {
476  FEM_NOEUD no1((MG_ELEMENT_TOPOLOGIQUE*)NULL,tab[0]->get_x(),tab[0]->get_y(),tab[0]->get_z());
477  FEM_NOEUD no2((MG_ELEMENT_TOPOLOGIQUE*)NULL,tab[1]->get_x(),tab[1]->get_y(),tab[1]->get_z());
478  FEM_NOEUD no3((MG_ELEMENT_TOPOLOGIQUE*)NULL,tab[2]->get_x(),tab[2]->get_y(),tab[2]->get_z());
479  no1.change_numero(tab[0]->get_numero());
480  no2.change_numero(tab[1]->get_numero());
481  no3.change_numero(tab[2]->get_numero());
482  no1.change_solution(tab[0]->get_solution());
483  no2.change_solution(tab[1]->get_solution());
484  no3.change_solution(tab[2]->get_solution());
485  tab[0]=&no1;
486  tab[1]=&no2;
487  tab[2]=&no3;
488  FEM_TRIANGLE3 eletmp((MG_ELEMENT_TOPOLOGIQUE*)NULL,tab);
489  double qual=OPERATEUR::qualite_triangle(no1.get_coord(),no2.get_coord(),no3.get_coord());
490  if (qual>1e-8)
491  erreur=resoudgradTtriangle(&eletmp,v,&nvno,res);
492  }
493  }
494  j++;
495  if (j==i) j++;
496  if (j>=nbsol)
497  {
498  i++;
499  j=0;
500  }
501  if (i>=nbsol) // Il y a une simgularité impossible de resoudre grad f=vitesse sur un element
502  {
503  *res=0;
504  if (respectgrad==VERSION_CONSERVE_GRADT)
505  {
506  if (ele->get_fem_noeud(0)->get_numero()<1) *res=std::max(*res,ele->get_fem_noeud(0)->get_solution());
507  if (ele->get_fem_noeud(1)->get_numero()<1) *res=std::max(*res,ele->get_fem_noeud(1)->get_solution());
508  if (ele->get_fem_noeud(2)->get_numero()<1) *res=std::max(*res,ele->get_fem_noeud(2)->get_solution());
509  }
510  if (respectgrad==VERSION_CONSERVE_DISTANCE)
511  {
512  if (ele->get_fem_noeud(0)->get_solution()<INFINI) *res=std::max(*res,ele->get_fem_noeud(0)->get_solution());
513  if (ele->get_fem_noeud(1)->get_solution()<INFINI) *res=std::max(*res,ele->get_fem_noeud(1)->get_solution());
514  if (ele->get_fem_noeud(2)->get_solution()<INFINI) *res=std::max(*res,ele->get_fem_noeud(2)->get_solution());
515  }
516  return false;
517  }
518 
519  }
520 while (erreur!=0);
521 return true;
522 }
523 
524 */
525 
526 /*
527 void MG_FAST_MARCHING::propage3(double vitesse)
528 {
529 
530 }
531  */
532 /*
533 int MG_FAST_MARCHING::resoudgradTtriangle(FEM_ELEMENT2* ele,double v,FEM_NOEUD** noupdate,double *res)
534 {
535 int erreur;
536 
537 FEM_NOEUD *noa,*nob,*noc;
538 int numc;
539 if (ele->get_fem_noeud(0)->get_numero()==1) {noc=ele->get_fem_noeud(0);numc=0;}
540 if (ele->get_fem_noeud(1)->get_numero()==1) {noc=ele->get_fem_noeud(1);numc=1;}
541 if (ele->get_fem_noeud(2)->get_numero()==1) {noc=ele->get_fem_noeud(2);numc=2;}
542 *noupdate=noc;
543 int nummin;
544 double solmin=1e300;
545 for (int i=0;i<3;i++)
546 if (i!=numc)
547  {
548  double sol=ele->get_fem_noeud(i)->get_solution();
549  if (sol<solmin) {solmin=sol;nummin=i;}
550  }
551 noa=ele->get_fem_noeud(nummin);
552 if ((nummin!=0) && (numc!=0)) nob=ele->get_fem_noeud(0);
553 if ((nummin!=1) && (numc!=1)) nob=ele->get_fem_noeud(1);
554 if ((nummin!=2) && (numc!=2)) nob=ele->get_fem_noeud(2);
555 double ax=noa->get_x();
556 double ay=noa->get_y();
557 double az=noa->get_z();
558 double bx=nob->get_x();
559 double by=nob->get_y();
560 double bz=nob->get_z();
561 double dx=noc->get_x();
562 double dy=noc->get_y();
563 double dz=noc->get_z();
564 double at=noa->get_solution();
565 double bt=nob->get_solution();
566 double alpha;
567 erreur=val2d(ax,ay,az,bx,by,bz,dx,dy,dz,at,bt,v,(*res),alpha);
568 return erreur;
569 
570 }
571 */
572 /*
573 int MG_FAST_MARCHING::resoudgradTtriangle_sethian(FEM_ELEMENT2* ele,double v,FEM_NOEUD** noupdate,double *res)
574 {
575 FEM_NOEUD *noa,*nob,*noc;
576 int numc;
577 if (ele->get_fem_noeud(0)->get_numero()==1) {noc=ele->get_fem_noeud(0);numc=0;}
578 if (ele->get_fem_noeud(1)->get_numero()==1) {noc=ele->get_fem_noeud(1);numc=1;}
579 if (ele->get_fem_noeud(2)->get_numero()==1) {noc=ele->get_fem_noeud(2);numc=2;}
580 *noupdate=noc;
581 int nummin;
582 double solmin=1e300;
583 for (int i=0;i<3;i++)
584  if (i!=numc)
585  {
586  double sol=ele->get_fem_noeud(i)->get_solution();
587  if (sol<solmin) {solmin=sol;nummin=i;}
588  }
589 noa=ele->get_fem_noeud(nummin);
590 if ((nummin!=0) && (numc!=0)) nob=ele->get_fem_noeud(0);
591 if ((nummin!=1) && (numc!=1)) nob=ele->get_fem_noeud(1);
592 if ((nummin!=2) && (numc!=2)) nob=ele->get_fem_noeud(2);
593 OT_VECTEUR_3D veca(nob->get_coord(),noc->get_coord());
594 OT_VECTEUR_3D vecb(noa->get_coord(),noc->get_coord());
595 double a=veca.get_longueur();
596 double b=vecb.get_longueur();
597 OT_VECTEUR_3D normal=veca&vecb;
598 normal.norme();
599 double costeta=veca*vecb/a/b;
600 OT_VECTEUR_3D basex=(-vecb);
601 OT_VECTEUR_3D basey=normal&basex;
602 basex.norme();
603 basey.norme();
604 OT_MATRICE_3D base(basex,basey,normal);
605 OT_MATRICE_3D baseinverse=base.transpose();
606 OT_VECTEUR_3D ptb=(-veca);
607 OT_VECTEUR_3D baseb=baseinverse*ptb;
608 if (baseb.get_x()<0)
609  return 1;
610 double u=nob->get_solution()-noa->get_solution();
611 if (fabs(u)<1e-10)
612  {
613  double nume=a*b*v*sqrt(1-costeta*costeta);
614  double deno=a*a+b*b-2*a*b*costeta;
615  deno=sqrt(deno);
616  *res=noa->get_solution()+nume/deno;
617  return 0;
618  }
619 double aa=a*a+b*b-2.*a*b*costeta;
620 double bb=2*b*u*(a*costeta-b);
621 double cc=b*b*(u*u-v*v*a*a*(1.-costeta*costeta));
622 double delta=bb*bb-4.*aa*cc;
623 double t1=-bb+sqrt(delta);
624 double t2=-bb-sqrt(delta);
625 t1=t1/2./aa;
626 t2=t2/2./aa;
627 double t=t1;
628 if (t<u) t=t2;
629 double valide=b*(t-u)/t;
630 if (t<u)
631  valide=-100;
632 if ((valide>a*costeta) && (valide<a/costeta))
633  *res=std::min(noc->get_solution(),t+noa->get_solution());
634  else
635  {
636  *res=std::min(noc->get_solution(),b*v+noa->get_solution());
637  *res=std::min(*res,a*v+nob->get_solution());
638  }
639 return 0;
640 }
641 
642 
643 int MG_FAST_MARCHING::resoudgradTtriangle_perso(FEM_ELEMENT2* ele,double v,FEM_NOEUD** noupdate,double *res)
644 {
645 double j[9];
646 double J[9];int li,col;
647 double N[9]={0.,0.,0.,0.,0.,0.,0.,0.,0.};
648 double jN[9]={0.,0.,0.,0.,0.,0.,0.,0.,0.};
649 double T[3];
650 double gTcst[3]={0.,0.,0.};
651 double gT[3]={0.,0.,0.};
652 double uv[2]={0.25,0.25};
653 
654 
655 ele->get_inverse_jacob(j,uv);
656 
657 int numno;
658 for (int i=0;i<2;i++)
659  for (int k=0;k<3;k++)
660  N[i*3+k]=ele->get_fonction_derive_interpolation(k+1,i+1,uv);
661 for (int i=0;i<3;i++)
662  {
663  T[i]=ele->get_fem_noeud(i)->get_solution();
664  if (ele->get_fem_noeud(i)->get_numero()==1)
665  {
666  *noupdate=ele->get_fem_noeud(i);
667  numno=i;
668  }
669 
670  }
671 
672 
673 for (int i=0;i<3;i++)
674  for (int k=0;k<3;k++)
675  for (int l=0;l<3;l++)
676  jN[i*3+k]=jN[i*3+k]+j[i*3+l]*N[l*3+k];
677 for (int i=0;i<3;i++)
678  for (int j=0;j<3;j++)
679  {
680  if (numno==j) gT[i]=gT[i]+jN[i*3+j];
681  else gTcst[i]=gTcst[i]+jN[i*3+j]*T[j];
682  }
683 double a=gT[0]*gT[0]+gT[1]*gT[1]+gT[2]*gT[2];
684 double b=2.*(gTcst[0]*gT[0]+gTcst[1]*gT[1]+gTcst[2]*gT[2]);
685 double c=-v*v+gTcst[0]*gTcst[0]+gTcst[1]*gTcst[1]+gTcst[2]*gTcst[2];
686 double det=b*b-4.*a*c;
687 if (det<-1e-8)
688  return 2;
689 if (det<0)
690  det=0;
691 else
692  det=sqrt(det);
693 double sol1=(-b-det)/2./a;
694 double sol2=(-b+det)/2./a;
695 double sol=sol1;
696 if (sol2>sol1) sol=sol2;
697 
698 for (int i=0;i<3;i++)
699  if (numno!=i)
700  if (sol<ele->get_fem_noeud(i)->get_solution()*0.99)
701  return 1;
702 
703 *res=sol;
704 return 0;
705 } */
706 
707 #define LARGE_VAL (1e99)
708 #define SMALL_VAL (0)
709 #define PI (3.141592653589793238462643)
710 
711 
712 int MG_FAST_MARCHING::sign ( double x )
713 {
714  return ( x == 0 ? 0 : ( x < 0 ? -1 : 1 ) );
715 }
716 
717 
718 double MG_FAST_MARCHING::fdiv ( double a, double b )
719 {
720  if ( b == 0 )
721  {
722  if ( a == 0 )
723  {
724  return 0;
725  }
726  else
727  {
728 #ifdef DBUG
729  cout << "overflow" << endl;
730 #endif
731  return LARGE_VAL * sign ( a );
732  }
733  }
734  else
735  {
736  if ( a == 0 )
737  {
738  return 0;
739  }
740  else
741  {
742  if ( ( a + b ) == a )
743  {
744 #ifdef DBUG
745  cout << "overflow" << endl;
746 #endif
747  return LARGE_VAL * sign ( a ) * sign ( b );
748  }
749  else
750  {
751  return a / b;
752  }
753  }
754  }
755 }
756 
757 double MG_FAST_MARCHING::dt2d ( double xi,double xb,double yb,double zb,double xd,double yd,double zd,double tb,double v )
758 {
759  double fx=xi*xb-xd;
760  double fy=xi*yb-yd;
761  double fz=xi*zb-zd;
762  double ft=xi*tb;
763  return ( ft+fdiv ( sqrt ( fx*fx+fy*fy+fz*fz ),v ) );
764 }
765 
766 
767 int MG_FAST_MARCHING::Solve_dt2d ( double ax,double ay,double az,double bx,double by,double bz,double dx,double dy,double dz,double at,double bt,double v,double &dt,double &alpha )
768 {
769  double xb=bx-ax;
770  double yb=by-ay;
771  double zb=bz-az; // reference point a
772  double xd=dx-ax;
773  double yd=dy-ay;
774  double zd=dz-az;
775 
776  double tb=bt-at;
777 
778  double td=0.0; // ref temps point a aussi
779 
780  double bb=xb*xb+yb*yb+zb*zb;
781  double sbb=sqrt ( bb );
782  double bd=xb*xd+yb*yd+zb*zd;
783 
784  double xi0=fdiv ( bd,bb );
785  double x0= ( xi0*xb-xd );
786  double y0= ( xi0*yb-yd );
787  double z0= ( xi0*zb-zd );
788  double rho0=sqrt ( x0*x0+y0*y0+z0*z0 );
789  double calpha=fdiv ( v*tb,sbb ); //sign is important, overflow here is a bug
790 
791  if ( calpha>1.0 )
792  {
793  calpha=1.0;
794  }
795  else if ( calpha<-1.0 )
796  {
797  calpha=-1.0;
798  }
799 
800 
801  double dxi=fdiv ( calpha*rho0,sbb*sqrt ( 1-calpha*calpha ) ); //overflow ok but sign is important !!
802  double xi=xi0-dxi;
803  int res=0;
804 
805  if ( xi> ( 1.+SMALL_VAL ) )
806  {
807  xi=1.0;
808  res=1;
809  }
810  else if ( xi<-SMALL_VAL )
811  {
812  xi=0.0;
813  res=1;
814  }
815 
816  td= dt2d ( xi,xb,yb,zb,xd,yd,zd,tb,v );
817  alpha=xi;
818  dt=td+at;
819  return ( res );
820 }
821 
822 
823 int MG_FAST_MARCHING::val2d ( double ax,double ay,double az,double bx,double by,double bz,double dx,double dy,double dz,double at,double bt,double v,double& dt,double &alpha )
824 {
825  return Solve_dt2d ( ax,ay,az,bx,by,bz,dx,dy,dz,at,bt,v,dt,alpha );
826 }
827 
828 double MG_FAST_MARCHING::dt3d ( double xi,double eta,double xb,double yb,double zb,double xc,double yc,double zc,double xd,double yd,double zd,double tb,double tc,double v )
829 {
830  double fx=xi*xb+eta*xc-xd;
831  double fy=xi*yb+eta*yc-yd;
832  double fz=xi*zb+eta*zc-zd;
833  double ft=xi*tb+eta*tc;
834  return ( ft+fdiv ( sqrt ( fx*fx+fy*fy+fz*fz ),v ) );
835 }
836 
837 
838 int MG_FAST_MARCHING::Solve_dt3d ( double ax,double ay,double az,double bx,double by,double bz,double cx,double cy,double cz,double dx,double dy,double dz,double at,double bt,double ct,double v,double &dt,double &alpha,double &beta )
839 {
840  double xb=bx-ax;
841  double yb=by-ay;
842  double zb=bz-az; // reference point a
843  double xc=cx-ax;
844  double yc=cy-ay;
845  double zc=cz-az;
846  double xd=dx-ax;
847  double yd=dy-ay;
848  double zd=dz-az;
849 
850  double tb=bt-at;
851  double tc=ct-at;
852  double td; // ref temps point a aussi
853 
854  double bc=xb*xc+yb*yc+zb*zc;
855  double bb=xb*xb+yb*yb+zb*zb;
856  double cc=xc*xc+yc*yc+zc*zc;
857  double bd=xb*xd+yb*yd+zb*zd;
858  double cd=xc*xd+yc*yd+zc*zd;
859  double bpc=bb+cc;
860 
861  double xbvc= ( yb*zc-zb*yc );
862  double ybvc= ( zb*xc-xb*zc );
863  double zbvc= ( xb*yc-yb*xc );
864  double nbvc=sqrt ( xbvc*xbvc+ybvc*ybvc+zbvc*zbvc );
865 
866  double xbvbvc=- ( yb*zbvc-zb*ybvc );
867  double ybvbvc=- ( zb*xbvc-xb*zbvc );
868  double zbvbvc=- ( xb*ybvc-yb*xbvc );
869  double nbvbvc=sqrt ( xbvbvc*xbvbvc+ybvbvc*ybvbvc+zbvbvc*zbvbvc );
870 
871 
872  double rho0=fabs ( ( xbvc*xd+ybvc*yd+zbvc*zd ) / ( nbvc ) );
873  double i0=bd/sqrt ( bb );
874  double j0= ( xbvbvc*xd+ybvbvc*yd+zbvbvc*zd ) / ( nbvbvc );
875  double t=bc/ ( sqrt ( bb ) *sqrt ( cc ) );
876  double tt=t/sqrt ( 1-t*t );
877  double xi0=bd/bb- ( j0*tt ) /sqrt ( bb );
878 #ifdef DBUG
879  cout << "xi=" << xi0 << " ";
880 #endif
881  double eta0=j0*nbvbvc/ ( xbvbvc*xc+ybvbvc*yc+zbvbvc*zc );
882 #ifdef DBUG
883  cout << "eta=" << eta0 << endl;
884 #endif
885  double xproj=xi0*xb+eta0*xc;
886  double yproj=xi0*yb+eta0*yc;
887  double zproj=xi0*zb+eta0*zc;
888 #ifdef DBUG
889  cout << xproj << " "<< yproj << " " << zproj << endl;
890 #endif
891 
892 #ifdef ttttttttt
893  Square_Matrix M ( 3 ),Minv ( 3 );
894  Vector gradTxyz ( 3 ),gradTxieta ( 3 ),gradTxieta2 ( 3 );;
895  M ( 0,0 ) =xb;
896  M ( 0,1 ) =yb;
897  M ( 0,2 ) =zb;
898  M ( 1,0 ) =xc;
899  M ( 1,1 ) =yc;
900  M ( 1,2 ) =zc;
901  M ( 2,0 ) =yb*zc-zb*yc;
902  M ( 2,1 ) =zb*xc-xb*zc;
903  M ( 2,2 ) =xb*yc-yb*xc;
904  M.Invert ( Minv );
905 
906  double gxi=tb;
907  double geta=tc;
908 
909  gradTxieta[0]=gxi;
910  gradTxieta[1]=geta;
911  gradTxieta[2]=0;
912 #ifdef DBUG
913  gradTxieta.Display();
914 #endif
915  Minv.Mult ( gradTxieta,gradTxyz );
916 #ifdef DBUG
917  gradTxyz.Display()
918 #endif
919  Minv.Transpose();
920  Minv.Mult ( gradTxyz,gradTxieta2 );
921 #ifdef DBUG
922  gradTxieta2.Display();
923 #endif
924  double nxieta=gradTxyz.Norm();
925 #ifdef DBUG
926  cout << "nxieta=" << nxieta << endl;
927 #endif
928 
929 
930  double txieta=gradTxieta2[0]*tb+gradTxieta2[1]*tc;
931 #ifdef DBUG
932  cout << "txieta=" << txieta << endl;
933 #endif
934 
935 
936 
937  double calpha=fdiv ( v*txieta,nxieta ); //sign is important, overflow here is a
938 #ifdef DBUG
939  cout << "calpha=" << calpha << endl;
940 #endif
941 
942  if ( calpha>1.0 )
943  {
944  calpha=1.0;
945  }
946  else if ( calpha<-1.0 )
947  {
948  calpha=-1.0;
949  }
950 
951  double ddd=fdiv ( calpha*rho0,sqrt ( 1-calpha*calpha ) ); //overflow ok but sign is important !!
952 #ifdef DBUG
953  cout << "ddd=" << ddd << endl;
954 #endif
955  gradTxyz.Normalize();
956  gradTxyz*=-ddd;
957  gradTxyz[0]+=xproj;
958  gradTxyz[1]+=yproj;
959  gradTxyz[2]+=zproj;
960 #ifdef DBUG
961  gradTxyz.Display();
962 #endif
963  Minv.Mult ( gradTxyz,gradTxieta2 );
964 #ifdef DBUG
965  gradTxieta2.Display();
966 #endif
967 
968 
969  double xi=gradTxieta2[0];
970  double eta=gradTxieta2[1];
971 
972 
973 #ifdef DBUG
974  cout << "xi=" << xi << " eta=" << eta<< endl;
975 #endif
976 
977  if ( ( xi+eta ) > ( 1.+SMALL_VAL ) )
978  {
979  double ttt;
980  int t=Solve_dt2d ( bx,by,bz,cx,cy,cz,dx,dy,dz,bt,ct,v,dt,ttt ) +1;
981  alpha=1-ttt;
982  beta=ttt;
983  return t;
984  }
985 
986  if ( xi<-SMALL_VAL )
987  {
988  int t=Solve_dt2d ( ax,ay,az,cx,cy,cz,dx,dy,dz,at,ct,v,dt,beta ) +1;
989  alpha=0;
990  return t;
991  }
992 
993  if ( eta<-SMALL_VAL )
994  {
995  int t=Solve_dt2d ( ax,ay,az,bx,by,bz,dx,dy,dz,at,bt,v,dt,alpha ) +1;
996  beta=0;
997  return t;
998  }
999 
1000  td= dt3d ( xi,eta,xb,yb,zb,xc,yc,zc,xd,yd,zd,tb,tc,v );
1001  alpha=xi;
1002  beta=eta;
1003  dt=at+td;
1004 #endif
1005  return 0;
1006 }
1007 
1008 
1009 
1010 
1011 
1012 
1013 int MG_FAST_MARCHING::val3d ( double ax,double ay,double az,double bx,double by,double bz,double cx,double cy,double cz,double dx,double dy,double dz,double at,double bt,double ct,double v,double& dt,double &alpha,double &beta )
1014 {
1015  int res=Solve_dt3d ( ax,ay,az,bx,by,bz,cx,cy,cz,dx,dy,dz,at,bt,ct,v,dt,alpha,beta );
1016  return res;
1017 }
1018 
1019 
1020 
1021 
1022 
1023 };
FEM_ELEMENT1::get_nb_fem_noeud
virtual int get_nb_fem_noeud(void)=0
MAGIC::MG_FAST_MARCHING::Solve_dt3d
virtual int Solve_dt3d(double ax, double ay, double az, double bx, double by, double bz, double cx, double cy, double cz, double dx, double dy, double dz, double at, double bt, double ct, double v, double &dt, double &alpha, double &beta)
Definition: mg_fast_marching.cpp:838
FEM_MAILLAGE::get_fem_element1id
FEM_ELEMENT1 * get_fem_element1id(unsigned long num)
Definition: fem_maillage.cpp:372
MAGIC::MG_FAST_MARCHING::fdiv
virtual double fdiv(double a, double b)
Definition: mg_fast_marching.cpp:718
FEM_SOLUTION
Definition: fem_solution.h:40
gestionversion.h
MAGIC::MG_FAST_MARCHING::MG_FAST_MARCHING
MG_FAST_MARCHING(FEM_SOLUTION *solu, int numchamp)
Definition: mg_fast_marching.cpp:46
fem_solution.h
mg_gestionnaire.h
MG_GEOMETRIE::get_mg_areteid
MG_ARETE * get_mg_areteid(unsigned long num)
Definition: mg_geometrie.cpp:775
FEM_ELEMENT3::get_fem_noeud
virtual class FEM_NOEUD * get_fem_noeud(int num)=0
MG_IDENTIFICATEUR::get_id
unsigned long get_id()
Definition: mg_identificateur.cpp:53
FEM_SOLUTION::ecrire
void ecrire(double val, int i, int j, int coord=0, int num_no=0)
Definition: fem_solution.cpp:411
fem_maillage.h
a
#define a(i, j)
MAGIC::MG_FAST_MARCHING::init_noeud
virtual void init_noeud(std::vector< FEM_NOEUD * > &lst)
Definition: mg_fast_marching.cpp:75
FEM_ELEMENT3
Definition: fem_element3.h:34
FEM_MAILLAGE::get_premier_noeud
FEM_NOEUD * get_premier_noeud(LISTE_FEM_NOEUD::iterator &it)
Definition: fem_maillage.cpp:174
FEM_MAILLAGE::get_mg_geometrie
MG_GEOMETRIE * get_mg_geometrie(void)
Definition: fem_maillage.cpp:88
MAGIC::MG_FAST_MARCHING::sol
FEM_SOLUTION * sol
Definition: mg_fast_marching.h:63
FEM_MAILLAGE::get_fem_element2id
FEM_ELEMENT2 * get_fem_element2id(unsigned long num)
Definition: fem_maillage.cpp:484
MAGIC::MG_FAST_MARCHING::sign
virtual int sign(double x)
Definition: mg_fast_marching.cpp:712
FEM_MAILLAGE::get_fem_noeudid
FEM_NOEUD * get_fem_noeudid(unsigned long num)
Definition: fem_maillage.cpp:150
MAGIC::MG_FAST_MARCHING::fem
FEM_MAILLAGE * fem
Definition: mg_fast_marching.h:82
FEM_ELEMENT2
Definition: fem_element2.h:34
FEM_MAILLAGE::get_fem_element3id
FEM_ELEMENT3 * get_fem_element3id(unsigned long num)
Definition: fem_maillage.cpp:595
parse.h
MG_ELEMENT_TOPOLOGIQUE
Definition: mg_element_topologique.h:51
mg_fast_marching.h
MAGIC::MG_FAST_MARCHING::last
FEM_NOEUD * last
Definition: mg_fast_marching.h:85
MAGIC
Definition: mg_fast_marching.cpp:40
FEM_ELEMENT2::get_nb_fem_noeud
virtual int get_nb_fem_noeud(void)=0
MAGIC::MG_FAST_MARCHING::val3d
virtual int val3d(double ax, double ay, double az, double bx, double by, double bz, double cx, double cy, double cz, double dx, double dy, double dz, double at, double bt, double ct, double v, double &dt, double &alpha, double &beta)
Definition: mg_fast_marching.cpp:1013
FEM_SOLUTION::active_solution
void active_solution(int num)
Definition: fem_solution.cpp:490
MAGIC::MG_FAST_MARCHING::val2d
virtual int val2d(double ax, double ay, double az, double bx, double by, double bz, double dx, double dy, double dz, double at, double bt, double v, double &dt, double &alpha)
Definition: mg_fast_marching.cpp:823
MAGIC::MG_FAST_MARCHING::nbnoeudinit
int nbnoeudinit
Definition: mg_fast_marching.h:84
MAGIC::MG_FAST_MARCHING::Solve_dt2d
virtual int Solve_dt2d(double ax, double ay, double az, double bx, double by, double bz, double dx, double dy, double dz, double at, double bt, double v, double &dt, double &alpha)
Definition: mg_fast_marching.cpp:767
INFINI
#define INFINI
Definition: mg_fast_marching.cpp:42
MG_GEOMETRIE::get_mg_volumeid
MG_VOLUME * get_mg_volumeid(unsigned long num)
Definition: mg_geometrie.cpp:1658
tpl_liste_unique_entite.h
MAGIC_AFFICHE
Definition: magic_affiche.h:30
FEM_ELEMENT1
Definition: fem_element1.h:34
PARSE::decode
void decode(char *code, std::string masque, class PARS_ARGUMENT *arg)
Definition: parse.cpp:71
tpl_map_entite.h
FEM_ELEMENT3::get_nb_fem_noeud
virtual int get_nb_fem_noeud(void)=0
MAGIC::MG_FAST_MARCHING::dt3d
virtual double dt3d(double xi, double eta, double xb, double yb, double zb, double xc, double yc, double zc, double xd, double yd, double zd, double tb, double tc, double v)
Definition: mg_fast_marching.cpp:828
PARSE
Definition: parse.h:32
TPL_LISTE_ENTITE::get_nb
virtual int get_nb(void)
Definition: tpl_liste_entite.h:67
TPL_LISTE_ENTITE::get
virtual X get(int num)
Definition: tpl_liste_entite.h:72
ot_mathematique.h
MAGIC::MG_FAST_MARCHING::~MG_FAST_MARCHING
virtual ~MG_FAST_MARCHING()
Definition: mg_fast_marching.cpp:55
FEM_NOEUD
Definition: fem_noeud.h:35
PARS_ARGUMENT::argument
std::vector< std::string > argument
Definition: pars_argument.h:44
sqrt
double2 sqrt(double2 &val)
Definition: ot_doubleprecision.cpp:345
MAGIC::MG_FAST_MARCHING::finalise
virtual void finalise(void)
Definition: mg_fast_marching.cpp:240
FEM_ELEMENT1::get_fem_noeud
virtual class FEM_NOEUD * get_fem_noeud(int num)=0
ot_boite_3d.h
PARS_ARGUMENT
Definition: pars_argument.h:37
LARGE_VAL
#define LARGE_VAL
Definition: mg_fast_marching.cpp:707
FEM_ELEMENT2::get_fem_noeud
virtual class FEM_NOEUD * get_fem_noeud(int num)=0
MG_GEOMETRIE::get_mg_faceid
MG_FACE * get_mg_faceid(unsigned long num)
Definition: mg_geometrie.cpp:1226
FEM_NOEUD::change_solution
virtual void change_solution(double val, int num=0)
Definition: fem_noeud.cpp:358
MAGIC::MG_FAST_MARCHING::init
virtual void init(void)
Definition: mg_fast_marching.cpp:61
fem_triangle3.h
MG_ELEMENT_TOPOLOGIQUE::get_lien_fem_maillage
virtual TPL_LISTE_ENTITE< FEM_ELEMENT_MAILLAGE * > * get_lien_fem_maillage(void)
Definition: mg_element_topologique.cpp:67
MG_GEOMETRIE
Definition: mg_geometrie.h:84
MAGIC::MG_FAST_MARCHING::dt2d
virtual double dt2d(double xi, double xb, double yb, double zb, double xd, double yd, double zd, double tb, double v)
Definition: mg_fast_marching.cpp:757
FEM_MAILLAGE::get_suivant_noeud
FEM_NOEUD * get_suivant_noeud(LISTE_FEM_NOEUD::iterator &it)
Definition: fem_maillage.cpp:182
MAGIC::MG_FAST_MARCHING
Definition: mg_fast_marching.h:44
SMALL_VAL
#define SMALL_VAL
Definition: mg_fast_marching.cpp:708
MAGIC::MG_FAST_MARCHING::num
int num
Definition: mg_fast_marching.h:83
res
#define res(i, j)
pars_argument.h
MG_GEOMETRIE::get_mg_sommetid
MG_SOMMET * get_mg_sommetid(unsigned long num)
Definition: mg_geometrie.cpp:513
fem_maillage_outils.h