TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Source_base.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 <Schema_Temps_base.h>
17#include <Equation_base.h>
18#include <Probleme_base.h>
19#include <Process.h>
20#include <Source_base.h>
21#include <TRUSTTrav.h>
22#include <TRUSTTabs.h>
23#include <SFichier.h>
24#include <map>
25
26Implemente_base(Source_base,"Source_base",Objet_U);
27// XD source_base objet_u source_base INHERITS_BRACE Basic class of source terms introduced in the equation.
28
29/*! @brief DOES NOTHING - to override in derived classes.
30 *
31 * Imprime la source sur un flot de sortie.
32 *
33 * @param (Sortie& os) le flot de sortie
34 * @return (Sortie&) le flot de sortie modifie
35 */
37{
38 return os;
39}
40
41/*! @brief DOES NOTHING - to override in derived classes.
42 *
43 * Lecture d'un terme source sur un flot d'entree.
44 *
45 * @param (Entree& is) le flot d'entree
46 * @return (Entree&) le flot d'entree modifie
47 */
49{
50 return is;
51}
52
53/*! @brief DOES NOTHING - to override in derived classes.
54 *
55 * Mise a jour en temps du terme source.
56 * @param (double) le pas de temps de mise a jour
57 */
59{
60 Cerr << finl;
61 Cerr << "You must to overload the method Source_base::mettre_a_jour() because there's a big" << finl;
62 Cerr << "chance that the source term " << que_suis_je() << " must be updated," << finl;
63 Cerr << "especially if your source has a field, you must update it..." << finl << finl;
64 exit();
65}
66
67/*! @brief DOES NOTHING - to override in derived classes.
68 *
69 * Reset current time.
70 * @param (double) new current time to be set.
71 */
73{
74 Cerr << finl;
75 Cerr << "You must to overload the method Source_base::resetTime() because there's big" << finl;
76 Cerr << "chance that the source term " << que_suis_je() << " must be reset," << finl;
77 Cerr << "especially if your source has a field, you must reset its current time..." << finl << finl;
78 exit();
79}
80
81/*! @brief Met a jour les references internes a l'objet Source_base.
82 *
83 * Appelle 2 methodes virtuelles pures protegees:
84 * Source_base::associer_domaines(const Domaine_dis_base& ,const Domaine_Cl_dis_base&)
85 * Source_base::associer_pb(const Probleme_base&)
86 *
87 */
89{
90 const Equation_base& eqn = equation();
91 const Domaine_dis_base& zdis= eqn.domaine_dis();
92 const Domaine_Cl_dis_base& zcldis = eqn.domaine_Cl_dis();
93 associer_domaines(zdis, zcldis);
94 associer_pb(eqn.probleme());
95 // Initialize the bilan_ array:
96 bilan_.resize(eqn.inconnue().nb_comp());
97 bilan_=0;
98 for (auto& itr : col_names_)
99 col_width_ = std::max(col_width_, itr.longueur());
100}
101
102/*! @brief Cette methode (ou la methode de la classe derivee) est appelee par Sources::associer_champ_rho pour chaque source de la liste
103 *
104 * (par exemple, a l'initialisation d'un calcul front-tracking).
105 * Cette methode doit etre reimplementee dans les classes derivees
106 * utilisees dans les problemes a rho variable.
107 *
108 * La methode ajouter calcule le terme suivant:
109 * INTEGRALE (terme source)
110 * sur volume entrelace
111 *
112 * Dans les problemes ou rho est variable, "terme source" homogene a rho*v.
113 * Sinon, "terme source" est homogene a v.
114 *
115 */
117{
118 Cerr << "In Source_base::associer_champ_rho" << finl;
119 Cerr << " field : " << champ_rho.le_nom() << finl;
120 Cerr << " Source of type : " << que_suis_je() << finl;
121 Cerr << " This source does not support the association of a field rho." << finl;
122 Cerr << " (method associer_champ_rho must be coded for this source term)." << finl;
123 assert(0);
124 exit();
125}
126
127/*! @brief Si la source comprend le motcle "mot", elle remplit la reference a ch_ref et renvoie 1, sinon renvoie 0 (voir Source_Translation par ex.
128 *
129 * )
130 *
131 */
133{
134 // La classe de base ne comprend aucun motcle
135 return 0;
136}
137
139{
140 return champs_compris_.get_champ(nom);
141}
142
143bool Source_base::has_champ(const Motcle& nom, OBS_PTR(Champ_base) &ref_champ) const
144{
145 return champs_compris_.has_champ(nom, ref_champ);
146}
147
148bool Source_base::has_champ(const Motcle& nom) const
149{
150 return champs_compris_.has_champ(nom);
151}
152
154{
155 if (opt == DESCRIPTION)
156 Cerr << que_suis_je() << " : " << champs_compris_.liste_noms_compris() << finl;
157 else
158 nom.add(champs_compris_.liste_noms_compris());
159}
160
161/*! @brief DOES NOTHING - to override in derived classes.
162 *
163 * Mise a jour en temps du terme source.
164 *
165 * @param (double) le pas de temps de mise a jour
166 */
167static std::map<std::string, int> counters; // ToDo provisoire
169{
170 if (out_=="??")
171 {
172 //Cerr << "No balance printed for " << que_suis_je() << finl;
173 }
174 else
175 {
176 int nb_compo=bilan_.size();
177 if (nb_compo==0)
178 {
179 Cerr << "No balance printed for " << que_suis_je() << finl;
180 Cerr << "cause bilan_ array is not filled." << finl;
181 }
182 else
183 {
184 int flag=je_suis_maitre();
185 ouvrir_fichier(Flux,"",flag);
186 const Probleme_base& pb=equation().probleme();
187 const Schema_Temps_base& sch=pb.schema_temps();
188 double temps=sch.temps_courant();
189
191 Flux.add_col(temps);
192 DoubleVect bilan_p(bilan_);
193 mp_sum_for_each_item(bilan_p);
194 /*
195 for(int k=0; k<nb_compo; k++)
196 bilan_(k)=Process::mp_sum(bilan_(k)); */
197 // Replaced by:
198 // mp_sum_for_each_item(bilan_); // Fixed bug: double line!
199
201 {
202 for(int k=0; k<nb_compo; k++)
203 Flux.add_col(bilan_p(k));
204 Flux << finl;
205 }
206 }
207 }
208 return 1;
209}
210/*! @brief Dimensionnement de la matrice implicite des termes sources.
211 *
212 * Par defaut ne fait rien.
213 *
214 */
219
221{
222 if (has_interface_blocs()) dimensionner_blocs({{ "vitesse", &mat }});
223}
224
225DoubleTab& Source_base::ajouter(DoubleTab& secmem) const
226{
227 if (has_interface_blocs()) ajouter_blocs({}, secmem, {});
228 else Process::exit(que_suis_je() + " : ajouter() not coded!");
229 return secmem;
230}
231
232DoubleTab& Source_base::calculer(DoubleTab& secmem) const
233{
234 secmem = 0;
235 return ajouter(secmem);
236}
237
238/*! @brief contribution a la matrice implicite des termes sources par defaut pas de contribution
239 *
240 */
241void Source_base::contribuer_a_avec(const DoubleTab&, Matrice_Morse& mat) const
242{
243 if (!has_interface_blocs()) return;
244 DoubleTrav secmem(equation().inconnue().valeurs()); //sera jete
245 ajouter_blocs({{ equation().inconnue().le_nom().getString(), &mat}}, secmem, {});
246}
247
248/*! @brief contribution au second membres des termes sources en implicite par defaut erreur
249 *
250 * methode presente par coherence avec Operateur_base
251 *
252 */
254{
255 Cerr<<"Source_base::contribuer_au_second_membre(DoubleTab& ) const uncoded"<<finl;
256 exit();
257}
258
259/* par defaut erreur */
260void Source_base::dimensionner_blocs(matrices_t matrices, const tabs_t& semi_impl) const
261{
262 Process::exit(que_suis_je() + " : dimensionner_blocs() not coded!");
263}
264void Source_base::ajouter_blocs(matrices_t matrices, DoubleTab& secmem, const tabs_t& semi_impl) const
265{
266 Process::exit(que_suis_je() + " : ajouter_blocs() not coded!");
267}
268
269/*! @brief Contrairement aux methodes mettre_a_jour, les methodes initialiser des sources ne peuvent pas dependre de l'exterieur
270 *
271 * (lui-meme peut ne pas etre initialise)
272 * Par defaut, mettre_a_jour
273 *
274 */
276{
277 mettre_a_jour(temps);
278 return 1;
279}
280
281
282/*! @brief Ouverture/creation d'un fichier d'impression d'un terme source A surcharger dans les classes derivees.
283 *
284 * @throws methode a surcharger
285 */
286void Source_base::ouvrir_fichier(SFichier& os,const Nom& type, const int flag) const
287{
288 // flag nul on n'ouvre pas le fichier
289 if (flag==0)
290 return ;
291 // ToDo provisoire:
292 counters[type.getString()]++;
293 if (counters[type.getString()]>1 && type!="")
294 {
295 Cerr << "Code should be rewritten to have only one call to Source_base::ouvrir_fichier for " << type << " source and not " << counters[type.getString()] << " times." << finl;
297 }
298 const Probleme_base& pb=equation().probleme();
299 const Schema_Temps_base& sch=pb.schema_temps();
300 const int precision = sch.precision_impr(), wcol = std::max(col_width_, sch.wcol()), gnuplot_header = sch.gnuplot_header();
301 os.set_col_width(wcol);
302
303 Nom nomfichier(out_);
304 if (type!="") nomfichier+=(Nom)"_"+type;
305 nomfichier+=".out";
306
307 // On cree le fichier a la premiere impression avec l'en tete
308 if (sch.nb_impr()==1 && !pb.reprise_effectuee())
309 {
310 os.ouvrir(nomfichier);
311 SFichier& fic=os;
312 //Nom espace="\t\t";
313 fic << (Nom)"# Printing of the source term "+que_suis_je()+" of the equation "+equation().que_suis_je()+" of the problem "+equation().probleme().le_nom() << finl;
314 fic << "# " << description() << finl;
315 if (!gnuplot_header) fic << "#";
316 os.set_col_width(wcol - !gnuplot_header);
317 fic.add_col("Time");
318 os.set_col_width(wcol);
319 for (int i = 0; i < col_names_.size(); i++)
320 fic.add_col(col_names_[i]);
321 fic << finl;
322 }
323 // Sinon on l'ouvre
324 else
325 {
326 os.ouvrir(nomfichier,ios::app);
327 }
328 os.precision(precision);
329 os.setf(ios::scientific);
330}
331
333{
335 out_+="_";
336 out_+=equation().probleme().le_nom()+"_"+nom;
337}
338
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
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
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
const Nom & le_nom() const override
Renvoie le nom du champ.
virtual int nb_comp() const
Definition Field_base.h:56
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Definition MorEqn.h:62
OBS_PTR(Equation_base) mon_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
const std::string & getString() const
Definition Nom.h:92
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
friend class Sortie
Definition Objet_U.h:75
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
static const Nom & nom_du_cas()
Renvoie une reference constante vers le nom du cas.
Definition Objet_U.cpp:146
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Definition Probleme_U.h:109
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
bool & reprise_effectuee()
const Schema_Temps_base & schema_temps() const
Renvoie le schema en temps associe au probleme.
static void mp_sum_for_each_item(TRUSTArray< _TYPE_ > &x, int n=-1)
Definition Process.cpp:193
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Definition Process.cpp:86
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
Definition SFichier.h:27
class Schema_Temps_base
int nb_impr() const
Renvoie le nombre d'impressions effectuees.
double temps_courant() const
Renvoie le temps courant.
virtual int ouvrir(const char *name, IOS_OPEN_MODE mode=ios::out)
void precision(int pre) override
void setf(IOS_FORMAT code) override
Classe de base des flux de sortie.
Definition Sortie.h:52
void set_col_width(int w)
Definition Sortie.h:66
virtual int add_col(const double ob)
Definition Sortie.cpp:83
classe Source_base Un objet Source_base est un terme apparaissant au second membre d'une
Definition Source_base.h:42
void set_fichier(const Nom &)
virtual void mettre_a_jour(double temps)
DOES NOTHING - to override in derived classes.
virtual void associer_pb(const Probleme_base &)=0
Champs_compris champs_compris_
const Champ_base & get_champ(const Motcle &nom) const override
virtual void associer_domaines(const Domaine_dis_base &, const Domaine_Cl_dis_base &)=0
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
const Nom description() const
Definition Source_base.h:86
virtual int impr(Sortie &os) const
virtual void resetTime(double t)
DOES NOTHING - to override in derived classes.
virtual void associer_champ_rho(const Champ_base &champ_rho)
Cette methode (ou la methode de la classe derivee) est appelee par Sources::associer_champ_rho pour c...
virtual DoubleTab & calculer(DoubleTab &) const
virtual void ouvrir_fichier(SFichier &os, const Nom &, const int flag=1) const
Ouverture/creation d'un fichier d'impression d'un terme source A surcharger dans les classes derivees...
virtual void contribuer_au_second_membre(DoubleTab &) const
contribution au second membres des termes sources en implicite par defaut erreur
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
virtual int initialiser(double temps)
Contrairement aux methodes mettre_a_jour, les methodes initialiser des sources ne peuvent pas dependr...
virtual void contribuer_a_avec(const DoubleTab &, Matrice_Morse &) const
contribution a la matrice implicite des termes sources par defaut pas de contribution
virtual void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={ }) const
virtual void dimensionner_bloc_vitesse(Matrice_Morse &) const
virtual void completer()
Met a jour les references internes a l'objet Source_base.
virtual int has_interface_blocs() const
Definition Source_base.h:68
SFichier Flux
virtual DoubleTab & ajouter(DoubleTab &) const
DoubleVect bilan_
virtual int a_pour_Champ_Fonc(const Motcle &mot, OBS_PTR(Champ_base) &ch_ref) const
Si la source comprend le motcle "mot", elle remplit la reference a ch_ref et renvoie 1,...
virtual void dimensionner(Matrice_Morse &) const
Dimensionnement de la matrice implicite des termes sources.
virtual void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={ }) const