15#ifndef OpConvCentre4IJK_TPP_included
16#define OpConvCentre4IJK_TPP_included
18#include <OpConvCentre4IJK.h>
20#ifndef OpConvCentre4IJK_included
21#error __FILE__ should only be included from corresponding header
24#include <ConstIJK_ptr.h>
25#include <Domaine_IJK.h>
27#include <IJK_Field_local_template.h>
28#include <IJK_Field_template.h>
30#include <Operateur_IJK_base.h>
31#include <Simd_template.h>
36template <DIRECTION _DIR_>
37void OpConvCentre4IJK_double::exec_after_divergence_flux_(IJK_Field_double& resu,
const int k_layer)
42 if (_DIR_==DIRECTION::Z)
44 const int global_k_layer = k_layer +
channel_data_.offset_to_global_k_layer();
47 const int first_global_k_layer = 0;
50 if (!
perio_k_ && (global_k_layer <= first_global_k_layer || global_k_layer >= last_global_k_layer))
62 ConstIJK_double_ptr vitesse(
get_v(_DIR_), 0, 0, k_layer);
63 ConstIJK_double_ptr div_rhou(*
div_rho_u_, 0, 0, k_layer);
64 IJK_double_ptr resu_ptr(resu, 0, 0, k_layer);
66 const int nx = resu.
ni();
67 const int ny = resu.
nj();
72 for (
int j = 0; ; j++)
74 for (
int i = 0; i < imax; i += vsize)
76 Simd_double v, x_left, x_right;
77 vitesse.get_center(i, v);
80 div_rhou.get_left_center(_DIR_, i, x_left, x_right);
85 resu_ptr.get_center(i, a);
86 a += (x_left + x_right) * 0.5 * v;
87 resu_ptr.put_val(i, a);
106template <DIRECTION _DIR_, DIRECTION _VCOMPO_>
107void OpConvCentre4IJK_double::compute_flux_(IJK_Field_local_double& resu,
const int k_layer)
110 const IJK_Field_local_double& src =
get_input(_VCOMPO_);
112 ConstIJK_double_ptr src_ptr(src, 0, 0, k_layer);
114 ConstIJK_double_ptr vconv_ptr(
get_v(_DIR_), 0, 0, k_layer);
116 const int idir = (int)_DIR_;
117 const int nx = _DIR_ == DIRECTION::X ? src.
ni() + 1 : src.
ni();
118 const int ny = _DIR_ == DIRECTION::Y ? src.
nj() + 1 : src.
nj();
119 const int icompo = (int)_VCOMPO_;
122 IJK_double_ptr resu_ptr(resu, 0, 0, 0);
124 const int global_k_layer = k_layer +
channel_data_.offset_to_global_k_layer();
127 const int first_global_k_layer =
channel_data_.first_global_k_layer_flux(icompo, idir);
128 const int last_global_k_layer =
channel_data_.last_global_k_layer_flux(icompo, idir);
133 if (!
perio_k_ && (global_k_layer <= first_global_k_layer || global_k_layer >= last_global_k_layer))
142 double g1, g2, g3, g4;
143 double constant_factor0, constant_factor1;
145 channel_data_.get_surface_leftright(k_layer, icompo, idir, constant_factor1, constant_factor0);
146 constant_factor0 *= 0.5;
147 constant_factor1 *= 0.5;
149 if (_DIR_ != DIRECTION::Z ||
channel_data_.is_k_uniform_and_periodic())
160 g1 =
get_g(k_layer,icompo,idir,0);
161 g2 =
get_g(k_layer,icompo,idir,1);
162 g3 =
get_g(k_layer,icompo,idir,2);
163 g4 =
get_g(k_layer,icompo,idir,3);
170 for (
int j = 0; ; j++)
172 for (
int i = 0; i < imax; i += vsize)
174 Simd_double vit_0_0,vit_0,vit_1,vit_1_1;
175 src_ptr.get_leftleft_left_center_right(_DIR_,i,vit_0_0,vit_0,vit_1,vit_1_1);
177 Simd_double order4_velocity = g1 * vit_0_0 + g2 * vit_0 + g3 * vit_1 + g4 * vit_1_1;
182 Simd_double vconv0, vconv1;
183 vconv_ptr.get_left_center(_VCOMPO_,i, vconv0, vconv1);
185 Simd_double psc = vconv0 * constant_factor0 + vconv1 * constant_factor1;
187 Simd_double flux_conv = order4_velocity * psc;
189 resu_ptr.put_val(i, flux_conv);
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...
const Domaine_IJK & get_domaine() const
double get_g(int k_layer, int compo, int dir, int g_index) const
IJK_Field_double * div_rho_u_
int last_computed_klayer_for_div_rhou_
const IJK_Field_double & get_input(DIRECTION _DIR_)
const IJK_Field_double & get_v(DIRECTION _DIR_)
Operateur_IJK_data_channel channel_data_
const IJK_Field_double * inputy_
const IJK_Field_double * inputz_
const IJK_Field_double * inputx_