TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Champ_front_calc.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 <Raccord_distant_homogene.h>
17#include <Frontiere_dis_base.h>
18#include <Champ_front_calc.h>
19#include <Probleme_Couple.h>
20#include <Equation_base.h>
21#include <Probleme_base.h>
22#include <Interprete.h>
23#include <Domaine.h>
24#include <Domaine_VF.h>
25
26Implemente_instanciable_sans_constructeur(Champ_front_calc,"Champ_front_calc",Ch_front_var_instationnaire_dep);
27// XD champ_front_calc front_field_base champ_front_calc NO_BRACE This keyword is used on a boundary to get a field from
28// XD_CONT another boundary. The local and remote boundaries should have the same mesh. If not, the
29// XD_CONT Champ_front_recyclage keyword could be used instead. It is used in the condition block at the limits of
30// XD_CONT equation which itself refers to a problem called pb1. We are working under the supposition that pb1 is
31// XD_CONT coupled to another problem.
32// XD attr problem_name ref_Pb_base problem_name REQ Name of the other problem to which pb1 is coupled.
33// XD attr bord chaine bord REQ Name of the side which is the boundary between the 2 domains in the domain object
34// XD_CONT description associated with the problem_name object.
35// XD attr field_name chaine field_name REQ Name of the field containing the value that the user wishes to use at the
36// XD_CONT boundary. The field_name object must be recognized by the problem_name object.
37
38
40
41Sortie& Champ_front_calc::printOn(Sortie& os) const { return os; }
42
43/*! @brief Lit le nom d'un probleme, le nom d'un bord et le nom d'un champ inconnue a partir d'un flot d'entree.
44 *
45 * Cree ensuite le champ de frontiere correspondant.
46 * Format:
47 * Champ_front_calc nom_probleme nom_bord nom_champ
48 *
49 * @param (Entree& is) un flot d'entre
50 * @return (Entree&) le flot d'entree modifie
51 */
53{
55 via_readon_ = true;
56 (nom_inco_ == "VITESSE") ? fixer_nb_comp(dimension) : fixer_nb_comp(1);
57 return is;
58}
59
60/*! @brief Cree l'objet Champ_front_calc representant la trace d'un champ inconnue sur une frontiere a partir des noms:
61 *
62 * - du probleme portant l'inconnue
63 * - du bord concerne (la frontiere)
64 * - de l'inconnue
65 *
66 * @param (Nom& nom_pb) le nom du probleme auquel appartent l'inconnue dont on veut prendre la trace
67 * @param (Nom& nom) le nom de la frontiere sur laquelle on prend la trace de l'inconnue
68 * @param (Motcle& nom_inco) le nom de l'inconnue dont on veut prendre la trace
69 * @throws pas de probleme du nom specifie
70 * @throws le probleme n'a pas de champ du nom specifie
71 */
72void Champ_front_calc::creer(const Nom& nom_pb, const Nom& nom_bord, const Motcle& nom_inco)
73{
74 nom_autre_pb_ = nom_pb;
75 nom_autre_bord_ = nom_bord;
76 OBS_PTR(Probleme_base) autre_pb;
78 if (sub_type(Probleme_base, ob))
79 {
80 autre_pb = ref_cast(Probleme_base, ob);
81 }
82 else
83 {
84 Cerr << "We did not find problem with name " << nom_pb << finl;
85 exit();
86 }
88 rch = autre_pb->get_champ(nom_inco);
89 if (sub_type(Champ_Inc_base, rch.valeur()))
90 {
91 l_inconnue = ref_cast(Champ_Inc_base, rch.valeur());
92 fixer_nb_comp(rch->nb_comp());
93 }
94 else
95 {
96 Cerr << autre_pb->le_nom() << " did not have unknown field with name " << nom_inco << finl;
97 exit();
98 }
99}
100
101int Champ_front_calc::initialiser(double temps, const Champ_Inc_base& inco)
102{
103 // 1er chose a faire : la c'est bon ! on creer le champ
105
107
108 // Check/initialize Raccord boundaries in parallel:
109 if (nproc() > 1)
110 {
111 const Domaine_dis_base& domaine_dis_opposee = front_dis().domaine_dis();
112 const Domaine_dis_base& domaine_dis_locale = frontiere_dis().domaine_dis();
113 const Frontiere& frontiere_opposee = front_dis().frontiere();
114 const Frontiere& frontiere_locale = frontiere_dis().frontiere();
115 if (distant_ && !sub_type(Raccord_distant_homogene, frontiere_opposee))
116 {
117 const Nom& nom_domaine_oppose = domaine_dis_opposee.domaine().le_nom();
118 Cerr << "Error, the boundary " << frontiere_opposee.le_nom() << " should be a Raccord." << finl;
119 Cerr << "Add in your data file between the definition and the partition of the domain " << nom_domaine_oppose << " :" << finl;
120 Cerr << "Modif_bord_to_raccord " << nom_domaine_oppose << " " << frontiere_opposee.le_nom() << finl;
121 exit();
122 }
123 if (distant_ == 1)
124 {
125 Raccord_distant_homogene& raccord_distant = ref_cast_non_const(Raccord_distant_homogene, frontiere_opposee);
126 if (!raccord_distant.est_initialise())
127 raccord_distant.initialise(frontiere_locale, domaine_dis_locale, domaine_dis_opposee);
128 }
129 }
130 return 1;
131}
132
133/*! @brief Associe le champ inconnue a l'objet
134 *
135 * @param (Champ_Inc_base& inco) le champ inconnue dont on prendra la trace
136 */
138{
139 l_inconnue = inco;
140}
141
142
143/*! @brief Non code
144 *
145 * @param (Champ_front_base& ch)
146 * @return (Champ_front_base&)
147 */
149{
150 return *this;
151}
152
153/*! @brief Mise a jour en temps du champ On prend juste la trace du champ inconnue au pas de
154 *
155 * temps auquel il se situe.
156 * WEC : verifier qu'on prend l'inconnue au bon temps !
157 *
158 */
159
160// Precondition: le nom du bord doit etre different de "??"
161// Parametre: double
162// Signification:
163// Valeurs par defaut:
164// Contraintes:
165// Acces:
166// Retour:
167// Signification:
168// Contraintes:
169// Exception:
170// Effets de bord:
171// Postcondition:
173{
174 assert (nom_autre_bord_ != "??") ;
175 DoubleTab& tab=valeurs_au_temps(temps);
176 const Frontiere_dis_base& frontiere_dis_opposee = domaine_dis().frontiere_dis(nom_bord_oppose());
177 l_inconnue->trace(frontiere_dis_opposee,tab,temps,distant_ /* distant */);
178}
179
180/*! @brief Renvoie le champ inconnue associe
181 *
182 * @return (Champ_Inc_base&) le champ inconnue associe
183 */
185{
186 return l_inconnue.valeur();
187}
188
189/*! @brief Renvoie le nom du bord sur lequel on calcule la trace.
190 *
191 * @return (Nom&) le nom du bord sur lequel on calcule la trace
192 */
194{
195 return nom_autre_bord_;
196}
197
198/*! @brief Renvoie l'equation associee a l'inconnue dont on prend la trace.
199 *
200 * @return (Equation_base&) l'equation associee a l'inconnue dont on prend la trace
201 */
203{
204 if (!l_inconnue)
205 {
206 Cerr << "\nError in Champ_front_calc::equation() : not able to return the equation !" << finl;
208 }
209 return inconnue().equation();
210}
211
212/*! @brief Renvoie le milieu associe a l'equation qui porte le champ inconnue dont on prend la trace.
213 *
214 * @return (Milieu_base&) le milieu associe a l'equation qui porte le champ inconnue dont on prend la trace
215 */
217{
218 return equation().milieu();
219}
220
221/*! @brief Renvoie le domaine discretise associe a l'equation qui porte le champ inconnue dont on prend la trace.
222 *
223 * @return (Domaine_dis_base&) le domaine discretise associe a l'equation qui porte le champ inconnue dont on prend la trace
224 */
229
230/*! @brief Renvoie le domaine des conditions au limites discretisees porte par l'equation qui porte le champ inconnue
231 *
232 * dont on prend la trace
233 *
234 * @return (Domaine_Cl_dis_base&) le domaine des conditions au limites discretisees porte par l'equation qui porte le champ inconnue dont on prend la trace
235 */
240
241/*! @brief Renvoie la frontiere discretisee correspondante au domaine sur lequel prend la trace.
242 *
243 * @return (Frontiere_dis_base&) frontiere discretisee correspondante au domaine sur lequel prend la trace
244 * @throws frontiere du nom specifie introuvable
245 */
250
251
253{
254}
classe Ch_front_var_instationnaire_dep Cette classe abstraite represente un champ sur une frontiere,
int initialiser(double temps, const Champ_Inc_base &inco) override
Initialisation en debut de calcul.
Classe Champ_Inc_base.
const Domaine_dis_base & domaine_dis_base() const override
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
classe Champ_front_base Classe de base pour la hierarchie des champs aux frontieres.
virtual const Frontiere_dis_base & frontiere_dis() const
Renvoie la frontiere discretisee associee au champ.
classe Champ_front_calc Classe derivee de Champ_front_var qui represente les
const Frontiere_dis_base & front_dis() const
Renvoie la frontiere discretisee correspondante au domaine sur lequel prend la trace.
void creer(const Nom &, const Nom &, const Motcle &)
Cree l'objet Champ_front_calc representant la trace d'un champ inconnue sur une frontiere a partir de...
const Nom & nom_bord_oppose() const
Renvoie le nom du bord sur lequel on calcule la trace.
int initialiser(double, const Champ_Inc_base &) override
Initialisation en debut de calcul.
const Domaine_Cl_dis_base & domaine_Cl_dis() const
Renvoie le domaine des conditions au limites discretisees porte par l'equation qui porte le champ inc...
void set_distant(int d)
Champ_front_base & affecter_(const Champ_front_base &ch) override
Non code.
const Equation_base & equation() const
Renvoie l'equation associee a l'inconnue dont on prend la trace.
OBS_PTR(Champ_Inc_base) l_inconnue
void associer_ch_inc_base(const Champ_Inc_base &)
Associe le champ inconnue a l'objet.
void verifier(const Cond_lim_base &la_cl) const override
void mettre_a_jour(double temps) override
Mise a jour en temps du champ On prend juste la trace du champ inconnue au pas de.
const Champ_Inc_base & inconnue() const
Renvoie le champ inconnue associe.
const Domaine_dis_base & domaine_dis() const override
Renvoie le domaine discretise associe a l'equation qui porte le champ inconnue dont on prend la trace...
const Milieu_base & milieu() const
Renvoie le milieu associe a l'equation qui porte le champ inconnue dont on prend la trace.
DoubleTab & valeurs_au_temps(double temps) override
Renvoie les valeurs au temps desire.
classe Cond_lim_base Classe de base pour la hierarchie des classes qui representent les differentes c...
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Frontiere_dis_base & frontiere_dis(const Nom &) const
Renvoie la frontiere de Nom nom.
const Domaine & domaine() const
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 Milieu_base & milieu() const =0
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
virtual void fixer_nb_comp(int i)
Fixe le nombre de composantes du champ.
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Definition Frontiere.h:49
classe Frontiere_dis_base Classe representant une frontiere discretisee.
const Frontiere & frontiere() const
Renvoie la frontiere geometrique associee.
const Domaine_dis_base & domaine_dis() const
static Objet_U & objet(const Nom &)
Voir Interprete_bloc::objet_global() BM: la classe Interprete n'est pas le meilleur endroit pour cett...
classe Milieu_base Cette classe est la base de la hierarchie des milieux (physiques)
Definition Milieu_base.h:50
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Definition MorEqn.h:62
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
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
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
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
Definition Process.cpp:104
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
void initialise(const Frontiere_t &, const Domaine_dis_base &, const Domaine_dis_base &)
Classe de base des flux de sortie.
Definition Sortie.h:52