16#include <Modifier_pour_fluide_dilatable.h>
17#include <Modele_turbulence_scal_base.h>
18#include <Fluide_Quasi_Compressible.h>
19#include <Dirichlet_paroi_defilante.h>
20#include <Convection_Diffusion_std.h>
21#include <Paroi_scal_hyd_base_VEF.h>
22#include <Dirichlet_paroi_fixe.h>
23#include <Paroi_decalee_Robin.h>
24#include <Domaine_Cl_VEF.h>
25#include <Champ_Uniforme.h>
26#include <EcrFicPartage.h>
27#include <Probleme_base.h>
28#include <Neumann_paroi.h>
29#include <Fluide_base.h>
30#include <Domaine_VEF.h>
41 le_dom_dis_ = ref_cast(
Domaine_VF, domaine_dis);
42 le_dom_Cl_dis_ = domaine_Cl_dis;
49 int nb_boundaries = le_dom_dis_->domaine().nb_front_Cl();
50 for (
int n_bord = 0; n_bord < nb_boundaries; n_bord++)
52 const Front_VF& fr_vf = le_dom_dis_->front_VF(n_bord);
54 if (fr_vf.
le_nom() == nom_bord)
57 for (
int ind_face = 0; ind_face < nb_faces; ind_face++)
66 int nb_faces_bord_reelles = le_dom_dis_->nb_faces_bord();
74 const DoubleTab& face_normales = le_dom_dis_->face_normales();
76 const IntTab& elem_faces = le_dom_dis_->elem_faces();
77 const IntTab& face_voisins = le_dom_dis_->face_voisins();
78 const DoubleVect& volumes_maille = le_dom_dis_->volumes();
79 const DoubleVect& surfaces_face = le_dom_dis_->face_surfaces();
83 Cerr <<
"Attention, rien n'est fait en Axi pour le VEF" << finl;
88 int nb_front = le_dom_dis_->nb_front_Cl();
90 for (
int n_bord = 0; n_bord < nb_front; n_bord++)
92 const Cond_lim& la_cl = le_dom_Cl_dis_->les_conditions_limites(n_bord);
104 for (
int ind_face = 0; ind_face < size; ind_face++)
106 int num_face = le_bord.
num_face(ind_face);
107 int elem, autre_face;
108 elem = face_voisins(num_face, 0);
110 elem = face_voisins(num_face, 1);
114 autre_face = elem_faces(elem, 0);
115 if (autre_face == num_face)
116 autre_face = elem_faces(elem, 1);
118 double distance = volumes_maille(elem) / surfaces_face(num_face);
122 dist_equiv(ind_face) = distance;
127 ratio += (face_normales(num_face, i) * face_normales(num_face, i));
162 for (
int n_bord = 0; n_bord < le_dom_dis_->nb_front_Cl(); n_bord++)
164 const Cond_lim& la_cl = le_dom_Cl_dis_->les_conditions_limites(n_bord);
173 int nfin = ndeb + le_bord.
nb_faces();
174 int nb_faces_elem = le_dom_dis_->domaine().nb_faces_elem();
176 DoubleTrav lambda(nfin-ndeb);
177 DoubleTrav lambda_t(nfin-ndeb);
178 DoubleTrav tfluide(nfin-ndeb);
183 CDoubleArrView conductivite =
static_cast<const DoubleVect&
>(le_fluide.
conductivite().valeurs()).view_ro();
184 CDoubleArrView conductivite_turbulente =
static_cast<const DoubleVect&
>(mon_modele_turb_scal->conductivite_turbulente().valeurs()).view_ro();
185 CDoubleArrView face_surfaces = le_dom_dis_->face_surfaces().view_ro();
186 CDoubleTabView face_normales = le_dom_dis_->face_normales().view_ro();
187 CIntTabView face_voisins = le_dom_dis_->face_voisins().view_ro();
188 CIntTabView elem_faces = le_dom_dis_->elem_faces().view_ro();
189 CDoubleArrView temperature_v =
static_cast<const DoubleVect&
>(temperature).view_ro();
190 DoubleArrView lambda_v =
static_cast<DoubleVect&
>(lambda).view_wo();
191 DoubleArrView lambda_t_v =
static_cast<DoubleVect&
>(lambda_t).view_wo();
192 DoubleArrView tfluide_v =
static_cast<DoubleVect&
>(tfluide).view_rw();
193 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(ndeb, nfin),
194 KOKKOS_LAMBDA(
const int num_face)
196 int ind_face = num_face - ndeb;
197 int elem = face_voisins(num_face, 0);
199 elem = face_voisins(num_face, 1);
201 lambda_v(ind_face) = conductivite(unif ? 0 : elem);
202 lambda_t_v(ind_face) = conductivite_turbulente(elem);
205 double surface_face = face_surfaces(num_face);
206 for (
int i = 0; i < nb_faces_elem; i++)
208 int j = elem_faces(elem, i);
211 double surface_pond = 0.;
212 for (
int kk = 0; kk < dim; kk++)
214 (face_normales(j, kk) * oriente_normale(j, elem, face_voisins) *
215 face_normales(num_face, kk) * oriente_normale(num_face, elem, face_voisins))
216 / (surface_face * surface_face);
217 tfluide_v(ind_face) += temperature_v(j) * surface_pond;
221 end_gpu_timer(__KERNEL_NAME__);
223 for (
int num_face = ndeb; num_face < nfin; num_face++)
225 int ind_face = num_face - ndeb;
227 tab_(num_face, 0) = d_equiv;
228 tab_(num_face, 1) = (lambda(ind_face) + lambda_t(ind_face)) / lambda(ind_face) *
tab_d_reel_[num_face] / d_equiv;
229 tab_(num_face, 2) = (lambda(ind_face) + lambda_t(ind_face)) / d_equiv;
230 tab_(num_face, 3) = tfluide(ind_face);
235 double tparoi = temperature(num_face);
236 double flux = la_cl_neum.
flux_impose(num_face - ndeb);
237 double tparoi_equiv = tfluide(ind_face) + flux / (lambda(ind_face) + lambda_t(ind_face)) * d_equiv;
238 tab_(num_face, 4) = tparoi;
239 tab_(num_face, 5) = tparoi_equiv;
243 tab_(num_face, 4) = 0.;
244 tab_(num_face, 5) = 0.;
258 for (
int n_bord = 0; n_bord < le_dom_dis_->nb_front_Cl(); n_bord++)
260 const Cond_lim& la_cl = le_dom_Cl_dis_->les_conditions_limites(n_bord);
271 Nusselt <<
"Bord " << le_bord.
le_nom() << finl;
277 <<
"----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------"
279 Nusselt <<
"\tFace a\t\t\t\t|" << finl;
281 <<
"----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------"
283 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;
285 <<
"----------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------"
291 <<
"----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------"
293 Nusselt <<
"\tFace a\t\t\t\t\t\t\t|" << finl;
295 <<
"----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------"
297 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;
299 <<
"----------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------"
307 Nusselt <<
"----------------------------------------------------------------------------------------------------------------------------------------------------------------"
309 Nusselt <<
"\tFace a\t\t\t\t|" << finl;
310 Nusselt <<
"----------------------------------------------------------------------------------------------------------------------------------------------------------------"
312 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;
313 Nusselt <<
"----------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------" << finl;
317 Nusselt <<
"----------------------------------------------------------------------------------------------------------------------------------------------------------------"
319 Nusselt <<
"\tFace a\t\t\t\t\t\t\t|" << finl;
320 Nusselt <<
"----------------------------------------------------------------------------------------------------------------------------------------------------------------"
322 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;
323 Nusselt <<
"----------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------"
329 int nfin = ndeb + le_bord.
nb_faces();
331 for (
int num_face = ndeb; num_face < nfin; num_face++)
333 double x = le_dom_dis_->xv(num_face, 0);
334 double y = le_dom_dis_->xv(num_face, 1);
336 Nusselt << x <<
"\t| " << y;
339 double z = le_dom_dis_->xv(num_face, 2);
340 Nusselt << x <<
"\t| " << y <<
"\t| " << z;
345 for (
int i=0; i<nb_fields; i++)
346 Nusselt <<
"\t| " <<
tab_(num_face, i);
353 Nusselt << finl << finl;
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
classe Cond_lim Classe generique servant a representer n'importe quelle classe
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.
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
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,...
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.
classe Fluide_base Cette classe represente un d'un fluide incompressible ainsi que
int num_premiere_face() const
int num_face(const int) const
virtual void creer_tableau_faces(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
Cree un tableau ayant une "ligne" par face de cette frontiere Voir MD_Vector_tools::creer_tableau_dis...
const Frontiere & frontiere() const
Renvoie la frontiere geometrique associee.
const Nom & le_nom() const override
Renvoie le nom de la frontiere geometrique.
virtual const Champ_Don_base & conductivite() const
Renvoie la conductivite 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...
class Nom Une chaine de caractere pour nommer les objets de TRUST
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual const Nom & le_nom() const
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
void imprimer_nusselt(Sortie &) const override
void compute_nusselt() const override
void associer(const Domaine_dis_base &, const Domaine_Cl_dis_base &) override
DoubleVect & equivalent_distance_name(DoubleVect &d_eq, const Nom &nom_bord) const override
int init_lois_paroi() override
virtual const Equation_base & equation(int) const =0
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Classe de base des flux de sortie.
void resize(_SIZE_, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
virtual const MD_Vector & get_md_vector() const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
Classe Turbulence_paroi_scal_base Classe de base pour la hierarchie des classes representant les mode...
DoubleVects equivalent_distance_
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.