TrioCFD 1.9.8
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}
classe Champ_Don_base classe de base des Champs donnes (non calcules)
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
virtual void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const =0
classe Discretisation_base Cette classe represente un schema de discretisation en espace,...
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
Renvoie la discretisation associee a l'equation.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
const Turbulence_paroi_base & loi_paroi() const
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Definition MorEqn.h:62
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
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 Probleme_base C'est un Probleme_U qui n'est pas un couplage.
Classe de base des flux de sortie.
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 a la matrice implicite des termes sources par defaut pas de 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 &)