TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Source_Transport_VDF_Elem_base.cpp
1/****************************************************************************
2* Copyright (c) 2022, 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#include <Pb_Hydraulique_Concentration_Turbulent.h>
17#include <Pb_Thermohydraulique_Turbulent.h>
18#include <Source_Transport_VDF_Elem_base.h>
19#include <Modele_turbulence_hyd_K_Eps.h>
20#include <Champ_Uniforme.h>
21#include <Fluide_base.h>
22#include <Domaine_Cl_VDF.h>
23#include <Constituant.h>
24#include <Champ_Face_VDF.h>
25#include <Debog.h>
26
27Implemente_base_sans_constructeur( Source_Transport_VDF_Elem_base, "Source_Transport_VDF_Elem_base", Source_base);
28
31
33{
34 le_dom_VDF = ref_cast(Domaine_VDF, domaine_dis);
35 le_dom_Cl_VDF = ref_cast(Domaine_Cl_VDF,domaine_Cl_dis);
36}
37
39
40DoubleTab& Source_Transport_VDF_Elem_base::calculer(DoubleTab& resu) const
41{
42 resu = 0.;
43 return ajouter(resu);
44}
45
46DoubleTab& Source_Transport_VDF_Elem_base::ajouter_keps(DoubleTab& resu) const
47{
48 const Domaine_VDF& domaine_VDF = le_dom_VDF.valeur();
49 const DoubleTab& visco_turb = get_visc_turb(); // voir les classes filles
50 const DoubleTab& vit = eq_hydraulique->inconnue().valeurs();
51 const Champ_Face_VDF& ch_vit = ref_cast(Champ_Face_VDF,eq_hydraulique->inconnue());
52
53 DoubleVect P; // Ajout d'un espace virtuel au tableu P
54 domaine_VDF.domaine().creer_tableau_elements(P);
55 const bool deactivate_production_limiter=true;
56 calculer_terme_production(ch_vit,visco_turb,vit,P,deactivate_production_limiter); // voir les classes filles
57
58 const OWN_PTR(Modele_Fonc_Bas_Reynolds_Base)& mon_modele_fonc = get_modele_fonc_bas_reyn();
59 const int is_modele_fonc=(bool(mon_modele_fonc));
60
61 if (is_modele_fonc)
62 {
63 DoubleTab& D=ref_cast_non_const(DoubleTab,mon_modele_fonc->get_champ("D").valeurs());
64 DoubleTab& E=ref_cast_non_const(DoubleTab,mon_modele_fonc->get_champ("E").valeurs());
65 DoubleTab& F1=ref_cast_non_const(DoubleTab,mon_modele_fonc->get_champ("F1").valeurs());
66 DoubleTab& F2=ref_cast_non_const(DoubleTab,mon_modele_fonc->get_champ("F2").valeurs());
67 const Fluide_base& fluide=ref_cast(Fluide_base,eq_hydraulique->milieu());
68 const Champ_Don_base& ch_visco_cin = fluide.viscosite_cinematique();
69 calcul_D_E(vit,visco_turb,ch_visco_cin,D,E); // voir les classes filles
72 const Champ_base& ch_visco_cin_ou_dyn =ref_cast(Operateur_Diff_base, equation().operateur(0).l_op_base()).diffusivite();
73 DoubleTab P_tab;
74 P_tab.ref(P);
75 calcul_F1_F2(ch_visco_cin_ou_dyn,P_tab,D,F1,F2); // voir les classes filles
76
77 Debog::verifier("D",D);
78 Debog::verifier("E",E);
79 Debog::verifier("F1",F1);
80 Debog::verifier("F2",F2);
81 Debog::verifier("avt",resu);
82
83 fill_resu_bas_rey(P,D,E,F1,F2,resu); // voir les classes filles
84 Debog::verifier("ap",resu);
85 }
86 else fill_resu(P,resu);
87
89 return resu;
90}
91
93{
94 // on ajoute directement G
95 const Domaine_Cl_VDF& zcl_VDF_th = ref_cast(Domaine_Cl_VDF,eq_thermique->domaine_Cl_dis());
96 const DoubleTab& scalaire = eq_thermique->inconnue().valeurs();
97 const Modele_turbulence_scal_base& le_modele_scalaire = ref_cast(Modele_turbulence_scal_base,eq_thermique->get_modele(TURBULENCE).valeur());
98 const DoubleTab& g = gravite->valeurs(), &tab_beta = beta_t->valeurs();
99 const DoubleTab& alpha_turb = le_modele_scalaire.diffusivite_turbulente().valeurs();
100 const DoubleVect& volumes = le_dom_VDF->volumes(), &porosite_vol = le_dom_Cl_VDF->equation().milieu().porosite_elem();
101
102 // Ajout d'un espace virtuel au tableau G
103 DoubleVect G;
104 le_dom_VDF->domaine().creer_tableau_elements(G);
105
106
107 if (sub_type(Champ_Uniforme,beta_t.valeur()))
108 calculer_terme_destruction_K(le_dom_VDF.valeur(),zcl_VDF_th,G,scalaire,alpha_turb,tab_beta(0,0),g);
109 else
110 calculer_terme_destruction_K(le_dom_VDF.valeur(),zcl_VDF_th,G,scalaire,alpha_turb,tab_beta,g);
111
112 fill_resu_anisotherme(G,volumes,porosite_vol,resu); // voir les classes filles
113 return resu;
114}
115
116DoubleTab& Source_Transport_VDF_Elem_base::ajouter_concen(DoubleTab& resu) const
117{
118 const Domaine_Cl_VDF& zcl_VDF_co = ref_cast(Domaine_Cl_VDF,eq_concentration->domaine_Cl_dis());
119 const DoubleTab& concen = eq_concentration->inconnue().valeurs();
120 const Modele_turbulence_scal_base& le_modele_scalaire = ref_cast(Modele_turbulence_scal_base,eq_concentration->get_modele(TURBULENCE).valeur());
121 const DoubleTab& diffu_turb = le_modele_scalaire.conductivite_turbulente().valeurs();
122// const DoubleTab& diffu_turb = le_modele_scalaire.diffusivite_turbulente().valeurs(); // XXX : realisable utilise ca ???? a voir
123 const Champ_Uniforme& ch_beta_concen = ref_cast(Champ_Uniforme, beta_c.valeur());
124 const DoubleVect& g = gravite->valeurs(), &volumes = le_dom_VDF->volumes(), &porosite_vol = le_dom_Cl_VDF->equation().milieu().porosite_elem();
125 const int nb_consti = eq_concentration->constituant().nb_constituants();
126
127 // Ajout d'un espace virtuel au tableau G
128 DoubleVect G;
129 le_dom_VDF->domaine().creer_tableau_elements(G);
130
131 if (nb_consti == 1) calculer_terme_destruction_K(le_dom_VDF.valeur(),zcl_VDF_co,G,concen,diffu_turb,ch_beta_concen.valeurs()(0,0),g);
132 else
133 {
134 const DoubleVect& d_beta_c = ch_beta_concen.valeurs();
135 calculer_terme_destruction_K(le_dom_VDF.valeur(),zcl_VDF_co,G,concen,diffu_turb,d_beta_c,g,nb_consti);
136 }
137
138 fill_resu_concen(G,volumes,porosite_vol,resu); // voir les classes filles
139 return resu;
140}
141
142// TODO : FIXME : on peut factoriser avec les 2 methodes ajouter_anisotherme et ajouter_concen
144{
145 const Domaine_Cl_VDF& zcl_VDF_th = ref_cast(Domaine_Cl_VDF,eq_thermique->domaine_Cl_dis());
146 const Domaine_Cl_VDF& zcl_VDF_co = ref_cast(Domaine_Cl_VDF,eq_concentration->domaine_Cl_dis());
147 const DoubleTab& temper = eq_thermique->inconnue().valeurs(), &concen = eq_concentration->inconnue().valeurs();
148 const Modele_turbulence_scal_base& le_modele_scalaire = ref_cast(Modele_turbulence_scal_base,eq_thermique->get_modele(TURBULENCE).valeur());
149 const Modele_turbulence_scal_base& le_modele_scal_co = ref_cast(Modele_turbulence_scal_base,eq_concentration->get_modele(TURBULENCE).valeur());
150
151 // XXX : Elie Saikali : vaut mieux utiliser diffusivite_turbulente au lie de faire ca ....
152 // voila dans Source_Transport_Eps_Realisable_aniso_therm_concen_VDF_Elem
153 // const DoubleTab& alpha_turb = le_modele_scalaire.diffusivite_turbulente().valeurs();
154 DoubleTab alpha_turb(le_modele_scalaire.conductivite_turbulente().valeurs()); // on veut pas modifier la ref !
155 double rhocp = eq_thermique->milieu().capacite_calorifique().valeurs()(0, 0) * eq_thermique->milieu().masse_volumique().valeurs()(0, 0);
156 alpha_turb /= rhocp;
157
158 const Champ_Don_base& ch_beta_temper = beta_t.valeur();
159 const DoubleTab& diffu_turb = le_modele_scal_co.conductivite_turbulente().valeurs(),
160 &tab_beta_t = ch_beta_temper.valeurs();
161// const DoubleTab& diffu_turb = le_modele_scal_co.diffusivite_turbulente().valeurs(); // XXX : realisable utilise ca ???? a voir
162 const Champ_Uniforme& ch_beta_concen = ref_cast(Champ_Uniforme, beta_c.valeur());
163 const DoubleVect& volumes = le_dom_VDF->volumes(), &porosite_vol = le_dom_Cl_VDF->equation().milieu().porosite_elem(), &g = gravite->valeurs();
164 const int nb_consti = eq_concentration->constituant().nb_constituants();
165
166 // Ajout d'un espace virtuel au tableaux Gt et Gc
167 DoubleVect G_t, G_c;
168 le_dom_VDF->domaine().creer_tableau_elements(G_t);
169 le_dom_VDF->domaine().creer_tableau_elements(G_c);
170
171 if (sub_type(Champ_Uniforme,ch_beta_temper))
172 calculer_terme_destruction_K(le_dom_VDF.valeur(),zcl_VDF_th,G_t,temper,alpha_turb,tab_beta_t(0,0),g);
173 else
174 calculer_terme_destruction_K(le_dom_VDF.valeur(),zcl_VDF_th,G_t,temper,alpha_turb,tab_beta_t,g);
175
176 if (nb_consti == 1) calculer_terme_destruction_K(le_dom_VDF.valeur(),zcl_VDF_co,G_c,concen,diffu_turb,ch_beta_concen.valeurs()(0,0),g);
177 else
178 {
179 const DoubleVect& d_beta_c = ch_beta_concen.valeurs();
180 calculer_terme_destruction_K(le_dom_VDF.valeur(),zcl_VDF_co,G_c,concen,diffu_turb,d_beta_c,g,nb_consti);
181 }
182
183 fill_resu_anisotherme_concen(G_t,G_c,volumes,porosite_vol,resu); // voir les classes filles
184 return resu;
185}
DoubleVect & calculer_terme_destruction_K(const Domaine_VDF &, const Domaine_Cl_VDF &, DoubleVect &, const DoubleTab &, const DoubleTab &, const DoubleTab &, const DoubleVect &) const
classe Champ_Don_base classe de base des Champs donnes (non calcules)
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
class Champ_Face_VDF Cette classe sert a representer un champ vectoriel dont on ne calcule
classe Champ_Uniforme Represente un champ constant dans l'espace et dans le temps.
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
static void verifier(const char *const msg, double)
Definition Debog.cpp:21
virtual void creer_tableau_elements(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
creation d'un tableau parallele de valeurs aux elements.
Definition Domaine.cpp:851
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 Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
classe Fluide_base Cette classe represente un d'un fluide incompressible ainsi que
Definition Fluide_base.h:38
const Champ_Don_base & viscosite_cinematique() const
Definition Fluide_base.h:58
Classe Modele_turbulence_scal_base Cette classe represente un modele de turbulence pour une equation ...
const Champ_Fonc_base & conductivite_turbulente() const
const Champ_Fonc_base & diffusivite_turbulente() const
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Definition MorEqn.h:62
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
classe Operateur_Diff_base Cette classe est la base de la hierarchie des operateurs representant
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
Classe de base des flux de sortie.
Definition Sortie.h:52
DoubleTab & ajouter_anisotherme_concen(DoubleTab &) const
DoubleTab & calculer(DoubleTab &) const override
virtual void calcul_F1_F2(const Champ_base &, DoubleTab &, DoubleTab &, DoubleTab &, DoubleTab &) const
virtual void fill_resu_anisotherme_concen(const DoubleVect &, const DoubleVect &, const DoubleVect &, const DoubleVect &, DoubleTab &) const
virtual void fill_resu_anisotherme(const DoubleVect &, const DoubleVect &, const DoubleVect &, DoubleTab &) const
virtual const OWN_PTR(Modele_Fonc_Bas_Reynolds_Base) &get_modele_fonc_bas_reyn() const
DoubleTab & ajouter_keps(DoubleTab &) const
void associer_domaines(const Domaine_dis_base &, const Domaine_Cl_dis_base &) override
void associer_pb(const Probleme_base &) override
virtual void fill_resu_bas_rey(const DoubleVect &, const DoubleTab &, const DoubleTab &, const DoubleTab &, const DoubleTab &, DoubleTab &) const
DoubleTab & ajouter_anisotherme(DoubleTab &) const
DoubleTab & ajouter_concen(DoubleTab &) const
virtual void fill_resu_concen(const DoubleVect &, const DoubleVect &, const DoubleVect &, DoubleTab &) const
virtual void calculer_terme_production(const Champ_Face_VDF &, const DoubleTab &, const DoubleTab &, DoubleVect &, const bool &deactivate_production_limiter=false, const double &cst_production_limiter=0.) const
virtual const DoubleTab & get_visc_turb() const
virtual void fill_resu(const DoubleVect &, DoubleTab &) const
virtual void calcul_D_E(const DoubleTab &, const DoubleTab &, const Champ_Don_base &, DoubleTab &, DoubleTab &) const
classe Source_base Un objet Source_base est un terme apparaissant au second membre d'une
Definition Source_base.h:42
virtual DoubleTab & ajouter(DoubleTab &) const
virtual void ref(const TRUSTTab &)
Definition TRUSTTab.tpp:308
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
void associer_pb_proto(const Probleme_base &)
Entree & readOn_proto(Entree &, const Nom &)