16#include <Cut_cell_diffusion_flux_interface.h>
17#include <Cut_cell_FT_Disc.h>
18#include <IJK_Thermal_base.h>
21#include <IJK_Navier_Stokes_tools.h>
22#include <IJK_Navier_Stokes_tools_cut_cell.h>
24void calculer_flux_interface_sur_facettes(METHODE_FLUX_INTERFACE methode_flux_interface,
28 DoubleTabFT& interfacial_temperature,
29 DoubleTabFT& interfacial_phin_ai,
30 const Cut_field_double& cut_field_temperature,
32void calculer_flux_interface_sur_maillage_ft(
bool next_time,
33 const DoubleTabFT& interfacial_phin_ai,
35 IJK_Field_double& flux_interface_ft);
37void ajout_flux_interface_a_divergence_simple(
int phase,
const DoubleTabFT_cut_cell_scalar& flux_interface_efficace, Cut_field_double& cut_field_d_field);
39void calcul_temperature_flux_interface(
bool next_time,
42 const Cut_field_double& cut_field,
46 DoubleTabFT& temperature_interp,
47 DoubleTabFT& flux_normal_interp);
48void calcul_velocity_flux_interface(
bool next_time,
52 const Cut_field_vector3_double& cut_field_velocity,
59void calculer_flux_interface_implementation(
bool next_time,
60 METHODE_FLUX_INTERFACE methode_flux_interface,
63 DoubleTabFT& interfacial_temperature,
64 DoubleTabFT& interfacial_phin_ai,
65 const Cut_field_double& cut_field_temperature,
67 IJK_Field_double& flux_interface_ft);
69void ajout_flux_interface_a_divergence_implementation(
int phase,
const DoubleTabFT_cut_cell_scalar& flux_interface_efficace, Cut_field_double& cut_field_d_field);
73void calculer_flux_interface_sur_facettes(METHODE_FLUX_INTERFACE methode_flux_interface,
77 DoubleTabFT& interfacial_temperature,
78 DoubleTabFT& interfacial_phin_ai,
79 const Cut_field_double& cut_field_temperature,
82 if (methode_flux_interface == METHODE_FLUX_INTERFACE::INTERP_PURE || methode_flux_interface == METHODE_FLUX_INTERFACE::INTERP_CUT_CELL
83 || methode_flux_interface == METHODE_FLUX_INTERFACE::INTERP_PURE_NO_JUMP || methode_flux_interface == METHODE_FLUX_INTERFACE::INTERP_CUT_CELL_NO_JUMP)
85 bool cut_cell = (methode_flux_interface == METHODE_FLUX_INTERFACE::INTERP_CUT_CELL || methode_flux_interface == METHODE_FLUX_INTERFACE::INTERP_CUT_CELL_NO_JUMP);
86 bool no_jump = (methode_flux_interface == METHODE_FLUX_INTERFACE::INTERP_PURE_NO_JUMP || methode_flux_interface == METHODE_FLUX_INTERFACE::INTERP_CUT_CELL_NO_JUMP);
102 calcul_temperature_flux_interface(next_time,
105 cut_field_temperature,
106 cut_cell_facettes_interpolation,
109 interfacial_temperature,
110 interfacial_phin_ai);
114 Cerr <<
"Methode non reconnue pour le calcul du flux a l'interface." << finl;
121 for (
int fa7 = 0; fa7 < nb_facettes; fa7++)
123 interfacial_phin_ai(fa7) *= surface_facettes(fa7);
124 interfacial_temperature(fa7) *= surface_facettes(fa7);
128void calculer_flux_interface_sur_maillage_ft(
bool next_time,
129 const DoubleTabFT& interfacial_phin_ai,
131 IJK_Field_double& flux_interface_ft)
138 const int ni = flux_interface_ft.
ni();
139 const int nj = flux_interface_ft.
nj();
140 const int nk = flux_interface_ft.
nk();
144 for (
int k = 0; k < nk; k++)
146 for (
int j = 0; j < nj; j++)
148 for (
int i = 0; i < ni; i++)
150 flux_interface_ft(i, j, k) = 0.;
158 const ArrOfInt& index_elem = intersec.
index_elem();
159 for (
int k = 0; k < nk; k++)
161 for (
int j = 0; j < nj; j++)
163 for (
int i = 0; i < ni; i++)
167 double somme_contrib = 0.;
170 int index = index_elem[num_elem];
181 flux_interface_ft(i,j,k) = somme_contrib;
192void calculer_flux_interface_efficace(
const IJK_Field_double& flux_interface_ns_old,
const IJK_Field_double& flux_interface_ns_next, DoubleTabFT_cut_cell_scalar& flux_interface_efficace)
199 for (
int n = 0; n < cut_cell_disc.
get_n_tot(); n++)
201 Int3 ijk = cut_cell_disc.
get_ijk(n);
209 flux_interface_efficace(n) = 0.;
213 assert(flux_interface_ns_old.
ghost() == flux_interface_ns_next.
ghost());
222 assert(old_surface_interface(i,j,k) != 0.);
223 flux_interface_efficace(n) = (flux_interface_ns_old(i,j,k)/old_surface_interface(i,j,k)) * surface_efficace_interface(n);
227 assert(next_surface_interface(i,j,k) != 0.);
228 flux_interface_efficace(n) = (flux_interface_ns_next(i,j,k)/next_surface_interface(i,j,k)) * surface_efficace_interface(n);
232 assert(old_surface_interface(i,j,k) != 0.);
233 assert(next_surface_interface(i,j,k) != 0.);
234 flux_interface_efficace(n) = .5 * (flux_interface_ns_old(i,j,k)/old_surface_interface(i,j,k) + flux_interface_ns_next(i,j,k)/next_surface_interface(i,j,k)) * surface_efficace_interface(n);
240void calculer_flux_interface_implementation(
bool next_time,
241 METHODE_FLUX_INTERFACE methode_flux_interface,
242 double lambda_liquid,
243 double lambda_vapour,
244 DoubleTabFT& interfacial_temperature,
245 DoubleTabFT& interfacial_phin_ai,
246 const Cut_field_double& cut_field_temperature,
248 IJK_Field_double& flux_interface_ft)
250 calculer_flux_interface_sur_facettes(methode_flux_interface, next_time, lambda_liquid, lambda_vapour, interfacial_temperature, interfacial_phin_ai, cut_field_temperature, cut_cell_facettes_interpolation);
252 calculer_flux_interface_sur_maillage_ft(next_time, interfacial_phin_ai, cut_field_temperature.
get_cut_cell_disc(), flux_interface_ft);
255void calculer_flux_interface_next(METHODE_FLUX_INTERFACE methode_flux_interface,
256 double lambda_liquid,
257 double lambda_vapour,
258 DoubleTabFT& interfacial_temperature,
259 DoubleTabFT& interfacial_phin_ai,
260 const Cut_field_double& cut_field_temperature,
262 IJK_Field_double& flux_interface_ft)
264 calculer_flux_interface_implementation(
true , methode_flux_interface, lambda_liquid, lambda_vapour, interfacial_temperature, interfacial_phin_ai, cut_field_temperature, cut_cell_facettes_interpolation, flux_interface_ft);
267void calculer_flux_interface_old(METHODE_FLUX_INTERFACE methode_flux_interface,
268 double lambda_liquid,
269 double lambda_vapour,
270 DoubleTabFT& interfacial_temperature,
271 DoubleTabFT& interfacial_phin_ai,
272 const Cut_field_double& cut_field_temperature,
274 IJK_Field_double& flux_interface_ft)
276 calculer_flux_interface_implementation(
false , methode_flux_interface, lambda_liquid, lambda_vapour, interfacial_temperature, interfacial_phin_ai, cut_field_temperature, cut_cell_facettes_interpolation, flux_interface_ft);
279void ajout_flux_interface_a_divergence(
const DoubleTabFT_cut_cell_scalar& flux_interface_efficace, Cut_field_double& cut_field_d_temperature)
281 for (
int phase = 0; phase < 2; phase++)
283 ajout_flux_interface_a_divergence_implementation(phase, flux_interface_efficace, cut_field_d_temperature);
287void ajout_flux_interface_a_divergence_implementation(
int phase,
const DoubleTabFT_cut_cell_scalar& flux_interface_efficace, Cut_field_double& cut_field_d_field)
289 ajout_flux_interface_a_divergence_simple(phase, flux_interface_efficace, cut_field_d_field);
292void ajout_flux_interface_a_divergence_simple(
int phase,
const DoubleTabFT_cut_cell_scalar& flux_interface_efficace, Cut_field_double& cut_field_d_field)
295 DoubleTabFT_cut_cell& diph_d_field = (phase == 0) ? cut_field_d_field.
diph_v_ : cut_field_d_field.diph_l_;
297 for (
int n = 0; n < cut_cell_disc.
get_n_loc(); n++)
299 int sign = (phase == 0) ? +1 : -1;
300 diph_d_field(n) += sign * flux_interface_efficace(n);
304void calcul_temperature_flux_interface(
308 const Cut_field_double& cut_field,
312 DoubleTabFT& temperature_interp,
313 DoubleTabFT& flux_normal_interp)
327 temperature_interp.
resize(nb_facettes);
328 flux_normal_interp.
resize(nb_facettes);
329 if ((ldal + ldav) == 0.)
331 Cerr <<
"Corrige flux used with no conductivity. Ti and Qi set to 0. " << finl;
332 temperature_interp = 0.;
333 flux_normal_interp = 0.;
336 for (
int fa7 = 0; fa7 < nb_facettes; fa7++)
346 Vecteur3 normal(normale_facettes, fa7);
351 T_1v = ijk_interpolate_skip_unknown_points(cut_field, coord_1v, 1.e31);
352 T_1l = ijk_interpolate_skip_unknown_points(cut_field, coord_1l, 1.e31);
354 if (number_of_interpolation_points > 1)
359 T_2v = ijk_interpolate_skip_unknown_points(cut_field, coord_2v, 1.e31);
360 T_2l = ijk_interpolate_skip_unknown_points(cut_field, coord_2l, 1.e31);
379 T_1l = field_0_liqu_1*interpolation_coefficient[1](fa7, 0) + field_1_liqu_1*interpolation_coefficient[1](fa7, 1) + field_2_liqu_1*interpolation_coefficient[1](fa7, 2) + field_3_liqu_1*interpolation_coefficient[1](fa7, 3);
380 T_1v = field_0_vap_1*interpolation_coefficient[0](fa7, 0) + field_1_vap_1*interpolation_coefficient[0](fa7, 1) + field_2_vap_1*interpolation_coefficient[0](fa7, 2) + field_3_vap_1*interpolation_coefficient[0](fa7, 3);
382 if (number_of_interpolation_points > 1)
393 T_2l = field_0_liqu_2*interpolation_coefficient[3](fa7, 0) + field_1_liqu_2*interpolation_coefficient[3](fa7, 1) + field_2_liqu_2*interpolation_coefficient[3](fa7, 2) + field_3_liqu_2*interpolation_coefficient[3](fa7, 3);
394 T_2v = field_0_vap_2*interpolation_coefficient[2](fa7, 0) + field_1_vap_2*interpolation_coefficient[2](fa7, 1) + field_2_vap_2*interpolation_coefficient[2](fa7, 2) + field_3_vap_2*interpolation_coefficient[2](fa7, 3);
406 if (number_of_interpolation_points == 1)
408 const double Ti = (T_1l * ldal + T_1v * ldav) / (ldal + ldav);
410 temperature_interp(fa7) = Ti;
411 flux_normal_interp(fa7) = ldav * (Ti - T_1v) / dist_1;
413 else if (number_of_interpolation_points == 2)
415 const double Ti = (ldal*T_1l/dist_1 + ldav*T_1v/dist_1 + ldal*T_2l/dist_2 + ldav*T_2v/dist_2 + ldal*(T_1l - T_2l)/(dist_2 - dist_1) - ldav*(T_2v - T_1v)/(dist_2 - dist_1))/(ldal/dist_1 + ldav/dist_1 + ldal/dist_2 + ldav/dist_2);
417 temperature_interp(fa7) = Ti;
418 flux_normal_interp(fa7) = - ldav * ((T_1v - Ti)/dist_1 + (T_2v - Ti)/dist_2 - (T_2v - T_1v)/(dist_2 - dist_1));
422 Cerr <<
"Nombre de points d'interpolation non reconnu." << finl;
428 if (number_of_interpolation_points == 1)
430 const double Ti = .5*(T_1l + T_1v);
432 temperature_interp(fa7) = Ti;
433 flux_normal_interp(fa7) = 2./(1./ldav + 1./ldal) * (Ti - T_1v) / dist_1;
437 Cerr <<
"Nombre de points d'interpolation non reconnu pour le cas 'no jump'." << finl;
const Domaine_IJK & get_domaine() const
const IJK_Interfaces & get_interfaces() const
Int3 get_ijk(int n) const
bool check_agreement_diph_pure_cellules_initialement_pures() const
const Cut_cell_FT_Disc & get_cut_cell_disc() const
bool check_agreement_tableau_pure_cellules_diphasiques(bool next_time) const
_TYPE_ & from_signed_independent_index(int signed_independent_index)
bool check_agreement_diph_pure_cellules_finalement_pures() const
TRUSTTabFT_cut_cell< _TYPE_ > diph_v_
bool within_ghost(int i, int j, int k, int negative_ghost_size, int positive_ghost_size) const
int convert_ijk_cell_to_packed(const FixedVector< int, 3 > ijk) const
Converts the ijk index of an element to a cell index.
int get_number_of_interpolation_points() const
const Maillage_FT_IJK & maillage_ft_ijk() const
double get_distance_interpolation_1() const
const FixedVector< IntTabFT, 4 > & get_signed_independent_index_next() const
const Maillage_FT_IJK & old_maillage_ft_ijk() const
double get_distance_interpolation_2() const
const FixedVector< DoubleTabFT, 4 > & get_coefficient_next() const
const FixedVector< DoubleTabFT, 4 > & get_coefficient_old() const
const FixedVector< IntTabFT, 4 > & get_signed_independent_index_old() const
void echange_espace_virtuel(int ghost)
Exchange data over "ghost" number of cells.
const IJK_Field_double & get_surface_interface_next() const
static int devient_diphasique(double old_indicatrice, double next_indicatrice)
const IJK_Field_double & I() const
static int devient_pure(double old_indicatrice, double next_indicatrice)
const IJK_Field_double & In() const
const IJK_Field_double & get_surface_interface_old() const
const Maillage_FT_IJK & old_maillage_ft_ijk() const
const Maillage_FT_IJK & maillage_ft_ijk() const
static int est_pure(double indicatrice)
const DoubleTabFT_cut_cell_scalar & get_surface_efficace_interface() const
static Vecteur3 get_position_interpolation_normal_interf(const Vecteur3 &position_on_interf, const Vecteur3 &normal_on_interf, const double dist)
double fraction_surface_intersection_
int index_facette_suivante_
: class Intersections_Elem_Facettes
const ArrOfInt & index_elem() const
Renvoie un tableau de taille domaine.
const Intersections_Elem_Facettes_Data & data_intersection(int index) const
Renvoie les donnees de l'intersection stockee a l'indice "index" dans le tableau "data" ( 0 <= index ...
int nb_facettes() const
renvoie le nombre de facettes (reelles et virtuelles) (egal a facettes().
virtual const DoubleTab & get_update_normale_facettes() const
Calcule la grandeur demandee, stocke le resultat dans un tableau interne a la classe et renvoie le re...
const Intersections_Elem_Facettes & intersections_elem_facettes() const
virtual const ArrOfDouble & get_update_surface_facettes() const
Calcule la grandeur demandee, stocke le resultat dans un tableau interne a la classe et renvoie le re...
Vecteur3 coords_fa7(int fa7) const
const Domaine_IJK & get_domaine() const
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
const Cut_cell_FT_Disc & get_cut_cell_disc() const
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)