16#include <Op_Grad_PolyMAC_HFV_Face.h>
17#include <Champ_Elem_PolyMAC_HFV.h>
18#include <Masse_PolyMAC_HFV_Face.h>
19#include <Champ_Face_PolyMAC_HFV.h>
20#include <Check_espace_virtuel.h>
21#include <Neumann_sortie_libre.h>
22#include <Domaine_Cl_PolyMAC_family.h>
23#include <Schema_Temps_base.h>
24#include <Navier_Stokes_std.h>
25#include <Probleme_base.h>
26#include <Pb_Multiphase.h>
27#include <Matrix_tools.h>
28#include <Array_tools.h>
29#include <Milieu_base.h>
33#include <Perf_counters.h>
50 if (
equation().inconnue().valeurs().get_md_vector() == domaine.mdv_faces_aretes)
55 if (domaine.domaine().nb_joints() && domaine.domaine().joint(0).epaisseur() < 1)
57 Cerr <<
"Op_Grad_PolyMAC_HFV_Face : largeur de joint insuffisante (minimum 1)!" << finl;
64 if (!matrices.count(
"pression"))
return;
68 const IntTab& e_f = domaine.elem_faces(), &fcl = ch.
fcl();
70 const int ne_tot = domaine.nb_elem_tot(), N = vit.
line_size(), M = press.line_size();
75 for (
int e = 0; e < ne_tot; e++)
77 domaine.W2(
nullptr, e, w2);
81 const int f = e_f(e, i);
83 if (f < domaine.nb_faces())
86 for (
int n = 0; n < N; n++, m += (M > 1))
91 const int fb = e_f(e, j);
92 if (fcl(fb, 0) != 1 && w2(i, j, 0))
95 for (
int n = 0; n < N; n++, m += (M > 1))
104 tableau_trier_retirer_doublons(sten);
116 const IntTab& f_e = domaine.face_voisins(), &e_f = domaine.elem_faces(),
119 const DoubleTab& vfd = domaine.volumes_entrelaces_dir(),
120 &press = semi_impl.count(
"pression") ? semi_impl.at(
"pression") : ref_cast(
Navier_Stokes_std,
equation()).pression().valeurs(),
124 const int ne_tot = domaine.nb_elem_tot(), N = secmem.
line_size(), M = press.line_size();
126 Matrice_Morse *mat = !semi_impl.count(
"pression") && matrices.count(
"pression") ? matrices.at(
"pression") :
nullptr;
128 DoubleTrav w2, alpha(N), coeff_e(N);
130 for (
int e = 0; e < ne_tot; e++)
132 domaine.W2(
nullptr, e, w2);
133 for (
int i = 0; i < w2.
dimension(0); i++)
135 const int f = e_f(e, i);
137 if (f < domaine.nb_faces())
140 double prefac = (e == f_e(f, 0) ? 1 : -1) * pe(e) * vfd(f, e != f_e(f, 0)) / fs(f);
144 for (
int j = 0; j < 2; j++)
146 const int eb = f_e(f, j);
147 if (eb < 0)
continue;
149 for (
int n = 0; n < N; n++)
150 alpha(n) += vfd(f, j) * (alp ? (*alp)(eb, n) : 1) / vf(f);
155 for (
int j = 0; j < w2.
dimension(1); j++)
158 const int fb = e_f(e, j);
161 for (
int n = 0; n < N; n++, m += (M > 1))
163 const double fac = alpha(n) * w2(i, j, 0) * prefac;
164 secmem(f, n) -= fac * (press(ne_tot + fb, m) - press(e, m));
166 if (mat && fcl(fb, 0) != 1)
167 (*mat)(N * f + n, M * (ne_tot + fb) + m) += fac;
176 for (
int n = 0; n < N; n++, m += (M > 1))
177 (*mat)(N * f + n, M * e + m) -= coeff_e(n);
: class Champ_Elem_PolyMAC_HFV
: class Champ_Face_PolyMAC_HFV
const IntTab & fcl() const
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
Class defining operators and methods for all reading operation in an input flow (file,...
virtual const Milieu_base & milieu() const =0
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 Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
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_Grad_PolyMAC_CDO_Face
class Op_Grad_PolyMAC_HFV_Face
void completer() override
Associe l'operateur au domaine_dis, le domaine_Cl_dis, et a l'inconnue de son equation.
void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={ }) const override
void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={ }) const override
virtual void completer()
Associe l'operateur au domaine_dis, le domaine_Cl_dis, et a l'inconnue de son equation.
classe Pb_Multiphase Cette classe represente un probleme de thermohydraulique multiphase de type "3*N...
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
_SIZE_ size_totale() const