TrioCFD 1.9.9_beta
TrioCFD documentation
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 // for elem operators
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 // for face operators
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 // for both!
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 to retrieve the iterator
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 // Huge method used by everyone!
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
Class Champ_Inc_base.
class Champ_P0_VDF Class representing a P0 discrete field per element associated with a discretized d...
class Champ_base This class is the base of the fields hierarchy.
Definition Champ_base.h:43
int nb_joints() const
Definition Domaine.h:259
Joint_t & joint(int i)
Definition Domaine.h:261
class Domaine_Cl_dis_base Domaine_Cl_dis_base objects represent discretized boundary conditions
class Domaine_dis_base This class is the base of the hierarchy of discretized domains.
const Domaine & domaine() const
int epaisseur() const
Definition Joint.h:50
Matrice_Morse class - Represents a (sparse) matrix M, not necessarily square,.
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:108
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
Definition Process.cpp:466