16#include <Op_Conv_EF_Stab_PolyMAC_HFV_Elem.h>
17#include <Champ_Elem_PolyMAC_HFV.h>
18#include <Champ_Face_PolyMAC_HFV.h>
19#include <Masse_PolyMAC_HFV_Elem.h>
20#include <Convection_Diffusion_std.h>
21#include <Discretisation_base.h>
22#include <Dirichlet_homogene.h>
23#include <Domaine_Cl_PolyMAC_family.h>
24#include <Schema_Temps_base.h>
25#include <Domaine_Poly_base.h>
26#include <Option_PolyMAC_family.h>
27#include <Pb_Multiphase.h>
28#include <Probleme_base.h>
29#include <Matrix_tools.h>
30#include <Milieu_base.h>
31#include <Array_tools.h>
32#include <TRUSTLists.h>
46Op_Conv_Amont_PolyMAC_HFV_Elem::Op_Conv_Amont_PolyMAC_HFV_Elem() {
alpha_ = 1.0; }
47Op_Conv_Centre_PolyMAC_HFV_Elem::Op_Conv_Centre_PolyMAC_HFV_Elem() {
alpha_ = 0.0; }
62 param.ajouter(
"alpha", &
alpha_);
64 param.lire_avec_accolades_depuis(is);
67 if (sub_type(Masse_Multiphase,
equation()))
69 const Pb_Multiphase& pb = ref_cast(Pb_Multiphase,
equation().probleme());
96 flux_bords_.resize(domaine.premiere_face_int(), (le_champ_inco ? le_champ_inco->valeurs() :
equation().inconnue().valeurs()).line_size());
98 if (domaine.domaine().nb_joints() && domaine.domaine().joint(0).epaisseur() < 2)
100 Cerr <<
"Op_Conv_EF_Stab_PolyMAC_HFV_Elem : largeur de joint insuffisante (minimum 2)!" << finl;
107 const DoubleTab& vit = vitesse_->valeurs();
120 const int N = std::min(vit.
line_size(),
equation().inconnue().valeurs().line_size());
125 for (
int e = 0; e < domaine.nb_elem(); e++)
128 const double poro_vol = pe(e) * ve(e);
129 for (
int i = 0; i < e_f.
dimension(1); i++)
131 const int f = e_f(e, i);
135 for (
int n = 0; n < N; n++)
138 flux(n) += pf(f) * fs(f) * std::max((e == f_e(f, 1) ? 1 : -1) * vit(f, idx_phase), 0.);
142 for (
int n = 0; n < N; n++)
143 if ((!alp || (*alp)(e, n) > 1e-3) && std::abs(flux(n)) > 1e-12 )
144 dt = std::min(dt, poro_vol / flux(n));
155 const IntTab& f_e = domaine.face_voisins(), &fcl_v = ref_cast(
Champ_Face_base, vitesse_.valeur()).fcl();
158 for (
const auto &i_m : mats)
164 Stencil stencil(0, 2);
168 if (i_m.first ==
"vitesse")
171 for (
int f = 0; f < domaine.nb_faces_tot(); f++)
173 for (
int i = 0; i < 2; i++)
178 if (e < domaine.nb_elem())
179 for (
int n = 0; n < N; n++)
189 for (
int f = 0; f < domaine.nb_faces_tot(); f++)
190 for (
int i = 0; i < 2; i++)
195 if (e < domaine.nb_elem())
196 for (
int j = 0; j < 2; j++)
199 if (eb < 0)
continue;
202 for (
int n = 0; n < N; n++, m += (M > 1))
209 tableau_trier_retirer_doublons(stencil);
211 (i_m.first ==
"vitesse" ? vitesse_->valeurs().size_totale() : cc.
derivees().at(i_m.first).size_totale()),
215 if (i_m.second->nb_colonnes())
225 const DoubleTab& vit = vitesse_->valeurs();
236 Matrice_Morse *m_vit = mats.count(
"vitesse") ? mats.at(
"vitesse") :
nullptr;
238 const IntTab& f_e = domaine.face_voisins(),
243 const DoubleTab& vcc = semi_impl.count(nom_cc) ? semi_impl.at(nom_cc) : cc.
valeurs(), bcc = cc.
valeur_aux_bords();
246 std::vector<std::tuple<const DoubleTab*, Matrice_Morse*, int>> d_cc;
248 if (!semi_impl.count(nom_cc))
249 for (
auto &i_m : mats)
253 DoubleTrav dv_flux(N), dc_flux(2, N);
256 for (
int f = 0; f < domaine.nb_faces(); f++)
258 const bool traiter_face = (fcl(f, 0) == 0 || (fcl(f, 0) > 4 && fcl(f, 0) < 7));
265 for (
int i = 0; i < 2; i++)
270 for (
int n = 0; n < N; n++, m += (Mv > 1))
273 const double vit_f = vit(f, idx_phase);
274 const double v = vit_f ? vit_f : DBL_MIN;
275 const double fac = pf(f) * fs(f) * (1. + (v * (i ? -1 : 1) > 0 ? 1. : -1) *
alpha_) / 2;
277 dv_flux(n) += fac * (e >= 0 ? vcc(e, n) : bcc(f, n));
278 dc_flux(i, n) = e >= 0 ? fac * vit_f : 0;
283 for (
int i = 0; i < 2; i++)
288 if (e < domaine.nb_elem())
291 for (
int n = 0; n < N; n++, m += (Mv > 1))
294 secmem(e, n) -= (i ? -1 : 1) * dv_flux(n) * vit(f, idx_phase);
300 if (m_vit && fcl_v(f, 0) < 2)
301 for (
int i = 0; i < 2; i++)
306 if (e < domaine.nb_elem())
309 for (
int n = 0; n < N; n++, m += (Mv > 1))
312 (*m_vit)(N * e + n, Mv * f + idx_phase) += (i ? -1 : 1) * dv_flux(n);
318 for (
auto &&d_m_i : d_cc)
320 int M = std::get<2>(d_m_i);
321 for (
int i = 0; i < 2; i++)
326 if (e < domaine.nb_elem())
327 for (
int j = 0; j < 2; j++)
330 if (eb < 0)
continue;
333 for (
int n = 0; n < N; n++, m += (M > 1))
334 (*std::get<1>(d_m_i))(N * e + n, M * eb + m) += (i ? -1 : 1) * dc_flux(j, n) * (*std::get<0>(d_m_i))(eb, m);
358 if (opt == DESCRIPTION)
359 Cerr <<
" Op_Conv_EF_Stab_PolyMAC_HFV_Elem : " << noms_compris << finl;
361 nom.add(noms_compris);
391 const DoubleTab& vit = vitesse_->valeurs();
402 const IntTab& f_e = domaine.face_voisins(), &e_f = domaine.elem_faces();
405 &fs = domaine.face_surfaces(), &ve = domaine.volumes();
407 const DoubleTab& vcc = cc.
valeurs(),
419 for (
int f = 0; f < domaine.premiere_face_int(); f++)
422 for (
int i = 0; i < 2; i++)
426 for (
int n = 0; n < N; n++, m += (M > 1))
429 cc_f(n) += (1. + (vit(f, idx_phase) * (i ? -1 : 1) >= 0 ? 1. : -1.) *
alpha_) / 2 * (e >= 0 ? vcc(e, n) : bcc(f, n));
434 for (
int n = 0; n < N; n++, m += (M > 1))
437 flux_bords_(f, n) = pf(f) * fs(f) * vit(f, idx_phase) * cc_f(n);
444 for (
int n = 0; n < N; n++, m += (M > 1))
448 DoubleTab& v_ph = c_ph.
valeurs();
450 for (
int f = 0; f < domaine.nb_faces(); f++)
454 if (m != idx_phase)
continue;
455 for (
int i = 0; i < 2; i++)
458 double signe = (vit(f, m) * (i ? -1 : 1) >= 0) ? 1. : -1.;
459 double facteur = (1. + signe *
alpha_) / 2.;
461 v_ph(f) += facteur * (e >= 0 ? vcc(e, n) : bcc(f, n));
464 v_ph(f) *= vit(f, m) * pf(f);
474 for (
int n = 0; n < N; n++, m += (M > 1))
479 DoubleTab& v_ph = c_ph.
valeurs();
482 for (
int f = 0; f < domaine.nb_faces(); f++)
486 if (m != idx_phase)
continue;
487 for (
int i = 0; i < 2; i++)
490 double signe = (vit(f, m) * (i ? -1 : 1) >= 0) ? 1. : -1.;
491 double facteur = (1. + signe *
alpha_) / 2.;
493 v_ph(f) += facteur * (e >= 0 ? alp(e, n) : balp(f, n));
496 v_ph(f) *= vit(f, m) * pf(f);
503 DoubleTrav G(N), v(N, D);
507 for (
int e = 0; e < domaine.nb_elem(); e++)
510 for (
int i = 0; i < e_f.dimension(1); i++)
515 for (
int n = 0; n < N; n++)
516 for (
int d = 0; d < D; d++)
517 v(n, d) += fs(f) * pf(f) * (xv(f, d) - xp(e, d)) * (e == f_e(f, 0) ? 1 : -1) * vit(f, n) / (pe(e) * ve(e));
521 for (
int n = 0; n < N; n++)
523 G(n) = vcc(e, n) * sqrt(domaine.dot(&v(n, 0), &v(n, 0)));
527 for (
int n = 0; n < N; n++)
529 x_phases_[n]->valeurs()(e) = Gt ? G(n) / Gt : 0.;
533 for (
int n = 0; n < N; n++)
: class Champ_Face_PolyMAC_HFV
: class Champ_Inc_P0_base
double changer_temps(const double temps) override
Fixe le temps du champ.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
const tabs_t & derivees() const
DoubleTab valeur_aux_bords() const override
renvoie la valeur du champ aux faces de bord
virtual DoubleTab & valeurs()=0
virtual void creer_champ(const Motcle &motlu)=0
virtual void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const =0
void discretiser_champ(const Motcle &directive, const Domaine_dis_base &z, const Nom &nom, const Nom &unite, int nb_comp, int nb_pas_dt, double temps, OWN_PTR(Champ_Inc_base)&champ, const Nom &sous_type=NOM_VIDE) const
virtual const DoubleVect & face_surfaces() const
Class defining operators and methods for all reading operation in an input flow (file,...
virtual const Milieu_base & milieu() const =0
const Discretisation_base & discretisation() const
Renvoie la discretisation associee a l'equation.
virtual const Champ_Inc_base & inconnue() const =0
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
virtual void init_champ_convecte() const
virtual Champ_Inc_base & champ_convecte() const
const Nom & le_nom() const override
Renvoie le nom du champ.
classe Masse_Multiphase Cas particulier de Convection_Diffusion_std pour un fluide quasi conpressible
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
DoubleVect & porosite_elem()
DoubleVect & porosite_face()
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Une chaine de caractere (Nom) en majuscules.
const std::string & getString() const
Un tableau de chaine de caracteres (VECT(Nom)).
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
: class Op_Conv_EF_Stab_PolyMAC_HFV_Elem
double calculer_dt_stab() const override
Calcul dt_stab.
std::vector< OWN_PTR(Champ_Inc_base)> cc_phases_
void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={}) const override
void creer_champ(const Motcle &motlu) override
int idx_phase_transportante_
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
void ajouter_blocs_gen(matrices_t mats, DoubleTab &secmem, const DoubleTab &vit, const tabs_t &semi_impl) const
std::vector< OWN_PTR(Champ_Inc_base)> x_phases_
void mettre_a_jour_gen(double temps, const DoubleTab &vit)
double calculer_dt_stab_gen(const DoubleTab &vit) const
void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={}) const override
void mettre_a_jour(double temps) override
DOES NOTHING - to override in derived classes.
void preparer_calcul() override
std::vector< OWN_PTR(Champ_Inc_base)> vd_phases_
Champs_compris champs_compris_
virtual void mettre_a_jour(double temps)
DOES NOTHING - to override in derived classes.
virtual void preparer_calcul()
const Champ_base & get_champ(const Motcle &nom) const override
static int TRAITEMENT_AXI
classe Pb_Multiphase Cette classe represente un probleme de thermohydraulique multiphase de type "3*N...
const Nom & nom_phase(int i) const
const Champ_base & get_champ(const Motcle &nom) const override
static double mp_min(double)
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Classe de base des flux de sortie.
_SIZE_ dimension(int d) const