TrioCFD 1.9.9_beta
TrioCFD documentation
Loading...
Searching...
No Matches
Loi_Paroi_Nu_Impose_VEF.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 <Loi_Paroi_Nu_Impose_VEF.h>
17#include <Champ_Uniforme.h>
18#include <Domaine_Cl_VEF.h>
19#include <Dirichlet_paroi_fixe.h>
20#include <Dirichlet_paroi_defilante.h>
21#include <Symetrie.h>
22#include <Neumann_paroi.h>
23#include <Fluide_base.h>
24#include <Fluide_Quasi_Compressible.h>
25#include <Convection_Diffusion_std.h>
26#include <Modele_turbulence_scal_base.h>
27#include <Probleme_base.h>
28#include <EcrFicPartage.h>
29#include <SFichier.h>
30#include <Modifier_pour_fluide_dilatable.h>
31
32Implemente_instanciable(Loi_Paroi_Nu_Impose_VEF,"Loi_Paroi_Nu_Impose_VEF",Paroi_scal_hyd_base_VEF);
33
34
35// printOn()
36/////
37
39{
40 return s << que_suis_je() << " " << le_nom();
41}
42
43//// readOn
44//
45
47{
48
49 // Definition des mots-cles
50 Motcles les_mots(2);
51 les_mots[0] = "nusselt";
52 les_mots[1] = "diam_hydr";
53 int nusselt_ok=-1;
54
55 // Lecture et interpretation
56 Motcle motlu, accolade_fermee="}", accolade_ouverte="{";
57 s >> motlu;
58 assert(motlu==accolade_ouverte);
59 s >> motlu;
60 if(motlu == accolade_ouverte)
61 {
62 // on passe l'accolade ouvrante
63 s >> motlu;
64 }
65 while (motlu != accolade_fermee)
66 {
67 int rang=les_mots.search(motlu);
68 switch(rang)
69 {
70 case 0 : // nusselt expression
71 {
72 nusselt_ok=0;
73 Nom tmp;
74 s >> tmp;
75 Cerr << "Lecture et interpretation de la fonction " << tmp << " ... ";
76 nusselt.setNbVar(3+dimension);
77 nusselt.setString(tmp);
78 nusselt.addVar("Re");
79 nusselt.addVar("Pr");
80 nusselt.addVar("t");
81 nusselt.addVar("x");
82 if (dimension>1)
83 nusselt.addVar("y");
84 if (dimension>2)
85 nusselt.addVar("z");
86 nusselt.parseString();
87 break;
88 }
89 case 1: // diam_hydr
90 s >> diam_hydr;
91 break;
92 default : // non compris
93 Cerr << "Mot cle \"" << motlu << "\" non compris lors de la lecture d'un "
94 << que_suis_je() << finl;
96 }
97 s >> motlu;
98 }
99
100 // Verification de la coherence
101 if (nusselt_ok==-1)
102 {
103 Cerr << "Il faut definir l'expression nusselt(Re,Pr)" << finl;
105 }
106
107 if (diam_hydr->nb_comp()!=1)
108 {
109 Cerr << "Il faut definir le champ diam_hydr a une composante" << finl;
111 }
112 return s;
113}
114
115
116/////////////////////////////////////////////////////////////////////////
117//
118// Implementation des fonctions de la classe Loi_Paroi_Nu_Impose_VEF
119//
120////////////////////////////////////////////////////////////////////////
121
123{
124 const Domaine_VEF& domaine_VEF = ref_cast(Domaine_VEF, le_dom_dis_.valeur());
125 const IntTab& face_voisins = domaine_VEF.face_voisins();
126 const Equation_base& eqn_hydr = mon_modele_turb_scal->equation().probleme().equation(0);
127 const DoubleTab& vitesse = eqn_hydr.inconnue().valeurs();
128 const Fluide_base& le_fluide = ref_cast(Fluide_base,eqn_hydr.milieu());
129 const Champ_Don_base& ch_visco_cin = le_fluide.viscosite_cinematique();
130
131 const DoubleTab& xv=domaine_VEF.xv() ; // centres de gravite des faces
132 const IntTab& elem_faces = domaine_VEF.elem_faces();
133
134 ArrOfDouble v(dimension);
135 static DoubleVect pos(dimension);
136
137 const DoubleTab& tab_visco = ch_visco_cin.valeurs();
138 int l_unif;
139 double visco=-1;
140 if (sub_type(Champ_Uniforme,ch_visco_cin))
141 {
142 l_unif = 1;
143 visco = std::max(tab_visco(0,0),DMINFLOAT);
144 }
145 else
146 l_unif = 0;
147
148 if ((!l_unif) && (local_min_vect(tab_visco)<DMINFLOAT))
149 // on ne doit pas changer tab_visco ici !
150 {
151 Cerr << "In Loi_Paroi_Nu_Impose_VEF::calculer_scal : visco = " << tab_visco.local_min_vect() << " <= 0 ? " << finl;
152 throw;
153 }
154 //tab_visco+=DMINFLOAT;
155
156 bool dh_constant=sub_type(Champ_Uniforme,diam_hydr.valeur())?true:false;
157 double dh_valeur=diam_hydr->valeurs()(0,0);
158
159 int elem;
160 double d_visco;
161 const Champ_Don_base& alpha = le_fluide.diffusivite();
162 DoubleTab alpha_t = diffusivite_turb.valeurs();
163
164 // Boucle sur les bords:
165 for (int n_bord=0; n_bord<domaine_VEF.nb_front_Cl(); n_bord++)
166 {
167
168 // Pour chaque condition limite on regarde son type
169 // On applique les lois de paroi thermiques uniquement
170 // aux voisinages des parois ou l'on impose la temperature
171
172 const Cond_lim& la_cl = le_dom_Cl_dis_->les_conditions_limites(n_bord);
173 if ( (sub_type(Dirichlet_paroi_fixe,la_cl.valeur()))
174 || (sub_type(Dirichlet_paroi_defilante,la_cl.valeur()))
175 || (sub_type(Symetrie,la_cl.valeur())) )
176 {
177 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
178 int size=le_bord.nb_faces();
179 for (int ind_face=0; ind_face<size; ind_face++)
180 {
181 int num_face = le_bord.num_face(ind_face);
182 elem = face_voisins(num_face,0);
183 if (elem == -1)
184 elem = face_voisins(num_face,1);
185 if (l_unif)
186 d_visco = visco;
187 else
188 d_visco = tab_visco[elem];
189
190 double d_alpha=0.;
191 if (sub_type(Champ_Uniforme,alpha))
192 d_alpha = alpha.valeurs()(0,0);
193 else
194 {
195 if (alpha.nb_comp()==1)
196 d_alpha = alpha.valeurs()(elem);
197 else
198 d_alpha = alpha.valeurs()(elem,0);
199 }
200 double Pr = d_visco/d_alpha;
201
202 // Calcul la moyenne de la vitesse aux faces (autre que bord) dans l'elem, et en calcule le module
203 v=0.;
204 double Ud = 0.;
205 int Compte_face = 0;
206 for (int nfa=0; nfa<domaine_VEF.domaine().nb_faces_elem(); nfa++)
207 if (domaine_VEF.premiere_face_int()<=elem_faces(elem,nfa))
208 {
209 int face = elem_faces(elem,nfa);
210 for (int dim=0; dim<dimension; dim++)
211 v[dim] += vitesse(face,dim);
212 Compte_face+=1 ;
213 }
214 for (int dim=0; dim<dimension; dim++)
215 {
216 v[dim] /= Compte_face ;
217 Ud += v[dim]*v[dim];
218 }
219 Ud=sqrt(Ud) ;
220
221 // Calcul de la position
222 for (int i=0; i<dimension; i++)
223 pos[i]=xv(num_face,i);
224
225 // Calcul du diametre hydraulique
226 if (!dh_constant)
227 {
228 dh_valeur=diam_hydr->valeur_a_compo(pos,0);
229 }
230
231 double Re=Ud*dh_valeur/d_visco;
232
233 nusselt.setVar("Re",Re);
234 nusselt.setVar("Pr",Pr);
235 for (int i=0; i<dimension; i++)
236 {
237 nusselt.setVar(3+i,pos[i]);
238 }
239 double Nu = nusselt.eval();
240 equivalent_distance_[n_bord](ind_face) = (d_alpha+alpha_t(elem))/d_alpha*dh_valeur/(Nu+DMINFLOAT);
241 }
242 equivalent_distance_[n_bord].echange_espace_virtuel();
243 }
244 }
245 return 1;
246}
247
248
250{
251 const Domaine_VEF& domaine_VEF = ref_cast(Domaine_VEF, le_dom_dis_.valeur());
252 const IntTab& face_voisins = domaine_VEF.face_voisins();
253 int ndeb,nfin,elem;
254 const Convection_Diffusion_std& eqn = mon_modele_turb_scal->equation();
255 const Equation_base& eqn_hydr = eqn.probleme().equation(0);
256 const Fluide_base& le_fluide = ref_cast(Fluide_base, eqn_hydr.milieu());
257 const Champ_Don_base& conductivite = le_fluide.conductivite();
258 const DoubleTab& temperature = eqn.probleme().equation(1).inconnue().valeurs();
259
260 const DoubleTab& conductivite_turbulente = mon_modele_turb_scal->conductivite_turbulente().valeurs();
261
262 EcrFicPartage Nusselt;
263 ouvrir_fichier_partage(Nusselt,"Nusselt");
264
265 bool dh_constant=sub_type(Champ_Uniforme,diam_hydr.valeur())?true:false;
266 double dh_valeur=diam_hydr->valeurs()(0,0);
267 DoubleVect pos(dimension);
268
269 for (int n_bord=0; n_bord<domaine_VEF.nb_front_Cl(); n_bord++)
270 {
271 const Cond_lim& la_cl = le_dom_Cl_dis_->les_conditions_limites(n_bord);
272 if ( (sub_type(Dirichlet_paroi_fixe,la_cl.valeur()))
273 || (sub_type(Dirichlet_paroi_defilante,la_cl.valeur()))
274 || (sub_type(Symetrie,la_cl.valeur())) )
275 {
276 const Domaine_Cl_VEF& domaine_Cl_VEF_th = ref_cast(Domaine_Cl_VEF, eqn.probleme().equation(1).domaine_Cl_dis());
277 const Cond_lim& la_cl_th = domaine_Cl_VEF_th.les_conditions_limites(n_bord);
278 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
279
280 if(je_suis_maitre())
281 {
282 Nusselt << finl;
283 Nusselt << "Bord " << le_bord.le_nom() << finl;
284 if ( (sub_type(Neumann_paroi,la_cl_th.valeur())))
285 {
286 if (dimension == 2)
287 {
288 Nusselt << "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------" << finl;
289 Nusselt << "\tFace a\t\t\t\t|" << finl;
290 Nusselt << "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------" << finl;
291 Nusselt << "X\t\t| Y\t\t\t| dist. carac. (m)\t| Nusselt (local)\t| h (Conv. W/m2/K)\t| Tf cote paroi (K)\t| T face de bord (K)\t| Tparoi equiv.(K) " << finl;
292 Nusselt << "----------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------" << finl;
293 }
294 if (dimension == 3)
295 {
296 Nusselt << "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------" << finl;
297 Nusselt << "\tFace a\t\t\t\t\t\t\t|" << finl;
298 Nusselt << "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------" << finl;
299 Nusselt << "X\t\t| Y\t\t\t| Z\t\t\t| dist. carac. (m)\t| Nusselt (local)\t| h (Conv. W/m2/K)\t| Tf cote paroi (K)\t| T face de bord (K)\t| Tparoi equiv.(K)" << finl;
300 Nusselt << "----------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------" << finl;
301 }
302 }
303 else
304 {
305 if (dimension == 2)
306 {
307 Nusselt << "----------------------------------------------------------------------------------------------------------------------------------------" << finl;
308 Nusselt << "\tFace a\t\t\t\t|" << finl;
309 Nusselt << "----------------------------------------------------------------------------------------------------------------------------------------" << finl;
310 Nusselt << "X\t\t| Y\t\t\t| dist. carac. (m)\t| Nusselt (local)\t| h (Conv. W/m2/K)\t| Tf cote paroi (K)" << finl;
311 Nusselt << "----------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------" << finl;
312 }
313 if (dimension == 3)
314 {
315 Nusselt << "----------------------------------------------------------------------------------------------------------------------------------------------------------------" << finl;
316 Nusselt << "\tFace a\t\t\t\t\t\t\t|" << finl;
317 Nusselt << "----------------------------------------------------------------------------------------------------------------------------------------------------------------" << finl;
318 Nusselt << "X\t\t| Y\t\t\t| Z\t\t\t| dist. carac. (m)\t| Nusselt (local)\t| h (Conv. W/m2/K)\t| Tf cote paroi (K)" << finl;
319 Nusselt << "----------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------" << finl;
320 }
321 }
322 }
323
324 ndeb = le_bord.num_premiere_face();
325 nfin = ndeb + le_bord.nb_faces();
326 for (int num_face=ndeb; num_face<nfin; num_face++)
327 {
328 // Calcul de la position
329 for (int i=0; i<dimension; i++)
330 pos[i]=domaine_VEF.xv(num_face,i);
331
332 // Calcul du diametre hydraulique
333 if (!dh_constant)
334 dh_valeur=diam_hydr->valeur_a_compo(pos,0);
335
336 double x=domaine_VEF.xv(num_face,0);
337 double y=domaine_VEF.xv(num_face,1);
338 double lambda,lambda_t;
339 elem = face_voisins(num_face,0);
340 if (elem == -1)
341 elem = face_voisins(num_face,1);
342 if (sub_type(Champ_Uniforme,conductivite))
343 lambda = conductivite.valeurs()(0,0);
344 else
345 {
346 if (conductivite.nb_comp()==1)
347 lambda = conductivite.valeurs()(elem);
348 else
349 lambda = conductivite.valeurs()(elem,0);
350 }
351
352 lambda_t=conductivite_turbulente(elem);
353 if (dimension == 2)
354 Nusselt << x << "\t| " << y;
355 if (dimension == 3)
356 {
357 double z=domaine_VEF.xv(num_face,2);
358 Nusselt << x << "\t| " << y << "\t| " << z;
359 }
360
361 // on doit calculer Tfluide premiere maille sans prendre en compte Tparoi
362 double tfluide=0.;
363 int nb_faces_elem = domaine_VEF.domaine().nb_faces_elem();
364 double surface_face=domaine_VEF.face_surfaces(num_face);
365 double surface_pond;
366 int j;
367 for (int i=0; i<nb_faces_elem; i++)
368 {
369 if ( (j=domaine_VEF.elem_faces(elem,i)) != num_face )
370 {
371 surface_pond = 0.;
372 for (int kk=0; kk<dimension; kk++)
373 surface_pond -= (domaine_VEF.face_normales(j,kk)*domaine_VEF.oriente_normale(j,elem)*domaine_VEF.face_normales(num_face,kk)*
374 domaine_VEF.oriente_normale(num_face,elem))/(surface_face*surface_face);
375 tfluide+=temperature(j)*surface_pond;
376 }
377 }
378
379 double d_equiv=equivalent_distance(n_bord,num_face-ndeb);
380
381 if ( (sub_type(Neumann_paroi,la_cl_th.valeur())))
382 {
383 // dans ce cas on va imprimer Tfluide (moyenne premiere maille), Tface et on Tparoi recalcule avec d_equiv
384 const Neumann_paroi& la_cl_neum = ref_cast(Neumann_paroi,la_cl_th.valeur());
385 double tparoi = temperature(num_face);
386 double flux = la_cl_neum.flux_impose(num_face-ndeb);
387 double tparoi_equiv = tfluide+flux/lambda*d_equiv;
388 Nusselt << "\t| " << d_equiv << "\t| " << (lambda+lambda_t)/lambda*dh_valeur/d_equiv << "\t| " << (lambda+lambda_t)/d_equiv << "\t| " << tfluide << "\t| " << tparoi << "\t| " << tparoi_equiv << finl;
389 }
390 else
391 {
392 // on imprime Tfluide seulement car normalement Tface=Tparoi est connu
393 Nusselt << "\t| " << d_equiv << "\t| " << (lambda+lambda_t)/lambda*dh_valeur/d_equiv << "\t| " << (lambda+lambda_t)/d_equiv << "\t| " << tfluide << finl;
394 }
395 }
396 Nusselt.syncfile();
397 }
398 }
399 if(je_suis_maitre())
400 Nusselt << finl << finl;
401 Nusselt.syncfile();
402}
403
404
405
class Champ_Don_base base class of Given Fields (not calculated)
DoubleTab & valeurs() override
Overrides Champ_base::valeurs() Returns the array of values.
class Champ_Fonc_base Base class of fields that are functions of a calculated quantity
DoubleTab & valeurs() override
Returns the array of field values at the current time.
Champ_Uniforme Represents a field that is constant in space and time.
class Cond_lim Generic class used to represent any class
Definition Cond_lim.h:31
Convection_Diffusion_std This class is the base for equations modelling the transport.
Dirichlet_paroi_defilante Imposes the wall velocity in an equation of type Navier_Stokes.
Dirichlet_paroi_fixe Represents a fixed wall in a Navier-Stokes type equation.
int nb_faces_elem(int=0) const
Returns the number of faces of type i of the geometric elements that make up the domain.
Definition Domaine.h:484
const Cond_lim & les_conditions_limites(int) const
Returns the i-th boundary condition.
class Domaine_VEF
Definition Domaine_VEF.h:53
virtual const DoubleVect & face_surfaces() const
Definition Domaine_VF.h:51
virtual double face_normales(int face, int comp) const
Definition Domaine_VF.h:47
double xv(int num_face, int k) const
Definition Domaine_VF.h:76
int elem_faces(int i, int j) const
Returns the index of the i-th face of element num_elem; the face numbering convention is.
Definition Domaine_VF.h:542
int oriente_normale(int f, int e) const
Definition Domaine_VF.h:194
int premiere_face_int() const
A face is internal if and only if it separates two elements.
Definition Domaine_VF.h:463
int face_voisins(int num_face, int i) const
Returns the neighbouring element of num_face in direction i.
Definition Domaine_VF.h:418
int nb_front_Cl() const
const Domaine & domaine() const
Sortie & syncfile() override
Triggers writing to disk of the data accumulated on the different processors since the last call to s...
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
class Equation_base The role of an equation is the calculation of one or more fields....
virtual const Milieu_base & milieu() const =0
virtual const Champ_Inc_base & inconnue() const =0
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Returns the discretized boundary condition domain associated with the equation.
Probleme_base & probleme()
Returns the problem associated with the equation.
virtual int nb_comp() const
Definition Field_base.h:56
Base class for an incompressible fluid and its properties:
Definition Fluide_base.h:36
const Champ_Don_base & viscosite_cinematique() const
Definition Fluide_base.h:56
class Front_VF
Definition Front_VF.h:36
int nb_faces() const
Definition Front_VF.h:53
int num_premiere_face() const
Definition Front_VF.h:63
int num_face(const int) const
Definition Front_VF.h:68
const Nom & le_nom() const override
Returns the name of the geometric boundary.
classe Loi_Paroi_Nu_Impose_VEF
int calculer_scal(Champ_Fonc_base &) override
void imprimer_nusselt(Sortie &) const override
virtual const Champ_Don_base & conductivite() const
Returns the conductivity of the medium (const version).
virtual const Champ_Don_base & diffusivite() const
Returns the diffusivity of the medium (const version).
Classe Neumann_paroi This boundary condition corresponds to an imposed flux for the.
virtual double flux_impose(int i) const
Returns the value of the imposed flux on the i-th component of the field representing the flux at the...
Definition Neumann.cpp:35
static int dimension
Definition Objet_U.h:94
friend class Sortie
Definition Objet_U.h:70
const Nom & que_suis_je() const
Returns the string identifying the class.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Reads an Objet_U from an input stream. Virtual method to override.
Definition Objet_U.cpp:289
virtual const Nom & le_nom() const
Returns the name of the Objet_U. Virtual method to override: returns "neant" in this implementation.
Definition Objet_U.cpp:317
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
Definition Objet_U.cpp:278
virtual const Equation_base & equation(int) const =0
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
Definition Process.cpp:466
static int je_suis_maitre()
Returns 1 if on the master processor of the current group (i.e. me() == 0), 0 otherwise.
Definition Process.cpp:82
Base class for output streams.
Definition Sortie.h:52
Symetrie On symmetry faces, the following properties hold:
Definition Symetrie.h:37
_TYPE_ local_min_vect(Mp_vect_options opt=VECT_REAL_ITEMS) const
Definition TRUSTVect.h:155
const DoubleVects & equivalent_distance() const
void ouvrir_fichier_partage(EcrFicPartage &, const Nom &) const
Opens or creates a print file for Face, d_eq, local Nu, h.