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
35///////////////////////////////////////////////////////////////
36// Implementation des fonctions de la classe
37///////////////////////////////////////////////////////////////
38// printOn et readOn
39
41{
42 return s;
43}
44
46{
47 Param param(que_suis_je());
48 set_param(param);
49 param.lire_avec_accolades_depuis(is);
51 return is;
52}
53
55{
56 param.ajouter("A0",&A0_);
57}
58
59
61{
62 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF,domaine_dis);
63
64 nelem_ = domaine_VDF.nb_elem();
65
66 S_.resize_tab( nelem_ );
67 Cmu_.resize_tab( nelem_ );
68 C1_.resize_tab( nelem_ );
69}
70
71// Calcul de la norme S SUR LES ELEMENTS
72void Modele_Shih_Zhu_Lumley_VDF::Calcul_S(const Domaine_dis_base& domaine_dis, const Domaine_Cl_dis_base& domaine_Cl_dis,const DoubleTab& vit)
73{
74 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF,domaine_dis);
75 const Domaine_Cl_VDF& domaine_Cl_VDF = ref_cast(Domaine_Cl_VDF,domaine_Cl_dis);
76
77 int nb_elem_tot=domaine_VDF.nb_elem_tot();
78 const Champ_Face_VDF& vitesse = ref_cast(Champ_Face_VDF,eq_hydraulique->inconnue() );
79 assert (vitesse.valeurs().line_size() == 1);
80 DoubleTab gij(nb_elem_tot,dimension,dimension, vitesse.valeurs().line_size());
81 ref_cast_non_const(Champ_Face_VDF,vitesse).calcul_duidxj( vitesse.valeurs(),gij,domaine_Cl_VDF );
82
83 for (int elem=0; elem<nelem_; elem++)
84 {
85 double somme2 = 0.;
86
87 for (int i=0; i<Objet_U::dimension; i++)
88 for (int j=0; j<Objet_U::dimension; j++)
89 {
90 double Sij = 0.5*( gij(elem,i,j,0) + gij(elem,j,i,0) ) ;
91 somme2 += Sij*Sij;
92 }
93
94 S_( elem ) = sqrt(2.*somme2);
95 }
96}
97
98
99
100void 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)
101{
102#ifdef __INTEL_COMPILER
103#pragma novector // Desactive vectorisation sur Intel car crash sinon
104#endif
105 for (int elem=0; elem<nelem_; elem++)
106 {
107 double eta;
108 // Definition d'un C1 extremum base sur EPS_MIN = 1e-10
109 if (K_Eps(elem,1) <= EPS_MIN)
110 eta = S_(elem) * K_Eps(elem,0)/BR_EPS;
111 else
112 eta = S_(elem) * K_Eps(elem,0)/K_Eps(elem,1);
113
114 C1_[elem] = std::max( 0.43 , eta / ( 5. + eta ) );
115 }
116
117}
118
119
120
121void 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)
122{
123#ifdef __INTEL_COMPILER
124#pragma novector // Desactive vectorisation sur Intel car crash sinon
125#endif
126 for (int elem=0; elem<nelem_; elem++)
127 {
128 double eta;
129 // Definition d'un C1 extremum base sur EPS_MIN = 1e-10
130 if (Eps(elem) <= EPS_MIN)
131 eta = S_(elem) * K(elem)/BR_EPS;
132 else
133 eta = S_(elem) * K(elem)/Eps(elem);
134
135 C1_[elem] = std::max( 0.43 , eta / ( 5. + eta ) );
136 }
137
138}
139
140void 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)
141{
142 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF,domaine_dis);
143 const Domaine_Cl_VDF& domaine_Cl_VDF = ref_cast(Domaine_Cl_VDF,domaine_Cl_dis);
144
145 int nb_elem_tot=domaine_VDF.nb_elem_tot();
146 const Champ_Face_VDF& vitesse = ref_cast(Champ_Face_VDF,eq_hydraulique->inconnue() );
147 assert (vitesse.valeurs().line_size() == 1);
148 DoubleTab gij(nb_elem_tot,dimension,dimension, vitesse.valeurs().line_size());
149 ref_cast_non_const(Champ_Face_VDF,vitesse).calcul_duidxj( vitesse.valeurs(),gij,domaine_Cl_VDF );
150
151 DoubleTab U_etoile( nelem_);
152 DoubleTab As( nelem_);
153
154 for (int elem=0; elem<nelem_; elem++)
155 {
156 double somme = 0.;
157 double somme2 = 0.;
158 double somme3 = 0.;
159
160 for (int i=0; i<Objet_U::dimension; i++)
161 for (int j=0; j<Objet_U::dimension; j++)
162 {
163 double Sij = 0.5*( gij(elem,i,j,0) + gij(elem,j,i,0) ) ;
164 double Rij = 0.5*( gij(elem,i,j,0) - gij(elem,j,i,0) ) ;
165
166 somme += Sij*Sij+Rij*Rij;
167 somme2 += Sij*Sij;
168
169 for (int k=0; k<Objet_U::dimension; k++)
170 {
171 double Sjk = 0.5*( gij(elem,j,k,0) + gij(elem,k,j,0) ) ;
172 double Ski = 0.5*( gij(elem,k,i,0) + gij(elem,i,k,0) ) ;
173
174 somme3 += Sij*Sjk*Ski;
175 }
176 }
177
178 U_etoile( elem ) = sqrt(somme);
179 double S_tilde = sqrt(somme2);
180 S_( elem ) = sqrt(2.*somme2);
181 double val_cosinus = sqrt(6.) * somme3 / ( S_tilde * S_tilde * S_tilde +1.e-20 );
182
183 if ( val_cosinus > 1. )
184 {
185 val_cosinus = 1. ;
186 }
187 else if ( val_cosinus < -1. )
188 {
189 val_cosinus = -1. ;
190 }
191
192 As( elem ) = sqrt(6.) * cos( (1./3.) * acos( val_cosinus ) );
193
194 // Definition d'un Cmu extremum base sur EPS_MIN = 1e-10
195// if (K_Eps(elem,1) <= EPS_MIN)
196// Cmu_[elem] = 1./(A0_+As(elem)*U_etoile(elem)*K_Eps(elem,0)/BR_EPS);
197// else
198// Cmu_[elem] = 1./(A0_+As(elem)*U_etoile(elem)*K_Eps(elem,0)/K_Eps(elem,1));
199
200 Cmu_[elem] = 1./(A0_+As(elem)*U_etoile(elem)*K_Eps(elem,0)/( K_Eps(elem,1) + BR_EPS ));
201
202 }
203}
204
205void 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)
206{
207 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF,domaine_dis);
208 const Domaine_Cl_VDF& domaine_Cl_VDF = ref_cast(Domaine_Cl_VDF,domaine_Cl_dis);
209
210 int nb_elem_tot=domaine_VDF.nb_elem_tot();
211 const Champ_Face_VDF& vitesse = ref_cast(Champ_Face_VDF,eq_hydraulique->inconnue() );
212 assert (vitesse.valeurs().line_size() == 1);
213 DoubleTab gij(nb_elem_tot,dimension,dimension, vitesse.valeurs().line_size());
214 ref_cast_non_const(Champ_Face_VDF,vitesse).calcul_duidxj( vitesse.valeurs(),gij,domaine_Cl_VDF );
215
216 DoubleTab U_etoile( nelem_);
217 DoubleTab As( nelem_);
218
219 for (int elem=0; elem<nelem_; elem++)
220 {
221 double somme = 0.;
222 double somme2 = 0.;
223 double somme3 = 0.;
224
225 for (int i=0; i<Objet_U::dimension; i++)
226 for (int j=0; j<Objet_U::dimension; j++)
227 {
228 double Sij = 0.5*( gij(elem,i,j,0) + gij(elem,j,i,0) ) ;
229 double Rij = 0.5*( gij(elem,i,j,0) - gij(elem,j,i,0) ) ;
230
231 somme += Sij*Sij+Rij*Rij;
232 somme2 += Sij*Sij;
233
234 for (int k=0; k<Objet_U::dimension; k++)
235 {
236 double Sjk = 0.5*( gij(elem,j,k,0) + gij(elem,k,j,0) ) ;
237 double Ski = 0.5*( gij(elem,k,i,0) + gij(elem,i,k,0) ) ;
238
239 somme3 += Sij*Sjk*Ski;
240 }
241 }
242
243 U_etoile( elem ) = sqrt(somme);
244 double S_tilde = sqrt(somme2);
245 S_( elem ) = sqrt(2.*somme2);
246 double val_cosinus = sqrt(6.) * somme3 / ( S_tilde * S_tilde * S_tilde +1.e-20 );
247
248 if ( val_cosinus > 1. )
249 {
250 val_cosinus = 1. ;
251 }
252 else if ( val_cosinus < -1. )
253 {
254 val_cosinus = -1. ;
255 }
256
257 As( elem ) = sqrt(6.) * cos( (1./3.) * acos( val_cosinus ) );
258
259 // Definition d'un Cmu extremum base sur EPS_MIN = 1e-10
260// if (K_Eps(elem,1) <= EPS_MIN)
261// Cmu_[elem] = 1./(A0_+As(elem)*U_etoile(elem)*K_Eps(elem,0)/BR_EPS);
262// else
263// Cmu_[elem] = 1./(A0_+As(elem)*U_etoile(elem)*K_Eps(elem,0)/K_Eps(elem,1));
264
265 Cmu_[elem] = 1./(A0_+As(elem)*U_etoile(elem)*K(elem)/( Eps(elem) + BR_EPS ));
266
267 }
268}
269
270
272 const Domaine_Cl_dis_base& domaine_Cl_dis)
273{
274 le_dom_VDF = ref_cast(Domaine_VDF,domaine_dis);
275 le_dom_Cl_VDF = ref_cast(Domaine_Cl_VDF,domaine_Cl_dis);
276
277 Initialisation( domaine_dis );
278}
279
281{
282 ;
283}
284
285
286void 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)
287{
288 Calcul_Cmu_et_S(domaine_dis,domaine_Cl_dis,vitesse,K_Eps,EPS_MIN);
289 Calcul_C1(domaine_dis,domaine_Cl_dis,vitesse,K_Eps,EPS_MIN);
290}
291
292void 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,
293 const DoubleTab& visco_tab, const DoubleTab& visco_turb,const DoubleTab& tab_paroi,const int idt)
294{
295 // identique a Contributions_Sources pour l'instant
296 Calcul_Cmu_et_S(domaine_dis,domaine_Cl_dis,vitesse,K_Eps,EPS_MIN);
297 Calcul_C1(domaine_dis,domaine_Cl_dis,vitesse,K_Eps,EPS_MIN);
298}
299
300
301void 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)
302{
303 Calcul_Cmu_et_S_BiK(domaine_dis,domaine_Cl_dis,vitesse,K,Eps,EPS_MIN);
304 Calcul_C1_BiK(domaine_dis,domaine_Cl_dis,vitesse,K,Eps,EPS_MIN);
305}
306
307void 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,
308 const DoubleTab& visco_tab, const DoubleTab& visco_turb,const DoubleTab& tab_paroi,const int idt)
309{
310 // identique a Contributions_Sources pour l'instant
311 Calcul_Cmu_et_S_BiK(domaine_dis,domaine_Cl_dis,vitesse,K,Eps,EPS_MIN);
312 Calcul_C1_BiK(domaine_dis,domaine_Cl_dis,vitesse,K,Eps,EPS_MIN);
313}
314
315
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