17#include <Parcours_interface.h>
18#include <Domaine_VF.h>
20#include <TRUST_Deriv.h>
21#include <Comm_Group.h>
22#include <Connectivite_frontieres.h>
27#include <IJK_Navier_Stokes_tools.h>
32static int flag_warning_code_missing=1;
40 param.lire_avec_accolades_depuis(is);
69 const DoubleTab& coord_som = refdomaine_vf_->domaine().coord_sommets();
81 assert(!refdomaine_vf_);
82 refdomaine_vf_ = domaine_vf;
95 const int nb_faces = domaine_vf.
nb_faces();
98 double a, b, c = 0., d;
99 double x, y = 0., z = 0.;
100 double inverse_norme;
102 for (i = 0; i < nb_faces; i++)
104 x = domaine_vf.
xv(i, 0);
116 y = domaine_vf.
xv(i, 1);
120 z = domaine_vf.
xv(i, 2);
122 inverse_norme = 1. / sqrt(a*a + b*b + c*c);
127 d = - (a * x + b * y + c * z);
135 if (nom_elem ==
"Rectangle")
137 else if (nom_elem ==
"Rectangle_2D_axi")
139 else if (nom_elem ==
"Triangle")
141 else if (nom_elem ==
"Tetraedre")
143 else if (nom_elem ==
"Hexaedre")
147 Cerr <<
"Parcours_interface::associer_domaine_vf\n";
148 Cerr <<
" Le type d'element " << nom_elem;
149 Cerr <<
" n'est pas reconnu !\n";
156 refconnect_front_ = connect;
171 assert(refdomaine_vf_);
173 const Domaine_VF& domaine_vf = refdomaine_vf_.valeur();
177 DoubleTab copie_sommets_maillage;
188 copie_sommets_maillage = maillage.
sommets();
194 const int nb_elem = domaine_vf.
nb_elem();
201 static ArrOfIntFT echange_facettes_numfacette;
202 static ArrOfIntFT echange_facettes_numelement;
205 static ArrOfIntFT facettes_a_traiter_numfacette;
206 static ArrOfIntFT facettes_a_traiter_numelement;
209 int nb_facettes_echangees = 0;
222 for (
int i = 0; i < nb_facettes; i++)
226 int premier_sommet = maillage.
facettes_(i,0);
227 int element_depart = maillage.
sommet_elem_[premier_sommet];
228 if (element_depart >= 0)
230 echange_facettes_numfacette,
231 echange_facettes_numelement,
238 int nb_facettes = facettes_a_traiter_numfacette.
size_array();
239 for (
int i = 0; i < nb_facettes; i++)
241 int num_facette = facettes_a_traiter_numfacette[i];
242 int element_depart = facettes_a_traiter_numelement[i];
244 echange_facettes_numfacette,
245 echange_facettes_numelement,
246 num_facette, element_depart);
253 echange_facettes_numelement,
254 facettes_a_traiter_numfacette,
255 facettes_a_traiter_numelement);
263 while (nb_facettes_echangees > 0);
275 copie_sommets_maillage.
resize(ni, nj);
277 maillage.
sommets_ = copie_sommets_maillage;
290static void effacer_drapeaux_elements_parcourus(
291 ArrOfBit& drapeaux_elements_parcourus,
292 const ArrOfInt& liste_elements_parcourus)
296 int n = liste_elements_parcourus.
size_array();
297 for (
int i = 0; i < n; i++)
299 const int element = liste_elements_parcourus[i];
300 drapeaux_elements_parcourus.
clearbit(element);
318 const int num_element,
319 const int num_face_element,
320 double& a,
double& b,
double& c,
double& d)
const
322 assert((&domaine_vf) == (&(refdomaine_vf_.valeur())));
324 const int num_face = domaine_vf.
elem_faces(num_element, num_face_element);
326 const int elem_voisin = domaine_vf.
face_voisins(num_face, 0);
333 if (elem_voisin == num_element)
344 ArrOfInt& echange_facettes_numfacette,
345 ArrOfInt& echange_facettes_numelement,
347 int element_depart)
const
354 static ArrOfIntFT liste_elements_parcourus;
355 static ArrOfIntFT elements_a_traiter;
356 static ArrOfIntFT new_elements_a_traiter;
363 liste_elements_parcourus);
364 int n = liste_elements_parcourus.
size_array();
365 for (
int i = 0; i < n; i++)
367 const int element = liste_elements_parcourus[i];
375 liste_elements_parcourus);
381 elements_a_traiter[0] = element_depart;
390 const int n = elements_a_traiter.
size_array();
394 for (
int i = 0; i < n; i++)
396 const int element = elements_a_traiter[i];
402 num_facette, element);
405 num_facette, element);
411 Journal() <<
"code_retour<0" << finl;
416 const int masque = 1 << j;
419 if ((code_retour & masque) == 0)
423 const int num_face = domaine_vf.
elem_faces(element, j);
424 const int elem_voisin = domaine_vf.
face_voisins(num_face, 0)
456 elements_a_traiter = new_elements_a_traiter;
462 liste_elements_parcourus);
478 int num_facette,
int num_element)
const
482 const int sommet0 = maillage.
facettes_(num_facette, 0);
483 const int sommet1 = maillage.
facettes_(num_facette, 1);
485 double x0 = maillage.
sommets_(sommet0, 0);
486 double y0 = maillage.
sommets_(sommet0, 1);
487 double x1 = maillage.
sommets_(sommet1, 0);
488 double y1 = maillage.
sommets_(sommet1, 1);
500 tolerance_comparaisons = 0.;
503 const double dx = x1 - x0;
504 const double dy = y1 - y0;
505 double l = sqrt(dx * dx + dy * dy);
523 int plan_coupe0 = -1;
524 int plan_coupe1 = -1;
534 double signe =
calcul_eq_plan(domaine_vf, num_element, num_plan, a, b, c, d);
536 const double f_0 = (a * x0 + b * y0 + d) * signe;
537 const double f_1 = (a * x1 + b * y1 + d) * signe;
539 const double f0 = f_0 * u0 + f_1 * (1. - u0);
540 const double f1 = f_0 * u1 + f_1 * (1. - u1);
541 const int s0_dehors = inf_strict(f0,Zero,tolerance_comparaisons) ? 1 : 0;
542 const int s1_dehors = inf_strict(f1,Zero,tolerance_comparaisons) ? 1 : 0;
544 if (s0_dehors + s1_dehors == 1)
548 double t = f1 / (f1 - f0);
555 u0 = u0 * t + u1 * (1.-t);
556 plan_coupe0 = num_plan;
560 u1 = u0 * t + u1 * (1.-t);
561 plan_coupe1 = num_plan;
564 else if (s0_dehors + s1_dehors == 2)
578 double u_centre = (u0 + u1) * 0.5;
580 double surface = u0 - u1;
582 if (inf_strict(surface,0.)) surface = 0.;
586 double aire_faces[3] = {0., 0., 0.};
587 double barycentre_faces[3][2] = {{0., 0.}, {0., 0.}, {0., 0.}};
589 double barycentre_phase1[3] = {0.,0.,0.};
597 double ix0 = x0 * u0 + x1 * (1.-u0);
598 double iy0 = y0 * u0 + y1 * (1.-u0);
599 double ix1 = x0 * u1 + x1 * (1.-u1);
600 double iy1 = y0 * u1 + y1 * (1.-u1);
610 if (flag_warning_code_missing)
612 Cerr <<
"WARNING : barycentre_phase1 not filled properly!!" << finl;
613 Cerr <<
"WARNING : Calculation of barycentre_phase1 not implemented yet." << finl;
617 plan_coupe0, plan_coupe1);
638 if (plan_coupe0 >= 0)
639 code_retour |= 1 << plan_coupe0;
640 if (plan_coupe1 >= 0)
641 code_retour |= 1 << plan_coupe1;
675 const int num_element,
676 const double x0,
const double y0,
677 const double x1,
const double y1,
678 const double epsilon,
679 double bary[3])
const
682 constexpr double un_tiers = 1. / 3.;
686 constexpr int NUM_FACE_GAUCHE = 0;
687 constexpr int NUM_FACE_BAS = 1;
688 constexpr int NUM_FACE_HAUT = 3;
689 constexpr int NUM_FACE_DROITE = 2;
691 const int face_bas = domaine_vf.
elem_faces(num_element, NUM_FACE_BAS);
692 const int face_gauche = domaine_vf.
elem_faces(num_element, NUM_FACE_GAUCHE);
693 const int face_droite = domaine_vf.
elem_faces(num_element, NUM_FACE_DROITE);
694 const int face_haut = domaine_vf.
elem_faces(num_element, NUM_FACE_HAUT);
695 const double y_bas = domaine_vf.
xv(face_bas, 1);
696 const double x_gauche = domaine_vf.
xv(face_gauche, 0);
697 const double x_droite = domaine_vf.
xv(face_droite, 0);
698 const double y_haut = domaine_vf.
xv(face_haut, 1);
701 double v_elem = (x_droite - x_gauche) * (y_haut - y_bas);
703 v_elem *= (x_droite + x_gauche) * 0.5 * angle_bidim_axi;
706 double v = (x0 - x1) * ((y0 + y1) * 0.5 - y_bas);
707 bary[0] = (x0 - x1) * ((y0 + y1) * 0.5 - y_bas);
708 bary[1] = (x0 - x1) * ((y0 + y1) * 0.5 - y_bas);
712 const double s0 = (x1 - x0) * (y0 - y_bas);
713 const double s1 = (x1 - x0) * (y1 - y_bas);
719 assert(s0 + s1 != 0);
723 v *= ((x0 + x0 + x1) * s0 + (x0 + x1 + x1) * s1) / (s0 + s1);
726 v *= un_tiers * angle_bidim_axi;
727 const double xx1 = x1*x1;
728 const double xx0 = x0*x0;
729 if (fabs(xx1-xx0)>DMINFLOAT)
730 bary[0] = 2.*un_tiers*(xx1*x1-xx0*x0)/(xx1-xx0);
735 bary[0] = (x0 + x1) *0.5;
737 bary[1] = ((y0 + y1) * 0.5 + y_bas) * 0.5;
741 double bary2[2] = {0.,0.};
742 if (y0 > y_haut - epsilon)
744 v2 = (x_droite - x0) * (y_haut - y_bas);
746 v2 *= (x_droite + x0) * 0.5 * angle_bidim_axi;
748 else if (y1 > y_haut - epsilon)
750 v2 = (x1 - x_gauche) * (y_haut - y_bas);
752 v2 *= (x1 + x_gauche) * 0.5 * angle_bidim_axi;
759 if (y0 > y_haut - epsilon)
763 double xx1 = x_droite*x_droite;
765 if (fabs(xx1-xx0)>DMINFLOAT)
766 bary2[0] = 2.*un_tiers*(xx1*x_droite-xx0*x0)/(xx1-xx0);
769 bary2[0] = (x_droite + x0) * 0.5;
771 bary2[1] = (y_haut + y_bas) * 0.5;
773 else if (y1 > y_haut - epsilon)
777 const double xx1 = x1*x1;
778 const double xx0 = x_gauche*x_gauche;
779 if (fabs(xx1-xx0)>DMINFLOAT)
780 bary2[0] = 2.*un_tiers*(xx0*x_gauche-xx1*x1)/(xx0-xx1);
783 bary2[0] = (x_gauche + x0) * 0.5;
785 bary2[1] = (y_haut + y_bas) * 0.5;
790 bary2[0] = (x_gauche + x_droite) * 0.5;
792 if (fabs(x_gauche-x_droite)>DMINFLOAT)
794 bary2[0] = 2.*un_tiers*(x_droite*x_droite*x_droite-x_gauche*x_gauche*x_gauche)/(x_droite*x_droite-x_gauche*x_gauche);
796 bary2[1] = (y_haut + y_bas) * 0.5;
799 if ((v+v2)>DMINFLOAT)
800 for (
int i=0; i<2; i++)
801 bary[i] = (bary[i]*v + bary2[i]*v2) / (v+v2);
804 v = (v + v2) / v_elem;
828 FTd_vecteur2& origine,
829 FTd_matrice22& matrice,
830 double& surface)
const
832 const int s0 = (*domaine_elem_ptr)(num_element,0);
833 const int s1 = (*domaine_elem_ptr)(num_element,1);
834 const int s2 = (*domaine_elem_ptr)(num_element,2);
835 const double x0 = (*domaine_sommets_ptr)(s0, 0);
836 const double y0 = (*domaine_sommets_ptr)(s0, 1);
839 const double dx1 = (*domaine_sommets_ptr)(s1, 0) - x0;
840 const double dy1 = (*domaine_sommets_ptr)(s1, 1) - y0;
841 const double dx2 = (*domaine_sommets_ptr)(s2, 0) - x0;
842 const double dy2 = (*domaine_sommets_ptr)(s2, 1) - y0;
847 double det = dx1 * dy2 - dx2 * dy1;
849 double inv_det = 1. / det;
850 matrice[0][0] = dy2 * inv_det;
851 matrice[0][1] = - dx2 * inv_det;
852 matrice[1][0] = - dy1 * inv_det;
853 matrice[1][1] = dx1 * inv_det;
863 const FTd_matrice22& matrice,
865 double& u,
double& v)
const
869 u = matrice[0][0] * x + matrice[0][1] * y;
870 v = matrice[1][0] * x + matrice[1][1] * y;
899 double x0,
double y0,
900 double x1,
double y1,
902 int plan_coupe1)
const
906 static const int FACE_ZERO = 0;
908 double matrice[2][2];
909 double surface_triangle;
910 double u0, v0, u1, v1;
917 double vol = (u0 - u1) * (v0 + v1) * 0.5;
920 if (plan_coupe0 == FACE_ZERO)
921 vol += (1. - u0) * (1. - u0) * 0.5;
922 else if (plan_coupe1 == FACE_ZERO)
923 vol -= (1. - u1) * (1. - u1) * 0.5;
963 int num_facette,
int num_element)
const
971 static DoubleTabFT poly_(20,3);
972 static DoubleTabFT new_poly_(20,3);
975 static DoubleTabFT poly_reelles_(20,3);
987 double coord_som[3][3];
988 const int sommets[3] = { maillage.
facettes_(num_facette, 0),
993 for (
int ii = 0; ii < 3; ii++)
996 for (
int j = 0; j < 3; j++)
998 coord_som[ii][j] = maillage.
sommets_(s, j);
1004 const double fact_mult = 1.;
1005 int isom,isom_s,isom_ss, kk;
1006 for (isom=0 ; isom<3 ; isom++)
1008 isom_s = (isom+1)%3;
1011 isom_ss = (isom_s+1)%3;
1014 coord_som[isom][kk] += fact_mult * (coord_som[isom][kk] -coord_som[isom_ss][kk]);
1015 coord_som[isom_s][kk] += fact_mult * (coord_som[isom_s][kk]-coord_som[isom_ss][kk]);
1027 tolerance_comparaisons = 0.;
1034 static ArrOfIntFT polygone_plan_coupe_(20);
1035 static ArrOfIntFT new_poly_plan_coupe_(20);
1037 polygone_plan_coupe_ = -1;
1051 double signe =
calcul_eq_plan(domaine_vf, num_element, num_plan, a, b, c, d);
1053 const double f0 = (a * coord_som[0][0] + b * coord_som[0][1] + c * coord_som[0][2] + d) * signe;
1054 const double f1 = (a * coord_som[1][0] + b * coord_som[1][1] + c * coord_som[1][2] + d) * signe;
1055 const double f2 = (a * coord_som[2][0] + b * coord_som[2][1] + c * coord_som[2][2] + d) * signe;
1058 const int nb_sommets_poly = poly_.
dimension(0);
1059 i = nb_sommets_poly - 1;
1060 double u = poly_(i,0);
1061 double v = poly_(i,1);
1062 double w = poly_(i,2);
1064 double f = f0 * u + f1 * v + f2 * w;
1065 int sommet_dehors = inf_strict(f,Zero,tolerance_comparaisons) ? 1 : 0;
1067 for (i = 0; i < nb_sommets_poly; i++)
1069 int sommet_precedent_dehors = sommet_dehors;
1077 f = f0 * u + f1 * v + f2 * w;
1078 sommet_dehors = inf_strict(f,Zero,tolerance_comparaisons) ? 1 : 0;
1079 if (sommet_dehors + sommet_precedent_dehors == 1)
1084 double t = f / (f - f_prec);
1091 double new_u = u_prec * t + u * (1.-t);
1092 double new_v = v_prec * t + v * (1.-t);
1093 double new_w = 1. - new_u - new_v;
1094 new_poly_(n,0) = new_u;
1095 new_poly_(n,1) = new_v;
1096 new_poly_(n,2) = new_w;
1098 const int num_plan_coupe = sommet_dehors ? polygone_plan_coupe_[i] : num_plan;
1101 if (! sommet_dehors)
1109 const int num_plan_coupe = polygone_plan_coupe_[i];
1120 polygone_plan_coupe_ = new_poly_plan_coupe_;
1123 const int nb_sommets_poly = poly_.
dimension(0);
1125 double aire_faces[3] = {0., 0., 0.};
1126 double barycentre_faces[3][2] = {{0., 0.}, {0., 0.}, {0., 0.}};
1129 double surface = 0.;
1130 double u_centre = 0.;
1131 double v_centre = 0.;
1133 i = nb_sommets_poly - 1;
1134 double u = poly_(i,0);
1135 double v = poly_(i,1);
1136 for (i = 0; i < nb_sommets_poly; i++)
1144 double contrib_surface = (v - v_prec) * (u + u_prec) * 0.5;
1145 if (contrib_surface!=0.)
1156 double B = std::max(u,u_prec);
1157 double b = std::min(u,u_prec);
1158 double h = std::fabs(v - v_prec);
1161 double CdGrX = b/2.;
1162 double CdGrY = (v+v_prec)/2.;
1163 double St = (B-b) * h/2.;
1164 double CdGtX = (2.*b+B)/3.;
1165 double CdGtY = v+v_prec;
1177 double uX = (Sr * CdGrX + St * CdGtX) / S;
1178 double vX = (Sr * CdGrY + St * CdGtY) / S;
1180 double contrib_u_centre = uX * contrib_surface;
1181 double contrib_v_centre = vX * contrib_surface;
1183 surface += contrib_surface;
1184 u_centre += contrib_u_centre;
1185 v_centre += contrib_v_centre;
1191 if (surface < 0.) surface = 0.;
1194 double barycentre_phase1[3] = {0.,0.,0.};
1198 if (sup_strict(surface,0.,tolerance_comparaisons))
1200 u_centre /= surface;
1201 v_centre /= surface;
1205 u_centre = v_centre = 1./3.;
1207 double w_centre = 1. - u_centre - v_centre;
1209 FTd_vecteur3 centre_de_gravite;
1211 for (
int ii = 0; ii < 3; ii++)
1213 centre_de_gravite[ii] =
1214 u_centre * coord_som[0][ii]
1215 + v_centre * coord_som[1][ii]
1216 + w_centre * coord_som[2][ii];
1220 poly_reelles_.
resize(nb_sommets_poly,3);
1221 for (i=0 ; i<nb_sommets_poly ; i++)
1225 poly_reelles_(i,k) =
1226 poly_(i,0) * coord_som[0][k]
1227 + poly_(i,1) * coord_som[1][k]
1228 + poly_(i,2) * coord_som[2][k];
1237 if (flag_warning_code_missing)
1239 Cerr <<
"WARNING : barycentre_phase1 not filled properly!!" << finl;
1240 Cerr <<
"WARNING : Calculation of barycentre_phase1 not implemented yet for TETRA." << finl;
1241 flag_warning_code_missing=0;
1254 norme, centre_de_gravite,
1255 polygone_plan_coupe_,
1257 volume = cut_cell_properties.
volume;
1258 barycentre_phase1[0] = cut_cell_properties.
barycentre[0];
1259 barycentre_phase1[1] = cut_cell_properties.
barycentre[1];
1260 barycentre_phase1[2] = cut_cell_properties.
barycentre[2];
1263 for (
int i_face = 0; i_face < 3; i_face++)
1271 polygone_plan_coupe_,
1273 aire_faces[i_face] = cut_face_properties.
area;
1274 barycentre_faces[i_face][0] = cut_face_properties.
barycentre[0];
1275 barycentre_faces[i_face][1] = cut_face_properties.
barycentre[1];
1295 1. - u_centre - v_centre);
1311 int code_retour = 0;
1313 for (i = 0; i < nb_sommets_poly; i++)
1315 const int plan_coupe = polygone_plan_coupe_[i];
1316 if (plan_coupe >= 0)
1317 code_retour |= 1 << plan_coupe;
1333 const double a00 = matrice[0][0];
1334 const double a01 = matrice[0][1];
1335 const double a02 = matrice[0][2];
1336 const double a10 = matrice[1][0];
1337 const double a11 = matrice[1][1];
1338 const double a12 = matrice[1][2];
1339 const double a20 = matrice[2][0];
1340 const double a21 = matrice[2][1];
1341 const double a22 = matrice[2][2];
1343 const double t4 = a00*a11;
1344 const double t6 = a00*a12;
1345 const double t8 = a01*a10;
1346 const double t10 = a02*a10;
1347 const double t12 = a01*a20;
1348 const double t14 = a02*a20;
1349 const double t = t4*a22-t6*a21-t8*a22+t10*a21+t12*a12-t14*a11;
1352 Cerr<<
"PB : matrice non inversible : t= "<<t<<finl<<
" matrice= "<<finl;
1354 for (i=0 ; i<3 ; i++)
1356 for (j=0 ; j<3 ; j++)
1358 Cerr<<
" "<<matrice[i][j];
1364 const double t17 = 1/(t);
1367 matrice_inv[0][0] = (a11*a22-a12*a21)*t17;
1368 matrice_inv[0][1] = -(a01*a22-a02*a21)*t17;
1369 matrice_inv[0][2] = -(-a01*a12+a02*a11)*t17;
1370 matrice_inv[1][0] = (-a10*a22+a12*a20)*t17;
1371 matrice_inv[1][1] = (a00*a22-t14)*t17;
1372 matrice_inv[1][2] = -(t6-t10)*t17;
1373 matrice_inv[2][0] = -(-a10*a21+a11*a20)*t17;
1374 matrice_inv[2][1] = -(a00*a21-t12)*t17;
1375 matrice_inv[2][2] = (t4-t8)*t17;
1388 for (i=0 ; i<3 ; i++)
1391 for (j=0 ; j<3 ; j++)
1393 x += matrice[i][j] * vect[j];
1417 const DoubleTab& poly_reelles,
1418 const FTd_vecteur3& centre_de_gravite,
1419 double epsilon)
const
1421 static const int SOM_Z = 0;
1422 static const int SOM_A = 1;
1423 static const int SOM_B = 2;
1424 static const int SOM_C = 3;
1426 const int som_Z = (*domaine_elem_ptr)(num_element,SOM_Z);
1427 const int som_A = (*domaine_elem_ptr)(num_element,SOM_A);
1428 const int som_B = (*domaine_elem_ptr)(num_element,SOM_B);
1429 const int som_C = (*domaine_elem_ptr)(num_element,SOM_C);
1431 FTd_matrice33 matrice, matrice_inv;
1452 const int nb_sommets_poly = poly_reelles.
dimension(0);
1453 DoubleTabFT poly_reelles_ref(nb_sommets_poly,3);
1454 FTd_vecteur3 poly, poly_ref;
1455 for (i=0 ; i<nb_sommets_poly ; i++)
1457 for (k=0 ; k<3 ; k++)
1459 poly[k] = poly_reelles(i,k) - (*domaine_sommets_ptr)(som_Z, k);
1462 for (k=0 ; k<3 ; k++)
1464 poly_reelles_ref(i,k) = poly_ref[k];
1469 FTd_vecteur3 normale_ref;
1470 double AB[3], AC[3], AB_ref[3], AC_ref[3];
1471 const int somA = maillage.
facettes_(num_facette, 0);
1472 const int somB = maillage.
facettes_(num_facette, 1);
1473 const int somC = maillage.
facettes_(num_facette, 2);
1482 normale_ref[0] = AB_ref[1]*AC_ref[2] - AB_ref[2]*AC_ref[1];
1483 normale_ref[1] = AB_ref[2]*AC_ref[0] - AB_ref[0]*AC_ref[2];
1484 normale_ref[2] = AB_ref[0]*AC_ref[1] - AB_ref[1]*AC_ref[0];
1488 FTd_vecteur3 centre_de_gravite_triangle_ref;
1489 static DoubleTabFT triangle_ref(3,3);
1490 double contrib_volume = 0., vol;
1493 triangle_ref(0,k) = poly_reelles_ref(0,k);
1495 for (i=1 ; i<nb_sommets_poly-1 ; i++)
1499 triangle_ref(1,k) = poly_reelles_ref(i,k);
1500 triangle_ref(2,k) = poly_reelles_ref(i+1,k);
1501 centre_de_gravite_triangle_ref[k] = (triangle_ref(0,k)+triangle_ref(1,k)+triangle_ref(2,k)) /3.;
1504 contrib_volume += vol;
1507 return contrib_volume;
1523 const FTd_vecteur3& norme_ref,
1524 const FTd_vecteur3& centre_de_gravite_ref,
1525 double epsilon)
const
1529 if (norme_ref[1]>0.)
1539 double v_elem = 0.5 /3.;
1542 const int nb_sommets_poly = poly_reelles_ref.
dimension(0);
1543 int k,i, i_prec = nb_sommets_poly -1;
1545 assert(nb_sommets_poly==3);
1547 FTd_vecteur3 normale_tr;
1548 double AB[3], AC[3];
1550 for (k=0 ; k<3 ; k++)
1552 AB[k] = poly_reelles_ref(1,k) - poly_reelles_ref(0,k);
1553 AC[k] = poly_reelles_ref(2,k) - poly_reelles_ref(0,k);
1556 normale_tr[0] = AB[1]*AC[2] - AB[2]*AC[1];
1557 normale_tr[1] = AB[2]*AC[0] - AB[0]*AC[2];
1558 normale_tr[2] = AB[0]*AC[1] - AB[1]*AC[0];
1559 const double aire_tr = normale_tr[0]*normale_tr[0]+normale_tr[1]*normale_tr[1]+normale_tr[2]*normale_tr[2];
1564 int coupe_face_opp = -1;
1565 int coupe_face_opp_p1 = -1;
1567 double aire_projetee = 0.;
1568 for (i=0 ; i<nb_sommets_poly ; i++)
1572 double f_prec = poly_reelles_ref(i_prec,0) + poly_reelles_ref(i_prec,1) + poly_reelles_ref(i_prec,2) - 1.;
1573 double f = poly_reelles_ref(i,0) + poly_reelles_ref(i,1) + poly_reelles_ref(i,2) - 1.;
1578 coupe_face_opp = i_prec;
1579 coupe_face_opp_p1 = i;
1584 double contrib_aire_projetee = (poly_reelles_ref(i,2) - poly_reelles_ref(i_prec,2)) * (poly_reelles_ref(i,0) + poly_reelles_ref(i_prec,0)) * 0.5;
1586 aire_projetee += contrib_aire_projetee;
1591 if (aire_projetee!=0.)
1594 v = signe_princ * std::fabs(aire_projetee) * (centre_de_gravite_ref[1]);
1596 if (coupe_face_opp!=-1)
1605 FTd_vecteur3 som0,som1, proj_som0,proj_som1, proj2_som0,proj2_som1;
1609 som0[k] = poly_reelles_ref(coupe_face_opp,k);
1610 som1[k] = poly_reelles_ref(coupe_face_opp_p1,k);
1613 proj_som0[0] = som0[0];
1614 proj_som1[0] = som1[0];
1617 proj_som0[2] = som0[2];
1618 proj_som1[2] = som1[2];
1638 if (som0[0]<epsilon)
1645 assert((1. + som0[2]/som0[0]) !=0.);
1646 proj2_som0[0] = 1./ (1. + som0[2]/som0[0]);
1648 if (som1[0]<epsilon)
1655 assert((1. + som1[2]/som1[0]) !=0.);
1656 proj2_som1[0] = 1./ (1. + som1[2]/som1[0]);
1660 proj2_som0[2] = 1. - proj2_som0[0];
1661 proj2_som1[2] = 1. - proj2_som1[0];
1664 FTd_vecteur3 normale_plan_proj;
1665 normale_plan_proj[0] = -(proj_som1[2]-proj_som0[2]);
1666 normale_plan_proj[1] = 0.;
1667 normale_plan_proj[2] = proj_som1[0]-proj_som0[0];
1668 double pdtscal = 0.;
1672 vect[i] = proj2_som0[i]- proj_som0[i];
1673 pdtscal += vect[i]*vect[i];
1679 vect[i] = proj2_som1[i]- proj_som1[i];
1685 pdtscal += normale_plan_proj[i] * vect[i];
1687 double signe_2 = 0.;
1702 double l,L,base,h, vol;
1704 l = sqrt((som1[0]-som0[0])*(som1[0]-som0[0]) + (som1[2]-som0[2])*(som1[2]-som0[2]));
1705 L = 0.5* (som0[1] + som1[1]);
1710 double L2 = (proj2_som0[0]-som0[0])*(proj2_som0[0]-som0[0]) + (proj2_som0[2]-som0[2])*(proj2_som0[2]-som0[2]);
1711 double l2 = ((som1[0]-som0[0])*(proj2_som0[0]-som0[0]) + (som1[2]-som0[2])*(proj2_som0[2]-som0[2])) / l;
1724 base = (proj_som1[2]-proj2_som0[2]) * (proj2_som1[0]-proj2_som0[0]) - (proj_som1[0]-proj2_som0[0]) * (proj2_som1[2]-proj2_som0[2]);
1725 base = std::fabs(base * 0.5);
1764 const DoubleTab& poly_reelles,
1765 const FTd_vecteur3& norme,
1766 const FTd_vecteur3& centre_de_gravite,
1767 const ArrOfInt& polygone_plan_coupe,
1768 double epsilon)
const
1771 constexpr int NUM_FACE_GAUCHE = 0;
1772 constexpr int NUM_FACE_DROITE = 3;
1773 constexpr int NUM_FACE_BAS = 1;
1774 constexpr int NUM_FACE_HAUT = 4;
1775 constexpr int NUM_FACE_ARRIERE = 2;
1776 constexpr int NUM_FACE_AVANT = 5;
1777 int face_bas = domaine_vf.
elem_faces(num_element, NUM_FACE_BAS);
1778 int face_haut = domaine_vf.
elem_faces(num_element, NUM_FACE_HAUT);
1779 int face_gauche = domaine_vf.
elem_faces(num_element, NUM_FACE_GAUCHE);
1780 int face_droite = domaine_vf.
elem_faces(num_element, NUM_FACE_DROITE);
1781 int face_arriere = domaine_vf.
elem_faces(num_element, NUM_FACE_ARRIERE);
1782 int face_avant = domaine_vf.
elem_faces(num_element, NUM_FACE_AVANT);
1783 double y_bas = domaine_vf.
xv(face_bas, 1);
1784 double y_haut = domaine_vf.
xv(face_haut, 1);
1785 double x_gauche = domaine_vf.
xv(face_gauche, 0);
1786 double x_droite = domaine_vf.
xv(face_droite, 0);
1787 double z_arriere = domaine_vf.
xv(face_arriere, 2);
1788 double z_avant = domaine_vf.
xv(face_avant, 2);
1791 double signe_princ, signe_compl0,signe_compl1;
1796 else if (norme[1]<0.)
1808 else if (norme[0]<0.)
1820 else if (norme[2]<0.)
1830 double v_elem = (x_droite - x_gauche) * (y_haut - y_bas) * (z_avant - z_arriere);
1833 const int nb_sommets_poly = poly_reelles.
dimension(0);
1834 int i, i_prec = nb_sommets_poly -1;
1836 double aire_projetee = 0.;
1837 for (i=0 ; i<nb_sommets_poly ; i++)
1841 double contrib_aire_projetee = (poly_reelles(i,2) - poly_reelles(i_prec,2)) * ((poly_reelles(i,0) + poly_reelles(i_prec,0)) * 0.5);
1843 aire_projetee += contrib_aire_projetee;
1850 volume += signe_princ * std::fabs(aire_projetee) * (centre_de_gravite[1] - y_bas);
1853 double barycentre[3] = {0};
1854 assert(nb_sommets_poly >=2);
1856 for (i = 1; i < nb_sommets_poly; i++)
1858 i_min = poly_reelles(i,1) < poly_reelles(i_min,1) ? i : i_min;
1860 double y_min = poly_reelles(i_min,1);
1863 double volume_prisme = std::fabs(aire_projetee * (y_min - y_bas));
1864 double barycentre_prisme[3] =
1866 (centre_de_gravite[0] - x_gauche)/(x_droite - x_gauche),
1867 (0.5*y_min - 0.5*y_bas)/(y_haut - y_bas),
1868 (centre_de_gravite[2] - z_arriere)/(z_avant - z_arriere)
1871 assert(volume_prisme >= 0.);
1873 barycentre[0] += signe_princ * volume_prisme*barycentre_prisme[0];
1874 barycentre[1] += signe_princ * volume_prisme*barycentre_prisme[1];
1875 barycentre[2] += signe_princ * volume_prisme*barycentre_prisme[2];
1879 for (i = 0; i < nb_sommets_poly; i++)
1881 const int i_precedent = (i-1) < 0 ? nb_sommets_poly-1 : (i-1);
1884 if ((i == i_min) || (i_precedent == i_min))
1887 double tetraedre1_sommet1[3] = {poly_reelles(i,0), poly_reelles(i,1), poly_reelles(i,2)};
1888 double tetraedre1_sommet2[3] = {poly_reelles(i_precedent,0), poly_reelles(i_precedent,1), poly_reelles(i_precedent,2)};
1889 double tetraedre1_sommet3[3] = {poly_reelles(i_precedent,0), y_min, poly_reelles(i_precedent,2)};
1890 double tetraedre1_sommet4[3] = {poly_reelles(i_min,0), poly_reelles(i_min,1), poly_reelles(i_min,2)};
1891 double volume_tetraedre1 = std::fabs(FTd_calculer_volume_tetraedre(tetraedre1_sommet1, tetraedre1_sommet2, tetraedre1_sommet3, tetraedre1_sommet4));
1892 double barycentre_tetraedre1[3] =
1894 (0.25*(tetraedre1_sommet1[0] + tetraedre1_sommet2[0] + tetraedre1_sommet3[0]+ tetraedre1_sommet4[0]) - x_gauche)/(x_droite - x_gauche),
1895 (0.25*(tetraedre1_sommet1[1] + tetraedre1_sommet2[1] + tetraedre1_sommet3[1]+ tetraedre1_sommet4[1]) - y_bas)/(y_haut - y_bas),
1896 (0.25*(tetraedre1_sommet1[2] + tetraedre1_sommet2[2] + tetraedre1_sommet3[2]+ tetraedre1_sommet4[2]) - z_arriere)/(z_avant - z_arriere)
1899 double tetraedre2_sommet1[3] = {poly_reelles(i,0), poly_reelles(i,1), poly_reelles(i,2)};
1900 double tetraedre2_sommet2[3] = {poly_reelles(i_precedent,0), y_min, poly_reelles(i_precedent,2)};
1901 double tetraedre2_sommet3[3] = {poly_reelles(i,0), y_min, poly_reelles(i,2)};
1902 double tetraedre2_sommet4[3] = {poly_reelles(i_min,0), poly_reelles(i_min,1), poly_reelles(i_min,2)};
1903 double volume_tetraedre2 = std::fabs(FTd_calculer_volume_tetraedre(tetraedre2_sommet1, tetraedre2_sommet2, tetraedre2_sommet3, tetraedre2_sommet4));
1904 double barycentre_tetraedre2[3] =
1906 (0.25*(tetraedre2_sommet1[0] + tetraedre2_sommet2[0] + tetraedre2_sommet3[0]+ tetraedre2_sommet4[0]) - x_gauche)/(x_droite - x_gauche),
1907 (0.25*(tetraedre2_sommet1[1] + tetraedre2_sommet2[1] + tetraedre2_sommet3[1]+ tetraedre2_sommet4[1]) - y_bas)/(y_haut - y_bas),
1908 (0.25*(tetraedre2_sommet1[2] + tetraedre2_sommet2[2] + tetraedre2_sommet3[2]+ tetraedre2_sommet4[2]) - z_arriere)/(z_avant - z_arriere)
1911 assert(volume_tetraedre1 >= 0.);
1912 assert(volume_tetraedre2 >= 0.);
1915 barycentre[0] += signe_princ * (volume_tetraedre1*barycentre_tetraedre1[0] + volume_tetraedre2*barycentre_tetraedre2[0]);
1916 barycentre[1] += signe_princ * (volume_tetraedre1*barycentre_tetraedre1[1] + volume_tetraedre2*barycentre_tetraedre2[1]);
1917 barycentre[2] += signe_princ * (volume_tetraedre1*barycentre_tetraedre1[2] + volume_tetraedre2*barycentre_tetraedre2[2]);
1921 for (i = 0; i < nb_sommets_poly; i++)
1923 if (polygone_plan_coupe[i] == NUM_FACE_HAUT)
1925 const int i_precedent = (i-1) < 0 ? nb_sommets_poly-1 : (i-1);
1926 const int i_suivant = (i+1) >= nb_sommets_poly ? 0 : (i+1);
1928 const int coupe_face_haut = i_precedent;
1929 const int coupe_face_haut_p1 = i;
1931 int coupe_face_droite = -1;
1932 if (polygone_plan_coupe[i_precedent] == NUM_FACE_DROITE)
1933 coupe_face_droite = i_precedent;
1934 else if (polygone_plan_coupe[i_suivant] == NUM_FACE_DROITE)
1935 coupe_face_droite = i;
1940 (0.5*(poly_reelles(coupe_face_haut,0) + poly_reelles(coupe_face_haut_p1,0)) - x_gauche)
1942 * (poly_reelles(coupe_face_haut,2) - poly_reelles(coupe_face_haut_p1,2));
1944 volume += signe_compl0 * std::fabs(vol_compl0);
1946 double min_x_coupe_face_haut;
1947 double max_x_coupe_face_haut;
1948 double z_coupe_face_haut_min_x;
1949 double z_coupe_face_haut_max_x;
1950 if (poly_reelles(coupe_face_haut,0) > poly_reelles(coupe_face_haut_p1,0))
1952 min_x_coupe_face_haut = poly_reelles(coupe_face_haut_p1,0);
1953 max_x_coupe_face_haut = poly_reelles(coupe_face_haut,0);
1954 z_coupe_face_haut_min_x = poly_reelles(coupe_face_haut_p1,2);
1955 z_coupe_face_haut_max_x = poly_reelles(coupe_face_haut,2);
1959 min_x_coupe_face_haut = poly_reelles(coupe_face_haut,0);
1960 max_x_coupe_face_haut = poly_reelles(coupe_face_haut_p1,0);
1961 z_coupe_face_haut_min_x = poly_reelles(coupe_face_haut,2);
1962 z_coupe_face_haut_max_x = poly_reelles(coupe_face_haut_p1,2);
1966 double volume_prectangle = (min_x_coupe_face_haut - x_gauche) * (y_haut - y_bas) * std::fabs(poly_reelles(coupe_face_haut,2) - poly_reelles(coupe_face_haut_p1,2));
1967 double barycentre_prectangle[3] =
1969 (0.5*min_x_coupe_face_haut - 0.5*x_gauche)/(x_droite - x_gauche),
1971 (0.5*(poly_reelles(coupe_face_haut,2) + poly_reelles(coupe_face_haut_p1,2)) - z_arriere)/(z_avant - z_arriere)
1975 double volume_ptriangle = .5*(max_x_coupe_face_haut - min_x_coupe_face_haut) * (y_haut - y_bas) * std::fabs(poly_reelles(coupe_face_haut,2) - poly_reelles(coupe_face_haut_p1,2));
1976 double barycentre_ptriangle[3] =
1978 (min_x_coupe_face_haut + 1./3.*(max_x_coupe_face_haut - min_x_coupe_face_haut) - x_gauche)/(x_droite - x_gauche),
1980 (z_coupe_face_haut_max_x + 1./3.*(z_coupe_face_haut_min_x - z_coupe_face_haut_max_x) - z_arriere)/(z_avant - z_arriere)
1983 barycentre[0] += signe_compl0 * (volume_prectangle*barycentre_prectangle[0] + volume_ptriangle*barycentre_ptriangle[0]);
1984 barycentre[1] += signe_compl0 * (volume_prectangle*barycentre_prectangle[1] + volume_ptriangle*barycentre_ptriangle[1]);
1985 barycentre[2] += signe_compl0 * (volume_prectangle*barycentre_prectangle[2] + volume_ptriangle*barycentre_ptriangle[2]);
1987 if (coupe_face_droite >= 0)
1992 (x_droite - x_gauche)
1994 * (poly_reelles(coupe_face_droite,2) - z_arriere);
1996 volume += signe_compl1 * std::fabs(vol_compl1);
1997 barycentre[0] += signe_compl1 * std::fabs(vol_compl1) * .5;
1998 barycentre[1] += signe_compl1 * std::fabs(vol_compl1) * .5;
1999 barycentre[2] += signe_compl1 * std::fabs(vol_compl1) * (.5*poly_reelles(coupe_face_droite,2) - 0.5*z_arriere)/(z_avant - z_arriere);
2006 barycentre[0] /= v_elem;
2007 barycentre[1] /= v_elem;
2008 barycentre[2] /= v_elem;
2010 assert((volume >= -2) && (volume <= 2));
2014 barycentre[0] = 1./2.;
2015 barycentre[1] = 1./2.;
2016 barycentre[2] = 1./2.;
2021 barycentre[0] /= abs(volume);
2022 barycentre[1] /= abs(volume);
2023 barycentre[2] /= abs(volume);
2026 if (std::abs(volume) > 1e-11)
2028 assert(barycentre[0] != 0);
2029 assert(barycentre[1] != 0);
2030 assert(barycentre[2] != 0);
2031 assert(barycentre[0] != 1);
2032 assert(barycentre[1] != 1);
2033 assert(barycentre[2] != 1);
2037 return {volume, {barycentre[0], barycentre[1], barycentre[2]}};
2055 const DoubleTab& poly_reelles,
2056 const FTd_vecteur3& norme,
2057 const ArrOfInt& polygone_plan_coupe,
2058 double epsilon)
const
2071 int dir1 = select_dir(num_face, 2, 0, 1);
2072 int dir2 = select_dir(num_face, 1, 2, 0);
2075 double min1 = domaine_vf.
xv(domaine_vf.
elem_faces(num_element, dir1), dir1);
2076 double max1 = domaine_vf.
xv(domaine_vf.
elem_faces(num_element, dir1+3), dir1);
2079 double min2 = domaine_vf.
xv(domaine_vf.
elem_faces(num_element, dir2), dir2);
2080 double max2 = domaine_vf.
xv(domaine_vf.
elem_faces(num_element, dir2+3), dir2);
2083 double signe1, signe2;
2088 else if (norme[dir1]<0.)
2100 else if (norme[dir2]<0.)
2110 double aire_face = (max1 - min1) * (max2 - min2);
2111 assert(aire_face>0.);
2113 const int nb_sommets_poly = poly_reelles.
dimension(0);
2116 double barycentre[2] = {0};
2117 for (
int i = 0; i < nb_sommets_poly; i++)
2121 if (polygone_plan_coupe[i] == num_face)
2164 const int i_moins_1 = (i == 0) ? (nb_sommets_poly - 1) : (i-1);
2165 const int i_plus_1 = (i == (nb_sommets_poly-1)) ? 0 : (i+1);
2167 int i_long_side = poly_reelles(i,dir1) < poly_reelles(i_moins_1,dir1) ? i_moins_1 : i;
2168 int i_short_side = poly_reelles(i,dir1) < poly_reelles(i_moins_1,dir1) ? i : i_moins_1;
2171 double area_rectangle = abs(poly_reelles(i,dir2) - poly_reelles(i_moins_1,dir2)) * abs(poly_reelles(i_short_side,dir1) - min1);
2172 double barycentre_rectangle[2] =
2174 (.5*(poly_reelles(i_short_side,dir1) - min1))/(max1 - min1),
2175 (.5*(poly_reelles(i,dir2) + poly_reelles(i_moins_1,dir2)) - min2)/(max2 - min2)
2179 double area_triangle = abs(poly_reelles(i,dir2) - poly_reelles(i_moins_1,dir2)) * .5*(poly_reelles(i_long_side,dir1) - poly_reelles(i_short_side,dir1));
2180 double barycentre_triangle[2] =
2182 (poly_reelles(i_short_side,dir1) - min1 + 1./3.*(poly_reelles(i_long_side,dir1) - poly_reelles(i_short_side,dir1)))/(max1 - min1),
2183 (poly_reelles(i_long_side,dir2) - min2 + 1./3.*(poly_reelles(i_short_side,dir2) - poly_reelles(i_long_side,dir2)))/(max2 - min2)
2186 assert(area_rectangle + area_triangle >= 0.);
2189 aire += signe1 * (area_rectangle + area_triangle);
2190 barycentre[0] += signe1 * (area_triangle*barycentre_triangle[0] + area_rectangle*barycentre_rectangle[0]);
2191 barycentre[1] += signe1 * (area_triangle*barycentre_triangle[1] + area_rectangle*barycentre_rectangle[1]);
2194 int coupe_max1 = -1;
2195 if (polygone_plan_coupe[i_moins_1] == dir1+3)
2196 coupe_max1 = i_moins_1;
2197 else if (polygone_plan_coupe[i_plus_1] == dir1+3)
2200 if (coupe_max1 >= 0)
2203 double area_coupe_max1 = (max1 - min1) * abs(max2 - poly_reelles(coupe_max1,dir2));
2204 double barycentre_coupe_max1[2] =
2207 (.5*(poly_reelles(coupe_max1,dir2) + max2) - min2)/(max2 - min2)
2210 assert(area_coupe_max1 >= 0.);
2213 aire += signe2 * area_coupe_max1;
2214 barycentre[0] += barycentre_coupe_max1[0] * signe2 * area_coupe_max1;
2215 barycentre[1] += barycentre_coupe_max1[1] * signe2 * area_coupe_max1;
2223 barycentre[0] /= aire_face;
2224 barycentre[1] /= aire_face;
2229 barycentre[0] = 1./2.;
2230 barycentre[1] = 1./2.;
2235 barycentre[0] /= abs(aire);
2236 barycentre[1] /= abs(aire);
2239 return {aire, {barycentre[0], barycentre[1]}};
2257 const int num_element,
2258 double x0,
double y0,
double z0,
2259 double x1,
double y1,
double z1,
2260 double& pos_intersection)
const
2264 double t_sortie = 2.;
2266 int face_sortie = -1;
2268 for (
int face = 0; face < n_faces; face++)
2271 double signe =
calcul_eq_plan(domaine_vf, num_element, face, a, b, c, d);
2275 double f0 = (a * x0 + b * y0 + c * z0 + d) * signe;
2276 double f1 = (a * x1 + b * y1 + c * z1 + d) * signe;
2279 if (f0 < 0.) f0 = 0.;
2288 double t = t_sortie;
2289 if (std::fabs(f0-f1)>=DMINFLOAT) t = f0 / (f0-f1);
2298 if (face_sortie >= 0)
2300 face_sortie = domaine_vf.
elem_faces() (num_element, face_sortie);
2301 pos_intersection = t_sortie;
2327 const int num_element,
2328 double x0,
double y0,
double z0,
2329 double x1,
double y1,
double z1,
2330 double& x,
double& y,
double& z)
const
2345 const double f0 = a * x0 + b * y0 + c * z0 + d;
2349 const double f1 = a * x1 + b * y1 + c * z1 + d;
2356 const Domaine_VF& domaine_vf = refdomaine_vf_.valeur();
2358 assert(domaine_vf.
face_voisins()(face_0,0) == num_element
2359 || domaine_vf.
face_voisins()(face_0,1) == num_element);
2360 double pos_intersection = 1.;
2367 x = (1. - pos_intersection) * x0 + pos_intersection * x1;
2368 y = (1. - pos_intersection) * y0 + pos_intersection * y1;
2369 z = (1. - pos_intersection) * z0 + pos_intersection * z1;
2371 int face_bord_sortie;
2375 if (face_sortie >= 0 && face_sortie != face_0)
2377 const IntTab& face_sommets = domaine_vf.
face_sommets();
2387 int face_sortie_sommets[4];
2390 face_sortie_sommets[i] = face_sommets(face_sortie, i);
2395 int sommet_commun[2] = { -1, -1 };
2398 const int face_bord_sommet = face_sommets(face_0, i);
2403 s = face_sortie_sommets[j];
2404 if (s == face_bord_sommet)
2407 if (s == face_bord_sommet)
2409 if (sommet_commun[0] < 0)
2411 sommet_commun[0] = i;
2417 sommet_commun[1] = i;
2419 if (sommet_commun[0] > sommet_commun[1])
2421 sommet_commun[1] = sommet_commun[0];
2422 sommet_commun[0] = i;
2433 n = (sommet_commun[0] >= 0) ? 1 : 0;
2434 n += (sommet_commun[1] >= 0) ? 1 : 0;
2438 <<
" face de sortie non trouvee" << finl;
2446 const int nb_aretes_face = def_face_arete.
dimension(0);
2447 for (i = 0; i < nb_aretes_face; i++)
2450 int sommet0 = def_face_arete(i, 0);
2451 int sommet1 = def_face_arete(i, 1);
2453 if (sommet1 >= 0 && sommet1 < sommet0)
2460 if (sommet0 == sommet_commun[0] && sommet1 == sommet_commun[1])
2464 if (i >= nb_aretes_face)
2467 <<
" face de sortie non trouvee (2)" << finl;
2471 face_bord_sortie = connect_front.
faces_voisins()(face_0, i);
2476 face_bord_sortie = -1;
2478 return face_bord_sortie;
2488 const int num_element,
2489 double x,
double y,
double z)
const
2492 double f_min = DMAXFLOAT;
2493 for (
int face = 0; face < n_faces; face++)
2496 double signe =
calcul_eq_plan(domaine_vf, num_element, face, a, b, c, d);
2497 const double f = (a * x + b * y + c * z + d) * signe;
2531 const double x = x_;
2532 const double y = y_;
2533 const double z = z_;
2537 const double a = x * nx + y * ny + z * nz;
2546 double& nx_,
double& ny_,
double& nz_)
const
2548 const IntTab& face_voisins = refdomaine_vf_->face_voisins();
2550 if (face_voisins(num_face, 0) < 0)
2568 double& x,
double& y,
double& z)
const
2570 const int nb_faces = domaine_vf.
elem_faces().dimension(1);
2571 ArrOfDouble coef_lagrange(nb_faces);
2573 double somme_m_x = 0., somme_m_y = 0., somme_m_z = 0.;
2574 double norme_infty = 0.;
2575 for (i = 0; i < nb_faces; i++)
2577 double a = 0., b = 0., c = 0., d = 0.;
2585 double somme = a + b + c;
2586 norme_infty = (somme > norme_infty) ? somme : norme_infty;
2588 double norme1 = (somme_m_y > somme_m_x) ? somme_m_y : somme_m_x;
2589 norme1 = (somme_m_z > norme1) ? somme_m_z : norme1;
2590 const double rho = 1. / (norme1 * norme_infty);
2591 double solution_x = x;
2592 double solution_y = y;
2593 double solution_z = z;
2595 const int max_iter = 10;
2597 for (niter = 0; niter < max_iter; niter++)
2604 for (i = 0; i < nb_faces; i++)
2606 double a = 0., b = 0., c = 0., d = 0.;
2608 double dist = (a * solution_x + b * solution_y + c * solution_z + d) * s;
2614 double r = 2.0389787 * std::fabs(a) + 3.07687 * std::fabs(b) + 2.528764 * std::fabs(c);
2616 coef = (coef > 0.) ? coef : 0.;
2617 nsol_x += a * s * coef;
2618 nsol_y += b * s * coef;
2619 nsol_z += c * s * coef;
2620 coef_lagrange[i] = coef;
2623 dist_min = (dist < dist_min) ? dist : dist_min;
2627 solution_x = nsol_x * 0.5 + x;
2628 solution_y = nsol_y * 0.5 + y;
2629 solution_z = nsol_z * 0.5 + z;
2631 if (niter == max_iter)
2633 Journal(8) <<
"Parcours_interface::uzawa2("
2634 << x <<
" " << y <<
" " << z <<
") non converge. dist_min=" << dist_min << finl;
2649 const int nb_sommets = maillage.
nb_sommets();
2650 DoubleTab& sommets = maillage.
sommets_;
2652 const int dim3 = (sommets.
dimension(1) == 3);
2653 const Domaine_VF& domaine_vf = refdomaine_vf_.valeur();
2655 for (
int i = 0; i < nb_sommets; i++)
2664 const int elem = som_elem[i];
2665 double x = sommets(i, 0);
2666 double y = sommets(i, 1);
2667 double z = dim3 ? sommets(i, 2) : 0.;
2672 uzawa2(domaine_vf, elem, x, y, z);
2681 if (nb_som_tot_deplaces > 0)
2684 Journal(5) <<
"Parcours_interface::eloigner_sommets_des_faces deplacement " << count <<
" sommets" << finl;
2687 return nb_som_tot_deplaces;
void clearbit(int_t i) const
Met le bit e a 0.
const IntTab & faces_voisins() const
const IntTab & def_face_aretes() const
void echange_espace_virtuel(ArrOfDouble &tab) const
DoubleTab_t & les_sommets()
int nb_faces_elem(int=0) const
Renvoie le nombre de face de type i des elements geometriques constituants le domaine.
int nb_faces() const
renvoie le nombre global de faces.
virtual double face_normales(int face, int comp) const
double xv(int num_face, int k) const
int face_sommets(int i, int j) const
renvoie le numero du ieme sommet de la face num_face.
int nb_som_face() const
renvoie le nombre de sommets par face.
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
: class Intersections_Elem_Facettes
void ajoute_intersection(int num_facette, int num_element, double surface_intersection, double contrib_volume_phase1, double contrib_barycentre_phase1[3], double contrib_aire_faces_phase1[3], double contrib_barycentre_faces_phase1[3][2], double barycentre_u, double barycentre_v, double barycentre_w)
Ajoute une entree a la liste doublement chainee d'intersections entre la facette d'interface num_face...
void reset(int nb_elements_euleriens=0, int nb_facettes=0)
void get_liste_elements_traverses(int num_facette, ArrOfInt &liste_elements) const
: class Maillage_FT_Disc Cette classe decrit un maillage:
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,
int sommet_ligne_contact(int i) const
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...
const Desc_Structure_FT & desc_sommets() const
renvoie le descripteur des sommets (espace_distant/virtuel)
double calcul_normale_3D(int num_facette, double norme[3]) const
Intersections_Elem_Facettes intersections_elem_facettes_
int sommet_virtuel(int i) const
static double angle_bidim_axi()
renvoie l'angle solide qui sert a calculer les surfaces et les volumes en bidim_axi
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
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
double volume_tetraedre_reference(const DoubleTab &poly_reelles_ref, const FTd_vecteur3 &norme_ref, const FTd_vecteur3 ¢re_de_gravite_ref, double epsilon) const
Calcul de la contribution de volume d'une facette a la valeur de l'indicatrice dans le tetraedre de r...
double calcul_eq_plan(const Domaine_VF &domaine_vf, const int num_element, const int num_face_element, double &a, double &b, double &c, double &d) const
void calculer_normale_face_bord(int num_face, double x, double y, double z, double &nx_, double &ny_, double &nz_) const
double volume_tetraedre(const Domaine_VF &domaine_vf, int num_element, int num_facette, const Maillage_FT_Disc &maillage, const DoubleTab &poly_reelles, const FTd_vecteur3 ¢re_de_gravite, double epsilon) const
Calcul de la contribution de volume d'une facette a la valeur de l'indicatrice dans un element.
int calcul_intersection_facelem_2D(const Domaine_VF &domaine_vf, Maillage_FT_Disc &maillage, int num_facette, int num_element) const
void parcours_facette(const Domaine_VF &domaine_vf, Maillage_FT_Disc &maillage, ArrOfInt &echange_facettes_numfacette, ArrOfInt &echange_facettes_numelement, int num_facette, int element_depart) const
double Valeur_max_coordonnees_
static void calcul_inverse_matrice33(const FTd_matrice33 &matrice, FTd_matrice33 &matrice_inv)
Cette methode (statique) permet d'inverser une matrice 3x3.
int compteur_erreur_grossiere
void matrice_triangle(int num_element, FTd_vecteur2 &origine, FTd_matrice22 &matrice, double &surface) const
Calcul de la matrice 2x2 de transformation pour passer d'une coordonnee dans le repere (x,...
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...
double uzawa2(const Domaine_VF &domaine_vf, const int elem, double &x, double &y, double &z) const
Algorithme base sur une version initiale de Thomas (recode par BM) Ramene le point (x,...
DoubleTabFT equations_plans_faces_
const DoubleTab * domaine_sommets_ptr
enum Parcours_interface::@373266144117317220251337123122267336271346142325 type_element_
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).
double volume_rectangle_barycentre(const Domaine_VF &domaine_vf, int num_element, double x0, double y0, double x1, double y1, double epsilon, double liquid_barycentre[3]) const
void transformation_2d(const FTd_vecteur2 &origine, const FTd_matrice22 &matrice, double x, double y, double &u, double &v) const
Applique la transformation calculee par matrice_triangle a une coordonnee (x,y).
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,...
static void calcul_produit_matrice33_vecteur(const FTd_matrice33 &matrice, const FTd_vecteur3 &vect, FTd_vecteur3 &res)
Cette methode (statique) permet de calculer le produit d'une matrice 3x3 avec un vecteur 3.
int eloigner_sommets_des_faces(Maillage_FT_Disc &maillage) const
Pour chaque sommet, s'il est trop pres d'une face eulerienne, deplace le sommet pour l'en eloigner.
double Erreur_max_coordonnees_
ArrOfBit drapeaux_elements_parcourus_
double volume_triangle(const Domaine_VF &domaine_vf, int num_element, double x0, double y0, double x1, double y1, int plan_coupe0, int plan_coupe1) const
Calcul de la contribution de volume d'une facette a la valeur de l'indicatrice dans un element.
bool correction_parcours_thomas_
int calcul_intersection_facelem_3D(const Domaine_VF &domaine_vf, Maillage_FT_Disc &maillage, int num_facette, int num_element) const
Cette methode permet de calculer l'intersection entre une facette et un element du maillage eulerien.
void parcourir(Maillage_FT_Disc &maillage) const
CutCell_Properties volume_barycentre_hexaedre(const Domaine_VF &domaine_vf, int num_element, const DoubleTab &poly_reelles, const FTd_vecteur3 &norme, const FTd_vecteur3 ¢re_de_gravite, const ArrOfInt &polygone_plan_coupe, double epsilon) const
Calcul de la contribution de volume d'une facette a la valeur de l'indicatrice dans un element.
void update_erreur_coords_max()
const IntTab * domaine_elem_ptr
bool parcours_sans_tolerance_
double Erreur_relative_maxi_
double distance_sommet_faces(const Domaine_VF &domaine_vf, const int num_element, double x, double y, double z) const
CutFace_Properties coupe_face_rectangulaire(const Domaine_VF &domaine_vf, int num_element, int num_face, const DoubleTab &poly_reelles, const FTd_vecteur3 &norme, const ArrOfInt &polygone_plan_coupe, double epsilon) const
Calcul de la contribution d'une facette a l'indicatrice surfacique et au barycentre sur une face d'un...
void associer_connectivite_frontieres(const Connectivite_frontieres &connect)
void associer_domaine_dis(const Domaine_dis_base &domaine_dis)
Remplissage des variables persistantes de la classe (refdomaine_vf_, nb_faces_elem_,...
static int check_int_overflow(trustIdType)
static Sortie & Journal(int message_level=0)
Renvoie un objet statique de type Sortie qui sert de journal d'evenements.
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
static int me()
renvoie mon rang dans le groupe de communication courant.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Classe de base des flux de sortie.
void append_array(_TYPE_ valeur)
_SIZE_ size_array() const
void resize_array(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const