16#ifndef Op_Diff_VEF_base_included
17#define Op_Diff_VEF_base_included
19#include <Operateur_Diff_base.h>
21#include <Domaine_VEF.h>
23#include <Op_VEF_Face.h>
24#include <Milieu_base.h>
46 template <
typename _TYPE_>
47 double viscA(
int face_i,
int face_j,
int num_elem,
const _TYPE_& diffu)
const;
48 template <
typename _TYPE_>
49 KOKKOS_INLINE_FUNCTION
double viscA(
int face_i,
int face_j,
int num_elem,
const _TYPE_& diffu, CIntTabView face_voisins_v, CDoubleTabView face_normales_v, CDoubleArrView inverse_volumes_v)
const;
66 mutable DoubleTab
nu_;
69 template<
typename _TYPE_> std::enable_if_t< std::is_same<_TYPE_, double>::value ,
double>
70 inline diffu__(
const int comp,
const int num_elem,
const _TYPE_ &diffu)
const {
return diffu; }
72 template<
typename _TYPE_> std::enable_if_t< std::is_same<_TYPE_, TRUSTTab<double>>::value ,
double>
73 inline diffu__(
const int comp,
const int num_elem,
const _TYPE_ &diffu)
const {
return diffu(num_elem, comp); }
75 template<
typename _TYPE_> std::enable_if_t< std::is_same<_TYPE_, TRUSTArray<double>>::value ,
double>
76 inline diffu__(
const int comp,
const int num_elem,
const _TYPE_ &diffu)
const {
return diffu(comp); }
78 template<
typename _TYPE_> std::enable_if_t< std::is_same<_TYPE_, double>::value ,
double>
79 KOKKOS_INLINE_FUNCTION diffu__view(
const int comp,
const int num_elem,
const _TYPE_ &diffu)
const {
return diffu; }
81 template<
typename _TYPE_> std::enable_if_t< std::is_same<_TYPE_, TRUSTTab<double>>::value ,
double>
82 KOKKOS_INLINE_FUNCTION diffu__view(
const int comp,
const int num_elem,
const _TYPE_ &diffu)
const {
return diffu(num_elem, comp); }
84 template<
typename _TYPE_> std::enable_if_t< std::is_same<_TYPE_, TRUSTArray<double>>::value ,
double>
85 KOKKOS_INLINE_FUNCTION diffu__view(
const int comp,
const int num_elem,
const _TYPE_ &diffu)
const {
return diffu(comp); }
91template<
typename _TYPE_>
94 constexpr bool is_double = std::is_same<_TYPE_, double>::value;
97 const DoubleTab& face_normales = domaine.face_normales();
98 const DoubleVect& inverse_volumes = domaine.inverse_volumes();
104 DSiSj += diffu__(k *
dimension + k, num_elem, diffu) * face_normales(i, k) * face_normales(j, k);
110 DSiSj += diffu__(k *
dimension + l, num_elem, diffu) * face_normales(i, k) * face_normales(j, l);
113 if ((face_voisins(i, 0) == face_voisins(j, 0)) || (face_voisins(i, 1) == face_voisins(j, 1)))
114 return -DSiSj * inverse_volumes(num_elem);
116 return DSiSj * inverse_volumes(num_elem);
119template<
typename _TYPE_>
120KOKKOS_INLINE_FUNCTION
double Op_Diff_VEF_base::viscA(
int i,
int j,
int num_elem,
const _TYPE_ &diffu, CIntTabView face_voisins_v, CDoubleTabView face_normales_v, CDoubleArrView inverse_volumes_v)
const
122 constexpr bool is_double = std::is_same<_TYPE_, double>::value;
123 int dim = (int)face_normales_v.extent(1);
127 for (
int k = 0; k < dim; k++)
128 DSiSj += diffu__view(k * dim + k, num_elem, diffu) * face_normales_v(i, k) * face_normales_v(j, k);
132 for (
int k = 0; k < dim; k++)
133 for (
int l = 0; l < dim; l++)
134 DSiSj += diffu__view(k * dim + l, num_elem, diffu) * face_normales_v(i, k) * face_normales_v(j, l);
137 if ((face_voisins_v(i, 0) == face_voisins_v(j, 0)) || (face_voisins_v(i, 1) == face_voisins_v(j, 1)))
138 return -DSiSj * inverse_volumes_v(num_elem);
140 return DSiSj * inverse_volumes_v(num_elem);
class Champ_base This class is the base of the fields hierarchy.
class Domaine_Cl_dis_base Domaine_Cl_dis_base objects represent discretized boundary conditions
int face_voisins(int num_face, int i) const
Returns the neighbouring element of num_face in direction i.
class Domaine_dis_base This class is the base of the hierarchy of discretized domains.
class Equation_base The role of an equation is the calculation of one or more fields....
A character string (Nom) in uppercase.
class Nom: a character string for naming TRUST objects.
int phi_psi_diffuse(const Equation_base &eq) const
Determine whether to compute div(phi nu grad Psi) or div(nu grad Phi psi).
void calculer_pour_post(Champ_base &espace_stockage, const Nom &option, int comp) const override
Motcle get_localisation_pour_post(const Nom &option) const override
OBS_PTR(Domaine_VEF) le_dom_vef
OBS_PTR(Domaine_Cl_VEF) la_zcl_vef
int impr(Sortie &os) const override
DOES NOTHING - to override in derived classes.
void associer(const Domaine_dis_base &, const Domaine_Cl_dis_base &, const Champ_Inc_base &) override
virtual void remplir_nu(DoubleTab &) const
const Domaine_VEF & domaine_vef() const
double viscA(int face_i, int face_j, int num_elem, const _TYPE_ &diffu) const
const Domaine_Cl_VEF & domaine_cl_vef() const
double calculer_dt_stab() const override
Computes dt_stab.
OBS_PTR(Champ_Inc_base) inconnue_
Operateur_Diff_base This class is the base of the hierarchy of operators representing.
Base class for output streams.