16#include <Convection_Diffusion_Temperature.h>
17#include <Flux_interfacial_PolyMAC_HFV.h>
18#include <Echange_contact_PolyMAC_MPFA.h>
19#include <Op_Diff_PolyMAC_MPFA_Elem.h>
20#include <Echange_externe_impose.h>
21#include <Champ_Elem_PolyMAC_MPFA.h>
22#include <Flux_parietal_base.h>
23#include <Domaine_PolyMAC_MPFA.h>
24#include <Domaine_Cl_PolyMAC_family.h>
25#include <Milieu_composite.h>
26#include <Option_PolyMAC_family.h>
27#include <Neumann_paroi.h>
28#include <Pb_Multiphase.h>
29#include <Matrix_tools.h>
30#include <Array_tools.h>
58 if (domaine.domaine().nb_joints() && domaine.domaine().joint(0).epaisseur() < 1)
60 Cerr <<
"Op_Diff_PolyMAC_MPFA_Elem : largeur de joint insuffisante (minimum 1)!" << finl;
74 for (
const auto &itr : la_zcl_poly_->les_conditions_limites())
77 has_echange_contact_ =
true;
81 if ((has_echange_contact_ || has_flux_par_) &&
equation().diffusion_multi_scalaire())
82 Process::exit(
"Multi-scalar diffusion is not compatible with echange_contact or parietal flux coupling.");
84 if (has_echange_contact_ || has_flux_par_)
85 couplage_parietal_helper_.associer(*
this);
89 couplage_parietal_helper_.completer_d_nuc();
96 const IntTab& e_f = domaine.elem_faces(), &fcl = ch.
fcl();
97 const DoubleTab& nf = domaine.face_normales();
116 for (
int e = 0; e < domaine.nb_elem(); e++)
120 for (
int i = 0; i < e_f.
dimension(1); i++)
122 const int f = e_f(e, i);
126 for (
int n = 0; n < N; n++)
127 flux(n) += domaine.nu_dot(&
nu_, e, n, &nf(f, 0), &nf(f, 0)) / vf(f);
130 for (
int n = 0; n < N; n++)
131 if ((!alp || (*alp)(e, n) > 1e-3) && flux(n))
132 dt = std::min(dt, pe(e) * ve(e) * (alp ? (*alp)(e, n) : 1) * (lambda(!cL * e, n) / diffu(!cD * e, n)) / flux(n));
143 couplage_parietal_helper_.d_nuc_a_jour() = 0;
148 if (!couplage_parietal_helper_.d_nuc_a_jour())
150 Cerr <<
"Op_Diff_PolyMAC_MPFA_Elem : attempt to access d_nucleation (nucleate bubble diameter) before ajouter_blocs() has been called!" << finl
151 <<
"Please call assembler_blocs() on Energie_Multiphase before calling it on Masse_Multiphase." << finl;
154 return couplage_parietal_helper_.d_nuc();
162 if (has_echange_contact_ || has_flux_par_)
163 couplage_parietal_helper_.init_op_ext();
187 if (semi_impl.count(nom_inco))
190 if (has_echange_contact_ || has_flux_par_)
192 couplage_parietal_helper_.dimensionner_blocs(matrices, semi_impl);
198 const IntTab& f_e = domaine.face_voisins();
200 Matrice_Morse* mat = matrices.count(nom_inco) ? matrices.at(nom_inco) :
nullptr;
209 domaine.creer_tableau_faces(tpfa);
212 Cerr <<
"Op_Diff_PolyMAC_MPFA_Elem::dimensionner() : ";
215 for (
int f = 0; f < domaine.nb_faces(); f++)
216 for (
int i = 0; i < 2; i++)
218 const int e = f_e(f, i);
221 if (e < domaine.nb_elem())
224 const int e_s =
phif_e(j);
226 if (e_s < domaine.nb_elem_tot())
227 for (
int n = 0; n < N; n++)
231 const int tmp = (e_s == f_e(f, 0)) || (e_s == f_e(f, 1)) || (
phif_c(j, n) == 0);
239 tableau_trier_retirer_doublons(stencil);
251 const double elem_t =
static_cast<double>(domaine.domaine().md_vector_elements()->nb_items_seq_tot()),
252 face_t =
static_cast<double>(domaine.md_vector_faces()->nb_items_seq_tot());
254 << mp_somme_vect_as_double(tpfa) * 100. / (N * face_t) <<
"% TPFA " << finl;
273#ifdef _COMPILE_AVEC_PGCC_AVANT_22_7
274 Cerr <<
"Internal error with nvc++: Internal error: read_memory_region: not all expected entries were read." << finl;
279 if (has_echange_contact_ || has_flux_par_)
281 couplage_parietal_helper_.ajouter_blocs(matrices, secmem, semi_impl);
290 const DoubleTab& inco = semi_impl.count(nom_inco) ? semi_impl.at(nom_inco) : ch.
valeurs();
291 const DoubleVect& fs = domaine.face_surfaces();
293 const IntTab& f_e = domaine.face_voisins(), &fcl = ch.
fcl();
299 Matrice_Morse* mat = !semi_impl.count(nom_inco) && matrices.count(nom_inco) ? matrices.at(nom_inco) :
nullptr;
304 for (
int f = 0; f < domaine.nb_faces(); f++)
311 const int fb = eb - domaine.nb_elem_tot();
315 for (
int n = 0; n < N; n++)
316 flux(n) +=
phif_c(i, n) * fs(f) * inco(eb, n);
319 for (
int j = 0; j < 2; j++)
321 const int e = f_e(f, j);
324 if (e < domaine.nb_elem())
325 for (
int n = 0; n < N; n++)
326 (*mat)(N * e + n, N * eb + n) += (j ? 1 : -1) *
phif_c(i, n) * fs(f);
329 else if (fcl(fb, 0) == 1 || fcl(fb, 0) == 2)
331 for (
int n = 0; n < N; n++)
335 else if (fcl(fb, 0) == 4)
337 for (
int n = 0; n < N; n++)
339 ref_cast(
Neumann_paroi, cls[fcl(fb, 1)].valeur()).flux_impose(fcl(fb, 2), n) : 0);
341 else if (fcl(fb, 0) == 6)
343 for (
int n = 0; n < N; n++)
345 ref_cast(
Dirichlet, cls[fcl(fb, 1)].valeur()).val_imp(fcl(fb, 2), n) : 0);
349 for (
int j = 0; j < 2; j++)
351 const int e = f_e(f, j);
354 if (e < domaine.nb_elem())
355 for (
int n = 0; n < N; n++)
356 secmem(e, n) += (j ? -1 : 1) * flux(n);
359 if (f < domaine.premiere_face_int())
360 for (
int n = 0; n < N; n++)
: class Champ_Elem_PolyMAC_MPFA
const IntTab & fcl() const
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual DoubleTab & valeurs()=0
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
classe Convection_Diffusion_Temperature Cas particulier de Convection_Diffusion_std
classe Dirichlet Cette classe est la classe de base de la hierarchie des conditions aux limites de ty...
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
classe Echange_impose_base: Cette condition limite sert uniquement pour l'equation d'energie.
classe Energie_Multiphase Cas particulier de Convection_Diffusion_std pour un fluide quasi conpressib...
Class defining operators and methods for all reading operation in an input flow (file,...
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
virtual const Milieu_base & milieu() const =0
virtual const Champ_Inc_base & inconnue() const =0
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
const Nom & le_nom() const override
Renvoie le nom du champ.
classe Flux_parietal_base correlations de flux parietal de la forme
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
int nb_colonnes() const override
Return local number of columns (=size on the current proc).
DoubleVect & porosite_elem()
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Classe Neumann_paroi Cette condition limite correspond a un flux impose pour l'equation de.
const std::string & getString() const
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.
const Champ_base & diffusivite() const override
void mettre_a_jour(double t) override
DOES NOTHING - to override in derived classes.
void completer() override
Associe l'operateur au domaine_dis, le domaine_Cl_dis, et a l'inconnue de son equation.
void init_op_ext() const override
void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={}) const override
Assembles the diffusion contribution to the linear system.
void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={}) const override
Dimensions the matrix blocks for the linear system.
double calculer_dt_stab() const override
Calcul dt_stab.
const DoubleTab & d_nucleation() const
Op_Diff_PolyMAC_MPFA_Elem()
class Op_Diff_PolyMAC_MPFA_base
void completer() override
Associe l'operateur au domaine_dis, le domaine_Cl_dis, et a l'inconnue de son equation.
void update_phif(int full_stencil=0) const
void mettre_a_jour(double t) override
DOES NOTHING - to override in derived classes.
void update_nu() const override
std::vector< const Operateur_Diff_base * > op_ext
virtual const Champ_base & diffusivite_pour_pas_de_temps() const
Renvoie le champ_don correspondant a la vraie diffusivite du milieu qui sert pour le calcul du pas de...
bool has_champ_inco() const
const Champ_Inc_base & mon_inconnue() const
static int TRAITEMENT_AXI
classe Pb_Multiphase Cette classe represente un probleme de thermohydraulique multiphase de type "3*N...
int has_correlation(std::string nom_correlation) const
const Correlation_base & get_correlation(std::string nom_correlation) const
static double mp_min(double)
static double mp_sum_as_double(int v)
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Classe de base des flux de sortie.
virtual const Champ_base & get_champ_masse_volumique() const
Renvoie le champ de masse volumique.
virtual void declare_support_masse_volumique(int ok)
Le constructeur d'une classe derivee qui se sert de la masse volumique doit appeler cette fonction av...
virtual int has_champ_masse_volumique() const
Renvoie 1 si la masse volumique a ete associee, 0 sinon.
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const