TrioCFD 1.9.9_beta
TrioCFD documentation
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 class Operateur_base This class is the base of the hierarchy of objects representing an
34 *
35 * operator used in TRUST equations. Its members are
36 * the attributes and methods common to all classes that
37 * represent an operator. An Operateur is a piece of an equation,
38 * which is why it derives from MorEqn, giving it a
39 * reference to the equation to which it is attached.
40 * Example of operator classes: Op_Diff_K_Eps_negligeable,
41 * Operateur_Div_base
42 *
43 * @sa MorEqn Operateur Equation_base
44 *
45 * Abstract class. A number of methods MUST be overridden in derived classes.
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 /* allows filling dependencies on other 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 // Methods of the post-processable fields interface
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 // Adding two methods for flux computation
122 virtual void ajouter_flux(const DoubleTab& inconnue, DoubleTab& contribution) const;
123 virtual void calculer_flux(const DoubleTab& inconnue, DoubleTab& flux) const;
124
125 // Adding a preparer_calcul() method called during the equation's preparer_calcul()
126 // This makes it easier to implement diffusion operators depending on
127 // whether diffusivity varies or not.
128 // The default implementation in Operateur_base.cpp does nothing
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_; // Name of the .out file for printing
140 mutable DoubleTab flux_bords_; // Array containing the fluxes on the boundaries of the operator
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 Associates an equation with the operator.
149 *
150 * Simple call to MorEqn::associer_eqn(const Equation_base&)
151 *
152 * @param (Equation_base& eqn) the equation to which the operator must be associated
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
Class Champ_Inc_base.
class Champ_base This class is the base of the fields hierarchy.
Definition Champ_base.h:43
class Champs_compris_interface This class contains an interface of methods intended to manage
class Conds_lim This class represents a vector of boundary conditions.
Definition Conds_lim.h:32
class Domaine_Cl_dis_base Domaine_Cl_dis_base objects represent discretized boundary conditions
class Domaine_dis_base This class is the base of the hierarchy of discretized domains.
class Equation_base The role of an equation is the calculation of one or more fields....
class Frontiere_dis_base Class representing a discretized boundary.
Matrice_Morse class - Represents a (sparse) matrix M, not necessarily square,.
Matrice class - Generic class in the matrix hierarchy.
Definition Matrice.h:34
class MorEqn Class that groups the functionalities of linking with an
Definition MorEqn.h:35
void associer_eqn(const Equation_base &)
Associates an equation with the object.
Definition MorEqn.cpp:28
A character string (Nom) in uppercase.
Definition Motcle.h:26
class Nom: a character string for naming TRUST objects.
Definition Nom.h:31
An array of character strings (VECT(Nom)).
Definition Noms.h:26
friend class Entree
Definition Objet_U.h:71
friend class Sortie
Definition Objet_U.h:70
Objet_U()
Default constructor: assigns a unique identifier to the object (object_id_) and registers the object ...
Definition Objet_U.cpp:54
class Operateur_base This class is the base of the hierarchy of objects representing an
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
Opening/creation of a shared file for printing an operator. To override in derived classes.
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
Computes 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()
Associates the operator with the domaine_dis, the domaine_Cl_dis, and the unknown of its 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 &)
Associates an equation with the operator.
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
Opening/creation of a file for printing an operator. To override in derived classes.
int set_decal_temps(int)
SFichier is to the C++ ofstream class what Sortie is to the C++ ostream class.
Definition SFichier.h:29
class SolveurSys A SolveurSys represents any class
Definition SolveurSys.h:32