TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Domaine_Poly_base.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_Poly_base_included
17#define Domaine_Poly_base_included
18
19#include <Domaine_Poly_tools.h>
20#include <Static_Int_Lists.h>
21#include <Elem_poly_base.h>
22#include <Elem_poly_base.h>
23#include <TRUST_Deriv.h>
24#include <TRUSTLists.h>
25#include <Periodique.h>
26#include <Domaine_VF.h>
27#include <TRUSTTrav.h>
28#include <Conds_lim.h>
29#include <Domaine.h>
30#include <Lapack.h>
31#include <math.h>
32#include <vector>
33#include <string>
34#include <array>
35#include <map>
36
37class Geometrie;
38extern bool polymac_flica5;
39/*! @brief class Domaine_Poly_base
40 *
41 * Classe instanciable qui derive de Domaine_VF.
42 * Cette classe contient les informations geometriques que demande
43 * la methode des Volumes Elements Finis (element de Crouzeix-Raviart)
44 * La classe porte un certain nombre d'informations concernant les faces
45 * Dans cet ensemble de faces on fait figurer aussi les faces du bord et
46 * des joints. Pour manipuler les faces on distingue 2 categories:
47 * - les faces non standard qui sont sur un joint, un bord ou qui sont
48 * internes tout en appartenant a un element du bord
49 * - les faces standard qui sont les faces internes n'appartenant pas
50 * a un element du bord
51 * Cette distinction correspond au traitement des conditions aux limites:les
52 * faces standard ne "voient pas" les conditions aux limites.
53 * L'ensemble des faces est numerote comme suit:
54 * - les faces qui sont sur un Domaine_joint apparaissent en premier
55 * (dans l'ordre du vecteur les_joints)
56 * - les faces qui sont sur un Domaine_bord apparaissent ensuite
57 * (dans l'ordre du vecteur les_bords)
58 * - les faces internes non standard apparaissent ensuite
59 * - les faces internes standard en dernier
60 * Finalement on trouve regroupees en premier toutes les faces non standard
61 * qui vont necessiter un traitement particulier
62 * On distingue deux types d'elements
63 * - les elements non standard : ils ont au moins une face de bord
64 * - les elements standard : ils n'ont pas de face de bord
65 * Les elements standard (resp. les elements non standard) ne sont pas ranges
66 * de maniere consecutive dans l'objet Domaine. On utilise le tableau
67 * rang_elem_non_std pour acceder de maniere selective a l'un ou
68 * l'autre des types d'elements
69 *
70 */
72{
73 Declare_base(Domaine_Poly_base);
74public :
75 void typer_elem(Domaine& domaine_geom) override;
76 void discretiser() override;
77 virtual void calculer_volumes_entrelaces() { }
78 void discretiser_aretes();
79
80 void orthocentrer();
81
82 inline const DoubleVect& longueur_aretes() const { return longueur_aretes_; }
83 inline const DoubleTab& ta() const { return ta_; }
84
85 void modifier_pour_Cl(const Conds_lim& ) override;
86
87 inline const Elem_poly_base& type_elem() const { return type_elem_.valeur(); }
88 inline int nb_elem_Cl() const { return nb_elem() - nb_elem_std_; }
89 inline int nb_faces_joint() const { return 0; /* return nb_faces_joint_; A FAIRE */ }
90 inline int nb_faces_std() const { return nb_faces_std_; }
91 inline int nb_elem_std() const { return nb_elem_std_; }
92 inline double carre_pas_du_maillage() const { return h_carre; }
93 inline double carre_pas_maille(int i) const { return h_carre_(i); }
94 inline IntVect& rang_elem_non_std() { return rang_elem_non_std_; }
95 inline const IntVect& rang_elem_non_std() const { return rang_elem_non_std_; }
96
97 virtual void calculer_h_carre();
98
99 inline DoubleTab& volumes_entrelaces_dir() { return volumes_entrelaces_dir_; } // renvoie le tableau des volumes entrelaces par cote.
100 inline const DoubleTab& volumes_entrelaces_dir() const { return volumes_entrelaces_dir_; }
101
102 //equivalent de dot(), mais pour le produit (a - ma).nu.(b - mb)
103 inline double nu_dot(const DoubleTab* nu, int e, int n, const double *a, const double *b, const double *ma = nullptr, const double *mb = nullptr) const;
104
105 inline double dist_norm(int num_face) const override;
106 inline double dist_norm_bord(int num_face) const override;
107 DoubleVect& dist_norm_bord(DoubleVect& , const Nom& nom_bord) const;
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 inline double dist_face_elem0_period(int num_face,int n0,double l) const override;
111 inline double dist_face_elem1_period(int num_face,int n1,double l) const override;
112
113 void detecter_faces_non_planes() const;
114
115 //faces "equivalentes" : equiv(f, 0/1, i) = face equivalente a e_f(f_e(f, 0/1), i) de l'autre cote, -1 si il n'y en a pas
116 const IntTab& equiv() const;
117 virtual void init_equiv() const = 0;
118
119 //connectivite sommet-elements
120 const Static_Int_Lists& som_elem() const;
121
122 //indexation dans des tableaux de type (element, sommet) et (element, arete)
123 const IntTab& elem_som_d() const; //entree du sommet les_elems(e, i) de l'element e : elem_som_d()(e) + i
124 const IntTab& elem_arete_d() const; //entree de l'arete elem_arete(e, i) de l'element e : elem_arete_d()(e) + i
125
126 //pour chaque element, repartition de son volume entre chacun de ses sommets
127 const DoubleTab& vol_elem_som() const;
128 //pour chaque sommet, produit porosite * volume
129 const DoubleTab& pvol_som(const DoubleVect& poro) const;
130
131 //som_arete[som1][som2 > som1] -> arete correspondant a (som1, som2)
132 std::vector<std::map<int, int> > som_arete;
133
134 //MD_Vectors pour Champ_Elem_PolyMAC_CDO (elems + faces) et pour Champ_Face_PolyMAC_CDO (faces + aretes)
136
138 void fill_normales();
139 void recalculer_xv();
140
141protected:
142 void verifier_type_elem() const;
144
145 double h_carre = DMAXFLOAT; // carre du pas du maillage
146 DoubleVect h_carre_; // carre du pas d'une maille
147 OWN_PTR(Elem_poly_base) type_elem_; // type de l'element de discretisation
148
149 Sortie& ecrit(Sortie& os) const;
150
151 mutable IntTab equiv_;
152 mutable Static_Int_Lists som_elem_;
153 mutable IntTab elem_som_d_, elem_arete_d_;
154 mutable DoubleTab vol_elem_som_, pvol_som_;
155
156 DoubleVect longueur_aretes_; //longueur des aretes
157 mutable DoubleTab ta_; //vecteurs tangents aux aretes
158};
159
160/* equivalent du dist_norm_bord du VDF */
161inline double Domaine_Poly_base::dist_norm_bord(int f) const
162{
163 assert(face_voisins(f, 1) == -1);
164 return std::fabs(dot(&xp_(face_voisins(f, 0), 0), &face_normales_(f, 0), &xv_(f, 0))) / face_surfaces(f);
165}
166
167inline double Domaine_Poly_base::dist_norm(int f) const
168{
169 return std::fabs(dot(&xp_(face_voisins(f, 0), 0), &face_normales_(f, 0), &xp_(face_voisins(f, 1), 0))) / face_surfaces(f);
170}
171
172inline double Domaine_Poly_base::dist_face_elem0(int f,int e) const
173{
174 return std::fabs(dot(&xp_(e, 0), &face_normales_(f, 0), &xv_(f, 0))) / face_surfaces(f);
175}
176
177inline double Domaine_Poly_base::dist_face_elem1(int f,int e) const
178{
179 return std::fabs(dot(&xp_(e, 0), &face_normales_(f, 0), &xv_(f, 0))) / face_surfaces(f);
180}
181
182inline double Domaine_Poly_base::dist_face_elem0_period(int num_face,int n0,double l) const
183{
184 abort();
185 return 0;
186}
187
188inline double Domaine_Poly_base::dist_face_elem1_period(int num_face,int n1,double l) const
189{
190 abort();
191 return 0;
192}
193
194//renvoie le produit scalaire a.nu.b quelle que soient le nombre de composantes et le type de tenseur de nu
195inline double Domaine_Poly_base::nu_dot(const DoubleTab* nu, int e, int n, const double *a, const double *b, const double *ma, const double *mb) const
196{
197 if (!nu) return dot(a, b, ma, mb);
198 int d, db, D = dimension;
199 double resu = 0;
200 if (nu->nb_dim() == 2) resu += (*nu)(e, n) * dot(a, b, ma, mb); //isotrope
201 else if (nu->nb_dim() == 3)
202 for (d = 0; d < D; d++) //anisotrope diagonal
203 resu += (*nu)(e, n, d) * (a[d] - (ma ? ma[d] : 0)) * (b[d] - (mb ? mb[d] : 0));
204 else for (d = 0; d < D; d++)
205 for (db = 0; db < D; db++)
206 resu += (*nu)(e, n, d, db) * (a[d] - (ma ? ma[d] : 0)) * (b[db] - (mb ? mb[db] : 0));
207 return resu;
208}
209
210#endif /* Domaine_Poly_base_included */
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
Definition Conds_lim.h:32
class Domaine_Poly_base
double dist_face_elem0(int num_face, int n0) const override
const IntVect & rang_elem_non_std() const
void detecter_faces_non_planes() const
const Elem_poly_base & type_elem() const
const DoubleTab & vol_elem_som() const
virtual void calculer_volumes_entrelaces()
const DoubleVect & longueur_aretes() const
double dist_face_elem1_period(int num_face, int n1, double l) const override
int nb_faces_joint() const
double dist_face_elem0_period(int num_face, int n0, double l) const override
void modifier_pour_Cl(const Conds_lim &) override
double dist_face_elem1(int num_face, int n1) const override
void verifier_type_elem() const
const Static_Int_Lists & som_elem() const
double dist_norm(int num_face) const override
const IntTab & elem_som_d() const
OWN_PTR(Elem_poly_base) type_elem_
DoubleTab & volumes_entrelaces_dir()
virtual void init_equiv() const =0
double carre_pas_maille(int i) const
const IntTab & equiv() const
std::vector< std::map< int, int > > som_arete
const DoubleTab & ta() const
double carre_pas_du_maillage() const
void discretiser() override
const DoubleTab & pvol_som(const DoubleVect &poro) const
const DoubleTab & volumes_entrelaces_dir() const
virtual void calculer_h_carre()
Static_Int_Lists som_elem_
IntVect & rang_elem_non_std()
double dist_norm_bord(int num_face) const override
double nu_dot(const DoubleTab *nu, int e, int n, const double *a, const double *b, const double *ma=nullptr, const double *mb=nullptr) const
void corriger_face_voisins_sur_les_faces_virtuelles()
const IntTab & elem_arete_d() const
Sortie & ecrit(Sortie &os) const
void typer_elem(Domaine &domaine_geom) override
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
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
DoubleTab volumes_entrelaces_dir_
Definition Domaine_VF.h:211
IntTab & face_voisins() override
renvoie le tableaux des volumes des connectivites face elements cf au dessus.
Definition Domaine_VF.h:426
: Cette classe est un OWN_PTR mais l'objet pointe est partage entre plusieurs
Definition MD_Vector.h:48
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
static int dimension
Definition Objet_U.h:99
friend class Sortie
Definition Objet_U.h:75
static void abort()
Routine de sortie de Trio-U sur une erreur abort().
Definition Process.cpp:570
int nb_dim() const
Definition TRUSTTab.h:199