16#include <Champ_Face_PolyMAC_MPFA.h>
18#include <Domaine_VF.h>
19#include <Champ_Uniforme.h>
20#include <Domaine_PolyMAC_MPFA.h>
21#include <Domaine_Cl_PolyMAC_family.h>
22#include <TRUSTLists.h>
24#include <Dirichlet_homogene.h>
27#include <TRUSTTab_parts.h>
28#include <Linear_algebra_tools_impl.h>
29#include <Probleme_base.h>
30#include <Equation_base.h>
31#include <Schema_Temps_base.h>
32#include <Champ_Fonc_reprise.h>
35#include <Pb_Multiphase.h>
39inline void project_axis_face(
const IntTab& f_s,
const DoubleTab& xs,
const DoubleTab& xp,
40 DoubleTrav& xfb,
int f,
int e)
43 for (
int i = 0; i < f_s.
dimension(1) && s1 < 0; i++)
45 const int s = f_s(f, i);
51 assert(s0 >= 0 && s1 >= 0);
52 const double tx = xs(s1, 0) - xs(s0, 0), ty = xs(s1, 1) - xs(s0, 1);
53 const double nx = ty, ny = -tx;
54 const double n2 = nx * nx + ny * ny;
56 const double mx = 0.5 * (xs(s0, 0) + xs(s1, 0)), my = 0.5 * (xs(s0, 1) + xs(s1, 1));
57 const double dx = xp(e, 0) - mx, dy = xp(e, 1) - my;
58 const double coeff = (dx * nx + dy * ny) / n2;
60 xfb(f, 0) = xp(e, 0) - coeff * nx;
61 xfb(f, 1) = xp(e, 1) - coeff * ny;
93 DoubleTab& vals =
futur(n);
120 const DoubleTab& ch_val = ch.
valeurs();
132 for (
int j = 0; j < ch_val.
line_size(); j++)
133 val(i,j) = ch_val(i,j);
139 const DoubleVect& fs =
domaine.face_surfaces();
140 const DoubleTab& nf =
domaine.face_normales(), &xv =
domaine.xv();
149 for (
int f = 0; f <
domaine.nb_faces_tot(); f++)
150 for (
int d = 0; d < D; d++)
151 for (
int n = 0; n < N; n++)
153 val(f, n) += eval(unif ? 0 : f, N * d + n) * nf(f, d) / fs(f);
181 const DoubleVect& fs =
domaine.face_surfaces(), &ve =
domaine.volumes(),
186 const IntTab& e_f =
domaine.elem_faces(), &f_e =
domaine.face_voisins();
190 for (
int e = 0; e < ne_tot; e++)
192 for (
int d = 0; d < D; d++)
193 for (
int n = 0; n < N; n++)
194 val(nf_tot + D * e + d, n) = 0;
195 for (
int j = 0; j < e_f.
dimension(1); j++)
197 const int f = e_f(e, j);
200 fac = (e == f_e(f, 0) ? 1 : -1) * (pf ? (*pf)(f) : 1.0) * fs(f) / ((pe ? (*pe)(e) : 1.0) * ve(e));
201 for (
int d = 0; d < D; d++)
202 for (
int n = 0; n < N; n++)
203 val(nf_tot + D * e + d, n) += fac * (xv(f, d) - xp(e, d)) * val(f, n);
231 &xs =
domaine.domaine().coord_sommets();
232 const IntTab& f_e =
domaine.face_voisins(), &e_f =
domaine.elem_faces(),
233 &e_s =
domaine.domaine().les_elems(), &f_s =
domaine.face_sommets();
235 int D =
dimension, nl = D * (D + 1), infoo = 0, un = 1;
236 double eps = 1e-8, fac;
242 DoubleTrav xfb(
domaine.nb_faces_tot(), D), ve2, ve2i, A, B, P, W(1);
245 const double tol_norm2 = 1e-24;
246 for (
int f = 0; f <
domaine.nb_faces_tot(); f++)
247 if (
fcl_(f, 0) == 1 ||
fcl_(f, 0) == 2)
249 const int e = f_e(f, 0);
250 const double nf_norm2 =
domaine.dot(&nf(f, 0), &nf(f, 0));
254 double scal =
domaine.dot(&xv(f, 0), &nf(f, 0), &xp(e, 0)) / (fs(f) * fs(f));
255 for (
int d = 0; d < D; d++)
256 xfb(f, d) = xp(e, d) + scal * nf(f, d);
259 project_axis_face(f_s, xs, xp, xfb, f, e);
263 for (
int d = 0; d < D; d++)
264 xfb(f, d) = xv(f, d);
268 std::vector<std::set<int>> s_f(
domaine.domaine().nb_som()), e_s_f(
domaine.nb_elem());
269 for (
int f = 0; f <
domaine.nb_faces_tot(); f++)
270 for (
int i = 0; i < f_s.
dimension(1); i++)
272 const int s = f_s(f, i);
275 if (s <
domaine.domaine().nb_som())
279 for (
int e = 0; e <
domaine.nb_elem(); e++)
280 for (
int i = 0; i < e_s.dimension(1); i++)
282 const int s = e_s(e, i);
285 for (
auto &&fa : s_f[s])
291 std::map<std::array<int, 2>,
int> v_i;
292 std::vector<std::array<int, 2>> i_v;
294 for (
int e = 0; e <
domaine.nb_elem(); e++, v_i.clear(), i_v.clear())
297 for (
auto &&fa : e_s_f[e])
298 if (!v_i.count( { { fa, -1 } }))
299 v_i[ { { fa, -1 } }] = (int) i_v.size(), i_v.push_back( { { fa, -1 } });
300 for (
int i = 0; i < e_f.dimension(1) ; i++)
302 const int f = e_f(e, i);
306 for (
int d = 0; d < D; d++)
307 v_i[ { { f, d } }] = (int) i_v.size(), i_v.push_back( { { f, d } });
311 const int nc = (int) i_v.size();
320 for (
int i = 0; i < e_f.dimension(1); i++)
322 const int f = e_f(e, i);
325 fac = (e == f_e(f, 0) ? 1 : -1) * fs(f) / ve(e);
326 int j = v_i.at( { { f, -1 } });
328 for (
int d = 0; d < D; d++)
329 ve2(j, d) += fac * (xv(f, d) - xp(e, d));
332 for (
int i = 0; i < nc; i++)
335 xf = i_v[i][1] < 0 ? &xv(f, 0) : &xfb(f, 0);
336 P(i) = 1. / sqrt(
domaine.dot(xf, xf, &xp(e, 0), &xp(e, 0)));
340 for (
int d = 0; d < D; d++)
346 for (
int i = 0; i < nc; i++)
349 if (std::fabs(fs(f)) < 1e-20)
continue;
351 xf = db < 0 ? &xv(f, 0) : &xfb(f, 0);
354 for (
int j = 0; j < D; j++)
355 for (
int k = 0; k <= D; k++, jb++)
357 fac = (db < 0 ? nf(f, j) / fs(f) : (db == j)) * (k < D ? xf[k] - xp(e, k) : 1);
358 A(i, jb) = fac * P(i);
360 B(jb) -= fac * ve2(i, d);
365 int nw = -1, rank=-1;
367 F77NAME(dgelsy)(&nl, &nc, &un, &A(0, 0), &nl, &B(0), &nc, &pvt(0), &eps, &rank, &W(0), &nw, &infoo);
369 W.
resize(nw = (
int) std::lrint(W(0)));
371 F77NAME(dgelsy)(&nl, &nc, &un, &A(0, 0), &nl, &B(0), &nc, &pvt(0), &eps, &rank, &W(0), &nw, &infoo);
375 for (
int i = 0; i < nc; i++)
376 ve2(i, d) += P(i) * B(i);
380 Matrice33 M(1, 0, 0, 0, 1, 0, 0, 0, 1), iM;
382 for (
int i = 0; i < nc; i++)
383 if (i_v[i][1] >= 0 &&
fcl_(i_v[i][0], 0) < 2)
384 for (
int j = 0; j < D; j++)
385 M(j, i_v[i][1]) -= ve2(i, j);
390 for (
int i = 0; i < nc; i++)
391 for (
int j = 0; j < D; j++)
394 for (
int k = 0; k < D; k++)
395 ve2i(i, j) += iM(j, k) * ve2(i, k);
399 for (
int d = 0; d < D; d++,
ve2d.append_line(
ve2c.size(),
ve2bc.size()))
400 for (
int i = 0; i < nc; i++)
401 if (std::fabs(ve2i(i, d)) > 1e-6 && (i_v[i][1] < 0 ||
fcl_(i_v[i][0], 0) == 3))
403 i_v[i][1] < 0 ?
ve2j.append_line(i_v[i][0]) :
ve2bj.append_line(i_v[i][0], i_v[i][1]);
404 (i_v[i][1] < 0 ? &
ve2c : &
ve2bc)->append_line(ve2i(i, d) * pf(i_v[i][0]) / pe(e));
437 int ed = 0, i = nf_tot;
439 for (
int e = 0 ; e <
domaine.nb_elem(); e++)
440 for (
int d = 0; d < D; d++, ed++, i++)
441 for (
int n = 0; n < N; n++)
446 for (
int j =
ve2d(ed, 0); j <
ve2d(ed + 1, 0); j++)
447 val(i, n) +=
ve2c(j) * val(
ve2j(j), n);
451 for (
int j =
ve2d(ed, 1); j <
ve2d(ed + 1, 1); j++)
464 return valeur_aux_elems_(
le_champ().
valeurs(), positions, les_polys, val_elem);
472 return valeur_aux_elems_(
le_champ().
passe(), positions, les_polys, val_elem);
475DoubleTab& Champ_Face_PolyMAC_MPFA::valeur_aux_elems_(
const DoubleTab& val_face,
const DoubleTab& positions,
const IntVect& les_polys, DoubleTab& val_elem)
const
482 if (val_elem.
nb_dim() > 2)
483 Process::exit(
"TRUST error in Champ_Face_PolyMAC_MPFA::valeur_aux_elems_ : The DoubleTab val has more than 2 entries !");
486 Process::exit(
"TRUST error in Champ_Face_PolyMAC_MPFA::valeur_aux_elems_ : A scalar field cannot be of Champ_Face type !");
488 for (
int p = 0, e; p < les_polys.
size(); p++)
489 for (e = les_polys(p), d = 0; e < domaine.nb_elem() && d < D; d++)
490 for (n = 0; n < N; n++)
491 val_elem(p, N * d + n) = val_face(nf_tot + D * e + d, n);
505 for (
int p = 0, e; p < polys.
size(); p++)
506 val(p) = (e = polys(p)) < 0 ? 0. : vfe.
addr()[N * (nf_tot + D * e) + ncomp];
513 assert(distant == 0);
521 const IntTab& face_voisins =
domaine.face_voisins();
522 const DoubleTab& val =
valeurs(t);
524 for (
int i = 0; i < fr_vf.
nb_faces(); i++)
527 for (
int d = 0; d < dim; d++)
528 x(i, d) = val(vectoriel ? nf_tot + ne_tot * d + elem : face);
virtual DoubleTab & valeur_aux_elems_(const DoubleTab &val_face, const DoubleTab &positions, const IntVect &les_polys, DoubleTab &valeurs) const
virtual Champ_base & le_champ()
: class Champ_Face_PolyMAC_HFV
DoubleTab & trace(const Frontiere_dis_base &, DoubleTab &, double, int distant) const override
Calcule la trace d'un champ sur une frontiere au temps tps.
: class Champ_Face_PolyMAC_MPFA
Champ_base & affecter_(const Champ_base &) override
const Domaine_PolyMAC_MPFA & domaine_PolyMAC_MPFA() const
DoubleTab & trace(const Frontiere_dis_base &, DoubleTab &, double, int distant) const override
Calcule la trace d'un champ sur une frontiere au temps tps.
DoubleTab & valeur_aux_elems_passe(const DoubleTab &positions, const IntVect &polys, DoubleTab &result) const override
int fixer_nb_valeurs_nodales(int n) override
DoubleVect & valeur_aux_elems_compo(const DoubleTab &positions, const IntVect &polys, DoubleVect &result, int ncomp) const override
provoque une erreur ! doit etre surchargee par les classes derivees
DoubleTab & valeur_aux_elems(const DoubleTab &positions, const IntVect &polys, DoubleTab &result) const override
provoque une erreur ! doit etre surchargee par les classes derivees
void init_auxiliary_variables() override
void update_ve(DoubleTab &val) const
Interpolates face-based velocity to element centers using a first-order method.
void init_ve2() const
Initializes second-order interpolation coefficients from faces to element centers.
int reprendre(Entree &fich) override
Reprise d'un Objet_U sur un flot d'entree Methode a surcharger.
void update_ve2(DoubleTab &val, int incr=0) const
Applies the second-order interpolation from face velocities to element centers.
classe Champ_Fonc_reprise Cette classe permet de relire un champ sauvegarde dans un fichier xyz
const Domaine & domaine() const
virtual void creer_tableau_distribue(const MD_Vector &, RESIZE_OPTIONS=RESIZE_OPTIONS::COPY_INIT)
DoubleTab & futur(int i=1) override
Renvoie les valeurs du champs a l'instant t+i.
DoubleTab & passe(int i=1) override
Renvoie les valeurs du champs a l'instant t-i.
virtual int nb_valeurs_temporelles() const
Renvoie le nombre de valeurs temporelles actuellement conservees.
const Domaine_Cl_dis_base & domaine_Cl_dis() const
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
int reprendre(Entree &) override
Lecture d'un champ inconnue a partir d'un flot d'entree en vue d'une reprise.
bool via_ch_fonc_reprise() const
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
virtual DoubleVect & valeur_aux_elems_compo(const DoubleTab &positions, const IntVect &les_polys, DoubleVect &valeurs, int ncomp) const
provoque une erreur ! doit etre surchargee par les classes derivees
virtual DoubleTab & valeur_aux(const DoubleTab &positions, DoubleTab &valeurs) const
Provoque une erreur ! Doit etre surchargee par les classes derivees.
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
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.
int nb_faces_tot() const
renvoie le nombre total de faces.
Class defining operators and methods for all reading operation in an input flow (file,...
virtual const Milieu_base & milieu() const =0
const Nom & le_nom() const override
Renvoie le nom du champ.
virtual int nb_comp() const
int num_premiere_face() const
classe Frontiere_dis_base Classe representant une frontiere discretisee.
: Cette classe est un OWN_PTR mais l'objet pointe est partage entre plusieurs
static double inverse(const Matrice33 &m, Matrice33 &resu, int exit_on_error=1)
calcul de l'inverse.
DoubleVect & porosite_elem()
DoubleVect & porosite_face()
int mon_equation_non_nul() const
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
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.
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.
void set_md_vector(const MD_Vector &) override
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension_tot(int) const override
void resize_dim0(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const
_SIZE_ size_totale() const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")