23#ifndef CPU_FACE_ESTIMATES_H
24#define CPU_FACE_ESTIMATES_H
49 + 29.0 * values[
k - 3]
50 - 139.0 * values[
k - 2]
51 + 533.0 * values[
k - 1]
53 - 139.0 * values[
k + 1]
54 + 29.0 * values[
k + 2]
55 - 3.0 * values[
k + 3]);
71 - 119.0 * values[
k - 3]
72 + 889.0 * values[
k - 2]
73 - 7175.0 * values[
k - 1]
75 - 889.0 * values[
k + 1]
76 + 119.0 * values[
k + 2]
77 - 9.0 * values[
k + 3]);
92 fv_l = 1.0/60.0 * (values[
k - 3]
94 + 37.0 * values[
k - 1]
111 fd_l = 1.0/180.0 * (245 * (values[
k] - values[
k - 1])
112 - 25 * (values[
k + 1] - values[
k - 2])
113 + 2 * (values[
k + 2] - values[
k - 3]));
126 fv_l = 1.0/60.0 * (- 3.0 * values[
k - 2]
127 + 27.0 * values[
k - 1]
129 - 13.0 * values[
k + 1]
130 + 2.0 * values[
k + 2]);
131 fv_r = 1.0/60.0 * ( 2.0 * values[
k - 2]
132 - 13.0 * values[
k - 1]
134 + 27.0 * values[
k + 1]
135 - 3.0 * values[
k + 2]);
148 fd_l = 1.0/12.0 * (15.0 * (values[
k] - values[
k - 1]) - (values[
k + 1] - values[
k - 2]));
163 fv_l = 1.0/12.0 * ( - 1.0 * values[
k - 2]
164 + 7.0 * values[
k - 1]
166 - 1.0 * values[
k + 1]);
182 1.0 / ( h[
k - 2] + h[
k - 1] + h[
k] + h[
k + 1] )
183 * ( ( h[
k - 2] + h[
k - 1] ) * ( h[
k] + h[
k + 1] ) / ( h[
k - 1] + h[
k] )
184 * ( u[
k - 1] * h[
k] + u[
k] * h[
k - 1] )
185 * (1.0 / ( h[
k - 2] + h[
k - 1] + h[
k] ) + 1.0 / ( h[
k - 1] + h[
k] + h[
k + 1] ) )
186 + ( h[
k] * ( h[
k] + h[
k + 1] ) ) / ( ( h[
k - 2] + h[
k - 1] + h[
k] ) * (h[
k - 2] + h[
k - 1] ) )
187 * ( u[
k - 1] * (h[
k - 2] + 2.0 * h[
k - 1] ) - ( u[
k - 2] * h[
k - 1] ) )
188 + h[
k - 1] * ( h[
k - 2] + h[
k - 1] ) / ( ( h[
k - 1] + h[
k] + h[
k + 1] ) * ( h[
k] + h[
k + 1] ) )
189 * ( u[
k] * ( 2.0 * h[
k] + h[
k + 1] ) - u[
k + 1] * h[
k] ) )
207 fv_l = 1.0/12.0 * (15 * (values[
k] - values[
k - 1]) - (values[
k + 1] - values[
k - 2]));
244 Vec slope_abs,slope_sign;
247 slope_limiter(values[
k -1]*scale, values[
k]*scale, values[
k + 1]*scale, slope_abs, slope_sign);
250 Vecb is_extrema = (slope_abs == Vec(0.0));
252 fv_r =
select(is_extrema, values[
k], fv_r);
253 fv_l =
select(is_extrema, values[
k], fv_l);
254 fd_l =
select(is_extrema, 0.0 , fd_l);
255 fd_r =
select(is_extrema, 0.0 , fd_r);
258 Vecb filter = (values[
k -1] - fv_l) * (fv_l - values[
k]) < 0 || slope_sign * fd_l < 0.0;
261 fv_l=
select(filter, values[
k ] - slope_sign * 0.5 * slope_abs, fv_l);
262 fd_l=
select(filter, slope_sign * slope_abs, fd_l);
265 filter = (values[
k + 1] - fv_r) * (fv_r - values[
k]) < 0 || slope_sign * fd_r < 0.0;
268 fv_r=
select(filter, values[
k] + slope_sign * 0.5 * slope_abs, fv_r);
269 fd_r=
select(filter, slope_sign * slope_abs, fd_r);
299 Vec slope_abs, slope_sign;
302 slope_limiter(values[
k -1]*scale, values[
k]*scale, values[
k + 1]*scale, slope_abs, slope_sign);
306 Vecb is_extrema = (slope_abs == Vec(0.0));
308 fv_r =
select(is_extrema, values[
k], fv_r);
309 fv_l =
select(is_extrema, values[
k], fv_l);
312 Vecb filter = (values[
k -1] - fv_l) * (fv_l - values[
k]) < 0 ;
315 fv_l =
select(filter, values[
k ] - slope_sign * 0.5 * slope_abs, fv_l);
318 filter = (values[
k + 1] - fv_r) * (fv_r - values[
k]) < 0;
321 fv_r =
select(filter, values[
k] + slope_sign * 0.5 * slope_abs, fv_r);
345 printf(
"Order %d has not been implemented (yet)\n",order);
348 Vec slope_abs,slope_sign;
352 slope_limiter(values[
k -1]*scale, values[
k]*scale, values[
k + 1]*scale, slope_abs, slope_sign);
355 slope_limiter(values[
k -1], values[
k], values[
k + 1], slope_abs, slope_sign);
359 Vecb is_extrema = (slope_abs == Vec(0.0));
361 fv_r =
select(is_extrema, values[
k], fv_r);
362 fv_l =
select(is_extrema, values[
k], fv_l);
366 Vecb filter = (values[
k -1] - fv_l) * (fv_l - values[
k]) < 0 ;
369 fv_l=
select(filter, values[
k ] - slope_sign * 0.5 * slope_abs, fv_l);
373 filter = (values[
k + 1] - fv_r) * (fv_r - values[
k]) < 0;
376 fv_r=
select(filter, values[
k] + slope_sign * 0.5 * slope_abs, fv_r);
380inline Vec
get_D2aLim(
const Realf * h,
const Vec * values,
const uint
k,
const Vec C,
const Vec & fv) {
383 Vec invh2 = 1.0 / (h[
k] * h[
k]);
384 Vec d2a = invh2 * 3.0 * (values[
k] - 2.0 * fv + values[
k + 1]);
385 Vec d2aL = invh2 * (values[
k - 1] - 2.0 * values[
k] + values[
k + 1]);
386 Vec d2aR = invh2 * (values[
k] - 2.0 * values[
k + 1] + values[
k + 2]);
400 Vec invh2 = 1.0 / (h[
k] * h[
k]);
403 Vec p_face = 0.5 * (values[
k] + values[
k + 1])
405 Vec m_face = 0.5 * (values[
k-1] + values[
k])
409 Vec d2a = -2.0 * invh2 * 6.0 * (values[
k] - 3.0 * (m_face + p_face));
410 Vec d2aC = invh2 * (values[
k - 1] - 2.0 * values[
k ] + values[
k + 1]);
413 Vec d2aL = invh2 * (values[
k - 2] - 2.0 * values[
k - 1] + values[
k ]);
414 Vec d2aR = invh2 * (values[
k ] - 2.0 * values[
k + 1] + values[
k + 2]);
432 fv_r = values[
k] + (p_face - values[
k]) * d2aLim / d2a;
433 fv_l = values[
k] + (m_face - values[
k]) * d2aLim / d2a;
455 printf(
"Order %d has not been implemented (yet)\n",order);
459 Vec slope_abs,slope_sign;
463 slope_limiter(values[
k -1]*scale, values[
k]*scale, values[
k + 1]*scale, slope_abs, slope_sign);
466 slope_limiter(values[
k -1], values[
k], values[
k + 1], slope_abs, slope_sign);
476 &&
horizontal_or((values[
k - 1] - values[
k]) * (values[
k] - values[
k + 1]) <= Vec(0.0))) {
484 Vecb filter = (values[
k -1] - fv_l) * (fv_l - values[
k]) < 0 ;
487 fv_l=
select(filter, values[
k ] - slope_sign * 0.5 * slope_abs, fv_l);
491 filter = (values[
k + 1] - fv_r) * (fv_r - values[
k]) < 0;
494 fv_r=
select(filter, values[
k] + slope_sign * 0.5 * slope_abs, fv_r);
void compute_filtered_face_values_derivatives(const Vec *const values, const uint k, const face_estimate_order order, Vec &fv_l, Vec &fv_r, Vec &fd_l, Vec &fd_r, const Realf threshold)
void compute_h7_left_face_derivative(const Vec *const values, uint k, Vec &fd_l)
void compute_h4_left_face_value_nonuniform(const Realf *const h, const Vec *const u, uint k, Vec &fv_l)
void compute_filtered_face_values_nonuniform_conserving(const Realf *const dv, const Vec *const values, const uint k, const face_estimate_order order, Vec &fv_l, Vec &fv_r, const Realf threshold)
void compute_h6_left_face_value(const Vec *const values, uint k, Vec &fv_l)
void compute_h5_face_values(const Vec *const values, uint k, Vec &fv_l, Vec &fv_r)
void compute_h5_left_face_derivative(const Vec *const values, uint k, Vec &fd_l)
void compute_h4_left_face_value(const Vec *const values, uint k, Vec &fv_l)
void compute_filtered_face_values(const Vec *const values, const uint k, const face_estimate_order order, Vec &fv_l, Vec &fv_r, const Realf threshold)
void compute_h8_left_face_value(const Vec *const values, uint k, Vec &fv_l)
Vec get_D2aLim(const Realf *h, const Vec *values, const uint k, const Vec C, const Vec &fv)
void compute_h4_left_face_derivative(const Vec *const values, uint k, Vec &fd_l)
void compute_h3_left_face_derivative(const Vec *const values, uint k, Vec &fv_l)
void constrain_face_values(const Realf *h, const Vec *values, const uint k, Vec &fv_l, Vec &fv_r)
void compute_filtered_face_values_nonuniform(const Realf *const dv, const Vec *const values, const uint k, const face_estimate_order order, Vec &fv_l, Vec &fv_r, const Realf threshold)
__global__ void vmesh::VelocityMesh **__restrict__ ColumnOffsets split::SplitVector< vmesh::GlobalID > Hashinator::Hashmap< vmesh::GlobalID, vmesh::LocalID > const uint *__restrict__ const Realf const int const int const Realf const Realf dv
__global__ void const Realf const uint *__restrict__ const uint *__restrict__ const vmesh::GlobalID *__restrict__ const uint const uint const uint const Realf threshold
Real slope_limiter(const Real &l, const Real &m, const Real &r)
An interface to a type with floating point values.
static ARCH_HOSTDEV VecSimple< T > min(VecSimple< T > const &l, VecSimple< T > const &r)
static ARCH_HOSTDEV bool horizontal_or(VecSimple< T > const &a)
static ARCH_HOSTDEV VecSimple< T > select(VecSimple< bool > const &a, VecSimple< T > const &b, VecSimple< T > const &c)
static ARCH_HOSTDEV VecSimple< T > abs(const VecSimple< T > &l)
static ARCH_HOSTDEV bool horizontal_and(VecSimple< T > const &a)