TrioCFD 1.9.9_beta
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 } ; // do not touch!
37
38enum Type_Cl_VDF
39{
40 navier, // Symetrie, wall friction
41 sortie_libre, // Neumann_sortie_libre or derived
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 or derived
46 paroi_dirichlet_loi_paroi, // Dirichlet_loi_paroi for turbulence
47 paroi_adiabatique, // Neumann_paroi_adiabatique or derived
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 */
Class Champ_Inc_base.
class Champ_base This class is the base of the fields hierarchy.
Definition Champ_base.h:43
class Cond_lim Generic class used to represent any class
Definition Cond_lim.h:31
Dirichlet_entree_fluide This class represents a boundary condition imposing a quantity.
Classe Dirichlet_loi_paroi Base class for imposed values in a boundary condition of the turbulence eq...
Dirichlet_paroi_defilante Imposes the wall velocity in an equation of type Navier_Stokes.
Dirichlet_paroi_fixe Represents a fixed wall in a Navier-Stokes type equation.
class Domaine_Cl_VDF
class Domaine_Cl_dis_base Domaine_Cl_dis_base objects represent discretized boundary conditions
class Domaine_VDF
Definition Domaine_VDF.h:61
Classe Echange_externe_impose: This class represents the special case of the class.
Classe Echange_global_impose This class represents the special case of the class.
class Evaluateur_VDF Base class for VDF evaluators.
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)
Matrice_Morse class - Represents a (sparse) matrix M, not necessarily square,.
Navier Velocity boundary condition of type "Navier":
Definition Navier.h:31
Classe Neumann_paroi_adiabatique This boundary condition corresponds to an adiabatic wall in a.
Classe Neumann_paroi This boundary condition corresponds to an imposed flux for the.
Neumann_sortie_libre This class represents an open boundary without imposed velocity.
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
class Periodique This class represents a periodic boundary condition.
Definition Periodique.h:31
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
Definition Process.cpp:466
Scalaire_impose_paroi Imposes a scalar at the wall in a Convection-Diffusion equation for a scalar.