TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Domaine_VEF.h
1/****************************************************************************
2* Copyright (c) 2026, 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 Domaine_VEF_included
17#define Domaine_VEF_included
18
19#include <TRUSTArray_kokkos.tpp>
20#include <Elem_VEF_base.h>
21#include <TRUST_Deriv.h>
22#include <Domaine_VF.h>
23#include <kokkos++.h>
24
26class Geometrie;
27
28/*! @brief class Domaine_VEF
29 *
30 * Classe instanciable qui derive de Domaine_VF.
31 * Cette classe contient les informations geometriques que demande la methode des Volumes Elements Finis (element de Crouzeix-Raviart)
32 * La classe porte un certain nombre d'informations concernant les faces
33 * Dans cet ensemble de faces on fait figurer aussi les faces du bord et des joints. Pour manipuler les faces on distingue 2 categories:
34 * - les faces non standard qui sont sur un joint, un bord ou qui sont
35 * internes tout en appartenant a un element du bord
36 * - les faces standard qui sont les faces internes n'appartenant pas
37 * a un element du bord
38 * Cette distinction correspond au traitement des conditions aux limites:les faces standard ne "voient pas" les conditions aux limites.
39 * L'ensemble des faces est numerote comme suit:
40 * - les faces qui sont sur un Domaine_joint apparaissent en premier
41 * (dans l'ordre du vecteur les_joints)
42 * - les faces qui sont sur un Domaine_bord apparaissent ensuite
43 * (dans l'ordre du vecteur les_bords)
44 * - les faces internes non standard apparaissent ensuite
45 * - les faces internes standard en dernier
46 * Finalement on trouve regroupees en premier toutes les faces non standard qui vont necessiter un traitement particulier
47 * On distingue deux types d'elements
48 * - les elements non standard : ils ont au moins une face de bord
49 * - les elements standard : ils n'ont pas de face de bord
50 * Les elements standard (resp. les elements non standard) ne sont pas ranges de maniere consecutive dans l'objet Domaine. On utilise le tableau
51 * rang_elem_non_std pour acceder de maniere selective a l'un ou l'autre des types d'elements
52 */
54{
55 Declare_instanciable(Domaine_VEF);
56public:
57 void discretiser() override;
58 virtual void discretiser_suite(const VEF_discretisation&);
59 void discretiser_arete();
60
62 int lecture_ok_arete();
63 void verifie_ok_arete(int) const;
65
66 virtual void creer_tableau_p1bulle(Array_base&, RESIZE_OPTIONS opt = RESIZE_OPTIONS::COPY_INIT) const;
67
68 void swap(int, int, int);
69 void modifier_pour_Cl(const Conds_lim&) override;
70 void typer_elem(Domaine&) override;
72 void calculer_h_carre();
73 DoubleTab& vecteur_face_facette();
74
75 inline const Elem_VEF_base& type_elem() const { return type_elem_.valeur(); }
76 inline int nb_elem_Cl() const { return nb_elem() - nb_elem_std_; }
77 inline int nb_faces_joint() const { return 0; }
78 inline int nb_faces_std() const { return nb_faces_std_; }
79 inline int nb_elem_std() const { return nb_elem_std_; }
80 inline int premiere_face_std() const { return nb_faces() - nb_faces_std_; }
81 inline int nb_faces_non_std() const { return nb_faces() - nb_faces_std_; }
82 inline double carre_pas_du_maillage() const { return h_carre; }
83 inline const DoubleVect& carre_pas_maille() const { return h_carre_; }
84 inline auto& facette_normales() { return facette_normales_; }
85 inline const auto& facette_normales() const { return facette_normales_; }
86 inline IntVect& rang_elem_non_std() { return rang_elem_non_std_; }
87 inline const IntVect& rang_elem_non_std() const { return rang_elem_non_std_; }
88
89 inline double volume_au_sommet(int som) const { return volumes_som_[som]; }
90 inline const DoubleVect& volume_aux_sommets() const { return volumes_som_; }
91 inline int get_P1Bulle() const { assert(P1Bulle != -1); return P1Bulle; }
92 inline int get_alphaE() const { assert(alphaE != -1); return alphaE; }
93 inline int get_alphaS() const { assert(alphaS != -1); return alphaS; }
94 inline int get_alphaA() const { assert(alphaA != -1); return alphaA; }
95 inline int get_alphaRT() const { assert(alphaRT != -1); return alphaRT; }
96 inline int get_modif_div_face_dirichlet() const { assert(modif_div_face_dirichlet != -1); return modif_div_face_dirichlet; }
97 inline int get_cl_pression_sommet_faible() const { assert(cl_pression_sommet_faible != -1); return cl_pression_sommet_faible; }
98 inline const ArrOfInt& get_renum_arete_perio() const { return renum_arete_perio; }
99 inline const IntVect& get_ok_arete() const { return ok_arete; }
100 inline const DoubleVect& get_volumes_aretes() const { return volumes_aretes; }
101
102 inline virtual const MD_Vector& md_vector_p1b() const { assert(md_vector_p1b_); return md_vector_p1b_; }
103
104 inline int numero_premier_element() const;
105 inline int numero_premier_sommet() const;
106 inline int numero_premiere_arete() const;
107
108 inline double dist_face_elem0(int num_face,int n0) const override;
109 inline double dist_face_elem1(int num_face,int n1) const override;
110
111private:
112 double h_carre = 1.e30; // carre du pas du maillage
113 DoubleVect h_carre_; // carre du pas d'une maille
114 OWN_PTR(Elem_VEF_base) type_elem_; // type de l'element de discretisation
115 // normales aux faces des volumes entrelaces:
116#ifdef TRUST_USE_GPU
117 BigDoubleTab facette_normales_; // Cause size=nb_elem*6*dim may be > 2^31
118#else
119 DoubleTab facette_normales_;
120#endif
121 DoubleTab vecteur_face_facette_; // vecteur centre face->centre facette
122 IntVect orientation_;
123
124
125 DoubleVect volumes_som_, volumes_aretes;
126 ArrOfInt renum_arete_perio;
127 IntVect ok_arete;
128
129 int P1Bulle = -1, alphaE = -1, alphaS = -1, alphaA = -1;
130 int alphaRT = -1; // pour trio statio
131 int modif_div_face_dirichlet = -1;
132 int cl_pression_sommet_faible = -1; // determine si les cl de pression sont imposees de facon faible ou forte -> voir divergence et assembleur
133 // Descripteur pour les tableaux p1b (selon alphaE, alphaS et alphaA) (construit dans Domaine_VEF::discretiser())
134 MD_Vector md_vector_p1b_;
135
136 Sortie& ecrit(Sortie& os) const;
137};
138
139// Fonction Kokkos hors classe: En effet, sinon avec dom_VEF.oriente_normale(...), une instance de Domaine_VEF est copiee du host au device !
140KOKKOS_INLINE_FUNCTION int oriente_normale(int face_opp, int elem2, CIntTabView face_voisins)
141{
142 return (face_voisins(face_opp, 0) == elem2) ? 1 : -1;
143}
144
145// Methode pour tester:
146void exemple_champ_non_homogene(const Domaine_VEF&, DoubleTab&);
147
149{
150 if (!alphaE)
151 return -1;
152 else
153 return 0;
154}
156{
157 if (!alphaS)
158 return -1;
159 else if (!alphaE)
160 return 0;
161 else
162 return nb_elem_tot();
163}
165{
166 if (!alphaA)
167 return -1;
168 else if (!alphaE && !alphaS)
169 return 0;
170 else if (!alphaE && alphaS)
171 return nb_som_tot();
172 else if (!alphaS && alphaE)
173 return nb_elem_tot();
174 else
175 return nb_elem_tot() + nb_som_tot();
176}
177
178inline double Domaine_VEF::dist_face_elem0(int f,int e) const
179{
180 return std::fabs(dot(&xp_(e, 0), &face_normales_(f, 0), &xv_(f, 0))) / face_surfaces(f);
181}
182
183inline double Domaine_VEF::dist_face_elem1(int f,int e) const
184{
185 return std::fabs(dot(&xp_(e, 0), &face_normales_(f, 0), &xv_(f, 0))) / face_surfaces(f);
186}
187#endif
Empty class used as a base for all the arrays.
Definition Array_base.h:41
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
Definition Conds_lim.h:32
class Domaine_VEF
Definition Domaine_VEF.h:54
virtual void creer_tableau_p1bulle(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
const auto & facette_normales() const
Definition Domaine_VEF.h:85
void verifie_ok_arete(int) const
int numero_premiere_arete() const
int nb_faces_std() const
Definition Domaine_VEF.h:78
void construire_ok_arete()
const IntVect & get_ok_arete() const
Definition Domaine_VEF.h:99
int nb_faces_joint() const
Definition Domaine_VEF.h:77
IntVect & rang_elem_non_std()
Definition Domaine_VEF.h:86
void modifier_pour_Cl(const Conds_lim &) override
void swap(int, int, int)
double dist_face_elem1(int num_face, int n1) const override
int numero_premier_sommet() const
double dist_face_elem0(int num_face, int n0) const override
DoubleTab & vecteur_face_facette()
int nb_elem_Cl() const
Definition Domaine_VEF.h:76
int premiere_face_std() const
Definition Domaine_VEF.h:80
void calculer_volumes_entrelaces()
int numero_premier_element() const
int nb_faces_non_std() const
Definition Domaine_VEF.h:81
double carre_pas_du_maillage() const
Definition Domaine_VEF.h:82
const DoubleVect & get_volumes_aretes() const
void calculer_h_carre()
int get_modif_div_face_dirichlet() const
Definition Domaine_VEF.h:96
void typer_elem(Domaine &) override
int get_cl_pression_sommet_faible() const
Definition Domaine_VEF.h:97
const Elem_VEF_base & type_elem() const
Definition Domaine_VEF.h:75
const IntVect & rang_elem_non_std() const
Definition Domaine_VEF.h:87
int lecture_ok_arete()
int get_alphaA() const
Definition Domaine_VEF.h:94
const ArrOfInt & get_renum_arete_perio() const
Definition Domaine_VEF.h:98
virtual void discretiser_suite(const VEF_discretisation &)
void discretiser_arete()
virtual const MD_Vector & md_vector_p1b() const
int get_alphaRT() const
Definition Domaine_VEF.h:95
int nb_elem_std() const
Definition Domaine_VEF.h:79
const DoubleVect & volume_aux_sommets() const
Definition Domaine_VEF.h:90
int get_alphaS() const
Definition Domaine_VEF.h:93
const DoubleVect & carre_pas_maille() const
Definition Domaine_VEF.h:83
int get_alphaE() const
Definition Domaine_VEF.h:92
void construire_renum_arete_perio(const Conds_lim &)
auto & facette_normales()
Definition Domaine_VEF.h:84
void discretiser() override
double volume_au_sommet(int som) const
Definition Domaine_VEF.h:89
int get_P1Bulle() const
Definition Domaine_VEF.h:91
class Domaine_VF
Definition Domaine_VF.h:44
IntVect rang_elem_non_std_
Definition Domaine_VF.h:252
virtual const DoubleVect & face_surfaces() const
Definition Domaine_VF.h:51
int nb_faces() const
renvoie le nombre global de faces.
Definition Domaine_VF.h:471
DoubleTab xp_
Definition Domaine_VF.h:218
double dot(const double *a, const double *b, const double *ma=nullptr, const double *mb=nullptr) const
Definition Domaine_VF.h:696
DoubleTab xv_
Definition Domaine_VF.h:219
int nb_elem_std_
Definition Domaine_VF.h:250
int nb_faces_std_
Definition Domaine_VF.h:251
DoubleTab face_normales_
Definition Domaine_VF.h:212
int nb_elem_tot() const
int nb_som_tot() const
: Cette classe est un OWN_PTR mais l'objet pointe est partage entre plusieurs
Definition MD_Vector.h:48
Classe de base des flux de sortie.
Definition Sortie.h:52