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
Returns the array of field values at the current time.
virtual DoubleTab & valeurs()=0
class Champ_base This class is the base of the fields hierarchy.
void collecter_espace_virtuel(ArrOfDouble &tab, MD_Vector_tools::Operations_echange op) const
int nb_som_elem() const
Returns the number of vertices of the geometric elements that make up the domain.
int_t nb_elem_tot() const
double volumes(int i) const
class Domaine_dis_base This class is the base of the hierarchy of discretized domains.
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
Returns the string identifying the class.
virtual Entree & readOn(Entree &)
Reads an Objet_U from an input stream. Virtual method to override.
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
Helper class to factorize the readOn method of Objet_U classes.
static double mp_min(double)
static Sortie & Journal(int message_level=0)
Returns a static Sortie object used as an event journal.
static double mp_sum(double)
Computes the sum of x over all processors in the current group.
static void barrier()
Synchronizes all processors in the current group (waits until all processors have reached the barrier...
static int me()
Returns the rank of the local processor in the current communication group. See Comm_Group::rank() an...
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
static int je_suis_maitre()
Returns 1 if on the master processor of the current group (i.e. me() == 0), 0 otherwise.
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
Base class for output streams.
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