16#include <Corrige_flux_FT_temperature_conv.h>
18#include <Probleme_FTD_IJK.h>
19#include <IJK_Navier_Stokes_tools.h>
20#include <Intersection_Interface_ijk.h>
39 const Domaine_IJK& splitting,
const IJK_Field_double& field,
59 ArrOfDouble temp_vap, temp_liqu;
91 const double velocity)
const
94 const double dminfloat = std::pow(10.,-15.);
95 const double dx_squared_over_8 = 0.1;
96 const double curv0 = Tip1 - 2* Ti + Tim1;
97 const double curv1 = Tip2 - 2* Tip1 + Ti;
98 double delta0 = std::max(Tip1, Tim1) - std::min(Tip1, Tim1);
99 double delta1 = std::max(Tip2, Ti) - std::min(Tip2, Ti);
101 if (std::abs(delta0) < dminfloat)
107 fram0 = std::pow((Ti - std::min(Tip1, Tim1)) / delta0 * 2. - 1., 3.);
108 fram0 = std::min(fram0, 1.);
110 if (std::abs(delta1) < dminfloat)
116 fram1 = std::pow((Tip1 - std::min(Tip2, Ti)) / delta1 * 2. - 1., 3.);
117 fram1 = std::min(fram1, 1.);
120 const double fram = std::max(fram0, fram1);
121 const double curv = velocity < 0. ? curv1 : curv0;
122 const double T_amont = velocity < 0. ? Ti : Tip1;
123 double T_interp = (Ti + Tip1) * 0.5 - dx_squared_over_8 * curv;
124 T_interp = (1. - fram) * T_interp + fram * T_amont;
130 const double frac_liquide,
132 IJK_Field_local_double *
const flux
138 const double velocity = ref_ijk_ft_->eq_ns().get_velocity(
139 )[
parcours_.face()](elem_i[0], elem_i[1], elem_i[2]);
146 if (le_flux_est_juste_aval_interface)
154 (*flux)(elem_i[0], elem_i[1], 0) = T_interp *
rho_cp_(frac_liquide) * s_face * velocity;
164 const double frac_liquide,
165 const double decal)
const
168 const int& i = elem[0];
169 const int& j = elem[1];
170 const int& k = elem[2];
171 const auto i_diph = (*intersection_ijk_cell_)(i,j,k);
178 const double d = 0.5 * domaine_->get_constant_delta(
parcours_.face());
186 const double lda = frac_liquide *
lda_l_ + (1.-frac_liquide) *
lda_v_;
192 const double frac_liquide,
193 const double decal)
const
196 const bool is_temp_liquide = std::abs(frac_liquide - 1.) < EPS_;
198 const auto elem_im1 =
parcours_.elem(-1);
210 const double T_interp =
quick(
220 const double frac_liquide,
221 IJK_Field_local_double *
const flux
225 const double rho_cp_face =
rho_cp_(frac_liquide);
227 (*flux)(elem[0], elem[1], 0) *= rho_cp_face;
233 const bool from_liqu_phase)
const
235 const int& i = elem[0];
236 const int& j = elem[1];
237 const int& k = elem[2];
238 const IJK_Field_double& indic = ref_ijk_ft_->get_interface().I();
239 const bool cell_is_diph = (indic(i,j,k) * (1. - indic(i,j,k)) > DMINFLOAT);
242 const int i_diph = (*intersection_ijk_cell_)(i,j,k);
252 IJK_Field_local_double *
const flux,
257 assert((dir >= 0) && (dir < 3));
260 const auto& surfaces = interfaces_->get_surface_vapeur_par_face();
261 const double s_face =
parcours_.calculer_surface_face(domaine_.valeur());
263 const int ni =
field_->ni();
264 const int nj =
field_->nj();
265 for (
int i = 0; i < ni; i++)
266 for (
int j = 0; j < nj; j++)
270 const double s_vap = surfaces[dir](i, j, k_layer);
271 const double frac_vapeur = s_vap / s_face;
272 const double frac_liquide = 1.- frac_vapeur;
294 const double frac_liquide,
296 IJK_Field_local_double *
const flux)
const
306 const double velocity = ref_ijk_ft_->eq_ns().get_velocity()[dir](i, j, k_layer);
307 const int i_diph = (*intersection_ijk_face_)(i, j, k_layer, dir);
316 const double ldal =
lda_l_;
317 const double ldav =
lda_v_;
318 const double dist = 1.52 * std::pow((
319 std::pow(domaine_->get_constant_delta(0), 2.) +
320 std::pow(domaine_->get_constant_delta(1), 2.) +
321 std::pow(domaine_->get_constant_delta(2), 2.)), 0.5);
329 temp_liqu, temp_vap, coo_liqu1, coo_vap1);
333 const IJK_Field_double& temperature,
const double ldal,
const double ldav,
334 const double dist,
const DoubleTab& positions,
const DoubleTab& normal_on_interf,
335 ArrOfDouble& temperature_interp,
336 ArrOfDouble& flux_normal_interp,
337 ArrOfDouble& temp_liqu,
338 ArrOfDouble& temp_vap,
340 DoubleTab& coo_vap)
const
343 positions, normal_on_interf, dist, coo_liqu);
345 positions, normal_on_interf, -dist, coo_vap);
349 ijk_interpolate_skip_unknown_points(temperature, coo_liqu, temp_liqu, 1.e31);
351 ijk_interpolate_skip_unknown_points(temperature, coo_vap, temp_vap, 1.e31);
352 const int n_point_interp = positions.
dimension(0);
355 if ((ldal + ldav) == 0.)
357 Cerr <<
"Corrige flux used with no conductivity. Ti and Qi set to 0. " << finl;
358 temperature_interp = 0.;
359 flux_normal_interp = 0.;
362 for (
int i_point_interp = 0; i_point_interp < n_point_interp; i_point_interp++)
365 (temp_liqu(i_point_interp) * ldal + temp_vap(i_point_interp) * ldav) / (ldal + ldav);
373 if (temp_liqu(i_point_interp) > 1.e9)
375 Cerr <<
"Problem temperature interface" << finl;
376 temp_liqu(i_point_interp) = 1.e9;
378 temperature_interp(i_point_interp) = Ti;
379 flux_normal_interp(i_point_interp) = ldav * (Ti - temp_vap(i_point_interp)) / dist;
386 const int n_point_interp = temp_vap.
size_array();
387 Cerr <<
"N diph " << n_diph <<
"n point inter = 2*n_diph " << n_point_interp << finl;
388 assert(2*n_diph == n_point_interp);
389 const double d1 = 1.52 * std::pow((
390 std::pow(domaine_->get_constant_delta(0), 2.) +
391 std::pow(domaine_->get_constant_delta(1), 2.) +
392 std::pow(domaine_->get_constant_delta(2), 2.)), 0.5);
398 for (
int i_diph = 0; i_diph < n_diph; i_diph++)
401 const double di_liq = di_vap;
402 assert(d1 - di_vap > 0.);
407 const double d1_vap_inv = 1. / (d1 - di_vap + EPS_);
408 const double di_vap_inv = 1. / (di_vap + EPS_);
409 const double d1_liq_inv = 1. / (d1 - di_liq + EPS_);
410 const double di_liq_inv = 1. / (di_liq+ EPS_);
413 (di_vap_inv + d1_vap_inv);
417 (di_liq_inv + d1_liq_inv);
423 const double ldal =
lda_l_;
424 const double ldav =
lda_v_;
425 const double dist = 1.52 * std::pow((
426 std::pow(domaine_->get_constant_delta(0), 2.) +
427 std::pow(domaine_->get_constant_delta(1), 2.) +
428 std::pow(domaine_->get_constant_delta(2), 2.)), 0.5);
429 DoubleTab coord_vap, coord_liqu;
433 temp_vap, coord_liqu, coord_vap);
440 const double ldal =
lda_l_;
441 const double ldav =
lda_v_;
448 for (
int i_diph = 0; i_diph < n_diph; i_diph++)
: class Corrige_flux_FT API pour modifier un champ de flux à partir de donnees à l'interface....
Intersection_Interface_ijk_cell * intersection_ijk_cell_
Intersection_Interface_ijk_face * intersection_ijk_face_
virtual void initialize(const Domaine_IJK &dom, const IJK_Field_double &field, const IJK_Interfaces &interfaces, const Probleme_FTD_IJK_base &ijk_ft, Intersection_Interface_ijk_face &intersection_ijk_face, Intersection_Interface_ijk_cell &intersection_ijk_cell)
const IJK_Field_double * field_
const double & get_ghost_temp_if_cell_is_diph(const FixedVector< int, 3 > &elem, const bool from_liqu_phase) const
ArrOfDouble q_interface_face_
void corrige_flux_faceIJ(IJK_Field_local_double *const flux, const int k_layer, const int dir) override
double interpolation_quick_avec_1_ghost(const double frac_liquide, const double decal) const
ArrOfDouble temp_interface_face_
void update_temperature_ghost(const ArrOfDouble &temp_vap, const ArrOfDouble &temp_liqu)
double quick(const double Tim1, const double Ti, const double Tip1, const double Tip2, const double velocity) const
void calcul_temp_flux_interf_pour_bary_face(ArrOfDouble &temp_vap, ArrOfDouble &temp_liqu)
ArrOfDouble q_interface_cell_
ArrOfDouble temp_interface_cell_
void multiplie_par_rho_cp_de_la_face_monophasique(const double frac_liquide, IJK_Field_local_double *const flux) const
double extrapolation_amont_1_depuis_l_interface(const double frac_liquide, const double decal) const
DoubleTab temperature_barys_
void interp_back_to_bary_faces(const ArrOfDouble &temp_vap, const ArrOfDouble &temp_liqu)
void calcul_temperature_flux_interface(const IJK_Field_double &temperature, const double ldal, const double ldav, const double dist, const DoubleTab &positions, const DoubleTab &normale, ArrOfDouble &temperature_interp, ArrOfDouble &flux_normal_interp, ArrOfDouble &temp_liqu, ArrOfDouble &temp_vap, DoubleTab &coo_liqu, DoubleTab &coo_vap) const override
bool is_flux_upwind_from_interface(const double decal) const
void calcul_temp_flux_interf_pour_bary_cell(ArrOfDouble &temp_vap, ArrOfDouble &temp_liqu)
DoubleTab temperature_ghost_
void initialize(const Domaine_IJK &splitting, const IJK_Field_double &field, const IJK_Interfaces &interfaces, const Probleme_FTD_IJK_base &ijk_ft, Intersection_Interface_ijk_face &intersection_ijk_face, Intersection_Interface_ijk_cell &intersection_ijk_cell) override
void remplace_flux_par_somme_rhocpf_Tf_v_Sf(const double frac_liquide, const double s_face, IJK_Field_local_double *const flux) const
void remplace_flux_par_quick_ghost_amont_1(const double frac_liquide, const double s_face, IJK_Field_local_double *const flux) const
This class encapsulates all the information related to the eulerian mesh for TrioIJK.
Class defining operators and methods for all reading operation in an input flow (file,...
static Vecteur3 get_position_interpolation_normal_interf(const Vecteur3 &position_on_interf, const Vecteur3 &normal_on_interf, const double dist)
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 de base des flux de sortie.
_SIZE_ size_array() const
void resize_array(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
void resize(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const
static double produit_scalaire(const Vecteur3 &x, const Vecteur3 &y)