16#ifndef Iterateur_VDF_Elem_Multiphase_Parietal_TPP_included
17#define Iterateur_VDF_Elem_Multiphase_Parietal_TPP_included
19#include <Source_Flux_interfacial_base.h>
20#include <Flux_parietal_base.h>
21#include <Milieu_composite.h>
22#include <Pb_Multiphase.h>
24template<
class _TYPE_>
template<
typename Type_Double,
typename BC>
25void Iterateur_VDF_Elem<_TYPE_>::ajouter_blocs_bords_flux_parietal_(
const BC& cl,
const int ndeb,
const int nfin,
const int N,
26 const DoubleTab& donnee, DoubleTab& resu,
Matrice_Morse *mat, VectorDeriv& d_cc,
const tabs_t& semi_impl)
const
31 constexpr bool is_Temp_impose_flux_parietal = std::is_same<BC, Scalaire_impose_paroi>::value,
32 is_Neumann_flux_parietal = std::is_same<BC, Neumann_paroi>::value,
33 is_paroi_contact_flux_parietal = std::is_same<BC, Echange_global_impose>::value;
51 DoubleTrav qpk(N), dTp_qpk(N), dTf_qpk(N, N), qpi(N, N), dTp_qpi(N, N), dTf_qpi(N, N, N), d_nuc(N);
59 if (is_Neumann_flux_parietal)
67 DoubleTrav pvit_elem(0, N * dimension);
68 le_dom->domaine().creer_tableau_elements(pvit_elem);
75 DoubleTab *pqpi = sss ? &(sss->
qpi()) : nullptr;
76 DoubleTab *pdTf_qpi = sss ? &(sss->
dT_qpi()) : nullptr;
84 DoubleTrav Ts_tab, Sigma_tab, Lvap_tab;
88 const int nbelem_tot = le_dom->nb_elem_tot(), nb_max_sat = N * (N - 1) / 2;
89 Ts_tab.
resize(nbelem_tot, nb_max_sat), Sigma_tab.
resize(nbelem_tot, nb_max_sat), Lvap_tab.
resize(nbelem_tot, nb_max_sat);
91 for (
int k = 0; k < N; k++)
92 for (
int l = k + 1; l < N; l++)
96 const int ind_trav = (k * (N - 1) - (k - 1) * (k) / 2) + (l - k - 1);
97 assert(press.line_size() == 1);
103 for (
int ii = 0; ii < nbelem_tot; ii++)
105 Ts_tab(ii, ind_trav) = tsat(ii);
106 Sigma_tab(ii, ind_trav) = sig(ii);
109 z_sat.
Lvap(press.get_span_tot() , Lvap_tab.
get_span_tot(), nb_max_sat, ind_trav);
110 z_sat.
Tsat(press.get_span_tot() , Ts_tab.
get_span_tot(), nb_max_sat, ind_trav);
114 DoubleTrav Tf(N), nv(N);
115 for (
int face = ndeb; face < nfin; face++)
125 const int e = elem(face, 0) > -1 ? elem(face, 0) : elem(face, 1);
127 const double y = elem(face, 0) > -1 ? le_dom->dist_face_elem0(face, e) : le_dom->dist_face_elem1(face, e);
135 in.
alpha = &alpha(e, 0);
137 in.
lambda = &lambda(e, 0);
141 in.
T = &donnee(e, 0);
146 in.
Lvap = &Lvap_tab(e, 0);
147 in.
Sigma = &Sigma_tab(e, 0);
148 in.
Tsat = &Ts_tab(e, 0);
159 for (
int n = 0; n < N; n++)
160 nv(n) += std::pow(pvit_elem(e, N * d + n), 2);
162 for (
int n = 0; n < N; n++)
163 nv(n) = std::sqrt(nv(n));
166 if (is_Temp_impose_flux_parietal)
173 for (
int k = 0; k < N; k++)
174 for (
int l = 0; l < N; l++)
175 (*pqpi)(e, k, l) += qpi(k, l) * fs(face);
177 if ((pdTf_qpi) && (mat))
178 for (
int k = 0; k < N; k++)
179 for (
int l = 0; l < N; l++)
180 for (
int m = 0; m < N; m++)
181 (*pdTf_qpi)(e, k, l, m) += dTf_qpi(k, l, m) * fs(face);
183 for (
int k = 0; k < N; k++)
184 flux[k] = (elem(face, 0) != -1) ? qpk(k) * fs(face) * pf(face) : -qpk(k) * fs(face) * pf(face);
186 fill_flux_tables_(face, N, 1.0, flux, resu);
189 for (
int k = 0; k < N; k++)
190 for (
int l = 0; l < N; l++)
191 (*mat)(e * N + k, e * N + l) += dTf_qpk(k, l) * fs(face) * pf(face);
194 if (is_paroi_contact_flux_parietal)
196 Process::exit(que_suis_je() +
" : paroi_contact with flux parietal is not yet coded ! Change to PolyMAC_MPFA or call the 911. ");
198 if (!cl.que_suis_je().debute_par(
"Paroi_Echange_contact"))
199 Process::exit(que_suis_je() +
" : in pb_multiphase there is no echange contact with a wall heat flux correlation : choisis ton camp camarade !");
201 else if (is_Neumann_flux_parietal)
204 in.
Tp = donnee(e, 0);
206 double flux_imp = ref_cast(
Neumann, cl).flux_impose(face - ndeb);
207 double flux_cor = 0., dTp_flux_cor = 0.;
210 for (it = 0; !cv && it < 100; it++)
225 for (
int k = 0; k < N; k++)
228 dTp_flux_cor += dTp_qpk(k);
231 for (
int k = 0; k < N; k++)
232 for (
int l = 0; l < N; l++)
234 flux_cor += qpi(k, l);
235 dTp_flux_cor += dTp_qpi(k, l);
238 in.
Tp = in.
Tp - (flux_cor - flux_imp) / dTp_flux_cor;
239 cv = (std::abs(flux_cor - flux_imp) < 1.e-5);
244 std::string message_erreur =
"Non-convergence des Tefs !!!";
245 message_erreur.append(
"\n Tp init = ");
246 message_erreur.append(std::to_string( donnee(e, 0)));
247 message_erreur.append(
"\n T fluide = ");
248 for (
int k = 0; k < N; k++)
250 message_erreur.append(std::to_string(donnee(e, k)));
251 message_erreur.append(
" ");
253 message_erreur.append(
"\n Phi cible = ");
254 message_erreur.append(std::to_string(flux_imp));
255 message_erreur.append(
"\n Phi cor = ");
256 message_erreur.append(std::to_string(flux_cor));
261 for (
int k = 0; k < N; k++)
262 for (
int l = 0; l < N; l++)
263 (*pqpi)(e, k, l) += qpi(k, l) * fs(face);
265 if ((pdTf_qpi) && (mat))
266 for (
int k = 0; k < N; k++)
267 for (
int l = 0; l < N; l++)
268 for (
int m = 0; m < N; m++)
269 (*pdTf_qpi)(e, k, l, m) += dTf_qpi(k, l, m) * fs(face);
271 for (
int k = 0; k < N; k++)
272 flux[k] = (elem(face, 0) != -1) ? qpk(k) * fs(face) : -qpk(k) * fs(face);
274 fill_flux_tables_(face, N, 1.0, flux, resu);
277 for (
int k = 0; k < N; k++)
278 for (
int l = 0; l < N; l++)
279 (*mat)(e * N + k, e * N + l) += dTf_qpk(k, l) * fs(face) * pf(face);
class Champ_Face_VDF Cette classe sert a representer un champ vectoriel dont on ne calcule
virtual DoubleTab & get_elem_vector_field(DoubleTab &, bool passe=false) const
DoubleTab & passe(int i=1) override
Renvoie les valeurs du champs a l'instant t-i.
virtual DoubleTab & passe(int i=1)
virtual const Milieu_base & milieu() const =0
Sources & sources()
Renvoie les termes sources asssocies a l'equation.
virtual const Champ_Inc_base & inconnue() const =0
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
classe Fluide_base Cette classe represente un d'un fluide incompressible ainsi que
classe Flux_parietal_base correlations de flux parietal de la forme
virtual int needs_saturation() const
virtual void qp(const input_t &input, output_t &output) const =0
DoubleTab & get_sigma_tab()
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
virtual const Equation_base & equation(const std::string &nom_inc) const
virtual const Champ_Don_base & capacite_calorifique() const
Renvoie la capacite calorifique du milieu.
virtual const Champ_Don_base & conductivite() const
Renvoie la conductivite du milieu.
virtual const Champ_base & masse_volumique() const
Renvoie la masse volumique du milieu.
DoubleTab & diametre_hydraulique_elem()
DoubleVect & porosite_face()
Classe Milieu_composite Cette classe represente un fluide reel ainsi que.
bool has_saturation(int k, int l) const
Saturation_base & get_saturation(int k, int l) const
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Classe Neumann Cette classe est la classe de base de la hierarchie des conditions aux limites de type...
classe Pb_Multiphase Cette classe represente un probleme de thermohydraulique multiphase de type "3*N...
virtual Equation_base & equation_qdm()
const Equation_base & equation(int) const override
Renvoie l'equation d'hydraulique de type Navier_Stokes_std si i=0 Renvoie l'equation de la thermique ...
virtual Equation_base & equation_masse()
virtual const Milieu_base & milieu() const
Renvoie le milieu physique associe au probleme.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
classe QDM_Multiphase Cette classe porte les termes de l'equation de la dynamique
void Tsat(const SpanD P, SpanD res, int ncomp=1, int ind=0) const
DoubleTab & get_Tsat_tab()
void Lvap(const SpanD P, SpanD res, int ncomp=1, int ind=0) const
classe Scalaire_impose_paroi Impose un scalaire a la paroi dans une equation de type Convection-Difus...
Classe Source_Flux_interfacial_base.
DoubleTab & dT_qpi() const
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Span_ get_span_tot() override