TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Op_Conv_VDF.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_Conv_VDF_included
17#define Op_Conv_VDF_included
18
19#include <Iterateur_VDF_base.h>
20#include <TRUST_Deriv.h>
21#include <Op_VDF_Elem.h>
22#include <Op_VDF_Face.h>
23#include <type_traits>
24
25template <typename OP_TYPE>
26class Op_Conv_VDF : public Op_VDF_Elem, public Op_VDF_Face
27{
28protected:
29 // pour operateurs elem
30 inline void dimensionner_elem(Matrice_Morse& matrice) const { Op_VDF_Elem::dimensionner(iter_vdf()->domaine(), iter_vdf()->domaine_Cl(), matrice, 0); }
31 inline void modifier_pour_Cl_elem(Matrice_Morse& matrice, DoubleTab& secmem) const { Op_VDF_Elem::modifier_pour_Cl(iter_vdf()->domaine(), iter_vdf()->domaine_Cl(), matrice, secmem); }
32
33 // pour operateurs face
34 inline void dimensionner_face(Matrice_Morse& matrice) const { Op_VDF_Face::dimensionner(iter_vdf()->domaine(), iter_vdf()->domaine_Cl(), matrice); }
35 inline void modifier_pour_Cl_face(Matrice_Morse& matrice, DoubleTab& secmem) const { Op_VDF_Face::modifier_pour_Cl(iter_vdf()->domaine(), iter_vdf()->domaine_Cl(), matrice, secmem); }
36
37 // pour les deux !
38 template <Type_Operateur _TYPE_ , typename EVAL_TYPE>
39 inline std::enable_if_t<_TYPE_ == Type_Operateur::Op_CONV_ELEM, void>
40 associer_impl(const Domaine_dis_base& domaine_dis, const Domaine_Cl_dis_base& domaine_cl_dis, const Champ_Inc_base& ch_transporte)
41 {
42 constexpr bool is_QUICK = std::is_same<EVAL_TYPE,Eval_Quick_VDF_Elem>::value, is_CENTRE4 = std::is_same<EVAL_TYPE,Eval_Centre4_VDF_Elem>::value;
43 const Champ_P0_VDF& inco = ref_cast(Champ_P0_VDF,ch_transporte);
44 associer_<EVAL_TYPE,is_QUICK,is_CENTRE4>(domaine_dis,domaine_cl_dis).associer_inconnue(inco); // Cheerssssssssss !!!
45 }
46
47 template <Type_Operateur _TYPE_ , typename EVAL_TYPE>
48 inline std::enable_if_t<_TYPE_ == Type_Operateur::Op_CONV_FACE, void>
49 associer_impl(const Domaine_dis_base& domaine_dis, const Domaine_Cl_dis_base& domaine_cl_dis, const Champ_Inc_base& ch_vit)
50 {
51 constexpr bool is_QUICK = std::is_same<EVAL_TYPE,Eval_Quick_VDF_Face>::value, is_CENTRE4 = std::is_same<EVAL_TYPE,Eval_Centre4_VDF_Face>::value;
52 const Champ_Face_VDF& vit = ref_cast(Champ_Face_VDF,ch_vit);
53 associer_<EVAL_TYPE,is_QUICK,is_CENTRE4>(domaine_dis,domaine_cl_dis).associer_inconnue(vit); // Cheerssssssssss !!!
54 }
55
56 template <Type_Operateur _TYPE_>
57 inline void dimensionner_blocs_impl(matrices_t mats) const
58 {
59 constexpr bool is_FACE_OP = (_TYPE_ == Type_Operateur::Op_CONV_FACE);
60 const std::string& nom_inco = static_cast<const OP_TYPE *>(this)->equation().inconnue().le_nom().getString();
61 Matrice_Morse *mat = mats.count(nom_inco) ? mats.at(nom_inco) : nullptr, mat2;
62 is_FACE_OP ? dimensionner_face(mat2) : dimensionner_elem(mat2) /* elem */;
63 mat->nb_colonnes() ? *mat += mat2 : *mat = mat2;
64 }
65
66 template <typename EVAL_TYPE>
68 {
69 const Champ_Face_VDF& vit = ref_cast(Champ_Face_VDF, ch_vit);
70 EVAL_TYPE& eval_conv = static_cast<EVAL_TYPE&>(iter_vdf()->evaluateur());
71 eval_conv.associer(vit);
72 }
73
74 template <typename EVAL_TYPE>
75 const Champ_base& vitesse_impl() const
76 {
77 const EVAL_TYPE& eval_conv = static_cast<const EVAL_TYPE&>(iter_vdf()->evaluateur());
78 return eval_conv.vitesse();
79 }
80
81 template <typename EVAL_TYPE>
83 {
84 EVAL_TYPE& eval_conv = static_cast<EVAL_TYPE&>(iter_vdf()->evaluateur());
85 return eval_conv.vitesse();
86 }
87
88private:
89 // CRTP pour recuperer l'iter
90 inline const OWN_PTR(Iterateur_VDF_base)& iter_vdf() const { return static_cast<const OP_TYPE *>(this)->get_iter(); }
91 inline OWN_PTR(Iterateur_VDF_base)& iter_vdf() { return static_cast<OP_TYPE *>(this)->get_iter(); }
92
93 // Methode enorme pour tout le monde !
94 template <typename EVAL_TYPE, bool is_QUICK, bool is_CENTRE4>
95 EVAL_TYPE& associer_(const Domaine_dis_base& domaine_dis, const Domaine_Cl_dis_base& domaine_cl_dis)
96 {
97 const Domaine_VDF& zvdf = ref_cast(Domaine_VDF,domaine_dis);
98 const Domaine_Cl_VDF& zclvdf = ref_cast(Domaine_Cl_VDF,domaine_cl_dis);
99 iter_vdf()->associer(zvdf,zclvdf,static_cast<OP_TYPE&>(*this)); // Et ouiiiiiiiii
100 EVAL_TYPE& eval_conv = static_cast<EVAL_TYPE&> (iter_vdf()->evaluateur()); // Mais ouiiiiiiiiiiii
101 eval_conv.associer_domaines(zvdf, zclvdf );
102
103 if (is_QUICK || is_CENTRE4)
104 if ( Process::is_parallel() && zvdf.domaine().nb_joints() && zvdf.domaine().joint(0).epaisseur()<2)
105 {
106 Cerr << "Overlapping width (given by larg_joint option) of " << zvdf.domaine().joint(0).epaisseur() << finl;
107 Cerr << "is not enough for Quick scheme in VDF parallel calculation." << finl;
108 Cerr << "Please, partition your mesh with an overlapping width of 2 with larg_joint option." << finl;
110 }
111 return eval_conv;
112 }
113};
114
115#endif /* Op_Conv_VDF_included */
class Champ_Face_VDF Cette classe sert a representer un champ vectoriel dont on ne calcule
Classe Champ_Inc_base.
classe Champ_P0_VDF Classe qui represente un champ discret P0 par element associe a un domaine discre...
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
int nb_joints() const
Definition Domaine.h:259
Joint_t & joint(int i)
Definition Domaine.h:261
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
int epaisseur() const
Definition Joint.h:50
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
int nb_colonnes() const override
Return local number of columns (=size on the current proc).
void modifier_pour_Cl_face(Matrice_Morse &matrice, DoubleTab &secmem) const
Definition Op_Conv_VDF.h:35
const Champ_base & vitesse_impl() const
Definition Op_Conv_VDF.h:75
void modifier_pour_Cl_elem(Matrice_Morse &matrice, DoubleTab &secmem) const
Definition Op_Conv_VDF.h:31
void dimensionner_face(Matrice_Morse &matrice) const
Definition Op_Conv_VDF.h:34
std::enable_if_t< _TYPE_==Type_Operateur::Op_CONV_ELEM, void > associer_impl(const Domaine_dis_base &domaine_dis, const Domaine_Cl_dis_base &domaine_cl_dis, const Champ_Inc_base &ch_transporte)
Definition Op_Conv_VDF.h:40
void dimensionner_blocs_impl(matrices_t mats) const
Definition Op_Conv_VDF.h:57
void associer_vitesse_impl(const Champ_base &ch_vit)
Definition Op_Conv_VDF.h:67
void dimensionner_elem(Matrice_Morse &matrice) const
Definition Op_Conv_VDF.h:30
std::enable_if_t< _TYPE_==Type_Operateur::Op_CONV_FACE, void > associer_impl(const Domaine_dis_base &domaine_dis, const Domaine_Cl_dis_base &domaine_cl_dis, const Champ_Inc_base &ch_vit)
Definition Op_Conv_VDF.h:49
Champ_base & vitesse_impl()
Definition Op_Conv_VDF.h:82
void modifier_pour_Cl(const Domaine_VDF &, const Domaine_Cl_VDF &, Matrice_Morse &, DoubleTab &) const
void dimensionner(const Domaine_VDF &, const Domaine_Cl_VDF &, Matrice_Morse &, const bool) const
void modifier_pour_Cl(const Domaine_VDF &, const Domaine_Cl_VDF &, Matrice_Morse &, DoubleTab &) const
void dimensionner(const Domaine_VDF &, const Domaine_Cl_VDF &, Matrice_Morse &) const
static bool is_parallel()
Definition Process.cpp:110
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455