TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Eval_Conv_VDF_tools.h
1/****************************************************************************
2* Copyright (c) 2026, 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 Eval_Conv_VDF_tools_included
17#define Eval_Conv_VDF_tools_included
18
19#include <TRUSTTab.h>
20#include <Double.h>
21
23{
24public:
26 // DANGER !!!! FAUT JAMAIS ENTRER
27 virtual int amont_amont(int face, int i) const { return dont_call<int>(__func__); }
28 virtual int face_amont_conj(int ,int ,int ) const { return dont_call<int>(__func__); }
29 virtual int face_amont_princ(int ,int ) const { return dont_call<int>(__func__); }
30 virtual double dim_elem(int ,int ) const { return dont_call<double>(__func__); }
31 virtual double dim_face(int ,int ) const { return dont_call<double>(__func__); }
32 virtual double dist_elem(int ,int ,int ) const { return dont_call<double>(__func__); }
33 virtual double dist_elem_period(int , int , int ) const { return dont_call<double>(__func__); }
34 virtual double conv_centre(const double,const double,const double,const double,const double,double,double,double,double) const { return dont_call<double>(__func__); }
35 virtual double conv_quick_sharp_plus(const double,const double,const double,const double,const double,const double,const double) const { return dont_call<double>(__func__); }
36 virtual double conv_quick_sharp_moins(const double,const double,const double,const double,const double,const double,const double) const { return dont_call<double>(__func__); }
37 virtual void calcul_g(const double,const double,const double,double&,double&,double&,double&) const { return dont_call<void>(__func__); }
38
39 template <typename Type_Double>
40 void qcentre(const double, const int, const int, const int, const int, const int, const DoubleTab&, Type_Double& ) const { return dont_call<void>(__func__); }
41
42 template <typename Type_Double>
43 void quick_fram(const Type_Double&, const int, const int, const int, const int, const int, const DoubleTab&, Type_Double& ) const { return dont_call<void>(__func__); }
44
45protected:
46 int face_amont_conj_axi_impl(int ,int ,int ,int , const IntTab& , const IntTab& , const IntVect&) const;
47 double dist_face_axi_impl(int ,int ,int ,const DoubleTab&) const;
48 double dist_elem_axi_impl(int ,int ,int ,const DoubleTab&) const;
49 double conv_quick_sharp_plus_impl(const double,const double,const double,const double,const double,const double,const double) const ;
50 double conv_quick_sharp_moins_impl(const double,const double,const double,const double,const double,const double,const double) const;
51 void calcul_g_impl(const double,const double,const double,double&,double&,double&,double& ) const ;
52
53 template <typename Type_Double>
54 void qcentre2_impl(const double,const int,const int,const int,const int,const int,const DoubleTab&,Type_Double&) const;
55
56 template <typename Type_Double>
57 void qcentre4_impl(const int,const double,const double,const double,const double,const int,const int,const int,const int,const int,const DoubleTab&,Type_Double&) const;
58
59 template <typename Type_Double>
60 void quick_fram_impl(const int,const double,const double,const double,const double,const double,const Type_Double&,const int,const int,const int,const int,const int,const DoubleTab&,Type_Double&) const;
61
62private:
63 template <typename type>
64 type dont_call (const char * nom_fct) const
65 {
66 Cerr << "What ??? You should not call the function " << nom_fct << finl;
67 throw;
68 }
69};
70
71// Fram4 pour centre 4 (inutile je pense mais bon)
72inline double Fram4(const double s1,const double s2, const double s3,const double s4)
73{
74 double smin0 = std::min(s4,s2), smax0 = std::max(s4,s2), smin1 = std::min(s3,s1), smax1 = std::max(s3,s1);
75 double sr0 = (s3-smin0)/(smax0-smin0+DMINFLOAT), sr1 = (s2-smin1)/(smax1-smin1+DMINFLOAT);
76 double fr = 2.*std::max(std::fabs(sr0-0.5),std::fabs(sr1-0.5));
77 fr *= fr;
78 fr *= fr;
79 return std::min(fr,1.0);
80}
81
82// Fram pour QUICK
83inline double Fram(const double s1,const double s2, const double s3,const double s4)
84{
85 double smin0 = std::min(s4,s2), smax0 = std::max(s4,s2), smin1 = std::min(s3,s1), smax1 = std::max(s3,s1);
86 // Ajout du DMINFLOAT car le compilateur Nvidia evalue quand meme (bug) si smax0-smin0=0...
87 double sr0 = (std::fabs(smax0-smin0)<DMINFLOAT ? 0. : (s3-smin0)/(smax0-smin0+DMINFLOAT));
88 double sr1 = (std::fabs(smax1-smin1)<DMINFLOAT ? 0. : (s2-smin1)/(smax1-smin1+DMINFLOAT));
89 double fr = 2.*std::max(std::fabs(sr0-0.5),std::fabs(sr1-0.5));
90 fr *= fr;
91 fr *= fr;
92 return std::min(fr,1.0);
93}
94
95// Fonction de calcul de cf(limiteur de pente) dans le schema Quick-sharp
96inline double sharp2(const double utc)
97{
98 double cf;
99 if ( (utc <= -1) || (utc >= 1.5) ) cf = 0.125;
100 else if ((utc > -1) && (utc <= 0) ) cf = 0.5 + 0.375*utc;
101 else if ((utc <= 0.25) && (utc > 0) ) cf = 0.5 - 0.625*sqrt(utc);
102 else if ((utc > 0.25) && (utc <= 1.) ) cf = 0.25*(1.-utc);
103 else cf = 0.25*(utc-1.);
104 return cf;
105}
106
107template <typename Type_Double>
108void Eval_Conv_VDF_tools::qcentre2_impl(const double psc, const int num0, const int num1, const int num0_0, const int num1_1, const int face,
109 const DoubleTab& transporte,Type_Double& flux) const
110{
111 int k, ncomp = flux.size_array();
112 Type_Double T0(ncomp), T1(ncomp);
113 for (k=0; k<ncomp; k++)
114 {
115 T0[k] = transporte(num0,k);
116 T1[k] = transporte(num1,k);
117 }
118 for (k=0; k<ncomp; k++) flux[k] =0.5 * (T0[k] + T1[k]) * psc ;
119}
120
121template <typename Type_Double>
122void Eval_Conv_VDF_tools::qcentre4_impl(const int ori,const double dx, const double dxam, const double dxav, const double psc, const int num0, const int num1,
123 const int num0_0, const int num1_1, const int face, const DoubleTab& transporte,Type_Double& flux) const
124{
125 int k, ncomp = flux.size_array();
126 Type_Double T0(ncomp), T0_0(ncomp), T1(ncomp), T1_1(ncomp);
127 for (k=0; k<ncomp; k++)
128 {
129 T0[k] = transporte(num0,k);
130 T0_0[k] = transporte(num0_0,k);
131 T1[k] = transporte(num1,k);
132 T1_1[k] = transporte(num1_1,k);
133 }
134 const double g1 = -dx*dx*(dx/2+dxav)/(4*(dx+dxam+dxav)*(dx+dxam)*dxam), g2 = (dx+2*dxam)*(dx+2*dxav)/(8*dxam*(dx+dxav));
135 const double g3 = (dx+2*dxam)*(dx+2*dxav)/(8*dxav*(dx+dxam)), g4 = -dx*dx*(dx/2+dxam)/(4*(dx+dxam+dxav)*dxav*(dx+dxav));
136 for (k=0; k<ncomp; k++) flux[k] =( g1*T0_0[k] + g2*T0[k] + g3*T1[k] + g4*T1_1[k] ) * psc ;
137}
138
139template <typename Type_Double>
140void Eval_Conv_VDF_tools::quick_fram_impl(const int ori,const double dx, const double dm0, const double dxam0, const double dm1, const double dxam1, const Type_Double& psc,
141 const int num0, const int num1, const int num0_0, const int num1_1, const int face, const DoubleTab& transporte,Type_Double& flux) const
142{
143 const int ncomp = flux.size_array();
144 double fr, T0,T0_0=0,T1,T1_1=0,trans_amont,curv;
145
146 for (int k=0; k<ncomp; k++)
147 {
148 if ( (num0_0 == -1 && psc[k] >= 0 ) || (num1_1 == -1 && psc[k] <= 0 ) )
149 {
150 flux[k] = (psc[k] > 0) ? psc[k]*transporte(num0,k) : psc[k]*transporte(num1,k);
151 }
152 else
153 {
154 T0 = transporte(num0,k);
155 T0_0 = (num0_0!=-1?transporte(num0_0,k):0);
156 T1 = transporte(num1,k);
157 T1_1 = (num1_1!=-1?transporte(num1_1,k):0);
158
159 if (psc[k] > 0)
160 {
161 trans_amont = T0;
162 curv = ( (T1 - T0)/dx - (T0 - T0_0)/dxam0 )/dm0 ;
163 }
164 else
165 {
166 trans_amont = T1;
167 curv = ( (T1_1 - T1)/dxam1 - (T1 - T0)/dx )/dm1;
168 }
169 flux[k] = 0.5*(T0+T1) - 0.125*(dx*dx)*curv;
170 // On applique le filtre Fram:
171 fr = ( num0_0 != -1 && num1_1 != -1 ) ? Fram(T0_0,T0,T1,T1_1) : 1.;
172 flux[k] = ((1.-fr)*flux[k] + fr*trans_amont)*psc[k];
173 }
174 }
175}
176
177#endif /* Eval_Conv_VDF_tools_included */
int face_amont_conj_axi_impl(int, int, int, int, const IntTab &, const IntTab &, const IntVect &) const
virtual double conv_quick_sharp_plus(const double, const double, const double, const double, const double, const double, const double) const
double dist_elem_axi_impl(int, int, int, const DoubleTab &) const
virtual double dist_elem(int, int, int) const
virtual double conv_quick_sharp_moins(const double, const double, const double, const double, const double, const double, const double) const
void quick_fram_impl(const int, const double, const double, const double, const double, const double, const Type_Double &, const int, const int, const int, const int, const int, const DoubleTab &, Type_Double &) const
virtual double dim_face(int, int) const
void qcentre2_impl(const double, const int, const int, const int, const int, const int, const DoubleTab &, Type_Double &) const
double conv_quick_sharp_moins_impl(const double, const double, const double, const double, const double, const double, const double) const
void qcentre(const double, const int, const int, const int, const int, const int, const DoubleTab &, Type_Double &) const
virtual double dim_elem(int, int) const
virtual double conv_centre(const double, const double, const double, const double, const double, double, double, double, double) const
void quick_fram(const Type_Double &, const int, const int, const int, const int, const int, const DoubleTab &, Type_Double &) const
virtual int face_amont_conj(int, int, int) const
void qcentre4_impl(const int, const double, const double, const double, const double, const int, const int, const int, const int, const int, const DoubleTab &, Type_Double &) const
virtual double dist_elem_period(int, int, int) const
double conv_quick_sharp_plus_impl(const double, const double, const double, const double, const double, const double, const double) const
virtual int face_amont_princ(int, int) const
double dist_face_axi_impl(int, int, int, const DoubleTab &) const
virtual int amont_amont(int face, int i) const
void calcul_g_impl(const double, const double, const double, double &, double &, double &, double &) const
virtual void calcul_g(const double, const double, const double, double &, double &, double &, double &) const