TrioCFD 1.9.8
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
classe Champ_Don_base classe de base des Champs donnes (non calcules)
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
classe Champ_Fonc_base Classe de base des champs qui sont fonction d'une grandeur calculee
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
classe Champ_Uniforme Represente un champ constant dans l'espace et dans le temps.
classe Cond_lim Classe generique servant a representer n'importe quelle classe
Definition Cond_lim.h:31
classe Convection_Diffusion_std Cette classe est la base des equations modelisant le transport
classe Dirichlet_paroi_defilante Impose la vitesse de paroi dnas une equation de type Navier_Stokes.
classe Dirichlet_paroi_fixe Represente une paroi immobile dans une equation de type Navier_Stokes.
int nb_faces_elem(int=0) const
Renvoie le nombre de face de type i des elements geometriques constituants le domaine.
Definition Domaine.h:484
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
class Domaine_VEF
Definition Domaine_VEF.h:54
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
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 oriente_normale(int f, int e) const
Definition Domaine_VF.h:194
int premiere_face_int() const
une face est interne ssi elle separe deux elements.
Definition Domaine_VF.h:463
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
Definition Domaine_VF.h:418
int nb_front_Cl() const
const Domaine & domaine() const
Sortie & syncfile() override
Provoque l'ecriture sur disque des donnees accumulees sur les differents processeurs depuis le dernie...
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
virtual const Milieu_base & milieu() const =0
virtual const Champ_Inc_base & inconnue() const =0
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
virtual int nb_comp() const
Definition Field_base.h:56
classe Fluide_base Cette classe represente un d'un fluide incompressible ainsi que
Definition Fluide_base.h:38
const Champ_Don_base & viscosite_cinematique() const
Definition Fluide_base.h:58
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
Renvoie le nom de la frontiere geometrique.
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
Renvoie la conductivite du milieu.
virtual const Champ_Don_base & diffusivite() const
Renvoie la diffusivite du milieu.
Classe Neumann_paroi Cette condition limite correspond a un flux impose pour l'equation de.
virtual double flux_impose(int i) const
Renvoie la valeur du flux impose sur la i-eme composante du champ representant le flux a la frontiere...
Definition Neumann.cpp:35
static int dimension
Definition Objet_U.h:99
friend class Sortie
Definition Objet_U.h:75
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
virtual const Equation_base & equation(int) const =0
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Definition Process.cpp:86
Classe de base des flux de sortie.
Definition Sortie.h:52
classe Symetrie Sur les faces de symetrie on a les proprietes suivantes:
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
Ouverture/creation d'un fichier d'impression de Face, d_eq, Nu local, h.