16#ifndef Eval_Diff_VDF_Face_Gen_TPP_included
17#define Eval_Diff_VDF_Face_Gen_TPP_included
19#include <Schema_Temps_base.h>
20#include <Probleme_base.h>
21#include <Equation_base.h>
22#include <Domaine_Cl_VDF.h>
28template <
typename DERIVED_T>
template<Type_Flux_Fa7 Fa7_Type,
typename Type_Double>
inline std::enable_if_t< Fa7_Type == Type_Flux_Fa7::ELEM, void>
31 const int ori =
orientation(fac1), ncomp = flux.size_array();
33 for (
int k = 0; k < ncomp; k++)
35 const double tau = (inco(fac2,k)-inco(fac1,k))/dist, tau_tr =
ACTIVATE_TAU_TR ? tau : 0.0;
36 const double visc_lam = nu_lam(elem, k), visc_turb = DERIVED_T::IS_TURB ? nu_turb(elem, k) : 0.;
37 flux[k] = ((tau + tau_tr) * (visc_lam + visc_turb)) * surf;
41template <
typename DERIVED_T>
template<Type_Flux_Arete Arete_Type,
typename Type_Double>
inline std::enable_if_t< Arete_Type == Type_Flux_Arete::INTERNE, void>
44 const int ori1 =
orientation(fac1), ori3 =
orientation(fac3), elem1 =
elem_(fac3,0), elem2 =
elem_(fac3,1), elem3 =
elem_(fac4,0), elem4 =
elem_(fac4,1), ncomp = flux.size_array();
45 const double surf = surface_(fac1,fac2), poros = porosity_(fac1,fac2);
47 for (
int k = 0; k < ncomp; k++)
50 const int ind = DERIVED_T::IS_ANISO ? ori3 : k;
51 const double visc_lam = nu_lam_mean_4pts(elem1,elem2,elem3,elem4,ind), visc_turb = DERIVED_T::IS_TURB ? nu_mean_4pts(elem1,elem2,elem3,elem4,ind) : 0.0;
52 flux[k] = ((tau + tau_tr) * (visc_lam + visc_turb)) * surf * poros;
56template <
typename DERIVED_T>
template<Type_Flux_Arete Arete_Type,
typename Type_Double>
inline std::enable_if_t< Arete_Type == Type_Flux_Arete::MIXTE, void>
59 const int N = flux.size_array();
61 elem[0] =
elem_(fac3,0), elem[1] =
elem_(fac3,1), elem[2] =
elem_(fac4,0), elem[3] =
elem_(fac4,1);
62 std::vector<double> visc_lam_temp(N), visc_turb_temp(N);
63 for (
int k = 0; k < N; k++)
64 for (
int i = 0; i < 4; i++)
67 visc_lam_temp[k] += nu_lam(elem[i], k);
68 visc_turb_temp[k] += nu_turb(elem[i], k);
70 for (
int k = 0; k < N; k++)
72 visc_lam_temp[k] /= 3.0;
73 visc_turb_temp[k] /= 3.0;
75 const double surf = surface_(fac1,fac2), poros = porosity_(fac1,fac2);
77 for (
int k = 0; k < N; k++)
78 if (inco(fac4,k)*inco(fac3,k) != 0)
80 const double visc_lam = visc_lam_temp[k], visc_turb = DERIVED_T::IS_TURB ? visc_turb_temp[k] : 0.0;
82 flux[k] = ((tau + tau_tr) * (visc_lam + visc_turb)) * surf * poros;
86template <
typename DERIVED_T>
template<Type_Flux_Arete Arete_Type,
typename Type_Double>
87inline std::enable_if_t<Arete_Type == Type_Flux_Arete::PAROI || Arete_Type == Type_Flux_Arete::NAVIER_PAROI, void>
90 constexpr bool is_PAROI = (Arete_Type == Type_Flux_Arete::PAROI);
92 if ( !uses_wall_law() )
94 int elem1 =
elem_(fac3,0), elem2 =
elem_(fac3,1);
97 if (elem1 == -1) elem1 = elem2;
98 else if (elem2 == -1) elem2 = elem1;
101 const double surf = surface_(fac1,fac2), poros = porosity_(fac1,fac2), dist =
dist_norm_bord(fac1), tps = inconnue->temps();
103 const double vit_imp = is_PAROI ? 0.5*(Champ_Face_get_val_imp_face_bord(tps,rang1,ori,la_zcl.valeur())+Champ_Face_get_val_imp_face_bord(tps,rang2,ori,la_zcl.valeur())) :
104 0.5*(Champ_Face_get_val_imp_face_bord_sym(inco,tps,rang1,ori,la_zcl.valeur())+Champ_Face_get_val_imp_face_bord_sym(inco,tps,rang2,ori,la_zcl.valeur()));
107 for (
int k = 0; k < ncomp; k++)
110 coeff = 0.5 * (Champ_Face_coeff_frottement_face_bord(fac1, k, la_zcl.valeur()) + Champ_Face_coeff_frottement_face_bord(fac2, k, la_zcl.valeur()));
112 const int ind = DERIVED_T::IS_ANISO ? ori : k;
113 const double visc_lam = nu_lam_mean_2pts(elem1,elem2,ind), visc_turb = DERIVED_T::IS_TURB ? nu_mean_2pts(elem1,elem2,ind) : 0.0;
114 const double tau = (signe*(vit_imp-inco(fac3,k))/dist) - (signe * coeff * inco(fac3, k)), tau_tr = 0.;
115 flux[k] = ((tau + tau_tr) * (visc_lam + visc_turb)) * surf * poros;
120 double tau1 = tau_tan(rang1,ori)*0.5*
surface(fac1), tau2 = tau_tan(rang2,ori)*0.5*
surface(fac2);
121 for (
int k = 0; k < ncomp; k++) flux[k] = tau1 + tau2;
125template <
typename DERIVED_T>
template<Type_Flux_Arete Arete_Type,
typename Type_Double>
126inline std::enable_if_t< (Arete_Type == Type_Flux_Arete::NAVIER),
void>
137 const int ncomp = flux.size_array();
138 const double surf = surface_(fac1,fac2), poros = porosity_(fac1,fac2);
139 for (
int k = 0; k < ncomp; k++)
141 const double coeff = 0.5 * (Champ_Face_coeff_frottement_face_bord(fac1, k, la_zcl.valeur()) + Champ_Face_coeff_frottement_face_bord(fac2, k, la_zcl.valeur()));
142 const double tau = - signe * coeff * inco(fac3, k), tau_tr = 0.;
143 flux[k] = (tau + tau_tr) * surf * poros;
147template <
typename DERIVED_T>
template<Type_Flux_Arete Arete_Type,
typename Type_Double>
148inline std::enable_if_t< Arete_Type == Type_Flux_Arete::FLUIDE || Arete_Type == Type_Flux_Arete::NAVIER_FLUIDE || Arete_Type == Type_Flux_Arete::PAROI_FLUIDE, void>
151 assert (flux3.size_array() == flux1_2.size_array());
152 constexpr bool is_NAV_FL = (Arete_Type == Type_Flux_Arete::NAVIER_FLUIDE), is_PAR_FL = (Arete_Type == Type_Flux_Arete::PAROI_FLUIDE);
154 const double surf = surface_(fac1,fac2), poros = porosity_(fac1,fac2), surfporos =
surface(fac3)*
porosite(fac3), tps = inconnue->temps(),
157 double vit_imp, coeff = 0.0;
159 for (
int k = 0; k < ncomp; k++)
161 const int ind = DERIVED_T::IS_ANISO ? ori : k;
162 const double visc_lam = nu_lam_mean_2pts(elem1,elem2,ind), visc_turb = DERIVED_T::IS_TURB ? nu_mean_2pts(elem1,elem2,ind) : 0.0;
165 vit_imp = 0.5*(Champ_Face_get_val_imp_face_bord_sym(inco,tps,rang1,ori,la_zcl.valeur())+ Champ_Face_get_val_imp_face_bord_sym(inco,tps,rang2,ori,la_zcl.valeur()));
166 coeff = 0.5 * (Champ_Face_coeff_frottement_face_bord(fac1, k, la_zcl.valeur()) + Champ_Face_coeff_frottement_face_bord(fac2, k, la_zcl.valeur()));
170 if (est_egal(inco(fac1,k),0)) vit_imp = Champ_Face_get_val_imp_face_bord(tps,rang2,ori,la_zcl.valeur());
171 else vit_imp = Champ_Face_get_val_imp_face_bord(tps,rang1,ori,la_zcl.valeur());
173 else vit_imp = 0.5*(Champ_Face_get_val_imp_face_bord(tps,rang1,ori,la_zcl.valeur())+Champ_Face_get_val_imp_face_bord(tps,rang2,ori,la_zcl.valeur()));
182 const double tau_3 = (signe*(vit_imp-inco(fac3,k))/dist1) -(signe * coeff * inco(fac3, k)),
185 flux3[k] = ((tau_3 + tau_tr_3) * (visc_lam + visc_turb)) * surf * poros;
186 flux1_2[k] = ((tau_12 + tau_tr_12) * (visc_lam + visc_turb)) * surfporos;
190template <
typename DERIVED_T>
template<Type_Flux_Arete Arete_Type,
typename Type_Double>
inline std::enable_if_t< Arete_Type == Type_Flux_Arete::PERIODICITE, void>
193 assert (flux3_4.size_array() == flux1_2.size_array());
194 const int ori1 =
orientation(fac1), ori3 =
orientation(fac3), elem1 =
elem_(fac3,0), elem2 =
elem_(fac3,1), elem3 =
elem_(fac4,0), elem4 =
elem_(fac4,1), ncomp = flux3_4.size_array();
196 surf1_2 = surface_(fac1,fac2), poros1_2 = porosity_(fac1, fac2), surf3_4 = surface_(fac3,fac4), poros3_4 = porosity_(fac3, fac4);
198 for (
int k = 0; k < ncomp; k++)
200 const int ind = DERIVED_T::IS_ANISO ? ori3 : k;
201 const double visc_lam = nu_lam_mean_4pts(elem1,elem2,elem3,elem4,ind), visc_turb = DERIVED_T::IS_TURB ? nu_mean_4pts(elem1,elem2,elem3,elem4,ind) : 0.0;
202 const double tau_34 = (inco(fac4,k)-inco(fac3,k))/dist3_4, tau_12 = (inco(fac2,k)-inco(fac1,k))/dist1_2, tau_tr_34 =
ACTIVATE_TAU_TR ? tau_12 : 0.0, tau_tr_12 =
ACTIVATE_TAU_TR ? tau_34 : 0.0;
203 flux3_4[k] = ((tau_34 + tau_tr_34) * (visc_lam + visc_turb)) * surf1_2 * poros1_2;
204 flux1_2[k] = ((tau_12 + tau_tr_12) * (visc_lam + visc_turb)) * surf3_4 * poros3_4;
212template <
typename DERIVED_T>
template<Type_Flux_Fa7 Fa7_Type,
typename Type_Double>
inline std::enable_if_t< Fa7_Type == Type_Flux_Fa7::ELEM, void>
215 assert(f1.size_array() == f2.size_array());
216 const int ori =
orientation(fac1), ncomp = f1.size_array();
220 for (
int k = 0; k < ncomp; k++)
222 const double visc_lam = nu_lam(elem, k), visc_turb = DERIVED_T::IS_TURB ? nu_turb(elem, k) : 0.;
223 f1[k] = f2[k] = ((d_tau + d_tau_tr) * (visc_lam + visc_turb)) * surf;
226 if (
TEST_COEFFS) test_coeffs_fa7<Fa7_Type,Type_Double>(elem,fac1,fac2,f1);
229template <
typename DERIVED_T>
template<Type_Flux_Arete Arete_Type,
typename Type_Double>
inline std::enable_if_t< Arete_Type == Type_Flux_Arete::INTERNE, void>
232 assert(aii.size_array() == ajj.size_array());
233 const int ori1 =
orientation(fac1), ori3 =
orientation(fac3), elem1 =
elem_(fac3,0), elem2 =
elem_(fac3,1), elem3 =
elem_(fac4,0), elem4 =
elem_(fac4,1), ncomp = aii.size_array();
234 const double surf = surface_(fac1,fac2), poros = porosity_(fac1,fac2),
235 d_tau = 1.0 /
dist_face(fac3,fac4,ori1), d_tau_tr = 0.;
237 for (
int k = 0; k < ncomp; k++)
239 const int ind = DERIVED_T::IS_ANISO ? ori3 : k;
240 const double visc_lam = nu_lam_mean_4pts(elem1,elem2,elem3,elem4,ind), visc_turb = DERIVED_T::IS_TURB ? nu_mean_4pts(elem1,elem2,elem3,elem4,ind) : 0.0;
241 aii[k] = ajj[k] = ((d_tau + d_tau_tr) * (visc_lam + visc_turb)) * surf * poros;
244 if (
TEST_COEFFS) test_coeffs_arete<Arete_Type,Type_Double>(fac1,fac2,fac3,fac4,aii);
247template <
typename DERIVED_T>
template<Type_Flux_Arete Arete_Type,
typename Type_Double>
inline std::enable_if_t< Arete_Type == Type_Flux_Arete::MIXTE, void>
250 assert(aii.size_array() == ajj.size_array());
251 const int ori1 =
orientation(fac1), ncomp = aii.size_array();
253 elem[0] =
elem_(fac3,0), elem[1] =
elem_(fac3,1), elem[2] =
elem_(fac4,0), elem[3] =
elem_(fac4,1);
255 std::vector<double> visc_lam_temp(ncomp), visc_turb_temp(ncomp);
256 for (
int k = 0; k < ncomp; k++)
257 for (
int i = 0; i < 4; i++)
260 visc_lam_temp[k] += nu_lam(elem[i], k);
261 visc_turb_temp[k] += nu_turb(elem[i], k);
263 for (
int k = 0; k < ncomp; k++)
265 visc_lam_temp[k] /= 3.0;
266 visc_turb_temp[k] /= 3.0;
269 const double surf = surface_(fac1,fac2), poros = porosity_(fac1,fac2),
270 d_tau = 1. /
dist_face(fac3,fac4,ori1), d_tau_tr = 0.;
272 const DoubleTab& inco = inconnue->valeurs();
273 for (
int k = 0; k < ncomp; k++)
274 if (inco(fac4,k) * inco(fac3,k) != 0)
276 const double visc_lam = visc_lam_temp[k], visc_turb = DERIVED_T::IS_TURB ? visc_turb_temp[k] : 0.;
277 aii[k] = ajj[k] = ((d_tau + d_tau_tr) * (visc_lam + visc_turb)) * surf * poros;
280 if (
TEST_COEFFS) test_coeffs_arete<Arete_Type,Type_Double>(fac1,fac2,fac3,fac4,aii);
283template <
typename DERIVED_T>
template<Type_Flux_Arete Arete_Type,
typename Type_Double>
284inline std::enable_if_t< Arete_Type == Type_Flux_Arete::PAROI || Arete_Type == Type_Flux_Arete::NAVIER_PAROI, void>
287 assert(aii1_2.size_array() == aii3_4.size_array() && aii1_2.size_array() == ajj1_2.size_array());
288 constexpr bool is_PAROI = (Arete_Type == Type_Flux_Arete::PAROI);
289 const int ncomp = aii1_2.size_array();
290 if ( !uses_wall_law())
295 if (elem1 == -1) elem1 = elem2;
296 else if (elem2 == -1) elem2 = elem1;
299 const double surf = surface_(fac1,fac2), poros = porosity_(fac1,fac2), dist =
dist_norm_bord(fac1);
302 for (
int k = 0; k < ncomp; k++)
305 coeff = 0.5 * (Champ_Face_coeff_frottement_face_bord(fac1, k, la_zcl.valeur()) + Champ_Face_coeff_frottement_face_bord(fac2, k, la_zcl.valeur()));
307 const double d_tau = signe / dist - (signe * coeff), d_tau_tr = 0.;
308 const int ind = DERIVED_T::IS_ANISO ? ori : k;
309 const double visc_lam = nu_lam_mean_2pts(elem1,elem2,ind), visc_turb = DERIVED_T::IS_TURB ? nu_mean_2pts(elem1,elem2,ind) : 0.;
310 aii1_2[k] = ajj1_2[k] = 0.;
311 aii3_4[k] = ((d_tau + d_tau_tr) * (visc_lam + visc_turb)) * surf * poros;
314 else for (
int k = 0; k < ncomp; k++) aii3_4[k] = aii1_2[k] = ajj1_2[k] = 0.;
316 if (
TEST_COEFFS) test_coeffs_arete<Arete_Type,Type_Double>(fac1,fac2,fac3,signe,aii3_4);
319template <
typename DERIVED_T>
template<Type_Flux_Arete Arete_Type,
typename Type_Double>
320inline std::enable_if_t< Arete_Type == Type_Flux_Arete::FLUIDE || Arete_Type == Type_Flux_Arete::NAVIER_FLUIDE || Arete_Type == Type_Flux_Arete::PAROI_FLUIDE, void>
323 assert(aii1_2.size_array() == aii3.size_array() && aii1_2.size_array() == ajj1_2.size_array());
324 constexpr bool is_NAV_FL = (Arete_Type == Type_Flux_Arete::NAVIER_FLUIDE);
325 const int elem1 =
elem_(fac3,0), elem2 =
elem_(fac3,1), ori=
orientation(fac3), ncomp = aii1_2.size_array();
326 const double surf = surface_(fac1,fac2), poros = porosity_(fac1,fac2), surfporos =
surface(fac3)*
porosite(fac3),
330 for (
int k = 0; k < ncomp; k++)
333 coeff = 0.5 * (Champ_Face_coeff_frottement_face_bord(fac1, k, la_zcl.valeur()) + Champ_Face_coeff_frottement_face_bord(fac2, k, la_zcl.valeur()));
335 const double d_tau_3 = (signe / dist1) - (signe * coeff), d_tau_tr_3 = 0.,
336 d_tau_12 = 1. / dist2, d_tau_tr_12 = 0.;
338 const int ind = DERIVED_T::IS_ANISO ? ori : k;
339 const double visc_lam = nu_lam_mean_2pts(elem1,elem2,ind), visc_turb = DERIVED_T::IS_TURB ? nu_mean_2pts(elem1,elem2,ind) : 0.;
340 aii3[k] = ((d_tau_3 + d_tau_tr_3) * (visc_lam + visc_turb)) * surf * poros;
341 aii1_2[k] = ajj1_2[k] = ((d_tau_12 + d_tau_tr_12) * (visc_lam + visc_turb)) * surfporos;
344 if (
TEST_COEFFS) test_coeffs_arete<Arete_Type,Type_Double>(fac1,fac2,fac3,signe,aii1_2,aii3);
347template <
typename DERIVED_T>
template<Type_Flux_Arete Arete_Type,
typename Type_Double>
348inline std::enable_if_t< (Arete_Type == Type_Flux_Arete::NAVIER),
void>
351 assert(aii1_2.size_array() == aii3.size_array() && aii1_2.size_array() == ajj1_2.size_array());
352 const int elem1 =
elem_(fac3,0), elem2 =
elem_(fac3,1), ncomp = aii1_2.size_array(), ori =
orientation(fac3);
353 const double surf = surface_(fac1,fac2), poros = porosity_(fac1,fac2), dist2 =
dist_face(fac1,fac2,ori), surfporos =
surface(fac3)*
porosite(fac3);
355 for (
int k = 0; k < ncomp; k++)
357 const int ind = DERIVED_T::IS_ANISO ? ori : k;
358 const double visc_lam = nu_lam_mean_2pts(elem1, elem2, ind), visc_turb = DERIVED_T::IS_TURB ? nu_mean_2pts(elem1, elem2, ind) : 0.0;
359 const double coeff = 0.5 * (Champ_Face_coeff_frottement_face_bord(fac1, k, la_zcl.valeur()) + Champ_Face_coeff_frottement_face_bord(fac2, k, la_zcl.valeur()));
360 const double d_tau_3 = - (signe * coeff), d_tau_tr_3 = 0.,
361 d_tau_12 = 1. / dist2, d_tau_tr_12 = 0.;
363 aii3[k] = ((d_tau_3 + d_tau_tr_3) * (visc_lam + visc_turb)) * surf * poros;
364 aii1_2[k] = ajj1_2[k] = ((d_tau_12 + d_tau_tr_12) * (visc_lam + visc_turb)) * surfporos;
368template <
typename DERIVED_T>
template<Type_Flux_Arete Arete_Type,
typename Type_Double>
inline std::enable_if_t< Arete_Type == Type_Flux_Arete::PERIODICITE, void>
371 assert(aii.size_array() == ajj.size_array());
372 const int ori1 =
orientation(fac1), ori3 =
orientation(fac3), elem1 =
elem_(fac3,0), elem2 =
elem_(fac3,1), elem3 =
elem_(fac4,0), elem4 =
elem_(fac4,1), ncomp = aii.size_array();
373 const double dist3_4 =
dist_face_period(fac3,fac4,ori1), surf = surface_(fac1,fac2), poros = porosity_(fac1, fac2),
374 d_tau = 1. / dist3_4, d_tau_tr = 0.;
376 for (
int k = 0; k < ncomp; k++)
378 const int ind = DERIVED_T::IS_ANISO ? ori3 : k;
379 const double visc_lam = nu_lam_mean_4pts(elem1,elem2,elem3,elem4,ind), visc_turb = DERIVED_T::IS_TURB ? nu_mean_4pts(elem1,elem2,elem3,elem4,ind) : 0.;
380 aii[k] = ajj[k] = ((d_tau + d_tau_tr) * (visc_lam + visc_turb)) * surf * poros;
383 if (
TEST_COEFFS) test_coeffs_arete<Arete_Type,Type_Double>(fac1,fac2,fac3,fac4,aii);
390template <
typename DERIVED_T>
template<
typename Type_Double>
391void Eval_Diff_VDF_Face_Gen<DERIVED_T>::check_error(
const char * nom_funct,
const int Type_Flux,
const int ncomp,
const Type_Double& f1,
const Type_Double& flux_p,
const Type_Double& flux_m)
const
393 for (
int k = 0; k < ncomp; k++)
395 const double err = std::fabs(((flux_p[0] - flux_m[0]) / (2.0 * EPS)) - f1[0]);
398 std::cerr <<
"Error in function : " << nom_funct <<
"_Type_Flux_" << Type_Flux <<
" : " << f1[0] <<
" " << (flux_p[0] - flux_m[0]) / (2.0 * EPS) << std::endl;
403 if (la_zcl->equation().probleme().schema_temps().nb_pas_dt() > 10)
405 Cerr <<
"All OK ! Coeffs and fluxes implementations are coherent !" << finl;
410template <
typename DERIVED_T>
template<Type_Flux_Arete Arete_Type,
typename Type_Double>
411inline std::enable_if_t< Arete_Type == Type_Flux_Arete::INTERNE || Arete_Type == Type_Flux_Arete::MIXTE, void>
412Eval_Diff_VDF_Face_Gen<DERIVED_T>::test_coeffs_common(
const int fac1,
const int fac2,
const int fac3,
const int fac4, Type_Double& flux_p, Type_Double& flux_m)
const
414 DoubleTab inco_pert = inconnue->valeurs();
416 const int ncomp = flux_p.size_array();
417 for (
int k = 0; k < ncomp; k++) inco_pert(fac4,k) += EPS;
418 flux_arete<Arete_Type,Type_Double>(inco_pert,
nullptr,fac1,fac2,fac3,fac4,flux_p);
420 for (
int k = 0; k < ncomp; k++) inco_pert(fac4,k) -= 2.0 * EPS;
421 flux_arete<Arete_Type,Type_Double>(inco_pert,
nullptr,fac1,fac2,fac3,fac4,flux_m);
424template <
typename DERIVED_T>
template<Type_Flux_Arete Arete_Type,
typename Type_Double>
425inline std::enable_if_t<Arete_Type == Type_Flux_Arete::PAROI || Arete_Type == Type_Flux_Arete::NAVIER_PAROI, void>
426Eval_Diff_VDF_Face_Gen<DERIVED_T>::test_coeffs_common(
const int fac1,
const int fac2,
const int fac3,
const int signe, Type_Double& flux_p, Type_Double& flux_m)
const
428 DoubleTab inco_pert = inconnue->valeurs();
431 for (
int k = 0; k < ncomp; k++) inco_pert(fac3,k) -= EPS;
433 flux_arete<Arete_Type,Type_Double>(inco_pert,
nullptr,fac1,fac2,fac3,signe,flux_p);
435 for (
int k = 0; k < ncomp; k++) inco_pert(fac3,k) += 2.0 * EPS;
436 flux_arete<Arete_Type,Type_Double>(inco_pert,
nullptr,fac1,fac2,fac3,signe,flux_m);
439template <
typename DERIVED_T>
template<Type_Flux_Arete Arete_Type,
typename Type_Double>
440inline std::enable_if_t<Arete_Type == Type_Flux_Arete::FLUIDE || Arete_Type == Type_Flux_Arete::NAVIER_FLUIDE || Arete_Type == Type_Flux_Arete::PAROI_FLUIDE, void>
441Eval_Diff_VDF_Face_Gen<DERIVED_T>::test_coeffs_common(
const int fac1,
const int fac2,
const int fac3,
const int signe, Type_Double& flux_p3, Type_Double& flux_m3, Type_Double& flux_p12, Type_Double& flux_m12)
const
443 DoubleTab inco_pert = inconnue->valeurs();
444 Type_Double poubelle(flux_p3.size_array());
446 const int ncomp = flux_p3.size_array();
449 for (
int k = 0; k < ncomp; k++) inco_pert(fac3,k) -= EPS;
450 flux_arete<Arete_Type,Type_Double>(inco_pert,
nullptr,fac1,fac2,fac3,signe,flux_p3,poubelle);
452 for (
int k = 0; k < ncomp; k++) inco_pert(fac3,k) += 2.0 * EPS;
453 flux_arete<Arete_Type,Type_Double>(inco_pert,
nullptr,fac1,fac2,fac3,signe,flux_m3,poubelle);
456 inco_pert = inconnue->valeurs();
457 for (
int k = 0; k < ncomp; k++) inco_pert(fac2,k) += EPS;
458 flux_arete<Arete_Type,Type_Double>(inco_pert,
nullptr,fac1,fac2,fac3,signe,poubelle,flux_p12);
460 for (
int k = 0; k < ncomp; k++) inco_pert(fac2,k) -= 2.0 * EPS;
461 flux_arete<Arete_Type,Type_Double>(inco_pert,
nullptr,fac1,fac2,fac3,signe,poubelle,flux_m12);
464template <
typename DERIVED_T>
template<Type_Flux_Arete Arete_Type,
typename Type_Double>
465inline std::enable_if_t<Arete_Type == Type_Flux_Arete::PERIODICITE, void>
466Eval_Diff_VDF_Face_Gen<DERIVED_T>::test_coeffs_common(
const int fac1,
const int fac2,
const int fac3,
const int fac4, Type_Double& flux_p, Type_Double& flux_m)
const
468 DoubleTab inco_pert = inconnue->valeurs();
469 Type_Double poubelle(flux_p.size_array());
470 const int ncomp = flux_p.size_array();
472 for (
int k = 0; k < ncomp; k++) inco_pert(fac4,k) += EPS;
473 flux_arete<Arete_Type,Type_Double>(inco_pert,
nullptr,fac1,fac2,fac3,fac4,flux_p,poubelle);
475 for (
int k = 0; k < ncomp; k++) inco_pert(fac4,k) -= 2.0 * EPS;
476 flux_arete<Arete_Type,Type_Double>(inco_pert,
nullptr,fac1,fac2,fac3,fac4,flux_m,poubelle);
479template <
typename DERIVED_T>
template<Type_Flux_Fa7 Fa7_Type,
typename Type_Double>
inline std::enable_if_t< Fa7_Type == Type_Flux_Fa7::ELEM, void>
480Eval_Diff_VDF_Face_Gen<DERIVED_T>::test_coeffs_fa7(
const int elem,
const int fac1,
const int fac2,
const Type_Double& f1)
const
482 const int ncomp = f1.size_array();
483 Type_Double flux_p(ncomp), flux_m(ncomp);
484 DoubleTab inco_pert = inconnue->valeurs();
486 for (
int k = 0; k < ncomp; k++) inco_pert(fac2,k) += EPS;
487 flux_fa7<Fa7_Type,Type_Double>(inco_pert,
nullptr,elem,fac1,fac2,flux_p);
489 for (
int k = 0; k < ncomp; k++) inco_pert(fac2,k) -= 2.0 * EPS;
490 flux_fa7<Fa7_Type,Type_Double>(inco_pert,
nullptr,elem,fac1,fac2,flux_m);
492 check_error<Type_Double>(__func__,(
int)Fa7_Type,ncomp,f1,flux_p,flux_m);
495template <
typename DERIVED_T>
template<Type_Flux_Arete Arete_Type,
typename Type_Double>
496inline std::enable_if_t< Arete_Type == Type_Flux_Arete::INTERNE, void>
497Eval_Diff_VDF_Face_Gen<DERIVED_T>::test_coeffs_arete(
const int fac1,
const int fac2,
const int fac3,
const int fac4,
const Type_Double& aii)
const
499 const int ncomp = aii.size_array();
500 Type_Double flux_p(ncomp), flux_m(ncomp);
501 test_coeffs_common<Arete_Type,Type_Double>(fac1,fac2,fac3,fac4,flux_p,flux_m);
502 check_error<Type_Double>(__func__,(
int)Arete_Type,ncomp,aii,flux_p,flux_m);
505template <
typename DERIVED_T>
template<Type_Flux_Arete Arete_Type,
typename Type_Double>
506inline std::enable_if_t<Arete_Type == Type_Flux_Arete::MIXTE, void>
507Eval_Diff_VDF_Face_Gen<DERIVED_T>::test_coeffs_arete(
const int fac1,
const int fac2,
const int fac3,
const int fac4,
const Type_Double& aii)
const
509 const int ncomp = aii.size_array();
510 Type_Double flux_p(ncomp), flux_m(ncomp);
511 test_coeffs_common<Arete_Type,Type_Double>(fac1,fac2,fac3,fac4,flux_p,flux_m);
512 if (inconnue->valeurs()(fac4,0) * inconnue->valeurs()(fac3,0) != 0) check_error<Type_Double>(__func__,(
int)Arete_Type,ncomp,aii,flux_p,flux_m);
515template <
typename DERIVED_T>
template<Type_Flux_Arete Arete_Type,
typename Type_Double>
516inline std::enable_if_t<Arete_Type == Type_Flux_Arete::PAROI || Arete_Type == Type_Flux_Arete::NAVIER_PAROI, void>
517Eval_Diff_VDF_Face_Gen<DERIVED_T>::test_coeffs_arete(
const int fac1,
const int fac2,
const int fac3,
const int signe,
const Type_Double& aii3_4)
const
519 const int ncomp = aii3_4.size_array();
520 Type_Double flux_p(ncomp), flux_m(ncomp);
521 test_coeffs_common<Arete_Type,Type_Double>(fac1,fac2,fac3,signe,flux_p,flux_m);
522 if ( !uses_wall_law() ) check_error<Type_Double>(__func__,(
int)Arete_Type,ncomp,aii3_4,flux_p,flux_m);
525template <
typename DERIVED_T>
template<Type_Flux_Arete Arete_Type,
typename Type_Double>
526inline std::enable_if_t<Arete_Type == Type_Flux_Arete::FLUIDE || Arete_Type == Type_Flux_Arete::NAVIER_FLUIDE || Arete_Type == Type_Flux_Arete::PAROI_FLUIDE, void>
527Eval_Diff_VDF_Face_Gen<DERIVED_T>::test_coeffs_arete(
const int fac1,
const int fac2,
const int fac3,
const int signe,
const Type_Double& aii1_2,
const Type_Double& aii3)
const
529 const int ncomp = aii1_2.size_array();
530 Type_Double flux_p3(ncomp), flux_m3(ncomp), flux_p12(ncomp), flux_m12(ncomp);
531 test_coeffs_common<Arete_Type,Type_Double>(fac1,fac2,fac3,signe,flux_p3,flux_m3,flux_p12,flux_m12);
532 check_error<Type_Double>(__func__,(
int)Arete_Type,ncomp,aii3,flux_p3,flux_m3);
533 check_error<Type_Double>(__func__,(
int)Arete_Type,ncomp,aii1_2,flux_p12,flux_m12);
536template <
typename DERIVED_T>
template<Type_Flux_Arete Arete_Type,
typename Type_Double>
537inline std::enable_if_t<Arete_Type == Type_Flux_Arete::PERIODICITE, void>
538Eval_Diff_VDF_Face_Gen<DERIVED_T>::test_coeffs_arete(
const int fac1,
const int fac2,
const int fac3,
const int fac4,
const Type_Double& aii)
const
540 const int ncomp = aii.size_array();
541 Type_Double flux_p(ncomp), flux_m(ncomp);
542 test_coeffs_common<Arete_Type,Type_Double>(fac1,fac2,fac3,fac4,flux_p,flux_m);
543 check_error<Type_Double>(__func__,(
int)Arete_Type,ncomp,aii,flux_p,flux_m);
std::enable_if_t< Fa7_Type==Type_Flux_Fa7::SORTIE_LIBRE, void > flux_fa7(const DoubleTab &, const DoubleTab *, int, const Neumann_sortie_libre &, int, Type_Double &) const
std::enable_if_t< Fa7_Type==Type_Flux_Fa7::SORTIE_LIBRE, void > coeffs_fa7(const DoubleTab *, int, const Neumann_sortie_libre &, Type_Double &, Type_Double &) const
static constexpr bool TEST_COEFFS
static constexpr bool ACTIVATE_TAU_TR
std::enable_if_t< Arete_Type==Type_Flux_Arete::INTERNE, void > coeffs_arete(const DoubleTab *, int, int, int, int, Type_Double &, Type_Double &) const
std::enable_if_t< Arete_Type==Type_Flux_Arete::INTERNE, void > flux_arete(const DoubleTab &, const DoubleTab *, int, int, int, int, Type_Double &) const
double dist_norm_bord(int) const
double dist_face(int fac1, int fac2, int k) const
double dist_face_period(int fac1, int fac2, int k) const
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
_SIZE_ size_array() const