16#ifndef OpConvAmontIJK_TPP_included
17#define OpConvAmontIJK_TPP_included
19#include <OpConvAmontIJK.h>
21#ifndef OpConvAmontIJK_included
22#error __FILE__ should only be included from corresponding header
26#include <Simd_template.h>
28#include <ConstIJK_ptr.h>
29#include <IJK_Field_local_template.h>
30#include <Operateur_IJK_base.h>
37template <DIRECTION _DIR_, DIRECTION _VCOMPO_>
38void OpConvAmontIJK_double::compute_flux_(IJK_Field_local_double& resu,
const int k_layer)
41 const IJK_Field_local_double& src =
get_input(_VCOMPO_);
43 ConstIJK_double_ptr src_ptr(src, 0, 0, k_layer);
45 ConstIJK_double_ptr vconv_ptr(
get_v(_DIR_), 0, 0, k_layer);
47 const int idir = (int)_DIR_;
48 const int nx = _DIR_ == DIRECTION::X ? src.
ni() + 1 : src.
ni();
49 const int ny = _DIR_ == DIRECTION::Y ? src.
nj() + 1 : src.
nj();
50 const int icompo = (int)_VCOMPO_;
53 IJK_double_ptr resu_ptr(resu, 0, 0, 0);
55 const int global_k_layer = k_layer +
channel_data_.offset_to_global_k_layer();
58 const int first_global_k_layer =
channel_data_.first_global_k_layer_flux(icompo, idir);
59 const int last_global_k_layer =
channel_data_.last_global_k_layer_flux(icompo, idir);
63 if (!
perio_k_ && (global_k_layer <= first_global_k_layer || global_k_layer >= last_global_k_layer))
70 double half_surface =
channel_data_.get_surface(k_layer, icompo, idir) * 0.5;
75 for (
int j = 0; ; j++)
77 for (
int i = 0; i < imax; i += vsize)
79 Simd_double vit_0,vit_1;
80 src_ptr.get_left_center(_DIR_,i,vit_0,vit_1);
82 Simd_double vconv0, vconv1;
83 vconv_ptr.get_left_center(_VCOMPO_, i, vconv0, vconv1);
86 Simd_double psc = (vconv0 + vconv1) * half_surface;
87 Simd_double upwind_velocity = SimdSelect<double>(psc, 0., vit_1 , vit_0 );
88 Simd_double flux = psc * upwind_velocity;
89 resu_ptr.put_val(i, flux);
const IJK_Field_double & get_input(DIRECTION _DIR_)
const IJK_Field_double & get_v(DIRECTION _DIR_)
Operateur_IJK_data_channel channel_data_