16#include <Operateur_IJK_elem_diff_base.h>
17#include <IJK_Navier_Stokes_tools_cut_cell.h>
45 corrige_flux_ =
nullptr;
71 Cerr <<
"Error in Operateur_IJK_elem_diff_base_double::get_model: wrong direction..." << finl;
84 IJK_Field_double& result,
85 const IJK_Field_local_double& boundary_flux_kmin,
86 const IJK_Field_local_double& boundary_flux_kmax)
102 IJK_Field_double& result,
103 const IJK_Field_local_double& boundary_flux_kmin,
104 const IJK_Field_local_double& boundary_flux_kmax)
146void OpDiffUniformIJKScalarCorrection_double::correct_flux(IJK_Field_local_double *
const flux,
const int k_layer,
const int dir)
148 corrige_flux_->valeur().corrige_flux_diff_faceIJ(flux, k_layer, dir);
151void OpDiffUniformIJKScalarCorrection_double::correct_flux_spherical(Simd_double& a, Simd_double& b,
const int& i,
const int& j,
int k_layer,
int dir)
153 corrige_flux_->valeur().correct_flux_spherical(a, b, i, j, k_layer, dir);
168void OpDiffIJKScalar_cut_cell_double::correct_flux(IJK_Field_local_double *
const flux,
int k_layer,
const int dir)
172 correct_flux_<DIRECTION::X>(flux, k_layer);
176 correct_flux_<DIRECTION::Y>(flux, k_layer);
180 correct_flux_<DIRECTION::Z>(flux, k_layer);
184 Cerr <<
"Unexpected value of dir in OpDiffIJKScalar_cut_cell_double::correct_flux" << finl;
191 assert((*cut_cell_flux_)[dir].verify_consistency_within_layer(dir, k_layer, *flux));
197 Cut_field_vector3_double& cut_field_current_fluxes =
static_cast<Cut_field_vector3_double&
>(*current_fluxes_);
198 Cut_field_vector3_double& cut_field_RK3_F_fluxes =
static_cast<Cut_field_vector3_double&
>(*RK3_F_fluxes_);
202 const Cut_cell_FT_Disc& cut_cell_disc = (*cut_cell_flux_)[0].get_cut_cell_disc();
205 int ni = (dir == 0) ? flux->
ni() : flux->
ni() - 1;
206 int nj = (dir == 1) ? flux->
nj() : flux->
nj() - 1;
207 for (
int j = 0; j < nj; j++)
209 for (
int i = 0; i < ni; i++)
211 cut_field_current_fluxes[dir].pure_(i,j,k_layer) = (*flux)(i,j,0);
212 int n = cut_cell_disc.
get_n(i, j, k_layer);
215 cut_field_current_fluxes[dir].diph_l_(n) = (*cut_cell_flux_)[dir].diph_l_(n);
216 cut_field_current_fluxes[dir].diph_v_(n) = (*cut_cell_flux_)[dir].diph_v_(n);
223 int ni = (dir == 0) ? flux->
ni() : flux->
ni() - 1;
224 int nj = (dir == 1) ? flux->
nj() : flux->
nj() - 1;
225 for (
int j = 0; j < nj; j++)
227 for (
int i = 0; i < ni; i++)
229 int n = cut_cell_disc.
get_n(i, j, k_layer);
233 double indicatrice_surface = indicatrice_surfacique(n,dir);
235 cut_field_RK3_F_fluxes[dir].diph_l_(n) = cut_field_RK3_F_fluxes[dir].diph_l_(n)*indicatrice_surface;
236 cut_field_RK3_F_fluxes[dir].diph_v_(n) = cut_field_RK3_F_fluxes[dir].diph_v_(n)*(1 -indicatrice_surface);
242 runge_kutta3_update_surfacic_fluxes(cut_field_current_fluxes[dir], cut_field_RK3_F_fluxes[dir],
rk_step_, k_layer, dir,
dt_tot_, *cellule_rk_restreint_diff_main_);
245 int ni = (dir == 0) ? flux->
ni() : flux->
ni() - 1;
246 int nj = (dir == 1) ? flux->
nj() : flux->
nj() - 1;
247 for (
int j = 0; j < nj; j++)
249 for (
int i = 0; i < ni; i++)
251 (*flux)(i,j,0) = cut_field_current_fluxes[dir].pure_(i,j,k_layer);
252 int n = cut_cell_disc.
get_n(i, j, k_layer);
255 (*cut_cell_flux_)[dir].diph_l_(n) = cut_field_current_fluxes[dir].diph_l_(n);
256 (*cut_cell_flux_)[dir].diph_v_(n) = cut_field_current_fluxes[dir].diph_v_(n);
263 int ni = (dir == 0) ? flux->
ni() : flux->
ni() - 1;
264 int nj = (dir == 1) ? flux->
nj() : flux->
nj() - 1;
265 for (
int j = 0; j < nj; j++)
267 for (
int i = 0; i < ni; i++)
269 int n = cut_cell_disc.
get_n(i, j, k_layer);
273 double indicatrice_surface = indicatrice_surfacique(n,dir);
275 cut_field_RK3_F_fluxes[dir].diph_l_(n) = (indicatrice_surface == 0.) ? 0. : cut_field_RK3_F_fluxes[dir].diph_l_(n)/indicatrice_surface;
276 cut_field_RK3_F_fluxes[dir].diph_v_(n) = ((1 - indicatrice_surface) == 0.) ? 0. : cut_field_RK3_F_fluxes[dir].diph_v_(n)/(1 -indicatrice_surface);
283 assert((*cut_cell_flux_)[dir].verify_consistency_within_layer(dir, k_layer, *flux));
287 const IJK_Field_local_double& flux_x,
288 const IJK_Field_local_double& flux_y,
289 const IJK_Field_local_double& flux_zmin,
290 const IJK_Field_local_double& flux_zmax,
291 IJK_Field_double& resu,
int k_layer,
bool add)
295 const Cut_cell_FT_Disc& cut_cell_disc = cut_cell_flux[0].get_cut_cell_disc();
297 Cut_field_double& cut_field_resu =
static_cast<Cut_field_double&
>(resu);
302 Int3 ijk = cut_cell_disc.
get_ijk(n);
312 if (type_boundary_flux != BOUNDARY_FLUX::NOT_DETERMINED_BY_BOUNDARY)
314 Cerr <<
"Le cas d'une cellule diphasique avec flux condition aux limites n'est pas traite" << finl;
319 for (
int phase = 0; phase < 2; phase++)
321 const DoubleTabFT_cut_cell& diph_flux_x = (phase == 0) ? cut_cell_flux[0].diph_v_ : cut_cell_flux[0].diph_l_;
322 const DoubleTabFT_cut_cell& diph_flux_y = (phase == 0) ? cut_cell_flux[1].diph_v_ : cut_cell_flux[1].diph_l_;
323 const DoubleTabFT_cut_cell& diph_flux_z = (phase == 0) ? cut_cell_flux[2].diph_v_ : cut_cell_flux[2].diph_l_;
324 DoubleTabFT_cut_cell& diph_resu = (phase == 0) ? cut_field_resu.
diph_v_ : cut_field_resu.
diph_l_;
326 int n_ip1 = cut_cell_disc.
get_n(i+1,j,k);
327 int n_jp1 = cut_cell_disc.
get_n(i,j+1,k);
328 int n_kp1 = cut_cell_disc.
get_n(i,j,k+1);
330 double fx_centre = diph_flux_x(n);
331 double fy_centre = diph_flux_y(n);
332 double fz_centre = diph_flux_z(n);
334 double fx_right = (n_ip1 < 0) ? (cut_cell_disc.
indic_pure(i+1,j,k) == phase)*flux_x(i+1,j,0) : diph_flux_x(n_ip1);
335 double fy_right = (n_jp1 < 0) ? (cut_cell_disc.
indic_pure(i,j+1,k) == phase)*flux_y(i,j+1,0) : diph_flux_y(n_jp1);
336 double fz_right = (n_kp1 < 0) ? (cut_cell_disc.
indic_pure(i,j,k+1) == phase)*flux_zmax(i,j,0) : diph_flux_z(n_kp1);
339 r += fx_centre - fx_right;
340 r += fy_centre - fy_right;
341 r += fz_centre - fz_right;
const Domaine_IJK & get_domaine() const
const IJK_Interfaces & get_interfaces() const
int get_n_from_k_index(int index) const
Int3 get_ijk(int n) const
int get_k_value_index(int k) const
double indic_pure(const int i, const int j, const int k) const
int get_n(int i, int j, int k) const
TRUSTTabFT_cut_cell< _TYPE_ > diph_l_
TRUSTTabFT_cut_cell< _TYPE_ > diph_v_
This class encapsulates all the information related to the eulerian mesh for TrioIJK.
bool within_ghost(int i, int j, int k, int negative_ghost_size, int positive_ghost_size) const
bool get_periodic_flag(int direction) const
Method returns true if periodic in this direction.
Class defining operators and methods for all reading operation in an input flow (file,...
const DoubleTabFT_cut_cell_vector3 & get_indicatrice_surfacique_efficace_face() const
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.
void compute_cut_cell_divergence(const FixedVector< Cut_cell_double, 3 > &cut_cell_flux, const IJK_Field_local_double &flux_x, const IJK_Field_local_double &flux_y, const IJK_Field_local_double &flux_zmin, const IJK_Field_local_double &flux_zmax, IJK_Field_double &resu, int k_layer, bool add)
const Cut_cell_FT_Disc * get_cut_cell_disc()
virtual void compute_add(IJK_Field_double &dx)
virtual void compute_set(IJK_Field_double &dx)
bool runge_kutta_flux_correction_
const IJK_Field_local_double * coeff_field_z_
virtual void ajouter(const IJK_Field_double &field, IJK_Field_double &result, const IJK_Field_local_double &boundary_flux_kmin, const IJK_Field_local_double &boundary_flux_kmax)
BOUNDARY_FLUX flux_determined_by_boundary_condition_(int k)
const IJK_Field_local_double * coeff_field_y_
const double * uniform_lambda_liquid_
const double * uniform_lambda_vapour_
const IJK_Field_local_double * coeff_field_x_
const IJK_Field_local_double * lambda_
const IJK_Field_local_double * indicatrice_
const IJK_Field_local_double * boundary_flux_kmin_
virtual void calculer(const IJK_Field_double &field, IJK_Field_double &result, const IJK_Field_local_double &boundary_flux_kmin, const IJK_Field_local_double &boundary_flux_kmax)
const double * uniform_lambda_
virtual void initialize(const Domaine_IJK &splitting) override
const IJK_Field_local_double & get_model(DIRECTION _DIR_)
const IJK_Field_double * input_field_
const IJK_Field_local_double * boundary_flux_kmax_
Operateur_IJK_data_channel channel_data_
Operateur_IJK_elem_diff_base_double()
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Classe de base des flux de sortie.