TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Parcours_interface.h
1/****************************************************************************
2* Copyright (c) 2015 - 2016, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#ifndef Parcours_interface_included
17#define Parcours_interface_included
18
19#include <ArrOfBit.h>
20#include <FTd_tools.h>
21#include <Maillage_FT_Disc.h>
22#include <TRUSTTabs_forward.h>
23#include <TRUST_Ref.h>
24
25
26class Zone_VF;
29
32
34{
35 Declare_instanciable_sans_constructeur(Parcours_interface);
36public:
38
39 void associer_domaine_dis(const Domaine_dis_base& domaine_dis);
41 int calculer_face_sortie_element(const Domaine_VF& domaine_vf,
42 const int num_element,
43 double x0, double y0, double z0,
44 double x1, double y1, double z1,
45 double& pos_intersection) const;
46 int calculer_sortie_face_bord(const int face_0,
47 const int num_element,
48 double x0, double y0, double z0,
49 double x1, double y1, double z1,
50 double& x, double& y, double& z) const;
51 double distance_sommet_faces(const Domaine_VF& domaine_vf,
52 const int num_element,
53 double x, double y, double z) const;
54
55 double get_erreur_geometrique() const;
60 void projeter_vecteur_sur_face(const int num_face, double& x_, double& y_, double& z_) const;
61
62 void calculer_normale_face_bord(int num_face, double x, double y, double z,
63 double& nx_, double& ny_, double& nz_) const;
64
65protected:
67 // Ceci est le point d'entree pour le parcours de l'interface.
68 // Appel autorise uniquement a Maillage_FT_Disc::parcourir_maillage()
69 void parcourir(Maillage_FT_Disc& maillage) const;
71
72 void parcours_facette(const Domaine_VF& domaine_vf,
73 Maillage_FT_Disc& maillage,
74 ArrOfInt& echange_facettes_numfacette,
75 ArrOfInt& echange_facettes_numelement,
76 int num_facette,
77 int element_depart) const;
78
79 int calcul_intersection_facelem_2D(const Domaine_VF& domaine_vf,
80 Maillage_FT_Disc& maillage,
81 int num_facette,
82 int num_element) const;
83
84 int calcul_intersection_facelem_3D(const Domaine_VF& domaine_vf,
85 Maillage_FT_Disc& maillage,
86 int num_facette,
87 int num_element) const;
88
89 double calcul_eq_plan(const Domaine_VF& domaine_vf,
90 const int num_element, const int num_face_element,
91 double& a, double& b, double& c, double& d) const;
92
93 // New function to get phase-barycenter in 2D or 2D-axi calculations.
94 // 3D equivalent not yet available (2020/10/26)
95 double volume_rectangle_barycentre(const Domaine_VF& domaine_vf, int num_element,
96 double x0, double y0, double x1, double y1,
97 double epsilon, double liquid_barycentre[3]) const;
98
99 double volume_triangle(const Domaine_VF& domaine_vf, int num_element,
100 double x0, double y0, double x1, double y1,
101 int plan_coupe0, int plan_coupe1) const;
102
103 double volume_tetraedre(const Domaine_VF& domaine_vf,
104 int num_element,
105 int num_facette,
106 const Maillage_FT_Disc& maillage,
107 const DoubleTab& poly_reelles,
108 const FTd_vecteur3& centre_de_gravite,
109 double epsilon) const;
110
111 double volume_tetraedre_reference(const DoubleTab& poly_reelles_ref,
112 const FTd_vecteur3& norme_ref,
113 const FTd_vecteur3& centre_de_gravite_ref,
114 double epsilon) const;
115
116 CutCell_Properties volume_barycentre_hexaedre(const Domaine_VF& domaine_vf, int num_element,
117 const DoubleTab& poly_reelles,
118 const FTd_vecteur3& norme,
119 const FTd_vecteur3& centre_de_gravite,
120 const ArrOfInt& polygone_plan_coupe,
121 double epsilon) const;
122
123 CutFace_Properties coupe_face_rectangulaire(const Domaine_VF& domaine_vf, int num_element,
124 int num_face,
125 const DoubleTab& poly_reelles,
126 const FTd_vecteur3& norme,
127 const ArrOfInt& polygone_plan_coupe,
128 double epsilon) const;
129
130 void matrice_triangle(int num_element,
131 FTd_vecteur2& origine,
132 FTd_matrice22& matrice,
133 double& surface) const;
134
135 void transformation_2d(const FTd_vecteur2& origine,
136 const FTd_matrice22& matrice,
137 double x, double y,
138 double& u, double& v) const;
139
140 static void calcul_inverse_matrice33(const FTd_matrice33& matrice, FTd_matrice33& matrice_inv);
141 static void calcul_produit_matrice33_vecteur(const FTd_matrice33& matrice, const FTd_vecteur3& vect, FTd_vecteur3& res);
142
143 // Variables persistantes de la classe :
144 OBS_PTR(Domaine_VF) refdomaine_vf_;
146 int nb_faces_elem_ = -123;
150
151 // Une tableau de taille nb_faces * 4 contenant les coefficients du
152 // plan contenant la face sous la forme
153 // a = equation_plans_faces_(num_face, 0)
154 // b = 1
155 // c = 2 = 0. en 2D.
156 // d = 3
157 // f(x,y,z) = a*x + b*y + c*z + d
158 // et le vecteur (a,b,c) unitaire colineaire a la normale, dirige
159 // de l'element face_voisins(num_face, 0) vers l'element face_voisins(num_face, 1)
161
162 //
163 // Variables temporaires utilisees dans l'algorithme de parcours
164 //
165 // A des fins de statistiques (voir "calcul_intersection_facelem_*"
166 // et "parcourir" )
167 mutable int compteur_erreur_grossiere= -123;
168
169 // Raccourcis vers les elements et les sommets du maillage eulerien
170 mutable const IntTab * domaine_elem_ptr = nullptr;
171 mutable const DoubleTab * domaine_sommets_ptr = nullptr;
172
173 // Marqueurs des elements deja visites :
175
176 // Si on constate un probleme de precision numerique, la correction
177 // suppose que les calculs geometriques ont la precision relative
178 // suivante:
180 // On suppose que toutes les coordonnees du domaine sont inferieures a cette valeur:
182 // Cette valeur est egale a Erreur_relative_maxi_ * valeur_max_coordonnees_ :
184
185 // Drapeau d'activation de la correction du parcours (par Thomas Fortin,
186 // pour corriger les problemes lies aux sommets qui tombent sur les faces du maillages eulerien
188 int eloigner_sommets_des_faces(Maillage_FT_Disc& maillage) const;
189 double uzawa2(const Domaine_VF& domaine_vf, const int elem,
190 double& x, double& y, double& z) const;
191
192 // Drapeau de suppression de la tolerance sur la position dedans/dehors des points
194};
195
196#endif
class Domaine_VF
Definition Domaine_VF.h:44
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
: class Maillage_FT_Disc Cette classe decrit un maillage:
void parcourir_maillage()
Remplit la structure intersections_elem_facettes_.
Objet_U()
Constructeur par defaut : attribue un numero d'identifiant unique a l'objet (object_id_),...
Definition Objet_U.cpp:55
double volume_tetraedre_reference(const DoubleTab &poly_reelles_ref, const FTd_vecteur3 &norme_ref, const FTd_vecteur3 &centre_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 &centre_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
static void calcul_inverse_matrice33(const FTd_matrice33 &matrice, FTd_matrice33 &matrice_inv)
Cette methode (statique) permet d'inverser une matrice 3x3.
int get_parcours_sans_tolerance() const
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.
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.
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 &centre_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.
OBS_PTR(Connectivite_frontieres) refconnect_front_
const IntTab * domaine_elem_ptr
OBS_PTR(Domaine_VF) refdomaine_vf_
int get_correction_parcours_thomas() const
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_,...