16#include <Remailleur_Collision_FT_Thomas.h>
17#include <Domaine_VF.h>
20#include <communications.h>
22#include <Synonyme_info.h>
38 Cerr <<
"Remailleur_Collision_FT_Thomas::readOn()" << finl;
40 param.ajouter_flag(
"tester", & tester_);
41 param.ajouter(
"distance_interface_element_max", & distance_utilisateur_);
42 param.lire_avec_accolades_depuis(is);
45 Cerr <<
" Test des fonctions de Remailleur_Collision_FT_Thomas." << finl;
46 if (distance_utilisateur_ <= 0.)
48 Cerr <<
"Error: distance_interface_element_max must be positive" << finl;
62 Cerr <<
"Erreur Remailleur_Collision_FT_Thomas::printOn() n'est pas code." << finl;
86 const Domaine& domaine = domaine_VF.
domaine();
89 const int nb_som_elem = domaine.nb_som_elem();
90 const int end_liste = -1;
93 const IntTab& elem_sommets = domaine.les_elems();
95 assert(voisinage_sommet_.dimension_tot(0) == domaine.nb_som_tot());
96 assert(next_elem_.dimension_tot(0) == domaine.nb_elem_tot()*domaine.nb_som_elem());
98 voisinage_sommet_ = end_liste;
108 for (
int elem=0; elem<nb_elem_tot; elem++)
109 for (
int som=0; som<nb_som_elem; som++)
111 const int som_global =
112 domaine.get_renum_som_perio(elem_sommets(elem,som));
114 const int p = nb_som_elem*elem+som;
116 next_elem_[p] = voisinage_sommet_[som_global];
117 voisinage_sommet_[som_global] = p;
120 tmp_flag_elements_.resize_array(nb_elem_tot);
121 tmp_flag_elements_ = 0;
144 const Domaine& domaine = domaine_VF.
domaine();
149 const ArrOfInt& index_facette = intersection_elem_facettes.
index_facette();
151 const int nb_elem_tot = domaine.nb_elem_tot();
152 const int nb_elem = domaine.nb_elem();
153 const int nb_facettes_interface = maillage.
nb_facettes();
156 int nb_elem_parcourus = 0;
157 int numero_voisinage = 0;
162 int ready_to_quit = 0;
166 IntTab vu_localement(nb_elem_tot-nb_elem);
173 ArrOfInt elements_proches(nb_facettes_interface),elements_eloignes(3*nb_facettes_interface);
174 ArrOfInt *elem_proches, *elem_eloignes;
176 elements_proches.resize_array(0);
179 elem_proches = &(elements_proches);
180 elem_eloignes = &(elements_eloignes);
187 distance_interface_element_eulerien_=-1;
188 nombre_de_voisins_plus_proches_=0;
189 surface_interface_elements_voisins_=0.;
196 for (
int facette=0; facette<nb_facettes_interface; facette++)
198 const double surface_facette = surface_facettes[facette];
206 int index = index_facette[facette];
214 assert(elem<nb_elem);
219 distance_interface_element_eulerien_[elem] = 0;
236 distance_interface_element_eulerien_.echange_espace_virtuel();
237 surface_interface_elements_voisins_.echange_espace_virtuel();
248 nb_elem_parcourus+=elem_proches->
size_array();
250 for (
int elem=nb_elem; elem<nb_elem_tot; elem++)
251 if (surface_interface_elements_voisins_[elem]>0.)
270 ArrOfInt elem_voisins;
272 while (!ready_to_quit)
274 const int taille_liste = elem_proches->
size_array();
279 vu_localement = !seen;
283 for (
int elem_loc=0; elem_loc<taille_liste; elem_loc++)
286 const int elem_glob = (*elem_proches)[elem_loc];
288 const int nb_elem_voisins = elem_voisins.
size_array();
289 const int distance_elem = distance_interface_element_eulerien_[elem_glob];
292 for (
int elem_voisin_loc=0; elem_voisin_loc<nb_elem_voisins; elem_voisin_loc++)
294 const int elem_voisin_glob = elem_voisins[elem_voisin_loc];
297 if (distance_interface_element_eulerien_[elem_voisin_glob]==-1)
299 distance_interface_element_eulerien_[elem_voisin_glob] = numero_voisinage;
301 if (elem_voisin_glob>=nb_elem) vu_localement[elem_voisin_glob-nb_elem]=seen;
308 const int distance_elem_voisin = distance_interface_element_eulerien_[elem_voisin_glob];
310 if (distance_elem_voisin>distance_elem)
314 nombre_de_voisins_plus_proches_[elem_voisin_glob]++;
317 if (distance_elem==0)
320 assert(distance_elem_voisin==1);
321 surface_interface_elements_voisins_[elem_voisin_glob] += surface_interface_elements_voisins_[elem_glob];
341 nb_elem_parcourus+=elem_eloignes->
size_array();
343 for (
int elem=nb_elem; elem<nb_elem_tot; elem++)
345 const int test_distance = (distance_interface_element_eulerien_[elem]==numero_voisinage);
346 const int test_vu = (vu_localement[elem-nb_elem]!=seen);
348 if ( test_distance && test_vu)
360 ArrOfInt *temporaire;
362 temporaire = &(*elem_proches);
363 elem_proches = &(*elem_eloignes);
364 elem_eloignes = &(*temporaire);
372 ready_to_quit = (nb_elem_parcourus == nb_elem_tot) || (numero_voisinage == distance_utilisateur_);
377 assert(nb_elem_parcourus==nb_elem_tot || numero_voisinage==distance_utilisateur_);
381 nombre_de_voisins_plus_proches_.echange_espace_virtuel();
382 surface_interface_elements_voisins_.echange_espace_virtuel();
386 plus_grande_distance_interface_element_eulerien_ = numero_voisinage ;
387 assert_parallel(plus_grande_distance_interface_element_eulerien_);
413 const Domaine& domaine = domaine_VF.
domaine();
415 const int nb_elem = domaine.
nb_elem();
416 const int distance_interface_elem = distance_interface_element_eulerien_[elem];
420 ArrOfInt voisins_a_distance_plus_petite;
422 if (volume_perdu_[elem]==0)
return 1;
435 const int nb_voisins_a_distance_plus_petite = voisins_a_distance_plus_petite.
size_array();
438 switch (distance_interface_elem)
443 Cerr <<
"Erreur Remailleur_Collision_FT_Thomas::transport_volume_perdu_sur_element()" << finl;
444 Cerr <<
"La distance separant l'interface de l'element eulerien " << elem
445 <<
" est strictement superieur a " << distance_utilisateur_ << finl;
446 Cerr <<
"L'utilisateur a demande de ne considerer que les elements situes a une distance d'au plus "
447 << distance_utilisateur_ <<
" de l'interface" << finl;
448 Cerr <<
"Sortie du programme." << finl;
459 assert(nb_voisins_a_distance_plus_petite!=0 || elem>=nb_elem);
460 assert(nb_voisins_a_distance_plus_petite<=nombre_de_voisins_plus_proches_[elem]);
461 if (elem<nb_elem) assert(nb_voisins_a_distance_plus_petite==nombre_de_voisins_plus_proches_[elem]);
469 for (
int elem_loc=0; elem_loc<nb_voisins_a_distance_plus_petite; elem_loc++)
471 const int elem_voisin = voisins_a_distance_plus_petite[elem_loc];
474 assert(distance_interface_elem-distance_interface_element_eulerien_[elem_voisin]==1);
475 volume_perdu_[elem_voisin]+=volume_perdu_[elem]*surface_interface_elements_voisins_[elem_voisin]
476 /surface_interface_elements_voisins_[elem];
481 volume_perdu_[elem]=0.;
487 assert(nb_voisins_a_distance_plus_petite!=0 || elem>=nb_elem);
488 assert(nb_voisins_a_distance_plus_petite<=nombre_de_voisins_plus_proches_[elem]);
489 if (elem<nb_elem) assert(nb_voisins_a_distance_plus_petite==nombre_de_voisins_plus_proches_[elem]);
492 for (
int elem_loc=0; elem_loc<nb_voisins_a_distance_plus_petite; elem_loc++)
494 const int elem_voisin = voisins_a_distance_plus_petite[elem_loc];
496 assert(distance_interface_elem- distance_interface_element_eulerien_[elem_voisin]==1);
497 volume_perdu_[elem_voisin]+=volume_perdu_[elem]/nombre_de_voisins_plus_proches_[elem];
502 volume_perdu_[elem]=0.;
523 const Domaine& domaine = domaine_VF.
domaine();
525 const int nb_elem = domaine.
nb_elem();
526 const int nb_elem_tot = domaine.nb_elem_tot();
527 const int end_liste = -1;
538 IntTab distance_des_elements(plus_grande_distance_interface_element_eulerien_+1);
539 IntTab suite_des_elements(nb_elem_tot);
540 distance_des_elements = end_liste;
541 suite_des_elements = end_liste;
543 assert(nb_elem_tot==distance_interface_element_eulerien_.dimension_tot(0));
546 for (
int elem=0; elem<nb_elem_tot; elem++)
548 const int distance = distance_interface_element_eulerien_[elem];
550 if (distance==-1)
continue;
551 assert(distance<=plus_grande_distance_interface_element_eulerien_);
553 suite_des_elements(elem)=distance_des_elements(distance);
554 distance_des_elements(distance)=elem;
564 for (
int distance=plus_grande_distance_interface_element_eulerien_; distance!=-1; distance--)
568 for (
int elem=distance_des_elements(distance); elem!=-1; elem=suite_des_elements(elem))
573 volume_perdu_.echange_espace_virtuel();
581 double volume_perdu_transporte = 0.;
583 for (
int elem=0; elem<nb_elem; elem++)
584 if (!distance_interface_element_eulerien_[elem])
585 volume_perdu_transporte += volume_perdu_[elem];
587 return volume_perdu_transporte;
602 ArrOfInt& liste_voisins,
607 const Domaine& domaine = domaine_VF.
domaine();
610 const int end_liste = -1;
613 const IntTab& elem_sommets = domaine.les_elems();
619 for (
int som=0; som<nb_som_elem; som++)
621 const int som_global = domaine.get_renum_som_perio(elem_sommets(elem,som));
624 for (
int p=voisinage_sommet_[som_global]; p!=end_liste; p=next_elem_[p])
626 const int elem_voisin = p/nb_som_elem;
627 assert(som_global==domaine.get_renum_som_perio(elem_sommets(elem_voisin,p%nb_som_elem)));
628 if (!tmp_flag_elements_.testsetbit(elem_voisin))
634 for (
int i = 0; i < n; i++)
635 tmp_flag_elements_.clearbit(liste_voisins[i]);
655 ArrOfInt& liste_voisins)
const
657 const int distance_interface_elem = distance_interface_element_eulerien_[elem];
661 for (
int i = 0; i < n; i++)
663 const int elem_voisin = liste_voisins[i];
664 const int distance_interface_elem_voisin = distance_interface_element_eulerien_[elem_voisin];
666 const bool is_plus_petit = distance_interface_elem_voisin<distance_interface_elem;
667 const bool is_positif = distance_interface_elem_voisin>-1;
669 if (is_positif && is_plus_petit)
671 assert(distance_interface_elem-distance_interface_elem_voisin==1);
672 liste_voisins[j] = elem_voisin;
691 ArrOfInt liste_voisins;
705 ArrOfInt liste_voisins;
713 assert(nombre_de_voisins_plus_proches_.dimension_tot(0)>elem);
714 return nombre_de_voisins_plus_proches_[elem];
727 Journal() <<
"Remailleur_Collision_FT_Thomas::traite_RuptureCoalescenceInterfaces_Conservatif" << finl;
729 const Domaine& domaine = domaine_VF.
domaine();
731 const DoubleVect& volumes_elements_euleriens = domaine_VF.
volumes();
733 const int nb_elements_euleriens = domaine.nb_elem();
734 const int nb_elements_euleriens_tot = domaine.nb_elem_tot();
736 int ok_mise_a_jour = 0, ok_remailleur = 0;
738 const double temps = maillage.
temps();
739 double volume_initial = 0.;
740 double volume_final = 0.;
741 double le_volume_perdu = 0.;
742 double volume_perdu_elements = 0.;
743 double volume_perdu_sommets = 0.;
745 ArrOfDoubleFT variation_volume;
750 assert(volumes_elements_euleriens.
size_totale()==nb_elements_euleriens_tot);
754 assert(est_dimensionne_);
759 volume_perdu_ = indicatrice.
valeurs();
762 for (
int elem=0; elem<nb_elements_euleriens; elem++)
763 volume_initial += indicatrice.
valeurs()[elem]*volumes_elements_euleriens[elem];
773 remaillage_FT(maillage).remaillage_local_interface(temps, maillage);
784 for (
int elem=0; elem<nb_elements_euleriens_tot; elem++)
785 volume_perdu_[elem] *= volumes_elements_euleriens[elem];
789 for (
int elem=0; elem<nb_elements_euleriens; elem++)
790 le_volume_perdu+=volume_perdu_[elem];
802 variation_volume = 0.;
808 int ok = ok_remailleur*ok_mise_a_jour;
812 if (tester_) tester(maillage);
828 remaillage_FT(maillage).lisser_dvolume(maillage,variation_volume,5);
829 variation_volume*=-1.;
830 remaillage_FT(maillage).corriger_volume(maillage,variation_volume);
839 for (
int elem=0; elem<nb_elements_euleriens; elem++)
840 volume_final += indicatrice_finale.
valeurs()[elem]*volumes_elements_euleriens[elem];
845 Journal() <<
"Perte de volume due au remaillage : " << le_volume_perdu <<
" "
846 << volume_perdu_elements <<
" " << volume_perdu_sommets
847 <<
"\nVolume initial : " << volume_initial
848 <<
" volume final : " << volume_final << finl;
873 const ArrOfInt& index_elem = intersections.
index_elem();
874 const IntTab& facettes = maillage.
facettes();
876 const int distance_interface_elem = distance_interface_element_eulerien_[elem];
878 assert(volume_perdu_.dimension_tot(0)==domaine_dis(maillage).domaine().nb_elem_tot());
880 const double volume_perdu_elem = volume_perdu_[elem];
886 assert(elem<domaine_dis(maillage).domaine().nb_elem());
887 int index = index_elem[elem];
889 const double somme_coefs = surface_interface_elements_voisins_[elem];
890 const double inv_somme_coefs = (somme_coefs > 0.) ? (1. / somme_coefs) : 0.;
892 while (index >= 0 && distance_interface_elem==0)
903 const double volume_perdu_surfacique = volume_perdu_elem*coeff_surface;
910 const int sommet = facettes(facette,som_loc);
914 volume_perdu_sommet[sommet]+=volume_perdu_surfacique*data.
barycentre_[som_loc];
935 const Domaine& domaine = domaine_VF.
domaine();
937 const int nb_elem = domaine.
nb_elem();
938 const int nb_sommets_interface = maillage.
nb_sommets();
941 if (volume_perdu_sommet.
size_array()!=nb_sommets_interface)
944 volume_perdu_sommet = 0.;
948 for (
int elem=0; elem<nb_elem; elem++)
961 double volume_perdu_transporte = 0.;
963 for (
int som=0; som<nb_sommets_interface; som++)
964 if (!maillage.
sommet_virtuel(som)) volume_perdu_transporte+=volume_perdu_sommet[som];
966 return volume_perdu_transporte;
973double Remailleur_Collision_FT_Thomas::surface_intersection(
const int elem,
const Maillage_FT_Disc& maillage)
const
979 const ArrOfInt& index_elem = intersections.
index_elem();
981 double surface_dans_elem = 0.;
986 assert(elem<domaine_dis(maillage).domaine().nb_elem());
987 int index = index_elem[elem];
999 return surface_dans_elem;
1004void Remailleur_Collision_FT_Thomas::tester(
const Maillage_FT_Disc& maillage)
const
1006 tester_interface(maillage);
1007 tester_distance(maillage);
1008 tester_voisinage(maillage);
1009 tester_liste(maillage);
1010 tester_transport(maillage);
1012 DoubleTab copie_volume_perdu(volume_perdu_);
1013 copie_volume_perdu.echange_espace_virtuel();
1015 tester_transport_complet(maillage, copie_volume_perdu);
1016 tester_volume_par_sommet(maillage, copie_volume_perdu);
1020 Cerr <<
"Fin des tests." << finl;
1021 Cerr <<
"Sortie du programme." << finl;
1028void Remailleur_Collision_FT_Thomas::tester_interface(
const Maillage_FT_Disc& maillage)
const
1030 Nom nom(
"Elements_euleriens_proc_");
1033 SFichier fichier_elements_euleriens(nom.getChar());
1035 const Domaine_VF& domaine_VF = ref_cast(Domaine_VF,domaine_dis(maillage));
1036 const Domaine& domaine = domaine_VF.
domaine();
1038 const IntTab& facettes = maillage.
facettes();
1039 const ArrOfInt& sommet_elem = maillage.
sommet_elem();
1041 const DoubleVect& volumes_elements_euleriens = domaine_VF.
volumes();
1042 const DoubleTab& indicatrice =
1045 const int nb_elements_euleriens = domaine.nb_elem();
1051 const Intersections_Elem_Facettes& intersections =
1054 const ArrOfInt& index_element = intersections.
index_elem();
1057 for (
int elem=0; elem<nb_elements_euleriens; elem++)
1059 fichier_elements_euleriens <<
"Element eulerien reel numero : " << elem << finl;
1060 fichier_elements_euleriens <<
"Taux d'occupation de l'interface : " << indicatrice[elem] << finl;
1061 fichier_elements_euleriens <<
"Volume de l'element " << elem <<
" : " << volumes_elements_euleriens[elem] << finl;
1062 fichier_elements_euleriens <<
"Volume occupee par l'interface : " << indicatrice[elem]*volumes_elements_euleriens[elem] << finl;
1063 fichier_elements_euleriens <<
"L'element " << elem <<
" est coupe par les facettes : " << finl;
1065 double surface_intersection_totale = 0.;
1068 int index = index_element[elem];
1072 const Intersections_Elem_Facettes_Data& data =
1078 surface_intersection_totale += surface_dans_elem;
1080 if (surface_dans_elem!=0.)
1082 fichier_elements_euleriens << facette <<
" de surface d'intersection "
1083 << surface_dans_elem << finl;
1085 fichier_elements_euleriens <<
"De sommets : ( ";
1092 const int sommet = facettes(facette,som_loc);
1095 if (sommet_elem[sommet]==elem)
1096 fichier_elements_euleriens <<
"{" << (int) sommet <<
"," << (
int) 1 <<
"} ";
1098 fichier_elements_euleriens <<
"{" << (int) sommet <<
"," << (
int) 0 <<
"} ";
1102 fichier_elements_euleriens <<
")" << finl;
1110 fichier_elements_euleriens <<
"Surface d'intersection totale : " << surface_intersection_totale << finl;
1111 fichier_elements_euleriens <<
"Erreur fonction Remailleur_Collision_FT_Thomas::surface_intersection()"
1112 << surface_intersection_totale-surface_intersection(elem,maillage) << finl;
1114 fichier_elements_euleriens <<
"**************************************************************" << finl;
1115 fichier_elements_euleriens <<
"**************************************************************" << finl;
1122void Remailleur_Collision_FT_Thomas::tester_voisinage(
const Maillage_FT_Disc& maillage)
const
1124 Nom nom_sommets(
"Voisinage_sommets_proc_");
1126 nom_sommets+=
".txt";
1128 Nom nom_elements(
"Voisinage_elements_proc_");
1130 nom_elements+=
".txt";
1132 SFichier fichier_voisinage_sommet(nom_sommets.getChar());
1133 SFichier fichier_voisinage_element(nom_elements.getChar());
1135 const Domaine_VF& domaine_VF = ref_cast(Domaine_VF,domaine_dis(maillage));
1136 const Domaine& domaine = domaine_VF.
domaine();
1139 const int nb_som_tot = domaine.nb_som_tot();
1140 const int nb_elem_tot = domaine.nb_elem_tot();
1141 const int nb_som_elem = domaine.nb_som_elem();
1142 const int end_liste = -1;
1144 fichier_voisinage_sommet <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
1145 fichier_voisinage_sommet <<
"Nombre d'elements reels : " << domaine.nb_elem() << finl;
1146 fichier_voisinage_sommet <<
"Nombre d'elements virtuels : " << nb_elem_tot << finl;
1147 fichier_voisinage_sommet <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
1148 fichier_voisinage_sommet << finl;
1149 fichier_voisinage_sommet << finl;
1151 for (
int som=domaine.get_renum_som_perio(0); som<nb_som_tot; som++)
1153 fichier_voisinage_sommet <<
"Affichage des elements voisins du sommet " << som <<
" : {{{ ";
1155 for (
int p=voisinage_sommet_[som]; p!=end_liste; p=next_elem_[p])
1157 const int elem = p/nb_som_elem;
1159 assert(elem<nb_elem_tot);
1160 assert(som==domaine.get_renum_som_perio(domaine.les_elems()(elem,p%nb_som_elem)));
1161 fichier_voisinage_sommet << elem <<
" ";
1164 fichier_voisinage_sommet <<
"}}}" << finl;
1165 fichier_voisinage_sommet <<
"*************************************************************" << finl;
1166 fichier_voisinage_sommet <<
"*************************************************************" << finl;
1167 fichier_voisinage_sommet << finl;
1173 int taille_liste_voisins_plus_proches = -1;
1174 ArrOfInt elem_voisins;
1176 for (
int elem=0; elem<nb_elem_tot; elem++)
1179 const int taille_liste_voisins = elem_voisins.
size_array();
1184 fichier_voisinage_element <<
"Affichage des elements voisins de l'element " << elem <<
" : {{{ ";
1186 for (
int elem_loc=0; elem_loc<taille_liste_voisins; elem_loc++)
1187 fichier_voisinage_element << elem_voisins[elem_loc] <<
" ";
1189 fichier_voisinage_element <<
"}}}" << finl;
1193 taille_liste_voisins_plus_proches = elem_voisins.
size_array();
1194 assert(taille_liste_voisins_plus_proches<=nombre_de_voisins_plus_proches_[elem]);
1195 if (elem<domaine.nb_elem()) assert(taille_liste_voisins_plus_proches==nombre_de_voisins_plus_proches_[elem]);
1200 fichier_voisinage_element <<
"Affichage des elements voisins de l'element " << elem
1201 <<
" a distance plus petite que : "
1202 << distance_interface_element_eulerien_[elem] <<
" : {{{ ";
1204 for (
int elem_loc=0; elem_loc<taille_liste_voisins_plus_proches; elem_loc++)
1206 const int elem_voisin_plus_proche = elem_voisins[elem_loc];
1207 fichier_voisinage_element <<
"(" << elem_voisin_plus_proche <<
","
1208 << distance_interface_element_eulerien_[elem_voisin_plus_proche]
1212 fichier_voisinage_element <<
"}}}" << finl;
1214 fichier_voisinage_element <<
"Nombre de voisins plus proches : " << nombre_de_voisins_plus_proches_[elem] << finl;
1216 fichier_voisinage_element <<
"*************************************************************" << finl;
1217 fichier_voisinage_element <<
"*************************************************************" << finl;
1218 fichier_voisinage_element << finl;
1225void Remailleur_Collision_FT_Thomas::tester_distance(
const Maillage_FT_Disc& maillage)
const
1227 Nom nom(
"Distance_interface_proc_");
1231 SFichier fichier_distance(nom.getChar());
1233 const Domaine_VF& domaine_VF = ref_cast(Domaine_VF,domaine_dis(maillage));
1234 const Domaine& domaine = domaine_VF.
domaine();
1236 const int nb_elem_tot = domaine.nb_elem_tot();
1238 fichier_distance <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
1239 fichier_distance <<
"Nombre d'elements reels : " << domaine.nb_elem() << finl;
1240 fichier_distance <<
"Nombre d'elements virtuels : " << nb_elem_tot << finl;
1241 fichier_distance <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
1242 fichier_distance << finl;
1243 fichier_distance << finl;
1246 fichier_distance <<
"Affichage de la plus grande distance a l'interface." << plus_grande_distance_interface_element_eulerien_;
1247 fichier_distance << finl;
1248 fichier_distance <<
"*************************************************************" << finl;
1249 fichier_distance <<
"*************************************************************" << finl;
1250 fichier_distance << finl;
1252 for (
int elem=0; elem<nb_elem_tot; elem++)
1254 const int distance = distance_interface_element_eulerien_[elem];
1255 assert(distance<=plus_grande_distance_interface_element_eulerien_);
1256 fichier_distance <<
"Affichage de l'element " << elem <<
" ";
1257 fichier_distance <<
"et de sa distance a l'interface : " << distance << finl;
1262void Remailleur_Collision_FT_Thomas::tester_liste(
const Maillage_FT_Disc& maillage)
const
1264 Nom nom(
"Liste_chainee_proc_");
1268 SFichier fichier_liste(nom.getChar());
1270 const Domaine_VF& domaine_VF = ref_cast(Domaine_VF,domaine_dis(maillage));
1271 const Domaine& domaine = domaine_VF.
domaine();
1273 const int nb_elem_tot = domaine.nb_elem_tot();
1278 IntTab distance_des_elements(plus_grande_distance_interface_element_eulerien_+1);
1279 IntTab suite_des_elements(nb_elem_tot);
1280 distance_des_elements = -1;
1281 suite_des_elements = -1;
1283 assert(nb_elem_tot==distance_interface_element_eulerien_.dimension_tot(0));
1286 fichier_liste <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
1287 fichier_liste <<
"Nombre d'elements reels : " << domaine.nb_elem() << finl;
1288 fichier_liste <<
"Nombre d'elements virtuels : " << nb_elem_tot << finl;
1289 fichier_liste <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
1290 fichier_liste << finl;
1291 fichier_liste << finl;
1295 for (
int elem=0; elem<nb_elem_tot; elem++)
1297 const int distance = distance_interface_element_eulerien_[elem];
1298 if (distance==-1)
continue;
1299 assert(distance<=plus_grande_distance_interface_element_eulerien_);
1301 suite_des_elements(elem)=distance_des_elements(distance);
1302 distance_des_elements(distance)=elem;
1307 fichier_liste <<
"Affichage de la premiere liste chainee" << finl;
1308 fichier_liste << finl;
1309 for (
int distance=0; distance<plus_grande_distance_interface_element_eulerien_+1; distance++)
1310 fichier_liste <<
"Distance : " << distance <<
" element : " << distance_des_elements(distance) << finl;
1312 fichier_liste << finl;
1313 fichier_liste <<
"*************************************************************" << finl;
1314 fichier_liste <<
"*************************************************************" << finl;
1315 fichier_liste << finl;
1318 fichier_liste <<
"Affichage de la deuxieme liste chainee" << finl;
1319 fichier_liste << finl;
1321 for (
int elem=0; elem<nb_elem_tot; elem++)
1322 fichier_liste <<
"Precedent : " << elem <<
" suivant : " << suite_des_elements(elem) << finl;
1324 fichier_liste << finl;
1325 fichier_liste <<
"*************************************************************" << finl;
1326 fichier_liste <<
"*************************************************************" << finl;
1327 fichier_liste << finl;
1329 fichier_liste <<
"Test du parcours de la liste chainee" << finl;
1330 fichier_liste << finl;
1333 for (
int distance=plus_grande_distance_interface_element_eulerien_; distance!=-1; distance--)
1337 fichier_liste <<
"Affichage des elements a distance " << distance <<
" de l'interface." << finl;
1338 fichier_liste <<
"{ ";
1340 for (
int elem=distance_des_elements(distance); elem!=-1; elem=suite_des_elements(elem))
1341 fichier_liste << elem <<
" ";
1343 fichier_liste <<
"}" << finl;
1344 fichier_liste <<
"-------------------------------------------------------------" << finl;
1345 fichier_liste << finl;
1351void Remailleur_Collision_FT_Thomas::tester_transport(
const Maillage_FT_Disc& maillage)
const
1353 Nom nom(
"Transport_proc_");
1357 SFichier fichier_transport(nom.getChar());
1359 const Domaine_VF& domaine_VF = ref_cast(Domaine_VF,domaine_dis(maillage));
1360 const Domaine& domaine = domaine_VF.
domaine();
1362 const int nb_elem = domaine.nb_elem();
1363 const int nb_elem_tot = domaine.nb_elem_tot();
1365 if (volume_perdu_.dimension_tot(0) != nb_elem_tot)
1367 Cerr <<
"Erreur Remailleur_Collision_FT_Thomas::transport_volume_perdu_sur_element()" << finl;
1368 Cerr <<
"Le tableau volume_distribue_ n'est pas correctement initialise." << finl;
1369 Cerr <<
"Sortie du programme." << finl;
1373 if (distance_interface_element_eulerien_.dimension_tot(0) != nb_elem_tot)
1375 Cerr <<
"Erreur Remailleur_Collision_FT_Thomas::transport_volume_perdu_sur_element()" << finl;
1376 Cerr <<
"Le tableau distance_interface_element_eulerien_ n'est pas correctement initialise." << finl;
1377 Cerr <<
"Sortie du programme." << finl;
1383 ArrOfInt voisins_a_distance_plus_petite(100);
1384 voisins_a_distance_plus_petite.resize_array(0);
1387 fichier_transport <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
1388 fichier_transport <<
"Nombre d'elements reels : " << nb_elem << finl;
1389 fichier_transport <<
"Nombre d'elements virtuels : " << nb_elem_tot << finl;
1390 fichier_transport <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
1391 fichier_transport << finl;
1392 fichier_transport << finl;
1394 for (
int elem=0; elem<nb_elem_tot; elem++)
1396 const int distance_interface_elem = distance_interface_element_eulerien_[elem];
1398 if (volume_perdu_[elem]==0)
1400 fichier_transport <<
"Pas de volume perdu pour l'element " << elem << finl;
1401 fichier_transport <<
"*******************************************************" << finl;
1402 fichier_transport <<
"*******************************************************" << finl;
1403 fichier_transport << finl;
1409 const int nb_voisins_a_distance_plus_petite = voisins_a_distance_plus_petite.size_array();
1411 ArrOfDouble surface_par_element(nb_voisins_a_distance_plus_petite);
1416 double surface_totale = 0.;
1420 switch(distance_interface_elem)
1425 fichier_transport <<
"L'element " << elem
1426 <<
" est a une distance de l'interface superieure a " << distance_interface_elem << finl;
1427 fichier_transport <<
"*******************************************************" << finl;
1428 fichier_transport <<
"*******************************************************" << finl;
1429 fichier_transport << finl;
1437 fichier_transport <<
"Pas de transport pour l'element " << elem
1438 <<
" a distance " << distance_interface_elem <<
" de l'interface" << finl;
1439 fichier_transport <<
"*******************************************************" << finl;
1440 fichier_transport <<
"*******************************************************" << finl;
1441 fichier_transport << finl;
1449 assert(nb_voisins_a_distance_plus_petite!=0 || elem>=nb_elem);
1450 assert(nb_voisins_a_distance_plus_petite<=nombre_de_voisins_plus_proches_[elem]);
1451 if (elem<nb_elem) assert(nb_voisins_a_distance_plus_petite==nombre_de_voisins_plus_proches_[elem]);
1453 for (
int elem_loc=0; elem_loc<nb_voisins_a_distance_plus_petite; elem_loc++)
1455 const int elem_voisin = voisins_a_distance_plus_petite[elem_loc];
1456 const double surface_dans_elem_voisin = surface_interface_elements_voisins_[elem_voisin];
1458 surface_totale += surface_dans_elem_voisin;
1459 surface_par_element[elem_loc] += surface_dans_elem_voisin;
1464 fichier_transport <<
"L'element " << elem <<
" est a distance "
1465 << distance_interface_elem <<
" case 1" << finl;
1466 fichier_transport <<
"Cet element a perdu le volume " << volume_perdu_[elem] << finl;
1467 fichier_transport <<
"Cet element a " << nombre_de_voisins_plus_proches_[elem] <<
" voisins plus proches" << finl;
1468 fichier_transport <<
"La surface d'interface dans l'ensemble de ces voisins les plus proches est : "
1469 << surface_totale <<
" ou " << surface_interface_elements_voisins_[elem] << finl;
1470 fichier_transport <<
"-------------------------------------------------------" << finl;
1473 for (
int elem_loc=0; elem_loc<nb_voisins_a_distance_plus_petite; elem_loc++)
1475 const int elem_voisin = voisins_a_distance_plus_petite[elem_loc];
1478 assert(distance_interface_elem-distance_interface_element_eulerien_[elem_voisin]==1);
1480 fichier_transport <<
"La surface d'interface dans le voisin " << elem_voisin
1481 <<
" de " << elem <<
" est : "
1482 << surface_par_element[elem_loc] <<
" ou "
1483 << surface_interface_elements_voisins_[elem_voisin] << finl;
1485 fichier_transport <<
"L'element voisin " << elem_voisin <<
" recoit le volume "
1486 << volume_perdu_[elem]*surface_interface_elements_voisins_[elem_voisin]/surface_interface_elements_voisins_[elem]
1488 fichier_transport << finl;
1492 fichier_transport <<
"-------------------------------------------------------" << finl;
1493 fichier_transport <<
"*******************************************************" << finl;
1494 fichier_transport <<
"*******************************************************" << finl;
1495 fichier_transport << finl;
1502 assert(nb_voisins_a_distance_plus_petite!=0 || elem>=nb_elem);
1503 assert(nb_voisins_a_distance_plus_petite==nombre_de_voisins_plus_proches_[elem]);
1504 if (elem<nb_elem) assert(nb_voisins_a_distance_plus_petite==nombre_de_voisins_plus_proches_[elem]);
1506 fichier_transport <<
"L'element " << elem <<
" est a distance "
1507 << distance_interface_elem <<
" default" << finl;
1509 fichier_transport <<
"Cet element a perdu le volume " << volume_perdu_[elem] << finl;
1510 fichier_transport <<
"Cet element a " << nombre_de_voisins_plus_proches_[elem] <<
" voisins plus proches" << finl;
1511 fichier_transport <<
"Et distribue a ces voisins les plus proches le volume : "
1512 << volume_perdu_[elem]/nombre_de_voisins_plus_proches_[elem] << finl;
1513 fichier_transport <<
"*******************************************************" << finl;
1514 fichier_transport <<
"*******************************************************" << finl;
1515 fichier_transport << finl;
1526void Remailleur_Collision_FT_Thomas::tester_transport_complet(
const Maillage_FT_Disc& maillage, DoubleTab& copie_volume_perdu_)
const
1528 Nom nom(
"Transport_complet_proc_");
1532 SFichier fichier_transport(nom.getChar());
1534 const Domaine_VF& domaine_VF = ref_cast(Domaine_VF,domaine_dis(maillage));
1535 const Domaine& domaine = domaine_VF.
domaine();
1537 const int nb_elem = domaine.nb_elem();
1538 const int nb_elem_tot = domaine.nb_elem_tot();
1539 const int end_liste = -1;
1550 IntTab distance_des_elements(plus_grande_distance_interface_element_eulerien_+1);
1551 IntTab suite_des_elements(nb_elem_tot);
1552 distance_des_elements = end_liste;
1553 suite_des_elements = end_liste;
1555 assert(nb_elem_tot==distance_interface_element_eulerien_.dimension_tot(0));
1558 fichier_transport <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
1559 fichier_transport <<
"Nombre d'elements reels : " << nb_elem << finl;
1560 fichier_transport <<
"Nombre d'elements virtuels : " << nb_elem_tot << finl;
1561 fichier_transport <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
1562 fichier_transport << finl;
1563 fichier_transport << finl;
1566 fichier_transport <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
1567 double volume_total_avant = 0.;
1568 for (
int elem=0; elem<nb_elem; elem++)
1569 volume_total_avant += copie_volume_perdu_[elem];
1571 fichier_transport <<
"Affichage du volume perdu avant tester_transport_complet() : "
1573 fichier_transport <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
1574 fichier_transport << finl;
1575 fichier_transport << finl;
1578 for (
int elem=0; elem<nb_elem_tot; elem++)
1580 const int distance = distance_interface_element_eulerien_[elem];
1581 if (distance==-1)
continue;
1582 assert(distance<=plus_grande_distance_interface_element_eulerien_);
1584 suite_des_elements(elem)=distance_des_elements(distance);
1585 distance_des_elements(distance)=elem;
1594 ArrOfInt voisins_a_distance_plus_petite(100);
1598 for (
int distance=plus_grande_distance_interface_element_eulerien_; distance!=-1; distance--)
1603 for (
int elem=distance_des_elements(distance); elem!=-1; elem=suite_des_elements(elem))
1605 voisins_a_distance_plus_petite.resize_array(0);
1609 const int nb_voisins_a_distance_plus_petite = voisins_a_distance_plus_petite.size_array();
1611 const int distance_interface_elem = distance_interface_element_eulerien_[elem];
1613 ArrOfDouble surface_par_element(nb_voisins_a_distance_plus_petite);
1614 double surface_totale = 0.;
1616 if (copie_volume_perdu_[elem]==0)
1618 fichier_transport <<
"L'element " << elem <<
" n' a pas perdu de volume" << finl;
1619 fichier_transport <<
"*******************************************************" << finl;
1620 fichier_transport <<
"*******************************************************" << finl;
1626 switch(distance_interface_elem)
1631 fichier_transport <<
"L'element " << elem <<
" est a une distance de l'interface superieure "
1632 <<
"a la distance prescrite par l'utilisateur." << finl;
1633 fichier_transport <<
"*******************************************************" << finl;
1634 fichier_transport <<
"*******************************************************" << finl;
1641 fichier_transport <<
"L'element " << elem <<
" n' est pas traverse par l'interface" << finl;
1642 fichier_transport <<
"*******************************************************" << finl;
1643 fichier_transport <<
"*******************************************************" << finl;
1650 assert(nb_voisins_a_distance_plus_petite!=0 || elem>=nb_elem);
1651 assert(nb_voisins_a_distance_plus_petite<=nombre_de_voisins_plus_proches_[elem]);
1652 if (elem<nb_elem) assert(nb_voisins_a_distance_plus_petite==nombre_de_voisins_plus_proches_[elem]);
1654 fichier_transport <<
"Case 1" << finl;
1655 fichier_transport <<
"L'element " << elem <<
" est a distance " << distance_interface_elem
1656 <<
" de l'interface et a perdu le volume : " << copie_volume_perdu_[elem] << finl;
1657 fichier_transport <<
"Il a " << nombre_de_voisins_plus_proches_[elem]
1658 <<
" voisins plus proches de l'interface." << finl;
1659 fichier_transport <<
"Ces voisins sont : " << finl;
1665 for (
int elem_loc=0; elem_loc<nb_voisins_a_distance_plus_petite; elem_loc++)
1667 const int elem_voisin = voisins_a_distance_plus_petite[elem_loc];
1668 const double surface_dans_elem_voisin = surface_interface_elements_voisins_[elem_voisin];
1670 surface_totale += surface_dans_elem_voisin;
1671 surface_par_element[elem_loc] += surface_dans_elem_voisin;
1672 assert (std::fabs(surface_dans_elem_voisin-surface_interface_elements_voisins_[elem_voisin])<=1.e-15);
1674 fichier_transport <<
"l'element " << elem_voisin
1675 <<
" traverse par l'interface de surface : "
1676 << surface_interface_elements_voisins_[elem_voisin] << finl;
1681 fichier_transport <<
"La surface totale est donc de : " << surface_totale
1682 <<
" ou " << surface_interface_elements_voisins_[elem]
1685 assert(std::fabs(surface_totale-surface_interface_elements_voisins_[elem])<=1.e-14);
1688 for (
int elem_loc=0; elem_loc<nb_voisins_a_distance_plus_petite; elem_loc++)
1690 const int elem_voisin = voisins_a_distance_plus_petite[elem_loc];
1693 assert(distance_interface_elem-distance_interface_element_eulerien_[elem_voisin]==1);
1695 copie_volume_perdu_[elem_voisin]+=copie_volume_perdu_[elem]
1696 *surface_interface_elements_voisins_[elem_voisin]/surface_interface_elements_voisins_[elem];
1698 fichier_transport <<
"L'element " << elem_voisin <<
" recoit de la part de l'element " << elem
1700 << copie_volume_perdu_[elem]*surface_interface_elements_voisins_[elem_voisin]/surface_interface_elements_voisins_[elem]
1702 fichier_transport <<
"Le nouveau volume perdu par l'element " << elem_voisin
1703 <<
" est donc : " << copie_volume_perdu_[elem_voisin] << finl;
1707 copie_volume_perdu_[elem]=0.;
1709 fichier_transport <<
"Le volume perdu par l'element " << elem
1710 <<
" est maintenant nul : " << copie_volume_perdu_[elem] << finl;
1712 fichier_transport <<
"*******************************************************" << finl;
1713 fichier_transport <<
"*******************************************************" << finl;
1721 assert(nb_voisins_a_distance_plus_petite!=0 || elem>=nb_elem);
1722 assert(nb_voisins_a_distance_plus_petite<=nombre_de_voisins_plus_proches_[elem]);
1723 if (elem<nb_elem) assert(nb_voisins_a_distance_plus_petite==nombre_de_voisins_plus_proches_[elem]);
1725 fichier_transport <<
"Default" << finl;
1726 fichier_transport <<
"L'element " << elem <<
" est a distance " << distance_interface_elem
1727 <<
" de l'interface et a perdu le volume : " << copie_volume_perdu_[elem] << finl;
1728 fichier_transport <<
"Il a " << nombre_de_voisins_plus_proches_[elem]
1729 <<
" voisins plus proches de l'interface." << finl;
1730 fichier_transport <<
"Ces voisins sont : " << finl;
1733 for (
int elem_loc=0; elem_loc<nombre_de_voisins_plus_proches_[elem]; elem_loc++)
1735 const int elem_voisin = voisins_a_distance_plus_petite[elem_loc];
1738 assert(distance_interface_elem-distance_interface_element_eulerien_[elem_voisin]==1);
1739 copie_volume_perdu_[elem_voisin]+=copie_volume_perdu_[elem]/nombre_de_voisins_plus_proches_[elem];
1741 fichier_transport <<
"l'element " << elem_voisin
1742 <<
" qui recoit le volume perdu : "
1743 << copie_volume_perdu_[elem]/nombre_de_voisins_plus_proches_[elem] << finl;
1744 fichier_transport <<
"Le nouveau volume perdu par l'element " << elem_voisin
1745 <<
" est donc : " << copie_volume_perdu_[elem_voisin] << finl;
1749 copie_volume_perdu_[elem]=0.;
1751 fichier_transport <<
"Le volume perdu par l'element " << elem
1752 <<
" est maintenant nul : " << copie_volume_perdu_[elem] << finl;
1754 fichier_transport <<
"*******************************************************" << finl;
1755 fichier_transport <<
"*******************************************************" << finl;
1767 fichier_transport << finl;
1768 fichier_transport <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
1769 fichier_transport <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
1771 double volume_total_perdu = 0.;
1772 for (
int elem=0; elem<nb_elem; elem++)
1773 volume_total_perdu += copie_volume_perdu_[elem];
1775 fichier_transport <<
"Affichage du volume perdu total transporte : " <<
Process::mp_sum(volume_total_perdu) << finl;
1780void Remailleur_Collision_FT_Thomas::tester_volume_par_sommet(
const Maillage_FT_Disc& maillage,
const DoubleTab& copie_volume_perdu_)
const
1782 Nom nom(
"Volume_sommet_proc_");
1786 SFichier fichier_volume(nom.getChar());
1788 const Domaine_VF& domaine_VF = ref_cast(Domaine_VF,domaine_dis(maillage));
1789 const Domaine& domaine = domaine_VF.
domaine();
1791 const Intersections_Elem_Facettes& intersections =
1794 const ArrOfInt& index_elem = intersections.
index_elem();
1795 const IntTab& facettes = maillage.
facettes();
1797 const int nb_elem = domaine.nb_elem();
1798 const int nb_elem_tot = domaine.nb_elem_tot();
1799 const int nb_sommets_interface = maillage.
nb_sommets();
1801 ArrOfDoubleFT volume_perdu_par_sommet(nb_sommets_interface);
1802 volume_perdu_par_sommet = 0.;
1805 fichier_volume <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
1806 fichier_volume <<
"Nombre d'elements reels : " << nb_elem << finl;
1807 fichier_volume <<
"Nombre d'elements virtuels : " << nb_elem_tot << finl;
1808 fichier_volume <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
1809 fichier_volume << finl;
1810 fichier_volume << finl;
1813 fichier_volume <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
1814 double volume_total_avant = 0.;
1815 for (
int elem=0; elem<nb_elem; elem++)
1816 volume_total_avant += copie_volume_perdu_[elem];
1818 fichier_volume <<
"Affichage du volume perdu avant tester_volume_par_sommet() : "
1820 fichier_volume <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
1821 fichier_volume << finl;
1822 fichier_volume << finl;
1825 for (
int elem=0; elem<nb_elem; elem++)
1829 const double surface_interface_dans_elem = surface_interface_elements_voisins_[elem];
1831 const double volume_perdu_elem = copie_volume_perdu_[elem];
1833 fichier_volume <<
"L'element " << elem <<
" a perdu le volume " << copie_volume_perdu_[elem] << finl;
1834 fichier_volume <<
"La surface d'interface le coupant est de : " << surface_interface_dans_elem << finl;
1837 int index = index_elem[elem];
1841 const Intersections_Elem_Facettes_Data& data =
1850 const double volume_perdu_surfacique = volume_perdu_elem*coeff_surface;
1852 fichier_volume <<
"La facette " << facette <<
" coupant l'element " << elem
1854 fichier_volume <<
"Cela represente " << coeff_surface <<
" de la surface totale" << finl;
1855 fichier_volume <<
"La facette " << facette <<
" recoit donc un volume surfacique de "
1856 << volume_perdu_surfacique << finl;
1857 fichier_volume <<
"-------------------------------------------------------" << finl;
1864 const int sommet = facettes(facette,som_loc);
1865 assert(sommet<nb_sommets_interface);
1867 fichier_volume <<
"La coordonnee barycentrique du barycentre "
1868 <<
"de la surface de l'interface dans l'element " << elem
1869 <<
" par rapport au sommet " << sommet <<
" est : " << data.
barycentre_[som_loc]
1871 fichier_volume <<
"Le sommet " << sommet <<
" de la facette " << facette
1872 <<
" recoit donc le volume : " << volume_perdu_surfacique*data.
barycentre_[som_loc];
1873 fichier_volume << finl;
1875 volume_perdu_par_sommet[sommet]+=volume_perdu_surfacique*data.
barycentre_[som_loc];
1879 fichier_volume <<
"-------------------------------------------------------" << finl;
1887 fichier_volume <<
"*******************************************************" << finl;
1888 fichier_volume <<
"*******************************************************" << finl;
1889 fichier_volume << finl;
1893 fichier_volume << finl;
1894 fichier_volume <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
1895 fichier_volume <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
1900 double volume_perdu_total = 0.;
1901 for (
int som=0; som<nb_sommets_interface; som++)
1902 if (!maillage.
sommet_virtuel(som)) volume_perdu_total+=volume_perdu_par_sommet[som];
1904 fichier_volume <<
"Le volume perdu par sommet total est : " <<
Process::mp_sum(volume_perdu_total) << finl;
1911 const Domaine& domaine = domaine_VF.
domaine();
1914 const int nb_som_elem = domaine.nb_som_elem();
1915 const int nb_som_tot = domaine.nb_som_tot();
1918 distance_interface_element_eulerien_.reset();
1919 nombre_de_voisins_plus_proches_.reset();
1920 surface_interface_elements_voisins_.reset();
1921 volume_perdu_.reset();
1922 domaine.creer_tableau_elements(distance_interface_element_eulerien_, RESIZE_OPTIONS::NOCOPY_NOINIT);
1923 distance_interface_element_eulerien_=-1;
1924 domaine.creer_tableau_elements(nombre_de_voisins_plus_proches_);
1925 domaine.creer_tableau_elements(surface_interface_elements_voisins_);
1926 domaine.creer_tableau_elements(volume_perdu_);
1929 voisinage_sommet_.resize(nb_som_tot, RESIZE_OPTIONS::NOCOPY_NOINIT);
1930 next_elem_.resize(nb_elem_tot*nb_som_elem, RESIZE_OPTIONS::NOCOPY_NOINIT);
1933 voisinage_sommet_ = -1;
1936 return (est_dimensionne_=1);
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
void collecter_espace_virtuel(ArrOfDouble &tab, MD_Vector_tools::Operations_echange op) const
int nb_som_elem() const
Renvoie le nombre de sommets des elements geometriques constituants le domaine.
int_t nb_elem_tot() const
double volumes(int i) const
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
int index_element_suivant_
double fraction_surface_intersection_
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:
Transport_Interfaces_FT_Disc & equation_transport()
void mesh_tag_increase() const
int nb_sommets() const
renvoie le nombre de sommets (reels et virtuels) (egal a sommets().
int nb_facettes() const
renvoie le nombre de facettes (reelles et virtuelles) (egal a facettes().
double temps() const
return temps_physique_ (temps_physique_ ne sert a rien en interne.
const Desc_Structure_FT & desc_sommets() const
renvoie le descripteur des sommets (espace_distant/virtuel)
void parcourir_maillage()
Remplit la structure intersections_elem_facettes_.
int sommet_virtuel(int i) const
const Intersections_Elem_Facettes & intersections_elem_facettes() const
virtual const ArrOfDouble & get_update_surface_facettes() const
Calcule la grandeur demandee, stocke le resultat dans un tableau interne a la classe et renvoie le re...
const IntTab & facettes() const
renvoie le tableau des facettes (reelles et virtuelles) dimension(0) = nombre de facettes,
const ArrOfInt & sommet_elem() const
pour postraitement, renvoie sommet_elem_
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.
Helper class to factorize the readOn method of Objet_U classes.
static double mp_min(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 barrier()
Synchronise tous les processeurs du groupe courant (attend que tous les processeurs soient arrives a ...
static int me()
renvoie mon rang dans le groupe de communication 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),...
classe Remailleur_Collision_FT_Juric Classe implementant un remailleur d'interfaces entrees en collis...
int traite_RuptureCoalescenceInterfaces(Maillage_FT_Disc &maillage, int nb_fa7Intersectees, const IntTab &couples_fa7Intersectees, const DoubleTab &segmentsInter_fa7Intersectees, Champ_base &indicatrice) override
: class Remailleur_Collision_FT_Thomas Cette classe implemente les procedures de remaillage des inter...
int mettre_a_jour_data(const Maillage_FT_Disc &)
Remailleur_Collision_FT_Thomas()
int transport_volume_perdu_sur_element(const int, const Maillage_FT_Disc &)
int nb_elements_voisins(const int, const Domaine_dis_base &) const
int traite_RuptureCoalescenceInterfaces_Conservatif(Maillage_FT_Disc &, Champ_base &) override
algorithme de remaillage qui tente de conserver le volume.
int transport_volume_perdu_sur_sommet(const int, ArrOfDouble &, const Maillage_FT_Disc &) const
int elements_voisins(const int, ArrOfInt &, const Domaine_dis_base &) const
int elements_voisins_a_distance_plus_petite2(const int, ArrOfInt &) const
int initialiser_data(const Maillage_FT_Disc &)
int construire_voisinage_sommet(const Maillage_FT_Disc &)
int nb_elements_voisins_a_distance_plus_petite(const int, const Domaine_dis_base &) const
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_tot(int) const override
_SIZE_ size_totale() const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
void update_indicatrice_normale_distance()
Updates normals and distances to interface, then updates indicatrice.
const Champ_Inc_base & inconnue() const override
const Champ_base & get_indicatrice() override
getter champ variables_internes_->indicatrice_cache a partir de la position des interfaces.
const Maillage_FT_Disc & maillage_interface() const