TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Modele_turbulence_hyd_LES_selectif_VDF.cpp
1/****************************************************************************
2* Copyright (c) 2024, 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
17#include <Modele_turbulence_hyd_LES_selectif_VDF.h>
18#include <VDF_discretisation.h>
19#include <Champ_Face_VDF.h>
20#include <Equation_base.h>
21#include <Domaine_VDF.h>
22#include <math.h>
23
24Implemente_instanciable_sans_constructeur(Modele_turbulence_hyd_LES_selectif_VDF, "Modele_turbulence_hyd_sous_maille_selectif_VDF", Modele_turbulence_hyd_LES_VDF);
25
26constexpr double SIN2ANGL = 11697778e-8; // sin(20 degre)
27
29{
30 Csm1_ = CSMS1;
31 Csm2_ = 1.146; // si CSM1 = 0.112 (autre 0.162)
32 // CSM2 = 27/8*M_PI^2*CSM1^2*C_k^3
33}
34
36{
37 return s << que_suis_je() << " " << le_nom();
38}
39
41{
43}
44
46{
48 const VDF_discretisation& dis = ref_cast(VDF_discretisation, mon_equation_->discretisation());
49 dis.vorticite(mon_equation_->domaine_dis(), mon_equation_->inconnue(), la_vorticite_);
50}
51
53 OBS_PTR(Champ_base) &ch_ref) const
54{
55 Motcles les_motcles(3);
56 {
57 les_motcles[0] = "viscosite_turbulente";
58 les_motcles[1] = "k";
59 les_motcles[2] = "vorticite";
60
61 }
62 int rang = les_motcles.search(mot);
63 switch(rang)
64 {
65 case 0:
66 {
67 ch_ref = la_viscosite_turbulente_.valeur();
68 return 1;
69 }
70 case 1:
71 {
72 ch_ref = energie_cinetique_turb_.valeur();
73 return 1;
74 }
75 case 2:
76 {
77 ch_ref = la_vorticite_.valeur();
78 return 1;
79 }
80 default:
81 return 0;
82 }
83}
84
91
92// Fonction qui permet d'appliquer un filtre sur la fonction de structure
93// La fonction de structure d'un element est mise a zero si il existe une
94// deviation inferieure a 20 degres entre son vecteur vorticite et le
95// vecteur moyen des vorticites des 6 elements les plus proches
96// La constante Sin2Angl contient le carre du sinus d'un angle de 20 degres
97
99{
100 const Champ_Face_VDF& vitesse = ref_cast(Champ_Face_VDF, mon_equation_->inconnue());
101 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF, le_dom_VF_.valeur());
102 const IntTab& face_voisins = domaine_VDF.face_voisins();
103 const IntTab& elem_faces = domaine_VDF.elem_faces();
104 int nb_poly = domaine_VDF.domaine().nb_elem();
105 DoubleTab& vorticite = la_vorticite_->valeurs();
106
107 la_vorticite_->mettre_a_jour(vitesse.temps());
108 vorticite.echange_espace_virtuel();
109
110 int elx0, elx1, ely0, ely1, elz0, elz1, i;
111 double norme, norme_moyen, prod;
112 DoubleVect vorti_moyen(3);
113
114 for (int num_elem = 0; num_elem < nb_poly; num_elem++)
115 {
116 elx0 = face_voisins(elem_faces(num_elem, 0), 0);
117 elx1 = face_voisins(elem_faces(num_elem, 3), 1);
118 ely0 = face_voisins(elem_faces(num_elem, 1), 0);
119 ely1 = face_voisins(elem_faces(num_elem, 4), 1);
120 elz0 = face_voisins(elem_faces(num_elem, 2), 0);
121 elz1 = face_voisins(elem_faces(num_elem, 5), 1);
122
123 double dx0 = 0., dx1 = 0., dy0 = 0., dy1 = 0., dz0 = 0., dz1 = 0.;
124 for (i = 0; i < 3; i++)
125 {
126 if (elx0 != -1)
127 dx0 += domaine_VDF.dist_elem_period(num_elem, elx0, i) * domaine_VDF.dist_elem_period(num_elem, elx0, i);
128 if (elx1 != -1)
129 dx1 += domaine_VDF.dist_elem_period(num_elem, elx1, i) * domaine_VDF.dist_elem_period(num_elem, elx1, i);
130 if (ely0 != -1)
131 dy0 += domaine_VDF.dist_elem_period(num_elem, ely0, i) * domaine_VDF.dist_elem_period(num_elem, ely0, i);
132 if (ely1 != -1)
133 dy1 += domaine_VDF.dist_elem_period(num_elem, ely1, i) * domaine_VDF.dist_elem_period(num_elem, ely1, i);
134 if (elz0 != -1)
135 dz0 += domaine_VDF.dist_elem_period(num_elem, elz0, i) * domaine_VDF.dist_elem_period(num_elem, elz0, i);
136 if (elz1 != -1)
137 dz1 += domaine_VDF.dist_elem_period(num_elem, elz1, i) * domaine_VDF.dist_elem_period(num_elem, elz1, i);
138 }
139
140 if (std::fabs(dx0) > DMINFLOAT)
141 dx0 = 1. / sqrt(dx0);
142 if (std::fabs(dx1) > DMINFLOAT)
143 dx1 = 1. / sqrt(dx1);
144 if (std::fabs(dy0) > DMINFLOAT)
145 dy0 = 1. / sqrt(dy0);
146 if (std::fabs(dy1) > DMINFLOAT)
147 dy1 = 1. / sqrt(dy1);
148 if (std::fabs(dz0) > DMINFLOAT)
149 dz0 = 1. / sqrt(dz0);
150 if (std::fabs(dz1) > DMINFLOAT)
151 dz1 = 1. / sqrt(dz1);
152
153 if ((elx0 != -1) && (elx1 != -1) && (ely0 != -1) && (ely1 != -1) && (elz0 != -1) && (elz1 != -1))
154 // Cas d'un element interne
155 {
156 for (int k = 0; k < 3; k++)
157 vorti_moyen(k) = (dx0 * vorticite(elx0, k) + dx1 * vorticite(elx1, k) + dy0 * vorticite(ely0, k) + dy1 * vorticite(ely1, k) + dz0 * vorticite(elz0, k) + dz1 * vorticite(elz1, k))
158 / (dx0 + dx1 + dy0 + dy1 + dz0 + dz1);
159 }
160 else if ((elx0 != -1) && (elx1 != -1) && (ely0 != -1) && (ely1 != -1))
161 {
162 for (int k = 0; k < 3; k++)
163 vorti_moyen(k) = (dx0 * vorticite(elx0, k) + dx1 * vorticite(elx1, k) + dy0 * vorticite(ely0, k) + dy1 * vorticite(ely1, k)) / (dx0 + dx1 + dy0 + dy1);
164 }
165 else if ((elx0 != -1) && (elx1 != -1) && (elz0 != -1) && (elz1 != -1))
166 {
167 for (int k = 0; k < 3; k++)
168 vorti_moyen(k) = (dx0 * vorticite(elx0, k) + dx1 * vorticite(elx1, k) + dz0 * vorticite(elz0, k) + dz1 * vorticite(elz1, k)) / (dx0 + dx1 + dz0 + dz1);
169 }
170 else if ((ely0 != -1) && (ely1 != -1) && (elz0 != -1) && (elz1 != -1))
171 {
172 for (int k = 0; k < 3; k++)
173 vorti_moyen(k) = (dy0 * vorticite(ely0, k) + dy1 * vorticite(ely1, k) + dz0 * vorticite(elz0, k) + dz1 * vorticite(elz1, k)) / (dy0 + dy1 + dz0 + dz1);
174 }
175 else if ((elx0 != -1) && (elx1 != -1))
176 {
177 for (int k = 0; k < 3; k++)
178 vorti_moyen(k) = (dx0 * vorticite(elx0, k) + dx1 * vorticite(elx1, k)) / (dx0 + dx1);
179 }
180 else if ((ely0 != -1) && (ely1 != -1))
181 {
182 for (int k = 0; k < 3; k++)
183 vorti_moyen(k) = (dy0 * vorticite(ely0, k) + dy1 * vorticite(ely1, k)) / (dy0 + dy1);
184 }
185 else if ((elz0 != -1) && (elz1 != -1))
186 {
187 for (int k = 0; k < 3; k++)
188 vorti_moyen(k) = (dz0 * vorticite(elz0, k) + dz1 * vorticite(elz1, k)) / (dz0 + dz1);
189 }
190 else // Cas d'un element coin ; on met FS a zero
191 // On rend nul le vecteur vorti_moyen(k) ce qui provoquera la mise a zero de FS
192 {
193 for (int k = 0; k < 3; k++)
194 vorti_moyen(k) = 0;
195 }
196
197 // Calcul du produit vectoriel entre la vorticite dans l'element
198 // et le vecteur des vorticites des elements voisins
199
200 norme = 0;
201 int k;
202 for (k = 0; k < 3; k++)
203 norme += carre(vorticite(num_elem, k));
204
205 norme_moyen = 0;
206 for (k = 0; k < 3; k++)
207 norme_moyen += carre(vorti_moyen(k));
208
209 if ((norme > 1.e-10) && (norme_moyen > 1.e-10))
210 {
211 prod = carre(vorti_moyen(1) * vorticite(num_elem, 2) - vorti_moyen(2) * vorticite(num_elem, 1)) + carre(vorti_moyen(2) * vorticite(num_elem, 0) - vorti_moyen(0) * vorticite(num_elem, 2))
212 + carre(vorti_moyen(0) * vorticite(num_elem, 1) - vorti_moyen(1) * vorticite(num_elem, 0));
213 prod /= (norme * norme_moyen);
214
215 if (prod <= SIN2ANGL)
216 F2_(num_elem) = 0;
217 }
218 else
219 // bruit numerique ou element de coin
220 F2_(num_elem) = 0;
221
222 }
223 // Vu ou etait l'echange avant ca plantait des que le nbre de maille
224 // etait different sur un des procs !!!!
225 F2_.echange_espace_virtuel();
226}
class Champ_Face_VDF Cette classe sert a representer un champ vectoriel dont on ne calcule
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
double temps() const
Renvoie le temps du champ.
int_t nb_elem() const
Definition Domaine.h:131
class Domaine_VDF
Definition Domaine_VDF.h:64
double dist_elem_period(int, int, int) const
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
Definition Domaine_VF.h:543
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
Definition Domaine_VF.h:418
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
void discretiser() override
Discretise le modele de turbulence.
classe Modele_turbulence_hyd_LES_VDF Cette classe correspond a la mise en oeuvre du modele sous
classe Modele_turbulence_hyd_LES_selectif_VDF Cette classe correspond a la mise en oeuvre du modele s...
int a_pour_Champ_Fonc(const Motcle &, OBS_PTR(Champ_base)&) const
void discretiser() override
Discretise le modele de turbulence.
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
Un tableau d'objets de la classe Motcle.
Definition Motcle.h:63
int search(const Motcle &t) const
Definition Motcle.cpp:321
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 const Nom & le_nom() const
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Definition Objet_U.cpp:319
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
Classe de base des flux de sortie.
Definition Sortie.h:52
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
void vorticite(Domaine_dis_base &, const Champ_Inc_base &, OWN_PTR(Champ_Fonc_base)&) const