16#include <Topologie_Maillage_FT.h>
17#include <TRUST_Deriv.h>
18#include <Transport_Interfaces_FT_Disc.h>
20#include <Remailleur_Collision_FT_Juric.h>
23#include <Domaine_VF.h>
24#include <Connex_components.h>
25#include <Array_tools.h>
27#include <Check_espace_virtuel.h>
28#include <communications.h>
39 Cerr <<
"Topologie_Maillage_FT::printOn" << finl;
46 bool juric_pour_tout =
false;
48 param.ajouter_flag(
"active", &
active_);
49 param.ajouter(
"type_remaillage", &remailleur_Collision_,
Param::REQUIRED);
50 param.ajouter_flag(
"juric_pour_tout", &juric_pour_tout);
53 param.dictionnaire(
"0", 0);
54 param.dictionnaire(
"1", 1);
55 param.lire_avec_accolades_depuis(is);
59 Cerr<<
"Error : juric_pour_tout is obsolete and does noting since v1.7.0"<<finl;
60 Cerr<<
"remove juric_pour_tout from your datafile"<<finl;
67 Cerr <<
"ATTENTION : vous n'avez pas active la gestion des ruptures-coalescences..." << finl;
71 if (!remailleur_Collision_)
73 Cerr <<
"Erreur dans Topologie_Maillage_FT::readOn :\n"
74 <<
" Il faut fournir le type du remailleur et ses parametres.\n"
75 <<
" Valeur conseillee: Juric { ... }" << finl;
78 if (!sub_type(Remailleur_Collision_FT_Juric, remailleur_Collision_.valeur()))
80 Cerr <<
"Erreur dans Topologie_Maillage_FT::readOn :\n"
81 <<
" Il faut un remailleur de type Juric" << finl;
92 Cerr <<
"Error in Topologie_Maillage_FT::get_phase_continue(): phase_continue must be specified in the data file !" << finl;
101static inline void trier_trois_entiers(
int tab[3])
133static inline void get_coord_sommets_triangle(
const int facette[3],
134 const DoubleTab& sommets,
138 for (i = 0; i < 3; i++)
140 const int som = facette[i];
141 coord[i][0] = sommets(som,0);
142 coord[i][1] = sommets(som,1);
143 coord[i][2] = sommets(som,2);
147static inline void calcul_equation_plan(
const double *coord,
148 const DoubleTab& normales,
152 double a = normales(facette, 0);
153 double b = normales(facette, 1);
154 double c = normales(facette, 2);
158 plan[3] = - (a * coord[0] + b * coord[1] + c * coord[2]);
161static inline void calcul_distance_plan(
const double coord[3][3],
162 const double plan[4],
170 for (i = 0; i < 3; i++)
171 distance[i] = a * coord[i][0] + b * coord[i][1] + c * coord[i][2] + d;
183static inline void calcul_intersection_plan_triangle(
const double distance_1[3],
184 const double distance_2[3],
191 double z0 = distance_1[2];
192 double d0 = distance_2[2];
193 for (i = 0; i < 3; i++)
195 double z1 = distance_1[i];
196 double d1 = distance_2[i];
197 if (((z0 > 0.) + (z1 > 0.)) == 1)
201 const double inv_delta = 1. / (z1 - z0);
203 s[n] = (d0 * z1 - d1 * z0) * inv_delta;
228static inline double prod_vect_triangle(
double *p1,
double *p2,
double *p3)
230 return (p2[0]-p1[0])*(p3[1]-p1[1]) - (p2[1]-p1[1])*(p3[0]-p1[0]);
245 const IntTab& facettes = maillage.
facettes();
248 facette[0][0] = facettes(fa70, 0);
249 facette[0][1] = facettes(fa70, 1);
250 facette[1][0] = facettes(fa71, 0);
251 facette[1][1] = facettes(fa71, 1);
252 int nb_sommets_communs = 0;
253 if (facette[0][0] == facette[1][0] || facette[0][0] == facette[1][1])
254 nb_sommets_communs++;
255 if (facette[0][1] == facette[1][0] || facette[0][1] == facette[1][1])
256 nb_sommets_communs++;
258 if (nb_sommets_communs)
259 return -nb_sommets_communs;
261 const DoubleTab& sommets = maillage.
sommets();
263 for (
int i = 0; i < 2; i++)
264 for (
int j = 0; j < 2; j++)
266 int s = facette[i][j];
267 c[i][j][0] = sommets(s, 0);
268 c[i][j][1] = sommets(s, 1);
271 const double v00 = prod_vect_triangle(c[0][1],c[0][0],c[1][0]);
272 const double v01 = prod_vect_triangle(c[0][1],c[0][0],c[1][1]);
275 const double v10 = prod_vect_triangle(c[1][1],c[1][0],c[0][0]);
276 const double v11 = prod_vect_triangle(c[1][1],c[1][0],c[0][1]);
307 const IntTab& facettes = maillage.
facettes();
308 facette0[0] = facettes(fa70,0);
309 facette0[1] = facettes(fa70,1);
310 facette0[2] = facettes(fa70,2);
311 facette1[0] = facettes(fa71,0);
312 facette1[1] = facettes(fa71,1);
313 facette1[2] = facettes(fa71,2);
317 int nb_sommets_communs = 0;
318 trier_trois_entiers(facette0);
319 trier_trois_entiers(facette1);
323 while (i0 < 3 && i1 < 3)
325 const int f0 = facette0[i0];
326 const int f1 = facette1[i1];
334 nb_sommets_communs++;
340 if (nb_sommets_communs == 3)
346 if (nb_sommets_communs == 2)
352 if (nb_sommets_communs == 1)
362 double coord_0[3][3];
363 double coord_1[3][3];
365 const DoubleTab& sommets = maillage.
sommets();
366 get_coord_sommets_triangle(facette0, sommets, coord_0);
367 get_coord_sommets_triangle(facette1, sommets, coord_1);
371 double equation_plan_0[4];
372 double equation_plan_1[4];
375 calcul_equation_plan(coord_0[0], facettes_normales, fa70, equation_plan_0);
376 calcul_equation_plan(coord_1[0], facettes_normales, fa71, equation_plan_1);
380 double distance_plan0_som1[3];
382 double distance_plan1_som0[3];
383 calcul_distance_plan(coord_1, equation_plan_0, distance_plan0_som1);
384 calcul_distance_plan(coord_0, equation_plan_1, distance_plan1_som0);
386 int test_intersection = 0;
388 int n_positifs_0 = 0;
389 int n_positifs_1 = 0;
391 for (i = 0; i < 3; i++)
393 n_positifs_0 += (distance_plan0_som1[i] > 0.);
394 n_positifs_1 += (distance_plan1_som0[i] > 0.);
396 if ((n_positifs_0 * n_positifs_1) % 3 != 0)
398 test_intersection = -3;
402 if (test_intersection)
404 static const double TOLERANCE_FACETTES_PARALLELES = 1e-12;
407 double equation_plan_2[4];
408 double a = equation_plan_0[1] * equation_plan_1[2] - equation_plan_0[2] * equation_plan_1[1];
409 double b = equation_plan_0[2] * equation_plan_1[0] - equation_plan_0[0] * equation_plan_1[2];
410 double c = equation_plan_0[0] * equation_plan_1[1] - equation_plan_0[1] * equation_plan_1[0];
411 equation_plan_2[0] = a;
412 equation_plan_2[1] = b;
413 equation_plan_2[2] = c;
414 equation_plan_2[3] = 0.;
415 double norme_carre = a * a + b * b + c * c;
418 if (norme_carre < TOLERANCE_FACETTES_PARALLELES)
421 test_intersection = 0;
425 double distance_plan2_som0[3];
426 double distance_plan2_som1[3];
427 calcul_distance_plan(coord_0, equation_plan_2, distance_plan2_som0);
428 calcul_distance_plan(coord_1, equation_plan_2, distance_plan2_som1);
432 double s0_min, s0_max, s1_min, s1_max;
433 calcul_intersection_plan_triangle(distance_plan1_som0, distance_plan2_som0,
436 calcul_intersection_plan_triangle(distance_plan0_som1, distance_plan2_som1,
441 double s_min = (s0_min > s1_min) ? s0_min : s1_min;
442 double s_max = (s0_max < s1_max) ? s0_max : s1_max;
445 test_intersection = 1 + nb_sommets_communs;
449 return test_intersection;
460 ArrOfInt& liste_elements_collision)
const
470 ArrOfBit facettes_testees(nb_facettes);
471 facettes_testees = 0;
472 ArrOfIntFT liste_facettes_testees;
476 const ArrOfInt& index_elem = intersection.
index_elem();
477 const ArrOfInt& index_facettes = intersection.
index_facette();
478 int collision_trouvee = 0;
494 for (i_facette = 0; i_facette < nb_facettes && !collision_trouvee; i_facette++)
498 int index = index_facettes[i_facette];
499 while (index >= 0 && !collision_trouvee)
506 int index2 = index_elem[i_elem];
507 while (index2 >= 0 && !collision_trouvee)
513 if (i_facette2 > i_facette)
527 collision_trouvee = resu > 0;
540 const int n = liste_facettes_testees.
size_array();
541 for (i = 0; i < n; i++)
543 int i_facette2 = liste_facettes_testees[i];
544 facettes_testees.
clearbit(i_facette2);
549 array_trier_retirer_doublons(liste_elements_collision);
550 collision_trouvee = (int)
mp_max(collision_trouvee);
551 return collision_trouvee;
568 const DoubleTab& indicatrice,
569 IntVect& num_compo)
const
579 for (i = 0; i < nb_elem; i++)
581 const double indic = indicatrice[i];
584 num_compo[i] = (indic == phase_cont) ? -1 : 1;
587 const int nb_local_components = search_connex_components_local(domaine_vf.
elem_faces(), domaine_vf.
face_voisins(), num_compo);
588 const int nb_compo_glob = compute_global_connex_components(num_compo, nb_local_components);
590 return nb_compo_glob;
605 const ArrOfInt& flags_compo_a_supprimer,
607 DoubleTab& indicatrice)
609 const int n = num_compo.
size();
615 ArrOfInt liste_facettes_a_supprimer;
616 liste_facettes_a_supprimer.
resize_array(nb_facettes, RESIZE_OPTIONS::NOCOPY_NOINIT);
621 const ArrOfInt& index_elem = intersections.
index_elem();
622 ArrOfBit flags(nb_facettes);
631 double variation_indicatrice = 0.;
633 const DoubleVect& volumes = domaine_vf.
volumes();
634 for (
int i = 0; i < n; i++)
636 const int compo_connexe = num_compo[i];
637 if (compo_connexe >= 0 && flags_compo_a_supprimer[compo_connexe])
640 variation_indicatrice += (phase_cont - indicatrice[i])*volumes(i);
641 indicatrice[i] = phase_cont;
643 int index = index_elem[i];
670 variation_indicatrice =
mp_sum(variation_indicatrice);
671 declare_espace_virtuel_invalide(indicatrice);
672 return variation_indicatrice;
695 if (algo_remaillage_local.
a_lisser(temps))
701 if (algo_remaillage_local.
a_remailler(temps, maillage))
713 ArrOfInt liste_elements_collision;
714 for (
int num_tentative = 0; num_tentative < 2; num_tentative++)
718 if (!collision_trouvee)
725 Journal() <<
"Collision t= " << temps << finl;
734 DoubleTab indicatrice_partie_non_remaillee = indicatrice.
valeurs();
741 ArrOfInt flags_compo_a_supprimer(nb_compo);
742 const int n = liste_elements_collision.
size_array();
743 for (
int i = 0; i < n; i++)
745 const int elem = liste_elements_collision[i];
746 const int compo = num_compo[elem];
748 flags_compo_a_supprimer[compo] = 1;
753 flags_compo_a_supprimer,
755 indicatrice_partie_non_remaillee);
758 DoubleTab& indic = indicatrice.
valeurs();
762 for (i = 0; i < nb_elem; i++)
764 const double ind = indic[i];
765 const double indic2 = indicatrice_partie_non_remaillee[i];
767 indic[i] = phase_cont;
772 if (num_tentative == 0)
781 for (i = 0; i < nb_elem; i++)
783 const double indic2 = indicatrice_partie_non_remaillee[i];
784 if (indic2 != phase_cont)
790 if (num_tentative == 0)
int testsetbit(int_t i) const
Renvoie la valeur du bit e, puis met le bit e a 1.
void clearbit(int_t i) const
Met le bit e a 0.
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
virtual const Domaine_dis_base & domaine_dis_base() const
virtual void creer_tableau_elements(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
creation d'un tableau parallele de valeurs aux elements.
double volumes(int i) const
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
int index_element_suivant_
int index_facette_suivante_
: class Intersections_Elem_Facettes
const ArrOfInt & index_elem() const
Renvoie un tableau de taille domaine.
const ArrOfInt & index_facette() const
Renvoie un tableau de taille "nombre de facettes de l'interface" pour un element 0 <= facette < nb_fa...
const Intersections_Elem_Facettes_Data & data_intersection(int index) const
Renvoie les donnees de l'intersection stockee a l'indice "index" dans le tableau "data" ( 0 <= index ...
: class Maillage_FT_Disc Cette classe decrit un maillage:
const DoubleTab & sommets() const
renvoie le tableau des sommets (reels et virtuels) dimension(0) = nombre de sommets,
void supprimer_facettes(const ArrOfInt &liste_facettes)
Supprime les facettes dont les indices locaux sont donnes en parametre.
int nb_facettes() const
renvoie le nombre de facettes (reelles et virtuelles) (egal a facettes().
virtual void ajouter_maillage(const Maillage_FT_Disc &maillage_tmp, int skip_facettes=0)
virtual const DoubleTab & get_update_normale_facettes() const
Calcule la grandeur demandee, stocke le resultat dans un tableau interne a la classe et renvoie le re...
void parcourir_maillage()
Remplit la structure intersections_elem_facettes_.
virtual void recopie(const Maillage_FT_Disc &maillage_source, Statut_Maillage niveau_copie)
Recopie une partie du maillage source dans *this.
const Intersections_Elem_Facettes & intersections_elem_facettes() const
const IntTab & facettes() const
renvoie le tableau des facettes (reelles et virtuelles) dimension(0) = nombre de facettes,
classe Objet_U Cette classe est la classe de base des Objets de TRUST
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
static void mp_max_for_each_item(TRUSTArray< _TYPE_ > &x, int n=-1)
static double mp_max(double)
static Sortie & Journal(int message_level=0)
Renvoie un objet statique de type Sortie qui sert de journal d'evenements.
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
: class Remaillage_FT Cette classe implemente les procedures de remaillage des interfaces pour le Fro...
void barycentrer_lisser_systematique(double temps, Maillage_FT_Disc &maillage)
applique barycentrage, lissage et correction de volume.
int a_remailler(double temps, const Maillage_FT_Disc &maillage) const
void remaillage_local_interface(double temps, Maillage_FT_Disc &maillage)
Verifie les criteres de remaillage locaux (longueur des aretes) et effectue les remaillages locaux si...
int a_lisser(double temps) const
classe Remailleur_Collision_FT_base Classe de base pour la hierarchie des remailleurs d'interfaces en...
virtual int traite_RuptureCoalescenceInterfaces_Conservatif(Maillage_FT_Disc &, Champ_base &)
algorithme de remaillage qui tente de conserver le volume.
virtual int traite_RuptureCoalescenceInterfaces(Maillage_FT_Disc &maillage, Champ_base &indicatrice) const =0
Classe de base des flux de sortie.
void append_array(_TYPE_ valeur)
_SIZE_ size_array() const
void resize_array(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
: class Topologie_Maillage_FT Cette classe implemente les procedures de remaillage des interfaces pou...
int test_collision_facettes(const Maillage_FT_Disc &maillage, ArrOfInt &liste_elements_collision) const
Teste s'il existe deux facettes du maillage qui se coupent (avec test_intersection_facettes_2D/3D).
virtual int calculer_composantes_connexes_pour_suppression(const Domaine_VF &domaine_vf, const DoubleTab &indicatrice, IntVect &num_compo) const
Computes eulerian connex components of the phase indicator function "indicatrice" according to the ge...
int test_intersection_facettes_3D(int fa70, int fa71, const Maillage_FT_Disc &maillage) const
Teste si les facettes fa70 et fa71 se coupent.
virtual void remailler_interface(const double temps, Maillage_FT_Disc &maillage, Champ_base &indicatrice, Remaillage_FT &algo_remaillage_local)
Remaillage de l'interface: - amelioration petites et grandes facettes,.
virtual double suppression_interfaces(const IntVect &num_compo, const ArrOfInt &flags_compo_a_supprimer, Maillage_FT_Disc &maillage, DoubleTab &indicatrice)
Removes all interfaces contained in eulerian elements marked by the "flags_" array,...
int test_intersection_facettes_2D(int fa70, int fa71, const Maillage_FT_Disc &maillage) const
Voir test_intersection_facettes_3D.
int get_phase_continue() const