7using namespace viennacore;
20 template <
class V>
static V square(V x) {
return x * x; }
35 Logger::getInstance().addError(
"Invalid finite differences scheme!");
50 Logger::getInstance().addError(
"Invalid finite differences scheme!");
58 static T weno3(
const T *x,
T delta,
bool plus,
T eps = 1e-6) {
60 for (
unsigned i = 0; i < 4; ++i) {
61 dx[i] = x[i + 1] - x[i];
66 T rp = (eps + FiniteDifferences::square(dx[3] - dx[2])) /
67 (eps + FiniteDifferences::square(dx[2] - dx[1]));
68 T wp = 1.0 / (1 + 2.0 * FiniteDifferences::square(rp));
69 result = dx[1] + dx[2] - wp * (dx[3] - 2.0 * dx[2] + dx[1]);
71 T rp = (eps + FiniteDifferences::square(dx[1] - dx[0])) /
72 (eps + FiniteDifferences::square(dx[2] - dx[1]));
73 T wp = 1.0 / (1 + 2.0 * FiniteDifferences::square(rp));
74 result = dx[1] + dx[2] - wp * (dx[0] - 2.0 * dx[1] + dx[2]);
77 return result / (2.0 * delta);
83 static T weno5(
const T *x,
T dx,
bool plus,
T eps = 1e-6) {
86 T v1 = (x[1] - x[0]) / dx;
87 T v2 = (x[2] - x[1]) / dx;
88 T v3 = (x[3] - x[2]) / dx;
89 T v4 = (x[4] - x[3]) / dx;
90 T v5 = (x[5] - x[4]) / dx;
92 T p1 = v1 / 3.0 - 7 * v2 / 6.0 + 11 * v3 / 6.0;
93 T p2 = -v2 / 6.0 + 5 * v3 / 6.0 + v4 / 3.0;
94 T p3 = v3 / 3.0 + 5 * v4 / 6.0 - v5 / 6.0;
96 T s1 = 13 / 12.0 * FiniteDifferences::square(v1 - 2 * v2 + v3) +
97 1 / 4.0 * FiniteDifferences::square(v1 - 4 * v2 + 3 * v3);
98 T s2 = 13 / 12.0 * FiniteDifferences::square(v2 - 2 * v3 + v4) +
99 1 / 4.0 * FiniteDifferences::square(v2 - v4);
100 T s3 = 13 / 12.0 * FiniteDifferences::square(v3 - 2 * v4 + v5) +
101 1 / 4.0 * FiniteDifferences::square(3 * v3 - 4 * v4 + v5);
103 T al1 = 0.1 / (eps + s1);
104 T al2 = 0.6 / (eps + s2);
105 T al3 = 0.3 / (eps + s3);
107 T alsum = al1 + al2 + al3;
113 return w1 * p1 + w2 * p2 + w3 * p3;
115 T v1 = (x[6] - x[5]) / dx;
116 T v2 = (x[5] - x[4]) / dx;
117 T v3 = (x[4] - x[3]) / dx;
118 T v4 = (x[3] - x[2]) / dx;
119 T v5 = (x[2] - x[1]) / dx;
121 T p1 = v1 / 3.0 - 7 * v2 / 6.0 + 11 * v3 / 6.0;
122 T p2 = -v2 / 6.0 + 5 * v3 / 6.0 + v4 / 3.0;
123 T p3 = v3 / 3.0 + 5 * v4 / 6.0 - v5 / 6.0;
125 T s1 = 13 / 12.0 * FiniteDifferences::square(v1 - 2 * v2 + v3) +
126 1 / 4.0 * FiniteDifferences::square(v1 - 4 * v2 + 3 * v3);
127 T s2 = 13 / 12.0 * FiniteDifferences::square(v2 - 2 * v3 + v4) +
128 1 / 4.0 * FiniteDifferences::square(v2 - v4);
129 T s3 = 13 / 12.0 * FiniteDifferences::square(v3 - 2 * v4 + v5) +
130 1 / 4.0 * FiniteDifferences::square(3 * v3 - 4 * v4 + v5);
132 T al1 = 0.1 / (eps + s1);
133 T al2 = 0.6 / (eps + s2);
134 T al3 = 0.3 / (eps + s3);
136 T alsum = al1 + al2 + al3;
142 return w1 * p1 + w2 * p2 + w3 * p3;
155 return (values[1] - values[0]) / delta;
158 Logger::getInstance().addError(
"Second order scheme not implemented!");
161 return weno3(values, delta,
false);
163 return weno5(values, delta,
false);
165 Logger::getInstance().addError(
"Invalid finite differences scheme!");
178 return (values[2] - values[1]) / delta;
181 Logger::getInstance().addError(
"Seconed order scheme not implemented!");
184 return weno3(values, delta,
true);
186 return weno5(values, delta,
true);
188 Logger::getInstance().addError(
"Invalid finite differences scheme!");
static T differencePositive(const T *values, const double &delta)
Definition lsFiniteDifferences.hpp:176
static constexpr unsigned getNumberOfValues()
Definition lsFiniteDifferences.hpp:40
static T weno5(const T *x, T dx, bool plus, T eps=1e-6)
Definition lsFiniteDifferences.hpp:83
static T calculateGradient(const T *values, const double &delta)
Definition lsFiniteDifferences.hpp:198
FiniteDifferences()=default
static T differenceNegative(const T *values, const double &delta)
Definition lsFiniteDifferences.hpp:153
static T calculateGradientDiff(const T *values, const double &delta)
Definition lsFiniteDifferences.hpp:204
static T weno3(const T *x, T delta, bool plus, T eps=1e-6)
Weighted essentially non-oscillatory differentiation scheme 3rd order x1 ... x5 stencil points from l...
Definition lsFiniteDifferences.hpp:58
static unsigned getNumberOfValues(DifferentiationSchemeEnum s)
Definition lsFiniteDifferences.hpp:25
Definition lsCurvatureFormulas.hpp:9
DifferentiationSchemeEnum
Definition lsFiniteDifferences.hpp:10
@ FIRST_ORDER
Definition lsFiniteDifferences.hpp:11
@ WENO3
Definition lsFiniteDifferences.hpp:13
@ SECOND_ORDER
Definition lsFiniteDifferences.hpp:12
@ WENO5
Definition lsFiniteDifferences.hpp:14
double T
Definition pyWrap.cpp:68