16#include <IJK_Navier_Stokes_tools.h>
21#include <Interprete_bloc.h>
22#include <Perf_counters.h>
23#include <Option_IJK.h>
24#include <Multigrille_Adrien.h>
25#include <Boundary_Conditions_Thermique.h>
27double compute_fractionnal_timestep_rk3(
const double dt_tot,
int step)
29 assert(step >= 0 && step < 3);
30 const double intermediate_tstep[3] = { 1. / 3., 5. / 12., 1. / 4. };
31 return intermediate_tstep[step] * dt_tot;
35void force_zero_on_walls(IJK_Field_double& vz)
37 const int nj = vz.
nj();
38 const int ni = vz.
ni();
43 for (
int j = 0; j < nj; j++)
44 for (
int i = 0; i < ni; i++)
47 if (kmin + vz.
nk() == nktot)
49 const int k = vz.
nk() - 1;
50 for (
int j = 0; j < nj; j++)
51 for (
int i = 0; i < ni; i++)
58void compute_divergence_times_constant(
const IJK_Field_double& vx,
const IJK_Field_double& vy,
const IJK_Field_double& vz,
const double constant, IJK_Field_double& resu)
63 const int kmax = resu.
nk();
64 const int imax = resu.
ni();
65 const int jmax = resu.
nj();
67 const ArrOfDouble& delta_z_all = geom.
get_delta(DIRECTION_K);
68 for (
int k = 0; k < kmax; k++)
70 const double delta_z = delta_z_all[k + offset];
71 const double fx = delta_y * delta_z * constant;
72 const double fy = delta_x * delta_z * constant;
73 const double fz = delta_x * delta_y * constant;
74 for (
int j = 0; j < jmax; j++)
76 for (
int i = 0; i < imax; i++)
78 double x = (vx(i + 1, j, k) - vx(i, j, k)) * fx + (vy(i, j + 1, k) - vy(i, j, k)) * fy + (vz(i, j, k + 1) - vz(i, j, k)) * fz;
87void compute_divergence(
const IJK_Field_double& vx,
const IJK_Field_double& vy,
const IJK_Field_double& vz, IJK_Field_double& resu)
92 const int kmax = resu.
nk();
93 const int imax = resu.
ni();
94 const int jmax = resu.
nj();
96 const ArrOfDouble& delta_z_all = geom.
get_delta(DIRECTION_K);
97 for (
int k = 0; k < kmax; k++)
99 const double delta_z = delta_z_all[k + offset];
100 const double fx = 1. / delta_x;
101 const double fy = 1. / delta_y;
102 const double fz = 1. / delta_z;
103 for (
int j = 0; j < jmax; j++)
105 for (
int i = 0; i < imax; i++)
107 double x = (vx(i + 1, j, k) - vx(i, j, k)) * fx + (vy(i, j + 1, k) - vy(i, j, k)) * fy + (vz(i, j, k + 1) - vz(i, j, k)) * fz;
117void add_gradient_times_constant(
const IJK_Field_double& pressure,
const double constant, IJK_Field_double& vx, IJK_Field_double& vy, IJK_Field_double& vz)
120 const int kmax = std::max(std::max(vx.
nk(), vy.
nk()), vz.
nk());
121 for (
int k = 0; k < kmax; k++)
126 const int jmax = vx.
nj();
127 const int imax = vx.
ni();
129 for (
int j = 0; j < jmax; j++)
130 for (
int i = 0; i < imax; i++)
131 vx(i, j, k) += (pressure(i, j, k) - pressure(i - 1, j, k)) * f;
136 const int jmax = vy.
nj();
137 const int imax = vy.
ni();
139 for (
int j = 0; j < jmax; j++)
140 for (
int i = 0; i < imax; i++)
141 vy(i, j, k) += (pressure(i, j, k) - pressure(i, j - 1, k)) * f;
144 bool on_the_wall =
false;
148 const ArrOfDouble& delta_z_all = geom.
get_delta(DIRECTION_K);
150 if ((k + k_min == 0 || k + k_min == nk_tot - 1) && (!perio_k))
152 if (k < vz.
nk() && (!on_the_wall))
154 const int jmax = vz.
nj();
155 const int imax = vz.
ni();
159 f = constant * 2. / (delta_z_all[k - 1 + k_min] + delta_z_all[k + k_min]);
163 f = (constant / delta_z_all[k + offset]);
165 for (
int j = 0; j < jmax; j++)
166 for (
int i = 0; i < imax; i++)
167 vz(i, j, k) += (pressure(i, j, k) - pressure(i, j, k - 1)) * f;
175void add_gradient_times_constant_over_rho(
const IJK_Field_double& pressure,
const IJK_Field_double& rho,
const double constant, IJK_Field_double& vx, IJK_Field_double& vy, IJK_Field_double& vz)
178 const int kmax = std::max(std::max(vx.
nk(), vy.
nk()), vz.
nk());
179 for (
int k = 0; k < kmax; k++)
184 const int jmax = vx.
nj();
185 const int imax = vx.
ni();
187 for (
int j = 0; j < jmax; j++)
188 for (
int i = 0; i < imax; i++)
189 vx(i, j, k) += (pressure(i, j, k) - pressure(i - 1, j, k)) / (rho(i, j, k) + rho(i - 1, j, k)) * f;
194 const int jmax = vy.
nj();
195 const int imax = vy.
ni();
197 for (
int j = 0; j < jmax; j++)
198 for (
int i = 0; i < imax; i++)
199 vy(i, j, k) += (pressure(i, j, k) - pressure(i, j - 1, k)) / (rho(i, j, k) + rho(i, j - 1, k)) * f;
202 bool on_the_wall =
false;
206 const ArrOfDouble& delta_z_all = geom.
get_delta(DIRECTION_K);
209 if ((k + k_min == 0 || k + k_min == nk_tot - 1) && (!perio_k))
211 if (k < vz.
nk() && (!on_the_wall))
213 const int jmax = vz.
nj();
214 const int imax = vz.
ni();
218 f = constant * 2. / (delta_z_all[k - 1 + k_min] + delta_z_all[k + k_min]) * 2.;
222 f = (constant / delta_z_all[k + offset]) * 2.;
224 for (
int j = 0; j < jmax; j++)
225 for (
int i = 0; i < imax; i++)
226 vz(i, j, k) += (pressure(i, j, k) - pressure(i, j, k - 1)) / (rho(i, j, k) + rho(i, j, k - 1)) * f;
230void add_gradient_times_constant_times_inv_rho(
const IJK_Field_double& pressure,
const IJK_Field_double& inv_rho,
const double constant, IJK_Field_double& vx, IJK_Field_double& vy,
231 IJK_Field_double& vz)
234 const int kmax = std::max(std::max(vx.
nk(), vy.
nk()), vz.
nk());
235 for (
int k = 0; k < kmax; k++)
240 const int jmax = vx.
nj();
241 const int imax = vx.
ni();
243 for (
int j = 0; j < jmax; j++)
244 for (
int i = 0; i < imax; i++)
245 vx(i, j, k) += (pressure(i, j, k) - pressure(i - 1, j, k)) * (inv_rho(i, j, k) + inv_rho(i - 1, j, k)) * f;
250 const int jmax = vy.
nj();
251 const int imax = vy.
ni();
253 for (
int j = 0; j < jmax; j++)
254 for (
int i = 0; i < imax; i++)
255 vy(i, j, k) += (pressure(i, j, k) - pressure(i, j - 1, k)) * (inv_rho(i, j, k) + inv_rho(i, j - 1, k)) * f;
258 bool on_the_wall =
false;
262 const ArrOfDouble& delta_z_all = geom.
get_delta(DIRECTION_K);
265 if ((k + k_min == 0 || k + k_min == nk_tot - 1) && (!perio_k))
267 if (k < vz.
nk() && (!on_the_wall))
269 const int jmax = vz.
nj();
270 const int imax = vz.
ni();
274 f = constant * 2. / (delta_z_all[k - 1 + k_min] + delta_z_all[k + k_min]) * 0.5;
278 f = (constant / delta_z_all[k + offset]) * 0.5;
280 for (
int j = 0; j < jmax; j++)
281 for (
int i = 0; i < imax; i++)
282 vz(i, j, k) += (pressure(i, j, k) - pressure(i, j, k - 1)) * (inv_rho(i, j, k) + inv_rho(i, j, k - 1)) * f;
296void pressure_projection(IJK_Field_double& vx, IJK_Field_double& vy, IJK_Field_double& vz,
297 IJK_Field_double& pressure,
double dt,
298 IJK_Field_double& pressure_rhs,
301 statistics().create_custom_counter(
"Velocity update: projection",2,
"IJK");
302 statistics().begin_count(
"Velocity update: projection",statistics().get_last_opened_counter_level()+1);
308 compute_divergence_times_constant(vx, vy, vz, -1./dt, pressure_rhs);
313 double divergence_before = 0.;
315 divergence_before = norme_ijk(pressure_rhs);
320 add_gradient_times_constant(pressure, -dt, vx, vy, vz);
323 IJK_Field rhs_after(pressure_rhs);
329 compute_divergence_times_constant(vx, vy, vz, 1. / dt, rhs_after);
330 double divergence_after = norme_ijk(rhs_after);
331 Cout <<
"Divergence of velocity field: before solver: " << divergence_before <<
" after solver: " << divergence_after << finl;
333 statistics().end_count(
"Velocity update: projection");
345void pressure_projection_with_rho(
const IJK_Field_double& rho,
346 IJK_Field_double& vx, IJK_Field_double& vy, IJK_Field_double& vz,
347 IJK_Field_double& pressure,
double dt,
348 IJK_Field_double& pressure_rhs,
351 statistics().create_custom_counter(
"Velocity update: projection",2,
"IJK");
352 statistics().begin_count(
"Velocity update: projection",statistics().get_last_opened_counter_level()+1);
358 compute_divergence_times_constant(vx, vy, vz, -1./dt, pressure_rhs);
363 double divergence_before = 0.;
365 divergence_before = norme_ijk(pressure_rhs);
379 add_gradient_times_constant_over_rho(pressure, rho, -dt, vx, vy, vz);
382 IJK_Field rhs_after(pressure_rhs);
388 compute_divergence_times_constant(vx, vy, vz, 1. / dt, rhs_after);
389 double divergence_after = norme_ijk(rhs_after);
390 Cout <<
"Divergence of velocity field: before solver: " << divergence_before <<
" after solver: " << divergence_after << finl;
392 statistics().end_count(
"Velocity update: projection");
397void pressure_projection_with_inv_rho(
const IJK_Field_double& inv_rho,
398 IJK_Field_double& vx, IJK_Field_double& vy, IJK_Field_double& vz,
399 IJK_Field_double& pressure,
double dt,
400 IJK_Field_double& pressure_rhs,
403 statistics().create_custom_counter(
"Velocity update: projection",2,
"IJK");
404 statistics().begin_count(
"Velocity update: projection",statistics().get_last_opened_counter_level()+1);
409 compute_divergence_times_constant(vx, vy, vz, -1./dt, pressure_rhs);
414 double divergence_before = 0.;
416 divergence_before = norme_ijk(pressure_rhs);
431 add_gradient_times_constant_times_inv_rho(pressure, inv_rho, -dt, vx, vy, vz);
434 IJK_Field rhs_after(pressure_rhs);
440 compute_divergence_times_constant(vx, vy, vz, 1. / dt, rhs_after);
441 double divergence_after = norme_ijk(rhs_after);
442 Cout <<
"Divergence of velocity field: before solver: " << divergence_before <<
" after solver: " << divergence_after << finl;
444 statistics().end_count(
"Velocity update: projection");
447void forward_euler_update(
const IJK_Field_double& dv, IJK_Field_double& v,
const int k_layer,
double dt_tot)
449 const int imax = v.
ni();
450 const int jmax = v.
nj();
451 for (
int j = 0; j < jmax; j++)
453 for (
int i = 0; i < imax; i++)
455 double x = dv(i, j, k_layer);
456 v(i, j, k_layer) += x * dt_tot;
469void runge_kutta3_update(
const IJK_Field_double& dv, IJK_Field_double& F, IJK_Field_double& v,
const int step,
const int k_layer,
double dt_tot)
471 const double coeff_a[3] = { 0., -5. / 9., -153. / 128. };
473 const double coeff_Fk[3] = { 1., 4. / 9., 15. / 32. };
475 const double facteurF = coeff_a[step];
476 const double intermediate_dt = compute_fractionnal_timestep_rk3(dt_tot, step);
477 const double delta_t_divided_by_Fk = intermediate_dt / coeff_Fk[step];
478 const int imax = v.
ni();
479 const int jmax = v.
nj();
485 for (
int j = 0; j < jmax; j++)
487 for (
int i = 0; i < imax; i++)
489 double x = dv(i, j, k_layer);
490 F(i, j, k_layer) = x;
491 v(i, j, k_layer) += x * delta_t_divided_by_Fk;
497 for (
int j = 0; j < jmax; j++)
499 for (
int i = 0; i < imax; i++)
501 double x = F(i, j, k_layer) * facteurF + dv(i, j, k_layer);
502 F(i, j, k_layer) = x;
503 v(i, j, k_layer) += x * delta_t_divided_by_Fk;
509 for (
int j = 0; j < jmax; j++)
511 for (
int i = 0; i < imax; i++)
513 double x = F(i, j, k_layer) * facteurF + dv(i, j, k_layer);
514 v(i, j, k_layer) += x * delta_t_divided_by_Fk;
519 Cerr <<
"Error in runge_kutta_update: wrong step" << finl;
525void runge_kutta3_update(
const DoubleTab& dvi, DoubleTab& G, DoubleTab& l,
526 const int step,
const double dt_tot,
529 const double coeff_a[3] = { 0., -5./9., -153./128. };
531 const double coeff_Gk[3] = { 1., 4./9., 15./32. };
533 const double facteurG = coeff_a[step];
534 const double intermediate_dt = compute_fractionnal_timestep_rk3(dt_tot, step);
535 const double delta_t_divided_by_Gk = intermediate_dt / coeff_Gk[step];
547 for (
int isom = 0; isom < nbsom; isom++)
549 for (
int dir = 0; dir < 3; dir++)
553 G(isom,dir) = 111./intermediate_dt;
554 l(isom,dir) = 111./intermediate_dt;
556 double x = dvi(isom,dir);
558 l(isom,dir) += x * delta_t_divided_by_Gk;
564 for (
int isom = 0; isom < nbsom; isom++)
566 for (
int dir = 0; dir < 3; dir++)
570 G(isom,dir) = 111./intermediate_dt;
571 l(isom,dir) = 111./intermediate_dt;
573 double x = G(isom,dir) * facteurG + dvi(isom,dir);
575 l(isom,dir) += x * delta_t_divided_by_Gk;
581 for (
int isom = 0; isom < nbsom; isom++)
583 for (
int dir = 0; dir < 3; dir++)
587 G(isom,dir) = 111./intermediate_dt;
588 l(isom,dir) = 111./intermediate_dt;
590 double x = G(isom,dir) * facteurG + dvi(isom,dir);
591 l(isom,dir) += x * delta_t_divided_by_Gk;
596 Cerr <<
"Error in runge_kutta_update: wrong step" << finl;
602void runge_kutta3_update_surfacic_fluxes(IJK_Field_double& dv, IJK_Field_double& F,
const int step,
const int k_layer,
double dt_tot)
604 const double coeff_a[3] = { 0., -5. / 9., -153. / 128. };
606 const double coeff_Fk[3] = { 1., 4. / 9., 15. / 32. };
608 const double facteurF = coeff_a[step];
609 const double one_divided_by_Fk = 1. / coeff_Fk[step];
610 const int imax = dv.
ni();
611 const int jmax = dv.
nj();
612 const int ghost = dv.
ghost();
618 for (
int j = -ghost; j < jmax+ghost; j++)
620 for (
int i = -ghost; i < imax+ghost; i++)
623 double x = dv(i, j, k_layer);
624 dv(i, j, k_layer) = x * one_divided_by_Fk;
625 F(i, j, k_layer) = x;
631 for (
int j = -ghost; j < jmax+ghost; j++)
633 for (
int i = -ghost; i < imax+ghost; i++)
635 double x = F(i, j, k_layer) * facteurF + dv(i, j, k_layer);
636 dv(i, j, k_layer) = x * one_divided_by_Fk;
637 F(i, j, k_layer) = x;
643 for (
int j = -ghost; j < jmax+ghost; j++)
645 for (
int i = -ghost; i < imax+ghost; i++)
647 double x = F(i, j, k_layer) * facteurF + dv(i, j, k_layer);
648 dv(i, j, k_layer) = x * one_divided_by_Fk;
653 Cerr <<
"Error in runge_kutta_update: wrong step" << finl;
660static void calculer_rho_v_DIR(DIRECTION _DIR_,
const IJK_Field_double& input_rho,
const IJK_Field_double& input_v, IJK_Field_double& rho_v,
const int k)
662 const int ni = rho_v.
ni();
663 const int nj = rho_v.
nj();
664 ConstIJK_double_ptr rho(input_rho, 0, 0, k);
665 ConstIJK_double_ptr v(input_v, 0, 0, k);
666 IJK_double_ptr resu(rho_v, 0, 0, k);
668 for (
int j = 0; j < nj; j++)
670 for (
int i = 0; i < ni; i++)
673 rho.get_left_center(_DIR_, i, a, b);
675 resu.put_val(i, (a + b) * c * 0.5);
688static void calculer_rho_harmonic_v_DIR(DIRECTION _DIR_,
const IJK_Field_double& input_rho,
const IJK_Field_double& input_v, IJK_Field_double& rho_v,
const int k)
690 const int ni = rho_v.
ni();
691 const int nj = rho_v.
nj();
692 ConstIJK_double_ptr rho(input_rho, 0, 0, k);
693 ConstIJK_double_ptr v(input_v, 0, 0, k);
694 IJK_double_ptr resu(rho_v, 0, 0, k);
696 for (
int j = 0; j < nj; j++)
698 for (
int i = 0; i < ni; i++)
701 rho.get_left_center(_DIR_, i, a, b);
703 resu.put_val(i, 2. * a * b / (a + b) * c);
714void calculer_rho_v(
const IJK_Field_double& rho,
const IJK_Field_vector3_double& v, IJK_Field_vector3_double& rho_v)
718 const int nk = std::max(rho_v[0].nk(), std::max(rho_v[1].nk(), rho_v[2].nk()));
720 for (
int k = 0; k < nk; k++)
723 if (k < rho_v[0].nk())
724 calculer_rho_v_DIR(DIRECTION::X, rho, v[0], rho_v[0], k);
725 if (k < rho_v[1].nk())
726 calculer_rho_v_DIR(DIRECTION::Y, rho, v[1], rho_v[1], k);
727 if (k < rho_v[2].nk())
728 calculer_rho_v_DIR(DIRECTION::Z, rho, v[2], rho_v[2], k);
733void calculer_rho_harmonic_v(
const IJK_Field_double& rho,
const IJK_Field_vector3_double& v, IJK_Field_vector3_double& rho_v)
737 const int nk = std::max(rho_v[0].nk(), std::max(rho_v[1].nk(), rho_v[2].nk()));
739 for (
int k = 0; k < nk; k++)
742 if (k < rho_v[0].nk())
743 calculer_rho_harmonic_v_DIR(DIRECTION::X, rho, v[0], rho_v[0], k);
744 if (k < rho_v[1].nk())
745 calculer_rho_harmonic_v_DIR(DIRECTION::Y, rho, v[1], rho_v[1], k);
746 if (k < rho_v[2].nk())
747 calculer_rho_harmonic_v_DIR(DIRECTION::Z, rho, v[2], rho_v[2], k);
753static void mass_solver_with_rho_DIR(DIRECTION _DIR_,
const IJK_Field_double& input_rho, IJK_Field_double& velocity,
const double volume,
const int k)
755 const int ni = velocity.
ni();
756 const int nj = velocity.
nj();
757 ConstIJK_double_ptr rho(input_rho, 0, 0, k);
758 IJK_double_ptr v(velocity, 0, 0, k);
760 const double facteur = volume * 0.5;
762 for (
int j = 0; j < nj; j++)
764 for (
int i = 0; i < ni; i++)
766 double a = 0., b = 0., c, resu;
767 rho.get_left_center(_DIR_, i, a, b);
769 resu = c / ((a + b) * facteur);
781static void mass_solver_with_inv_rho_DIR(DIRECTION _DIR_,
const IJK_Field_double& input_inv_rho, IJK_Field_double& velocity,
const double volume,
const int k)
783 const int ni = velocity.
ni();
784 const int nj = velocity.
nj();
785 ConstIJK_double_ptr inv_rho(input_inv_rho, 0, 0, k);
786 IJK_double_ptr v(velocity, 0, 0, k);
788 const double facteur = 0.5 / volume;
790 for (
int j = 0; j < nj; j++)
792 for (
int i = 0; i < ni; i++)
794 double a = 0., b = 0., c, resu;
795 inv_rho.get_left_center(_DIR_, i, a, b);
797 resu = c * (a + b) * facteur;
812double get_channel_control_volume(IJK_Field_double& field,
int local_k_layer,
const ArrOfDouble_with_ghost& delta_z_local)
822 delta_z = delta_z_local[local_k_layer];
830 if (global_k_index == 0)
832 delta_z = delta_z_local[local_k_layer] * 0.5;
834 else if (global_k_index == last_global_k)
836 delta_z = delta_z_local[local_k_layer - 1] * 0.5;
840 delta_z = (delta_z_local[local_k_layer - 1] + delta_z_local[local_k_layer]) * 0.5;
846 delta_z = (delta_z_local[local_k_layer - 1] + delta_z_local[local_k_layer]) * 0.5;
851 Cerr <<
"Error in get_channel_control_volume: invalid field localisation" << finl;
854 return delta_x * delta_y * delta_z;
860void mass_solver_with_rho(IJK_Field_double& velocity,
const IJK_Field_double& rho,
const ArrOfDouble_with_ghost& delta_z_local,
const int k)
862 const double volume = get_channel_control_volume(velocity, k, delta_z_local);
866 mass_solver_with_rho_DIR(DIRECTION::X, rho, velocity, volume, k);
869 mass_solver_with_rho_DIR(DIRECTION::Y, rho, velocity, volume, k);
872 mass_solver_with_rho_DIR(DIRECTION::Z, rho, velocity, volume, k);
881void mass_solver_with_inv_rho(IJK_Field_double& velocity,
const IJK_Field_double& inv_rho,
const ArrOfDouble_with_ghost& delta_z_local,
const int k)
883 const double volume = get_channel_control_volume(velocity, k, delta_z_local);
887 mass_solver_with_inv_rho_DIR(DIRECTION::X, inv_rho, velocity, volume, k);
890 mass_solver_with_inv_rho_DIR(DIRECTION::Y, inv_rho, velocity, volume, k);
893 mass_solver_with_inv_rho_DIR(DIRECTION::Z, inv_rho, velocity, volume, k);
900void mass_solver_scalar(IJK_Field_double& dv,
const ArrOfDouble_with_ghost& delta_z_local,
int k_index)
902 const double volume = get_channel_control_volume(dv, k_index, delta_z_local);
903 const double constant = 1. / volume;
904 const int imax = dv.
ni();
905 const int jmax = dv.
nj();
906 for (
int j = 0; j < jmax; j++)
908 for (
int i = 0; i < imax; i++)
910 dv(i, j, k_index) *= constant;
918void density_solver_with_rho(IJK_Field_double& velocity,
const IJK_Field_double& rho,
const ArrOfDouble_with_ghost& delta_z_local,
const int k)
923 mass_solver_with_rho_DIR(DIRECTION::X, rho, velocity, 1., k);
926 mass_solver_with_rho_DIR(DIRECTION::Y, rho, velocity, 1., k);
929 mass_solver_with_rho_DIR(DIRECTION::Z, rho, velocity, 1., k);
937void update_integral_velocity(
const IJK_Field_vector3_double& v_instant, IJK_Field_vector3_double& v_tmp,
const IJK_Field_double& indic,
const IJK_Field_double& indic_tmp)
939 const int ni = indic_tmp.
ni();
940 const int nj = indic_tmp.
nj();
941 const int nk = indic_tmp.
nk();
942 for (
int k = 0; k < nk; k++)
944 for (
int j = 0; j < nj; j++)
946 for (
int i = 0; i < ni; i++)
949 u = (v_instant[0](i, j, k) + v_instant[0](i + 1, j, k)) * 0.5;
950 v = (v_instant[1](i, j, k) + v_instant[1](i, j + 1, k)) * 0.5;
951 w = (v_instant[2](i, j, k) + v_instant[2](i, j, k + 1)) * 0.5;
952 if (indic_tmp(i, j, k) + indic(i, j, k) != 0.0)
954 v_tmp[0](i, j, k) = (v_tmp[0](i, j, k) * indic_tmp(i, j, k) + u * indic(i, j, k)) / (indic_tmp(i, j, k) + indic(i, j, k));
955 v_tmp[1](i, j, k) = (v_tmp[1](i, j, k) * indic_tmp(i, j, k) + v * indic(i, j, k)) / (indic_tmp(i, j, k) + indic(i, j, k));
956 v_tmp[2](i, j, k) = (v_tmp[2](i, j, k) * indic_tmp(i, j, k) + w * indic(i, j, k)) / (indic_tmp(i, j, k) + indic(i, j, k));
971void compute_and_store_gradU_cell(
const IJK_Field_double& vitesse_i,
const IJK_Field_double& vitesse_j,
const IJK_Field_double& vitesse_k,
973 IJK_Field_double& dudx,
974 IJK_Field_double& dvdy, IJK_Field_double& dwdx, IJK_Field_double& dudz, IJK_Field_double& dvdz, IJK_Field_double& dwdz,
const int compute_all,
976 IJK_Field_double& dudy,
977 IJK_Field_double& dvdx, IJK_Field_double& dwdy, IJK_Field_double& lambda2)
984 const ArrOfDouble& tab_dz = geom.
get_delta(2);
994 for (
int k = 0; k < kmax; k++)
996 const double dz = tab_dz[k + offset];
997 bool on_the_first_cell =
false;
998 bool on_the_last_cell =
false;
1000 on_the_first_cell =
true;
1001 if (k + offset == nktot - 1)
1002 on_the_last_cell =
true;
1003 for (
int j = 0; j < jmax; j++)
1005 for (
int i = 0; i < imax; i++)
1010 dudx(i, j, k) = (vitesse_i(i + 1, j, k) - vitesse_i(i, j, k)) / dx;
1013 double We_mi = (vitesse_k(i - 1, j, k) + vitesse_k(i - 1, j, k + 1)) * 0.5;
1014 double We_pi = (vitesse_k(i + 1, j, k) + vitesse_k(i + 1, j, k + 1)) * 0.5;
1015 dwdx(i, j, k) = (We_pi - We_mi) / (2 * dx);
1020 dvdy(i, j, k) = (vitesse_j(i, j + 1, k) - vitesse_j(i, j, k)) / dy;
1024 double Ue_mj = (vitesse_i(i, j - 1, k) + vitesse_i(i + 1, j - 1, k)) * 0.5;
1025 double Ue_pj = (vitesse_i(i, j + 1, k) + vitesse_i(i + 1, j + 1, k)) * 0.5;
1026 dudy(i, j, k) = (Ue_pj - Ue_mj) / (2 * dy);
1027 double Ve_mi = (vitesse_j(i - 1, j, k) + vitesse_j(i - 1, j + 1, k)) * 0.5;
1028 double Ve_pi = (vitesse_j(i + 1, j, k) + vitesse_j(i + 1, j + 1, k)) * 0.5;
1029 dvdx(i, j, k) = (Ve_pi - Ve_mi) / (2 * dx);
1030 double We_mj = (vitesse_k(i, j - 1, k) + vitesse_k(i, j - 1, k + 1)) * 0.5;
1031 double We_pj = (vitesse_k(i, j + 1, k) + vitesse_k(i, j + 1, k + 1)) * 0.5;
1032 dwdy(i, j, k) = (We_pj - We_mj) / (2 * dy);
1046 double Ue_ck = (vitesse_i(i, j, k) + vitesse_i(i + 1, j, k)) * 0.5;
1047 double Ue_pk = (vitesse_i(i, j, k + 1) + vitesse_i(i + 1, j, k + 1)) * 0.5;
1049 dudz(i, j, k) = (-4 * Ue_mk + 3 * Ue_ck + Ue_pk) / (3 * dz);
1053 double Ve_ck = (vitesse_j(i, j, k) + vitesse_j(i, j + 1, k)) * 0.5;
1054 double Ve_pk = (vitesse_j(i, j, k + 1) + vitesse_j(i, j + 1, k + 1)) * 0.5;
1055 dvdz(i, j, k) = (-4 * Ve_mk + 3 * Ve_ck + Ve_pk) / (3 * dz);
1060 double Ue_mk = (vitesse_i(i, j, k - 1) + vitesse_i(i + 1, j, k - 1)) * 0.5;
1061 double Ue_ck = (vitesse_i(i, j, k) + vitesse_i(i + 1, j, k)) * 0.5;
1064 dudz(i, j, k) = (-Ue_mk - 3 * Ue_ck + 4 * Ue_pk) / (3 * dz);
1067 double Ve_mk = (vitesse_j(i, j, k - 1) + vitesse_j(i, j + 1, k - 1)) * 0.5;
1068 double Ve_ck = (vitesse_j(i, j, k) + vitesse_j(i, j + 1, k)) * 0.5;
1070 dvdz(i, j, k) = (-Ve_mk - 3 * Ve_ck + 4 * Ve_pk) / (3 * dz);
1077 double Ue_mk = (vitesse_i(i, j, k - 1) + vitesse_i(i + 1, j, k - 1)) * 0.5;
1078 double Ue_pk = (vitesse_i(i, j, k + 1) + vitesse_i(i + 1, j, k + 1)) * 0.5;
1079 dudz(i, j, k) = (Ue_pk - Ue_mk) / (2 * dz);
1082 double Ve_mk = (vitesse_j(i, j, k - 1) + vitesse_j(i, j + 1, k - 1)) * 0.5;
1083 double Ve_pk = (vitesse_j(i, j, k + 1) + vitesse_j(i, j + 1, k + 1)) * 0.5;
1084 dvdz(i, j, k) = (Ve_pk - Ve_mk) / (2 * dz);
1088 dwdz(i, j, k) = (vitesse_k(i, j, k + 1) - vitesse_k(i, j, k)) / dz;
1094 double s11 = dudx(i, j, k);
1095 double s12 = (dudy(i, j, k) + dvdx(i, j, k)) * 0.5;
1096 double s13 = (dudz(i, j, k) + dwdx(i, j, k)) * 0.5;
1098 double s22 = dvdy(i, j, k);
1099 double s23 = (dvdz(i, j, k) + dwdy(i, j, k)) * 0.5;
1102 double s33 = dwdz(i, j, k);
1103 squared_3x3(s11, s12, s13, s21, s22, s23, s31, s32, s33);
1107 double o12 = (dudy(i, j, k) - dvdx(i, j, k)) * 0.5;
1108 double o13 = (dudz(i, j, k) - dwdx(i, j, k)) * 0.5;
1111 double o23 = (dvdz(i, j, k) - dwdy(i, j, k)) * 0.5;
1115 squared_3x3(o11, o12, o13, o21, o22, o23, o31, o32, o33);
1118 const double a11 = s11 + o11;
1119 const double a12 = s12 + o12;
1120 const double a13 = s13 + o13;
1121 const double a21 = s21 + o21;
1122 const double a22 = s22 + o22;
1123 const double a23 = s23 + o23;
1124 const double a31 = s31 + o31;
1125 const double a32 = s32 + o32;
1126 const double a33 = s33 + o33;
1130 const double a = 1.;
1131 const double b = -(a11 + a22 + a33);
1132 const double c = -(a12 * a21 + a23 * a32 + a13 * a31 - a11 * a22 - a11 * a33 - a22 * a33);
1133 const double d = -(a11 * a22 * a33 + a12 * a23 * a31 + a13 * a32 * a21 - a11 * a23 * a32 - a22 * a13 * a31 - a33 * a12 * a21);
1135 const double delta = 18 * a * b * c * d - 4 * b * b * b * d + b * b * c * c - 4 * a * c * c * c - 27 * a * a * d * d;
1136 const double Q = (3. * c - b * b) / 9.;
1137 const double R = (9. * b * c - 27. * d - 2. * b * b * b) / 54.;
1138 const double D = Q * Q * Q + R * R;
1139 if ((delta < 0) || (Q > 0))
1141 double Re_sqrtD, Im_sqrtD;
1142 double mod = 0, arg = 0;
1145 Cerr <<
"Singularity for lambda2 at " << i <<
" " << j <<
" " << k <<
" D=" << D << finl;
1149 complex_to_trig(R + Re_sqrtD, Im_sqrtD, mod, arg);
1151 const double modS = pow(mod, 1. / 3.);
1152 const double argS = arg / 3.;
1153 const double Re_S = modS * cos(argS);
1154 const double Im_S = modS * sin(argS);
1156 complex_to_trig(R - Re_sqrtD, -Im_sqrtD, mod, arg);
1158 const double modT = pow(mod, 1. / 3.);
1159 const double argT = arg / 3.;
1160 const double Re_T = modT * cos(argT);
1161 const double Im_T = modT * sin(argT);
1163 const double Re_B = Re_S + Re_T;
1164 const double Im_B = Im_S + Im_T;
1165 const double Re_A = Re_S - Re_T;
1166 const double Im_A = Im_S - Im_T;
1167 Cerr <<
"Im_B : " << Im_B <<
" Re_A : " << Re_A << finl;
1168 const double z1 = -1. / 3. * b + Re_B;
1169 const double z2 = -1. / 3. * b - 0.5 * Re_B + 1. / 2. * sqrt(3.) * Im_A;
1170 const double z3 = -1. / 3. * b - 0.5 * Re_B - 1. / 2. * sqrt(3.) * Im_A;
1171 Cerr <<
" z1,2,3 = " << z1 <<
" " << z2 <<
" " << z3 << finl;
1172 Cerr <<
"Im_z1,2,3 = " << Im_B <<
" " << -0.5 * Re_B + sqrt(3) / 2. * Re_A <<
" " << -0.5 * Re_B - sqrt(3) / 2. * Re_A << finl;
1173 double x = z1 + z2 + z3 - std::min(z1, std::min(z2, z3)) - std::max(z1, std::max(z2, z3));
1174 lambda2(i, j, k) = x;
1177 Cerr <<
"x= " << x <<
" results in: " << a * x * x * x + b * x * x + c * x + d << finl;
1179 Cerr <<
"x= " << x <<
" results in: " << a * x * x * x + b * x * x + c * x + d << finl;
1181 Cerr <<
"x= " << x <<
" results in: " << a * x * x * x + b * x * x + c * x + d << finl;
1186 lambda2(i, j, k) = -1000.;
1187 Cerr <<
"Singularity for lambda2 at " << i <<
" " << j <<
" " << k <<
" value prescribed : -1000. ";
1188 Cerr <<
"delta = " << delta <<
" ; Q = " << Q << finl;
1189 Cerr <<
"(R*sqrt(pow(fabs(Q),-3)))= " << (R * sqrt(pow(fabs(Q), -3))) << finl;
1196 const double theta = acos(R * sqrt(-pow(Q - DMINFLOAT, -3)));
1198 const double z1 = 2 * sqrt(-Q) * cos(theta / 3.) - 1. / 3. * b;
1199 const double z2 = 2 * sqrt(-Q) * cos((theta + 2 * M_PI) / 3.) - 1. / 3. * b;
1200 const double z3 = 2 * sqrt(-Q) * cos((theta + 4 * M_PI) / 3.) - 1. / 3. * b;
1265 const double x = z1 + z2 + z3 - std::min(z1, std::min(z2, z3)) - std::max(z1, std::max(z2, z3));
1266 lambda2(i, j, k) = x;
1268 const double rr = a * x * x * x + b * x * x + c * x + d;
1277 residue = std::max(residue, fabs(rr));
1284 Cerr <<
"Maximal residue encountered with lambda2 : " << residue << finl;
1296void supprimer_chevauchement(IJK_Field_double& ind)
1299 const int ni = ind.ni();
1300 const int nj = ind.nj();
1301 const int nk = ind.nk();
1302 for (
int k = 0; k < nk; k++)
1304 for (
int j = 0; j < nj; j++)
1306 for (
int i = 0; i < ni; i++)
1308 if (ind(i, j, k) != 0.0)
1321void update_integral_pressure(
const IJK_Field_double& p_instant, IJK_Field_double& p_tmp,
const IJK_Field_double& indic,
const IJK_Field_double& indic_tmp)
1323 const int ni = p_instant.
ni();
1324 const int nj = p_instant.
nj();
1325 const int nk = p_instant.
nk();
1326 for (
int k = 0; k < nk; k++)
1328 for (
int j = 0; j < nj; j++)
1330 for (
int i = 0; i < ni; i++)
1332 if (indic_tmp(i, j, k) + indic(i, j, k) != 0.0 and indic(i, j, k) == 1.0)
1334 p_tmp(i, j, k) = (p_tmp(i, j, k) * indic_tmp(i, j, k) + p_instant(i, j, k) * indic(i, j, k)) / (indic_tmp(i, j, k) + indic(i, j, k));
1345void update_integral_indicatrice(
const IJK_Field_double& indic,
const double deltat, IJK_Field_double& out)
1347 const int ni = out.
ni();
1348 const int nj = out.
nj();
1349 const int nk = out.
nk();
1350 for (
int k = 0; k < nk; k++)
1351 for (
int j = 0; j < nj; j++)
1352 for (
int i = 0; i < ni; i++)
1353 out(i, j, k) += indic(i, j, k) * deltat;
1357double calculer_v_moyen(
const IJK_Field_double& vx)
1360 const int ni = vx.
ni();
1361 const int nj = vx.
nj();
1362 const int nk = vx.
nk();
1365 for (
int k = 0; k < nk; k++)
1367 for (
int j = 0; j < nj; j++)
1369 for (
int i = 0; i < ni; i++)
1371 v_moy += vx(i, j, k);
1380 v_moy /= n_mailles_tot;
1382 const int offset = splitting.get_offset_local(DIRECTION_K);
1383 const ArrOfDouble& tab_dz=geom.
get_delta(DIRECTION_K);
1384 for (
int k = 0; k < nk; k++)
1386 const double dz = tab_dz[k+offset];
1387 for (
int j = 0; j < nj; j++)
1389 for (
int i = 0; i < ni; i++)
1391 v_moy += vx(i,j,k)*dz;
1405double calculer_vl_moyen(
const IJK_Field_double& vx,
const IJK_Field_double& indic)
1408 const int ni = vx.
ni();
1409 const int nj = vx.
nj();
1410 const int nk = vx.
nk();
1412 double indic_moy = 0.;
1413 for (
int k = 0; k < nk; k++)
1415 for (
int j = 0; j < nj; j++)
1417 for (
int i = 0; i < ni; i++)
1419 v_moy += vx(i,j,k)*(1.-indic(i,j,k));
1420 indic_moy+=1.-indic(i,j,k);
1430 v_moy /= n_mailles_tot;
1431 indic_moy /= n_mailles_tot;
1433 return v_moy/indic_moy;
1436double calculer_rho_cp_u_moyen(
const IJK_Field_double& vx,
const IJK_Field_double& cp_rhocp_rhocpinv,
const IJK_Field_double& rho_field,
const double& rho_cp,
const int rho_cp_case)
1438 const int ni = vx.
ni();
1439 const int nj = vx.
nj();
1440 const int nk = vx.
nk();
1441 double rho_cp_u_moy = 0.;
1444 for (
int k = 0; k < nk; k++)
1445 for (
int j = 0; j < nj; j++)
1446 for (
int i = 0; i < ni; i++)
1451 rho = rho_field(i, j, k);
1452 cp = cp_rhocp_rhocpinv(i, j, k);
1455 rho = cp_rhocp_rhocpinv(i, j, k);
1461 rho = (1 / cp_rhocp_rhocpinv(i, j, k));
1464 rho = rho_field(i, j, k);
1465 cp = cp_rhocp_rhocpinv(i, j, k);
1468 const double u = (vx(i, j, k) + vx(i + 1, j, k)) / 2;
1469 const double rho_cp_u = rho * cp * u;
1470 rho_cp_u_moy += rho_cp_u;
1478 rho_cp_u_moy /= n_mailles_tot;
1479 return rho_cp_u_moy;
1482double calculer_temperature_adimensionnelle_theta_moy(
const IJK_Field_double& vx,
const IJK_Field_double& temperature_adimensionnelle_theta,
const IJK_Field_double& cp_rhocp_rhocpinv,
1483 const IJK_Field_double& rho_field,
const double& rho_cp,
const int rho_cp_case)
1486 double theta_adim_moy = 0;
1487 double rho_cp_u_moy = 0;
1491 const int nk = temperature_adimensionnelle_theta.
nk();
1492 const int ni = temperature_adimensionnelle_theta.
ni();
1493 const int nj = temperature_adimensionnelle_theta.
nj();
1494 for (
int k = 0; k < nk; k++)
1495 for (
int j = 0; j < nj; j++)
1496 for (
int i = 0; i < ni; i++)
1501 rho = rho_field(i, j, k);
1502 cp = cp_rhocp_rhocpinv(i, j, k);
1505 rho = cp_rhocp_rhocpinv(i, j, k);
1511 rho = (1 / cp_rhocp_rhocpinv(i, j, k));
1514 rho = rho_field(i, j, k);
1515 cp = cp_rhocp_rhocpinv(i, j, k);
1518 const double theta_adim = temperature_adimensionnelle_theta(i, j, k);
1519 const double u = (vx(i, j, k) + vx(i + 1, j, k)) / 2.;
1520 rho_cp_u_moy += rho * cp * u;
1521 theta_adim_moy += rho * cp * u * theta_adim;
1528 rho_cp_u_moy /= n_mailles_tot;
1529 theta_adim_moy /= n_mailles_tot;
1531 theta_adim_moy /= rho_cp_u_moy;
1532 return theta_adim_moy;
1535double calculer_variable_wall(
const IJK_Field_double& variable,
const IJK_Field_double& cp_rhocp_rhocpinv,
const IJK_Field_double& rho_field,
const double& rho_cp,
const int kmin,
const int kmax,
1536 const int rho_cp_case)
1539 double variable_moy = 0;
1540 double rho_cp_moy = 0.;
1541 const int nk = variable.
nk();
1543 calculer_rho_cp_var(variable, cp_rhocp_rhocpinv, rho_field, rho_cp, rho_cp_moy, variable_moy, kmin, rho_cp_case);
1544 if (kmin + variable.
nk() == kmax)
1547 calculer_rho_cp_var(variable, cp_rhocp_rhocpinv, rho_field, rho_cp, rho_cp_moy, variable_moy, k, rho_cp_case);
1554 rho_cp_moy /= n_mailles_plan_xy_tot;
1555 variable_moy /= n_mailles_plan_xy_tot;
1557 variable_moy /= rho_cp_moy;
1558 return variable_moy;
1561void calculer_rho_cp_var(
const IJK_Field_double& variable,
const IJK_Field_double& cp_rhocp_rhocpinv,
const IJK_Field_double& rho,
const double& rho_cp,
double& rho_cp_moy,
double& variable_moy,
1562 int k,
const int rho_cp_case)
1564 const int ni = variable.
ni();
1565 const int nj = variable.
nj();
1566 double rho_ijk = 1.;
1568 for (
int j = 0; j < nj; j++)
1569 for (
int i = 0; i < ni; i++)
1574 rho_ijk = rho(i, j, k);
1575 cp_ijk = cp_rhocp_rhocpinv(i, j, k);
1578 rho_ijk = cp_rhocp_rhocpinv(i, j, k);
1584 rho_ijk = (1 / cp_rhocp_rhocpinv(i, j, k));
1587 rho_ijk = rho(i, j, k);
1588 cp_ijk = cp_rhocp_rhocpinv(i, j, k);
1591 const double var = variable(i, j, k);
1592 rho_cp_moy += rho_ijk * cp_ijk;
1593 variable_moy += rho_ijk * cp_ijk * var;
1600void add_gradient_temperature(
const IJK_Field_double& temperature,
const double constant, IJK_Field_double& grad_T_x, IJK_Field_double& grad_T_y, IJK_Field_double& grad_T_z,
1604 const int kmax = std::max(std::max(grad_T_x.
nk(), grad_T_y.
nk()), grad_T_z.
nk());
1605 for (
int k = 0; k < kmax; k++)
1608 if (k < grad_T_x.
nk())
1610 const int jmax = grad_T_x.
nj();
1611 const int imax = grad_T_x.
ni();
1613 for (
int j = 0; j < jmax; j++)
1614 for (
int i = 0; i < imax; i++)
1615 grad_T_x(i, j, k) += (temperature(i, j, k) - temperature(i - 1, j, k)) * f;
1618 if (k < grad_T_y.
nk())
1620 const int jmax = grad_T_y.
nj();
1621 const int imax = grad_T_y.
ni();
1623 for (
int j = 0; j < jmax; j++)
1624 for (
int i = 0; i < imax; i++)
1625 grad_T_y(i, j, k) += (temperature(i, j, k) - temperature(i, j - 1, k)) * f;
1628 bool on_the_wall =
false;
1629 bool on_the_first_cell =
false;
1630 bool on_the_last_cell =
false;
1637 const ArrOfDouble& delta_z_all = geom.
get_delta(DIRECTION_K);
1639 if ((k + k_min == 0 || k + k_min == nk_tot - 1) && (!perio_k))
1642 if (k < grad_T_z.
nk() && (!on_the_wall))
1644 const int jmax = grad_T_z.
nj();
1645 const int imax = grad_T_z.
ni();
1649 f = constant * 2. / (delta_z_all[k - 1 + k_min] + delta_z_all[k + k_min]);
1653 f = (constant / delta_z_all[k + offset]);
1655 for (
int j = 0; j < jmax; j++)
1656 for (
int i = 0; i < imax; i++)
1657 grad_T_z(i, j, k) += (temperature(i, j, k) - temperature(i, j, k - 1)) * f;
1659 else if (k < grad_T_z.
nk() && (on_the_wall))
1662 on_the_first_cell =
true;
1663 if (k + k_min == nk_tot - 1)
1664 on_the_last_cell =
true;
1666 if (on_the_first_cell)
1668 const int jmax = grad_T_z.
nj();
1669 const int imax = grad_T_z.
ni();
1671 if (bctype_kmin == 0)
1673 f = constant * 2. / delta_z_all[k + offset];
1679 for (
int j = 0; j < jmax; j++)
1680 for (
int i = 0; i < imax; i++)
1681 grad_T_z(i, j, 0) += (temperature(i, j, 0) - temperature_kmin) * f;
1687 if (bctype_kmin == 1)
1690 for (
int j = 0; j < jmax; j++)
1691 for (
int i = 0; i < imax; i++)
1693 double l = lambda(i, j, 0);
1694 grad_T_z(i, j, 0) += -flux_kmin / l;
1700 if (on_the_last_cell)
1702 const int jmax = grad_T_z.
nj();
1703 const int imax = grad_T_z.
ni();
1706 if (bctype_kmax == 0)
1708 f = constant * 2. / delta_z_all[k - 1 + offset];
1710 Cerr <<
"IJK_Naviers_Stokes" <<
" " <<
"erreur_dans_le_calcul_du_gradient_de_T" << finl;
1714 for (
int j = 0; j < jmax; j++)
1715 for (
int i = 0; i < imax; i++)
1716 grad_T_z(i, j, k) += (temperature_kmax - temperature(i, j, k - 1)) * f;
1721 if (bctype_kmax == 1)
1724 for (
int j = 0; j < jmax; j++)
1725 for (
int i = 0; i < imax; i++)
1727 double l = lambda(i, j, k - 1);
1728 grad_T_z(i, j, k) += flux_kmax / l;
1737void force_entry_velocity(IJK_Field_double& vx, IJK_Field_double& vy, IJK_Field_double& vz,
double v_imposed,
const int& dir,
const int& compo,
const int& stencil)
1745 double imposed[3] = { v_imposed, v_imposed, v_imposed };
1746 const int direction_min = (compo == -1) ? 0 : dir;
1747 const int direction_max = (compo == -1) ? 3 : dir + 1;
1748 for (
int direction = direction_min; direction < direction_max; direction++)
1750 IJK_Field_double& velocity = select_dir(direction, vx, vy, vz);
1751 const int imin = select_dir(direction, 0, 0, 0);
1752 const int jmin = select_dir(direction, 0, 0, 0);
1753 const int kmin = select_dir(direction, 0, 0, 0);
1754 const int imax = select_dir(direction, stencil, velocity.
ni(), velocity.
ni());
1755 const int jmax = select_dir(direction, velocity.
nj(), stencil, velocity.
nj());
1756 const int kmax = select_dir(direction, velocity.
nk(), velocity.
nk(), stencil);
1757 for (
int k = kmin; k < kmax; k++)
1758 for (
int j = jmin; j < jmax; j++)
1759 for (
int i = imin; i < imax; i++)
1760 velocity(i, j, k) = imposed[direction];
: class Boundary_Conditions_Thermique
BCType get_bctype_k_max() const
double get_temperature_kmin() const
double get_flux_kmax() const
double get_temperature_kmax() const
BCType get_bctype_k_min() const
double get_flux_kmin() 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.
bool get_periodic_flag(int direction) const
Method returns true if periodic in this direction.
double get_domain_length(int direction) const
Returns the length of the entire domain in requested direction.
int get_nb_items_local(Localisation loc, int direction) const
Returns the number of local items (on this processor) for the given localisation in the requested dir...
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.
int get_nb_items_global(Localisation loc, int direction) const
Returns the number of local items (on this processor) for the given localisation in the requested dir...
int get_nb_elem_tot(int direction) const
Returns the total (global) number of mesh cells in requested direction.
void ajouter_second_membre_shear_perio(IJK_Field_double &resu)
void echange_espace_virtuel(int ghost)
Exchange data over "ghost" number of cells.
Domaine_IJK::Localisation get_localisation() const
const Domaine_IJK & get_domaine() const
void echange_espace_virtuel()
int nb_sommets() const
renvoie le nombre de sommets (reels et virtuels) (egal a sommets().
int sommet_virtuel(int i) const
void set_inv_rho(const IJK_Field_template< _TYPE_, _TYPE_ARRAY_ > &inv_rho)
void set_rho(const DoubleVect &rho)
void set_rho_NoSym(const DoubleVect &rho)
void set_inv_rho_NoSym(const IJK_Field_template< _TYPE_, _TYPE_ARRAY_ > &inv_rho)
void resoudre_systeme_IJK(const IJK_Field_template< _TYPE_, _TYPE_ARRAY_ > &rhs, IJK_Field_template< _TYPE_, _TYPE_ARRAY_ > &x)
static bool CHECK_DIVERGENCE
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)