16#ifndef Iterateur_VDF_Face_TPP_included
17#define Iterateur_VDF_Face_TPP_included
19#include <Champ_Uniforme.h>
20#include <communications.h>
21#include <Pb_Multiphase.h>
22#include <TRUSTSingle.h>
23#include <Option_VDF.h>
29 assert(op_base->equation().inconnue().valeurs().nb_dim() < 3);
30 const int ncomp = op_base->equation().inconnue().valeurs().line_size();
31 DoubleTab& tab_flux_bords = op_base->flux_bords();
37 ajouter_blocs_aretes_bords<SingleDouble>(ncomp, mats, secmem, semi_impl);
38 ajouter_blocs_aretes_coins<SingleDouble>(ncomp, mats, secmem, semi_impl);
39 ajouter_blocs_aretes_internes<SingleDouble>(ncomp, mats, secmem, semi_impl);
40 ajouter_blocs_aretes_mixtes<SingleDouble>(ncomp, mats, secmem, semi_impl);
41 ajouter_blocs_fa7_sortie_libre<SingleDouble>(ncomp, mats, secmem, semi_impl);
42 ajouter_blocs_fa7_elem<SingleDouble>(ncomp, mats, secmem, semi_impl);
46 ajouter_blocs_aretes_bords<ArrOfDouble>(ncomp, mats, secmem, semi_impl);
47 ajouter_blocs_aretes_coins<ArrOfDouble>(ncomp, mats, secmem, semi_impl);
48 ajouter_blocs_aretes_internes<ArrOfDouble>(ncomp, mats, secmem, semi_impl);
49 ajouter_blocs_aretes_mixtes<ArrOfDouble>(ncomp, mats, secmem, semi_impl);
50 ajouter_blocs_fa7_sortie_libre<ArrOfDouble>(ncomp, mats, secmem, semi_impl);
51 ajouter_blocs_fa7_elem<ArrOfDouble>(ncomp, mats, secmem, semi_impl);
58 ajouter_pour_compressible<SingleDouble>(ncomp, mats, secmem, semi_impl);
60 ajouter_pour_compressible<ArrOfDouble>(ncomp, mats, secmem, semi_impl);
64 if (!
is_pb_multi) multiply_by_rho_if_hydraulique(tab_flux_bords);
70template<
class _TYPE_>
template<
typename Type_Double>
71void Iterateur_VDF_Face<_TYPE_>::ajouter_blocs_aretes_bords(
const int ncomp,
const matrices_t& mats, DoubleTab& secmem,
const tabs_t& semi_impl)
const
73 if (!_TYPE_::CALC_ARR_BORD)
return;
75 for (
int n_arete = premiere_arete_bord; n_arete < derniere_arete_bord; n_arete++)
77 const int n_type = type_arete_bord(n_arete - premiere_arete_bord);
81 ajouter_blocs_aretes_bords_<_TYPE_::CALC_ARR_PAR, Type_Flux_Arete::PAROI, Type_Double>(n_arete, ncomp, mats, secmem, semi_impl);
84 ajouter_blocs_aretes_bords_<_TYPE_::CALC_ARR_PAR_FL, Type_Flux_Arete::PAROI_FLUIDE, Type_Double>(n_arete, ncomp, mats, secmem, semi_impl);
87 ajouter_blocs_aretes_bords_<_TYPE_::CALC_ARR_FL, Type_Flux_Arete::FLUIDE, Type_Double>(n_arete, ncomp, mats, secmem, semi_impl);
90 ajouter_blocs_aretes_bords_<_TYPE_::CALC_ARR_NAVIER_PAR, Type_Flux_Arete::NAVIER_PAROI, Type_Double>(n_arete, ncomp, mats, secmem, semi_impl);
93 ajouter_blocs_aretes_bords_<_TYPE_::CALC_ARR_NAVIER_FL, Type_Flux_Arete::NAVIER_FLUIDE, Type_Double>(n_arete, ncomp, mats, secmem, semi_impl);
96 ajouter_blocs_aretes_bords_<_TYPE_::CALC_ARR_NAVIER, Type_Flux_Arete::NAVIER, Type_Double>(n_arete, ncomp, mats, secmem, semi_impl);
99 ajouter_blocs_aretes_bords_<_TYPE_::CALC_ARR_PERIO, Type_Flux_Arete::PERIODICITE, Type_Double>(n_arete, ncomp, mats, secmem, semi_impl);
102 Cerr <<
"On a rencontre un type d'arete non prevu : [ num arete : " << n_arete <<
" ], [ type : " << n_type <<
" ]" << finl;
108template <
class _TYPE_>
template <
bool should_calc_flux, Type_Flux_Arete Arete_Type,
typename Type_Double>
109std::enable_if_t< Arete_Type == Type_Flux_Arete::PAROI || Arete_Type == Type_Flux_Arete::NAVIER || Arete_Type == Type_Flux_Arete::NAVIER_PAROI, void>
110Iterateur_VDF_Face<_TYPE_>::ajouter_blocs_aretes_bords_(
const int n_arete,
const int ncomp,
const matrices_t& mats, DoubleTab& secmem,
const tabs_t& semi_impl)
const
112 if (should_calc_flux)
114 constexpr bool is_PAROI = (Arete_Type == Type_Flux_Arete::PAROI);
115 Type_Double flux(ncomp), aii1_2(ncomp), aii3_4(ncomp), ajj1_2(ncomp);
116 const int n = le_dom->nb_faces_bord(), fac1 = Qdm(n_arete, 0), fac2 = Qdm(n_arete, 1), fac3 = Qdm(n_arete, 2), signe = Qdm(n_arete, 3);
117 DoubleTab& tab_flux_bords = op_base->flux_bords();
118 const DoubleTab& inco = semi_impl.count(nom_ch_inco_) ? semi_impl.at(nom_ch_inco_) : le_champ_convecte_ou_inc->valeurs();
120 const DoubleTab* a_r = (!is_pb_multi || !is_conv_op_) ?
nullptr : semi_impl.count(
"alpha_rho") ? &semi_impl.at(
"alpha_rho") :
121 &ref_cast(
Pb_Multiphase,op_base->equation().probleme()).equation_masse().champ_conserve().valeurs();
124 flux_evaluateur.template flux_arete < Arete_Type > (inco, a_r, fac1, fac2, fac3, signe, flux);
125 for (
int k = 0; k < ncomp; k++)
127 secmem(fac3, k) += signe * flux[k];
130 if (fac1 < n) tab_flux_bords(fac1, orientation(fac3)) -= 0.5 * signe * flux[k];
131 if (fac2 < n) tab_flux_bords(fac2, orientation(fac3)) -= 0.5 * signe * flux[k];
136 Matrice_Morse *matrice = (is_pb_multi && is_conv_op_) ? (mats.count(nom_ch_inco_) && !semi_impl.count(nom_ch_inco_) ? mats.at(nom_ch_inco_) :
nullptr) :
137 (mats.count(nom_ch_inco_) ? mats.at(nom_ch_inco_) :
nullptr);
140 flux_evaluateur.template coeffs_arete < Arete_Type > (a_r, fac1, fac2, fac3, signe, aii1_2, aii3_4, ajj1_2);
141 for (
int i = 0; i < ncomp; i++)
142 fill_coeff_matrice_morse < Type_Double > (fac3, i, ncomp, signe, aii3_4, *matrice);
147template <
class _TYPE_>
template <
bool should_calc_flux, Type_Flux_Arete Arete_Type,
typename Type_Double>
148std::enable_if_t<Arete_Type == Type_Flux_Arete::FLUIDE || Arete_Type == Type_Flux_Arete::PAROI_FLUIDE || Arete_Type == Type_Flux_Arete::NAVIER_FLUIDE, void>
149Iterateur_VDF_Face<_TYPE_>::ajouter_blocs_aretes_bords_(
const int n_arete,
const int ncomp,
const matrices_t& mats, DoubleTab& secmem,
const tabs_t& semi_impl)
const
151 if (should_calc_flux)
153 constexpr bool is_FLUIDE = (Arete_Type == Type_Flux_Arete::FLUIDE), is_PAROI_FL = (Arete_Type == Type_Flux_Arete::PAROI_FLUIDE);
154 Type_Double flux3(ncomp), flux1_2(ncomp), aii1_2(ncomp), aii3_4(ncomp), ajj1_2(ncomp);
155 const int n = le_dom->nb_faces_bord(), fac1 = Qdm(n_arete, 0), fac2 = Qdm(n_arete, 1), fac3 = Qdm(n_arete, 2), signe = Qdm(n_arete, 3);
156 DoubleTab& tab_flux_bords = op_base->flux_bords();
157 const DoubleTab& inco = semi_impl.count(nom_ch_inco_) ? semi_impl.at(nom_ch_inco_) : le_champ_convecte_ou_inc->valeurs();
159 const DoubleTab* a_r = (!is_pb_multi || !is_conv_op_) ?
nullptr : semi_impl.count(
"alpha_rho") ? &semi_impl.at(
"alpha_rho") :
160 &ref_cast(
Pb_Multiphase,op_base->equation().probleme()).equation_masse().champ_conserve().valeurs();
163 flux_evaluateur.template flux_arete < Arete_Type > (inco, a_r, fac1, fac2, fac3, signe, flux3, flux1_2);
164 for (
int k = 0; k < ncomp; k++)
165 secmem(fac3, k) += signe * flux3[k];
167 fill_resu_tab < Type_Double > (fac1, fac2, ncomp, flux1_2, secmem);
169 if (is_FLUIDE || is_PAROI_FL)
172 for (
int k = 0; k < ncomp; k++) tab_flux_bords(fac1, orientation(fac3)) -= 0.5 * signe * flux3[k];
175 for (
int k = 0; k < ncomp; k++) tab_flux_bords(fac2, orientation(fac3)) -= 0.5 * signe * flux3[k];
179 Matrice_Morse *matrice = (is_pb_multi && is_conv_op_) ? (mats.count(nom_ch_inco_) && !semi_impl.count(nom_ch_inco_) ? mats.at(nom_ch_inco_) :
nullptr) :
180 (mats.count(nom_ch_inco_) ? mats.at(nom_ch_inco_) :
nullptr);
183 flux_evaluateur.template coeffs_arete < Arete_Type > (a_r, fac1, fac2, fac3, signe, aii1_2, aii3_4, ajj1_2);
184 for (
int i = 0; i < ncomp; i++)
186 fill_coeff_matrice_morse < Type_Double > (fac3, i, ncomp, signe, aii3_4, *matrice);
187 fill_coeff_matrice_morse < Type_Double > (fac1, fac2, i, ncomp, aii1_2, ajj1_2, *matrice);
193template <
class _TYPE_>
template <
bool should_calc_flux, Type_Flux_Arete Arete_Type,
typename Type_Double>
194std::enable_if_t<Arete_Type == Type_Flux_Arete::PERIODICITE, void>
195Iterateur_VDF_Face<_TYPE_>::ajouter_blocs_aretes_bords_(
const int n_arete,
const int ncomp,
const matrices_t& mats, DoubleTab& secmem,
const tabs_t& semi_impl)
const
197 if (should_calc_flux)
199 Type_Double flux3_4(ncomp), flux1_2(ncomp), aii(ncomp), ajj(ncomp);
200 const int fac1 = Qdm(n_arete, 0), fac2 = Qdm(n_arete, 1), fac3 = Qdm(n_arete, 2), fac4 = Qdm(n_arete, 3);
201 const DoubleTab& inco = semi_impl.count(nom_ch_inco_) ? semi_impl.at(nom_ch_inco_) : le_champ_convecte_ou_inc->valeurs();
206 flux_evaluateur.template flux_arete < Arete_Type > (inco,
nullptr, fac1, fac2, fac3, fac4, flux3_4, flux1_2);
207 for (
int k = 0; k < ncomp; k++)
209 secmem(fac3, k) += 0.5 * flux3_4[k];
210 secmem(fac4, k) -= 0.5 * flux3_4[k];
213 fill_resu_tab < Type_Double > (fac1, fac2, ncomp, flux1_2, secmem);
216 Matrice_Morse *matrice = (is_pb_multi && is_conv_op_) ? (mats.count(nom_ch_inco_) && !semi_impl.count(nom_ch_inco_) ? mats.at(nom_ch_inco_) :
nullptr) :
217 (mats.count(nom_ch_inco_) ? mats.at(nom_ch_inco_) :
nullptr);
220 flux_evaluateur.template coeffs_arete < Arete_Type > (
nullptr, fac3, fac4, fac1, fac2, aii, ajj);
221 for (
int i = 0; i < ncomp; i++)
222 fill_coeff_matrice_morse(fac1, fac2, i, ncomp, aii, ajj, *matrice);
224 flux_evaluateur.template coeffs_arete < Arete_Type > (
nullptr, fac1, fac2, fac3, fac4, aii, ajj);
225 for (
int i = 0; i < ncomp; i++)
229 fill_coeff_matrice_morse < Type_Double > (fac3, fac4, i, ncomp, aii, ajj, *matrice);
238template<
class _TYPE_>
template <
typename Type_Double>
239void Iterateur_VDF_Face<_TYPE_>::ajouter_blocs_aretes_coins(
const int ncomp, matrices_t mats, DoubleTab& secmem,
const tabs_t& semi_impl)
const
241 for (
int n_arete = premiere_arete_coin; n_arete < derniere_arete_coin; n_arete++)
243 const int n_type = type_arete_coin(n_arete - premiere_arete_coin);
247 ajouter_blocs_aretes_coins_<_TYPE_::CALC_ARR_PAR, Type_Flux_Arete::PAROI, TypeAreteCoinVDF::PAROI_FLUIDE, Type_Double>(n_arete, ncomp, mats, secmem, semi_impl);
250 ajouter_blocs_aretes_coins_<_TYPE_::CALC_ARR_PAR, Type_Flux_Arete::PAROI, TypeAreteCoinVDF::FLUIDE_PAROI, Type_Double>(n_arete, ncomp, mats, secmem, semi_impl);
253 ajouter_blocs_aretes_coins_<_TYPE_::CALC_ARR_PAR, Type_Flux_Arete::PAROI, TypeAreteCoinVDF::PERIO_PAROI, Type_Double>(n_arete, ncomp, mats, secmem, semi_impl);
256 ajouter_blocs_aretes_coins_<_TYPE_::CALC_ARR_COIN_FL, Type_Flux_Arete::COIN_FLUIDE, Type_Double>(n_arete, ncomp, mats, secmem, semi_impl);
259 ajouter_blocs_aretes_coins_<_TYPE_::CALC_ARR_PERIO, Type_Flux_Arete::PERIODICITE, Type_Double>(n_arete, ncomp, mats, secmem, semi_impl);
267template <
class _TYPE_>
template <
bool should_calc_flux, Type_Flux_Arete Arete_Type, TypeAreteCoinVDF::type_arete Arete_Type_Coin,
typename Type_Double>
268std::enable_if_t< Arete_Type == Type_Flux_Arete::PAROI, void>
269Iterateur_VDF_Face<_TYPE_>::ajouter_blocs_aretes_coins_(
const int n_arete,
const int ncomp, matrices_t mats, DoubleTab& secmem,
const tabs_t& semi_impl)
const
271 if (should_calc_flux)
274 Type_Double flux(ncomp), aii1_2(ncomp), aii3_4(ncomp), ajj1_2(ncomp);
275 const int fac1 = Qdm(n_arete, 0), fac2 = Qdm(n_arete, 1), fac3 = Qdm(n_arete, 2), signe = Qdm(n_arete, 3);
276 DoubleTab& tab_flux_bords = op_base->flux_bords();
277 const DoubleTab& inco = semi_impl.count(nom_ch_inco_) ? semi_impl.at(nom_ch_inco_) : le_champ_convecte_ou_inc->valeurs();
279 const DoubleTab* a_r = (!is_pb_multi || !is_conv_op_) ?
nullptr : semi_impl.count(
"alpha_rho") ? &semi_impl.at(
"alpha_rho") :
280 &ref_cast(
Pb_Multiphase,op_base->equation().probleme()).equation_masse().champ_conserve().valeurs();
283 flux_evaluateur.template flux_arete < Arete_Type > (inco, a_r, fac1, fac2, fac3, signe, flux);
284 for (
int k = 0; k < ncomp; k++)
286 secmem(fac3, k) += signe * flux[k];
289 tab_flux_bords(fac1, orientation(fac3)) -= 0.25 * signe * flux[k];
290 tab_flux_bords(fac2, orientation(fac3)) -= 0.25 * signe * flux[k];
293 tab_flux_bords(fac1, orientation(fac3)) -= 0.5 * signe * flux[k];
297 Matrice_Morse *matrice = (is_pb_multi && is_conv_op_) ? (mats.count(nom_ch_inco_) && !semi_impl.count(nom_ch_inco_) ? mats.at(nom_ch_inco_) :
nullptr) :
298 (mats.count(nom_ch_inco_) ? mats.at(nom_ch_inco_) :
nullptr);
301 flux_evaluateur.template coeffs_arete < Arete_Type > (a_r, fac1, fac2, fac3, signe, aii1_2, aii3_4, ajj1_2);
302 for (
int i = 0; i < ncomp; i++)
303 fill_coeff_matrice_morse(fac3, i, ncomp, signe, aii3_4, *matrice);
308template <
class _TYPE_>
template <
bool should_calc_flux, Type_Flux_Arete Arete_Type,
typename Type_Double>
309std::enable_if_t<Arete_Type == Type_Flux_Arete::COIN_FLUIDE, void>
310Iterateur_VDF_Face<_TYPE_>::ajouter_blocs_aretes_coins_(
const int n_arete,
const int ncomp, matrices_t mats, DoubleTab& secmem,
const tabs_t& semi_impl)
const
312 if (should_calc_flux)
314 Type_Double flux3(ncomp), flux1_2(ncomp), aii1_2(ncomp), aii3_4(ncomp), ajj1_2(ncomp);
315 const int n = le_dom->nb_faces_bord(), fac1 = Qdm(n_arete, 0), fac2 = Qdm(n_arete, 1), fac3 = Qdm(n_arete, 2), signe = Qdm(n_arete, 3);
316 DoubleTab& tab_flux_bords = op_base->flux_bords();
317 const DoubleTab& inco = semi_impl.count(nom_ch_inco_) ? semi_impl.at(nom_ch_inco_) : le_champ_convecte_ou_inc->valeurs();
319 const DoubleTab* a_r = (!is_pb_multi || !is_conv_op_) ?
nullptr : semi_impl.count(
"alpha_rho") ? &semi_impl.at(
"alpha_rho") :
320 &ref_cast(
Pb_Multiphase,op_base->equation().probleme()).equation_masse().champ_conserve().valeurs();
323 flux_evaluateur.template flux_arete < Arete_Type > (inco, a_r, fac1, fac2, fac3, signe, flux3, flux1_2);
324 for (
int k = 0; k < ncomp; k++)
326 secmem(fac3, k) += signe * flux3[k];
327 secmem(fac1, k) += flux1_2[k];
328 if (fac1 < n) tab_flux_bords(fac1, orientation(fac3)) -= 0.5 * signe * flux3[k];
332 Matrice_Morse *matrice = (is_pb_multi && is_conv_op_) ? (mats.count(nom_ch_inco_) && !semi_impl.count(nom_ch_inco_) ? mats.at(nom_ch_inco_) :
nullptr) :
333 (mats.count(nom_ch_inco_) ? mats.at(nom_ch_inco_) :
nullptr);
336 flux_evaluateur.template coeffs_arete < Arete_Type > (a_r, fac1, fac2, fac3, signe, aii1_2, aii3_4, ajj1_2);
338 for (
int i = 0; i < ncomp; i++)
340 fill_coeff_matrice_morse(fac3, i, ncomp, signe, aii3_4, *matrice);
341 fill_coeff_matrice_morse < Type_Double > (fac1, i, ncomp, 1, aii1_2, *matrice);
347template <
class _TYPE_>
template <
bool should_calc_flux, Type_Flux_Arete Arete_Type,
typename Type_Double>
348std::enable_if_t<Arete_Type == Type_Flux_Arete::PERIODICITE, void>
349Iterateur_VDF_Face<_TYPE_>::ajouter_blocs_aretes_coins_(
const int n_arete,
const int ncomp, matrices_t mats, DoubleTab& secmem,
const tabs_t& semi_impl)
const
351 if (should_calc_flux)
353 Type_Double flux3_4(ncomp), flux1_2(ncomp), aii(ncomp), ajj(ncomp);
354 const int fac1 = Qdm(n_arete, 0), fac2 = Qdm(n_arete, 1), fac3 = Qdm(n_arete, 2), fac4 = Qdm(n_arete, 3);
355 const DoubleTab& inco = semi_impl.count(nom_ch_inco_) ? semi_impl.at(nom_ch_inco_) : le_champ_convecte_ou_inc->valeurs();
358 flux_evaluateur.template flux_arete < Arete_Type > (inco,
nullptr, fac1, fac2, fac3, fac4, flux3_4, flux1_2);
359 for (
int k = 0; k < ncomp; k++)
361 secmem(fac3, k) += 0.5 * flux3_4[k];
362 secmem(fac4, k) -= 0.5 * flux3_4[k];
363 secmem(fac1, k) += 0.5 * flux1_2[k];
364 secmem(fac2, k) -= 0.5 * flux1_2[k];
368 Matrice_Morse *matrice = (is_pb_multi && is_conv_op_) ? (mats.count(nom_ch_inco_) && !semi_impl.count(nom_ch_inco_) ? mats.at(nom_ch_inco_) :
nullptr) :
369 (mats.count(nom_ch_inco_) ? mats.at(nom_ch_inco_) :
nullptr);
372 flux_evaluateur.template coeffs_arete < Arete_Type > (
nullptr, fac3, fac4, fac1, fac2, aii, ajj);
373 for (
int i = 0; i < ncomp; i++)
374 fill_coeff_matrice_morse < Type_Double > (fac1, fac2, i, ncomp, aii, ajj, *matrice);
376 flux_evaluateur.template coeffs_arete < Arete_Type > (
nullptr, fac1, fac2, fac3, fac4, aii, ajj);
377 for (
int i = 0; i < ncomp; i++)
378 fill_coeff_matrice_morse < Type_Double > (fac3, fac4, i, ncomp, aii, ajj, *matrice);
386template<
class _TYPE_>
template <
typename Type_Double>
387void Iterateur_VDF_Face<_TYPE_>::ajouter_blocs_aretes_internes(
const int ncomp, matrices_t mats, DoubleTab& secmem,
const tabs_t& semi_impl)
const
389 if(!_TYPE_::CALC_ARR_INT)
return;
391 ajouter_blocs_aretes_generique_<true, Type_Flux_Arete::INTERNE, Type_Double>(premiere_arete_interne, derniere_arete_interne, ncomp, mats, secmem, semi_impl);
394template<
class _TYPE_>
template <
typename Type_Double>
395void Iterateur_VDF_Face<_TYPE_>::ajouter_blocs_aretes_mixtes(
const int ncomp, matrices_t mats, DoubleTab& secmem,
const tabs_t& semi_impl)
const
399 ajouter_blocs_aretes_generique_<true, Type_Flux_Arete::MIXTE, Type_Double>(premiere_arete_mixte, derniere_arete_mixte, ncomp, mats, secmem, semi_impl);
402template <
class _TYPE_>
template <
bool should_calc_flux, Type_Flux_Arete Arete_Type,
typename Type_Double>
403std::enable_if_t<Arete_Type == Type_Flux_Arete::INTERNE || Arete_Type == Type_Flux_Arete::MIXTE, void>
404Iterateur_VDF_Face<_TYPE_>::ajouter_blocs_aretes_generique_(
const int debut,
const int fin,
const int ncomp, matrices_t mats, DoubleTab& secmem,
const tabs_t& semi_impl)
const
407 if (should_calc_flux)
409 constexpr bool is_MIXTE = (Arete_Type == Type_Flux_Arete::MIXTE);
410 Type_Double flux(ncomp), aii(ncomp), ajj(ncomp);
411 DoubleTab& tab_flux_bords = op_base->flux_bords();
412 const DoubleTab& inco = semi_impl.count(nom_ch_inco_) ? semi_impl.at(nom_ch_inco_) : le_champ_convecte_ou_inc->valeurs();
414 const DoubleTab* a_r = (!is_pb_multi || !is_conv_op_) ?
nullptr : semi_impl.count(
"alpha_rho") ? &semi_impl.at(
"alpha_rho") :
415 &ref_cast(
Pb_Multiphase,op_base->equation().probleme()).equation_masse().champ_conserve().valeurs();
418 for (
int n_arete = debut; n_arete < fin; n_arete++)
421 const int fac1 = Qdm(n_arete, 0), fac2 = Qdm(n_arete, 1), fac3 = Qdm(n_arete, 2), fac4 = Qdm(n_arete, 3);
422 const int n = le_dom->nb_faces_bord(), n2 = le_dom->nb_faces_tot();
423 flux_evaluateur.template flux_arete < Arete_Type > (inco, a_r, fac1, fac2, fac3, fac4, flux);
424 fill_resu_tab < Type_Double > (fac3, fac4, ncomp, flux, secmem);
431 for (
int k = 0; k < ncomp; k++) tab_flux_bords(fac1, orientation(fac3)) -= flux[k];
434 for (
int k = 0; k < ncomp; k++) tab_flux_bords(fac2, orientation(fac4)) -= flux[k];
439 for (
int k = 0; k < ncomp; k++) tab_flux_bords(fac1, orientation(fac3)) += flux[k];
442 for (
int k = 0; k < ncomp; k++) tab_flux_bords(fac2, orientation(fac4)) += flux[k];
446 flux_evaluateur.template flux_arete < Arete_Type > (inco, a_r, fac3, fac4, fac1, fac2, flux);
447 fill_resu_tab < Type_Double > (fac1, fac2, ncomp, flux, secmem);
453 for (
int k = 0; k < ncomp; k++) tab_flux_bords(fac3, orientation(fac1)) -= flux[k];
456 for (
int k = 0; k < ncomp; k++) tab_flux_bords(fac4, orientation(fac2)) -= flux[k];
461 for (
int k = 0; k < ncomp; k++) tab_flux_bords(fac3, orientation(fac1)) += flux[k];
464 for (
int k = 0; k < ncomp; k++) tab_flux_bords(fac4, orientation(fac2)) += flux[k];
470 Matrice_Morse *matrice = (is_pb_multi && is_conv_op_) ? (mats.count(nom_ch_inco_) && !semi_impl.count(nom_ch_inco_) ? mats.at(nom_ch_inco_) :
nullptr) : (mats.count(nom_ch_inco_) ? mats.at(nom_ch_inco_) :
nullptr);
472 for (
int n_arete = debut; n_arete < fin; n_arete++)
475 const int fac1 = Qdm(n_arete, 0), fac2 = Qdm(n_arete, 1), fac3 = Qdm(n_arete, 2), fac4 = Qdm(n_arete, 3);
477 flux_evaluateur.template coeffs_arete < Arete_Type > (a_r, fac3, fac4, fac1, fac2, aii, ajj);
478 for (
int i = 0; i < ncomp; i++)
479 fill_coeff_matrice_morse < Type_Double > (fac1, fac2, i, ncomp, aii, ajj, *matrice);
481 flux_evaluateur.template coeffs_arete < Arete_Type > (a_r, fac1, fac2, fac3, fac4, aii, ajj);
482 for (
int i = 0; i < ncomp; i++)
483 fill_coeff_matrice_morse < Type_Double > (fac3, fac4, i, ncomp, aii, ajj, *matrice);
491template<
class _TYPE_>
template <
typename Type_Double>
492void Iterateur_VDF_Face<_TYPE_>::ajouter_blocs_fa7_sortie_libre(
const int ncomp, matrices_t mats, DoubleTab& secmem,
const tabs_t& semi_impl)
const
494 for (
int num_cl = 0; num_cl < le_dom->nb_front_Cl(); num_cl++)
496 const Cond_lim& la_cl = la_zcl->les_conditions_limites(num_cl);
497 switch(type_cl(la_cl))
500 ajouter_blocs_fa7_sortie_libre_<_TYPE_::CALC_FA7_SORTIE_LIB, Type_Flux_Fa7::SORTIE_LIBRE, Type_Double>(num_cl, ncomp, mats, secmem, semi_impl);
505 case paroi_defilante:
506 case paroi_adiabatique:
508 case echange_externe_impose:
509 case echange_global_impose:
513 Cerr <<
"On ne reconnait pas la condition limite : " << la_cl.valeur();
519template <
class _TYPE_>
template <
bool should_calc_flux, Type_Flux_Fa7 Fa7_Type,
typename Type_Double>
520void Iterateur_VDF_Face<_TYPE_>::ajouter_blocs_fa7_sortie_libre_(
const int num_cl,
const int ncomp , matrices_t mats, DoubleTab& secmem,
const tabs_t& semi_impl)
const
523 if (should_calc_flux)
525 Type_Double flux(ncomp), aii(ncomp), ajj(ncomp);
526 const DoubleTab& inco = semi_impl.count(nom_ch_inco_) ? semi_impl.at(nom_ch_inco_) : le_champ_convecte_ou_inc->valeurs();
527 const Cond_lim& la_cl = la_zcl->les_conditions_limites(num_cl);
531 const DoubleTab* a_r = (!is_pb_multi || !is_conv_op_) ?
nullptr : semi_impl.count(
"alpha_rho") ? &semi_impl.at(
"alpha_rho") :
532 &ref_cast(
Pb_Multiphase,op_base->equation().probleme()).equation_masse().champ_conserve().valeurs();
535 for (
int face = ndeb; face < nfin; face++)
537 flux_evaluateur.template flux_fa7 < Fa7_Type > (inco, a_r, face, (
const Neumann_sortie_libre&) la_cl.valeur(), ndeb, flux);
538 if ((elem(face, 0)) > -1)
539 for (
int k = 0; k < ncomp; k++) secmem(face, k) += flux[k];
541 if ((elem(face, 1)) > -1)
542 for (
int k = 0; k < ncomp; k++) secmem(face, k) -= flux[k];
546 Matrice_Morse *matrice = (is_pb_multi && is_conv_op_) ? (mats.count(nom_ch_inco_) && !semi_impl.count(nom_ch_inco_) ? mats.at(nom_ch_inco_) :
nullptr) :
547 (mats.count(nom_ch_inco_) ? mats.at(nom_ch_inco_) :
nullptr);
549 for (
int face = ndeb; face < nfin; face++)
551 flux_evaluateur.template coeffs_fa7 < Fa7_Type > (a_r, face, (
const Neumann_sortie_libre&) la_cl.valeur(), aii, ajj);
552 if ((elem(face, 0)) > -1)
553 for (
int i = 0; i < ncomp; i++) fill_coeff_matrice_morse < Type_Double > (face, i, ncomp, 1, aii, *matrice);
555 if ((elem(face, 1)) > -1)
556 for (
int i = 0; i < ncomp; i++) fill_coeff_matrice_morse < Type_Double > (face, i, ncomp, 1, ajj, *matrice);
564template<
class _TYPE_>
template <
typename Type_Double>
565void Iterateur_VDF_Face<_TYPE_>::ajouter_blocs_fa7_elem(
const int ncomp, matrices_t mats, DoubleTab& secmem,
const tabs_t& semi_impl)
const
567 DoubleTab& tab_flux_bords = op_base->flux_bords();
568 const DoubleTab& inco = semi_impl.count(nom_ch_inco_) ? semi_impl.at(nom_ch_inco_) : le_champ_convecte_ou_inc->valeurs();
569 Type_Double flux(ncomp), aii(ncomp), ajj(ncomp);
570 const int n_fc_bd = le_dom->nb_faces_bord();
572 const DoubleTab* a_r = (!is_pb_multi || !is_conv_op_) ?
nullptr : semi_impl.count(
"alpha_rho") ? &semi_impl.at(
"alpha_rho") :
573 &ref_cast(
Pb_Multiphase,op_base->equation().probleme()).equation_masse().champ_conserve().valeurs();
576 for (
int num_elem = 0; num_elem < nb_elem; num_elem++)
577 for (
int fa7 = 0; fa7 < dimension; fa7++)
579 int fac1 = elem_faces(num_elem, fa7), fac2 = elem_faces(num_elem, fa7 + dimension);
580 flux_evaluateur.template flux_fa7 < Type_Flux_Fa7::ELEM > (inco, a_r, num_elem, fac1, fac2, flux);
582 fill_resu_tab < Type_Double > (fac1, fac2, ncomp, flux, secmem);
585 for (
int k = 0; k < ncomp; k++) tab_flux_bords(fac1, orientation(fac1)) += flux[k];
588 for (
int k = 0; k < ncomp; k++) tab_flux_bords(fac2, orientation(fac2)) -= flux[k];
592 Matrice_Morse *matrice = (is_pb_multi && is_conv_op_) ? (mats.count(nom_ch_inco_) && !semi_impl.count(nom_ch_inco_) ? mats.at(nom_ch_inco_) :
nullptr) :
593 (mats.count(nom_ch_inco_) ? mats.at(nom_ch_inco_) :
nullptr);
596 for (
int num_elem = 0; num_elem < nb_elem; num_elem++)
597 for (
int fa7 = 0; fa7 < dimension; fa7++)
599 const int fac1 = elem_faces(num_elem, fa7), fac2 = elem_faces(num_elem, fa7 + dimension);
600 flux_evaluateur.template coeffs_fa7 < Type_Flux_Fa7::ELEM > (a_r, num_elem, fac1, fac2, aii, ajj);
601 for (
int i = 0; i < ncomp; i++)
602 fill_coeff_matrice_morse < Type_Double > (fac1, fac2, i, ncomp, aii, ajj, *matrice);
607 corriger_fa7_elem_periodicite<Type_Double>(ncomp, mats, secmem, semi_impl);
610template<
class _TYPE_>
template<
typename Type_Double>
611void Iterateur_VDF_Face<_TYPE_>::corriger_fa7_elem_periodicite(
const int ncomp, matrices_t mats, DoubleTab& secmem,
const tabs_t& semi_impl)
const
613 Type_Double flux(ncomp), aii(ncomp), ajj(ncomp);
614 const DoubleTab& inco = semi_impl.count(nom_ch_inco_) ? semi_impl.at(nom_ch_inco_) : le_champ_convecte_ou_inc->valeurs();
615 Matrice_Morse *matrice = (is_pb_multi && is_conv_op_) ? (mats.count(nom_ch_inco_) && !semi_impl.count(nom_ch_inco_) ? mats.at(nom_ch_inco_) :
nullptr) : (mats.count(nom_ch_inco_) ? mats.at(nom_ch_inco_) :
nullptr);
617 for (
int num_cl = 0; num_cl < le_dom->nb_front_Cl(); num_cl++)
619 const Cond_lim& la_cl = la_zcl->les_conditions_limites(num_cl);
627 for (
int face = ndeb; face < nfin; face++)
630 corriger_fa7_elem_periodicite__(face, num_elem, signe, fac1, fac2);
632 flux_evaluateur.template flux_fa7 < Type_Flux_Fa7::ELEM > (inco,
nullptr, num_elem, fac1, fac2, flux);
633 for (
int k = 0; k < ncomp; k++) secmem(face, k) += signe * flux[k];
638 for (
int face = ndeb; face < nfin; face++)
641 corriger_fa7_elem_periodicite__(face, num_elem, signe, fac1, fac2);
643 flux_evaluateur.template coeffs_fa7 < Type_Flux_Fa7::ELEM > (
nullptr, num_elem, fac1, fac2, aii, ajj);
644 const auto& tab1 = (*matrice).get_set_tab1();
645 const auto& tab2 = (*matrice).get_set_tab2();
646 auto& coeff = (*matrice).get_set_coeff();
649 for (
int i = 0; i < ncomp; i++)
650 for (
auto k = tab1[face * ncomp + i] - 1; k < tab1[face * ncomp + 1 + i] - 1; k++)
651 if (tab2[k] - 1 == face * ncomp + i) coeff[k] += aii[i];
653 for (
int i = 0; i < ncomp; i++)
654 for (
auto k = tab1[face * ncomp + i] - 1; k < tab1[face * ncomp + 1 + i] - 1; k++)
655 if (tab2[k] - 1 == fac2 * ncomp + i) coeff[k] -= ajj[i];
659 for (
int i = 0; i < ncomp; i++)
660 for (
auto k = tab1[face * ncomp + i] - 1; k < tab1[face * ncomp + 1 + i] - 1; k++)
661 if (tab2[k] - 1 == fac1 * ncomp + i) coeff[k] -= aii[i];
663 for (
int i = 0; i < ncomp; i++)
664 for (
auto k = tab1[face * ncomp + i] - 1; k < tab1[face * ncomp + 1 + i] - 1; k++)
665 if (tab2[k] - 1 == face * ncomp + i) coeff[k] += ajj[i];
672template<
class _TYPE_>
673void Iterateur_VDF_Face<_TYPE_>::corriger_fa7_elem_periodicite__(
const int face,
int& num_elem,
int& signe,
int& fac1,
int& fac2)
const
675 const int elem1 = elem(face, 0), elem2 = elem(face, 1), ori = orientation(face);
676 if ((face == elem_faces(elem1, ori)) || (face == elem_faces(elem1, ori + dimension)))
686 fac1 = elem_faces(num_elem, ori), fac2 = elem_faces(num_elem, ori + dimension);
693template<
class _TYPE_>
template<
typename Type_Double>
694void Iterateur_VDF_Face<_TYPE_>::ajouter_pour_compressible(
const int ncomp, matrices_t mats, DoubleTab& secmem,
const tabs_t& semi_impl)
const
697 const DoubleTab& vit = le_champ_convecte_ou_inc->valeurs();
700 DoubleTrav unite(secmem), resu(secmem);
704 tabs_t tabsT = {{le_champ_convecte_ou_inc->le_nom().getString(), unite}};
706 if (semi_impl.count(
"alpha_rho") ) tabsT.insert({
"alpha_rho", semi_impl.at(
"alpha_rho")});
708 ajouter_blocs_aretes_bords<Type_Double>(ncomp, mats, resu, tabsT);
709 ajouter_blocs_aretes_coins<Type_Double>(ncomp, mats, resu, tabsT);
710 ajouter_blocs_aretes_internes<Type_Double>(ncomp, mats, resu, tabsT);
711 ajouter_blocs_aretes_mixtes<Type_Double>(ncomp, mats, resu, tabsT);
712 ajouter_blocs_fa7_sortie_libre<Type_Double>(ncomp, mats, resu, tabsT);
713 ajouter_blocs_fa7_elem<Type_Double>(ncomp, mats, resu, tabsT);
724template<
class _TYPE_>
template<
typename Type_Double>
725inline void Iterateur_VDF_Face<_TYPE_>::fill_resu_tab(
const int fac1,
const int fac2,
const int ncomp,
const Type_Double& flux, DoubleTab& resu)
const
727 for (
int k = 0; k < ncomp; k++)
729 resu(fac1, k) += flux[k];
730 resu(fac2, k) -= flux[k];
734template<
class _TYPE_>
template<
typename Type_Double>
735void Iterateur_VDF_Face<_TYPE_>::fill_coeff_matrice_morse(
const int face,
const int i,
const int ncomp,
const int signe,
const Type_Double& A,
Matrice_Morse& matrice)
const
740 for (
auto k = tab1[face * ncomp + i] - 1; k < tab1[face * ncomp + 1 + i] - 1; k++)
741 if (tab2[k] - 1 == face * ncomp + i) coeff[k] += signe * A[i];
744template<
class _TYPE_>
template<
typename Type_Double>
745void Iterateur_VDF_Face<_TYPE_>::fill_coeff_matrice_morse(
const int fac1,
const int fac2,
const int i,
const int ncomp,
const Type_Double& A,
const Type_Double& B,
Matrice_Morse& matrice)
const
750 for (
auto k = tab1[fac1 * ncomp + i] - 1; k < tab1[fac1 * ncomp + 1 + i] - 1; k++)
752 if (tab2[k] - 1 == fac1 * ncomp + i) coeff[k] += A[i];
753 if (tab2[k] - 1 == fac2 * ncomp + i) coeff[k] -= B[i];
755 for (
auto k = tab1[fac2 * ncomp + i] - 1; k < tab1[fac2 * ncomp + 1 + i] - 1; k++)
757 if (tab2[k] - 1 == fac1 * ncomp + i) coeff[k] -= A[i];
758 if (tab2[k] - 1 == fac2 * ncomp + i) coeff[k] += B[i];
762#include <Iterateur_VDF_Face_bis.tpp>
virtual Frontiere_dis_base & frontiere_dis()
Renvoie la frontiere discretisee a laquelle les conditions aux limites s'appliquent.
classe Cond_lim Classe generique servant a representer n'importe quelle classe
int num_premiere_face() const
void ajouter_blocs(matrices_t mats, DoubleTab &secmem, const tabs_t &semi_impl) const override
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
classe Neumann_sortie_libre Cette classe represente une frontiere ouverte sans vitesse imposee
static bool DEACTIVATE_ARETE_MIXTE
classe Pb_Multiphase Cette classe represente un probleme de thermohydraulique multiphase de type "3*N...
classe Periodique Cette classe represente une condition aux limites periodique.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)