TrioCFD 1.9.9_beta
TrioCFD documentation
Loading...
Searching...
No Matches
Source_Transport_K_Eps_VEF_Face.cpp
1/****************************************************************************
2* Copyright (c) 2015 - 2016, 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 <TRUSTTabs_forward.h>
17#include <Source_Transport_K_Eps_VEF_Face.h>
18#include <Modele_turbulence_hyd_K_Eps.h>
19#include <VEF_discretisation.h>
20#include <Transport_K_Eps.h>
21#include <Schema_Temps_base.h>
22#include <Milieu_base.h>
23#include <Domaine_VEF.h>
24
25Implemente_instanciable_sans_constructeur(Source_Transport_K_Eps_VEF_Face,
26 "Source_Transport_K_Eps_VEF_P1NC",
28
30{
31 return s << que_suis_je();
32}
33
35{
39 return is;
40}
41
47
49{
50 assert(mon_equation);
52 dis.discretiser_champ("champ_face", equation().domaine_dis(), "production_k", "",
53 1, equation().schema_temps().temps_courant(), production_k_face_);
54 champs_compris_.ajoute_champ(production_k_face_);
55}
56
58 Option opt) const
59{
61 Noms noms_compris = champs_compris_.liste_noms_compris();
62
63 if (opt == DESCRIPTION)
64 Cerr << que_suis_je() << " : " << noms_compris << finl;
65 else
66 nom.add(noms_compris);
67}
68
70{
71 return mon_eq_transport_K_Eps->modele_turbulence().viscosite_turbulente().valeurs();
72}
73
75{
76 const Modele_turbulence_hyd_K_Eps& mod = ref_cast(Modele_turbulence_hyd_K_Eps, mon_eq_transport_K_Eps->modele_turbulence());
77 return mod.loi_paroi().Cisaillement_paroi();
78}
79
81{
82 return mon_eq_transport_K_Eps->inconnue().valeurs();
83}
84
85const OWN_PTR(Modele_Fonc_Bas_Reynolds_Base)& Source_Transport_K_Eps_VEF_Face::get_modele_fonc_bas_reyn() const
86{
87 return ref_cast(Modele_turbulence_hyd_K_Eps,
88 mon_eq_transport_K_Eps->modele_turbulence()).associe_modele_fonction();
89}
90
91void Source_Transport_K_Eps_VEF_Face::calcul_tabs_bas_reyn(const DoubleTrav& P, const DoubleTab& vit, const DoubleTab& visco_turb, const Champ_Don_base& ch_visco_cin,
92 const Champ_base& ch_visco_cin_ou_dyn, DoubleTab& D, DoubleTab& E, DoubleTab& F1, DoubleTab& F2) const
93{
94 const DoubleTab& K_eps = mon_eq_transport_K_Eps->inconnue().valeurs();
95 get_modele_fonc_bas_reyn()->Calcul_D(D, mon_eq_transport_K_Eps->domaine_dis(),
96 mon_eq_transport_K_Eps->domaine_Cl_dis(),
97 vit, K_eps, ch_visco_cin);
99
100 get_modele_fonc_bas_reyn()->Calcul_E(E, mon_eq_transport_K_Eps->domaine_dis(),
101 mon_eq_transport_K_Eps->domaine_Cl_dis(),
102 vit, K_eps, ch_visco_cin, visco_turb);
104
105 get_modele_fonc_bas_reyn()->Calcul_F1(F1, mon_eq_transport_K_Eps->domaine_dis(),
106 mon_eq_transport_K_Eps->domaine_Cl_dis(),
107 P, K_eps, ch_visco_cin_ou_dyn);
108 get_modele_fonc_bas_reyn()->Calcul_F2(F2, D, mon_eq_transport_K_Eps->domaine_dis(),
109 K_eps, ch_visco_cin_ou_dyn);
110}
111
113{
114 const Modele_turbulence_hyd_K_Eps& mod = ref_cast(Modele_turbulence_hyd_K_Eps,mon_eq_transport_K_Eps->modele_turbulence());
115 return mod.loi_paroi().que_suis_je();
116}
117
118void Source_Transport_K_Eps_VEF_Face::calcul_tenseur_reyn(const DoubleTab& visco_turb,
119 const DoubleTab& gradient_elem,
120 DoubleTab& Re) const
121{
122 get_modele_fonc_bas_reyn()->calcul_tenseur_Re(visco_turb, gradient_elem, Re);
123}
124
125void Source_Transport_K_Eps_VEF_Face::fill_resu_bas_rey(const DoubleVect& tab_volumes_entrelaces,
126 const DoubleTrav& tab_prod, const DoubleTab& tab_D,
127 const DoubleTab& tab_E, const DoubleTab& tab_F1,
128 const DoubleTab& tab_F2, DoubleTab& tab_resu) const
129{
130 const double LeK_MIN = mon_eq_transport_K_Eps->modele_turbulence().get_K_MIN();
131 const double _C1_ = C1;
132 const double _C2_ = C2;
133 CDoubleTabView K_eps = mon_eq_transport_K_Eps->inconnue().valeurs().view_ro();
134 CDoubleArrView volumes_entrelaces = tab_volumes_entrelaces.view_ro();
135 CDoubleArrView prod = static_cast<const ArrOfDouble&>(tab_prod).view_ro();
136 CDoubleArrView D = static_cast<const ArrOfDouble&>(tab_D).view_ro();
137 CDoubleArrView E = static_cast<const ArrOfDouble&>(tab_E).view_ro();
138 CDoubleArrView F1 = static_cast<const ArrOfDouble&>(tab_F1).view_ro();
139 CDoubleArrView F2 = static_cast<const ArrOfDouble&>(tab_F2).view_ro();
140 DoubleTabView resu = tab_resu.view_rw();
141 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), le_dom_VEF->nb_faces(), KOKKOS_LAMBDA(const int fac)
142 {
143 const double tke = K_eps(fac, 0);
144 const double eps = K_eps(fac, 1);
145 resu(fac, 0) += (prod(fac) - eps - D(fac))*volumes_entrelaces(fac);
146 if (tke >= LeK_MIN)
147 resu(fac, 1) += ((_C1_*prod(fac)*F1(fac) - _C2_*eps*F2(fac))*eps/tke + E(fac))*volumes_entrelaces(fac);
148 });
149 end_gpu_timer(__KERNEL_NAME__);
150}
151
152void Source_Transport_K_Eps_VEF_Face::fill_resu(const DoubleVect& tab_volumes_entrelaces,
153 const DoubleTrav& tab_prod, DoubleTab& tab_resu) const
154{
155 const double LeK_MIN = mon_eq_transport_K_Eps->modele_turbulence().get_K_MIN();
156 const double _C1_ = C1;
157 const double _C2_ = C2;
158 CDoubleTabView K_eps = mon_eq_transport_K_Eps->inconnue().valeurs().view_ro();
159 CDoubleArrView volumes_entrelaces = tab_volumes_entrelaces.view_ro();
160 CDoubleArrView prod = static_cast<const ArrOfDouble&>(tab_prod).view_ro();
161 DoubleArrView production_k_face = static_cast<ArrOfDouble&>(ref_cast_non_const(DoubleTab,production_k_face_->valeurs())).view_wo();
162 DoubleTabView resu = tab_resu.view_rw();
163 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), le_dom_VEF->nb_faces(), KOKKOS_LAMBDA(const int fac)
164 {
165 const double tke = K_eps(fac, 0);
166 const double eps = K_eps(fac, 1);
167 production_k_face(fac)=prod(fac);
168 resu(fac, 0) += (prod(fac) - eps)*volumes_entrelaces(fac);
169 if (K_eps(fac, 0) >= LeK_MIN)
170 resu(fac, 1) += (_C1_*prod(fac) - _C2_*eps)*eps/tke*volumes_entrelaces(fac);
171 });
172 end_gpu_timer(__KERNEL_NAME__);
173}
174
175DoubleTab& Source_Transport_K_Eps_VEF_Face::ajouter(DoubleTab& resu) const
176{
178}
179
181 Matrice_Morse& matrice_morse) const
182{
183 const double LeK_MIN = mon_eq_transport_K_Eps->modele_turbulence().get_K_MIN();
184 const double _C2_ = C2;
185 CDoubleArrView porosite_face = mon_eq_transport_K_Eps->milieu().porosite_face().view_ro();
186 CDoubleArrView volumes_entrelaces = le_dom_VEF->volumes_entrelaces().view_ro();
187 CDoubleTabView K_eps = mon_eq_transport_K_Eps->inconnue().valeurs().view_ro();
188 Matrice_Morse_View matrice;
189 matrice.set(matrice_morse);
190 // on implicite le -eps et le -eps^2/k
191 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), K_eps.extent(0), KOKKOS_LAMBDA(const int face)
192 {
193 if (K_eps(face, 0) >= LeK_MIN) // -eps*vol donne +vol dans la bonne case
194 {
195 const double tke = K_eps(face, 0);
196 const double eps = K_eps(face, 1);
197 const double volporo = porosite_face(face) * volumes_entrelaces(face);
198
199 const double coef_k = eps / tke * volporo;
200 matrice.add(face * 2, face * 2, coef_k);
201
202 const double coef_eps = _C2_ * eps / tke * volporo;
203 matrice.add(face * 2 + 1, face * 2 + 1, coef_eps);
204 }
205 });
206 end_gpu_timer(__KERNEL_NAME__);
207}
class Champ_Don_base base class of Given Fields (not calculated)
class Champ_base This class is the base of the fields hierarchy.
Definition Champ_base.h:43
virtual void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const =0
class Discretisation_base This class represents a spatial discretization scheme, which
void discretiser_champ(const Motcle &directive, const Domaine_dis_base &z, const Nom &nom, const Nom &unite, int nb_comp, int nb_pas_dt, double temps, OWN_PTR(Champ_Inc_base)&champ, const Nom &sous_type=NOM_VIDE) const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
const Discretisation_base & discretisation() const
Returns the discretization associated with the equation.
Matrice_Morse class - Represents a (sparse) matrix M, not necessarily square,.
const Turbulence_paroi_base & loi_paroi() const
const Equation_base & equation() const
Returns the reference to the equation pointed to by MorEqn::mon_equation.
Definition MorEqn.h:62
class Nom: a character string for naming TRUST objects.
Definition Nom.h:31
An array of character strings (VECT(Nom)).
Definition Noms.h:26
const Nom & que_suis_je() const
Returns the string identifying the class.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Reads an Objet_U from an input stream. Virtual method to override.
Definition Objet_U.cpp:289
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
Definition Objet_U.cpp:278
class Probleme_base It is a Probleme_U that is not a coupling.
Base class for output streams.
Definition Sortie.h:52
class Source_Transport_K_Eps_VEF_Face Cette classe represente le terme source qui figure dans l'equat...
void associer_pb(const Probleme_base &pb) override
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
DoubleTab & ajouter(DoubleTab &) const override
void contribuer_a_avec(const DoubleTab &, Matrice_Morse &) const override
contribution to the implicit matrix of source terms, by default no contribution
DoubleTab & ajouter_keps(DoubleTab &) const
virtual const DoubleTab & get_visc_turb() const
void associer_pb(const Probleme_base &pb) override
virtual const DoubleTab & get_cisaillement_paroi() const
virtual const DoubleTab & get_K_pour_production() const
Champs_compris champs_compris_
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, ConstView< _TYPE_, _SHAPE_ > > view_ro() const
Definition TRUSTTab.h:261
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, View< _TYPE_, _SHAPE_ > > view_rw()
Definition TRUSTTab.h:291
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
classe Transport_K_Eps Cette classe represente l'equation de transport de l'energie cinetique
const DoubleTab & Cisaillement_paroi() const
void verifier_pb_keps(const Probleme_base &, const Nom &)