TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Terme_Boussinesq_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 Terme_Boussinesq_base_included
17#define Terme_Boussinesq_base_included
18
19#include <Convection_Diffusion_Temperature.h>
20#include <Equation_base.h>
21#include <Probleme_base.h>
22#include <TRUST_Vector.h>
23#include <TRUST_Ref.h>
24
25#include <Parser_U.h>
26#include <Domaine.h>
27
29class Champ_Don_base;
30class Param;
31
32/*! @brief Classe Terme_Boussinesq_base Cette classe represente le terme de gravite qui figure dans l'equation
33 *
34 * de la dynamique divisee par la masse volumique de reference.
35 * On est dans le cadre de l'hypothese de Boussinesq:la masse volumique est
36 * supposee constante et egale a sa valeur de reference sauf dans le terme
37 * des forces de volumes ou on prend en compte une petite variation de la
38 * masse volumique en fonction d'un ou de plusieurs scalaires transportes
39 * par l'ecoulement (la temperature et/ou une ou plusieurs concentrations).
40 * Cas particulier de Terme_Boussinesq_base pour la temperature
41 * Le terme de gravite a pour expression: beta*(T-T0) ou beta
42 * represente la dilatabilite de la masse volumique et T0 une valeur
43 * de reference pour la temperature
44 * Cas particulier de Terme_Boussinesq_base pour une concentration
45 * Le terme de gravite a pour expression : beta*(C-C0)
46 * ou (beta[0]*(C[0]-C0[0]) + .....+ beta[i]*(C[i]-C0[i])) dans
47 * le cas d'un vecteur de concentrations
48 * beta represente la variation de la masse volumique en fonction
49 * de la concentration du constituant et C0 une valeur de reference
50 * pour la concentration
51 *
52 *
53 */
55{
56 Declare_base(Terme_Boussinesq_base);
57
58public :
59
60 void associer_pb(const Probleme_base& pb) override ;
61 inline const Champ_Don_base& gravite() const { return la_gravite_.valeur(); }
62 inline int verification() const { return verif_; }
63 inline double Scalaire0(int i) const { return Scalaire0_[i]; }
64 inline const Champ_Don_base& beta() const { return beta_.valeur(); }
65 inline const Convection_Diffusion_std& equation_scalaire() const { return equation_scalaire_.valeur(); }
66 DoubleTab& calculer(DoubleTab& resu) const override
67 {
68 resu=0;
69 return ajouter(resu);
70 }
71 void mettre_a_jour(double temps) override
72 {
73 for (int i=0; i<Scalaire0_.size_array(); i++)
74 {
75 fct_Scalaire0_[i].setVar(0,temps);
76 Scalaire0_[i] = fct_Scalaire0_[i].eval();
77 }
78 }
79 inline const ArrOfDouble& getScalaire0() const { return Scalaire0_; }
80
81protected :
82 void set_param(Param& param) const override;
83 int lire_motcle_non_standard(const Motcle&, Entree&) override;
84
85 OBS_PTR(Champ_Don_base) la_gravite_;
86 int verif_=1;
87 ArrOfDouble Scalaire0_; // T0=Scalaire0_(0) ou C0(i)=Scalaire0_(i)
88 Nom NomScalaire_; // Temperature ou Concentration
89 VECT(Parser_U) fct_Scalaire0_;
91 OBS_PTR(Convection_Diffusion_std) equation_scalaire_;
92 inline void check() const;
93};
94
96{
97 // Pas de verification autre qu'au premier pas de temps, si verification pas desactivee et uniquement pour la temperature
98 if (equation_scalaire().probleme().schema_temps().nb_pas_dt()>0 || equation_scalaire().probleme().reprise_effectuee() || verif_==0 || !sub_type(Convection_Diffusion_Temperature,equation_scalaire())) return;
99
100 // Nouveau : on verifie que moyenne(T)==T0 au demarrage du calcul uniquement
101 const double T0 = Scalaire0(0);
102 double moyenne_T = mp_moyenne_vect(equation_scalaire().inconnue().valeurs());
103 if (inf_ou_egal(moyenne_T,T0-10) || sup_ou_egal(moyenne_T,T0+10))
104 {
105 Cerr << "New criteria in TRUST for the Boussinesq source term definition:" << finl;
106 Cerr << "To avoid an incorrect choice for T0 value" << finl;
107 Cerr << "the initial average temperature on the domain " << equation_scalaire().probleme().domaine().le_nom() << finl;
108 Cerr << "should be between +/-10 degrees around T0 value." << finl;
109 Cerr << "The initial average temperature is : " << moyenne_T << finl;
110 Cerr << "T0 value is : " << T0 << finl;
111 Cerr << "So, you need to change T0 or the initial temperature field to respect this criteria defined by default." << finl;
112 Cerr << "If you want to overcome this criteria, which it is not recommended," << finl;
113 Cerr << "you can specify, into the Boussinesq source term definition, the option:" << finl;
114 Cerr << "verif_boussinesq 0" << finl;
116 }
117}
118
119// Methode de calcul de la valeur sur un champ aux elements d'un champ uniforme ou non a plusieurs composantes
120inline double valeur(const DoubleTab& valeurs, const int elem, const int dim)
121{
122 if(valeurs.nb_dim()==1)
123 return valeurs(elem);
124 else
125 return valeurs(elem,dim);
126}
127
128// Methode de calcul de la valeur sur une face encadree par elem1 et elem2 d'un champ uniforme ou non a plusieurs composantes
129inline double valeur(const DoubleTab& valeurs_champ, int elem1, int elem2, const int compo)
130{
131 if (valeurs_champ.dimension(0)==1)
132 return valeurs_champ(0,compo); // Champ uniforme
133 else
134 {
135 if (elem2<0) elem2 = elem1; // face frontiere
136 if (valeurs_champ.nb_dim()==1)
137 return 0.5*(valeurs_champ(elem1)+valeurs_champ(elem2));
138 else
139 return 0.5*(valeurs_champ(elem1,compo)+valeurs_champ(elem2,compo));
140 }
141}
142KOKKOS_INLINE_FUNCTION
143double valeur(CDoubleTabView valeurs_champ, int valeurs_champ_dimension0, int nb_dim, int elem1, int elem2, const int compo, int nb_compo)
144{
145 if (valeurs_champ_dimension0==1)
146 return valeurs_champ(compo,0); // Champ uniforme
147 else
148 {
149 if (elem2 < 0) elem2 = elem1; // face frontiere
150 if (nb_dim == 1)
151 return 0.5*(valeurs_champ(elem1,0)+valeurs_champ(elem2,0));
152 else
153 return 0.5*(valeurs_champ(elem1,compo)+valeurs_champ(elem2,compo));
154 }
155}
156
157#endif
158
classe Champ_Don_base classe de base des Champs donnes (non calcules)
classe Convection_Diffusion_Temperature Cas particulier de Convection_Diffusion_std
classe Convection_Diffusion_std Cette classe est la base des equations modelisant le transport
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
classe Parser_U Version de la classe Parser, derivant de Objet_U.
Definition Parser_U.h:32
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
const Domaine & domaine() const
Renvoie le domaine associe au probleme.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
classe Source_base Un objet Source_base est un terme apparaissant au second membre d'une
Definition Source_base.h:42
virtual DoubleTab & ajouter(DoubleTab &) const
int nb_dim() const
Definition TRUSTTab.h:199
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
Classe Terme_Boussinesq_base Cette classe represente le terme de gravite qui figure dans l'equation.
void set_param(Param &param) const override
OBS_PTR(Champ_Don_base) la_gravite_
void associer_pb(const Probleme_base &pb) override
OBS_PTR(Convection_Diffusion_std) equation_scalaire_
double Scalaire0(int i) const
const Convection_Diffusion_std & equation_scalaire() const
void mettre_a_jour(double temps) override
DOES NOTHING - to override in derived classes.
const Champ_Don_base & gravite() const
const ArrOfDouble & getScalaire0() const
DoubleTab & calculer(DoubleTab &resu) const override
VECT(Parser_U) fct_Scalaire0_
OBS_PTR(Champ_Don_base) beta_
int lire_motcle_non_standard(const Motcle &, Entree &) override
Lecture des parametres de type non simple d'un objet_U a partir d'un flot d'entree.
const Champ_Don_base & beta() const