16#ifndef Eval_Conv_VDF_tools_included
17#define Eval_Conv_VDF_tools_included
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__); }
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__); }
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__); }
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__); }
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 ;
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;
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;
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;
63 template <
typename type>
64 type dont_call (
const char * nom_fct)
const
66 Cerr <<
"What ??? You should not call the function " << nom_fct << finl;
72inline double Fram4(
const double s1,
const double s2,
const double s3,
const double s4)
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));
79 return std::min(fr,1.0);
83inline double Fram(
const double s1,
const double s2,
const double s3,
const double s4)
85 double smin0 = std::min(s4,s2), smax0 = std::max(s4,s2), smin1 = std::min(s3,s1), smax1 = std::max(s3,s1);
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));
92 return std::min(fr,1.0);
96inline double sharp2(
const double utc)
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.);
107template <
typename Type_Double>
109 const DoubleTab& transporte,Type_Double& flux)
const
111 int k, ncomp = flux.size_array();
112 Type_Double T0(ncomp), T1(ncomp);
113 for (k=0; k<ncomp; k++)
115 T0[k] = transporte(num0,k);
116 T1[k] = transporte(num1,k);
118 for (k=0; k<ncomp; k++) flux[k] =0.5 * (T0[k] + T1[k]) * psc ;
121template <
typename Type_Double>
123 const int num0_0,
const int num1_1,
const int face,
const DoubleTab& transporte,Type_Double& flux)
const
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++)
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);
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 ;
139template <
typename Type_Double>
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
143 const int ncomp = flux.size_array();
144 double fr, T0,T0_0=0,T1,T1_1=0,trans_amont,curv;
146 for (
int k=0; k<ncomp; k++)
148 if ( (num0_0 == -1 && psc[k] >= 0 ) || (num1_1 == -1 && psc[k] <= 0 ) )
150 flux[k] = (psc[k] > 0) ? psc[k]*transporte(num0,k) : psc[k]*transporte(num1,k);
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);
162 curv = ( (T1 - T0)/dx - (T0 - T0_0)/dxam0 )/dm0 ;
167 curv = ( (T1_1 - T1)/dxam1 - (T1 - T0)/dx )/dm1;
169 flux[k] = 0.5*(T0+T1) - 0.125*(dx*dx)*curv;
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];