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
Renvoie la valeur du bit e, puis met le bit e a 1.
ArrOfBit_32_64 & resize_array(int_t n)
Change la taille du tableau et copie les donnees existantes.
void setbit(int_t i) const
Met le bit e a 1.
void clearbit(int_t i) const
Met le bit e a 0.
Empty class used as a base for all the arrays.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual DoubleTab & valeurs()=0
classe Champ_front_base Classe de base pour la hierarchie des champs aux frontieres.
virtual void valeurs_face(int, DoubleVect &) const
Renvoie le vecteur des valeurs du champ pour la face donnee.
static int check_enabled()
classe Cond_lim_base Classe de base pour la hierarchie des classes qui representent les differentes c...
virtual Frontiere_dis_base & frontiere_dis()
Renvoie la frontiere discretisee a laquelle les conditions aux limites s'appliquent.
Champ_front_base & champ_front()
classe Cond_lim Classe generique servant a representer n'importe quelle classe
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.
classe Dirichlet_entree_fluide Cette classe represente une condition aux limite imposant une grandeur
Classe Dirichlet_homogene Cette classe est la classe de base de la hierarchie des conditions aux limi...
classe Dirichlet Cette classe est la classe de base de la hierarchie des conditions aux limites de ty...
int_t nb_elem_tot() const
SmallArrOfTID_t & chercher_elements(const DoubleTab &pos, SmallArrOfTID_t &elem, int reel=0) const
Recherche des elements contenant les points dont les coordonnees sont specifiees.
const IntTab_t & elem_virt_pe_num() const
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
int nb_cond_lim() const
Renvoie le nombre de conditions aux limites.
virtual const Cond_lim & la_cl_de_la_face(int num_face) const
A partir d'un indice de face de bord dans le Domaine_VF, renvoie la condition aux limites a laquelle ...
const Cond_lim_base & condition_limite_de_la_face_reelle(int face_globale, int &face_locale) const
Renvoie la condition limite associee a une face reelle donnee.
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
int nb_faces() const
renvoie le nombre global de faces.
double xv(int num_face, int k) const
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
const IntTab & face_virt_pe_num() const
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
int nb_faces_bord() const
renvoie le nombre de faces sur lesquelles sont appliquees les conditions limites :
virtual double dist_face_elem0(int, int) const
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
static int is_ecriture_special(int &special, int &a_faire)
indique si le format special a ete demande en lecture active par sauvegarde xyz .
static int is_lecture_special()
indique si le format special a ete demande en lecture active par reprise xyz .
classe Ensemble_Lagrange_base Classe de base des classes representant une structure geometrique const...
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)
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
int_t num_premiere_face() const
int_t nb_faces() const
Renvoie le nombre de faces de la frontiere.
const Frontiere & frontiere() const
Renvoie la frontiere geometrique associee.
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
: Cette classe est un OWN_PTR mais l'objet pointe est partage entre plusieurs
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
Sauvegarde d'un Objet_U sur un flot de sortie Methode a surcharger.
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
Reprise d'un Objet_U sur un flot d'entree Methode a surcharger.
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
Un tableau d'objets de la classe Motcle.
class Nom Une chaine de caractere pour nommer les objets de TRUST
classe Objet_U Cette classe est la classe de base des Objets de TRUST
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
static double precision_geom
static const Nom & nom_du_cas()
Renvoie une reference constante vers le nom du cas.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Helper class to factorize the readOn method of Objet_U classes.
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
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
virtual const Equation_base & equation(int) const =0
virtual const Equation_base & get_equation_by_name(const Nom &) const
(B. Math): Methode virtuelle ajoutee pour les problemes ayant plusieurs equations de meme type (Probl...
static int check_int_overflow(trustIdType)
static double mp_max(double)
static Sortie & Journal(int message_level=0)
Renvoie un objet statique de type Sortie qui sert de journal d'evenements.
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
static int me()
renvoie mon rang dans le groupe de communication courant.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
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
Cette methode lance l'echange de donnees entre tous les processeurs.
Sortie & send_buffer(int num_PE) const
renvoie le buffer correspondant au processeur num_PE pour y entasser des donnees a envoyer.
void end_comm() const
Vide les buffers et libere les ressources: on a fini de lire les donnees recues dans les buffers.
Entree & recv_buffer(int num_PE) const
renvoie le buffer correspondant au processeur num_PE pour y lire les donnees recues.
const ArrOfInt & get_recv_pe_list() const
void begin_comm() const
Reserve les buffers de comm pour une nouvelle 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)
Definit la liste des processeurs a qui on va envoyer et de qui on va recevoir des donnees.
void precision(int pre) override
void setf(IOS_FORMAT code) override
Classe de base des flux de sortie.
virtual int put(const unsigned *ob, std::streamsize n, std::streamsize nb_colonnes=1)
virtual void precision(int)
classe Symetrie Sur les faces de symetrie on a les proprietes suivantes:
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)