16#include <Op_Conv_VEF_base.h>
18#include <Milieu_base.h>
19#include <Schema_Temps_base.h>
20#include <Probleme_base.h>
22#include <Discretisation_base.h>
24#include <Modifier_pour_fluide_dilatable.h>
25#include <Dirichlet_homogene.h>
26#include <Periodique.h>
66 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
83 for (
int n_bord = 0; n_bord < domaine_VEF.
nb_front_Cl(); n_bord++)
90 int nfin = ndeb + le_bord.
nb_faces();
91 for (
int num_face = ndeb; num_face < nfin; num_face++)
98 for (
int num_face = ndeb; num_face < nfin; num_face++)
103 double dt_stab = 1.e30;
105 CDoubleArrView fluent =
fluent_.view_ro();
107 start_gpu_timer(__KERNEL_NAME__);
108 Kokkos::parallel_reduce(__KERNEL_NAME__,
110 KOKKOS_LAMBDA(
const int ind_face,
double& dtstab)
112 int num_face = faces_entrelaces_Cl(ind_face);
113 double dt_face = volumes_entrelaces_Cl(num_face)/(fluent(num_face)+DMINFLOAT);
114 if (dt_face < dtstab) dtstab = dt_face;
115 }, Kokkos::Min<double>(dt_stab));
116 end_gpu_timer(__KERNEL_NAME__);
123 CDoubleArrView volumes_entrelaces = tab_volumes_entrelaces.view_ro();
127 double dt_stab_2 = dt_stab;
128 Kokkos::parallel_reduce(
129 start_gpu_timer(__KERNEL_NAME__),
130 range_1D(ndeb, nfin),
131 KOKKOS_LAMBDA(
const int num_face,
double& dtstab)
133 double dt_face = volumes_entrelaces(num_face) / (fluent(num_face) + DMINFLOAT);
134 if (dt_face < dtstab) dtstab = dt_face;
135 }, Kokkos::Min<double>(dt_stab_2));
136 end_gpu_timer(__KERNEL_NAME__);
137 if (dt_stab_2 < dt_stab) dt_stab = dt_stab_2;
155 DoubleTab& es_valeurs = espace_stockage.
valeurs();
158 if ((
bool(le_dom_vef)) && (
bool(la_zcl_vef)))
161 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
172 for (
int n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
181 int nfin = ndeb + le_bord.
nb_faces();
182 for (
int num_face=ndeb; num_face<nfin; num_face++)
184 dt_face = volumes_entrelaces_Cl(num_face)/(
fluent_[num_face]+1.e-30);
185 es_valeurs(num_face) = dt_face;
194 for (
int num_face=ndeb; num_face<nfin; num_face++)
196 dt_face = volumes_entrelaces_Cl(num_face)/(
fluent_[num_face]+1.e-30);
197 es_valeurs(num_face) = dt_face;
203 for (
int num_face=ndeb; num_face<nfin; num_face++)
205 dt_face = volumes_entrelaces(num_face)/(
fluent_[num_face]+1.e-30);
206 es_valeurs(num_face) = dt_face;
244 Cerr <<
"Initialisation de la roue pour la permutation des schemas de convection" << finl;
248 le_dom_vef->creer_tableau_faces(
fluent_);
257 DoubleTab& resu)
const
260 return ajouter(transporte,resu);
268 DoubleTrav tmp(
equation().inconnue().valeurs());
283 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
287 int nb_faces= domaine_VEF.
nb_faces();
288 dt_face=(volumes_entrelaces);
291 for (
int n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
296 int nfin = ndeb + le_bord.
nb_faces();
297 for (
int num_face=ndeb; num_face<nfin; num_face++)
299 if( sup_strict(
fluent_[num_face], 1.e-30) )
300 dt_face(num_face)= volumes_entrelaces_Cl(num_face)/
fluent_[num_face];
302 dt_face(num_face) = -1.;
310 for (
int num_face=ndeb; num_face<nfin; num_face++)
312 if( sup_strict(
fluent_[num_face], 1.e-30) )
313 dt_face(num_face)= volumes_entrelaces(num_face)/
fluent_[num_face];
315 dt_face(num_face) = -1.;
321 for (
int num_face=ndeb; num_face<nfin; num_face++)
323 if( sup_strict(
fluent_[num_face], 1.e-30) )
324 dt_face(num_face)= volumes_entrelaces(num_face)/
fluent_[num_face];
326 dt_face(num_face) = -1.;
330 for(
int i=0; i<nb_faces; i++)
332 if(! sup_strict(dt_face(i), 1.e-16))
333 dt_face(i) = max_dt_local;
337 for (
int n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
344 int nb_faces_bord=le_bord.
nb_faces();
345 for (
int ind_face=0; ind_face<nb_faces_bord; ind_face++)
348 int face = le_bord.
num_face(ind_face);
349 int face_associee = le_bord.
num_face(ind_face_associee);
350 if (!est_egal(dt_face(face),dt_face(face_associee),1.e-8))
352 dt_face(face) = std::min(dt_face(face),dt_face(face_associee));
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
classe Cond_lim Classe generique servant a representer n'importe quelle classe
Classe Dirichlet_homogene Cette classe est la classe de base de la hierarchie des conditions aux limi...
classe Dirichlet Cette classe est la classe de base de la hierarchie des conditions aux limites de ty...
DoubleVect & volumes_entrelaces_Cl()
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.
int premiere_face_std() const
int nb_faces() const
renvoie le nombre global de faces.
DoubleVect & volumes_entrelaces()
int premiere_face_int() const
une face est interne ssi elle separe deux elements.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
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 Champ_Inc_base & inconnue() const =0
const Nom & le_nom() const override
Renvoie le nom du champ.
int num_premiere_face() const
int num_face(const int) const
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
virtual Motcle get_localisation_pour_post(const Nom &option) const
virtual void calculer_pour_post(Champ_base &espace_stockage, const Nom &option, int comp) const
Une chaine de caractere (Nom) en majuscules.
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.
int impr(Sortie &os) const override
DOES NOTHING - to override in derived classes.
int phi_u_transportant(const Equation_base &eq) const
definit si l'on convecte psi avec phi*u ou avec u
void associer(const Domaine_dis_base &, const Domaine_Cl_dis_base &, const Champ_Inc_base &) override
DoubleTab & calculer(const DoubleTab &, DoubleTab &) const override
void calculer_pour_post(Champ_base &espace_stockage, const Nom &option, int comp) const override
const Champ_Inc_base & vitesse() const
virtual void remplir_fluent() const
void abortTimeStep() override
void associer_vitesse(const Champ_base &) override
double calculer_dt_stab() const override
Calcul dt_stab.
void associer_domaine_cl_dis(const Domaine_Cl_dis_base &) override
ArrOfInt faces_entrelaces_Cl_
void calculer_dt_local(DoubleTab &) const override
Motcle get_localisation_pour_post(const Nom &option) const override
int impr(Sortie &, const Operateur_base &) const
Impression des flux d'un operateur VEF aux faces (ie: diffusion, convection).
classe Operateur_Conv_base Cette classe est la base de la hierarchie des operateurs representant
void fixer_dt_stab_conv(double dt)
virtual void abortTimeStep()
virtual DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const
classe Periodique Cette classe represente une condition aux limites periodique.
int face_associee(int i) const
static double mp_min(double)
Classe de base des flux de sortie.
_TYPE_ mp_max_abs_vect(Mp_vect_options opt=VECT_REAL_ITEMS) const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")