TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Modele_Shih_Zhu_Lumley_VDF.cpp
1/****************************************************************************
2* Copyright (c) 2019, 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 <Modele_Shih_Zhu_Lumley_VDF.h>
17#include <Domaine_VDF.h>
18#include <Domaine_Cl_VDF.h>
19#include <TRUSTTrav.h>
20#include <Dirichlet.h>
21#include <Dirichlet_homogene.h>
22#include <Dirichlet_paroi_defilante.h>
23#include <Echange_externe_impose.h>
24#include <Periodique.h>
25#include <Symetrie.h>
26#include <Neumann.h>
27#include <Neumann_homogene.h>
28#include <Champ_Face_VDF.h>
29#include <Champ_Uniforme.h>
30
31
32Implemente_instanciable(Modele_Shih_Zhu_Lumley_VDF,"Modele_Shih_Zhu_Lumley_VDF",Modele_Fonc_Realisable_base);
33
34// XD Modele_Shih_Zhu_Lumley_VDF Modele_Fonc_Realisable_base Modele_Shih_Zhu_Lumley_VDF INHERITS_BRACE Functions
35// XD_CONT necessary to Realizable K-Epsilon Turbulence Model in VDF
36
37
38///////////////////////////////////////////////////////////////
39// Implementation des fonctions de la classe
40///////////////////////////////////////////////////////////////
41// printOn et readOn
42
44{
45 return s;
46}
47
49{
50 Param param(que_suis_je());
51 set_param(param);
52 param.lire_avec_accolades_depuis(is);
54 return is;
55}
56
58{
59 param.ajouter("A0",&A0_); // XD_ADD_P double
60 // XD_CONT value of parameter A0 in U* formula
61}
62
63
65{
66 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF,domaine_dis);
67
68 nelem_ = domaine_VDF.nb_elem();
69
70 S_.resize_tab( nelem_ );
71 Cmu_.resize_tab( nelem_ );
72 C1_.resize_tab( nelem_ );
73}
74
75// Calcul de la norme S SUR LES ELEMENTS
76void Modele_Shih_Zhu_Lumley_VDF::Calcul_S(const Domaine_dis_base& domaine_dis, const Domaine_Cl_dis_base& domaine_Cl_dis,const DoubleTab& vit)
77{
78 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF,domaine_dis);
79 const Domaine_Cl_VDF& domaine_Cl_VDF = ref_cast(Domaine_Cl_VDF,domaine_Cl_dis);
80
81 int nb_elem_tot=domaine_VDF.nb_elem_tot();
82 const Champ_Face_VDF& vitesse = ref_cast(Champ_Face_VDF,eq_hydraulique->inconnue() );
83 assert (vitesse.valeurs().line_size() == 1);
84 DoubleTab gij(nb_elem_tot,dimension,dimension, vitesse.valeurs().line_size());
85 ref_cast_non_const(Champ_Face_VDF,vitesse).calcul_duidxj( vitesse.valeurs(),gij,domaine_Cl_VDF );
86
87 for (int elem=0; elem<nelem_; elem++)
88 {
89 double somme2 = 0.;
90
91 for (int i=0; i<Objet_U::dimension; i++)
92 for (int j=0; j<Objet_U::dimension; j++)
93 {
94 double Sij = 0.5*( gij(elem,i,j,0) + gij(elem,j,i,0) ) ;
95 somme2 += Sij*Sij;
96 }
97
98 S_( elem ) = sqrt(2.*somme2);
99 }
100}
101
102
103
104void Modele_Shih_Zhu_Lumley_VDF::Calcul_C1 (const Domaine_dis_base& domaine_dis, const Domaine_Cl_dis_base& domaine_Cl_dis,const DoubleTab& vitesse,const DoubleTab& K_Eps, const double EPS_MIN)
105{
106#ifdef __INTEL_COMPILER
107#pragma novector // Desactive vectorisation sur Intel car crash sinon
108#endif
109 for (int elem=0; elem<nelem_; elem++)
110 {
111 double eta;
112 // Definition d'un C1 extremum base sur EPS_MIN = 1e-10
113 if (K_Eps(elem,1) <= EPS_MIN)
114 eta = S_(elem) * K_Eps(elem,0)/BR_EPS;
115 else
116 eta = S_(elem) * K_Eps(elem,0)/K_Eps(elem,1);
117
118 C1_[elem] = std::max( 0.43 , eta / ( 5. + eta ) );
119 }
120
121}
122
123
124
125void Modele_Shih_Zhu_Lumley_VDF::Calcul_C1_BiK (const Domaine_dis_base& domaine_dis, const Domaine_Cl_dis_base& domaine_Cl_dis,const DoubleTab& vitesse,const DoubleTab& K,const DoubleTab& Eps, const double EPS_MIN)
126{
127#ifdef __INTEL_COMPILER
128#pragma novector // Desactive vectorisation sur Intel car crash sinon
129#endif
130 for (int elem=0; elem<nelem_; elem++)
131 {
132 double eta;
133 // Definition d'un C1 extremum base sur EPS_MIN = 1e-10
134 if (Eps(elem) <= EPS_MIN)
135 eta = S_(elem) * K(elem)/BR_EPS;
136 else
137 eta = S_(elem) * K(elem)/Eps(elem);
138
139 C1_[elem] = std::max( 0.43 , eta / ( 5. + eta ) );
140 }
141
142}
143
144void Modele_Shih_Zhu_Lumley_VDF::Calcul_Cmu_et_S(const Domaine_dis_base& domaine_dis, const Domaine_Cl_dis_base& domaine_Cl_dis,const DoubleTab& vit, const DoubleTab& K_Eps, const double EPS_MIN)
145{
146 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF,domaine_dis);
147 const Domaine_Cl_VDF& domaine_Cl_VDF = ref_cast(Domaine_Cl_VDF,domaine_Cl_dis);
148
149 int nb_elem_tot=domaine_VDF.nb_elem_tot();
150 const Champ_Face_VDF& vitesse = ref_cast(Champ_Face_VDF,eq_hydraulique->inconnue() );
151 assert (vitesse.valeurs().line_size() == 1);
152 DoubleTab gij(nb_elem_tot,dimension,dimension, vitesse.valeurs().line_size());
153 ref_cast_non_const(Champ_Face_VDF,vitesse).calcul_duidxj( vitesse.valeurs(),gij,domaine_Cl_VDF );
154
155 DoubleTab U_etoile( nelem_);
156 DoubleTab As( nelem_);
157
158 for (int elem=0; elem<nelem_; elem++)
159 {
160 double somme = 0.;
161 double somme2 = 0.;
162 double somme3 = 0.;
163
164 for (int i=0; i<Objet_U::dimension; i++)
165 for (int j=0; j<Objet_U::dimension; j++)
166 {
167 double Sij = 0.5*( gij(elem,i,j,0) + gij(elem,j,i,0) ) ;
168 double Rij = 0.5*( gij(elem,i,j,0) - gij(elem,j,i,0) ) ;
169
170 somme += Sij*Sij+Rij*Rij;
171 somme2 += Sij*Sij;
172
173 for (int k=0; k<Objet_U::dimension; k++)
174 {
175 double Sjk = 0.5*( gij(elem,j,k,0) + gij(elem,k,j,0) ) ;
176 double Ski = 0.5*( gij(elem,k,i,0) + gij(elem,i,k,0) ) ;
177
178 somme3 += Sij*Sjk*Ski;
179 }
180 }
181
182 U_etoile( elem ) = sqrt(somme);
183 double S_tilde = sqrt(somme2);
184 S_( elem ) = sqrt(2.*somme2);
185 double val_cosinus = sqrt(6.) * somme3 / ( S_tilde * S_tilde * S_tilde +1.e-20 );
186
187 if ( val_cosinus > 1. )
188 {
189 val_cosinus = 1. ;
190 }
191 else if ( val_cosinus < -1. )
192 {
193 val_cosinus = -1. ;
194 }
195
196 As( elem ) = sqrt(6.) * cos( (1./3.) * acos( val_cosinus ) );
197
198 // Definition d'un Cmu extremum base sur EPS_MIN = 1e-10
199// if (K_Eps(elem,1) <= EPS_MIN)
200// Cmu_[elem] = 1./(A0_+As(elem)*U_etoile(elem)*K_Eps(elem,0)/BR_EPS);
201// else
202// Cmu_[elem] = 1./(A0_+As(elem)*U_etoile(elem)*K_Eps(elem,0)/K_Eps(elem,1));
203
204 Cmu_[elem] = 1./(A0_+As(elem)*U_etoile(elem)*K_Eps(elem,0)/( K_Eps(elem,1) + BR_EPS ));
205
206 }
207}
208
209void Modele_Shih_Zhu_Lumley_VDF::Calcul_Cmu_et_S_BiK(const Domaine_dis_base& domaine_dis, const Domaine_Cl_dis_base& domaine_Cl_dis,const DoubleTab& vit, const DoubleTab& K, const DoubleTab& Eps, const double EPS_MIN)
210{
211 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF,domaine_dis);
212 const Domaine_Cl_VDF& domaine_Cl_VDF = ref_cast(Domaine_Cl_VDF,domaine_Cl_dis);
213
214 int nb_elem_tot=domaine_VDF.nb_elem_tot();
215 const Champ_Face_VDF& vitesse = ref_cast(Champ_Face_VDF,eq_hydraulique->inconnue() );
216 assert (vitesse.valeurs().line_size() == 1);
217 DoubleTab gij(nb_elem_tot,dimension,dimension, vitesse.valeurs().line_size());
218 ref_cast_non_const(Champ_Face_VDF,vitesse).calcul_duidxj( vitesse.valeurs(),gij,domaine_Cl_VDF );
219
220 DoubleTab U_etoile( nelem_);
221 DoubleTab As( nelem_);
222
223 for (int elem=0; elem<nelem_; elem++)
224 {
225 double somme = 0.;
226 double somme2 = 0.;
227 double somme3 = 0.;
228
229 for (int i=0; i<Objet_U::dimension; i++)
230 for (int j=0; j<Objet_U::dimension; j++)
231 {
232 double Sij = 0.5*( gij(elem,i,j,0) + gij(elem,j,i,0) ) ;
233 double Rij = 0.5*( gij(elem,i,j,0) - gij(elem,j,i,0) ) ;
234
235 somme += Sij*Sij+Rij*Rij;
236 somme2 += Sij*Sij;
237
238 for (int k=0; k<Objet_U::dimension; k++)
239 {
240 double Sjk = 0.5*( gij(elem,j,k,0) + gij(elem,k,j,0) ) ;
241 double Ski = 0.5*( gij(elem,k,i,0) + gij(elem,i,k,0) ) ;
242
243 somme3 += Sij*Sjk*Ski;
244 }
245 }
246
247 U_etoile( elem ) = sqrt(somme);
248 double S_tilde = sqrt(somme2);
249 S_( elem ) = sqrt(2.*somme2);
250 double val_cosinus = sqrt(6.) * somme3 / ( S_tilde * S_tilde * S_tilde +1.e-20 );
251
252 if ( val_cosinus > 1. )
253 {
254 val_cosinus = 1. ;
255 }
256 else if ( val_cosinus < -1. )
257 {
258 val_cosinus = -1. ;
259 }
260
261 As( elem ) = sqrt(6.) * cos( (1./3.) * acos( val_cosinus ) );
262
263 // Definition d'un Cmu extremum base sur EPS_MIN = 1e-10
264// if (K_Eps(elem,1) <= EPS_MIN)
265// Cmu_[elem] = 1./(A0_+As(elem)*U_etoile(elem)*K_Eps(elem,0)/BR_EPS);
266// else
267// Cmu_[elem] = 1./(A0_+As(elem)*U_etoile(elem)*K_Eps(elem,0)/K_Eps(elem,1));
268
269 Cmu_[elem] = 1./(A0_+As(elem)*U_etoile(elem)*K(elem)/( Eps(elem) + BR_EPS ));
270
271 }
272}
273
274
276 const Domaine_Cl_dis_base& domaine_Cl_dis)
277{
278 le_dom_VDF = ref_cast(Domaine_VDF,domaine_dis);
279 le_dom_Cl_VDF = ref_cast(Domaine_Cl_VDF,domaine_Cl_dis);
280
281 Initialisation( domaine_dis );
282}
283
285{
286 ;
287}
288
289
290void Modele_Shih_Zhu_Lumley_VDF::Contributions_Sources(const Domaine_dis_base& domaine_dis, const Domaine_Cl_dis_base& domaine_Cl_dis,const DoubleTab& vitesse,const DoubleTab& K_Eps, const double EPS_MIN)
291{
292 Calcul_Cmu_et_S(domaine_dis,domaine_Cl_dis,vitesse,K_Eps,EPS_MIN);
293 Calcul_C1(domaine_dis,domaine_Cl_dis,vitesse,K_Eps,EPS_MIN);
294}
295
296void Modele_Shih_Zhu_Lumley_VDF::Contributions_Sources_Paroi(const Domaine_dis_base& domaine_dis, const Domaine_Cl_dis_base& domaine_Cl_dis,const DoubleTab& vitesse,const DoubleTab& K_Eps, const double EPS_MIN,
297 const DoubleTab& visco_tab, const DoubleTab& visco_turb,const DoubleTab& tab_paroi,const int idt)
298{
299 // identique a Contributions_Sources pour l'instant
300 Calcul_Cmu_et_S(domaine_dis,domaine_Cl_dis,vitesse,K_Eps,EPS_MIN);
301 Calcul_C1(domaine_dis,domaine_Cl_dis,vitesse,K_Eps,EPS_MIN);
302}
303
304
305void Modele_Shih_Zhu_Lumley_VDF::Contributions_Sources_BiK(const Domaine_dis_base& domaine_dis, const Domaine_Cl_dis_base& domaine_Cl_dis,const DoubleTab& vitesse,const DoubleTab& K,const DoubleTab& Eps, const double EPS_MIN)
306{
307 Calcul_Cmu_et_S_BiK(domaine_dis,domaine_Cl_dis,vitesse,K,Eps,EPS_MIN);
308 Calcul_C1_BiK(domaine_dis,domaine_Cl_dis,vitesse,K,Eps,EPS_MIN);
309}
310
311void Modele_Shih_Zhu_Lumley_VDF::Contributions_Sources_Paroi_BiK(const Domaine_dis_base& domaine_dis, const Domaine_Cl_dis_base& domaine_Cl_dis,const DoubleTab& vitesse,const DoubleTab& K,const DoubleTab& Eps, const double EPS_MIN,
312 const DoubleTab& visco_tab, const DoubleTab& visco_turb,const DoubleTab& tab_paroi,const int idt)
313{
314 // identique a Contributions_Sources pour l'instant
315 Calcul_Cmu_et_S_BiK(domaine_dis,domaine_Cl_dis,vitesse,K,Eps,EPS_MIN);
316 Calcul_C1_BiK(domaine_dis,domaine_Cl_dis,vitesse,K,Eps,EPS_MIN);
317}
318
319
class Champ_Face_VDF Cette classe sert a representer un champ vectoriel dont on ne calcule
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
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.
int nb_elem_tot() const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
void Calcul_Cmu_et_S(const Domaine_dis_base &domaine_dis, const Domaine_Cl_dis_base &domaine_Cl_dis, const DoubleTab &vitesse, const DoubleTab &K_Eps, const double EPS_MIN) override
void Calcul_C1_BiK(const Domaine_dis_base &domaine_dis, const Domaine_Cl_dis_base &domaine_Cl_dis, const DoubleTab &vitesse, const DoubleTab &K, const DoubleTab &Eps, const double EPS_MIN) override
void Calcul_C1(const Domaine_dis_base &domaine_dis, const Domaine_Cl_dis_base &domaine_Cl_dis, const DoubleTab &vitesse, const DoubleTab &K_Eps, const double EPS_MIN) override
void Contributions_Sources_Paroi(const Domaine_dis_base &domaine_dis, const Domaine_Cl_dis_base &domaine_Cl_dis, const DoubleTab &vitesse, const DoubleTab &K_Eps, const double EPS_MIN, const DoubleTab &visco_tab, const DoubleTab &visco_turb, const DoubleTab &tab_paroi, const int idt) override
void Contributions_Sources_Paroi_BiK(const Domaine_dis_base &domaine_dis, const Domaine_Cl_dis_base &domaine_Cl_dis, const DoubleTab &vitesse, const DoubleTab &K, const DoubleTab &Eps, const double EPS_MIN, const DoubleTab &visco_tab, const DoubleTab &visco_turb, const DoubleTab &tab_paroi, const int idt) override
virtual void set_param(Param &param) const override
void Calcul_S(const Domaine_dis_base &domaine_dis, const Domaine_Cl_dis_base &domaine_Cl_dis, const DoubleTab &vitesse) override
void Contributions_Sources_BiK(const Domaine_dis_base &domaine_dis, const Domaine_Cl_dis_base &domaine_Cl_dis, const DoubleTab &vitesse, const DoubleTab &K, const DoubleTab &Eps, const double EPS_MIN) override
void Initialisation(const Domaine_dis_base &domaine_dis)
void associer(const Domaine_dis_base &, const Domaine_Cl_dis_base &) override
void Calcul_Cmu_et_S_BiK(const Domaine_dis_base &domaine_dis, const Domaine_Cl_dis_base &domaine_Cl_dis, const DoubleTab &vitesse, const DoubleTab &K, const DoubleTab &Eps, const double EPS_MIN) override
void Contributions_Sources(const Domaine_dis_base &domaine_dis, const Domaine_Cl_dis_base &domaine_Cl_dis, const DoubleTab &vitesse, const DoubleTab &K_Eps, const double EPS_MIN) override
static int dimension
Definition Objet_U.h:99
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
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
Definition Param.cpp:364
Classe de base des flux de sortie.
Definition Sortie.h:52
int line_size() const
Definition TRUSTVect.tpp:67