TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Op_Diff_VEF_base.h
1/****************************************************************************
2* Copyright (c) 2025, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#ifndef Op_Diff_VEF_base_included
17#define Op_Diff_VEF_base_included
18
19#include <Operateur_Diff_base.h>
20
21#include <Domaine_VEF.h>
22
23#include <Op_VEF_Face.h>
24#include <Milieu_base.h>
25#include <TRUST_Ref.h>
26
27class Domaine_Cl_VEF;
28class Champ_Inc_base;
29class Sortie;
30
31/*! @brief class Op_Diff_VEF_base
32 *
33 * Classe de base des operateurs de convection VEF
34 *
35 *
36 */
37
39{
40 Declare_base(Op_Diff_VEF_base);
41public:
42
43 int impr(Sortie& os) const override;
44 void associer(const Domaine_dis_base& , const Domaine_Cl_dis_base& ,const Champ_Inc_base& ) override;
45
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;
50
51 double calculer_dt_stab() const override;
52 void calculer_pour_post(Champ_base& espace_stockage,const Nom& option,int comp) const override;
53 Motcle get_localisation_pour_post(const Nom& option) const override;
54 virtual void remplir_nu(DoubleTab&) const;
55 int phi_psi_diffuse(const Equation_base& eq) const;
56
57 const Domaine_VEF& domaine_vef() const { return le_dom_vef.valeur(); }
58 const Domaine_Cl_VEF& domaine_cl_vef() const { return la_zcl_vef.valeur(); }
59
60protected:
61
62 OBS_PTR(Domaine_VEF) le_dom_vef;
65 //DoubleVect porosite_face;
66 mutable DoubleTab nu_;
67
68private:
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; }
71
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); }
74
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); }
77
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; }
80
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); }
83
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); }
86};
87
88// ATTENTION le diffu intervenant dans les fonctions n'est que LOCAL (on appelle d_nu apres)
89// Fonction utile viscA
90// nu <Si, Sj> / |K|
91template<typename _TYPE_>
92inline double Op_Diff_VEF_base::viscA(int i, int j, int num_elem, const _TYPE_ &diffu) const
93{
94 constexpr bool is_double = std::is_same<_TYPE_, double>::value;
95 const Domaine_VEF& domaine = le_dom_vef.valeur();
96 const IntTab& face_voisins = domaine.face_voisins();
97 const DoubleTab& face_normales = domaine.face_normales();
98 const DoubleVect& inverse_volumes = domaine.inverse_volumes();
99
100 double DSiSj = 0.;
101 if (is_double)
102 {
103 for (int k = 0; k < dimension; k++)
104 DSiSj += diffu__(k * dimension + k, num_elem, diffu) * face_normales(i, k) * face_normales(j, k);
105 }
106 else
107 {
108 for (int k = 0; k < dimension; k++)
109 for (int l = 0; l < dimension; l++)
110 DSiSj += diffu__(k * dimension + l, num_elem, diffu) * face_normales(i, k) * face_normales(j, l);
111 }
112
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);
115 else
116 return DSiSj * inverse_volumes(num_elem);
117}
118
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
121{
122 constexpr bool is_double = std::is_same<_TYPE_, double>::value;
123 int dim = (int)face_normales_v.extent(1);
124 double DSiSj = 0.;
125 if (is_double)
126 {
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);
129 }
130 else
131 {
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);
135 }
136
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);
139 else
140 return DSiSj * inverse_volumes_v(num_elem);
141}
142#endif /* Op_Diff_VEF_base_included */
Classe Champ_Inc_base.
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
class Domaine_VEF
Definition Domaine_VEF.h:54
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
Definition Domaine_VF.h:418
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.
Definition Motcle.h:26
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
static int dimension
Definition Objet_U.h:99
friend class Sortie
Definition Objet_U.h:75
class Op_Diff_VEF_base
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.
Definition Sortie.h:52