16#include <Maillage_FT_Disc.h>
17#include <TRUST_Deriv.h>
20#include <Domaine_VF.h>
21#include <Transport_Interfaces_FT_Disc.h>
23#include <EcritureLectureSpecial.h>
24#include <Champ_base.h>
25#include <Paroi_FT_disc.h>
26#include <Sauvegarde_Reprise_Maillage_FT.h>
27#include <communications.h>
28#include <Comm_Group.h>
30#include <LecFicDistribue.h>
31#include <Probleme_FT_Disc_gen.h>
32#include <Dirichlet_entree_fluide_leaves.h>
33#include <Dirichlet_homogene.h>
35#include <Array_tools.h>
38#include <TRUST_2_PDI.h>
71Maillage_FT_Disc_Data_Cache::Maillage_FT_Disc_Data_Cache()
104 costheta.
resize(nb_som, 2);
106 const double deg_to_rad = M_PI / 180.;
110 for (
int i = 0; i < nb_som; i++)
114 if ((num_face < 0) || (num_face>=domaine_vf.
nb_faces_bord()))
119 double theta1 = 0., theta2 = 0.;
126 const int num_face_frontiere = num_face - num_premiere_face;
154 Cerr <<
"Erreur dans Maillage_FT_Disc::calculer_costheta_minmax: condition aux limites non implementee"
161 Cerr <<
"Error in Maillage_FT_Disc::calculer_costheta_minmax:\n "
162 << cl_base.
que_suis_je() <<
" is not a valid boundary condition type."
167 if (refequation_transport_)
183 costheta(i, 0) = cos(theta1 * deg_to_rad);
184 costheta(i, 1) = cos(theta2 * deg_to_rad);
211 mesh_data_cache_.typer(
"Maillage_FT_Disc_Data_Cache");
240 if (nouveau_statut < PARCOURU && statut_ >=
PARCOURU)
281 les_mots[0] =
"fichier";
282 les_mots[1] =
"sous_domaines";
283 les_mots[2] =
"sous_zones";
286 Motcle motlu, accolade_fermee=
"}", accolade_ouverte=
"{";
288 if(motlu!=accolade_ouverte)
290 Cerr <<
"On attendait une { a la lecture d'une " <<
que_suis_je() << finl;
291 Cerr <<
"et non : " << motlu << finl;
296 while (motlu != accolade_fermee)
298 int rang=les_mots.search(motlu);
307 Cerr <<
"Lecture de l ensemble des sommets du Maillage_FT_Disc dans le fichier " << nomfic << finl;
310 Cerr <<
" Erreur a l'ouverture du fichier." << finl;
322 nom_sz.dimensionner(nb_sz);
327 for (
int i=0; i<nb_sz; i++)
331 if (motlu==
"aleatoire")
333 else if (motlu==
"uniforme")
336 for (
int k=0; k<dim; k++)
342 Cerr<<
"Le nombre de marqueurs specifies dans chacune des "<<dim<<
" directions doit etre strictement positif"<<finl;
350 Cerr<<
"Les seules options disponibles pour la distribution de marqueurs sont aleatoire et uniforme"<<finl;
351 Cerr<<motlu<<
" n est pas reconnu"<<finl;
363 Cerr <<
"On ne comprend pas le mot : " << motlu <<
" dans " <<
que_suis_je() << finl;
364 Cerr <<
"Les mots compris sont : " << finl;
365 for (
int i=0; i<les_mots.size(); i++)
366 Cerr<<les_mots[i]<<finl;
379 Cerr <<
"Erreur : ::printOn n'est pas code." << finl;
389 int isom,som,nbsom =
facettes_.dimension(1);
390 os<<
"#fa7="<<fa7<<
" soms= ";
391 for (isom=0 ; isom<nbsom ; isom++)
398 os<<
" surf= "<<surface_facette_[fa7]<<
" normale= "<<normale_facette_(fa7,0)<<
" "<<normale_facette_(fa7,1);
401 os<<
" "<<normale_facette_(fa7,2);
405 if (affsom==1 && nbsom>2)
407 for (isom=0 ; isom<nbsom ; isom++)
441 static int compteur_plot = 0;
446 snprintf(str,14,
"%03ld",compteur_plot++);
448 snprintf(str,14,
"%03d",compteur_plot++);
461 snprintf(str,14,
"%03ld_",
me());
463 snprintf(str,14,
"%04ld_",
me());
465 snprintf(str,14,
"%05ld_",
me());
468 snprintf(str,14,
"%03d_",
me());
470 snprintf(str,14,
"%04d_",
me());
472 snprintf(str,14,
"%05d_",
me());
476 Cerr <<
"Error in Maillage_FT_Disc::ecrire_plot." << finl;
477 Cerr <<
"Contact TRUST support." << finl;
482 nom_fic += (
Nom(un_temps));
485 fic.
setf(std::ios::scientific);
487 Process::Journal() <<
"ecriture de " << nom_fic <<
" au temps " << un_temps << finl;
491 const int nbfacettes =
facettes_.dimension(0);
492 const int nb_som_par_facette =
facettes_.dimension(1);
494 const double coeff = 0.1;
495 for (fa7=0 ; fa7<nbfacettes ; fa7++)
506 for (isom=0 ; isom<nb_som_par_facette ; isom++)
516 cdg[k] /= nb_som_par_facette;
519 for (isom=0 ; isom<nb_som_par_facette ; isom++)
532 if (nb_som_par_facette>2)
566 Cerr<<
"Lecture des parametres de remaillage (Remaillage_FT::lire_param_remaillage)"<<finl;
568 Param param(
"Maillage_FT_Disc::lire_param_maillage");
593 refequation_transport_ = eq;
602 refdomaine_dis_ = domaine_dis;
603 refparcours_interface_ = parcours;
609 const Joint& joint = itr;
610 const int pe_voisin = joint.
PEvoisin();
648 if (niveau_copie ==
RESET)
652 refequation_transport_ = source.refequation_transport_;
653 refdomaine_dis_ = source.refdomaine_dis_;
654 refparcours_interface_ = source.refparcours_interface_;
694 assert(&maillage_tmp !=
this);
697 const int nb_sommets_tmp = maillage_tmp.
nb_sommets();
698 const int nb_facettes_tmp = maillage_tmp.
nb_facettes();
699 const DoubleTab& sommets_tmp = maillage_tmp.
sommets();
700 const IntTab& facettes_tmp = maillage_tmp.
facettes();
701 const ArrOfInt& sommet_elem_tmp = maillage_tmp.
sommet_elem_;
709 const int nb_sommets_tot = nb_sommets_ + nb_sommets_tmp;
710 const int nb_facettes_tot = nb_facettes_ + nb_facettes_tmp;
711 const int nb_som_par_facette = facettes_tmp.
dimension(1);
715 facettes_.resize(nb_facettes_tot,nb_som_par_facette);
724 int fa7, fa7_tmp, isom,som,som_tmp, k;
725 for (fa7_tmp=0 ; fa7_tmp<nb_facettes_tmp ; fa7_tmp++)
727 fa7 = fa7_tmp + nb_facettes_;
728 for (isom=0 ; isom<nb_som_par_facette ; isom++)
730 facettes_(fa7,isom) = facettes_tmp(fa7_tmp,isom) + nb_sommets_;
736 for (som_tmp=0 ; som_tmp<nb_sommets_tmp ; som_tmp++)
738 som = som_tmp + nb_sommets_;
741 sommets_(som,k) = sommets_tmp(som_tmp,k);
752 ArrOfInt elements_tmp;
758 const ArrOfInt& pe_voisins_tmp = espace_tmp.
pe_voisins();
759 int ipe_tmp, pe_tmp, nb_pe_tmp = pe_voisins_tmp.
size_array();
760 for (ipe_tmp=0 ; ipe_tmp<nb_pe_tmp ; ipe_tmp++)
762 pe_tmp = pe_voisins_tmp[ipe_tmp];
763 elements_tmp = espace_tmp.
elements(pe_tmp);
764 elements_tmp += nb_sommets_;
774 const ArrOfInt& pe_voisins_tmp = espace_tmp.
pe_voisins();
775 int ipe_tmp,pe_tmp, nb_pe_tmp = pe_voisins_tmp.
size_array();
776 for (ipe_tmp=0 ; ipe_tmp<nb_pe_tmp ; ipe_tmp++)
778 pe_tmp = pe_voisins_tmp[ipe_tmp];
779 elements_tmp = espace_tmp.
elements(pe_tmp);
780 elements_tmp += nb_sommets_;
790 const ArrOfInt& pe_voisins_tmp = espace_tmp.
pe_voisins();
791 int ipe_tmp,pe_tmp, nb_pe_tmp = pe_voisins_tmp.
size_array();
792 for (ipe_tmp=0 ; ipe_tmp<nb_pe_tmp ; ipe_tmp++)
794 pe_tmp = pe_voisins_tmp[ipe_tmp];
795 elements_tmp = espace_tmp.
elements(pe_tmp);
796 elements_tmp += nb_facettes_;
806 const ArrOfInt& pe_voisins_tmp = espace_tmp.
pe_voisins();
807 int ipe_tmp,pe_tmp, nb_pe_tmp = pe_voisins_tmp.
size_array();
808 for (ipe_tmp=0 ; ipe_tmp<nb_pe_tmp ; ipe_tmp++)
810 pe_tmp = pe_voisins_tmp[ipe_tmp];
811 elements_tmp = espace_tmp.
elements(pe_tmp);
812 elements_tmp += nb_facettes_;
838 Cerr <<
"Error! Maillage_FT_Disc is empty. Contact TRUST support." << finl;
846 statistics().create_custom_counter(
"Parcours de l'interface",2,
"FrontTracking");
847 statistics().begin_count(
"Parcours de l'interface", statistics().get_last_opened_counter_level()+1);
849 statistics().end_count(
"Parcours de l'interface");
889 const DoubleVect& indicatrice_precedente)
const
893 statistics().create_custom_counter(
"Calculer_Indicatrice",2,
"FrontTracking");
894 statistics().begin_count(
"Calculer_Indicatrice",statistics().get_last_opened_counter_level()+1);
897 const Domaine& ladomaine = domaine_dis.
domaine();
899 const int nb_elem = ladomaine.
nb_elem();
901 const IntTab& elem_faces = domaine_vf.
elem_faces();
904 static ArrOfBit elements_calcules;
909 elements_calcules = 1;
911 indicatrice = indicatrice_precedente;
915 const int nb_elem_voisins = elem_faces.
dimension(1);
919 assert(indicatrice.
size() == nb_elem);
921 DoubleVect check(indicatrice);
922 for (i = 0; i < nb_elem_tot; i++)
924 const double x = indicatrice_precedente[i];
926 int check_voisins = (!est_egal(x, 0.) && !est_egal(x, 1.));
929 int index = index_elem[i];
930 check_voisins |= (index >= 0);
931 check(i) = check_voisins;
934 check.echange_espace_virtuel();
936 for (i = 0; i < nb_elem_tot; i++)
943 for (j = 0; j < nb_elem_voisins; j++)
945 const int face = elem_faces(i, j);
946 const int elem = face_voisins(face, 0) + face_voisins(face, 1) - i;
947 if (elem >= 0 && elem < nb_elem_tot)
957 const ArrOfInt& index_elem =
959 assert(indicatrice.
size() == nb_elem);
962 for (
int i = 0; i < nb_elem; i++)
965 int index = index_elem[i];
966 double somme_contrib = 0.;
974 while (somme_contrib > 1.)
976 while (somme_contrib < 0.)
978 if (somme_contrib > 0.)
980 indicatrice[i] = somme_contrib;
981 elements_calcules.
setbit(i);
1000 for (i = 0; i < nb_elem; i++)
1003 if (elements_calcules[i] == 0)
1005 double x = distance(i);
1009 double v = (x > 0.) ? 1. : 0.;
1023 Cerr <<
"[" <<
me() <<
"] calcul_indicatrice : error_count = " << error_count << finl;
1037 IntTab elems_to_change(0,2);
1038 const int nb_faces_elem = elem_faces.
line_size();
1040 for (
int elem = 0; elem < nb_elem; elem++)
1043 if (index_elem[elem] >= 0)
1048 for (
int ivoisin = 0; ivoisin < nb_faces_elem; ivoisin++)
1050 const int face = elem_faces(elem, ivoisin);
1051 const int elem_voisin = face_voisins(face, 0) + face_voisins(face, 1) - elem;
1053 if (elem_voisin < 0)
1056 if (indicatrice[elem_voisin] != 0. && indicatrice[elem_voisin] != 1.)
1059 somme += indicatrice[elem_voisin];
1071 elems_to_change.
append_line(elem, (
int)std::lrint(somme));
1076 if (indicatrice[elem] == 1.)
1078 else if (indicatrice[elem] == 0.)
1082 int new_indic = ((somme * 2) > count) ? 1 : 0;
1084 if (indic != new_indic)
1092 const int n = elems_to_change.
dimension(0);
1093 for (
int i = 0; i < n; i++)
1095 const int elem = elems_to_change(i, 0);
1096 indicatrice[elem] = elems_to_change(i, 1);
1099 Journal() <<
"Calcul indicatrice: correction par voisinage de " << n <<
" elements" << finl;
1103 Debog::verifier(
"Maillage_FT_Disc::calcul_indicatrice indicatrice=",indicatrice);
1105 statistics().end_count(
"Calculer_Indicatrice");
1116 statistics().create_custom_counter(
"Transporter_maillage",2,
"FrontTracking");
1117 statistics().begin_count(
"Transporter_maillage",statistics().get_last_opened_counter_level()+1);
1126 ArrOfInt liste_sommets;
1127 liste_sommets.
resize_array(nb_som, RESIZE_OPTIONS::NOCOPY_NOINIT);
1130 vecteur.resize(nb_som, dim, RESIZE_OPTIONS::NOCOPY_NOINIT);
1131 ArrOfIntFT liste_sommets_sortis;
1132 ArrOfIntFT numero_face_sortie;
1135 for (i = 0; i < nb_som; i++)
1139 liste_sommets[n] = i;
1140 for (
int j = 0; j < dim; j++)
1141 vecteur(n, j) = deplacement(i, j);
1147 vecteur.resize_dim0(n);
1152 liste_sommets_sortis,
1153 numero_face_sortie);
1160 statistics().end_count(
"Transporter_maillage");
1169 DoubleTab sommets_tmp;
1196 IntTab def_noeud(0, 4);
1205 for (
int noeud=0; noeud<nb_noeuds; noeud++)
1207 def_noeud(noeud,3) = def_noeud(noeud,4);
1208 def_noeud(noeud,4) = -1;
1224 for (
int noeud=0; noeud<nb_noeuds; noeud++)
1225 if (def_noeud(noeud,3)!=-1)
1235 int nbsommets =
sommets_.dimension(0);
1246 for (
int i = 0; i < nbsommets; i++)
1249 const int elem = def_noeud(renum(i), 3);
1250 const int face = def_noeud(renum(i), 4);
1262 Journal() <<
"Maillage_FT_Disc::construire_points" << finl;
1277 const Domaine& madomaine = mon_dom_.valeur();
1278 const int nb_elements_reels = madomaine.
nb_elem();
1279 const int nb_sommets_tot = soms.
dimension(0);
1289 const int chunk_size = 65536*nbproc ;
1302 if (nb_som_tot>chunk_size)
1304 Cerr <<
"The maximum of particules that you can use in your datafile is equal to " << chunk_size/nbproc <<
" / processor" << finl;
1305 Cerr <<
"If you want to exceed this limitation, you must parallelize your calculation with an apropriate number of processor" << finl;
1309 while (i < nb_som_tot)
1311 const int n_to_read = std::min(chunk_size, nb_som_tot - i);
1312 tmp.
resize(n_to_read, dim);
1316 for (
int j = 0; j < n_to_read; j++)
1317 for (
int k = 0; k < dim; k++)
1318 tmp(j, k) = soms(i+j, k);
1322 for (
int j = 0; j < n_to_read; j++)
1323 if (tmp2[j] >= nb_elements_reels)
1332 for (
int j = 0; j < n_to_read; j++)
1342 recevoir(tmp3, moi - 1, moi, 0 );
1343 for (
int j = 0; j < n_to_read; j++)
1346 else if (tmp2[j] >= 0)
1349 if (moi < nbproc - 1)
1351 envoyer(tmp3, moi, moi + 1, 0 );
1356 for (
int j = 0; j < n_to_read; j++)
1370 def_noeud.
resize(nb_sommets_tot, 5);
1373 for (som = 0; som < nb_sommets_tot; som++)
1378 int numero_element_a_stocker;
1379 PE_element = tmp3[som];
1380 numero_element_a_stocker = tmp2[som];
1381 def_noeud(nb_noeuds, 0) = 0;
1382 def_noeud(nb_noeuds, 1) = 0;
1383 def_noeud(nb_noeuds, 2) = PE_element;
1384 def_noeud(nb_noeuds, 3) = nb_noeuds;
1385 def_noeud(nb_noeuds, 4) = numero_element_a_stocker;
1398 const int nb_noeuds = def_noeud.
dimension(0);
1399 DoubleTab& coord_noeuds =
sommets_;
1406 for (noeud = 0; noeud < nb_noeuds; noeud++)
1408 if (def_noeud(noeud,3) != -1)
1410 coord_noeuds(indice, 0) = soms(noeud,0);
1411 coord_noeuds(indice, 1) = soms(noeud,1);
1413 coord_noeuds(indice, 2) = soms(noeud,2);
1415 renum(indice)=noeud;
1421 coord_noeuds.
resize(indice,2);
1423 coord_noeuds.
resize(indice,3);
1440 ArrOfIntFT liste_sommets(nb_som);
1442 DoubleTabFT vecteur(nb_som, dim);
1443 ArrOfIntFT liste_sommets_sortis;
1444 ArrOfIntFT numero_face_sortie;
1447 for (i = 0; i < nb_som; i++)
1451 liste_sommets[n] = i;
1452 for (
int j = 0; j < dim; j++)
1453 vecteur(n, j) = deplacement(i, j);
1459 vecteur.resize(n, dim);
1461 int skip_facettes = 1;
1464 liste_sommets_sortis,
1477 double& a,
double& b,
double& c,
double& d)
const
1480 const int nb_faces =
facettes_.dimension(1);
1484 double x0, y0, z0, x1, y1, z1;
1485 double inverse_norme;
1488 som1 =
facettes_(fa7,(isom+1)%nb_faces);
1497 a = (y1-y0) * normale_facettes(fa7,2) - (z1-z0) * normale_facettes(fa7,1);
1498 b = (z1-z0) * normale_facettes(fa7,0) - (x1-x0) * normale_facettes(fa7,2);
1499 c = (x1-x0) * normale_facettes(fa7,1) - (y1-y0) * normale_facettes(fa7,0);
1500 inverse_norme = 1. / sqrt(a*a + b*b + c*c);
1501 a *= -inverse_norme;
1502 b *= -inverse_norme;
1503 c *= -inverse_norme;
1504 d = - (a * x0 + b * y0 + c * z0);
1529 norme[0] = dy1 * dz2 - dy2 * dz1;
1530 norme[1] = dz1 * dx2 - dz2 * dx1;
1531 norme[2] = dx1 * dy2 - dx2 * dy1;
1532 l = sqrt(norme[0] * norme[0] + norme[1] * norme[1] + norme[2] * norme[2]);
1535 Process::Journal()<<
"Maillage_FT_Disc::calcul_normale_3D fa7= "<<num_facette<<finl;
1540 Process::Journal()<<
" ->normale= "<<norme[0]<<
" "<<norme[1]<<
" "<<norme[2]<<
" norme= "<<l<<finl;
1545 double inv_l = 1. / l;
1605 const ArrOfInt& index_elem = intersections.
index_elem();
1611 int index = index_elem[elem];
1620 normale[dir] += fraction_surf * normale_facettes(data.
numero_facette_, dir);
1621 surface += fraction_surf;
1628 const double norm = sqrt(normale[0]*normale[0]+normale[1]*normale[1]+normale[2]*normale[2]);
1632 normale[dir] /= norm;
1643 const ArrOfInt& index_elem = intersections.
index_elem();
1646 int index = index_elem[elem];
1655 normale[dir] += fraction_surf * normale_facettes(data.
numero_facette_, dir);
1662 const double norm = norme_array(normale);
1668 normale[dir] /= norm;
1689 for (
int dir = 0; dir < 3; dir++)
1691 for (
int som = 0; som < 3; som++)
1697 for (
int dir = 0; dir < 3; dir++)
1721#if (defined(PATCH_HYSTERESIS_V2) || defined(PATCH_HYSTERESIS_V3) )
1724 for (
int i=2; i<=ncalls; i++)
1740 int nfacettes_nulles = 0;
1741 const int nbfacettes =
facettes_.dimension(0);
1746 for (i = 0; i < nbfacettes; i++)
1752 double l = sqrt(dx * dx + dy * dy);
1774 normale(i, 0) = - dy * inv_l;
1775 normale(i, 1) = dx * inv_l;
1781 for (i = 0; i < nbfacettes; i++)
1794 normale(i, 0) = norme[0];
1795 normale(i, 1) = norme[1];
1796 normale(i, 2) = norme[2];
1799 if (nfacettes_nulles > 0)
1800 Objet_U::Journal() <<
"Facettes de surface nulle : " << nfacettes_nulles << finl;
1806 Cerr<<
"ATTENTION : Maillage_FT_Disc::calculer_voisins non implementee !!!"<<finl;
1864 for (
int ifa=0 ; ifa<
facettes_.dimension(0) ; ifa++)
1879 for (
int ifa=0 ; ifa<
facettes_.dimension(0) ; ifa++)
1895 for (
int ifa=0 ; ifa<
facettes_.dimension(0) ; ifa++)
1912 int& iarete0,
int& iarete1)
const
1914 int isom0,isom1, som0,som1;
1916 iarete1 = iarete0 = -1;
1917 const int nb_som_par_fa7 =
facettes_.dimension(1);
1918 int compteur = 0, trouve;
1921 int somsCommuns0[3];
1922 int somsCommuns1[3];
1923 somsCommuns0[0] = somsCommuns0[1] = somsCommuns0[2] = 0;
1924 somsCommuns1[0] = somsCommuns1[1] = somsCommuns1[2] = 0;
1926 for (isom0=0 ; isom0<nb_som_par_fa7 ; isom0++)
1930 for (isom1=0 ; isom1<nb_som_par_fa7 && trouve==0 ; isom1++)
1937 somsCommuns0[isom0]++;
1938 somsCommuns1[isom1]++;
1944 if (compteur==(nb_som_par_fa7-1))
1951 iarete0 = (somsCommuns0[0]==1) ? (0) : (1);
1952 iarete1 = (somsCommuns1[0]==1) ? (0) : (1);
1958 if (somsCommuns0[0]==1)
1960 if (somsCommuns0[1]==1)
1973 if (somsCommuns1[0]==1)
1975 if (somsCommuns1[1]==1)
1995 Process::Journal()<<
" somsCommuns0="<<somsCommuns0[0]<<
" "<<somsCommuns0[1]<<
" "<<somsCommuns0[2]<<finl;
1996 Process::Journal()<<
" somsCommuns1="<<somsCommuns1[0]<<
" "<<somsCommuns1[1]<<
" "<<somsCommuns1[2]<<finl;
1997 Process::Journal()<<
" aretes voisines iarete0="<<iarete0<<
" iarete1="<<iarete1<<finl;
2013 Process::Journal()<<
"PB dans facettes_voisines : fa7 voisines iarete0="<<iarete0<<
" iarete1="<<iarete1<<finl;
2018 Process::Journal()<<
" somsCommuns0="<<somsCommuns0[0]<<
" "<<somsCommuns0[1]<<
" "<<somsCommuns0[2]<<finl;
2019 Process::Journal()<<
" somsCommuns1="<<somsCommuns1[0]<<
" "<<somsCommuns1[1]<<
" "<<somsCommuns1[2]<<finl;
2020 Process::Journal()<<
" aretes voisines iarete0="<<iarete0<<
" iarete1="<<iarete1<<finl;
2049 ArrOfIntFT fa7s_elem;
2050 int i, nb_fa7, ifa70,ifa71,fa70,fa71, iarete0,iarete1;
2052 const Domaine& ladomaine = domaine_dis.
domaine();
2053 const int nb_elem = ladomaine.
nb_elem();
2054 for (i=0 ; i<nb_elem ; i++)
2059 for (ifa70=0 ; ifa70<nb_fa7 ; ifa70++)
2061 fa70 = fa7s_elem[ifa70];
2062 for (ifa71=ifa70+1 ; ifa71<nb_fa7 ; ifa71++)
2064 fa71 = fa7s_elem[ifa71];
2069 fa7Voisines(fa70,iarete0) = fa71;
2070 fa7Voisines(fa71,iarete1) = fa70;
2181 int special, afaire;
2192 Cerr <<
"Maillage_FT_Disc::sauvegarder Format PDI not supported yet" << finl;
2205 int old_precision = (int)os.
get_ostream().precision(14);
2207 bytes += 8 *
sommets_.size_array();
2212 bytes += 4 *
voisins_.size_array();
2234 const int format_xyz =
2238 if (refdomaine_dis_)
2252 Cerr <<
"Maillage_FT_Disc::reprendre Format PDI not supported yet" << finl;
2262 Cerr <<
"Erreur dans Maillage_FT_Disc::reprendre\n";
2263 Cerr <<
" On attendait le motcle " <<
que_suis_je();
2264 Cerr <<
"\n On a trouve " << motlu << finl;
2281 if (refdomaine_dis_)
2307 int nb_sommets_tot = NVsom+1;
2366 const ArrOfInt& liste_pe,
2371 const int dimension3 = (
dimension == 3);
2378 for (i = 0; i < n; i++)
2380 int pe_destination = liste_pe[i];
2381 assert(pe_destination !=
me());
2382 int numero_sommet = liste_sommets[i];
2396 double x =
sommets_(numero_sommet,0);
2397 double y =
sommets_(numero_sommet,1);
2398 double z = dimension3 ?
sommets_(numero_sommet, 2) : 0.;
2399 send_buffer << numero_sommet << drapeau << face_bord << x << y << z;
2407 const int recv_pe_size = recv_pe_list.
size_array();
2409 for (indice_pe = 0; indice_pe < recv_pe_size; indice_pe++)
2411 const int pe_source = recv_pe_list[indice_pe];
2417 int numero_sur_pe_source, drapeau, face_bord;
2419 recv_buffer >> numero_sur_pe_source >> drapeau >> face_bord >> x >> y >> z;
2420 if (recv_buffer.
eof())
2459 const ArrOfInt& request_sommets_num)
2464 ArrOfIntFT send_pe_list;
2467 ArrOfIntFT recv_pe_list;
2469 ArrOfIntFT pe_markers(nbproc);
2473 const int n = request_sommets_pe.
size_array();
2474 assert(n == request_sommets_num.
size_array());
2475 for (i = 0; i < n; i++)
2477 const int pe = request_sommets_pe[i];
2479 if (pe_markers[pe] == 0)
2495 for (i = 0; i < sz; i++) s[i] = send_pe_list[i];
2496 reverse_send_recv_pe_list(s, r);
2499 for (i = 0; i < sz; i++) recv_pe_list[i] = r[i];
2509 const int n = request_sommets_pe.
size_array();
2510 for (i = 0; i < n; i++)
2512 const int pe = request_sommets_pe[i];
2513 const int som = request_sommets_num[i];
2520 ArrOfIntFT liste_sommets_pe;
2521 ArrOfIntFT liste_sommets_num;
2525 for (i_pe = 0; i_pe < n_pe; i_pe++)
2527 const int pe = recv_pe_list[i_pe];
2532 buffer >> num_sommet;
2535 assert(num_sommet >= 0 && num_sommet <
nb_sommets());
2572 const ArrOfInt& liste_elem_virtuel_arrivee,
2573 const ArrOfInt& liste_face_virtuelle_arrivee,
2574 const DoubleTab& deplacement,
2575 ArrOfInt& liste_nouveaux_sommets,
2576 DoubleTab& deplacement_restant,
2587 const int nechange = liste_sommets.
size_array();
2590 ArrOfIntFT liste_pe(nechange);
2592 ArrOfIntFT liste_elem_arrivee(nechange);
2594 ArrOfIntFT liste_face_arrivee(nechange);
2599 const Domaine& ladomaine = domaine_dis.
domaine();
2603 const int nb_elements_reels = ladomaine.
nb_elem();
2604 const int nb_faces_reelles = domaine_vf.
nb_faces();
2606 for (i = 0; i < nechange; i++)
2609 const int numero_element = liste_elem_virtuel_arrivee[i];
2612 const int index = numero_element - nb_elements_reels;
2613 const int pe_destination = elem_virt_pe_num(index, 0);
2615 const int element_d_arrivee = elem_virt_pe_num(index, 1);
2619 const int numero_face = liste_face_virtuelle_arrivee[i];
2623 int face_d_arrivee = -1;
2624 if (numero_face >= 0)
2627 const int index_face = numero_face - nb_faces_reelles;
2628 face_d_arrivee = face_virt_pe_num(index_face, 1);
2631 liste_pe[i] = pe_destination;
2632 liste_elem_arrivee[i] = element_d_arrivee;
2633 liste_face_arrivee[i] = face_d_arrivee;
2651 for (i = 0; i < nechange; i++)
2653 const int sommet = liste_sommets[i];
2654 const int pe_destination = liste_pe[i];
2655 const int element_d_arrivee = liste_elem_arrivee[i];
2656 const int face_d_arrivee = liste_face_arrivee[i];
2676 const int nbsommets =
sommets_.dimension(0);
2677 const int moi =
me();
2678 for (i = 0; i < nbsommets; i++)
2686 for (i = 0; i < nbsommets; i++)
2703 for (i = 0; i < nechange; i++)
2705 const int pe_destination = liste_pe[i];
2706 const int sommet = liste_sommets[i];
2708 const double x = deplacement(i, 0);
2709 const double y = deplacement(i, 1);
2710 const double z = deplacement(i, 2);
2712 send_buffer << num_owner << x << y << z;
2717 const int recv_pe_size = recv_pe_list.
size_array();
2720 for (
int indice_pe = 0; indice_pe < recv_pe_size; indice_pe++)
2722 const int pe_source = recv_pe_list[indice_pe];
2728 recv_buffer >> sommet >> x >> y >> z;
2729 if (recv_buffer.
eof())
2732 deplacement_restant.
resize(n_recus+1, dim);
2733 deplacement_restant(n_recus, 0) = x;
2734 deplacement_restant(n_recus, 1) = y;
2736 deplacement_restant(n_recus, 2) = z;
2750static void ordonner_sommets_facettes(IntTab& facettes,
2751 const ArrOfInt& sommet_PE_owner,
2752 const ArrOfInt& sommet_num_owner)
2755 const int nb_facettes = facettes.
dimension(0);
2757 for (i = 0; i < nb_facettes; i++)
2766 pe0 = sommet_PE_owner[s0];
2767 pe1 = sommet_PE_owner[s1];
2768 pe2 = sommet_PE_owner[s2];
2770 num0 = sommet_num_owner[s0];
2771 num1 = sommet_num_owner[s1];
2772 num2 = sommet_num_owner[s2];
2773 while (pe1 < pe0 || (pe1 == pe0 && num1 < num0)
2774 || pe2 < pe0 || (pe2 == pe0 && num2 < num0))
2825 static ArrOfIntFT facette_pe;
2826 static ArrOfIntFT liste_facettes;
2827 static ArrOfIntFT liste_PE;
2836 const int moi =
me();
2838 const int nbfacettes =
facettes_.dimension(0);
2850 for (i = 0; i < nbfacettes; i++)
2852 int pe_actuel = facette_pe[i];
2855 if (pe_actuel == moi && pe_actuel != pe_legitime)
2859 facette_pe[i] = pe_legitime;
2883 const int nbfacettes =
facettes_.dimension(0);
2891 for (i = 0; i < nbfacettes; i++)
2919 const ArrOfInt& liste_facettes_pe,
2920 const ArrOfInt& facettes_send_pe_list,
2921 const ArrOfInt& facettes_recv_pe_list)
2945 static const int DATA_FACETTE = 0;
2946 static const int DATA_NOEUD = 1;
2947 int data_facette[8];
2949 data_facette[0] = DATA_FACETTE;
2950 data_noeud[0] = DATA_NOEUD;
2952 const int n_proc =
nproc();
2953 ArrOfIntFT liste_sommets;
2954 ArrOfIntFT liste_sommets_pe;
2955 ArrOfIntFT recv_pe_flags;
2956 ArrOfIntFT recv_pe_list;
2957 ArrOfIntFT send_pe_flags;
2958 ArrOfIntFT send_pe_list;
2961 const int moi =
me();
2977 append_array_to_array(send_pe_list, facettes_send_pe_list);
2978 array_trier_retirer_doublons(send_pe_list);
2980 append_array_to_array(recv_pe_list, facettes_recv_pe_list);
2981 array_trier_retirer_doublons(recv_pe_list);
2986 const int nbfacettes = liste_facettes.
size_array();
2989 for (i = 0; i < nbfacettes; i++)
2991 const int facette = liste_facettes[i];
2992 const int pe_destination = liste_facettes_pe[i];
2993 assert(pe_destination != moi);
3004 data_facette[n_data++] = facette;
3008 const int sommet =
facettes_(facette, j);
3013 data_facette[n_data++] = le_sommet_num_owner;
3014 data_facette[n_data++] = sommet_pe;
3016 if (sommet_pe != pe_destination)
3018 if (sommet_pe == moi)
3023 send_pe_flags[pe_destination] = 1;
3028 data_noeud[1] = le_sommet_num_owner;
3029 data_noeud[2] = pe_destination;
3039 static ArrOfIntFT liste_facettes_pe_source;
3040 static ArrOfIntFT liste_facettes_num_owner;
3041 static ArrOfIntFT liste_facettes_sommets;
3042 static ArrOfIntFT liste_facettes_sommets_pe;
3055 const int nb_voisins = pe_voisins.
size_array();
3056 for (i = 0; i < nb_voisins; i++)
3058 const int pe_source = pe_voisins[i];
3063 buffer.
get(& token, 1);
3073 const int num_facette = data_facette[0];
3078 int sommet_num = data_facette[j*2+1];
3080 int sommet_pe = data_facette[j*2+2];
3081 if (sommet_pe != moi)
3082 recv_pe_flags[sommet_pe] = 1;
3090 buffer.
get(data_noeud, 2);
3093 send_pe_flags[data_noeud[1]] = 1;
3110 for (i = 0; i < n_proc; i++)
3111 if (send_pe_flags[i])
3114 for (i = 0; i < n_proc; i++)
3115 if (recv_pe_flags[i])
3123 const int dimension3 = (
dimension == 3);
3127 liste_facettes_sommets,
3128 liste_facettes_sommets_pe,
3129 liste_facettes_sommets);
3130 const int nb_new_facettes = liste_facettes_pe_source.
size_array();
3131 int nbfacettes =
facettes_.dimension(0);
3134 for (i = 0; i < nb_new_facettes; i++)
3140 desc_facettes_.espace_virtuel().ajoute_element(liste_facettes_pe_source[i],
3185 const ArrOfInt& liste_elem_arrivee,
3186 ArrOfInt& facettes_recues_numfacettes,
3187 ArrOfInt& facettes_recues_numelement)
3190 const int moi =
me();
3192 const int nb_facettes_envoi = liste_facettes.
size_array();
3196 static ArrOfIntFT liste_elem_arrivee_local;
3199 static ArrOfIntFT liste_pe_dest;
3202 const Domaine& le_dom = domaine_dis.
domaine();
3203 const int nb_elem = le_dom.
nb_elem();
3206 liste_elem_arrivee_local.
resize_array(nb_facettes_envoi);
3210 for (i = 0; i < nb_facettes_envoi; i++)
3212 const int elem_voisin = liste_elem_arrivee[i];
3215 const int index = elem_voisin - nb_elem;
3217 const int pe = elem_virt_pe_num(index, 0);
3219 const int elem_local = elem_virt_pe_num(index, 1);
3220 liste_pe_dest[i] = pe;
3221 liste_elem_arrivee_local[i] = elem_local;
3233 static ArrOfIntFT facettes_to_send;
3234 static ArrOfIntFT facettes_pe_dest;
3239 static ArrOfIntFT BtoC_send_pe_flags(nbproc);
3240 static ArrOfIntFT BtoC_recv_pe_flags(nbproc);
3241 BtoC_send_pe_flags = 0;
3250 for (i = 0; i < nb_facettes_envoi; i++)
3252 const int facette = liste_facettes[i];
3253 const int PE_destinataire = liste_pe_dest[i];
3254 const int premier_sommet =
facettes_(facette, 0);
3257 if (PE_proprietaire == moi)
3261 BtoC_send_pe_flags[PE_destinataire] = 1;
3265 if (PE_destinataire != PE_proprietaire)
3266 comm.
send_buffer(PE_proprietaire) << facette_num_owner << PE_destinataire;
3271 const int nb_recv_pe = recv_pe_list.
size_array();
3272 for (i = 0; i < nb_recv_pe; i++)
3274 const int pe_source = recv_pe_list[i];
3278 int facette, PE_destinataire;
3279 buffer >> facette >> PE_destinataire;
3284 BtoC_send_pe_flags[PE_destinataire] = 1;
3301 static ArrOfIntFT nouvelles_facettes_pe_proprietaire;
3304 BtoC_recv_pe_flags = 0;
3309 for (i = 0; i < nb_facettes_envoi; i++)
3311 const int facette = liste_facettes[i];
3312 const int PE_destinataire = liste_pe_dest[i];
3313 const int element_arrivee = liste_elem_arrivee_local[i];
3314 const int premier_sommet =
facettes_(facette, 0);
3317 assert (PE_destinataire != moi);
3318 comm.
send_buffer(PE_destinataire) << facette_num_owner
3329 const int nb_recv_pe = recv_pe_list.
size_array();
3330 for (i = 0; i < nb_recv_pe; i++)
3332 const int pe_source = recv_pe_list[i];
3336 int facette = -1, PE_proprietaire = -1, element_arrivee = -1;
3337 buffer >> facette >> PE_proprietaire >> element_arrivee;
3340 assert(facette >= 0 && PE_proprietaire >= 0 && element_arrivee >= 0);
3341 assert(element_arrivee < nb_elem);
3345 nouvelles_facettes_pe_proprietaire.
append_array(PE_proprietaire);
3346 facettes_recues_numelement.
append_array(element_arrivee);
3349 if (PE_proprietaire != moi)
3350 BtoC_recv_pe_flags[PE_proprietaire] = 1;
3363 static ArrOfIntFT send_pe_list;
3364 static ArrOfIntFT recv_pe_list;
3367 for (i = 0; i < nbproc; i++)
3368 if (BtoC_send_pe_flags[i])
3370 for (i = 0; i < nbproc; i++)
3371 if (BtoC_recv_pe_flags[i])
3375 send_pe_list, recv_pe_list);
3380 facettes_recues_numfacettes,
3381 nouvelles_facettes_pe_proprietaire,
3382 facettes_recues_numfacettes);
3399 const ArrOfInt& element_num_owner,
3400 const ArrOfInt& numeros_distants,
3401 const ArrOfInt& pe_distant,
3402 ArrOfInt& numeros_locaux)
const
3405 const int nb_numeros = numeros_distants.
size_array();
3407 const int moi =
me();
3409 for (
int index = 0; index < nb_numeros; index++)
3411 const int numero_distant = numeros_distants[index];
3412 const int pe = pe_distant[index];
3413 int numero_local = -1;
3417 numero_local = numero_distant;
3422 const ArrOfInt& elements_virtuels = espace_virtuel.
elements(pe);
3423 const int n = elements_virtuels.
size_array();
3426 for (i = 0; i < n; i++)
3428 const int elem = elements_virtuels[i];
3429 const int numero_distant_de_elem = element_num_owner[elem];
3430 if (numero_distant == numero_distant_de_elem)
3432 numero_local = elem;
3436 assert(numero_local >= 0);
3438 numeros_locaux[index] = numero_local;
3442 const ArrOfInt& element_num_owner,
3443 const int numero_distant,
3444 const int pe_distant,
3445 int& numero_local)
const
3448 const int moi =
me();
3452 if (pe_distant == moi)
3454 numero_local = numero_distant;
3459 const ArrOfInt& elements_virtuels = espace_virtuel.
elements(pe_distant);
3460 const int n = elements_virtuels.
size_array();
3463 for (i = 0; i < n; i++)
3465 const int elem = elements_virtuels[i];
3466 const int numero_distant_de_elem = element_num_owner[elem];
3467 if (numero_distant == numero_distant_de_elem)
3469 numero_local = elem;
3499 double x1,
double y1,
double z1,
3504 const IntTab& face_voisins,
3511 int face_suivante = -2;
3513 int element_suivant = -2;
3519 double pos_intersection = 1.;
3520 const int face_sortie =
3526 x = x * (1. - pos_intersection) + x1 * pos_intersection;
3527 y = y * (1. - pos_intersection) + y1 * pos_intersection;
3528 z = z * (1. - pos_intersection) + z1 * pos_intersection;
3529 if (face_sortie >= 0)
3532 const int elem0 = face_voisins(face_sortie, 0);
3533 const int elem1 = face_voisins(face_sortie, 1);
3534 element_suivant = elem0 + elem1 - element;
3535 if (element_suivant < 0)
3538 element_suivant = element;
3539 face_suivante = face_sortie;
3552 element_suivant = element;
3564 const int nouvelle_face_bord =
3569 if (nouvelle_face_bord >= 0)
3573 face_suivante = nouvelle_face_bord;
3575 const int elem0 = face_voisins(face_suivante, 0);
3576 const int elem1 = face_voisins(face_suivante, 1);
3577 element_suivant = elem0 + elem1 + 1;
3578 assert((elem0 == -1 || elem1 == -1)
3579 && (elem0 >= 0 || elem1 >= 0));
3585 face_suivante = face_bord;
3586 element_suivant = element;
3592 element_suivant = element;
3593 face_suivante = face_bord;
3598 element = element_suivant;
3599 face_bord = face_suivante;
3607 double x1,
double y1,
double z1,
3610 const int num_sommet,
3613 const IntTab& face_voisins,
3614 ArrOfInt& sommets_envoyes,
3615 ArrOfInt& element_virtuel_arrivee,
3616 ArrOfInt& face_virtuelle_arrivee,
3617 DoubleTab& deplacement_restant,
3625 int face_suivante = -2;
3627 int element_suivant = -2;
3633 element_suivant = element;
3634 face_suivante = face_bord;
3636 element_suivant, face_suivante,
3637 parcours, domaine_vf, face_voisins,
3641 assert(continuer > -2 && face_suivante > -2 && element_suivant > -2);
3648 const int nb_elem_reels = domaine_vf.
nb_elem();
3649 if (element_suivant >= nb_elem_reels)
3659 const int n = deplacement_restant.
dimension(0);
3660 deplacement_restant.
resize(n+1, 3);
3661 deplacement_restant(n,0) = x1 - x;
3662 deplacement_restant(n,1) = y1 - y;
3663 deplacement_restant(n,2) = z1 - z;
3679 element = element_suivant;
3680 face_bord = face_suivante;
3700 const DoubleTab& deplacement_initial,
3701 ArrOfInt& liste_sommets_sortis,
3702 ArrOfInt& numero_face_sortie,
3714 const IntTab& face_voisins = domaine_vf.
face_voisins();
3724 static ArrOfIntFT liste_sommets;
3725 static DoubleTabFT deplacement;
3727 static ArrOfIntFT sommets_envoyes;
3728 static ArrOfIntFT element_virtuel_arrivee;
3729 static ArrOfIntFT face_virtuelle_arrivee;
3730 static DoubleTabFT deplacement_restant;
3735 liste_sommets = liste_sommets_initiale;
3738 const int n = deplacement_initial.
dimension(0);
3739 deplacement.
resize(n, 3);
3740 for (
int i = 0; i < n; i++)
3742 deplacement(i, 0) = deplacement_initial(i, 0);
3743 deplacement(i, 1) = deplacement_initial(i, 1);
3744 deplacement(i, 2) = (dimension3) ? deplacement_initial(i, 2) : 0.;
3749 int somme_nb_sommets_envoyes = 0;
3750 const int max_iterations_echange = 50;
3751 int nb_iterations_echange = 0;
3755 const int nbsommets = liste_sommets.
size_array();
3759 deplacement_restant.
resize(0, 3);
3761 for (
int i_sommet = 0; i_sommet < nbsommets; i_sommet++)
3763 const int num_sommet = liste_sommets[i_sommet];
3765 double x0 =
sommets_(num_sommet, 0);
3766 double y0 =
sommets_(num_sommet, 1);
3767 double z0 = (dimension3 ?
sommets_(num_sommet, 2) : 0.);
3769 const double x1 = x0 + deplacement(i_sommet, 0);
3770 const double y1 = y0 + deplacement(i_sommet, 1);
3771 const double z1 = (dimension3) ? (z0 + deplacement(i_sommet, 2)) : 0.;
3777 assert(element >= 0);
3779 int face_bord_m2, face_bord_m1 = -10;
3784 face_bord_m2 = face_bord_m1;
3785 face_bord_m1 = face_bord;
3795 element_virtuel_arrivee,
3796 face_virtuelle_arrivee,
3797 deplacement_restant,
3802 if (face_bord!=-1 && face_bord==face_bord_m2)
3824 const int nb_sommets_envoyes = sommets_envoyes.
size_array();
3826 if (somme_nb_sommets_envoyes > 0)
3832 element_virtuel_arrivee,
3833 face_virtuelle_arrivee,
3834 deplacement_restant,
3839 nb_iterations_echange++;
3841 while (somme_nb_sommets_envoyes > 0 && nb_iterations_echange < max_iterations_echange);
3842 if (nb_iterations_echange == max_iterations_echange)
3845 Cerr <<
"Maillage_FT_Disc.cpp::deplacer_sommets max_iterations_echange atteint." << finl;
3855 deplacement_restant.
resize(0);
3862 const double invalid_value = DMAXFLOAT*0.9;
3867 const int nb_elements_reels = domaine_vf.
nb_elem();
3877 ok = ok && (
desc_sommets_.espace_virtuel().pe_voisins().size_array() == 0);
3878 ok = ok && (
desc_sommets_.espace_distant().pe_voisins().size_array() == 0);
3879 if (!ok && error_is_fatal)
3881 Journal() <<
"Erreur Maillage_FT_Disc::check_sommets : maillage RESET invalide" << finl;
3891 const int nbsommets =
sommets_.dimension(0);
3893 Journal() <<
"Erreur sommets_.dimension(1) != Objet_U::dimension" << finl;
3906 ArrOfIntFT pe_owner(nbsommets);
3908 for (i = 0; i < nbsommets; i++)
3921 Cerr <<
"Erreur Verification de sommet_PE_owner_" << finl;
3927 Journal() <<
"Erreur sommet_num_owner_.size_array() != nb_sommets" << finl;
3934 ArrOfIntFT num_owner(nbsommets);
3935 for (i = 0; i < nbsommets; i++)
3938 for (i = 0; i < nbsommets; i++)
3942 Journal() <<
"Erreur num_owner[" << i <<
"] = " << num_owner[i];
3955 DoubleTabFT copie_sommets =
sommets_;
3960 const ArrOfInt& pe_voisins = espace_virtuel.
pe_voisins();
3961 const int nb_pe_voisins = pe_voisins.
size_array();
3962 for (
int indice_pe = 0; indice_pe < nb_pe_voisins; indice_pe++)
3964 const int pe = pe_voisins[indice_pe];
3965 const ArrOfInt& elements = espace_virtuel.
elements(pe);
3967 for (i = 0; i < n; i++)
3969 const int num_sommet = elements[i];
3970 copie_sommets(num_sommet, 0) = invalid_value;
3971 copie_sommets(num_sommet, 1) = invalid_value;
3973 copie_sommets(num_sommet, 2) = invalid_value;
3979 for (i = 0; i < nbsommets; i++)
3983 if (copie_sommets(i,j) == invalid_value)
3985 Journal() <<
"Erreur copie_sommets(" << i <<
",";
3986 Journal() << j <<
") == DMAX_FLOAT" << finl;
3993 if (copie_sommets(i,j) !=
sommets_(i,j))
3995 Journal() <<
"Erreur copie_sommets(" << i <<
",";
3996 Journal() << j <<
") = " << copie_sommets(i,j);
4012 Journal() <<
"Erreur sommet_elem_.size_array() != nb_sommets" << finl;
4022 for (i = 0; i < nbsommets; i++)
4026 if (pe != moi && num_element >= 0)
4028 Journal() <<
"Erreur sommet_num_owner_[" << i;
4029 Journal() <<
"] && sommet_elem_ >= 0" << finl;
4038 if (num_element > nb_elements_reels)
4040 Journal() <<
"Erreur i=" << i;
4041 Journal() <<
" sommet_elem_[i]>nb_elements_reels" << finl;
4053 double x, y, z = 0.;
4060 if (distance > 2. * epsilon)
4062 Journal() <<
"Erreur i=" << i <<
" num_element=" << num_element;
4063 Journal() <<
" distance_sommet_faces=" << distance << finl;
4066 Cerr <<
"Trouble when checking mesh in Maillage_FT_Disc::check_sommets." << finl;
4067 Cerr <<
"FT sommet is not in element (according to precision set)." << finl;
4068 Cerr <<
"*******************************************************************************************" << finl;
4069 Cerr <<
" HINT ==> try to define the parameter Erreur_relative_maxi in the Parcours_interface bloc " << finl;
4070 Cerr <<
" which should be defined the BEGING OF THE EQUATION bloc & before conditions_initiales. " << finl;
4071 Cerr <<
"*******************************************************************************************" << finl;
4082 Journal() <<
"Erreur sommet_face_bord_.size_array() != nb_sommets" << finl;
4089 const IntTab& face_voisins = domaine_vf.
face_voisins();
4090 for (i = 0; i < nbsommets; i++)
4096 const int voisin0 = face_voisins(face, 0);
4097 const int voisin1 = face_voisins(face, 1);
4098 if (voisin0 >= 0 && voisin1 >= 0)
4100 Journal() <<
"Erreur sommet_face_bord_[" << i;
4101 Journal() <<
"]=" << face <<
" (la face n'est pas au bord)." << finl;
4108 if (voisin0 != element && voisin1 != element)
4110 Journal() <<
"Erreur sommet_face_bord_[" << i;
4112 Journal() <<
"\n (la face n'est pas voisine de l'element ";
4139 statistics().create_custom_counter(
"Check_mesh",2,
"FrontTracking");
4141 const double invalid_value = DMAXFLOAT*0.9;
4143 int return_code = -1;
4146 if (return_code == 0)
4152 statistics().begin_count(
"Check_mesh",statistics().get_last_opened_counter_level()+1);
4157 ok = ok && (
desc_facettes_.espace_virtuel().pe_voisins().size_array() == 0);
4158 ok = ok && (
desc_facettes_.espace_distant().pe_voisins().size_array() == 0);
4159 if (!ok && error_is_fatal)
4161 Journal() <<
"Erreur Maillage_FT_Disc::check_mesh : maillage RESET invalide" << finl;
4168 if (return_code < 0)
4172 const int nbsommets =
sommets_.dimension(0);
4173 const int nbfacettes =
facettes_.dimension(0);
4175 Journal() <<
"Erreur facettes_.dimension(1) != Objet_U::dimension" << finl;
4185 DoubleTabFT coord_facettes(nbfacettes, dim_carre);
4187 for (i = 0; i < nbfacettes; i++)
4193 if (som >= nbsommets)
4195 Journal() <<
"Erreur facettes_(" << i <<
"," << j;
4196 Journal() <<
") >= nb_sommets" << finl;
4206 coord_facettes(i, n++) =
sommets_(som, k);
4211 const ArrOfInt& pe_voisins = espace_virtuel.
pe_voisins();
4212 const int nb_pe_voisins = pe_voisins.
size_array();
4213 for (
int indice_pe = 0; indice_pe < nb_pe_voisins; indice_pe++)
4215 const int pe = pe_voisins[indice_pe];
4216 const ArrOfInt& elements = espace_virtuel.
elements(pe);
4218 for (i = 0; i < n; i++)
4220 const int num_facette = elements[i];
4221 for (j = 0; j < dim_carre; j++)
4222 coord_facettes(num_facette, j) = invalid_value;
4227 for (i = 0; i < nbfacettes; i++)
4235 double original =
sommets_(som, k);
4236 double copie = coord_facettes(i, n++);
4237 if (original != copie)
4239 Journal() <<
"Erreur facette " << i <<
" sommet " << j <<
" direction " << k;
4240 Journal() <<
" " << original <<
" != " << copie << finl;
4242 Journal() <<
" Fa7 orig ="<<finl;
4254 Journal() <<
" Fa7 copie ="<<finl;
4257 Journal() <<
" som0= " << coord_facettes(i, 0) <<
" " << coord_facettes(i, 1) <<
" " << coord_facettes(i, 2) << finl;
4258 Journal() <<
" som1= " << coord_facettes(i, 3) <<
" " << coord_facettes(i, 4) <<
" " << coord_facettes(i, 5) << finl;
4259 Journal() <<
" som2= " << coord_facettes(i, 6) <<
" " << coord_facettes(i, 7) <<
" " << coord_facettes(i, 8) << finl;
4263 Journal() <<
" som0= " << coord_facettes(i, 0) <<
" " << coord_facettes(i, 1) <<finl;
4264 Journal() <<
" som1= " << coord_facettes(i, 2) <<
" " << coord_facettes(i, 3) << finl;
4283 tableau_trier_retirer_doublons(copie_facettes);
4286 Cerr <<
"Erreur facette : " << count <<
" facettes identiques sur PE " <<
me() << finl;
4293 if (! skip_facette_pe)
4297 ArrOfIntFT facette_pe(nbfacettes);
4300 for (i = 0; i < nbfacettes; i++)
4302 int pe_actuel = facette_pe[i];
4305 if (pe_actuel != pe_legitime)
4307 Journal() <<
"Erreur facette " << i;
4308 Journal() <<
" : owner(d'apres descripteur)=" << pe_actuel;
4309 Journal() <<
" owner(d'apres 1er sommet)=" << pe_legitime << finl;
4320 ArrOfIntFT num_owner(nbfacettes);
4321 for (i = 0; i < nbfacettes; i++)
4324 for (i = 0; i < nbfacettes; i++)
4327 Journal() <<
"Erreur facette " << i;
4329 Journal() <<
" devrait valoir " << num_owner[i] << finl;
4339 statistics().end_count(
"Check_mesh");
4371 ArrOfIntFT new_elements;
4378 const int nbfacettes =
facettes_.dimension(0);
4381 for (i = 0; i < nbfacettes; i++)
4385 if (!invalide && !virtuelle)
4397 for (i = 0; i < n; i++)
4412 const int nb_sommets_facettes = tab.
size_array();
4413 sommets_utilises = 0;
4415 for (
int i = 0; i < nb_sommets_facettes; i++)
4417 const int sommet = tab[i];
4418 sommets_utilises[sommet]++;
4436 const ArrOfInt& pe_voisins = espace_virtuel.
pe_voisins();
4437 const int nb_pe_voisins = pe_voisins.
size_array();
4438 for (
int indice_pe = 0; indice_pe < nb_pe_voisins; indice_pe++)
4440 const int pe = pe_voisins[indice_pe];
4441 const ArrOfInt& elements = espace_virtuel.
elements(pe);
4442 const int nb_elements = elements.
size_array();
4445 for (
int i = 0; i < nb_elements; i++)
4447 const int sommet = elements[i];
4448 if (sommets_utilises[sommet])
4470 const int nb_pe_voisins = pe_voisins.
size_array();
4471 for (
int indice_pe = 0; indice_pe < nb_pe_voisins; indice_pe++)
4473 const int pe = pe_voisins[indice_pe];
4474 const ArrOfInt& elements = espace_distant.
elements(pe);
4475 const int nb_elements = elements.
size_array();
4477 int element_courant = 0;
4483 buffer >> rang_sommet;
4485 rang_sommet = nb_elements;
4487 assert(rang_sommet < nb_elements);
4489 for (; element_courant < rang_sommet; element_courant++)
4491 const int sommet = elements[element_courant];
4495 sommets_utilises[sommet]++;
4500 while (element_courant < nb_elements);
4519 ArrOfIntFT renum_sommets(
sommets_.dimension(0));
4521 const int nbsommets =
sommets_.dimension(0);
4524 for (
int i = 0; i < nbsommets; i++)
4526 if (sommets_utilises[i])
4528 renum_sommets[i] = n;
4541 renum_sommets[i] = -1;
4554 for (
int num_espace = 0; num_espace < 2; num_espace++)
4562 const ArrOfInt& pe_voisins = espace_dv.
pe_voisins();
4563 const int nb_pe_voisins = pe_voisins.
size_array();
4564 for (
int indice_pe = 0; indice_pe < nb_pe_voisins; indice_pe++)
4566 const int pe = pe_voisins[indice_pe];
4567 const ArrOfInt& elements = espace_dv.
elements(pe);
4568 const int nb_elements = elements.
size_array();
4570 for (
int i = 0; i < nb_elements; i++)
4572 const int num_sommet = elements[i];
4573 const int new_num = renum_sommets[num_sommet];
4574 assert(new_num >= 0);
4575 new_elements[i] = new_num;
4587 const int nbsommets =
sommets_.dimension(0);
4589 for (
int i = 0; i < nbsommets; i++)
4597 const int nb_sommets_facettes = tab.
size_array();
4599 for (
int i = 0; i < nb_sommets_facettes; i++)
4601 const int sommet = tab[i];
4602 const int new_num = renum_sommets[sommet];
4620 for (
int i = 0; i < n; i++)
4622 int j = liste_facettes[i];
4637 ArrOfIntFT new_elements;
4648 int face_fr_ouverte = 0;
4649 if ((face_bord!=-1))
4654 face_fr_ouverte = 1;
4658 sommets_utilises[som] ++;
4676 const ArrOfInt& pe_voisins = espace_virtuel.
pe_voisins();
4677 const int nb_pe_voisins = pe_voisins.
size_array();
4678 for (
int indice_pe = 0; indice_pe < nb_pe_voisins; indice_pe++)
4680 const int pe = pe_voisins[indice_pe];
4681 const ArrOfInt& elements = espace_virtuel.
elements(pe);
4682 const int nb_elements = elements.
size_array();
4685 for (
int i = 0; i < nb_elements; i++)
4687 const int sommet = elements[i];
4688 if (sommets_utilises[sommet])
4710 const int nb_pe_voisins = pe_voisins.
size_array();
4711 for (
int indice_pe = 0; indice_pe < nb_pe_voisins; indice_pe++)
4713 const int pe = pe_voisins[indice_pe];
4714 const ArrOfInt& elements = espace_distant.
elements(pe);
4715 const int nb_elements = elements.
size_array();
4717 int element_courant = 0;
4723 buffer >> rang_sommet;
4725 rang_sommet = nb_elements;
4727 assert(rang_sommet < nb_elements);
4729 for (; element_courant < rang_sommet; element_courant++)
4731 const int sommet = elements[element_courant];
4735 sommets_utilises[sommet]++;
4740 while (element_courant < nb_elements);
4761 ArrOfIntFT renum_sommets(
sommets_.dimension(0));
4763 const int nbsommets =
sommets_.dimension(0);
4766 for (
int i = 0; i < nbsommets; i++)
4768 if (sommets_utilises[i])
4770 renum_sommets[i] = n;
4783 renum_sommets[i] = -1;
4801 for (
int num_espace = 0; num_espace < 2; num_espace++)
4809 const ArrOfInt& pe_voisins = espace_dv.
pe_voisins();
4810 const int nb_pe_voisins = pe_voisins.
size_array();
4811 for (
int indice_pe = 0; indice_pe < nb_pe_voisins; indice_pe++)
4813 const int pe = pe_voisins[indice_pe];
4814 const ArrOfInt& elements = espace_dv.
elements(pe);
4815 const int nb_elements = elements.
size_array();
4817 for (
int i = 0; i < nb_elements; i++)
4819 const int num_sommet = elements[i];
4820 const int new_num = renum_sommets[num_sommet];
4821 assert(new_num >= 0);
4822 new_elements[i] = new_num;
4834 const int nbsommets =
sommets_.dimension(0);
4836 for (
int i = 0; i < nbsommets; i++)
4851 ArrOfIntFT new_elements;
4857 double phase_reelle = double(phase);
4864 if (est_egal(indic(elem),phase_reelle))
4865 sommets_utilises[som] ++;
4883 const ArrOfInt& pe_voisins = espace_virtuel.
pe_voisins();
4884 const int nb_pe_voisins = pe_voisins.
size_array();
4885 for (
int indice_pe = 0; indice_pe < nb_pe_voisins; indice_pe++)
4887 const int pe = pe_voisins[indice_pe];
4888 const ArrOfInt& elements = espace_virtuel.
elements(pe);
4889 const int nb_elements = elements.
size_array();
4892 for (
int i = 0; i < nb_elements; i++)
4894 const int sommet = elements[i];
4895 if (sommets_utilises[sommet])
4917 const int nb_pe_voisins = pe_voisins.
size_array();
4918 for (
int indice_pe = 0; indice_pe < nb_pe_voisins; indice_pe++)
4920 const int pe = pe_voisins[indice_pe];
4921 const ArrOfInt& elements = espace_distant.
elements(pe);
4922 const int nb_elements = elements.
size_array();
4924 int element_courant = 0;
4930 buffer >> rang_sommet;
4932 rang_sommet = nb_elements;
4934 assert(rang_sommet < nb_elements);
4936 for (; element_courant < rang_sommet; element_courant++)
4938 const int sommet = elements[element_courant];
4942 sommets_utilises[sommet]++;
4947 while (element_courant < nb_elements);
4968 ArrOfIntFT renum_sommets(
sommets_.dimension(0));
4970 const int nbsommets =
sommets_.dimension(0);
4973 for (
int i = 0; i < nbsommets; i++)
4975 if (sommets_utilises[i])
4977 renum_sommets[i] = n;
4990 renum_sommets[i] = -1;
5008 for (
int num_espace = 0; num_espace < 2; num_espace++)
5016 const ArrOfInt& pe_voisins = espace_dv.
pe_voisins();
5017 const int nb_pe_voisins = pe_voisins.
size_array();
5018 for (
int indice_pe = 0; indice_pe < nb_pe_voisins; indice_pe++)
5020 const int pe = pe_voisins[indice_pe];
5021 const ArrOfInt& elements = espace_dv.
elements(pe);
5022 const int nb_elements = elements.
size_array();
5024 for (
int i = 0; i < nb_elements; i++)
5026 const int num_sommet = elements[i];
5027 const int new_num = renum_sommets[num_sommet];
5028 assert(new_num >= 0);
5029 new_elements[i] = new_num;
5041 const int nbsommets =
sommets_.dimension(0);
5043 for (
int i = 0; i < nbsommets; i++)
5052#if (defined(PATCH_HYSTERESIS_V2) || defined(PATCH_HYSTERESIS_V3))
5054inline double produit_scalaire(
const ArrOfDouble& a,
const ArrOfDouble& b)
5058 return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];
5061inline void produit_vectoriel(
const ArrOfDouble& a,
const ArrOfDouble& b, ArrOfDouble& resu)
5066 resu[0] = a[1]*b[2] - a[2]*b[1];
5067 resu[1] = a[2]*b[0] - a[0]*b[2];
5068 resu[2] = a[0]*b[1] - a[1]*b[0];
5076 ArrOfDouble tmp_courbure_sommets(store_courbure_sommets);
5077 ArrOfDouble surface_autour_sommets(store_courbure_sommets);
5080 for (
int iter = 0; iter < nitera; iter++)
5082 tmp_courbure_sommets = store_courbure_sommets;
5083 store_courbure_sommets = 0.;
5084 surface_autour_sommets = 0.;
5085 for (i_facette = 0; i_facette <
nb_facettes(); i_facette++)
5094 for (
int i = 0; i < 3; i++)
5099 moy += tmp_courbure_sommets[si];
5105 for (
int i = 0; i < 3; i++)
5108 const double surf = surface(i_facette);
5109 store_courbure_sommets[s] += moy*surf;
5110 surface_autour_sommets[s] +=surf;
5113 for (
int isom = 0; isom < nsom; isom++)
5114 if (surface_autour_sommets[isom]>0)
5115 store_courbure_sommets[isom] /=surface_autour_sommets[isom];
5145 for (ii=0; ii<3; ii++)
5154 const int s1 =
facettes_(facette,(ii+1)%3);
5155 const int s2 =
facettes_(facette,(ii+2)%3);
5157 ArrOfDouble som0(3),som1(3),som2(3), s0s1(3), s0s2(3);
5163 s0s1[j] = som1[j] - som0[j];
5164 s0s2[j] = som2[j] - som0[j];
5178 double tmp= (s0s1[j]+s0s2[j]);
5194 Cerr <<
"Probleme lors du calcul de la courbure a la ligne de contact. "<< finl;
5195 Cerr <<
"Il semblerait que la courbure au sommet " << s0 <<
" sur le process "
5196 <<
Process::me() <<
" soit tres grande (ie un rayon de courbure plus petit"
5197 <<
" que la longueur caracteristique de l'element du Front. " << finl;
5198 Cerr <<
"Une erreur possible est un angle de contact initialement trop loin de la "
5199 <<
"gamme d'angles de contacts fournis dans le jeu de donnees. " << finl;
5200 Cerr <<
"Verifiez votre JDD puis contactez TRUST support." << finl;
5212 ps = ps*sqrt((r2-l2)/r2) - sqrt((1.-ps*ps)*l2/r2);
5221 const DoubleTabFT& tab_cos_theta, ArrOfBit& drapeau_angle_in_range)
const
5236 ArrOfDouble nprime(3), vect_base(3), ntheta(3);
5267 const double costheta0 = tab_cos_theta(s0, 0);
5268 const double costheta1 = tab_cos_theta(s0, 1);
5276 double nf0[3] = {0., 0., 0.};
5279 nf0[0], nf0[1], nf0[2]);
5286 ps -= nf0[j]* normale(facette, j);
5296 if ((ps-costheta0)*(ps-costheta1) <=0 )
5303 drapeau_angle_in_range.
clearbit(s0);
5306 if (std::fabs(ps-costheta0) <std::fabs(ps-costheta1))
5309 costheta = costheta0;
5313 costheta = costheta1;
5320#ifdef PATCH_HYSTERESIS_V2
5324static void miroir(
const ArrOfDouble& A, ArrOfDouble& nprime,
const ArrOfDouble& O, ArrOfDouble& Ar)
5327 const double l = sqrt(nprime[0] * nprime[0] + nprime[1] * nprime[1] + nprime[2] * nprime[2]);
5330 double inv_l = 1. / l;
5340 double ps=produit_scalaire(OA,nprime);
5342 for (
int i=0; i<m; i++)
5344 Ar[i] =A[i]-2.*ps*nprime[i];
5348static void normalize(ArrOfDouble& nprime)
5351 const double l = sqrt(nprime[0] * nprime[0] + nprime[1] * nprime[1] + nprime[2] * nprime[2]);
5354 double inv_l = 1. / l;
5380#if (defined(PATCH_HYSTERESIS_V2) || defined(PATCH_HYSTERESIS_V3))
5381 ArrOfBit drapeau_angle_in_range;
5383 drapeau_angle_in_range=1;
5388 ArrOfDouble store_courbure_sommets(courbure_sommets);
5393 Cerr <<
"Erreur dans la seconde passe du calcul de la courbure... Dimensions des tableaux differentes!" << finl;
5409 DoubleTab d_surface(nsom, dim);
5411 DoubleTab d_volume(nsom, dim);
5413 double n_s[3] = {0.,0.,0.};
5414 const double inverse_dimension = 1. / (double)
dimension;
5415 const double un_tiers = 1. / 3.;
5416 const double un_sixieme = 1. / 6.;
5419 DoubleTabFT tab_cos_theta;
5427 for (facette = 0; facette < nfaces; facette++)
5436 const double surface_sur_dim = surface[facette] * inverse_dimension;
5437 for (ii = 0; ii < dim; ii++)
5442 n_s[ii] = normale(facette, ii) * surface_sur_dim;
5444 for (ii = 0; ii < dim; ii++)
5446 const int sommet =
facettes_(facette, ii);
5447 for (j = 0; j < dim; j++)
5448 d_volume(sommet, j) += n_s[j];
5457 n[0] = normale(facette, 0);
5458 n[1] = normale(facette, 1);
5460 d_surface(som[0], 0) -= n[1];
5461 d_surface(som[0], 1) += n[0];
5462 d_surface(som[1], 0) += n[1];
5463 d_surface(som[1], 1) -= n[0];
5468 for (
int i2 = 0; i2 < 2; i2++)
5470 const int isom2 = som[i2];
5475#ifndef PATCH_HYSTERESIS_V2
5476 const double costheta = tab_cos_theta(isom2, 0);
5478 const double costheta0 = tab_cos_theta(som[i2], 0);
5479 const double costheta1 = tab_cos_theta(som[i2], 1);
5481 double nf1[3] = {0., 0., 0.};
5483 nf1[0], nf1[1], nf1[2]);
5487 for (j = 0; j < dim; j++)
5495 st = (ps-costheta0)*(ps-costheta1) <=0 ?
"YES":
"NO";
5496 Cerr <<
"GB_CALCUL_COURBURE 2D PLAN : ps "
5497 << ps <<
" in costheta ["<< costheta0 <<
" ; " << costheta1 <<
"]? " << st << finl;
5498 const double costheta = ps;
5499 Cerr <<
"Quelle est le sommet a choisir? Est-ce que i2 " << i2 <<
"est bien le sommet du bord?" << finl;
5500 Cerr <<
"GB_CALCUL_COURBURE 2D PLAN: "
5501 <<
"A valider depuis hysterisis. Le developpement fait en 3D n'a pas ete applique ici!" << finl;
5511 double signe = (i2==0) ? -1. : 1.;
5512 d_surface(som[i2], 0) += signe * ny * costheta;
5513 d_surface(som[i2], 1) -= signe * nx * costheta;
5524 n[0] = normale(facette, 0) * 0.5;
5525 n[1] = normale(facette, 1) * 0.5;
5526 n[2] = normale(facette, 2) * 0.5;
5527 for (ii = 0; ii < 3; ii++)
5534 const int s0 = sommets_loc[ii];
5535 const int s1 = sommets_loc[ (ii+1)%3 ];
5536 const int s2 = sommets_loc[ (ii+2)%3 ];
5537 ArrOfDouble s2s1(3);
5544 d_surface(s0,0) += s2s1[1] * n[2] - s2s1[2] * n[1];
5545 d_surface(s0,1) += s2s1[2] * n[0] - s2s1[0] * n[2];
5546 d_surface(s0,2) += s2s1[0] * n[1] - s2s1[1] * n[0];
5547#ifdef PATCH_HYSTERESIS_V2
5556 ArrOfDouble som0(3),som1(3),som2(3), s0s1(3), s0s2(3);
5557 for (j=0; j<dim; j++)
5562 s0s1[j] = som1[j] - som0[j];
5563 s0s2[j] = som2[j] - som0[j];
5565 ArrOfDouble nprime(3), vect_base(3), ntheta(3);
5596 const double costheta0 = tab_cos_theta(s0, 0);
5597 const double costheta1 = tab_cos_theta(s0, 1);
5600 double nf0[3] = {0., 0., 0.};
5603 nf0[0], nf0[1], nf0[2]);
5609 for (j = 0; j < dim; j++)
5610 ps -= nf0[j]* normale(facette, j);
5621 if ((ps-costheta0)*(ps-costheta1) <=0 )
5630 if (std::fabs(ps-costheta0) <std::fabs(ps-costheta1))
5633 costheta = costheta0;
5637 costheta = costheta1;
5643 tab_cos_theta, drapeau_angle_in_range);
5644 if (std::fabs(costheta-costheta_bis)>1e-8)
5646 Cerr <<
"Oh oh... les 2 methodes different... " << finl;
5655#ifdef DEBUG_HYSTERESIS_V2
5656 const int inode = 6 ;
5658 if ( (ii==0) && ((s0 == inode) || (s1 == inode) || (s2 == inode))
5659 && (!(numface1 >= 0 && numface2 >= 0)))
5661 Cerr <<
"TAG FACETTE "<< facette <<
" : " << s0 <<
" " << s1 <<
" " << s2 << finl;
5662 Cerr << som0 << finl;
5663 Cerr << som1 << finl;
5664 Cerr << som2 << finl;
5665 Cerr << som0 << finl;
5669 if (numface1 < 0 && numface2 < 0)
5674 ArrOfDouble v(3), nb(3), tb(3);
5676 for (j=0; j<dim; j++)
5677 v[j] = som2[j] - som1[j];
5681 nb[0], nb[1], nb[2]);
5683 produit_vectoriel(v,nb,tb);
5688 const double sintheta = sqrt(1.-costheta*costheta);
5689 for (j=0; j<dim; j++)
5690 ntheta[j] = sintheta*tb[j] + costheta*nb[j];
5693 ArrOfDouble nplan(3);
5697 produit_vectoriel(ntheta,v,nplan);
5699 ArrOfDouble reflexion_som1(dim),reflexion_som2(dim);
5700 miroir(som1,nplan,som0, reflexion_som1);
5701 miroir(som2,nplan,som0, reflexion_som2);
5706 ArrOfDouble s0s2p(3), s0s1p(3), s1ps2p(3);
5707 for (j=0; j<dim; j++)
5709 s0s2p[j] = reflexion_som2[j]-som0[j];
5710 s0s1p[j] = reflexion_som1[j]-som0[j];
5711 s1ps2p[j] = reflexion_som2[j]-reflexion_som1[j];
5715 produit_vectoriel(s0s2p,s0s1p,nprime);
5719#ifdef DEBUG_HYSTERESIS_V2
5720 if ( (s0 == inode) || (s1 == inode) || (s2 == inode) )
5722 Cerr <<
"TAG REFLEXION s1s2 FACETTE "<< facette <<
" : " << s0 <<
" " << s1 <<
" " << s2 << finl;
5723 Cerr << som0 << finl;
5724 Cerr << reflexion_som1 << finl;
5725 Cerr << reflexion_som2 << finl;
5726 Cerr << som0 << finl;
5730 else if (numface1 >= 0 && numface2 >= 0
5731 && !((s0==s1) && (s0==s2)))
5735 Cerr <<
"Cas de 3 sommets de la facette " << facette
5736 <<
" (" << s0 <<
" " << s1 <<
" " << s2 <<
" )"
5738 <<
Process::me() <<
" pas prevu pour l'instant!" << finl;
5739 Cerr <<
"som0 " << som0 << finl;
5740 Cerr <<
"som1 " << som1 << finl;
5741 Cerr <<
"som2 " << som2 << finl;
5742 Cerr <<
"Do nothing instead of exiting... " << finl;
5748 else if (numface1 >= 0)
5753 ArrOfDouble v(3), nb(3), tb(3);
5755 for (j=0; j<dim; j++)
5756 v[j] = som0[j] - som1[j];
5760 nb[0], nb[1], nb[2]);
5765 nb1[0], nb1[1], nb1[2]);
5766 if (std::fabs(nb[0]*nb1[0]+nb[1]*nb1[1]+nb[2]*nb1[2]-1.) > 0.05)
5770 Cerr <<
"Mismatching normals... " << finl;
5771 Cerr <<
"nb: " << nb[0] <<
" " << nb[1] <<
" " << nb[2] << finl;
5772 Cerr <<
"nb1: " << nb1[0] <<
" " << nb1[1] <<
" " << nb1[2] << finl;
5773 Cerr <<
"Le probleme sera resolu quand on aura conserve les facettes de coins" << finl;
5774 Cerr <<
"Skipping for the time being instead of exiting" << finl;
5781 produit_vectoriel(v,nb,tb);
5786 const double sintheta = sqrt(1.-costheta*costheta);
5787 for (j=0; j<dim; j++)
5788 ntheta[j] = sintheta*tb[j] + costheta*nb[j];
5791 ArrOfDouble nplan(3);
5792 produit_vectoriel(s0s1,ntheta,nplan);
5793 ArrOfDouble reflexion_som2(dim);
5794 miroir(som2,nplan,som0, reflexion_som2);
5798 ArrOfDouble s0s2p(3), s2ps1(3);
5799 for (j=0; j<dim; j++)
5801 s0s2p[j] = reflexion_som2[j]-som0[j];
5802 s2ps1[j] = som1[j]-reflexion_som2[j];
5806 produit_vectoriel(s0s2p,s0s1,nprime);
5810#ifdef DEBUG_HYSTERESIS_V2
5811 if ( (s0 == inode) || (s1 == inode) || (s2 == inode) )
5813 Cerr <<
"TAG REFLEXION s0s1 "<< facette <<
" : " << s0 <<
" " << s1 <<
" " << s2 << finl;
5814 Cerr << som0 << finl;
5815 Cerr << som1 << finl;
5816 Cerr << reflexion_som2 << finl;
5817 Cerr << som0 << finl;
5821 else if (numface2 >= 0)
5826 ArrOfDouble v(3), nb(3), tb(3);
5828 for (j=0; j<dim; j++)
5829 v[j] = som2[j] - som0[j];
5833 nb[0], nb[1], nb[2]);
5838 nb2[0], nb2[1], nb2[2]);
5839 if (std::fabs(nb[0]*nb2[0]+nb[1]*nb2[1]+nb[2]*nb2[2]-1.) > 0.05)
5843 Cerr <<
"Mismatching normals... " << finl;
5844 Cerr <<
"nb: " << nb[0] <<
" " << nb[1] <<
" " << nb[2] << finl;
5845 Cerr <<
"nb2: " << nb2[0] <<
" " << nb2[1] <<
" " << nb2[2] << finl;
5846 Cerr <<
"Le probleme sera resolu quand on aura conserve les facettes de coins" << finl;
5847 Cerr <<
"Skipping for the time being instead of exiting" << finl;
5853 produit_vectoriel(v,nb,tb);
5858 const double sintheta = sqrt(1.-costheta*costheta);
5859 for (j=0; j<dim; j++)
5860 ntheta[j] = sintheta*tb[j] + costheta*nb[j];
5863 ArrOfDouble nplan(3);
5864 produit_vectoriel(s0s2,ntheta,nplan);
5865 ArrOfDouble reflexion_som1(dim);
5866 miroir(som1,nplan,som0, reflexion_som1);
5870 ArrOfDouble s0s1p(3), s2s1p(3);
5871 for (j=0; j<dim; j++)
5873 s0s1p[j] = reflexion_som1[j]-som0[j];
5874 s2s1p[j] = reflexion_som1[j]-som2[j];
5878 produit_vectoriel(s0s2,s0s1,nprime);
5882#ifdef DEBUG_HYSTERESIS_V2
5883 if ( (s0 == inode) || (s1 == inode) || (s2 == inode) )
5886 Cerr <<
"TAG REFLEXION s0s2 "<< facette <<
" : " << s0 <<
" " << s1 <<
" " << s2 << finl;
5887 Cerr << som0 << finl;
5888 Cerr << reflexion_som1 << finl;
5889 Cerr << som2 << finl;
5890 Cerr << som0 << finl;
5896 Cerr <<
"Cas impossible... WTF!" << finl;
5904 d_surface(s0,0) += (vect_base[1] * nprime[2] - vect_base[2] * nprime[1])*0.5;
5905 d_surface(s0,1) += (vect_base[2] * nprime[0] - vect_base[0] * nprime[2])*0.5;
5906 d_surface(s0,2) += (vect_base[0] * nprime[1] - vect_base[1] * nprime[0])*0.5;
5912 d_volume(s0, j) += nprime[j] * surface_sur_dim;
5916#if defined(PATCH_HYSTERESIS_V3)
5926 if (numface1 >= 0 && numface2 >= 0)
5931 tab_cos_theta, drapeau_angle_in_range);
5933 tab_cos_theta, drapeau_angle_in_range);
5935 const double costheta = (costheta_s1+costheta_s2) * 0.5;
5942 d_surface(s1,0) -= (s2s1[1] * nz - s2s1[2] * ny) * costheta * 0.5;
5943 d_surface(s1,1) -= (s2s1[2] * nx - s2s1[0] * nz) * costheta * 0.5;
5944 d_surface(s1,2) -= (s2s1[0] * ny - s2s1[1] * nx) * costheta * 0.5;
5950 d_surface(s2,0) -= (s2s1[1] * nz - s2s1[2] * ny) * costheta * 0.5;
5951 d_surface(s2,1) -= (s2s1[2] * nx - s2s1[0] * nz) * costheta * 0.5;
5952 d_surface(s2,2) -= (s2s1[0] * ny - s2s1[1] * nx) * costheta * 0.5;
5964 if (numface1 >= 0 && numface2 >= 0)
5967 const double costheta = (tab_cos_theta(s1, 0) + tab_cos_theta(s2, 0)) * 0.5;
5974 d_surface(s1,0) -= (s2s1[1] * nz - s2s1[2] * ny) * costheta * 0.5;
5975 d_surface(s1,1) -= (s2s1[2] * nx - s2s1[0] * nz) * costheta * 0.5;
5976 d_surface(s1,2) -= (s2s1[0] * ny - s2s1[1] * nx) * costheta * 0.5;
5982 d_surface(s2,0) -= (s2s1[1] * nz - s2s1[2] * ny) * costheta * 0.5;
5983 d_surface(s2,1) -= (s2s1[2] * nx - s2s1[0] * nz) * costheta * 0.5;
5984 d_surface(s2,2) -= (s2s1[0] * ny - s2s1[1] * nx) * costheta * 0.5;
6002 const double L2 = (r2-r1)*(r2-r1) + (y2-y1)*(y2-y1);
6003 const double L = sqrt(L2);
6004 const double nx = normale(facette, 0);
6005 const double ny = normale(facette, 1);
6006 const double dv_dn1 = L * (r1 * un_tiers + r2 * un_sixieme);
6007 const double dv_dn2 = L * (r2 * un_tiers + r1 * un_sixieme);
6008 d_volume(s1, 0) += nx * dv_dn1;
6009 d_volume(s1, 1) += ny * dv_dn1;
6010 d_volume(s2, 0) += nx * dv_dn2;
6011 d_volume(s2, 1) += ny * dv_dn2;
6013 d_surface(s1, 0) += 0.5 * L + 0.5 * (r1 + r2) * (-ny);
6014 d_surface(s1, 1) += 0.5 * (r1 + r2) * (nx);
6015 d_surface(s2, 0) += 0.5 * L + 0.5 * (r1 + r2) * (ny);
6016 d_surface(s2, 1) += 0.5 * (r1 + r2) * (-nx);
6026 for (
int i2 = 0; i2 < 2; i2++)
6032 double costheta = tab_cos_theta(som[i2], 0);
6057 const double xf1 =domaine_vf.
xv(nb_first_face, 0);
6058 const double yf1 =domaine_vf.
xv(nb_first_face, 1);
6060 const double xf2 =domaine_vf.
xv(nb_first_face+nb_face-1, 0);
6061 const double yf2 =domaine_vf.
xv(nb_first_face+nb_face-1, 1);
6062 const double xf3 =
sommets_(som[i2],0);
6063 const double yf3 =
sommets_(som[i2],1);
6067 const double area = xf1 * (yf2 - yf3) + xf2 * (yf3 - yf1) + xf3 * (yf1 - yf2);
6070 const double cell_height = 2.*std::fabs(domaine_vf.
dist_face_elem0(nb_first_face,elem_voisin));
6072 if (std::fabs(area) < cell_height*cell_height/2.)
6090 double signe = (i2==0) ? -1. : 1.;
6091 d_surface(som[i2], 0) += r[i2] * signe * nfy * costheta;
6092 d_surface(som[i2], 1) += r[i2] * signe * nfx * costheta;
6106 double dx[3] = { 0., 0., 0. };
6107#if (defined(PATCH_HYSTERESIS_V2) || defined(PATCH_HYSTERESIS_V3) )
6109 double norm_Linf=0.;
6111 int isom_max_courb=-123456;
6114 for (i = 0; i < nsom; i++)
6119#if (defined(PATCH_HYSTERESIS_V2) || defined(PATCH_HYSTERESIS_V3) )
6128 dx[0] = d_volume(i, 0);
6129 dx[1] = d_volume(i, 1);
6131 dx[2] = d_volume(i, 2);
6139 for (j = 0; j < dim; j++)
6141 const double ds = d_surface(i, j);
6142 const double dv = d_volume(i, j);
6143 ds_dx += ds * dx[j];
6144 dv_dx += dv * dx[j];
6148 c = - ds_dx / dv_dx;
6150#if (defined(PATCH_HYSTERESIS_V2) || defined(PATCH_HYSTERESIS_V3) )
6157 for (j = 0; j < dim; j++)
6159 const double ds = d_surface(i, j);
6160 const double dv = d_volume(i, j);
6166 c = - ds_dv / dv_dv;
6173 double delta=std::fabs(courbure_sommets[i] - c);
6174 norm_L2 += delta*delta;
6176 if (delta>norm_Linf)
6184#if (defined(PATCH_HYSTERESIS_V2) || defined(PATCH_HYSTERESIS_V3) )
6186 ArrOfDouble& store_courbure_sommets(courbure_sommets);
6187 ArrOfBit drapeau_angle_in_range(courbure_sommets.
size_array());
6188 drapeau_angle_in_range = 1;
6190 courbure_sommets[i] = c;
6195 courbure_sommets[i] = store_courbure_sommets[i];
6202 const double c_in = store_courbure_sommets[i];
6203 const double c_bord = c;
6212 const int contact_angle_inside_range = drapeau_angle_in_range.
testsetbit(i);
6213 if (contact_angle_inside_range)
6219 const double c_in = store_courbure_sommets[i];
6220 courbure_sommets[i] = c_in;
6228 const double c_bord = c;
6229 courbure_sommets[i] = c_bord;
6234#if (defined(PATCH_HYSTERESIS_V2) || defined(PATCH_HYSTERESIS_V3) )
6239 norm_Linf =
mp_max(norm_Linf);
6242 norm_L2=sqrt(
mp_sum(norm_L2))/count;
6243 Cerr <<
"Evaluation de la convergence de la courbure. call= " << call <<
" norm_Linf= " << norm_Linf
6244 <<
" norm_L2= " << norm_L2 <<
" nsom_contact= " << count << finl;
6245 Journal() <<
"max_courb on " << isom_max_courb <<
" value " << norm_Linf << finl;
6272 const ArrOfInt& liste_pe_voisins = esp_virt.
pe_voisins();
6273 const int n_voisins = liste_pe_voisins.
size_array();
6274 for (voisin = 0; voisin < n_voisins; voisin++)
6276 const int pe_voisin = liste_pe_voisins[voisin];
6277 const ArrOfInt& elements = esp_virt.
elements(pe_voisin);
6279 for (i = 0; i < n; i++)
6281 const int elem = elements[i];
6293 const ArrOfInt& liste_pe_voisins = esp_virt.
pe_voisins();
6294 const int n_voisins = liste_pe_voisins.
size_array();
6295 for (voisin = 0; voisin < n_voisins; voisin++)
6297 const int pe_voisin = liste_pe_voisins[voisin];
6298 const ArrOfInt& elements = esp_virt.
elements(pe_voisin);
6300 for (i = 0; i < n; i++)
6302 const int elem = elements[i];
6317 const ArrOfInt& liste_pe_voisins = esp_virt.
pe_voisins();
6318 const int n_voisins = liste_pe_voisins.
size_array();
6319 for (voisin = 0; voisin < n_voisins; voisin++)
6321 const int pe_voisin = liste_pe_voisins[voisin];
6322 const ArrOfInt& elements = esp_virt.
elements(pe_voisin);
6324 for (i = 0; i < n; i++)
6326 const int elem = elements[i];
6327 for (j = 0; j < dim; j++)
6328 tableau(elem,j) = 0.;
6346 for (i = old_size; i < new_size; i++)
6366 for (i = old_size; i < new_size; i++)
6383 const int old_size = tableau.
dimension(0);
6385 tableau.
resize(new_size, dim);
6387 for (i = old_size; i < new_size; i++)
6388 for (j = 0; j < dim; j++)
6402 return refequation_transport_.valeur();
6407 return refequation_transport_.valeur();
6427 Cerr<<
"Le type de statut n est pas fixe"<<finl;
6455 for (
int fa7=0; fa7<nb_fa7; fa7++)
6460 double x2=1e15,y2=1e15;
6461 double z0=1e15,z1=1e15,z2=1e15;
int testsetbit(int_t i) const
Returns the value of bit e, then sets bit e to 1.
ArrOfBit_32_64 & resize_array(int_t n)
Changes the size of the array and copies existing data.
void setbit(int_t i) const
Set bit e to 1.
void clearbit(int_t i) const
Set bit e to 0.
Empty class used as a base for all the arrays.
DoubleTab & valeurs() override
Returns the array of field values at the current time.
virtual DoubleTab & valeurs()=0
class Champ_front_base Base class for the hierarchy of boundary fields.
virtual void valeurs_face(int, DoubleVect &) const
Returns the vector of field values for the given face.
static int check_enabled()
class Cond_lim_base Base class for the hierarchy of classes that represent the different boundary con...
virtual Frontiere_dis_base & frontiere_dis()
Returns the discretized boundary to which the boundary conditions apply.
Champ_front_base & champ_front()
class Cond_lim Generic class used to represent any class
static void verifier(const char *const msg, double)
: class Desc_Structure_FT
void collecter_espace_virtuel(ArrOfDouble &tab, MD_Vector_tools::Operations_echange op) const
void echange_espace_virtuel(ArrOfDouble &tab) const
Descripteur_FT & espace_virtuel()
Renvoie une reference non-const a l'espace virtuel.
const MD_Vector & get_md_vector() const
Descripteur_FT & espace_distant()
Renvoie une reference non-const a l'espace distant.
: class Descripteur_FT Descripteur_FT stocke pour chaque PE une liste de numeros d'elements.
int contient_element(int pe, int element) const
Renvoie "pas zero" si l'element est deja dans le descripteur pour le pe donne, 0 sinon.
void set_elements(int PE_voisin, const ArrOfInt &elements)
Remplace la liste des elements par celle en parametre.
int ajoute_element(int PE_voisin, int element)
Ajoute l'element au tableau du PE_voisin.
const ArrOfInt & elements(int pe_voisin) const
Renvoie la liste des elements distants/virtuels du pe en parametre.
const ArrOfInt & pe_voisins() const
Renvoie la liste des PE pour lesquels la liste d'elements est non vide, dans l'ordre croissant des nu...
void calcul_liste_pe_voisins()
Calcule la liste des PEs dont la liste d'elements est non vide, tries dans l'ordre croissant de numer...
int ajoute_elements(int PE_voisin, const ArrOfInt &elements)
Ajoute l'element au tableau du PE_voisin.
Dirichlet_entree_fluide This class represents a boundary condition imposing a quantity.
Classe Dirichlet_homogene This class is the base class of the hierarchy of homogeneous Dirichlet-type...
Dirichlet This class is the base class of the hierarchy of Dirichlet-type boundary conditions.
int_t nb_elem_tot() const
SmallArrOfTID_t & chercher_elements(const DoubleTab &pos, SmallArrOfTID_t &elem, int reel=0) const
Searches for the elements containing the points whose coordinates are specified.
const IntTab_t & elem_virt_pe_num() const
class Domaine_Cl_dis_base Domaine_Cl_dis_base objects represent discretized boundary conditions
int nb_cond_lim() const
Returns the number of boundary conditions.
virtual const Cond_lim & la_cl_de_la_face(int num_face) const
Given a boundary face index in the Domaine_VF, returns the boundary condition to which this face.
const Cond_lim_base & condition_limite_de_la_face_reelle(int face_globale, int &face_locale) const
Returns the boundary condition associated with a given real face.
const Cond_lim & les_conditions_limites(int) const
Returns the i-th boundary condition.
int nb_faces() const
Returns the total number of faces.
double xv(int num_face, int k) const
int elem_faces(int i, int j) const
Returns the index of the i-th face of element num_elem; the face numbering convention is.
const IntTab & face_virt_pe_num() const
int face_voisins(int num_face, int i) const
Returns the neighbouring element of num_face in direction i.
int nb_faces_bord() const
Returns the number of faces on which boundary conditions are applied:
virtual double dist_face_elem0(int, int) const
class Domaine_dis_base This class is the base of the hierarchy of discretized domains.
const Domaine & domaine() const
static int is_ecriture_special(int &special, int &a_faire)
Indicates whether the special format was requested in active writing by xyz save.
static int is_lecture_special()
Indicates whether the special format was requested in active reading by xyz restart.
class Ensemble_Lagrange_base Base class for classes representing a geometric structure made up
void remplir_sommets_tmp(DoubleTab &soms_tmp)
virtual int ouvrir(const char *name, IOS_OPEN_MODE mode=ios::in)
Class defining operators and methods for all reading operation in an input flow (file,...
virtual int get(int *ob, std::streamsize n)
class Equation_base The role of an equation is the calculation of one or more fields....
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Returns the discretized boundary condition domain associated with the equation.
Probleme_base & probleme()
Returns the problem associated with the equation.
Domaine_dis_base & domaine_dis()
Returns the discretized domain associated with the equation.
int_t num_premiere_face() const
int_t nb_faces() const
Returns the number of faces of the boundary.
const Frontiere & frontiere() const
Returns the associated geometric boundary.
double contrib_volume_phase1_
double fraction_surface_intersection_
int index_facette_suivante_
: class Intersections_Elem_Facettes
const ArrOfInt & index_elem() const
Renvoie un tableau de taille domaine.
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 ...
void get_liste_facettes_traversantes(int num_element, ArrOfInt &liste_facettes) const
: This class is an OWN_PTR but the pointed object is shared among multiple
ArrOfDoubleFT courbure_sommets_
ArrOfDoubleFT surface_facettes_
DoubleTabFT normale_facettes_
: class Maillage_FT_Disc Cette classe decrit un maillage:
int calcul_courbure_iterations_
void creer_tableau_elements(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
creation d'un tableau aux sommets du maillage Meme principe que Domaine::creer_tableau_elements()
Transport_Interfaces_FT_Disc & equation_transport()
void transporter_simple(const DoubleTab &deplacement)
virtual void creer_facettes_virtuelles(const ArrOfInt &liste_facettes, const ArrOfInt &liste_pe, const ArrOfInt &facettes_send_pe_list, const ArrOfInt &facettes_recv_pe_list)
Creation de facettes virtuelles sur le pe specifie.
DoubleTab gravity_center_fa7_
void nettoyer_noeuds_virtuels_et_frontieres()
virtual Entree & lire_param_maillage(Entree &is)
Cette fonction permet de lire les parametres pour le maillage des interfaces.
int get_mesh_tag() const
return mesh_state_tag_
void preparer_tableau_avant_transport(ArrOfDouble &tableau, const Desc_Structure_FT &descripteur) const
Prepare un tableau de donnees aux sommets ou aux facettes pour conserver les valeurs apres transport.
virtual void calculer_costheta_minmax(DoubleTab &costheta) const
Pour chaque sommet du maillage, s'il est sur un bord, on calcule costheta min et max (hysteresis) cor...
const ArrOfInt & sommet_num_owner() const
pour postraitement, renvoie le numero des sommets sur le PE proprietaire des sommets
int methode_calcul_courbure_contact_line_
int nb_sommets() const
renvoie le nombre de sommets (reels et virtuels) (egal a sommets().
const DoubleTab & sommets() const
renvoie le tableau des sommets (reels et virtuels) dimension(0) = nombre de sommets,
Sortie & printSom(int som, Sortie &os) const
void corriger_proprietaires_facettes()
Sans changer les sommets existants ni la numerotation des facettes, on change le proprietaire des fac...
void associer_equation_transport(const Equation_base &equation) override
on remplit refequation_transport_, schema_comm_domaine_ desc_sommets_.comm_group_ et desc_facettes_....
void update_tableau_apres_transport(ArrOfDouble &tableau, int nb_elements, const Desc_Structure_FT &descripteur) const
Voir preparer_tableau_avant_transport.
void supprimer_facettes(const ArrOfInt &liste_facettes)
Supprime les facettes dont les indices locaux sont donnes en parametre.
const ArrOfInt & drapeaux_sommets() const
Pour postraitement uniquement : la signification precise des drapeaux est de la cuisine interne a la ...
ArrOfIntFT sommet_PE_owner_
Desc_Structure_FT desc_facettes_
void pre_lissage_courbure(ArrOfDouble &store_courbure_sommets, const int niter) const
virtual const ArrOfDouble & get_surface_facettes() const
virtual double compute_surface_and_normale_element(const int elem, const bool normalize, double surface, double normal[3]) const
void creer_sommets_virtuels(const ArrOfInt &liste_sommets, const ArrOfInt &liste_pe, const Schema_Comm &comm)
Envoi des sommets dont le numero est donne dans liste_sommets au processeur dont le numero est donne ...
virtual int check_sommets(int error_is_fatal=1) const
int nb_facettes() const
renvoie le nombre de facettes (reelles et virtuelles) (egal a facettes().
ArrOfIntFT sommet_face_bord_
int sommet_ligne_contact(int i) const
double correction_contact_courbure_coeff_
ArrOfIntFT facette_num_owner_
int facettes_voisines(int fa70, int fa71, int &iarete0, int &iarete1) const
Cette methode teste si les facettes sont voisines : Des facettes sont voisines si :
int calculer_voisinage_facettes(IntTab &fa7Voisines, const Intersections_Elem_Facettes *ief=nullptr) const
void calcul_courbure_sommets(ArrOfDouble &courbure, const int call_number) const
Calcul de la courbure discrete du maillage aux sommets.
void correction_costheta(const double c, const int s0, const int facette, double ps) const
virtual void nettoyer_maillage()
Retire toutes les facettes virtuelles, toutes les facettes invalides (sommet0 == sommet1) et tous les...
void echanger_facettes(const ArrOfInt &liste_facettes, const ArrOfInt &liste_elem_arrivee, ArrOfInt &facettes_recues_numfacettes, ArrOfInt &facettes_recues_numelement)
Echange des facettes dont les numeros sont fournis dans "liste_facettes" : Pour chaque facette a ajou...
Desc_Structure_FT desc_sommets_
void associer_domaine_dis_parcours(const Domaine_dis_base &domaine_dis, const Parcours_interface &parcours)
const Maillage_FT_Disc & operator=(const Maillage_FT_Disc &)
L'operateur = est interdit !
static int deplacer_un_point(double &x, double &y, double &z, double x1, double y1, double z1, int &element_suivant, int &face_suivante, const Parcours_interface &parcours, const Domaine_VF &domaine_vf, const IntTab &face_voisins, int skip_facettes=0)
int sauvegarder(Sortie &) const override
Saves an Objet_U to an output stream. Virtual method to override.
int facette_virtuelle(int i) const
Renvoie 0 si la facette m'appartient, 1 sinon.
void calculer_coord_noeuds(const IntTab &def_noeud, const DoubleTab &soms, IntTab &renum)
const Equation_base & equation_associee() const override
double temps() const
return temps_physique_ (temps_physique_ ne sert a rien en interne.
void maillage_modifie(Statut_Maillage nouveau_statut)
Cette methode change le statut du maillage et invalide le cache de valeurs calculees (surface,...
const Desc_Structure_FT & desc_sommets() const
renvoie le descripteur des sommets (espace_distant/virtuel)
void completer_maillage()
Complete les structures de donnees du maillage.
int nb_facettes_totale() const
virtual int check_mesh(int error_is_fatal=1, int skip_facette_owner=0, int skip_facettes=0) const
ArrOfIntFT sommet_num_owner_
virtual void ajouter_maillage(const Maillage_FT_Disc &maillage_tmp, int skip_facettes=0)
double calcul_normale_3D(int num_facette, double norme[3]) const
double changer_temps(double t)
return temps_physique_ = t
void creer_sommets_virtuels_numowner(const ArrOfInt &request_sommets_pe, const ArrOfInt &request_sommets_num)
Cree chez moi les sommets virtuels specifies par le couple (pe,num) si le sommet n'existe pas encore.
int copier_sommet_interne(int som)
virtual const DoubleTab & get_update_normale_facettes() const
Calcule la grandeur demandee, stocke le resultat dans un tableau interne a la classe et renvoie le re...
void construire_noeuds(IntTab &def_noeud, const DoubleTab &soms)
const ArrOfInt & som_init_util() const
return som_init_util_
virtual double compute_normale_element(const int elem, const bool normalize, ArrOfDouble &normale) const
Schema_Comm schema_comm_domaine_
void convertir_numero_distant_local(const Desc_Structure_FT &descripteur, const ArrOfInt &element_num_owner, const ArrOfInt &numeros_distants, const ArrOfInt &pe_distant, ArrOfInt &numeros_locaux) const
Conversion des couples (numeros_distants, pe) en numeros_locaux.
void compute_gravity_center_fa7()
const Desc_Structure_FT & desc_facettes() const
renvoie le descripteur des facettes (espace_distant/virtuel)
ArrOfIntFT drapeaux_sommets_
Maillage_FT_Disc_Data_Cache & mesh_data_cache() const
renvoie une ref non const au cache de valeurs calculees sur le maillage (courbure,...
void facette_PE_owner(ArrOfInt &facette_pe) const
pour postraitement, remplit le tableau en parametre avec le numero du PE proprietaire de chaque facet...
int calcule_equation_plan_areteFa7(int fa7, int iarete, double &a, double &b, double &c, double &d) const
Intersections_Elem_Facettes intersections_elem_facettes_
void parcourir_maillage()
Remplit la structure intersections_elem_facettes_.
int sommet_virtuel(int i) const
const ArrOfInt & sommet_PE_owner() const
pour postraitement, renvoie le numero du PE proprietaire des sommets
virtual void recopie(const Maillage_FT_Disc &maillage_source, Statut_Maillage niveau_copie)
Recopie une partie du maillage source dans *this.
Maillage_FT_Disc()
constructeur par defaut.
virtual void deplacer_sommets(const ArrOfInt &liste_sommets_initiale, const DoubleTab &deplacement_initial, ArrOfInt &liste_sommets_sortis, ArrOfInt &numero_face_sortie, int skip_facettes=0)
Applique un vecteur deplacement aux noeuds dont le numero est dans "liste_noeud", puis echange les es...
void calcul_indicatrice(DoubleVect &indicatrice, const DoubleVect &indicatrice_precedente) const
Calcul de la fonction indicatrice (on suppose que "indicatrice" a la structure d'un tableau de valeur...
ArrOfIntFT som_init_util_
virtual void transporter(const DoubleTab &deplacement)
Deplace les sommets de l'interface d'un vecteur "deplacement" fourni, Change eventuellement les somme...
void ecrire_plot(const Nom &nom, double temps, int niveau_requete) const
const Intersections_Elem_Facettes & intersections_elem_facettes() const
friend class Parcours_interface
virtual const DoubleTab & get_normale_facettes() const
void nettoyer_elements_virtuels()
Retire toutes les facettes virtuelles et tous les sommets qui ne sont pas utilises.
void calcul_surface_normale(ArrOfDouble &surface, DoubleTab &normale) const
Calcul de la surface et de la normale aux facettes du maillage.
int copier_sommet(int som)
fonction qui cree un nouveau sommet par copie d'une existant utilise dans Remailleur_Collision_FT_Col...
void echanger_sommets_PE(const ArrOfInt &liste_sommets, const ArrOfInt &liste_elem_virtuel_arrivee, const ArrOfInt &liste_face_virtuelle_arrivee, const DoubleTab &deplacement, ArrOfInt &liste_nouveaux_sommets, DoubleTab &deplacement_restant, int skip_facettes=0)
Realise l'ensemble des echanges de noeuds specifies dans liste_sommets, liste_elem_virtuel_arrivee et...
static int deplacer_un_sommet(double &x, double &y, double &z, double x1, double y1, double z1, int &element, int &face_bord, const int num_sommet, const Parcours_interface &parcours, const Domaine_VF &domaine_vf, const IntTab &face_voisins, ArrOfInt &sommets_envoyes, ArrOfInt &element_virtuel_arrivee, ArrOfInt &face_virtuelle_arrivee, DoubleTab &deplacement_restant, int skip_facettes=0)
int reprendre(Entree &) override
Restores an Objet_U from an input stream. Virtual method to override.
int nb_facettes_reelles() 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...
void nettoyer_phase(const Nom &nom_eq, const int phase)
virtual const ArrOfDouble & get_update_courbure_sommets() const
Calcule la grandeur demandee, stocke le resultat dans un tableau interne a la classe et renvoie le re...
void reset()
vide toutes les structures du maillage, le statut passe a RESET.
void creer_tableau_sommets(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
creation d'un tableau aux sommets du maillage Meme principe que Domaine::creer_tableau_sommets()
const ArrOfInt & sommet_face_bord() const
pour postraitement, renvoie sommet_face_bord_
Sortie & printFa7(int fa7, int affsom, Sortie &os) const
static double angle_bidim_axi()
renvoie l'angle solide qui sert a calculer les surfaces et les volumes en bidim_axi
int nb_facettes_reelle_totale() const
const IntTab & facettes() const
renvoie le tableau des facettes (reelles et virtuelles) dimension(0) = nombre de facettes,
Vecteur3 coords_fa7(int fa7) const
const bool & get_is_solid_particle() const
const ArrOfInt & sommet_elem() const
pour postraitement, renvoie sommet_elem_
void remplir_structure(const DoubleTab &soms)
double calculer_costheta_objectif(const int som, const int facette, const int call, const double c, const DoubleTabFT &tab_cos_theta, ArrOfBit &drapeau_angle_in_range) const
An array of Motcle objects.
class Nom: a character string for naming TRUST objects.
Base class for TRUST objects (Objet_U).
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.
static double precision_geom
static const Nom & nom_du_cas()
Returns a constant reference to the case name. This method is static.
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.
void dictionnaire(const char *option_name, int value)
Add an (option name, integer value) entry to the dictionary attached to a previously registered integ...
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
int lire_avec_accolades(Entree &is)
Alias of lire_avec_accolades_depuis.
void calculer_normale_face_bord(int num_face, double x, double y, double z, double &nx_, double &ny_, double &nz_) const
int calculer_sortie_face_bord(const int face_0, const int num_element, double x0, double y0, double z0, double x1, double y1, double z1, double &x, double &y, double &z) const
Methode outil de Maillage_FT_Disc::deplacer_un_point dans le cas d'un marqueur de la ligne de contact...
void projeter_vecteur_sur_face(const int num_face, double &x_, double &y_, double &z_) const
Methode outil utilisee pour le traitement des lignes de contact.
double get_erreur_geometrique() const
Renvoie une estimation de l'erreur geometrique (valeur homogene a une distance).
int calculer_face_sortie_element(const Domaine_VF &domaine_vf, const int num_element, double x0, double y0, double z0, double x1, double y1, double z1, double &pos_intersection) const
Pour un point P0 (x0, y0, z0) a l'INTERIEUR de l'element num_element et un autre point P1 (x1,...
void parcourir(Maillage_FT_Disc &maillage) const
double distance_sommet_faces(const Domaine_VF &domaine_vf, const int num_element, double x, double y, double z) const
classe Paroi_FT_disc Condition aux limites d'angle de contact pour l'equation
Type_modele get_type_modele() const
const Triple_Line_Model_FT_Disc & tcl() const
class Probleme_base It is a Probleme_U that is not a coupling.
virtual const Equation_base & equation(int) const =0
virtual const Equation_base & get_equation_by_name(const Nom &) const
(B. Math): Virtual method added for problems having several equations of the same type (Probleme_FT_D...
static int check_int_overflow(trustIdType)
static double mp_max(double)
static Sortie & Journal(int message_level=0)
Returns a static Sortie object used as an event journal.
static int nproc()
Returns the number of processors in the current group. See Comm_Group::nproc() and PE_Groups::current...
static double mp_sum(double)
Computes the sum of x over all processors in the current group.
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.
SFichier is to the C++ ofstream class what Sortie is to the C++ ostream class.
static void lire_xyz(Maillage_FT_Disc &mesh, const Domaine_VF *domaine_vf, Entree *fichier, const Domaine *domaine_src)
Remplissage du maillage mesh a partir d'un fichier de sauvegarde xyz (fichier) ou d'un domaine source...
static void ecrire_xyz(const Maillage_FT_Disc &mesh, const Domaine_VF &domaine_vf, Sortie &fichier)
void echange_taille_et_messages() const
Launches the data exchange between all processors.
Sortie & send_buffer(int num_PE) const
Returns the buffer corresponding to processor num_PE to stack data to send.
void end_comm() const
Clears the buffers and releases resources: reading of received data from buffers is complete.
Entree & recv_buffer(int num_PE) const
Returns the buffer corresponding to processor num_PE to read received data.
const ArrOfInt & get_recv_pe_list() const
void begin_comm() const
Reserves communication buffers for a new communication.
const ArrOfInt & get_send_pe_list() const
void set_send_recv_pe_list(const ArrOfInt &send_pe_list, const ArrOfInt &recv_pe_list, const int me_to_me=0)
Defines the list of processors to send data to and receive data from.
void precision(int pre) override
void setf(IOS_FORMAT code) override
Base class for output streams.
virtual int put(const unsigned *ob, std::streamsize n, std::streamsize nb_colonnes=1)
virtual void precision(int)
Symetrie On symmetry faces, the following properties hold:
void append_array(_TYPE_ valeur)
_SIZE_ size_array() const
void resize_array(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
static int is_PDI_checkpoint()
static int is_PDI_restart()
void nettoyer_proprietes_particules(const ArrOfInt &som_utilises)
virtual const Parcours_interface & parcours_interface() const
const Champ_Inc_base & inconnue() const override
const Probleme_base & get_probleme_base() const
const int & get_nb_particles_tot() const
virtual const Champ_base & get_distance_interface() const
bool is_activated() const
bool is_read_via_file() const
double get_theta_app(const int num_face)