TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
DG_discretisation.cpp
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#include <DG_discretisation.h>
17#include <Domaine_DG.h>
18#include <Champ_Fonc_Tabule.h>
19#include <Milieu_base.h>
20#include <Equation_base.h>
21#include <Champ_Uniforme.h>
22#include <Champ_Inc_base.h>
23#include <Schema_Temps_base.h>
24#include <Motcle.h>
25#include <Domaine_Cl_DG.h>
26#include <Option_DG.h>
27#include <Quadrature_base.h>
28#include <Quadrature_Ord1_Polygone.h>
29#include <Quadrature_Ord3_Polygone.h>
30#include <Quadrature_Ord5_Polygone.h>
31
32Implemente_instanciable(DG_discretisation, "DG", Discret_Thyd);
33// XD DG discretisation_base DG INHERITS_BRACE DG discretization
34
35
37{
38 return Discret_Thyd::readOn(s);
39}
40
41Sortie& DG_discretisation::printOn(Sortie& s) const { return s; }
42
43/*! @brief Discretisation of a field for DG formulation
44 *
45 * TODO, refactor this after stokes. And decide if we want to put this on Option_DG or not
46 *
47 * La directive est un Motcle comme "vitesse", "pression",
48 * "temperature", "champ_elem" (cree un champ de type P0), ...
49 * Cette methode determine le type du champ a creer en fonction du type d'element
50 * et de la directive de discretisation. Elle determine ensuite le nombre de ddl
51 * et fixe l'ensemble des parametres du champ (type, nb_compo, nb_ddl, nb_pas_dt,
52 * nom(s), unite(s) et nature du champ) et associe la Domaine_dis au champ.
53 * Voir le code pour avoir la correspondance entre les directives et
54 * le type de champ cree.
55 *
56 */
57void DG_discretisation::discretiser_champ(const Motcle& directive, const Domaine_dis_base& dom_dis, Nature_du_champ nature, const Noms& noms, const Noms& unites, int nb_comp, int nb_pas_dt,
58 double temps, OWN_PTR(Champ_Inc_base)& champ, const Nom& sous_type) const
59{
60 Motcles motcles(7);
61 motcles[0] = "vitesse"; // Choix standard pour la vitesse
62 motcles[1] = "pression"; // Choix standard pour la pression
63 motcles[2] = "temperature"; // Choix standard pour la temperature
64 motcles[3] = "divergence_vitesse"; // Le type de champ obtenu en calculant div v
65 motcles[4] = "gradient_pression"; // Le type de champ obtenu en calculant grad P
66 motcles[5] = "champ_elem"; // Creer un champ aux elements (de type P0)
67 motcles[6] = "champ_sommets"; // Creer un champ aux sommets (type P1)
68 // Le type de champ de vitesse depend du type d'element :
69// Nom type_champ_vitesse("Champ_Face_DG");
70 Nom type_elem("Champ_Elem_DG");
71 Nom type;
72 int nb_basis_func = 0; // Valeur par defaut du nombre de composantes
73 int rang = motcles.search(directive);
74 const int order_DG = Option_DG::Get_order_for(noms[0]);
75 switch(rang)
76 {
77 case 0:
78 case 1:
79 case 2:
80 case 3:
81 case 4:
82 case 5:
83 type = type_elem;
84 nb_basis_func = Option_DG::Nb_col_from_order(order_DG);
85 break;
86 default:
87 assert(rang < 0);
88 break;
89 }
90
91 if (directive == DEMANDE_DESCRIPTION)
92 Cerr << "DG discretisation : " << motcles;
93
94 if (sous_type != NOM_VIDE)
95 rang = verifie_sous_type(type, sous_type, directive);
96
97 // Si on n'a pas compris la directive (ou si c'est une demande_description)
98 // alors on appelle l'ancetre :
99 if (rang < 0)
100 {
101 Discret_Thyd::discretiser_champ(directive, dom_dis, nature, noms, unites, nb_comp, nb_pas_dt, temps, champ);
102 return;
103 }
104
105 // Calcul du nombre de ddl
106 int nb_ddl = 0;
107 if (type.debute_par(type_elem))
108 nb_ddl = dom_dis.nb_elem();
109 else
110 assert(0);
111
112 creer_champ(champ, dom_dis, type, noms[0], unites[0], nb_comp*nb_basis_func, nb_ddl, nb_pas_dt, temps, directive, que_suis_je());
113
114 if (nature == multi_scalaire)
115 {
116 throw;
117 }
118
119 if (nb_comp == 1)
120 switch(order_DG)
121 {
122 case 0:
123 champ->fixer_nature_du_champ(scalaire);
124 break;
125 case 1:
126 champ->fixer_nature_du_champ(basis_function_order_1_scalar);
127 break;
128 case 2:
129 champ->fixer_nature_du_champ(basis_function_order_2_scalar);
130 break;
131 default:
132 assert(0);
133 }
134 else
135 switch(order_DG)
136 {
137 case 0:
138 champ->fixer_nature_du_champ(vectoriel);
139 break;
140 case 1:
141 champ->fixer_nature_du_champ(basis_function_order_1_vectorial);
142 break;
143 case 2:
144 champ->fixer_nature_du_champ(basis_function_order_2_vectorial);
145 break;
146 default:
147 assert(0);
148 }
149
150
151}
152
153/*! @brief Idem que DG_discretisation::discretiser_champ(.
154 *
155 * .. , Champ_Inc)
156 *
157 */
158void DG_discretisation::discretiser_champ(const Motcle& directive, const Domaine_dis_base& z, Nature_du_champ nature, const Noms& noms, const Noms& unites, int nb_comp, double temps,
159 OWN_PTR(Champ_Fonc_base)& champ) const
160{
161 discretiser_champ_fonc_don(directive, z, nature, noms, unites, nb_comp, temps, champ);
162}
163
164/*! @brief Idem que DG_discretisation::discretiser_champ(.
165 *
166 * .. , Champ_Inc)
167 *
168 */
169void DG_discretisation::discretiser_champ(const Motcle& directive, const Domaine_dis_base& z, Nature_du_champ nature, const Noms& noms, const Noms& unites, int nb_comp, double temps,
170 OWN_PTR(Champ_Don_base)& champ) const
171{
172 discretiser_champ_fonc_don(directive, z, nature, noms, unites, nb_comp, temps, champ);
173}
174
175/*! @brief Idem que DG_discretisation::discretiser_champ(.
176 *
177 * .. , Champ_Inc) Traitement commun aux champ_fonc et champ_don.
178 * Cette methode est privee (passage d'un Objet_U pas propre vu
179 * de l'exterieur ...)
180 *
181 */
182void DG_discretisation::discretiser_champ_fonc_don(const Motcle& directive, const Domaine_dis_base& z, Nature_du_champ nature, const Noms& noms, const Noms& unites, int nb_comp, double temps,
183 Objet_U& champ) const
184{
185 // Deux pointeurs pour acceder facilement au champ_don ou au champ_fonc, suivant le type de l'objet champ.
186 OWN_PTR(Champ_Fonc_base) * champ_fonc = dynamic_cast<OWN_PTR(Champ_Fonc_base)*>(&champ);
187 OWN_PTR(Champ_Don_base) * champ_don = dynamic_cast<OWN_PTR(Champ_Don_base)*>(&champ);
188
189 const Domaine_DG& domaine_DG = ref_cast(Domaine_DG, z);
190
191
192 Motcles motcles(8);
193 motcles[0] = "pression"; // Choix standard pour la pression
194 motcles[1] = "temperature"; // Choix standard pour la temperature
195 motcles[2] = "champ_fonc_quad_dg"; // With value on quadrature points
196 motcles[5] = "champ_elem_dg"; // With value on quadrature points
197 motcles[3] = "champ_elem"; // Creer un champ aux elements (de type P0)
198 motcles[6] = "champ_sommets"; // Creer un champ aux elements (de type P1)
199 motcles[4] = "vitesse"; // Choix standard pour la vitesse
200 motcles[7] = "champ_face"; // Choix standard pour la vitesse
201
202 Nom type;
203 int nb_points = 0; // Valeur par defaut du nombre de composantes
204 int rang = motcles.search(directive);
205 const Quadrature_base& quad = domaine_DG.get_quadrature(5); // TODO: Make this depend from the order of discretization ...
206 int nb_pts_integ_max = quad.nb_pts_integ_max();
207
208// const int order_DG = Option_DG::Get_order_for(directive);
209 switch(rang)
210 {
211 case 0:
212 case 1:
213 case 2:
214 case 4:
215 case 5:
216 case 7:
217 type = "Champ_Fonc_Quad_DG";
218 nb_points = nb_pts_integ_max; //Option_DG::Nb_col_from_order(order_DG);;
219 break;
220 case 3:
221 type = "Champ_Fonc_Elem_DG";
222 nb_points = 1;
223 break;
224 case 6:
225 type = "Champ_Fonc_Som_DG";
226 nb_points = 1;
227 break;
228 default:
229 assert(rang < 0);
230 break;
231 }
232
233 if (directive == DEMANDE_DESCRIPTION)
234 Cerr << "DG discretisation : " << motcles;
235
236 // Si on n'a pas compris la directive (ou si c'est une demande_description)
237 // alors on appelle l'ancetre :
238 if (rang < 0)
239 {
240 if (champ_fonc)
241 Discret_Thyd::discretiser_champ(directive, z, nature, noms, unites, nb_comp, temps, *champ_fonc);
242 else
243 Discret_Thyd::discretiser_champ(directive, z, nature, noms, unites, nb_comp, temps, *champ_don);
244 return;
245 }
246
247 // Calcul du nombre de ddl
248 int nb_ddl = 0;
249 if (type == "Champ_Fonc_Elem_DG" || type == "Champ_Fonc_Quad_DG")
250 nb_ddl = z.nb_elem();
251 else if (type == "Champ_Fonc_Som_DG")
252 nb_ddl = domaine_DG.nb_som();
253 else
254 assert(0);
255
256 bool vector = (nature==vectoriel or nature==quadrature_vectoriel or nature == basis_function_order_1_vectorial or nature == basis_function_order_2_vectorial );
257 if (vector) nb_comp = dimension;
258 else nb_comp = 1;
259 if (champ_fonc)
260 {
261 creer_champ(*champ_fonc, z, type, noms[0], unites[0], nb_comp*nb_points, nb_ddl, temps, directive, que_suis_je());
262 if (nb_comp == 1)
263 {
264 (nb_points == 1) ? champ_fonc->valeur().fixer_nature_du_champ(scalaire)
265 : champ_fonc->valeur().fixer_nature_du_champ(quadrature_scalaire);
266 }
267 else if (nb_comp == dimension)
268 {
269 (nb_points == 1) ? champ_fonc->valeur().fixer_nature_du_champ(vectoriel)
270 : champ_fonc->valeur().fixer_nature_du_champ(quadrature_vectoriel);
271 }
272 else
273 {
274 Cerr << "multi_scalaire not implemented for now" << finl;
275 exit();
276 }
277 }
278 else
279 {
280 creer_champ(*champ_don, z, type, noms[0], unites[0], nb_comp*nb_points, nb_ddl, temps, directive, que_suis_je());
281 if (nb_comp == 1)
282 {
283 (nb_points == 1) ? champ_don->valeur().fixer_nature_du_champ(scalaire)
284 : champ_don->valeur().fixer_nature_du_champ(quadrature_scalaire);
285 }
286 else if (nb_comp == dimension)
287 {
288 (nb_points == 1) ? champ_don->valeur().fixer_nature_du_champ(vectoriel)
289 : champ_don->valeur().fixer_nature_du_champ(quadrature_vectoriel);
290 }
291 else
292 {
293 Cerr << "multi_scalaire not implemented for now" << finl;
294 exit();
295 }
296 }
297
298
299
300 if ((nature == multi_scalaire) && (champ_fonc))
301 {
302 throw;
303 }
304 else if ((nature == multi_scalaire) && (champ_don))
305 {
306 Cerr << "There is no field of type Champ_Don with a multi_scalaire nature." << finl;
307 exit();
308 }
309}
310
312{
313 throw;
314}
315
316
317void DG_discretisation::grad_u(const Domaine_dis_base& z, const Domaine_Cl_dis_base& zcl, const Champ_Inc_base& ch_vitesse, OWN_PTR(Champ_Fonc_base)& ch) const
318{
319 throw;
320}
321
322
323void DG_discretisation::modifier_champ_tabule(const Domaine_dis_base& domaine_poly, Champ_Fonc_Tabule& lambda_tab, const VECT(OBS_PTR(Champ_base)) &champs_param) const
324{
325 throw;
326}
327
328/*! @brief Old copy paste, give the name to fields. Name used to allocate size of matrixes in discretiser
329 *
330 */
331Nom DG_discretisation::get_name_of_type_for(const Nom& class_operateur, const Nom& type_operateur, const Equation_base& eqn, const OBS_PTR(Champ_base) &champ_sup) const
332{
333 Nom type;
334 if (class_operateur == "Source")
335 {
336 type = type_operateur;
337 Nom champ = (eqn.inconnue().que_suis_je());
338 champ.suffix("Champ");
339 type += champ;
340 //type+="_DG";
341 return type;
342
343 }
344 else if (class_operateur == "Solveur_Masse")
345 {
346 Nom type_ch = eqn.inconnue().que_suis_je();
347 if (type_ch.debute_par("Champ_Elem"))
348 type_ch = "_Elem";
349
350 if (type_ch.debute_par("Champ_Face"))
351 type_ch = "_Face";
352
353 type = "Masse_DG";
354 type += type_ch;
355 }
356 else if (class_operateur == "Operateur_Grad")
357 {
358 type = "Op_Grad_DG";
359 }
360 else if (class_operateur == "Operateur_Div")
361 {
362 type = "Op_Div_DG";
363 }
364
365 else if (class_operateur == "Operateur_Diff")
366 {
367 Nom type_ch = eqn.inconnue().que_suis_je();
368 if (type_ch.debute_par("Champ_Elem"))
369 type_ch = "_Elem";
370
371 if (type_ch.debute_par("Champ_Face"))
372 type_ch = "_Face";
373
374 type = "Op_Diff";
375 if (type_operateur != "")
376 {
377 type += "_";
378 type += type_operateur;
379 }
380 type += "_DG";
381 type += type_ch;
382 }
383 else if (class_operateur == "Operateur_Conv")
384 {
385 type = "Op_Conv_";
386 type += type_operateur;
387 Nom tiret = "_";
388 type += tiret;
389 type += que_suis_je();
390 Nom type_ch = eqn.inconnue().que_suis_je();
391 if (type_ch.debute_par("Champ_Elem"))
392 type += "_Elem";
393 if (type_ch.debute_par("Champ_Face"))
394 type += "_Face";
395 type += "_DG";
396 }
397
398 else
399 return Discret_Thyd::get_name_of_type_for(class_operateur, type_operateur, eqn);
400
401 return type;
402}
403
405{
406 Cerr << "Global wall distance discretisation" << finl;
407 Noms noms(1), unites(1);
408 noms[0] = Nom("distance_paroi_globale");
409 unites[0] = Nom("m");
410 discretiser_champ(Motcle("champ_elem"), z, scalaire, noms, unites, 1, 0, ch);
411}
classe Champ_Don_base classe de base des Champs donnes (non calcules)
Classe Champ_Fonc_Tabule Classe derivee de Champ_Fonc_base qui represente les.
classe Champ_Fonc_base Classe de base des champs qui sont fonction d'une grandeur calculee
Classe Champ_Inc_base.
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
void grad_u(const Domaine_dis_base &z, const Domaine_Cl_dis_base &zcl, const Champ_Inc_base &ch_vitesse, OWN_PTR(Champ_Fonc_base)&ch) const override
void distance_paroi(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Fonc_base)&) const
Nom get_name_of_type_for(const Nom &class_operateur, const Nom &type_operateur, const Equation_base &eqn, const OBS_PTR(Champ_base) &champ_sup) const override
Old copy paste, give the name to fields. Name used to allocate size of matrixes in discretiser.
void distance_paroi_globale(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Fonc_base)&) const override
void discretiser_champ(const Motcle &directive, const Domaine_dis_base &z, Nature_du_champ nature, const Noms &nom, const Noms &unite, int nb_comp, int nb_pas_dt, double temps, OWN_PTR(Champ_Inc_base)&champ, const Nom &sous_type=NOM_VIDE) const override
Discretisation of a field for DG formulation.
classe Discret_Thyd Cette classe est la classe de base representant une discretisation
OBS_PTR(Domaine) le_domaine_
static void creer_champ(OWN_PTR(Champ_Inc_base)&ch, const Domaine_dis_base &z, const Nom &type, const Nom &nom, const Nom &unite, int nb_comp, int nb_ddl, int nb_pas_dt, double temps, const Nom &directive=NOM_VIDE, const Nom &nom_discretisation=NOM_VIDE)
Methode statique qui cree un OWN_PTR(Champ_Inc_base) du type specifie.
virtual Nom get_name_of_type_for(const Nom &class_operateur, const Nom &type_operteur, const Equation_base &eqn, const OBS_PTR(Champ_base)&champ_supp=OBS_PTR(Champ_base)()) const
remplit le Nom type en focntion de la classe de operateur, du type de l'operateur et de l'equation
static const Nom NOM_VIDE
static const Motcle DEMANDE_DESCRIPTION
void discretiser_champ(const Motcle &directive, const Domaine_dis_base &z, const Nom &nom, const Nom &unite, int nb_comp, int nb_pas_dt, double temps, OWN_PTR(Champ_Inc_base)&champ, const Nom &sous_type=NOM_VIDE) const
int verifie_sous_type(Nom &type, const Nom &sous_type, const Motcle &directive) const
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
const Quadrature_base & get_quadrature(int order) const
Definition Domaine_DG.h:100
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
virtual const Champ_Inc_base & inconnue() const =0
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
Un tableau d'objets de la classe Motcle.
Definition Motcle.h:63
int search(const Motcle &t) const
Definition Motcle.cpp:321
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
virtual int debute_par(const char *const n) const
Definition Nom.cpp:319
Nom & suffix(const char *const)
Extraction de suffixe : Nom x("azerty");.
Definition Nom.cpp:271
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
classe Objet_U Cette classe est la classe de base des Objets de TRUST
Definition Objet_U.h:73
static int dimension
Definition Objet_U.h:99
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
static int Nb_col_from_order(const int order)
Definition Option_DG.cpp:81
static int Get_order_for(const Nom &n)
Definition Option_DG.cpp:70
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
int nb_pts_integ_max() const
class Schema_Temps_base
Classe de base des flux de sortie.
Definition Sortie.h:52