75 int nb_front_convergence=(int)
param.
get_valeur((
char*)
"Convergence_mailleur3d_frontal");
76 long Nb_front_max_mailleur3d=(long)
param.
get_valeur((
char*)
"Nb_front_max_mailleur3d");
79 std::vector<CAS_FRONT*> liste_cas;
88 if(nb>Nb_front_max_mailleur3d)
90 std::cerr <<
"*** MAILLEUR3D::progresse_front : Nb_front_max_mailleur3d atteint ! ***" << std::endl;
94 for (
int i=0;i<nb;i++)
97 if (nb>nb_front_convergence) fttmp->
ini_ifail();
110 if (numfront==(-1))
continue;
140 for (
int i=0;i<nb_seg;i++)
152 if (noeudtmp!=mgnoeud2)
153 if (noeudtmp!=mgnoeud3)
161 for (
int i=0;i<nb_seg;i++)
173 if (noeudtmp!=mgnoeud1)
174 if (noeudtmp!=mgnoeud3)
182 for (
int i=0;i<nb_seg;i++)
194 if (noeudtmp!=mgnoeud1)
195 if (noeudtmp!=mgnoeud2)
203 int nb_cas=liste_cas.size();
204 std::vector<CAS_FRONT*> liste_classe_cas[8];
207 for (
int j=0;j<nb_cas;j++)
214 if (cas->
liaison[0]==1) angle=std::min(angle,cas->
angle[0]);
215 if (cas->
liaison[1]==1) angle=std::min(angle,cas->
angle[1]);
216 if (cas->
liaison[2]==1) angle=std::min(angle,cas->
angle[2]);
223 if (cas->
liaison[0]==1) angle=std::min(angle,cas->
angle[0]);
224 if (cas->
liaison[1]==1) angle=std::min(angle,cas->
angle[1]);
225 if (cas->
liaison[2]==1) angle=std::min(angle,cas->
angle[2]);
232 if (cas->
liaison[0]==1) angle=std::min(angle,cas->
angle[0]);
233 if (cas->
liaison[1]==1) angle=std::min(angle,cas->
angle[1]);
234 if (cas->
liaison[2]==1) angle=std::min(angle,cas->
angle[2]);
242 if (cas->
liaison[0]==1) angle=std::min(angle,cas->
angle[0]);
243 if (cas->
liaison[1]==1) angle=std::min(angle,cas->
angle[1]);
244 if (cas->
liaison[2]==1) angle=std::min(angle,cas->
angle[2]);
252 if (cas->
liaison[0]==1) angle=std::min(angle,cas->
angle[0]);
253 if (cas->
liaison[1]==1) angle=std::min(angle,cas->
angle[1]);
254 if (cas->
liaison[2]==1) angle=std::min(angle,cas->
angle[2]);
262 if (cas->
liaison[0]==1) angle=std::min(angle,cas->
angle[0]);
263 if (cas->
liaison[1]==1) angle=std::min(angle,cas->
angle[1]);
264 if (cas->
liaison[2]==1) angle=std::min(angle,cas->
angle[2]);
285 std::vector<CAS_FRONT*> liste_classe_cas_temp;
286 liste_classe_cas_temp.insert(liste_classe_cas_temp.end(),cas);
287 solution=
traite_front(mgvol,type,ft,liste_cas,liste_classe_cas_temp,&cas);
300 while (bouclebis==
true);
304 sprintf(mess,
" Maillage terminé en %d couches et %d iterations",couche+1,
passe);
330 MG_NOEUD* noeud=liste_classe_cas[0]->mgnoeud;
347 MG_NOEUD* noeud=liste_classe_cas[0]->mgnoeud;
355 if (liste_classe_cas[0]->liaison[0]==0)
362 if (liste_classe_cas[0]->liaison[1]==0)
369 if (liste_classe_cas[0]->liaison[2]==0)
390 int nb_cas=liste_classe_cas.size();
393 qual=
new double[nb_cas];
397 for (
int i=0;i<nb_cas;i++)
399 MG_NOEUD* noeud=liste_classe_cas[i]->mgnoeud;
408 double* pos_max=std::max_element(qual,qual+nb_cas);
411 MG_NOEUD* noeud=liste_classe_cas[num]->mgnoeud;
413 if (tet!=NULL) fin=1;
421 if (liste_classe_cas[num]->liaison[0]==1)
429 if (liste_classe_cas[num]->liaison[1]==1)
437 if (liste_classe_cas[num]->liaison[2]==1)
464 int nb_cas=liste_classe_cas.size();
467 qual=
new double[nb_cas];
471 for (
int i=0;i<nb_cas;i++)
473 MG_NOEUD* noeud=liste_classe_cas[i]->mgnoeud;
481 double* pos_max=std::max_element(qual,qual+nb_cas);
483 int num=pos_max-qual;
484 MG_NOEUD* noeud=liste_classe_cas[num]->mgnoeud;
486 if (tet!=NULL) fin=1;
526 noeud_candidat=liste_noeud.
get(0);
527 int nb_cas=liste_cas.size();
528 for (
int i=0;i<nb_cas;i++)
529 if (liste_cas[i]->mgnoeud==noeud_candidat)
541 int nb_noeud_candidat=liste_noeud.
get_nb();
542 qual=
new double[nb_noeud_candidat];
544 for (
int i=0;i<nb_noeud_candidat;i++)
562 for (
int i=0;i<nb_noeud_candidat;i++)
566 double* max_i=std::max_element(qual,qual+nb_noeud_candidat);
569 int pos_max=max_i-qual;
572 liste_intersection.
vide();
573 tet=
insere_tetra(mgvol,ft,noeud,mode,liste_intersection);
574 if ((tet==NULL) && (liste_intersection.
get_nb()>0))
582 if (traite_reussi==
true)
597 else tet=
insere_tetra(mgvol,ft,noeud_candidat,mode,liste_intersection);
598 if ((tet==NULL) && (liste_intersection.
get_nb()>0))
606 if (traite_reussi==
true)
609 tet=
insere_tetra(mgvol,ft,noeud_candidat,mode,liste_intersection);
658 std::vector<CAS_FRONT*>::iterator i;
659 std::vector<CAS_FRONT*>::iterator nouveau = liste_cas.end();
661 for (i=liste_cas.begin();i!=liste_cas.end();i++)
663 if ((*i)->mgnoeud==noeud) nouveau=i;
667 if (nouveau==liste_cas.end())
669 cas=
new CAS_FRONT(type,noeud,numero_cote);
670 liste_cas.insert(liste_cas.end(),cas);
679 cas->
angle[numero_cote]=angle;
687 for (std::vector<CAS_FRONT*>::iterator i=liste_cas.begin();i!=liste_cas.end();i++)
715 static int nbpasse=0;
738 if (angle<ft->get_angle_voisin(0))
764 if (angle<ft->get_angle_voisin(1))
790 if (angle<ft->get_angle_voisin(2))
841 sprintf(chaine,
"%s.pfj",
nomlog.c_str());
842 inlog=fopen(chaine,
"wt");
844 sprintf(chaine,
"%s.frt2",
nomlog.c_str());
845 inlog=fopen(chaine,
"wb");
852 sprintf(chaine,
"%s.frt1",
nomlog.c_str());
853 inlog=fopen(chaine,
"wb");
861 fwrite(&nbnoeud,
sizeof(
int),1,
inlog);
862 fwrite(&nbseg,
sizeof(
int),1,
inlog);
863 fwrite(&nbtriangle2d,
sizeof(
int),1,
inlog);
864 fwrite(&nbtriangle,
sizeof(
int),1,
inlog);
865 for (
int i=0;i<nbnoeud;i++)
868 unsigned long num=noeud->
get_id();
869 fwrite(&num,
sizeof(
unsigned long),1,
inlog);
871 fwrite(xyz,
sizeof(
double),3,
inlog);
873 for (
int i=0;i<nbsegment;i++)
877 unsigned long num[3];
881 fwrite(num,
sizeof(
unsigned long),3,
inlog);
883 for (
int i=0;i<nbtriangle;i++)
886 unsigned long num[4];
891 fwrite(num,
sizeof(
unsigned long),4,
inlog);
901 for (
int i=0;i<12;i++)
911 unsigned long num=ft->get_triangle()->get_id();
912 fwrite(&num,
sizeof(
unsigned long),1,
inlog);
916 unsigned long num=fincouche;
917 fwrite(&num,
sizeof(
unsigned long),1,
inlog);
936 for (
int i=0;i<12;i++)
948 if (((
M3D_TRIANGLE*)(ft->get_triangle()))->get_nb_voisin()>1)
1002 if ((ft11!=ft) && (ft12!=ft) && (ft13!=ft) )
1004 if ((ft21!=ft) && (ft22!=ft) && (ft23!=ft) )
1006 if ((ft31!=ft) && (ft32!=ft) && (ft33!=ft) )
CAS_FRONT(int type_cas, MG_NOEUD *noeud, int numero_cote)
virtual void etat_actif(void)
virtual int get_etat(void)
virtual int get_frontiere(void)
virtual class MG_FRONT_3D * get_mgfront(void)
virtual int get_nb_voisin(void)
virtual int get_etat_front(void)
virtual class MG_TETRA * get_voisin(int num)
virtual void affiche(char *mess)
virtual int traite_front_lie(class MG_VOLUME *mgvol, MG_FRONT_3D *ft, std::vector< CAS_FRONT * > &liste_cas, std::vector< CAS_FRONT * > &liste_classe_cas, CAS_FRONT **cas)
virtual int genere_noeud(MG_VOLUME *mgvol, MG_FRONT_3D *ft, TPL_MAP_ENTITE< MG_NOEUD * > &liste_noeud, std::vector< class CAS_FRONT * > &liste_cas)
virtual MG_FRONT_3D * get_premier_front(FRONT &front)
virtual void fin_log(void)
virtual int traite_front_general(class MG_VOLUME *mgvol, MG_FRONT_3D *ft, std::vector< CAS_FRONT * > &liste_cas, std::vector< CAS_FRONT * > &liste_classe_cas, CAS_FRONT **cas)
virtual void echange_de_front(FRONT &front_original, FRONT &front_destination, MG_FRONT_3D *ft)
virtual void ini_log(void)
virtual MG_FRONT_3D * ajouter_front_courant(int numero_front, MG_NOEUD *noeud1, MG_NOEUD *noeud2, MG_NOEUD *noeud3, MG_TRIANGLE *triangle)
virtual class MG_TETRA * insere_tetra(class MG_ELEMENT_TOPOLOGIQUE *mgvol, class MG_FRONT_3D *ft, MG_NOEUD *noeud4, int type, TPL_MAP_ENTITE< class MG_TRIANGLE * > &liste_intersection)
MG_MAILLAGE * mg_maillage
virtual void efface_cas_front(std::vector< CAS_FRONT * > &liste_cas, std::vector< CAS_FRONT * > liste_classe_cas[8])
virtual int progresse_front(MG_VOLUME *mgvol)
virtual int traite_front_adjacent2(class MG_VOLUME *mgvol, MG_FRONT_3D *ft, std::vector< CAS_FRONT * > &liste_cas, std::vector< CAS_FRONT * > &liste_classe_cas, CAS_FRONT **cas)
virtual int traite_front(class MG_VOLUME *mgvol, int type, MG_FRONT_3D *ft, std::vector< class CAS_FRONT * > &liste_cas, std::vector< class CAS_FRONT * > &liste_classe_cas, class CAS_FRONT **cas)
virtual MG_FRONT_3D * get_suivant_front(FRONT &front, FRONT::iterator &it)
virtual void mise_a_jour_voisin_front(MG_FRONT_3D *ft)
virtual double angle_front(MG_FRONT_3D *ft1, MG_FRONT_3D *ft2)
virtual unsigned int get_nb_front(FRONT &front)
virtual void genere_log(int fincouche)
virtual void detruit_element_inactif(void)
virtual void supprimer_front_en_avancant(MG_FRONT_3D *ft)
virtual int traite_front_adjacent3(class MG_VOLUME *mgvol, MG_FRONT_3D *ft, std::vector< CAS_FRONT * > &liste_cas, std::vector< CAS_FRONT * > &liste_classe_cas, CAS_FRONT **cas)
std::multimap< double, MG_FRONT_3D *, std::less< double > > FRONT
virtual int test_front(void)
virtual int traite_destruction(MG_FRONT_3D *ft, TPL_MAP_ENTITE< class MG_TRIANGLE * > &liste_intersection)
virtual void insere_cas_front(int type, MG_NOEUD *noeud, int numero_cote, double angle, std::vector< CAS_FRONT * > &liste_cas)
virtual unsigned int get_nb_front_courant(void)
virtual class MG_FRONT_3D * mise_a_jour_front(MG_TETRA *tet, int cote, int numfront=MAGIC::MAILLEURFRONTALETAT::ATTENTE)
virtual int traite_front_adjacent1(class MG_VOLUME *mgvol, MG_FRONT_3D *ft, std::vector< CAS_FRONT * > &liste_cas, std::vector< CAS_FRONT * > &liste_classe_cas, CAS_FRONT **cas)
virtual void detruit_tetra(MG_TRIANGLE *tri)
virtual int premier_front_courant(void)
MG_ELEMENT_TOPOLOGIQUE * get_lien_topologie(void)
virtual int get_origine(void)
virtual int get_dimension(void)=0
void changer_front_voisin(MG_FRONT_3D *front, int num)
int get_numero_front(void)
MG_NOEUD * get_noeud3(void)
void changer_angle_voisin(double angle, int num)
MG_TRIANGLE * get_triangle(void)
MG_NOEUD * get_noeud2(void)
MG_NOEUD * get_noeud1(void)
double get_angle_voisin(int num)
void incremente_ifail(void)
MG_FRONT_3D * get_front_voisin(int num)
virtual void enregistrer(std::ostream &o, double version=MAGIC_VERSION_FICHIER_DOUBLE)
unsigned int get_nb_mg_segment(void)
unsigned int get_nb_mg_triangle(void)
int supprimer_mg_noeudid(unsigned long num)
unsigned int get_nb_mg_noeud(void)
MG_GESTIONNAIRE * get_gestionnaire(void)
MG_NOEUD * get_mg_noeud(unsigned int num)
MG_TRIANGLE * get_mg_triangle(unsigned int num)
MG_SEGMENT * get_mg_segment(unsigned int num)
unsigned int get_nb_mg_tetra(void)
MG_NOEUD * ajouter_mg_noeud(MG_ELEMENT_TOPOLOGIQUE *topo, double xx, double yy, double zz, int origine, unsigned long num=0)
TPL_LISTE_ENTITE< class MG_SEGMENT * > * get_lien_segment(void)
virtual double * get_coord(void)
virtual double get_z(void)
virtual int get_type_entite()
virtual double get_y(void)
virtual double get_x(void)
TPL_LISTE_ENTITE< class MG_TRIANGLE * > * get_lien_triangle(void)
virtual MG_NOEUD * get_noeud1(void)
virtual MG_NOEUD * get_noeud2(void)
virtual MG_TRIANGLE * get_triangle1(void)
virtual MG_TRIANGLE * get_triangle3(void)
virtual MG_NOEUD * get_noeud1(void)
virtual MG_NOEUD * get_noeud2(void)
virtual MG_NOEUD * get_noeud4(void)
virtual MG_NOEUD * get_noeud3(void)
virtual MG_TRIANGLE * get_triangle2(void)
virtual MG_TRIANGLE * get_triangle4(void)
virtual MG_NOEUD * get_noeud3(void)
virtual MG_NOEUD * get_noeud1(void)
virtual MG_NOEUD * get_noeud2(void)
static double qualite_tetra(double *noeud1, double *noeud2, double *noeud3, double *noeud4)
double get_valeur(std::string chaine, int num=0)
virtual X get_premier(ITERATEUR &it)
virtual X get_suivant(ITERATEUR &it)
std::map< unsigned long, X, std::less< unsigned long > >::iterator ITERATEUR