TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Iterateur_VDF_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 Iterateur_VDF_base_included
17#define Iterateur_VDF_base_included
18
19#include <CL_Types_include.h>
20#include <Domaine_Cl_VDF.h>
21#include <Operateur_base.h>
22#include <Evaluateur_VDF.h>
23#include <Champ_Face_VDF.h>
24#include <Probleme_base.h>
25#include <Equation_base.h>
26#include <Domaine_VDF.h>
27#include <Milieu_base.h>
28#include <TRUSTTrav.h>
29#include <TRUST_Ref.h>
30
31class Champ_Inc_base;
32class Operateur_base;
33class Champ_base;
34class Matrice_Morse;
35
36enum class Type_Operateur { Op_CONV_ELEM , Op_CONV_FACE , Op_DIFF_ELEM , Op_DIFT_ELEM , Op_DIFF_FACE , Op_DIFT_FACE , Op_DIFT_MULTIPHASE_FACE , Op_DIFT_MULTIPHASE_ELEM } ; // ne touche pas !
37
38enum Type_Cl_VDF
39{
40 navier, // Symetrie, frottement paroi
41 sortie_libre, // Neumann_sortie_libre ou derivees
42 entree_fluide, // Dirichlet_entree_fluide
43 paroi_fixe, // Dirichlet_paroi_fixe
44 paroi_defilante, // Dirichlet_paroi_defilante
45 paroi_scalaire_impose, // Scalaire_impose_paroi ou derivees
46 paroi_dirichlet_loi_paroi, // Dirichlet_loi_paroi pour turbulence
47 paroi_adiabatique, // Neumann_paroi_adiabatique ou derivees
48 paroi, // Neumann_paroi
49 echange_externe_impose, // Echange_externe_impose
50 echange_global_impose, // Echange_global_impose
51 periodique, // periodique
52 nouvelle_Cl_VDF // Nouvelle_Cl_VDF
53};
54
56{
57 Declare_base(Iterateur_VDF_base);
58public:
59 void associer(const Domaine_VDF&, const Domaine_Cl_VDF&, const Operateur_base&);
61 void associer_champ_convecte_ou_inc(const Champ_Inc_base& ch, const Champ_base* chv, bool use=false);
62 virtual void ajouter_blocs(matrices_t mats, DoubleTab& secmem, const tabs_t& semi_impl) const=0;
63 virtual void ajouter_contribution_autre_pb(const DoubleTab& , Matrice_Morse& , const Cond_lim& , std::map<int, std::pair<int, int>>&) const { /* ne fait rien en general */ }
64 virtual void contribuer_au_second_membre(DoubleTab& ) const
65 {
66 Cerr << "Iterateur_VDF_base::" << __func__ << " should not be called !" << finl;
68 }
69
70 virtual void completer_()=0;
71 virtual int impr(Sortie& os) const=0;
73 virtual const Evaluateur_VDF& evaluateur() const=0;
74
75 inline const Domaine_VDF& domaine() const { return le_dom.valeur(); }
76 inline const Domaine_Cl_VDF& domaine_Cl() const { return la_zcl.valeur(); }
77 inline Type_Cl_VDF type_cl(const Cond_lim&) const;
78 inline const bool& is_convective_op() const { return is_conv_op_; }
79 inline const bool& is_pb_multiphase() const { return is_pb_multi; }
80 void set_name_champ_inco(const std::string& nom) { nom_ch_inco_ = nom; }
81 void set_incompressible(const int flag) { incompressible_ = flag; }
82 inline const int& is_incompressible() const { return incompressible_; }
83
84 inline void set_convective_op_pb_type(const bool ty_op, const bool ty_pb)
85 {
86 is_conv_op_ = ty_op;
87 is_pb_multi = ty_pb;
88 }
89
90 inline void set_multiscalar_diff(bool m) { multiscalar_diff_ = m; }
91
92 virtual DoubleTab& calculer(const DoubleTab& inco, DoubleTab& resu) const final
93 {
94 operator_egal(resu, 0., VECT_REAL_ITEMS);
95 return ajouter(inco,resu);
96 }
97
98 virtual DoubleTab& ajouter(const DoubleTab& inco, DoubleTab& secmem) const final
99 {
100 ajouter_blocs({}, secmem, {{ op_base->equation().inconnue().le_nom().getString(), inco }});
101 return secmem;
102 }
103
104 virtual void ajouter_contribution(const DoubleTab& inco, Matrice_Morse& m) const final
105 {
106 DoubleTrav secmem(inco); //on va le jeter
107 ajouter_blocs({{ op_base->equation().inconnue().le_nom().getString(), &m }}, secmem, {});
108 }
109
111 {
112 Cerr << "Iterateur_VDF_base::" << __func__ << " should not be called !" << finl;
114 }
115
117 {
118 Cerr << "Iterateur_VDF_base::" << __func__ << " should not be called !" << finl;
120 }
121
122protected:
126 OBS_PTR(Champ_Inc_base) le_champ_convecte_ou_inc;
128 std::string nom_ch_inco_;
129 bool is_conv_op_ = false, is_pb_multi = false, use_base_val_b_ = false, multiscalar_diff_ = false;
131};
132
133inline Type_Cl_VDF Iterateur_VDF_base::type_cl(const Cond_lim& la_cl) const
134{
135 Type_Cl_VDF retour = nouvelle_Cl_VDF;
136
137 if (sub_type(Navier, la_cl.valeur())) retour = navier;
138 else if (sub_type(Neumann_sortie_libre, la_cl.valeur())) retour = sortie_libre;
139 else if (sub_type(Dirichlet_entree_fluide, la_cl.valeur())) retour = entree_fluide;
140 else if (sub_type(Dirichlet_paroi_fixe, la_cl.valeur())) retour = paroi_fixe;
141 else if (sub_type(Dirichlet_paroi_defilante, la_cl.valeur())) retour = paroi_defilante;
142 else if (sub_type(Scalaire_impose_paroi, la_cl.valeur())) retour = paroi_scalaire_impose;
143 else if (sub_type(Dirichlet_loi_paroi, la_cl.valeur())) retour = paroi_dirichlet_loi_paroi;
144 else if (sub_type(Neumann_paroi_adiabatique, la_cl.valeur())) retour = paroi_adiabatique;
145 else if (sub_type(Neumann_paroi, la_cl.valeur())) retour = paroi;
146 else if (sub_type(Echange_externe_impose, la_cl.valeur())) retour = echange_externe_impose;
147 else if (sub_type(Echange_global_impose, la_cl.valeur())) retour = echange_global_impose;
148 else if (sub_type(Periodique, la_cl.valeur())) retour = periodique;
149
150 return retour;
151}
152
153#endif /* Iterateur_VDF_base_included */
Classe Champ_Inc_base.
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
classe Cond_lim Classe generique servant a representer n'importe quelle classe
Definition Cond_lim.h:31
classe Dirichlet_entree_fluide Cette classe represente une condition aux limite imposant une grandeur
Classe Dirichlet_loi_paroi Classe de base pour les valeurs impose pour une condition aux limites des ...
classe Dirichlet_paroi_defilante Impose la vitesse de paroi dnas une equation de type Navier_Stokes.
classe Dirichlet_paroi_fixe Represente une paroi immobile dans une equation de type Navier_Stokes.
class Domaine_Cl_VDF
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
class Domaine_VDF
Definition Domaine_VDF.h:64
Classe Echange_externe_impose: Cette classe represente le cas particulier de la classe.
Classe Echange_global_impose Cette classe represente le cas particulier de la classe.
class Evaluateur_VDF Classe de base des evaluateurs VDF.
const Domaine_Cl_VDF & domaine_Cl() const
OBS_PTR(Champ_Inc_base) le_champ_convecte_ou_inc
OBS_PTR(Domaine_Cl_VDF) la_zcl
virtual void creer_champ_T_paroi_pour_flux_parietal()
virtual void ajouter_contribution(const DoubleTab &inco, Matrice_Morse &m) const final
OBS_PTR(Operateur_base) op_base
OBS_PTR(Domaine_VDF) le_dom
Type_Cl_VDF type_cl(const Cond_lim &) const
void associer(const Domaine_VDF &, const Domaine_Cl_VDF &, const Operateur_base &)
virtual void ajouter_blocs(matrices_t mats, DoubleTab &secmem, const tabs_t &semi_impl) const =0
const bool & is_convective_op() const
virtual void contribuer_au_second_membre(DoubleTab &) const
void set_incompressible(const int flag)
virtual DoubleTab & calculer(const DoubleTab &inco, DoubleTab &resu) const final
void associer_domaine_cl_dis(const Domaine_Cl_dis_base &)
const Domaine_VDF & domaine() const
virtual int impr(Sortie &os) const =0
virtual void completer_()=0
virtual Evaluateur_VDF & evaluateur()=0
const bool & is_pb_multiphase() const
void set_name_champ_inco(const std::string &nom)
virtual void ajouter_contribution_autre_pb(const DoubleTab &, Matrice_Morse &, const Cond_lim &, std::map< int, std::pair< int, int > > &) const
void set_convective_op_pb_type(const bool ty_op, const bool ty_pb)
virtual void associer_correlation_flux_parietal(const Correlation_base &corr)
OBS_PTR(Champ_base) le_ch_v
const int & is_incompressible() const
virtual DoubleTab & ajouter(const DoubleTab &inco, DoubleTab &secmem) const final
void set_multiscalar_diff(bool m)
virtual const Evaluateur_VDF & evaluateur() const =0
void associer_champ_convecte_ou_inc(const Champ_Inc_base &ch, const Champ_base *chv, bool use=false)
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
classe Navier Condition aux limites sur la vitesse de type "Navier" :
Definition Navier.h:31
Classe Neumann_paroi_adiabatique Cette condition limite correspond a une paroi adiabatique dans une.
Classe Neumann_paroi Cette condition limite correspond a un flux impose pour l'equation de.
classe Neumann_sortie_libre Cette classe represente une frontiere ouverte sans vitesse imposee
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
classe Periodique Cette classe represente une condition aux limites periodique.
Definition Periodique.h:31
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
classe Scalaire_impose_paroi Impose un scalaire a la paroi dans une equation de type Convection-Difus...