TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Operateur_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 Operateur_base_included
17#define Operateur_base_included
18
19
20#include <Equation_base.h>
21
22#include <SolveurSys.h>
23#include <TRUST_Ref.h>
24
25#include <Matrice.h>
26
28class Matrice_Morse;
29class EcrFicPartage;
30class Conds_lim;
31class SFichier;
32
33/*! @brief classe Operateur_base Classe est la base de la hierarchie des objets representant un
34 *
35 * operateur utilise dans des equations de TRUST. Ses membres sont
36 * les attributs et les methodes communs a toutes les classes qui
37 * representent un operateur. Un Operateur est un morceau d'equation
38 * c'est pourquoi il derive de MorEqn qui lui permet d'avoir une
39 * reference sur l'equation auquel il est attache.
40 * Exemple de classe d'operateur: Op_Diff_K_Eps_negligeable,
41 * Operateur_Div_base
42 *
43 * @sa MorEqn Operateur Equation_base
44 *
45 * Classe abstraite. Un certain nombre de methodes DOIVENT etre, surchargees dans les classes derivees.
46 */
48{
49 Declare_base(Operateur_base);
50public:
51 virtual DoubleTab& ajouter(const DoubleTab&, DoubleTab&) const;
52 virtual DoubleTab& calculer(const DoubleTab&, DoubleTab&) const;
53 virtual void associer_champ(const Champ_Inc_base&, const std::string& nom_ch);
54 virtual void associer(const Domaine_dis_base&, const Domaine_Cl_dis_base&, const Champ_Inc_base& inco) =0;
56 virtual void dimensionner(Matrice_Morse&) const /* =0 */;
57 virtual void dimensionner_bloc_vitesse(Matrice_Morse& matrice) const;
58 virtual void modifier_pour_Cl(Matrice_Morse&, DoubleTab&) const /* =0 */;
59 virtual void contribuer_a_avec(const DoubleTab&, Matrice_Morse&) const /* =0 */;
60 /* permet de remplir des dependances en d'autres variables */
61 virtual void contribuer_bloc_vitesse(const DoubleTab&, Matrice_Morse&) const;
62 virtual void contribuer_au_second_membre(DoubleTab&) const /* =0 */;
63 void tester_contribuer_a_avec(const DoubleTab&, const Matrice_Morse&);
64
65 /* interface {dimensionner,ajouter}_blocs -> cf Equation_base.h */
66 virtual int has_interface_blocs() const { return 0; }
67 virtual void dimensionner_blocs(matrices_t matrices, const tabs_t& semi_impl = { }) const;
68 virtual void ajouter_blocs(matrices_t matrices, DoubleTab& secmem, const tabs_t& semi_impl = { }) const;
69
70 virtual void dimensionner_termes_croises(Matrice_Morse&, const Probleme_base& autre_pb, int nl, int nc) const;
71 virtual void ajouter_termes_croises(const DoubleTab& inco, const Probleme_base& autre_pb, const DoubleTab& autre_inco, DoubleTab& resu) const;
72 virtual void contribuer_termes_croises(const DoubleTab& inco, const Probleme_base& autre_pb, const DoubleTab& autre_inco, Matrice_Morse& matrice) const;
73
74 virtual double calculer_dt_stab() const;
75 virtual void calculer_dt_local(DoubleTab&) const; //Local time step calculation
76 virtual void completer();
77 virtual void mettre_a_jour(double temps);
78 virtual void abortTimeStep();
79 virtual void resetTime(double time);
80 virtual int impr(Sortie& os) const;
81 inline void associer_eqn(const Equation_base&);
82 inline int get_decal_temps() const;
83 inline int set_decal_temps(int);
84 inline int get_nb_ss_pas_de_temps() const;
85 inline int set_nb_ss_pas_de_temps(int);
86 inline const Matrice& get_matrice() const;
87 inline Matrice& set_matrice();
88 inline const SolveurSys& get_solveur() const;
89 inline SolveurSys& set_solveur();
90 inline Entree& lire_solveur(Entree&);
91 virtual int systeme_invariant() const;
92 virtual void ajouter_contribution_explicite_au_second_membre(const Champ_Inc_base& inconnue, DoubleTab& derivee) const;
93 const Champ_Inc_base& mon_inconnue() const { return le_champ_inco.valeur(); }
94 bool has_champ_inco() const { return bool(le_champ_inco); }
95 const std::string& nom_inconnue() const
96 {
97 assert (has_champ_inco());
98 return nom_inco_;
99 }
100
101 void ouvrir_fichier(SFichier& os, const Nom&, const int flag = 1) const;
102 void ouvrir_fichier_partage(EcrFicPartage&, const Nom&, const int flag = 1) const;
103 void set_fichier(const Nom&);
104 inline const Nom fichier() const { return out_; }
105 inline void set_description(const Nom& nom) { description_ = nom; }
106 inline const Nom description() const { return description_; }
107 inline DoubleTab& flux_bords() { return flux_bords_; }
108 inline DoubleTab& flux_bords() const { return flux_bords_; }
109
110 //Methodes de l interface des champs postraitables
111 /////////////////////////////////////////////////////
112 void creer_champ(const Motcle& motlu) override { }
113 const Champ_base& get_champ(const Motcle& nom) const override;
114 bool has_champ(const Motcle& nom, OBS_PTR(Champ_base) &ref_champ) const override;
115 bool has_champ(const Motcle& nom) const override;
116 void get_noms_champs_postraitables(Noms& nom, Option opt = NONE) const override;
117 /////////////////////////////////////////////////////
118 void calculer_pour_post(Champ_base& espace_stockage, const Nom& option, int comp) const override;
119 Motcle get_localisation_pour_post(const Nom& option) const override;
120
121 // Je rajoute deux methodes pour le calcul du flux
122 virtual void ajouter_flux(const DoubleTab& inconnue, DoubleTab& contribution) const;
123 virtual void calculer_flux(const DoubleTab& inconnue, DoubleTab& flux) const;
124
125 // Je rajoute une methode preparer_calcul() appelee lors du preparer_calcul() de l'equation
126 // Ca me permet de coder plus facilement les operateurs de diffusion selon
127 // que la diffusivite varie ou non.
128 // L'implementation par defaut dans Operateur_base.cpp ne fait rien
129 virtual void preparer_calcul();
130 int col_width_; // minimal size of a column for .out files (based on cl name length)
131 bool has_impr_file() const { return out_ != "??"; }
132
133protected:
138 Nom out_; // Nom du fichier .out pour l'impression
140 mutable DoubleTab flux_bords_; // Tableau contenant les flux sur les bords de l'operateur
141
142 Champs_compris champs_compris_;
143 OBS_PTR(Champ_Inc_base) le_champ_inco;
144 std::string nom_inco_;
145};
146
147
148/*! @brief Associe une equation a l'operateur.
149 *
150 * Simple Appel a MorEqn::associer_eqn(const Equation_base&)
151 *
152 * @param (Equation_base& eqn) l'equation a laquelle l'operateur doit etre associe
153 */
155{
157}
159{
160 return decal_temps;
161}
163{
164 return decal_temps = i;
165}
167{
168 return is >> solveur;
169}
171{
172 return matrice_;
173}
187{
188 return solveur;
189}
194
195#endif
196
Classe Champ_Inc_base.
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
classe Champs_compris_interface Cette classe contient une interface de methodes destinees a gerer
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
Definition Conds_lim.h:32
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.
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
classe Frontiere_dis_base Classe representant une frontiere discretisee.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
Classe Matrice Classe generique de la hierarchie des matrices.
Definition Matrice.h:34
classe MorEqn Classe qui regroupe les fonctionnalites de liaison avec une
Definition MorEqn.h:35
void associer_eqn(const Equation_base &)
Associe une equation a l'objet.
Definition MorEqn.cpp:28
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
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
friend class Entree
Definition Objet_U.h:76
friend class Sortie
Definition Objet_U.h:75
Objet_U()
Constructeur par defaut : attribue un numero d'identifiant unique a l'objet (object_id_),...
Definition Objet_U.cpp:55
classe Operateur_base Classe est la base de la hierarchie des objets representant un
SolveurSys solveur
virtual void ajouter_termes_croises(const DoubleTab &inco, const Probleme_base &autre_pb, const DoubleTab &autre_inco, DoubleTab &resu) const
void set_fichier(const Nom &)
virtual void modifier_pour_Cl(Matrice_Morse &, DoubleTab &) const
DOES NOTHING - to override in derived classes.
const SolveurSys & get_solveur() const
Champs_compris champs_compris_
virtual void calculer_dt_local(DoubleTab &) const
virtual void associer_champ(const Champ_Inc_base &, const std::string &nom_ch)
void creer_champ(const Motcle &motlu) override
DoubleTab & flux_bords() const
OBS_PTR(Champ_Inc_base) le_champ_inco
virtual DoubleTab & calculer(const DoubleTab &, DoubleTab &) const
virtual void contribuer_a_avec(const DoubleTab &, Matrice_Morse &) const
DOES NOTHING - to override in derived classes.
SolveurSys & set_solveur()
virtual void associer_domaine_cl_dis(const Domaine_Cl_dis_base &)
virtual int has_interface_blocs() const
void tester_contribuer_a_avec(const DoubleTab &, const Matrice_Morse &)
virtual void associer(const Domaine_dis_base &, const Domaine_Cl_dis_base &, const Champ_Inc_base &inco)=0
DoubleTab flux_bords_
const Nom fichier() const
bool has_champ_inco() const
virtual void mettre_a_jour(double temps)
DOES NOTHING - to override in derived classes.
virtual void ajouter_flux(const DoubleTab &inconnue, DoubleTab &contribution) const
void ouvrir_fichier_partage(EcrFicPartage &, const Nom &, const int flag=1) const
Ouverture/creation d'un fichier d'impression d'un operateur A surcharger dans les classes derivees.
Matrice & set_matrice()
void calculer_pour_post(Champ_base &espace_stockage, const Nom &option, int comp) const override
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
int get_decal_temps() const
virtual void preparer_calcul()
const Champ_Inc_base & mon_inconnue() const
virtual void dimensionner_bloc_vitesse(Matrice_Morse &matrice) const
virtual double calculer_dt_stab() const
Calcul dt_stab.
bool has_impr_file() const
int set_nb_ss_pas_de_temps(int)
virtual void dimensionner_termes_croises(Matrice_Morse &, const Probleme_base &autre_pb, int nl, int nc) const
virtual void dimensionner(Matrice_Morse &) const
DOES NOTHING - to override in derived classes.
virtual void completer()
Associe l'operateur au domaine_dis, le domaine_Cl_dis, et a l'inconnue de son equation.
int get_nb_ss_pas_de_temps() const
const Matrice & get_matrice() const
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
virtual int impr(Sortie &os) const
DOES NOTHING - to override in derived classes.
Entree & lire_solveur(Entree &)
virtual void contribuer_bloc_vitesse(const DoubleTab &, Matrice_Morse &) const
Motcle get_localisation_pour_post(const Nom &option) const override
virtual void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={ }) const
const Champ_base & get_champ(const Motcle &nom) const override
virtual void contribuer_au_second_membre(DoubleTab &) const
DOES NOTHING - to override in derived classes.
const std::string & nom_inconnue() const
virtual void resetTime(double time)
virtual void ajouter_contribution_explicite_au_second_membre(const Champ_Inc_base &inconnue, DoubleTab &derivee) const
std::string nom_inco_
virtual void abortTimeStep()
void set_description(const Nom &nom)
void associer_eqn(const Equation_base &)
Associe une equation a l'operateur.
const Nom description() const
virtual DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const
virtual int systeme_invariant() const
virtual void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={ }) const
virtual void contribuer_termes_croises(const DoubleTab &inco, const Probleme_base &autre_pb, const DoubleTab &autre_inco, Matrice_Morse &matrice) const
DoubleTab & flux_bords()
virtual void calculer_flux(const DoubleTab &inconnue, DoubleTab &flux) const
void ouvrir_fichier(SFichier &os, const Nom &, const int flag=1) const
Ouverture/creation d'un fichier d'impression d'un operateur A surcharger dans les classes derivees.
int set_decal_temps(int)
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 SolveurSys Un SolveurSys represente n'importe qu'elle classe
Definition SolveurSys.h:32