TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Paroi_frottante_simple.cpp
1/****************************************************************************
2* Copyright (c) 2023, 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 <Paroi_frottante_simple.h>
17
18#include <Op_Dift_Multiphase_VDF_Face.h>
19#include <Op_Diff_PolyMAC_MPFA_base.h>
20#include <Loi_paroi_adaptative.h>
21#include <Frontiere_dis_base.h>
22#include <Navier_Stokes_std.h>
23#include <Pb_Multiphase.h>
24#include <Domaine_VF.h>
25#include <Frontiere.h>
26#include <Motcle.h>
27
28#include <math.h>
29
30Implemente_instanciable(Paroi_frottante_simple,"Paroi_frottante_simple", Frottement_global_impose);
31// XD Paroi_frottante_simple condlim_base Paroi_frottante_simple BRACE Adaptive wall-law boundary condition for velocity
32
34{
35 return s << que_suis_je() << "\n";
36}
37
39{
40 if (app_domains.size() == 0)
41 app_domains = { Motcle("turbulence") };
42
43 le_champ_front.typer("Champ_front_vide");
44 return s;
45}
46
48{
49 if (!ref_cast(Operateur_Diff_base, domaine_Cl_dis().equation().operateur(0).l_op_base()).is_turb())
50 Process::exit(que_suis_je() + " : diffusion operator must be turbulent !");
51}
52
54{
55 const int nf = la_frontiere_dis->frontiere().nb_faces();
56 const int f1 = la_frontiere_dis->frontiere().num_premiere_face();
57 const int N = tab.line_size();
58
59 for (int f = 0 ; f < nf ; f++)
60 for (int n = 0 ; n < N ; n++)
61 tab(f + f1, n) |= 1;
62}
63
65{
66 const int nbp = sub_type(Pb_Multiphase, domaine_Cl_dis().equation().probleme())
67 ? ref_cast(Pb_Multiphase, domaine_Cl_dis().equation().probleme()).nb_phases()
68 : 1;
69 valeurs_coeff_.resize(0, nbp);
70 la_frontiere_dis->frontiere().creer_tableau_faces(valeurs_coeff_);
71 valeurs_coeff_ = 0 ;
72
73 valeurs_coeff_grad_.resize(0, nbp);
74 la_frontiere_dis->frontiere().creer_tableau_faces(valeurs_coeff_grad_);
76
77 correlation_loi_paroi_ = domaine_Cl_dis().equation().probleme().get_correlation("Loi_paroi");
78 return 1;
79}
80
82{
83 if (mon_temps < tps)
84 {
86 mon_temps=tps;
87 }
88}
89
91{
92 Loi_paroi_adaptative& corr_loi_paroi = ref_cast(Loi_paroi_adaptative, correlation_loi_paroi_.valeur());
93 const Domaine_VF& domaine = ref_cast(Domaine_VF, domaine_Cl_dis().equation().probleme().domaine_dis());
94
95 const DoubleTab& u_tau = corr_loi_paroi.get_tab("u_tau"); // y_p est numerote selon les faces du domaine
96 const DoubleTab& nu_visc = ref_cast(Fluide_base, domaine_Cl_dis().equation().probleme().milieu()).viscosite_cinematique().valeurs();
97 const DoubleTab& mu_visc = ref_cast(Fluide_base, domaine_Cl_dis().equation().probleme().milieu()).viscosite_dynamique().valeurs();
98 const DoubleTab& vit = domaine_Cl_dis().equation().probleme().get_champ("vitesse").passe();
99 const DoubleTab& rho = domaine_Cl_dis().equation().probleme().get_champ("masse_volumique").passe();
100 const DoubleTab* alp = sub_type(Pb_Multiphase, domaine_Cl_dis().equation().probleme()) ? &domaine_Cl_dis().equation().probleme().get_champ("alpha").passe() : nullptr;
101
102 const int cnu = nu_visc.dimension(0) == 1;
103 const int cmu = mu_visc.dimension(0) == 1;
104 const int cr = rho.dimension(0) == 1;
105
106 // On va chercher le mu turbulent de PolyMAC et celui de vdf et on prend le bon dans la suite
107 const DoubleTab* mu_poly = domaine.que_suis_je().debute_par("Domaine_PolyMAC") ? &ref_cast(Op_Diff_PolyMAC_MPFA_base, domaine_Cl_dis().equation().operateur(0).l_op_base()).nu() : nullptr;
108 const DoubleTab *mu_vdf = domaine.que_suis_je().debute_par("Domaine_VDF") ? &ref_cast(Op_Dift_Multiphase_VDF_Face, domaine_Cl_dis().equation().operateur(0).l_op_base()).get_diffusivite_turbulente() : nullptr;
109 assert((mu_poly) || (mu_vdf));
110
111 const int nf = la_frontiere_dis->frontiere().nb_faces();
112 const int nf_tot = domaine.nb_faces_tot();
113 const int f1 = la_frontiere_dis->frontiere().num_premiere_face();
114 const int N = domaine_Cl_dis().equation().inconnue().valeurs().line_size();
115 const int D = dimension;
116
117 const DoubleTab& n_f = domaine.face_normales();
118 const DoubleVect& fs = domaine.face_surfaces();
119 const IntTab& f_e = domaine.face_voisins();
120
121 DoubleTab pvit_elem(0, N * dimension);
122 if (mu_vdf)
123 {
124 const Champ_Face_base& ch = ref_cast(Champ_Face_base, domaine_Cl_dis().equation().probleme().equation(0).inconnue());
125 domaine.domaine().creer_tableau_elements(pvit_elem);
126 ch.get_elem_vector_field(pvit_elem, true);
127 }
128
129 int n = 0; // The turbulent phase rubs.
130 for (int f = 0; f < nf; f++)
131 {
132 const int f_domaine = f + f1; // number of the face in the domaine
133 const int e = f_e(f_domaine,0) >= 0 ? f_e(f_domaine, 0) : f_e(f_domaine, 1);
134
135 double u_orth = 0 ;
136 DoubleTrav u_parallel(D);
137 if (mu_vdf)
138 {
139 for (int d = 0; d <D ; d++)
140 u_orth -= pvit_elem(e, N*d + n)*n_f(f_domaine,d)/fs(f_domaine); // ! n_f pointe vers la face 1 donc vers l'exterieur de l'element, d'ou le -
141 for (int d = 0 ; d < D ; d++)
142 u_parallel(d) = pvit_elem(e, N*d+n) - u_orth*(-n_f(f_domaine,d))/fs(f_domaine) ; // ! n_f pointe vers la face 1 donc vers l'exterieur de l'element, d'ou le -
143 }
144 else // mu_PolyMAC
145 {
146 for (int d = 0; d < D ; d++)
147 u_orth -= vit(nf_tot + e * D+d, n)*n_f(f_domaine,d)/fs(f_domaine); // ! n_f pointe vers la face 1 donc vers l'exterieur de l'element, d'ou le -
148 for (int d = 0 ; d < D ; d++)
149 u_parallel(d) = vit(nf_tot + e * D + d, n) - u_orth*(-n_f(f_domaine, d))/fs(f_domaine) ; // ! n_f pointe vers la face 1 donc vers l'exterieur de l'element, d'ou le -
150 }
151 const double norm_u_parallel = std::sqrt(domaine.dot(&u_parallel(0), &u_parallel(0)));
152
153 const double y_loc = f_e(f_domaine,0) >=0 ? domaine.dist_face_elem0(f_domaine, e) : domaine.dist_face_elem1(f_domaine, e);
154 const double y_plus_loc = y_loc * u_tau(f_domaine, n)/ nu_visc(!cnu * e, n) ;
155 const double fac_coeff_grad_ = fac_coeff_grad(y_plus_loc);
156 const double mu_tot_loc = (mu_poly) ? ((alp ? 1.0 : rho(!cr * e, n)) * (*mu_poly)(e, n)) : (mu_vdf) ? (*mu_vdf)(e, n) + mu_visc(!cmu * e, n) : -1;
157
158 const double rho_loc = rho(!cr * e, n);
159 if (y_plus_loc > 1)
160 {
161 const double u_tau_loc = u_tau(f_domaine, n);
162
163 // f_tau = - alpha_k rho_k u_tau**2 n_par, coeff = u_tau**2 /u_par
164 valeurs_coeff_(f, n) = (alp ? (*alp)(e, n) * rho_loc : 1) * u_tau_loc*u_tau_loc/norm_u_parallel;
165 valeurs_coeff_grad_(f, n) = fac_coeff_grad_*(alp ? (*alp)(e, n) : 1) * std::min(1./y_loc, 1/mu_tot_loc * rho_loc * u_tau_loc*u_tau_loc/norm_u_parallel);
166 }
167 else
168 {
169 // viscous case : if u_tau is small
170 valeurs_coeff_(f, n) = (alp ? (*alp)(e, n) * rho_loc : 1) * nu_visc(!cnu * e, n)/y_loc;
171 // dirichlet for calculation of gradient
172 valeurs_coeff_grad_(f, n) = fac_coeff_grad_*(alp ? (*alp)(e, n) : 1) * 1./y_loc ;
173 }
174 }
175
176 // Treatment of other phases which are supposed not to be turbulent
177 for (n = 1; n < N; n++)
178 for (int f = 0; f < nf; f++)
179 {
180 // les phases non turbulentes sont non porteuses : pas de contact paroi => des symmetries
181 valeurs_coeff_(f, n) = 0;
182 valeurs_coeff_grad_(f, n) = 0;
183 }
184
185 valeurs_coeff_.echange_espace_virtuel();
186 valeurs_coeff_grad_.echange_espace_virtuel();
187}
virtual DoubleTab & get_elem_vector_field(DoubleTab &, bool passe=false) const
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual DoubleTab & passe(int i=1)
Definition Champ_Proto.h:50
Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limites discretisee dont l'objet fait partie.
std::vector< Motcle > app_domains
class Domaine_VF
Definition Domaine_VF.h:44
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
virtual const Champ_Inc_base & inconnue() const =0
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
classe Fluide_base Cette classe represente un d'un fluide incompressible ainsi que
Definition Fluide_base.h:38
Classe Frottement_global_impose Classe de base pour des conditions aux limites de type Navier (v.
classe Loi_paroi_adaptative correlation pour une loi de paroi adaptative qui calcule u_tau et du y_pl...
DoubleTab & get_tab(std::string str)
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Definition MorEqn.h:62
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
class Op_Diff_PolyMAC_MPFA_base
classe Operateur_Diff_base Cette classe est la base de la hierarchie des operateurs representant
Classe Paroi_frottante_simple Cette condition limite correspond a un flux impose pour une condition a...
virtual void liste_faces_loi_paroi(IntTab &) override
void completer() override
NE FAIT RIEN A surcharger dans les classes derivees.
void mettre_a_jour(double tps) override
Effectue une mise a jour en temps de la condition aux limites.
virtual int initialiser(double temps) override
Initialisation en debut de calcul.
virtual double fac_coeff_grad(double y_p) const
classe Pb_Multiphase Cette classe represente un probleme de thermohydraulique multiphase de type "3*N...
const Champ_base & get_champ(const Motcle &nom) const override
const Correlation_base & get_correlation(std::string nom_correlation) const
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
Classe de base des flux de sortie.
Definition Sortie.h:52
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
int line_size() const
Definition TRUSTVect.tpp:67