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);
classe Champ_base Cette classe est la base de la hierarchie des champs.
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
Une chaine de caractere (Nom) en majuscules.
class Nom Une chaine de caractere pour nommer les objets de TRUST
int phi_psi_diffuse(const Equation_base &eq) const
definit si on calcule div(phi nu grad Psi) ou div(nu grap 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
Calcul dt_stab.
OBS_PTR(Champ_Inc_base) inconnue_
classe Operateur_Diff_base Cette classe est la base de la hierarchie des operateurs representant
Classe de base des flux de sortie.