16#include <Operateur_IJK_base.h>
17#include <IJK_Field_vector.h>
18#include <Cut_cell_FT_Disc.h>
41static inline void swap_data(IJK_Field_local_double*& a, IJK_Field_local_double*& b)
43 IJK_Field_local_double *tmp=a;
71 double inverse_dt_conv = 0.;
78 const ArrOfDouble& delta_z = geom.
get_delta(DIRECTION_K);
81 for (
int k = 0 ; k < nk ; k++)
84 ConstIJK_double_ptr ptr_vx(vx, 0, 0, k);
85 ConstIJK_double_ptr ptr_vy(vy, 0, 0, k);
86 ConstIJK_double_ptr ptr_vz(vz, 0, 0, k);
87 const double dz = delta_z[k + k_offset];
88 const double inverse_dx = 1. / dx;
89 const double inverse_dy = 1. / dy;
90 const double inverse_dz = 1. / dz;
92 for (
int j = 0 ; j < nj ; j++)
94 for (
int i = 0 ; i < ni ; i++)
97 double vx0 , vx1 , vy0 , vy1 , vz0 , vz1 ;
101 double inverse_dt_conv_loc =
102 (std::max(vx0, 0.) - std::min(vx1, 0.)) * inverse_dx
103 + (std::max(vy0, 0.) - std::min(vy1, 0.)) * inverse_dy
104 + (std::max(vz0, 0.) - std::min(vz1, 0.)) * inverse_dz;
106 inverse_dt_conv = std::max(inverse_dt_conv, inverse_dt_conv_loc);
116 inverse_dt_conv = std::max(1e-20, inverse_dt_conv);
117 return 1. / inverse_dt_conv;
122 compute_(dvx, dvy, dvz, 0 );
127 compute_(dvx, dvy, dvz, 1 );
130void Operateur_IJK_faces_base_double::compute_(IJK_Field_double& dvx, IJK_Field_double& dvy, IJK_Field_double& dvz,
bool add)
132 IJK_Field_local_double storage;
134 IJK_Field_local_double tmp[6];
135 for (
int i = 0; i < 6; i++)
136 tmp[i].ref_ij(storage, i);
137 IJK_Field_local_double *flux_vx_zmin = &tmp[0];
138 IJK_Field_local_double *flux_vy_zmin = &tmp[1];
139 IJK_Field_local_double *flux_vz_zmin = &tmp[2];
140 IJK_Field_local_double *flux_zmax = &tmp[3];
141 IJK_Field_local_double *
const flux_x = &tmp[4];
142 IJK_Field_local_double *
const flux_y = &tmp[5];
153 const int kmax = std::max(std::max(dvx.
nk(), dvy.
nk()), dvz.
nk());
154 for (
int k = 0; k < kmax ; k++)
170 swap_data(flux_vz_zmin, flux_zmax);
185 swap_data(flux_vx_zmin, flux_zmax);
200 swap_data(flux_vy_zmin, flux_zmax);
212 const IJK_Field_local_double& flux_zmin,
const IJK_Field_local_double& flux_zmax,
213 IJK_Field_double& resu,
int k_layer,
bool add)
215 ConstIJK_double_ptr fx(flux_x, 0, 0, 0);
216 ConstIJK_double_ptr fy(flux_y, 0, 0, 0);
217 ConstIJK_double_ptr fzmin(flux_zmin, 0, 0, 0);
218 ConstIJK_double_ptr fzmax(flux_zmax, 0, 0, 0);
219 IJK_double_ptr resu_ptr(resu, 0, 0, k_layer);
222 const int imax = resu.
ni();
223 const int jmax = resu.
nj();
225 for (
int j = 0; ; j++)
227 for (
int i = 0; i < imax; i += vsize)
312void Operateur_IJK_elem_base_double::compute_(IJK_Field_double& dx,
bool add)
314 IJK_Field_local_double storage;
316 IJK_Field_local_double tmp[4];
317 for (
int i = 0; i < 4; i++)
318 tmp[i].ref_ij(storage, i);
319 IJK_Field_local_double *flux_zmin = &tmp[0];
320 IJK_Field_local_double *flux_zmax = &tmp[1];
321 IJK_Field_local_double *
const flux_x = &tmp[2];
322 IJK_Field_local_double *
const flux_y = &tmp[3];
332 const int kmax = dx.
nk();
333 for (
int k = 0; k < kmax; k++)
346 swap_data(flux_zmin, flux_zmax);
351 const IJK_Field_local_double& flux_zmin,
const IJK_Field_local_double& flux_zmax,
352 IJK_Field_double& resu,
int k_layer,
bool add)
354 ConstIJK_double_ptr fx(flux_x, 0, 0, 0);
355 ConstIJK_double_ptr fy(flux_y, 0, 0, 0);
356 ConstIJK_double_ptr fzmin(flux_zmin, 0, 0, 0);
357 ConstIJK_double_ptr fzmax(flux_zmax, 0, 0, 0);
358 IJK_double_ptr resu_ptr(resu, 0, 0, k_layer);
361 const int imax = resu.
ni();
362 const int jmax = resu.
nj();
364 for (
int j = 0; ; j++)
366 for (
int i = 0; i < imax; i += vsize)
406 int ni = (dir == 0) ? flux->
ni() : flux->
ni() - 1;
407 int nj = (dir == 1) ? flux->
nj() : flux->
nj() - 1;
408 for (
int j = 0; j < nj; j++)
410 for (
int i = 0; i < ni; i++)
412 (*current_fluxes_)[dir](i,j,k_layer) = (*flux)(i,j,0);
420 int ni = (dir == 0) ? flux->
ni() : flux->
ni() - 1;
421 int nj = (dir == 1) ? flux->
nj() : flux->
nj() - 1;
422 for (
int j = 0; j < nj; j++)
424 for (
int i = 0; i < ni; i++)
435 IJK_Field_local_double storage;
436 storage.
allocate(dx[0].ni()+1, dx[0].nj()+1, 4, 0);
437 IJK_Field_local_double tmp[4];
438 for (
int i = 0; i < 4; i++)
439 tmp[i].ref_ij(storage, i);
440 IJK_Field_local_double *flux_zmin = &tmp[0];
441 IJK_Field_local_double *flux_zmax = &tmp[1];
442 IJK_Field_local_double *
const flux_x = &tmp[2];
443 IJK_Field_local_double *
const flux_y = &tmp[3];
447 const int kmax = dx[0].nk();
448 for (
int k = 0; k < kmax; k++)
453 fill_grad_field_x_(*flux_x, dx, k);
454 fill_grad_field_y_(*flux_y, dx, k);
455 fill_grad_field_z_(*flux_zmin, *flux_zmax, dx, k);
456 swap_data(flux_zmin, flux_zmax);
462 IJK_Field_local_double storage;
464 IJK_Field_local_double tmp;
466 IJK_Field_local_double *
const flux_x = &tmp;
467 const int kmax = dx.
nk();
468 for (
int k = 0; k < kmax; k++)
471 fill_grad_field_x_y_(*flux_x, dx, k, 0);
477 IJK_Field_local_double storage;
479 IJK_Field_local_double tmp;
481 IJK_Field_local_double *
const flux_y = &tmp;
482 const int kmax = dx.
nk();
483 for (
int k = 0; k < kmax; k++)
486 fill_grad_field_x_y_(*flux_y, dx, k, 1);
492 IJK_Field_local_double storage;
494 IJK_Field_local_double tmp[2];
495 for (
int i = 0; i < 2; i++)
496 tmp[i].ref_ij(storage, i);
497 IJK_Field_local_double *flux_zmin = &tmp[0];
498 IJK_Field_local_double *flux_zmax = &tmp[1];
500 const int kmax = dx.
nk();
501 for (
int k = 0; k < kmax; k++)
504 fill_grad_field_z_(*flux_zmin, *flux_zmax, dx, k);
505 swap_data(flux_zmin, flux_zmax);
509void Operateur_IJK_elem_base_double::fill_grad_field_x_(IJK_Field_local_double& flux, IJK_Field_vector3_double& resu,
int k)
511 fill_grad_field_x_y_(flux, resu[0], k, 0);
514void Operateur_IJK_elem_base_double::fill_grad_field_y_(IJK_Field_local_double& flux, IJK_Field_vector3_double& resu,
int k)
516 fill_grad_field_x_y_(flux, resu[1], k, 1);
519void Operateur_IJK_elem_base_double::fill_grad_field_z_(IJK_Field_local_double& flux_min, IJK_Field_local_double& flux_max, IJK_Field_vector3_double& resu,
int k)
521 fill_grad_field_z_(flux_min, flux_max, resu[2], k);
void get_center(int i_offset, _TYPE_ ¢er) const
returns field(i+i_offset, j, k)
void next_j()
increments the pointer by j_stride (eg, j = j+1)
void get_center_right(DIRECTION _DIR_, int i_offset, _TYPE_ ¢er, _TYPE_ &right) const
This class encapsulates all the information related to the eulerian mesh for TrioIJK.
int get_offset_local(int direction) const
Returns the local offset in requested direction.
int get_nb_elem_local(int direction) const
Returns the number of elements owned by this processor in the given direction.
double get_constant_delta(int direction) const
Returns the size of cells in a direction.
const ArrOfDouble & get_delta(int direction) const
Returns the array of mesh cell sizes in requested direction.
Class defining operators and methods for all reading operation in an input flow (file,...
void allocate(int ni, int nj, int nk, int ghosts, int additional_k_layers=0, int nb_compo=1, bool external_storage=false)
void ref_ij(IJK_Field_local_template &src, int k_layer)
const Domaine_IJK & get_domaine() const
void put_val(int i_offset, const _TYPE_ &val)
Performs the assignment: field(i+i_offset,j,k) = val.
classe Objet_U Cette classe est la classe de base des Objets de TRUST
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.
virtual void Operator_IJK_div(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)
virtual void compute_add(IJK_Field_double &dx)
virtual void compute_flux_z(IJK_Field_local_double &resu, const int k_layer)=0
virtual void compute_grad(IJK_Field_vector3_double &dx)
virtual void compute_set(IJK_Field_double &dx)
virtual void correct_flux(IJK_Field_local_double *const flux, const int k_layer, const int dir)
virtual void compute_flux_y(IJK_Field_local_double &resu, const int k_layer)=0
virtual void compute_flux_x(IJK_Field_local_double &resu, const int k_layer)=0
virtual void compute_grad_x(IJK_Field_double &dx)
virtual void compute_grad_y(IJK_Field_double &dx)
void set_runge_kutta(int rk_step, double dt_tot, IJK_Field_vector3_double ¤t_fluxes, IJK_Field_vector3_double &RK3_F_fluxes)
IJK_Field_vector3_double * current_fluxes_
bool runge_kutta_flux_correction_
virtual void compute_grad_z(IJK_Field_double &dx)
IJK_Field_vector3_double * RK3_F_fluxes_
virtual void compute_flux_y_vy(IJK_Field_local_double &resu, const int k_layer)=0
virtual void compute_flux_y_vx(IJK_Field_local_double &resu, const int k_layer)=0
virtual void exec_after_divergence_flux_y(IJK_Field_double &resu, const int k_layer)
virtual void compute_flux_x_vx(IJK_Field_local_double &resu, const int k_layer)=0
virtual void exec_after_divergence_flux_x(IJK_Field_double &resu, const int k_layer)
virtual void compute_flux_z_vz(IJK_Field_local_double &resu, const int k_layer)=0
virtual void correct_flux(IJK_Field_local_double *const flux, const int k_layer, const int dir, const int compo)
void compute_set(IJK_Field_double &dvx, IJK_Field_double &dvy, IJK_Field_double &dvz)
virtual double compute_dtstab_convection_local(IJK_Field_double &dvx, IJK_Field_double &dvy, IJK_Field_double &dvz)
virtual void compute_flux_x_vz(IJK_Field_local_double &resu, const int k_layer)=0
virtual void compute_flux_y_vz(IJK_Field_local_double &resu, const int k_layer)=0
virtual void compute_flux_x_vy(IJK_Field_local_double &resu, const int k_layer)=0
virtual void compute_flux_z_vy(IJK_Field_local_double &resu, const int k_layer)=0
virtual void compute_flux_z_vx(IJK_Field_local_double &resu, const int k_layer)=0
void compute_add(IJK_Field_double &dvx, IJK_Field_double &dvy, IJK_Field_double &dvz)
virtual void exec_after_divergence_flux_z(IJK_Field_double &resu, const int k_layer)
virtual void Operator_IJK_div(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)
Classe de base des flux de sortie.