16#include <Terme_Source_Canal_perio_VEF_P1NC.h>
17#include <Domaine_VEF.h>
18#include <Domaine_Cl_VEF.h>
19#include <Periodique.h>
20#include <Probleme_base.h>
21#include <Equation_base.h>
22#include <Fluide_Dilatable_base.h>
23#include <communications.h>
25#include <Convection_Diffusion_std.h>
75 const Domaine_VF& domaine_VF = le_dom_VEF.valeur();
76 int premiere_face_std = le_dom_VEF->premiere_face_std() ;
79 int nb_faces = domaine_VF.
nb_faces();
81 CDoubleArrView volumes_entrelaces_Cl = le_dom_Cl_VEF->volumes_entrelaces_Cl().view_ro();
84 CDoubleArrView s = tab_s.view_ro();
88 DoubleTabView resu = tab_resu.
view_rw();
89 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_faces, KOKKOS_LAMBDA(
92 double vol = (num_face<premiere_face_std ? volumes_entrelaces_Cl(num_face) : volumes_entrelaces(num_face))*porosite_face(num_face);
93 for (
int i=0; i<dim; i++)
94 resu(num_face,i) += s(i)*vol;
96 end_gpu_timer(__KERNEL_NAME__);
104 DoubleArrView resu =
static_cast<DoubleVect&
>(tab_resu).view_rw();
105 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_faces, KOKKOS_LAMBDA(
108 double vol = (num_face < premiere_face_std ? volumes_entrelaces_Cl(num_face) : volumes_entrelaces(num_face))*porosite_face(num_face);
109 double contrib = s[num_face]*vol;
110 resu(num_face)+= contrib;
111 Kokkos::atomic_add(&
bilan(0), contrib*(1-0.5*fd[num_face]));
113 end_gpu_timer(__KERNEL_NAME__);
121 const Domaine_VF& domaine_VF = le_dom_VEF.valeur();
124 for (
int n_bord=0; n_bord<nb_bords; n_bord++)
134 assert(velocity.
le_nom()==
"vitesse");
136 int nfin = ndeb + le_bord.
nb_faces()/2;
145 CDoubleArrView rho_face =
static_cast<const DoubleVect&
>(tab_rho_face).view_ro();
146 CDoubleTabView face_normales = domaine_VF.
face_normales().view_ro();
149 Kokkos::parallel_reduce(start_gpu_timer(__KERNEL_NAME__),
150 Kokkos::RangePolicy<>(ndeb, nfin), KOKKOS_LAMBDA(
151 const int num_face,
double& debit)
153 double debit_face = 0;
155 debit_face += porosite_face(num_face) * vitesse(num_face, axe) *
156 std::fabs(face_normales(num_face, axe));
159 for (
int i = 0; i < dim; i++)
160 debit_face += porosite_face(num_face) * vitesse(num_face, i) *
161 face_normales(num_face, i);
163 debit += (is_dilatable ? rho_face(num_face) : 1) * debit_face;
164 }, Kokkos::Sum<double>(debit_e));
165 end_gpu_timer(__KERNEL_NAME__);
169 debit_e =
mp_sum(debit_e);
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 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 nb_faces() const
renvoie le nombre global de faces.
DoubleVect & volumes_entrelaces()
virtual double face_normales(int face, int comp) const
ArrOfInt & faces_doubles()
renvoie 1 pour les faces appartenant a un bord perio ou un item commun, 0 par defaut
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,...
virtual const Milieu_base & milieu() const =0
virtual const Champ_Inc_base & inconnue() const =0
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
const Nom & le_nom() const override
Renvoie le nom du champ.
classe Fluide_Dilatable_base Cette classe represente un d'un fluide dilatable,
int num_premiere_face() const
const Nom & le_nom() const override
Renvoie le nom de la frontiere geometrique.
DoubleVect & porosite_face()
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
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 Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
classe Periodique Cette classe represente une condition aux limites periodique.
bool is_dilatable() const
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
Classe de base des flux de sortie.
_SIZE_ size_array() const
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, ConstView< _TYPE_, _SHAPE_ > > view_ro() const
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, View< _TYPE_, _SHAPE_ > > view_rw()
DoubleTab & ajouter(DoubleTab &) const override
public_for_cuda void calculer_debit(double &) const override
void associer_domaines(const Domaine_dis_base &, const Domaine_Cl_dis_base &) override
Source term to keep a constant flow rate in a channel with periodic boundary conditions.
int direction_ecoulement_
ArrOfDouble source() const
Term source calculation (called by VDF and VEF implementations) TODO: returning an ArrOfDouble is baa...