16#ifndef OpConvQuickSharpIJK_TPP_included
17#define OpConvQuickSharpIJK_TPP_included
19#include <OpConvQuickSharpIJK.h>
21#ifndef OpConvQuickSharpIJK_included
22#error __FILE__ should only be included from corresponding header
25inline double sharp(
const double utc)
34 cf = 0.25 * (1. - utc);
38 cf = 0.25 * (utc - 1.);
47 cf = 0.5 - 0.625*sqrt(utc);
64inline double conv_quick_sharp_plus(
const double psc,
const double vit_0,
const double vit_1,
65 const double vit_0_0,
const double dx,
66 const double dm,
const double dxam)
70 double delta_0 = vit_0 - vit_0_0;
71 double delta = vit_1 - vit_0;
75 curv = (delta/dx - delta_0/dxam)/dm ;
79 delta_delta = delta_0+delta;
80 dd1 = std::fabs(delta_delta);
85 utc = delta_0/delta_delta;
89 return (0.5*(vit_0 + vit_1) - cf*(dx*dx)*curv)*psc;
93inline double conv_quick_sharp_moins(
const double psc,
const double vit_0,
const double vit_1,
94 const double vit_1_1,
const double dx,
95 const double dm,
const double dxam)
99 double delta_1 = vit_1_1 - vit_1;
100 double delta = vit_1 - vit_0;
104 curv = ( delta_1/dxam - delta/dx )/dm ;
108 delta_delta = delta_1+delta;
109 dd1 = std::fabs(delta_delta);
114 utc = delta_1/delta_delta;
118 return (0.5*(vit_0 + vit_1) - cf*(dx*dx)*curv)*psc;
127template <DIRECTION _DIR_, DIRECTION _VCOMPO_>
128void OpConvQuickSharpIJK_double::compute_flux_(IJK_Field_local_double& resu,
const int k_layer)
131 const IJK_Field_local_double& src =
get_input(_VCOMPO_);
133 ConstIJK_double_ptr src_ptr(src, 0, 0, k_layer);
135 ConstIJK_double_ptr vconv_ptr(
get_v(_DIR_), 0, 0, k_layer);
137 const int idir = (int)_DIR_;
138 const int nx = _DIR_ == DIRECTION::X ? src.
ni() + 1 : src.
ni();
139 const int ny = _DIR_ == DIRECTION::Y ? src.
nj() + 1 : src.
nj();
140 const int icompo = (int)_VCOMPO_;
143 IJK_double_ptr resu_ptr(resu, 0, 0, 0);
146 const int global_k_layer = k_layer +
channel_data_.offset_to_global_k_layer();
149 const int first_global_k_layer =
channel_data_.first_global_k_layer_flux(icompo, idir);
150 const int last_global_k_layer =
channel_data_.last_global_k_layer_flux(icompo, idir);
159 if (!
perio_k_ && (global_k_layer <= first_global_k_layer || global_k_layer >= last_global_k_layer))
166 const double half_surface =
channel_data_.get_surface(k_layer, icompo, idir) * 0.5;
167 const double delta = get_delta(_DIR_);
169 for (
int j = 0; j < ny; j++)
171 for (
int i = 0; i < nx; i++)
174 double vconv0, vconv1;
175 vconv_ptr.get_left_center(_VCOMPO_,i, vconv0, vconv1);
176 double psc = (vconv0 + vconv1) * half_surface;
177 double vit_0_0,vit_0,vit_1,vit_1_1;
178 src_ptr.get_leftleft_left_center_right(_DIR_,i,vit_0_0,vit_0,vit_1,vit_1_1);
182 flux = conv_quick_sharp_plus(psc, vit_0, vit_1, vit_0_0, delta, delta, delta);
186 flux = conv_quick_sharp_moins(psc, vit_0, vit_1, vit_1_1, delta, delta, delta);
188 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_