TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Champ_Inc_base.h
1/****************************************************************************
2* Copyright (c) 2025, 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 Champ_Inc_base_included
17#define Champ_Inc_base_included
18
19#include <Interface_blocs.h>
20#include <Domaine_forward.h>
21#include <Domaine_VF.h>
22#include <Champ_base.h>
23#include <Domaine_VF.h>
24#include <TRUSTTrav.h>
25#include <TRUST_Ref.h>
26#include <MorEqn.h>
27#include <Roue.h>
28#include <Motcle.h>
29
32class MD_Vector;
33class YAML_data;
34
35/*! @brief Classe Champ_Inc_base
36 *
37 * Classe de base des champs inconnues qui sont les champs calcules par une equation.
38 * Un objet de type Roue est associe au Champ_Inc, cette roue permet de gerer le nombre de valeurs du temps pour lesquels le champ
39 * doit rester en memoire. C'est le schema en temps qui guide le nombre de valeurs a garder.
40 * Cette classe peut aussi servir a stocker des champs calcules a partir d'autres Champ_Inc. Dans ce cas, une fonction calculer_valeurs(...)
41 * est appellee lors de mettre_a_jour() et doit remplir :
42 * - les valeurs du champ a l'instant courant;
43 * - les derivees de ces valeurs par rapport aux inconnues;
44 * - ses valeurs aux bords (stockees dans un tableau, car le champ n'a pas
45 * de CL associee);
46 *
47 * OWN_PTR(Champ_Inc_base) est un morceaux d'equation car il herite de MorEqn.
48 *
49 * @sa MorEqn OWN_PTR(Champ_Inc_base) Champ_base Ch_proto Equation_base, Classe abstraite, Methodes abstraites:, const Domaine_dis_base& associer_domaine_dis_base(const Domaine_dis_base&), const Domaine_dis_base& domaine_dis_base() const, DoubleTab& remplir_coord_noeuds(DoubleTab& ) const
50 */
51
52class Champ_Inc_base : public Champ_base, public MorEqn
53{
54 Declare_base_sans_constructeur(Champ_Inc_base);
55
56public:
57 Champ_Inc_base() : fonc_calc_(nullptr) { } // par defaut : pas de fonc_calc_
58
59 // Methode reimplementees
60 int fixer_nb_valeurs_nodales(int) override;
61 double changer_temps(const double temps) override;
62 void mettre_a_jour(double temps) override;
63 int reprendre(Entree&) override;
64 int sauvegarder(Sortie&) const override;
65
66 Champ_base& affecter_compo(const Champ_base&, int compo) override;
67 void resetTime(double time) override;
68
69 // Methodes viruelles pures implementees ici
70 Champ_base& affecter_(const Champ_base&) override;
71 virtual void verifie_valeurs_cl();
72
73 /*! @brief Renvoie le tableau des valeurs du champ au temps courant.
74 *
75 * @return (DoubleTab&) le tableau des valeurs du champ
76 */
77 inline DoubleTab& valeurs() override { return les_valeurs->valeurs(); }
78 inline const DoubleTab& valeurs() const override { return les_valeurs->valeurs(); }
79
80 DoubleVect& valeur_a(const DoubleVect& position, DoubleVect& valeurs) const override;
81 DoubleTab& valeur_aux(const DoubleTab& positions, DoubleTab& valeurs) const override;
82 DoubleVect& valeur_aux_compo(const DoubleTab& positions, DoubleVect& valeurs, int ncomp) const override;
83
84 // Nouvelles methodes
85 int nb_valeurs_nodales() const override;
86 virtual int fixer_nb_valeurs_temporelles(int);
87 virtual int nb_valeurs_temporelles() const;
88 double changer_temps_futur(double, int i = 1);
89 double changer_temps_passe(double, int i = 1);
90 double recuperer_temps_futur(int i = 1) const;
91 double recuperer_temps_passe(int i = 1) const;
92 DoubleTab& valeurs(double temps) override;
93 const DoubleTab& valeurs(double temps) const override;
94
95 // Operateurs de conversion implicite
96 operator DoubleTab& () = delete;
97 operator const DoubleTab& () const = delete;
98
99 /*! @brief Renvoie les valeurs du champs a l'instant t+i.
100 *
101 * @param (int i) le pas de temps futur auquel on veut les valeurs du champ
102 * @return (DoubleTab&) les valeurs du champs a l'instant t+i
103 */
104 inline DoubleTab& futur(int i = 1) override { return les_valeurs->futur(i).valeurs(); }
105 inline const DoubleTab& futur(int i = 1) const override { return les_valeurs->futur(i).valeurs(); }
106
107 /*! @brief Renvoie les valeurs du champs a l'instant t-i.
108 *
109 * @param (int i) le pas de temps passe auquel on veut les valeurs du champ
110 * @return (DoubleTab&) les valeurs du champs a l'instant t-i
111 */
112 inline DoubleTab& passe(int i = 1) override { return les_valeurs->passe(i).valeurs(); }
113 inline const DoubleTab& passe(int i = 1) const override { return les_valeurs->passe(i).valeurs(); }
114
115 Champ_Inc_base& avancer(int i = 1);
116 Champ_Inc_base& reculer(int i = 1);
117
118 int lire_donnees(Entree&);
119 int imprime(Sortie&, int) const override;
120 int a_un_domaine_dis_base() const override { return 1; }
121
122 virtual void associer_eqn(const Equation_base&);
123 virtual void associer_domaine_cl_dis(const Domaine_Cl_dis_base&);
124 void associer_domaine_dis_base(const Domaine_dis_base&) override;
125
126 const Domaine_Cl_dis_base& domaine_Cl_dis() const;
128 const Domaine_dis_base& domaine_dis_base() const override { return le_dom_VF.valeur(); }
129 const Domaine_VF& domaine_vf() const { return le_dom_VF.valeur(); }
130
131 DoubleTab& trace(const Frontiere_dis_base&, DoubleTab&, double, int distant) const override;
132 virtual int remplir_coord_noeuds_et_polys(DoubleTab&, IntVect&) const;
133 virtual int remplir_coord_noeuds_et_polys_compo(DoubleTab&, IntVect&, int) const;
134 virtual DoubleTab& remplir_coord_noeuds(DoubleTab&) const =0;
135 virtual DoubleTab& remplir_coord_noeuds_compo(DoubleTab&, int) const;
136
137 virtual double integrale_espace(int ncomp) const;
138 const Domaine& domaine() const;
139
140 //derivees du champ en les inconnues :
141 //renvoie les derivees calcules par fonc_calc_ si champ_calcule, deriv[nom de l'inco] = 1 si vraie inconnue
142 const tabs_t& derivees() const { return deriv_; }
143 tabs_t& derivees() { return deriv_; }
144 DoubleTab& val_bord() { return val_bord_; }
145
146 //champ dependant d'autres OWN_PTR(Champ_Inc_base) : reglage de la fonciton de calcul, initialisation de val_bord_
147 void init_champ_calcule(const Objet_U& obj, fonc_calc_t fonc);
148 //pour forcer le calcul de toutes les cases au prochain mettre_a_jour() (normalement fait une seule fois)
150
151 void resize_val_bord();
153
154 //utilise les conditions aux limites (au lieu de valeur_aux() dans Champ_base)
155 //result n'est rempli que pour les faces de bord dont la CL impose une valeur (val_imp ou val_ext)
156 DoubleTab valeur_aux_bords() const override;
157
158 // Obsolete method: signature changed in order to generate a compiler error if old code is not removed
159 virtual void creer_espace_distant(int dummy) { }
160
163
164 void PDI_save_type(bool b) { PDI_save_type_ = b; }
165 virtual std::vector<YAML_data> data_a_sauvegarder() const;
166 Nom get_PDI_dname() const;
167 void set_PDI_dname(const Nom& name) { PDI_dname_ = (Motcle)name; }
168
169protected:
170 // Par defaut on initialise les valeurs a zero
171 virtual void creer_tableau_distribue(const MD_Vector&, RESIZE_OPTIONS = RESIZE_OPTIONS::COPY_INIT);
172
173
176 OBS_PTR(Domaine_VF) le_dom_VF;
177
178 /* pour les champs dependant d'autres OWN_PTR(Champ_Inc_base) */
179 fonc_calc_t fonc_calc_; //fonction de calcul
180 int fonc_calc_init_ = 0; //1 une fois qu'on a calcule le champ au moins une fois
181 RefObjU obj_calc_; //un objet a passer en argument
182 DoubleTab val_bord_; //valeurs aux bords au temps courant
183 tabs_t deriv_; //derivees au temps courant
185
186 bool PDI_save_type_ = false; // do we save the type of the unknown in pdi format?
187 Nom PDI_dname_; // For restart with PDI: to use if the name of the dataset we want to read is different from the name of the field
188
189};
190
191#endif /* Champ_Inc_base_included */
Classe Champ_Inc_base.
const Domaine & domaine() const
void set_via_ch_fonc_reprise()
void set_val_bord_fluide_multiphase(const bool flag)
void associer_domaine_dis_base(const Domaine_dis_base &) override
virtual int remplir_coord_noeuds_et_polys(DoubleTab &, IntVect &) const
NE FAIT RIEN Methode a surcharger.
virtual void creer_tableau_distribue(const MD_Vector &, RESIZE_OPTIONS=RESIZE_OPTIONS::COPY_INIT)
DoubleTab & futur(int i=1) override
Renvoie les valeurs du champs a l'instant t+i.
int fixer_nb_valeurs_nodales(int) override
int lire_donnees(Entree &)
Lit les valeurs du champs a partir d'un flot d'entree.
virtual void associer_domaine_cl_dis(const Domaine_Cl_dis_base &)
DoubleTab & passe(int i=1) override
Renvoie les valeurs du champs a l'instant t-i.
DoubleTab & val_bord()
virtual int fixer_nb_valeurs_temporelles(int)
Fixe le nombre de valeurs temporelles a conserver.
tabs_t & derivees()
void init_champ_calcule(const Objet_U &obj, fonc_calc_t fonc)
virtual int nb_valeurs_temporelles() const
Renvoie le nombre de valeurs temporelles actuellement conservees.
DoubleVect & valeur_aux_compo(const DoubleTab &positions, DoubleVect &valeurs, int ncomp) const override
Calcule les valeurs du champs inconnue aux positions specifiees, pour une certaine composante du cham...
const Domaine_Cl_dis_base & domaine_Cl_dis() const
void mettre_a_jour(double temps) override
Effectue une mise a jour en temps du champ inconnue.
virtual DoubleTab & remplir_coord_noeuds_compo(DoubleTab &, int) const
Simple appel a Champ_Inc_base::remplir_coord_noeuds(DoubleTab&).
void resetTime(double time) override
const Domaine_dis_base & domaine_dis_base() const override
double changer_temps(const double temps) override
Fixe le temps du champ.
OBS_PTR(Domaine_VF) le_dom_VF
void set_PDI_dname(const Nom &name)
virtual std::vector< YAML_data > data_a_sauvegarder() const
for PDI IO: retrieve name, type and dimensions of the field to save/restore.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual void associer_eqn(const Equation_base &)
Associe le champ a l'equation dont il represente une inconnue.
const DoubleTab & valeurs() const override
OBS_PTR(Domaine_Cl_dis_base) mon_dom_cl_dis
virtual int remplir_coord_noeuds_et_polys_compo(DoubleTab &, IntVect &, int) const
Simple appel a: Champ_Inc_base::remplir_coord_noeuds_et_polys(DoubleTab&,IntVect& poly).
virtual void verifie_valeurs_cl()
void PDI_save_type(bool b)
fonc_calc_t fonc_calc_
int sauvegarder(Sortie &) const override
Sauvegarde le champ inconnue sur un flot de sortie.
Champ_Inc_base & avancer(int i=1)
Avance le pointeur courant de i pas de temps, dans la liste des valeurs temporelles conservees.
double changer_temps_passe(double, int i=1)
Fixe le temps du ieme champ passe.
virtual double integrale_espace(int ncomp) const
int nb_valeurs_nodales() const override
Returns the number of "real" geometric positions of the degrees of freedom, or -1 if not applicable (...
const Domaine_VF & domaine_vf() const
DoubleVect & valeur_a(const DoubleVect &position, DoubleVect &valeurs) const override
Calcule la valeur du champs inconnue a la position specifiee.
double recuperer_temps_passe(int i=1) const
Retourne le temps du ieme champ passe.
virtual DoubleTab & remplir_coord_noeuds(DoubleTab &) const =0
int a_un_domaine_dis_base() const override
Champ_Inc_base & reculer(int i=1)
Recule le pointeur courant de i pas de temps, dans la liste des valeurs temporelles conservees.
int reprendre(Entree &) override
Lecture d'un champ inconnue a partir d'un flot d'entree en vue d'une reprise.
DoubleTab & trace(const Frontiere_dis_base &, DoubleTab &, double, int distant) const override
voir Champ_base Cas particulier (malheureusement) du Champ_P0_VDF :
const DoubleTab & passe(int i=1) const override
DoubleTab & valeur_aux(const DoubleTab &positions, DoubleTab &valeurs) const override
Calcule les valeurs du champs inconnue aux positions specifiees.
virtual void creer_espace_distant(int dummy)
Champ_base & affecter_compo(const Champ_base &, int compo) override
Affectation d'une composante d'un OWN_PTR(Champ_base) quelconque (Champ_base) dans une composante d'u...
bool via_ch_fonc_reprise() const
Champ_base & affecter_(const Champ_base &) override
Affectation d'un OWN_PTR(Champ_base) generique (Champ_base) dans un champ inconnue.
Nom get_PDI_dname() const
for PDI IO: retrieve the name of the HDF5 dataset in which the field will be saved or be restored fro...
DoubleTab val_bord_
const DoubleTab & futur(int i=1) const override
void reset_champ_calcule()
int imprime(Sortie &, int) const override
const tabs_t & derivees() const
DoubleTab valeur_aux_bords() const override
renvoie la valeur du champ aux faces de bord
double recuperer_temps_futur(int i=1) const
Retourne le temps du ieme champ futur.
double changer_temps_futur(double, int i=1)
Fixe le temps du ieme champ futur.
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
Champ_base()
Constructeur par defaut d'un Champ_base.
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
class Domaine_VF
Definition Domaine_VF.h:44
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....
classe Frontiere_dis_base Classe representant une frontiere discretisee.
: Cette classe est un OWN_PTR mais l'objet pointe est partage entre plusieurs
Definition MD_Vector.h:48
classe MorEqn Classe qui regroupe les fonctionnalites de liaison avec une
Definition MorEqn.h:35
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
Classe de base des flux de sortie.
Definition Sortie.h:52
classe YAML_data : collection of all needed information for data to save/restore in order to write th...
Definition YAML_data.h:26
Pointeur sur une roue.
Definition Roue.h:33