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>
40static int flag_warning_code_missing=1;
50 param.lire_avec_accolades_depuis(is);
79 const DoubleTab& coord_som = refdomaine_vf_->domaine().coord_sommets();
91 assert(!refdomaine_vf_);
92 refdomaine_vf_ = domaine_vf;
105 const int nb_faces = domaine_vf.
nb_faces();
108 double a, b, c = 0., d;
109 double x, y = 0., z = 0.;
110 double inverse_norme;
112 for (i = 0; i < nb_faces; i++)
114 x = domaine_vf.
xv(i, 0);
126 y = domaine_vf.
xv(i, 1);
130 z = domaine_vf.
xv(i, 2);
132 inverse_norme = 1. / sqrt(a*a + b*b + c*c);
137 d = - (a * x + b * y + c * z);
145 if (nom_elem ==
"Rectangle")
147 else if (nom_elem ==
"Rectangle_2D_axi")
149 else if (nom_elem ==
"Triangle")
151 else if (nom_elem ==
"Tetraedre")
153 else if (nom_elem ==
"Hexaedre")
157 Cerr <<
"Parcours_interface::associer_domaine_vf\n";
158 Cerr <<
" Le type d'element " << nom_elem;
159 Cerr <<
" n'est pas reconnu !\n";
166 refconnect_front_ = connect;
181 assert(refdomaine_vf_);
183 const Domaine_VF& domaine_vf = refdomaine_vf_.valeur();
187 DoubleTab copie_sommets_maillage;
198 copie_sommets_maillage = maillage.
sommets();
204 const int nb_elem = domaine_vf.
nb_elem();
211 static ArrOfIntFT echange_facettes_numfacette;
212 static ArrOfIntFT echange_facettes_numelement;
215 static ArrOfIntFT facettes_a_traiter_numfacette;
216 static ArrOfIntFT facettes_a_traiter_numelement;
219 int nb_facettes_echangees = 0;
232 for (
int i = 0; i < nb_facettes; i++)
236 int premier_sommet = maillage.
facettes_(i,0);
237 int element_depart = maillage.
sommet_elem_[premier_sommet];
238 if (element_depart >= 0)
240 echange_facettes_numfacette,
241 echange_facettes_numelement,
248 int nb_facettes = facettes_a_traiter_numfacette.
size_array();
249 for (
int i = 0; i < nb_facettes; i++)
251 int num_facette = facettes_a_traiter_numfacette[i];
252 int element_depart = facettes_a_traiter_numelement[i];
254 echange_facettes_numfacette,
255 echange_facettes_numelement,
256 num_facette, element_depart);
263 echange_facettes_numelement,
264 facettes_a_traiter_numfacette,
265 facettes_a_traiter_numelement);
273 while (nb_facettes_echangees > 0);
285 copie_sommets_maillage.
resize(ni, nj);
287 maillage.
sommets_ = copie_sommets_maillage;
300static void effacer_drapeaux_elements_parcourus(
301 ArrOfBit& drapeaux_elements_parcourus,
302 const ArrOfInt& liste_elements_parcourus)
306 int n = liste_elements_parcourus.
size_array();
307 for (
int i = 0; i < n; i++)
309 const int element = liste_elements_parcourus[i];
310 drapeaux_elements_parcourus.
clearbit(element);
328 const int num_element,
329 const int num_face_element,
330 double& a,
double& b,
double& c,
double& d)
const
332 assert((&domaine_vf) == (&(refdomaine_vf_.valeur())));
334 const int num_face = domaine_vf.
elem_faces(num_element, num_face_element);
336 const int elem_voisin = domaine_vf.
face_voisins(num_face, 0);
343 if (elem_voisin == num_element)
354 ArrOfInt& echange_facettes_numfacette,
355 ArrOfInt& echange_facettes_numelement,
357 int element_depart)
const
364 static ArrOfIntFT liste_elements_parcourus;
365 static ArrOfIntFT elements_a_traiter;
366 static ArrOfIntFT new_elements_a_traiter;
373 liste_elements_parcourus);
374 int n = liste_elements_parcourus.
size_array();
375 for (
int i = 0; i < n; i++)
377 const int element = liste_elements_parcourus[i];
385 liste_elements_parcourus);
391 elements_a_traiter[0] = element_depart;
400 const int n = elements_a_traiter.
size_array();
404 for (
int i = 0; i < n; i++)
406 const int element = elements_a_traiter[i];
412 num_facette, element);
415 num_facette, element);
421 Journal() <<
"code_retour<0" << finl;
426 const int masque = 1 << j;
429 if ((code_retour & masque) == 0)
433 const int num_face = domaine_vf.
elem_faces(element, j);
434 const int elem_voisin = domaine_vf.
face_voisins(num_face, 0)
466 elements_a_traiter = new_elements_a_traiter;
472 liste_elements_parcourus);
488 int num_facette,
int num_element)
const
492 const int sommet0 = maillage.
facettes_(num_facette, 0);
493 const int sommet1 = maillage.
facettes_(num_facette, 1);
495 double x0 = maillage.
sommets_(sommet0, 0);
496 double y0 = maillage.
sommets_(sommet0, 1);
497 double x1 = maillage.
sommets_(sommet1, 0);
498 double y1 = maillage.
sommets_(sommet1, 1);
510 tolerance_comparaisons = 0.;
513 const double dx = x1 - x0;
514 const double dy = y1 - y0;
515 double l = sqrt(dx * dx + dy * dy);
533 int plan_coupe0 = -1;
534 int plan_coupe1 = -1;
544 double signe =
calcul_eq_plan(domaine_vf, num_element, num_plan, a, b, c, d);
546 const double f_0 = (a * x0 + b * y0 + d) * signe;
547 const double f_1 = (a * x1 + b * y1 + d) * signe;
549 const double f0 = f_0 * u0 + f_1 * (1. - u0);
550 const double f1 = f_0 * u1 + f_1 * (1. - u1);
551 const int s0_dehors = inf_strict(f0,Zero,tolerance_comparaisons) ? 1 : 0;
552 const int s1_dehors = inf_strict(f1,Zero,tolerance_comparaisons) ? 1 : 0;
554 if (s0_dehors + s1_dehors == 1)
558 double t = f1 / (f1 - f0);
565 u0 = u0 * t + u1 * (1.-t);
566 plan_coupe0 = num_plan;
570 u1 = u0 * t + u1 * (1.-t);
571 plan_coupe1 = num_plan;
574 else if (s0_dehors + s1_dehors == 2)
588 double u_centre = (u0 + u1) * 0.5;
590 double surface = u0 - u1;
592 if (inf_strict(surface,0.)) surface = 0.;
596 double aire_faces[3] = {0., 0., 0.};
597 double barycentre_faces[3][2] = {{0., 0.}, {0., 0.}, {0., 0.}};
599 double barycentre_phase1[3] = {0.,0.,0.};
607 double ix0 = x0 * u0 + x1 * (1.-u0);
608 double iy0 = y0 * u0 + y1 * (1.-u0);
609 double ix1 = x0 * u1 + x1 * (1.-u1);
610 double iy1 = y0 * u1 + y1 * (1.-u1);
620 if (flag_warning_code_missing)
622 Cerr <<
"WARNING : barycentre_phase1 not filled properly!!" << finl;
623 Cerr <<
"WARNING : Calculation of barycentre_phase1 not implemented yet." << finl;
627 plan_coupe0, plan_coupe1);
648 if (plan_coupe0 >= 0)
649 code_retour |= 1 << plan_coupe0;
650 if (plan_coupe1 >= 0)
651 code_retour |= 1 << plan_coupe1;
685 const int num_element,
686 const double x0,
const double y0,
687 const double x1,
const double y1,
688 const double epsilon,
689 double bary[3])
const
692 constexpr double un_tiers = 1. / 3.;
696 constexpr int NUM_FACE_GAUCHE = 0;
697 constexpr int NUM_FACE_BAS = 1;
698 constexpr int NUM_FACE_HAUT = 3;
699 constexpr int NUM_FACE_DROITE = 2;
701 const int face_bas = domaine_vf.
elem_faces(num_element, NUM_FACE_BAS);
702 const int face_gauche = domaine_vf.
elem_faces(num_element, NUM_FACE_GAUCHE);
703 const int face_droite = domaine_vf.
elem_faces(num_element, NUM_FACE_DROITE);
704 const int face_haut = domaine_vf.
elem_faces(num_element, NUM_FACE_HAUT);
705 const double y_bas = domaine_vf.
xv(face_bas, 1);
706 const double x_gauche = domaine_vf.
xv(face_gauche, 0);
707 const double x_droite = domaine_vf.
xv(face_droite, 0);
708 const double y_haut = domaine_vf.
xv(face_haut, 1);
711 double v_elem = (x_droite - x_gauche) * (y_haut - y_bas);
713 v_elem *= (x_droite + x_gauche) * 0.5 * angle_bidim_axi;
716 double v = (x0 - x1) * ((y0 + y1) * 0.5 - y_bas);
717 bary[0] = (x0 - x1) * ((y0 + y1) * 0.5 - y_bas);
718 bary[1] = (x0 - x1) * ((y0 + y1) * 0.5 - y_bas);
722 const double s0 = (x1 - x0) * (y0 - y_bas);
723 const double s1 = (x1 - x0) * (y1 - y_bas);
729 assert(s0 + s1 != 0);
733 v *= ((x0 + x0 + x1) * s0 + (x0 + x1 + x1) * s1) / (s0 + s1);
736 v *= un_tiers * angle_bidim_axi;
737 const double xx1 = x1*x1;
738 const double xx0 = x0*x0;
739 if (fabs(xx1-xx0)>DMINFLOAT)
740 bary[0] = 2.*un_tiers*(xx1*x1-xx0*x0)/(xx1-xx0);
745 bary[0] = (x0 + x1) *0.5;
747 bary[1] = ((y0 + y1) * 0.5 + y_bas) * 0.5;
751 double bary2[2] = {0.,0.};
752 if (y0 > y_haut - epsilon)
754 v2 = (x_droite - x0) * (y_haut - y_bas);
756 v2 *= (x_droite + x0) * 0.5 * angle_bidim_axi;
758 else if (y1 > y_haut - epsilon)
760 v2 = (x1 - x_gauche) * (y_haut - y_bas);
762 v2 *= (x1 + x_gauche) * 0.5 * angle_bidim_axi;
769 if (y0 > y_haut - epsilon)
773 double xx1 = x_droite*x_droite;
775 if (fabs(xx1-xx0)>DMINFLOAT)
776 bary2[0] = 2.*un_tiers*(xx1*x_droite-xx0*x0)/(xx1-xx0);
779 bary2[0] = (x_droite + x0) * 0.5;
781 bary2[1] = (y_haut + y_bas) * 0.5;
783 else if (y1 > y_haut - epsilon)
787 const double xx1 = x1*x1;
788 const double xx0 = x_gauche*x_gauche;
789 if (fabs(xx1-xx0)>DMINFLOAT)
790 bary2[0] = 2.*un_tiers*(xx0*x_gauche-xx1*x1)/(xx0-xx1);
793 bary2[0] = (x_gauche + x0) * 0.5;
795 bary2[1] = (y_haut + y_bas) * 0.5;
800 bary2[0] = (x_gauche + x_droite) * 0.5;
802 if (fabs(x_gauche-x_droite)>DMINFLOAT)
804 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);
806 bary2[1] = (y_haut + y_bas) * 0.5;
809 if ((v+v2)>DMINFLOAT)
810 for (
int i=0; i<2; i++)
811 bary[i] = (bary[i]*v + bary2[i]*v2) / (v+v2);
814 v = (v + v2) / v_elem;
838 FTd_vecteur2& origine,
839 FTd_matrice22& matrice,
840 double& surface)
const
842 const int s0 = (*domaine_elem_ptr)(num_element,0);
843 const int s1 = (*domaine_elem_ptr)(num_element,1);
844 const int s2 = (*domaine_elem_ptr)(num_element,2);
845 const double x0 = (*domaine_sommets_ptr)(s0, 0);
846 const double y0 = (*domaine_sommets_ptr)(s0, 1);
849 const double dx1 = (*domaine_sommets_ptr)(s1, 0) - x0;
850 const double dy1 = (*domaine_sommets_ptr)(s1, 1) - y0;
851 const double dx2 = (*domaine_sommets_ptr)(s2, 0) - x0;
852 const double dy2 = (*domaine_sommets_ptr)(s2, 1) - y0;
857 double det = dx1 * dy2 - dx2 * dy1;
859 double inv_det = 1. / det;
860 matrice[0][0] = dy2 * inv_det;
861 matrice[0][1] = - dx2 * inv_det;
862 matrice[1][0] = - dy1 * inv_det;
863 matrice[1][1] = dx1 * inv_det;
873 const FTd_matrice22& matrice,
875 double& u,
double& v)
const
879 u = matrice[0][0] * x + matrice[0][1] * y;
880 v = matrice[1][0] * x + matrice[1][1] * y;
909 double x0,
double y0,
910 double x1,
double y1,
912 int plan_coupe1)
const
916 static const int FACE_ZERO = 0;
918 double matrice[2][2];
919 double surface_triangle;
920 double u0, v0, u1, v1;
927 double vol = (u0 - u1) * (v0 + v1) * 0.5;
930 if (plan_coupe0 == FACE_ZERO)
931 vol += (1. - u0) * (1. - u0) * 0.5;
932 else if (plan_coupe1 == FACE_ZERO)
933 vol -= (1. - u1) * (1. - u1) * 0.5;
973 int num_facette,
int num_element)
const
981 static DoubleTabFT poly_(20,3);
982 static DoubleTabFT new_poly_(20,3);
985 static DoubleTabFT poly_reelles_(20,3);
997 double coord_som[3][3];
998 const int sommets[3] = { maillage.
facettes_(num_facette, 0),
1003 for (
int ii = 0; ii < 3; ii++)
1005 int s = sommets[ii];
1006 for (
int j = 0; j < 3; j++)
1008 coord_som[ii][j] = maillage.
sommets_(s, j);
1014 const double fact_mult = 1.;
1015 int isom,isom_s,isom_ss, kk;
1016 for (isom=0 ; isom<3 ; isom++)
1018 isom_s = (isom+1)%3;
1021 isom_ss = (isom_s+1)%3;
1024 coord_som[isom][kk] += fact_mult * (coord_som[isom][kk] -coord_som[isom_ss][kk]);
1025 coord_som[isom_s][kk] += fact_mult * (coord_som[isom_s][kk]-coord_som[isom_ss][kk]);
1037 tolerance_comparaisons = 0.;
1044 static ArrOfIntFT polygone_plan_coupe_(20);
1045 static ArrOfIntFT new_poly_plan_coupe_(20);
1047 polygone_plan_coupe_ = -1;
1061 double signe =
calcul_eq_plan(domaine_vf, num_element, num_plan, a, b, c, d);
1063 const double f0 = (a * coord_som[0][0] + b * coord_som[0][1] + c * coord_som[0][2] + d) * signe;
1064 const double f1 = (a * coord_som[1][0] + b * coord_som[1][1] + c * coord_som[1][2] + d) * signe;
1065 const double f2 = (a * coord_som[2][0] + b * coord_som[2][1] + c * coord_som[2][2] + d) * signe;
1068 const int nb_sommets_poly = poly_.
dimension(0);
1069 i = nb_sommets_poly - 1;
1070 double u = poly_(i,0);
1071 double v = poly_(i,1);
1072 double w = poly_(i,2);
1074 double f = f0 * u + f1 * v + f2 * w;
1075 int sommet_dehors = inf_strict(f,Zero,tolerance_comparaisons) ? 1 : 0;
1077 for (i = 0; i < nb_sommets_poly; i++)
1079 int sommet_precedent_dehors = sommet_dehors;
1087 f = f0 * u + f1 * v + f2 * w;
1088 sommet_dehors = inf_strict(f,Zero,tolerance_comparaisons) ? 1 : 0;
1089 if (sommet_dehors + sommet_precedent_dehors == 1)
1094 double t = f / (f - f_prec);
1101 double new_u = u_prec * t + u * (1.-t);
1102 double new_v = v_prec * t + v * (1.-t);
1103 double new_w = 1. - new_u - new_v;
1104 new_poly_(n,0) = new_u;
1105 new_poly_(n,1) = new_v;
1106 new_poly_(n,2) = new_w;
1108 const int num_plan_coupe = sommet_dehors ? polygone_plan_coupe_[i] : num_plan;
1111 if (! sommet_dehors)
1119 const int num_plan_coupe = polygone_plan_coupe_[i];
1130 polygone_plan_coupe_ = new_poly_plan_coupe_;
1133 const int nb_sommets_poly = poly_.
dimension(0);
1135 double aire_faces[3] = {0., 0., 0.};
1136 double barycentre_faces[3][2] = {{0., 0.}, {0., 0.}, {0., 0.}};
1139 double surface = 0.;
1140 double u_centre = 0.;
1141 double v_centre = 0.;
1143 i = nb_sommets_poly - 1;
1144 double u = poly_(i,0);
1145 double v = poly_(i,1);
1146 for (i = 0; i < nb_sommets_poly; i++)
1154 double contrib_surface = (v - v_prec) * (u + u_prec) * 0.5;
1155 if (contrib_surface!=0.)
1166 double B = std::max(u,u_prec);
1167 double b = std::min(u,u_prec);
1168 double h = std::fabs(v - v_prec);
1171 double CdGrX = b/2.;
1172 double CdGrY = (v+v_prec)/2.;
1173 double St = (B-b) * h/2.;
1174 double CdGtX = (2.*b+B)/3.;
1175 double CdGtY = v+v_prec;
1187 double uX = (Sr * CdGrX + St * CdGtX) / S;
1188 double vX = (Sr * CdGrY + St * CdGtY) / S;
1190 double contrib_u_centre = uX * contrib_surface;
1191 double contrib_v_centre = vX * contrib_surface;
1193 surface += contrib_surface;
1194 u_centre += contrib_u_centre;
1195 v_centre += contrib_v_centre;
1201 if (surface < 0.) surface = 0.;
1204 double barycentre_phase1[3] = {0.,0.,0.};
1208 if (sup_strict(surface,0.,tolerance_comparaisons))
1210 u_centre /= surface;
1211 v_centre /= surface;
1215 u_centre = v_centre = 1./3.;
1217 double w_centre = 1. - u_centre - v_centre;
1219 FTd_vecteur3 centre_de_gravite;
1221 for (
int ii = 0; ii < 3; ii++)
1223 centre_de_gravite[ii] =
1224 u_centre * coord_som[0][ii]
1225 + v_centre * coord_som[1][ii]
1226 + w_centre * coord_som[2][ii];
1230 poly_reelles_.
resize(nb_sommets_poly,3);
1231 for (i=0 ; i<nb_sommets_poly ; i++)
1235 poly_reelles_(i,k) =
1236 poly_(i,0) * coord_som[0][k]
1237 + poly_(i,1) * coord_som[1][k]
1238 + poly_(i,2) * coord_som[2][k];
1247 if (flag_warning_code_missing)
1249 Cerr <<
"WARNING : barycentre_phase1 not filled properly!!" << finl;
1250 Cerr <<
"WARNING : Calculation of barycentre_phase1 not implemented yet for TETRA." << finl;
1251 flag_warning_code_missing=0;
1264 norme, centre_de_gravite,
1265 polygone_plan_coupe_,
1267 volume = cut_cell_properties.
volume;
1268 barycentre_phase1[0] = cut_cell_properties.
barycentre[0];
1269 barycentre_phase1[1] = cut_cell_properties.
barycentre[1];
1270 barycentre_phase1[2] = cut_cell_properties.
barycentre[2];
1273 for (
int i_face = 0; i_face < 3; i_face++)
1281 polygone_plan_coupe_,
1283 aire_faces[i_face] = cut_face_properties.
area;
1284 barycentre_faces[i_face][0] = cut_face_properties.
barycentre[0];
1285 barycentre_faces[i_face][1] = cut_face_properties.
barycentre[1];
1305 1. - u_centre - v_centre);
1321 int code_retour = 0;
1323 for (i = 0; i < nb_sommets_poly; i++)
1325 const int plan_coupe = polygone_plan_coupe_[i];
1326 if (plan_coupe >= 0)
1327 code_retour |= 1 << plan_coupe;
1343 const double a00 = matrice[0][0];
1344 const double a01 = matrice[0][1];
1345 const double a02 = matrice[0][2];
1346 const double a10 = matrice[1][0];
1347 const double a11 = matrice[1][1];
1348 const double a12 = matrice[1][2];
1349 const double a20 = matrice[2][0];
1350 const double a21 = matrice[2][1];
1351 const double a22 = matrice[2][2];
1353 const double t4 = a00*a11;
1354 const double t6 = a00*a12;
1355 const double t8 = a01*a10;
1356 const double t10 = a02*a10;
1357 const double t12 = a01*a20;
1358 const double t14 = a02*a20;
1359 const double t = t4*a22-t6*a21-t8*a22+t10*a21+t12*a12-t14*a11;
1362 Cerr<<
"PB : matrice non inversible : t= "<<t<<finl<<
" matrice= "<<finl;
1364 for (i=0 ; i<3 ; i++)
1366 for (j=0 ; j<3 ; j++)
1368 Cerr<<
" "<<matrice[i][j];
1374 const double t17 = 1/(t);
1377 matrice_inv[0][0] = (a11*a22-a12*a21)*t17;
1378 matrice_inv[0][1] = -(a01*a22-a02*a21)*t17;
1379 matrice_inv[0][2] = -(-a01*a12+a02*a11)*t17;
1380 matrice_inv[1][0] = (-a10*a22+a12*a20)*t17;
1381 matrice_inv[1][1] = (a00*a22-t14)*t17;
1382 matrice_inv[1][2] = -(t6-t10)*t17;
1383 matrice_inv[2][0] = -(-a10*a21+a11*a20)*t17;
1384 matrice_inv[2][1] = -(a00*a21-t12)*t17;
1385 matrice_inv[2][2] = (t4-t8)*t17;
1398 for (i=0 ; i<3 ; i++)
1401 for (j=0 ; j<3 ; j++)
1403 x += matrice[i][j] * vect[j];
1427 const DoubleTab& poly_reelles,
1428 const FTd_vecteur3& centre_de_gravite,
1429 double epsilon)
const
1431 static const int SOM_Z = 0;
1432 static const int SOM_A = 1;
1433 static const int SOM_B = 2;
1434 static const int SOM_C = 3;
1436 const int som_Z = (*domaine_elem_ptr)(num_element,SOM_Z);
1437 const int som_A = (*domaine_elem_ptr)(num_element,SOM_A);
1438 const int som_B = (*domaine_elem_ptr)(num_element,SOM_B);
1439 const int som_C = (*domaine_elem_ptr)(num_element,SOM_C);
1441 FTd_matrice33 matrice, matrice_inv;
1462 const int nb_sommets_poly = poly_reelles.
dimension(0);
1463 DoubleTabFT poly_reelles_ref(nb_sommets_poly,3);
1464 FTd_vecteur3 poly, poly_ref;
1465 for (i=0 ; i<nb_sommets_poly ; i++)
1467 for (k=0 ; k<3 ; k++)
1469 poly[k] = poly_reelles(i,k) - (*domaine_sommets_ptr)(som_Z, k);
1472 for (k=0 ; k<3 ; k++)
1474 poly_reelles_ref(i,k) = poly_ref[k];
1479 FTd_vecteur3 normale_ref;
1480 double AB[3], AC[3], AB_ref[3], AC_ref[3];
1481 const int somA = maillage.
facettes_(num_facette, 0);
1482 const int somB = maillage.
facettes_(num_facette, 1);
1483 const int somC = maillage.
facettes_(num_facette, 2);
1492 normale_ref[0] = AB_ref[1]*AC_ref[2] - AB_ref[2]*AC_ref[1];
1493 normale_ref[1] = AB_ref[2]*AC_ref[0] - AB_ref[0]*AC_ref[2];
1494 normale_ref[2] = AB_ref[0]*AC_ref[1] - AB_ref[1]*AC_ref[0];
1498 FTd_vecteur3 centre_de_gravite_triangle_ref;
1499 static DoubleTabFT triangle_ref(3,3);
1500 double contrib_volume = 0., vol;
1503 triangle_ref(0,k) = poly_reelles_ref(0,k);
1505 for (i=1 ; i<nb_sommets_poly-1 ; i++)
1509 triangle_ref(1,k) = poly_reelles_ref(i,k);
1510 triangle_ref(2,k) = poly_reelles_ref(i+1,k);
1511 centre_de_gravite_triangle_ref[k] = (triangle_ref(0,k)+triangle_ref(1,k)+triangle_ref(2,k)) /3.;
1514 contrib_volume += vol;
1517 return contrib_volume;
1533 const FTd_vecteur3& norme_ref,
1534 const FTd_vecteur3& centre_de_gravite_ref,
1535 double epsilon)
const
1539 if (norme_ref[1]>0.)
1549 double v_elem = 0.5 /3.;
1552 const int nb_sommets_poly = poly_reelles_ref.
dimension(0);
1553 int k,i, i_prec = nb_sommets_poly -1;
1555 assert(nb_sommets_poly==3);
1557 FTd_vecteur3 normale_tr;
1558 double AB[3], AC[3];
1560 for (k=0 ; k<3 ; k++)
1562 AB[k] = poly_reelles_ref(1,k) - poly_reelles_ref(0,k);
1563 AC[k] = poly_reelles_ref(2,k) - poly_reelles_ref(0,k);
1566 normale_tr[0] = AB[1]*AC[2] - AB[2]*AC[1];
1567 normale_tr[1] = AB[2]*AC[0] - AB[0]*AC[2];
1568 normale_tr[2] = AB[0]*AC[1] - AB[1]*AC[0];
1569 const double aire_tr = normale_tr[0]*normale_tr[0]+normale_tr[1]*normale_tr[1]+normale_tr[2]*normale_tr[2];
1574 int coupe_face_opp = -1;
1575 int coupe_face_opp_p1 = -1;
1577 double aire_projetee = 0.;
1578 for (i=0 ; i<nb_sommets_poly ; i++)
1582 double f_prec = poly_reelles_ref(i_prec,0) + poly_reelles_ref(i_prec,1) + poly_reelles_ref(i_prec,2) - 1.;
1583 double f = poly_reelles_ref(i,0) + poly_reelles_ref(i,1) + poly_reelles_ref(i,2) - 1.;
1588 coupe_face_opp = i_prec;
1589 coupe_face_opp_p1 = i;
1594 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;
1596 aire_projetee += contrib_aire_projetee;
1601 if (aire_projetee!=0.)
1604 v = signe_princ * std::fabs(aire_projetee) * (centre_de_gravite_ref[1]);
1606 if (coupe_face_opp!=-1)
1615 FTd_vecteur3 som0,som1, proj_som0,proj_som1, proj2_som0,proj2_som1;
1619 som0[k] = poly_reelles_ref(coupe_face_opp,k);
1620 som1[k] = poly_reelles_ref(coupe_face_opp_p1,k);
1623 proj_som0[0] = som0[0];
1624 proj_som1[0] = som1[0];
1627 proj_som0[2] = som0[2];
1628 proj_som1[2] = som1[2];
1648 if (som0[0]<epsilon)
1655 assert((1. + som0[2]/som0[0]) !=0.);
1656 proj2_som0[0] = 1./ (1. + som0[2]/som0[0]);
1658 if (som1[0]<epsilon)
1665 assert((1. + som1[2]/som1[0]) !=0.);
1666 proj2_som1[0] = 1./ (1. + som1[2]/som1[0]);
1670 proj2_som0[2] = 1. - proj2_som0[0];
1671 proj2_som1[2] = 1. - proj2_som1[0];
1674 FTd_vecteur3 normale_plan_proj;
1675 normale_plan_proj[0] = -(proj_som1[2]-proj_som0[2]);
1676 normale_plan_proj[1] = 0.;
1677 normale_plan_proj[2] = proj_som1[0]-proj_som0[0];
1678 double pdtscal = 0.;
1682 vect[i] = proj2_som0[i]- proj_som0[i];
1683 pdtscal += vect[i]*vect[i];
1689 vect[i] = proj2_som1[i]- proj_som1[i];
1695 pdtscal += normale_plan_proj[i] * vect[i];
1697 double signe_2 = 0.;
1712 double l,L,base,h, vol;
1714 l = sqrt((som1[0]-som0[0])*(som1[0]-som0[0]) + (som1[2]-som0[2])*(som1[2]-som0[2]));
1715 L = 0.5* (som0[1] + som1[1]);
1720 double L2 = (proj2_som0[0]-som0[0])*(proj2_som0[0]-som0[0]) + (proj2_som0[2]-som0[2])*(proj2_som0[2]-som0[2]);
1721 double l2 = ((som1[0]-som0[0])*(proj2_som0[0]-som0[0]) + (som1[2]-som0[2])*(proj2_som0[2]-som0[2])) / l;
1734 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]);
1735 base = std::fabs(base * 0.5);
1774 const DoubleTab& poly_reelles,
1775 const FTd_vecteur3& norme,
1776 const FTd_vecteur3& centre_de_gravite,
1777 const ArrOfInt& polygone_plan_coupe,
1778 double epsilon)
const
1781 constexpr int NUM_FACE_GAUCHE = 0;
1782 constexpr int NUM_FACE_DROITE = 3;
1783 constexpr int NUM_FACE_BAS = 1;
1784 constexpr int NUM_FACE_HAUT = 4;
1785 constexpr int NUM_FACE_ARRIERE = 2;
1786 constexpr int NUM_FACE_AVANT = 5;
1787 int face_bas = domaine_vf.
elem_faces(num_element, NUM_FACE_BAS);
1788 int face_haut = domaine_vf.
elem_faces(num_element, NUM_FACE_HAUT);
1789 int face_gauche = domaine_vf.
elem_faces(num_element, NUM_FACE_GAUCHE);
1790 int face_droite = domaine_vf.
elem_faces(num_element, NUM_FACE_DROITE);
1791 int face_arriere = domaine_vf.
elem_faces(num_element, NUM_FACE_ARRIERE);
1792 int face_avant = domaine_vf.
elem_faces(num_element, NUM_FACE_AVANT);
1793 double y_bas = domaine_vf.
xv(face_bas, 1);
1794 double y_haut = domaine_vf.
xv(face_haut, 1);
1795 double x_gauche = domaine_vf.
xv(face_gauche, 0);
1796 double x_droite = domaine_vf.
xv(face_droite, 0);
1797 double z_arriere = domaine_vf.
xv(face_arriere, 2);
1798 double z_avant = domaine_vf.
xv(face_avant, 2);
1801 double signe_princ, signe_compl0,signe_compl1;
1806 else if (norme[1]<0.)
1818 else if (norme[0]<0.)
1830 else if (norme[2]<0.)
1840 double v_elem = (x_droite - x_gauche) * (y_haut - y_bas) * (z_avant - z_arriere);
1843 const int nb_sommets_poly = poly_reelles.
dimension(0);
1844 int i, i_prec = nb_sommets_poly -1;
1846 double aire_projetee = 0.;
1847 for (i=0 ; i<nb_sommets_poly ; i++)
1851 double contrib_aire_projetee = (poly_reelles(i,2) - poly_reelles(i_prec,2)) * ((poly_reelles(i,0) + poly_reelles(i_prec,0)) * 0.5);
1853 aire_projetee += contrib_aire_projetee;
1860 volume += signe_princ * std::fabs(aire_projetee) * (centre_de_gravite[1] - y_bas);
1863 double barycentre[3] = {0};
1864 assert(nb_sommets_poly >=2);
1866 for (i = 1; i < nb_sommets_poly; i++)
1868 i_min = poly_reelles(i,1) < poly_reelles(i_min,1) ? i : i_min;
1870 double y_min = poly_reelles(i_min,1);
1873 double volume_prisme = std::fabs(aire_projetee * (y_min - y_bas));
1874 double barycentre_prisme[3] =
1876 (centre_de_gravite[0] - x_gauche)/(x_droite - x_gauche),
1877 (0.5*y_min - 0.5*y_bas)/(y_haut - y_bas),
1878 (centre_de_gravite[2] - z_arriere)/(z_avant - z_arriere)
1881 assert(volume_prisme >= 0.);
1883 barycentre[0] += signe_princ * volume_prisme*barycentre_prisme[0];
1884 barycentre[1] += signe_princ * volume_prisme*barycentre_prisme[1];
1885 barycentre[2] += signe_princ * volume_prisme*barycentre_prisme[2];
1889 for (i = 0; i < nb_sommets_poly; i++)
1891 const int i_precedent = (i-1) < 0 ? nb_sommets_poly-1 : (i-1);
1894 if ((i == i_min) || (i_precedent == i_min))
1897 double tetraedre1_sommet1[3] = {poly_reelles(i,0), poly_reelles(i,1), poly_reelles(i,2)};
1898 double tetraedre1_sommet2[3] = {poly_reelles(i_precedent,0), poly_reelles(i_precedent,1), poly_reelles(i_precedent,2)};
1899 double tetraedre1_sommet3[3] = {poly_reelles(i_precedent,0), y_min, poly_reelles(i_precedent,2)};
1900 double tetraedre1_sommet4[3] = {poly_reelles(i_min,0), poly_reelles(i_min,1), poly_reelles(i_min,2)};
1901 double volume_tetraedre1 = std::fabs(FTd_calculer_volume_tetraedre(tetraedre1_sommet1, tetraedre1_sommet2, tetraedre1_sommet3, tetraedre1_sommet4));
1902 double barycentre_tetraedre1[3] =
1904 (0.25*(tetraedre1_sommet1[0] + tetraedre1_sommet2[0] + tetraedre1_sommet3[0]+ tetraedre1_sommet4[0]) - x_gauche)/(x_droite - x_gauche),
1905 (0.25*(tetraedre1_sommet1[1] + tetraedre1_sommet2[1] + tetraedre1_sommet3[1]+ tetraedre1_sommet4[1]) - y_bas)/(y_haut - y_bas),
1906 (0.25*(tetraedre1_sommet1[2] + tetraedre1_sommet2[2] + tetraedre1_sommet3[2]+ tetraedre1_sommet4[2]) - z_arriere)/(z_avant - z_arriere)
1909 double tetraedre2_sommet1[3] = {poly_reelles(i,0), poly_reelles(i,1), poly_reelles(i,2)};
1910 double tetraedre2_sommet2[3] = {poly_reelles(i_precedent,0), y_min, poly_reelles(i_precedent,2)};
1911 double tetraedre2_sommet3[3] = {poly_reelles(i,0), y_min, poly_reelles(i,2)};
1912 double tetraedre2_sommet4[3] = {poly_reelles(i_min,0), poly_reelles(i_min,1), poly_reelles(i_min,2)};
1913 double volume_tetraedre2 = std::fabs(FTd_calculer_volume_tetraedre(tetraedre2_sommet1, tetraedre2_sommet2, tetraedre2_sommet3, tetraedre2_sommet4));
1914 double barycentre_tetraedre2[3] =
1916 (0.25*(tetraedre2_sommet1[0] + tetraedre2_sommet2[0] + tetraedre2_sommet3[0]+ tetraedre2_sommet4[0]) - x_gauche)/(x_droite - x_gauche),
1917 (0.25*(tetraedre2_sommet1[1] + tetraedre2_sommet2[1] + tetraedre2_sommet3[1]+ tetraedre2_sommet4[1]) - y_bas)/(y_haut - y_bas),
1918 (0.25*(tetraedre2_sommet1[2] + tetraedre2_sommet2[2] + tetraedre2_sommet3[2]+ tetraedre2_sommet4[2]) - z_arriere)/(z_avant - z_arriere)
1921 assert(volume_tetraedre1 >= 0.);
1922 assert(volume_tetraedre2 >= 0.);
1925 barycentre[0] += signe_princ * (volume_tetraedre1*barycentre_tetraedre1[0] + volume_tetraedre2*barycentre_tetraedre2[0]);
1926 barycentre[1] += signe_princ * (volume_tetraedre1*barycentre_tetraedre1[1] + volume_tetraedre2*barycentre_tetraedre2[1]);
1927 barycentre[2] += signe_princ * (volume_tetraedre1*barycentre_tetraedre1[2] + volume_tetraedre2*barycentre_tetraedre2[2]);
1931 for (i = 0; i < nb_sommets_poly; i++)
1933 if (polygone_plan_coupe[i] == NUM_FACE_HAUT)
1935 const int i_precedent = (i-1) < 0 ? nb_sommets_poly-1 : (i-1);
1936 const int i_suivant = (i+1) >= nb_sommets_poly ? 0 : (i+1);
1938 const int coupe_face_haut = i_precedent;
1939 const int coupe_face_haut_p1 = i;
1941 int coupe_face_droite = -1;
1942 if (polygone_plan_coupe[i_precedent] == NUM_FACE_DROITE)
1943 coupe_face_droite = i_precedent;
1944 else if (polygone_plan_coupe[i_suivant] == NUM_FACE_DROITE)
1945 coupe_face_droite = i;
1950 (0.5*(poly_reelles(coupe_face_haut,0) + poly_reelles(coupe_face_haut_p1,0)) - x_gauche)
1952 * (poly_reelles(coupe_face_haut,2) - poly_reelles(coupe_face_haut_p1,2));
1954 volume += signe_compl0 * std::fabs(vol_compl0);
1956 double min_x_coupe_face_haut;
1957 double max_x_coupe_face_haut;
1958 double z_coupe_face_haut_min_x;
1959 double z_coupe_face_haut_max_x;
1960 if (poly_reelles(coupe_face_haut,0) > poly_reelles(coupe_face_haut_p1,0))
1962 min_x_coupe_face_haut = poly_reelles(coupe_face_haut_p1,0);
1963 max_x_coupe_face_haut = poly_reelles(coupe_face_haut,0);
1964 z_coupe_face_haut_min_x = poly_reelles(coupe_face_haut_p1,2);
1965 z_coupe_face_haut_max_x = poly_reelles(coupe_face_haut,2);
1969 min_x_coupe_face_haut = poly_reelles(coupe_face_haut,0);
1970 max_x_coupe_face_haut = poly_reelles(coupe_face_haut_p1,0);
1971 z_coupe_face_haut_min_x = poly_reelles(coupe_face_haut,2);
1972 z_coupe_face_haut_max_x = poly_reelles(coupe_face_haut_p1,2);
1976 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));
1977 double barycentre_prectangle[3] =
1979 (0.5*min_x_coupe_face_haut - 0.5*x_gauche)/(x_droite - x_gauche),
1981 (0.5*(poly_reelles(coupe_face_haut,2) + poly_reelles(coupe_face_haut_p1,2)) - z_arriere)/(z_avant - z_arriere)
1985 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));
1986 double barycentre_ptriangle[3] =
1988 (min_x_coupe_face_haut + 1./3.*(max_x_coupe_face_haut - min_x_coupe_face_haut) - x_gauche)/(x_droite - x_gauche),
1990 (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)
1993 barycentre[0] += signe_compl0 * (volume_prectangle*barycentre_prectangle[0] + volume_ptriangle*barycentre_ptriangle[0]);
1994 barycentre[1] += signe_compl0 * (volume_prectangle*barycentre_prectangle[1] + volume_ptriangle*barycentre_ptriangle[1]);
1995 barycentre[2] += signe_compl0 * (volume_prectangle*barycentre_prectangle[2] + volume_ptriangle*barycentre_ptriangle[2]);
1997 if (coupe_face_droite >= 0)
2002 (x_droite - x_gauche)
2004 * (poly_reelles(coupe_face_droite,2) - z_arriere);
2006 volume += signe_compl1 * std::fabs(vol_compl1);
2007 barycentre[0] += signe_compl1 * std::fabs(vol_compl1) * .5;
2008 barycentre[1] += signe_compl1 * std::fabs(vol_compl1) * .5;
2009 barycentre[2] += signe_compl1 * std::fabs(vol_compl1) * (.5*poly_reelles(coupe_face_droite,2) - 0.5*z_arriere)/(z_avant - z_arriere);
2016 barycentre[0] /= v_elem;
2017 barycentre[1] /= v_elem;
2018 barycentre[2] /= v_elem;
2020 assert((volume >= -2) && (volume <= 2));
2024 barycentre[0] = 1./2.;
2025 barycentre[1] = 1./2.;
2026 barycentre[2] = 1./2.;
2031 barycentre[0] /= abs(volume);
2032 barycentre[1] /= abs(volume);
2033 barycentre[2] /= abs(volume);
2036 if (std::abs(volume) > 1e-11)
2038 assert(barycentre[0] != 0);
2039 assert(barycentre[1] != 0);
2040 assert(barycentre[2] != 0);
2041 assert(barycentre[0] != 1);
2042 assert(barycentre[1] != 1);
2043 assert(barycentre[2] != 1);
2047 return {volume, {barycentre[0], barycentre[1], barycentre[2]}};
2065 const DoubleTab& poly_reelles,
2066 const FTd_vecteur3& norme,
2067 const ArrOfInt& polygone_plan_coupe,
2068 double epsilon)
const
2081 int dir1 = select_dir(num_face, 2, 0, 1);
2082 int dir2 = select_dir(num_face, 1, 2, 0);
2085 double min1 = domaine_vf.
xv(domaine_vf.
elem_faces(num_element, dir1), dir1);
2086 double max1 = domaine_vf.
xv(domaine_vf.
elem_faces(num_element, dir1+3), dir1);
2089 double min2 = domaine_vf.
xv(domaine_vf.
elem_faces(num_element, dir2), dir2);
2090 double max2 = domaine_vf.
xv(domaine_vf.
elem_faces(num_element, dir2+3), dir2);
2093 double signe1, signe2;
2098 else if (norme[dir1]<0.)
2110 else if (norme[dir2]<0.)
2120 double aire_face = (max1 - min1) * (max2 - min2);
2121 assert(aire_face>0.);
2123 const int nb_sommets_poly = poly_reelles.
dimension(0);
2126 double barycentre[2] = {0};
2127 for (
int i = 0; i < nb_sommets_poly; i++)
2131 if (polygone_plan_coupe[i] == num_face)
2174 const int i_moins_1 = (i == 0) ? (nb_sommets_poly - 1) : (i-1);
2175 const int i_plus_1 = (i == (nb_sommets_poly-1)) ? 0 : (i+1);
2177 int i_long_side = poly_reelles(i,dir1) < poly_reelles(i_moins_1,dir1) ? i_moins_1 : i;
2178 int i_short_side = poly_reelles(i,dir1) < poly_reelles(i_moins_1,dir1) ? i : i_moins_1;
2181 double area_rectangle = abs(poly_reelles(i,dir2) - poly_reelles(i_moins_1,dir2)) * abs(poly_reelles(i_short_side,dir1) - min1);
2182 double barycentre_rectangle[2] =
2184 (.5*(poly_reelles(i_short_side,dir1) - min1))/(max1 - min1),
2185 (.5*(poly_reelles(i,dir2) + poly_reelles(i_moins_1,dir2)) - min2)/(max2 - min2)
2189 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));
2190 double barycentre_triangle[2] =
2192 (poly_reelles(i_short_side,dir1) - min1 + 1./3.*(poly_reelles(i_long_side,dir1) - poly_reelles(i_short_side,dir1)))/(max1 - min1),
2193 (poly_reelles(i_long_side,dir2) - min2 + 1./3.*(poly_reelles(i_short_side,dir2) - poly_reelles(i_long_side,dir2)))/(max2 - min2)
2196 assert(area_rectangle + area_triangle >= 0.);
2199 aire += signe1 * (area_rectangle + area_triangle);
2200 barycentre[0] += signe1 * (area_triangle*barycentre_triangle[0] + area_rectangle*barycentre_rectangle[0]);
2201 barycentre[1] += signe1 * (area_triangle*barycentre_triangle[1] + area_rectangle*barycentre_rectangle[1]);
2204 int coupe_max1 = -1;
2205 if (polygone_plan_coupe[i_moins_1] == dir1+3)
2206 coupe_max1 = i_moins_1;
2207 else if (polygone_plan_coupe[i_plus_1] == dir1+3)
2210 if (coupe_max1 >= 0)
2213 double area_coupe_max1 = (max1 - min1) * abs(max2 - poly_reelles(coupe_max1,dir2));
2214 double barycentre_coupe_max1[2] =
2217 (.5*(poly_reelles(coupe_max1,dir2) + max2) - min2)/(max2 - min2)
2220 assert(area_coupe_max1 >= 0.);
2223 aire += signe2 * area_coupe_max1;
2224 barycentre[0] += barycentre_coupe_max1[0] * signe2 * area_coupe_max1;
2225 barycentre[1] += barycentre_coupe_max1[1] * signe2 * area_coupe_max1;
2233 barycentre[0] /= aire_face;
2234 barycentre[1] /= aire_face;
2239 barycentre[0] = 1./2.;
2240 barycentre[1] = 1./2.;
2245 barycentre[0] /= abs(aire);
2246 barycentre[1] /= abs(aire);
2249 return {aire, {barycentre[0], barycentre[1]}};
2267 const int num_element,
2268 double x0,
double y0,
double z0,
2269 double x1,
double y1,
double z1,
2270 double& pos_intersection)
const
2274 double t_sortie = 2.;
2276 int face_sortie = -1;
2278 for (
int face = 0; face < n_faces; face++)
2281 double signe =
calcul_eq_plan(domaine_vf, num_element, face, a, b, c, d);
2285 double f0 = (a * x0 + b * y0 + c * z0 + d) * signe;
2286 double f1 = (a * x1 + b * y1 + c * z1 + d) * signe;
2289 if (f0 < 0.) f0 = 0.;
2298 double t = t_sortie;
2299 if (std::fabs(f0-f1)>=DMINFLOAT) t = f0 / (f0-f1);
2308 if (face_sortie >= 0)
2310 face_sortie = domaine_vf.
elem_faces() (num_element, face_sortie);
2311 pos_intersection = t_sortie;
2337 const int num_element,
2338 double x0,
double y0,
double z0,
2339 double x1,
double y1,
double z1,
2340 double& x,
double& y,
double& z)
const
2355 const double f0 = a * x0 + b * y0 + c * z0 + d;
2359 const double f1 = a * x1 + b * y1 + c * z1 + d;
2366 const Domaine_VF& domaine_vf = refdomaine_vf_.valeur();
2368 assert(domaine_vf.
face_voisins()(face_0,0) == num_element
2369 || domaine_vf.
face_voisins()(face_0,1) == num_element);
2370 double pos_intersection = 1.;
2377 x = (1. - pos_intersection) * x0 + pos_intersection * x1;
2378 y = (1. - pos_intersection) * y0 + pos_intersection * y1;
2379 z = (1. - pos_intersection) * z0 + pos_intersection * z1;
2381 int face_bord_sortie;
2385 if (face_sortie >= 0 && face_sortie != face_0)
2387 const IntTab& face_sommets = domaine_vf.
face_sommets();
2397 int face_sortie_sommets[4];
2400 face_sortie_sommets[i] = face_sommets(face_sortie, i);
2405 int sommet_commun[2] = { -1, -1 };
2408 const int face_bord_sommet = face_sommets(face_0, i);
2413 s = face_sortie_sommets[j];
2414 if (s == face_bord_sommet)
2417 if (s == face_bord_sommet)
2419 if (sommet_commun[0] < 0)
2421 sommet_commun[0] = i;
2427 sommet_commun[1] = i;
2429 if (sommet_commun[0] > sommet_commun[1])
2431 sommet_commun[1] = sommet_commun[0];
2432 sommet_commun[0] = i;
2443 n = (sommet_commun[0] >= 0) ? 1 : 0;
2444 n += (sommet_commun[1] >= 0) ? 1 : 0;
2448 <<
" face de sortie non trouvee" << finl;
2456 const int nb_aretes_face = def_face_arete.
dimension(0);
2457 for (i = 0; i < nb_aretes_face; i++)
2460 int sommet0 = def_face_arete(i, 0);
2461 int sommet1 = def_face_arete(i, 1);
2463 if (sommet1 >= 0 && sommet1 < sommet0)
2470 if (sommet0 == sommet_commun[0] && sommet1 == sommet_commun[1])
2474 if (i >= nb_aretes_face)
2477 <<
" face de sortie non trouvee (2)" << finl;
2481 face_bord_sortie = connect_front.
faces_voisins()(face_0, i);
2486 face_bord_sortie = -1;
2488 return face_bord_sortie;
2498 const int num_element,
2499 double x,
double y,
double z)
const
2502 double f_min = DMAXFLOAT;
2503 for (
int face = 0; face < n_faces; face++)
2506 double signe =
calcul_eq_plan(domaine_vf, num_element, face, a, b, c, d);
2507 const double f = (a * x + b * y + c * z + d) * signe;
2541 const double x = x_;
2542 const double y = y_;
2543 const double z = z_;
2547 const double a = x * nx + y * ny + z * nz;
2556 double& nx_,
double& ny_,
double& nz_)
const
2558 const IntTab& face_voisins = refdomaine_vf_->face_voisins();
2560 if (face_voisins(num_face, 0) < 0)
2578 double& x,
double& y,
double& z)
const
2580 const int nb_faces = domaine_vf.
elem_faces().dimension(1);
2581 ArrOfDouble coef_lagrange(nb_faces);
2583 double somme_m_x = 0., somme_m_y = 0., somme_m_z = 0.;
2584 double norme_infty = 0.;
2585 for (i = 0; i < nb_faces; i++)
2587 double a = 0., b = 0., c = 0., d = 0.;
2595 double somme = a + b + c;
2596 norme_infty = (somme > norme_infty) ? somme : norme_infty;
2598 double norme1 = (somme_m_y > somme_m_x) ? somme_m_y : somme_m_x;
2599 norme1 = (somme_m_z > norme1) ? somme_m_z : norme1;
2600 const double rho = 1. / (norme1 * norme_infty);
2601 double solution_x = x;
2602 double solution_y = y;
2603 double solution_z = z;
2605 const int max_iter = 10;
2607 for (niter = 0; niter < max_iter; niter++)
2614 for (i = 0; i < nb_faces; i++)
2616 double a = 0., b = 0., c = 0., d = 0.;
2618 double dist = (a * solution_x + b * solution_y + c * solution_z + d) * s;
2624 double r = 2.0389787 * std::fabs(a) + 3.07687 * std::fabs(b) + 2.528764 * std::fabs(c);
2626 coef = (coef > 0.) ? coef : 0.;
2627 nsol_x += a * s * coef;
2628 nsol_y += b * s * coef;
2629 nsol_z += c * s * coef;
2630 coef_lagrange[i] = coef;
2633 dist_min = (dist < dist_min) ? dist : dist_min;
2637 solution_x = nsol_x * 0.5 + x;
2638 solution_y = nsol_y * 0.5 + y;
2639 solution_z = nsol_z * 0.5 + z;
2641 if (niter == max_iter)
2643 Journal(8) <<
"Parcours_interface::uzawa2("
2644 << x <<
" " << y <<
" " << z <<
") non converge. dist_min=" << dist_min << finl;
2659 const int nb_sommets = maillage.
nb_sommets();
2660 DoubleTab& sommets = maillage.
sommets_;
2662 const int dim3 = (sommets.
dimension(1) == 3);
2663 const Domaine_VF& domaine_vf = refdomaine_vf_.valeur();
2665 for (
int i = 0; i < nb_sommets; i++)
2674 const int elem = som_elem[i];
2675 double x = sommets(i, 0);
2676 double y = sommets(i, 1);
2677 double z = dim3 ? sommets(i, 2) : 0.;
2682 uzawa2(domaine_vf, elem, x, y, z);
2691 if (nb_som_tot_deplaces > 0)
2694 Journal(5) <<
"Parcours_interface::eloigner_sommets_des_faces deplacement " << count <<
" sommets" << finl;
2697 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
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_
enum Parcours_interface::@024335122030014246330314174240305140101340342271 type_element_
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