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) {
65 T N = eps + FiniteDifferences::square(d[2] - d[1]);
66 T D = eps + FiniteDifferences::square(d[1] - d[0]);
68 T wp = D2 / (D2 + 2 * N * N);
70 return (d[0] + d[1] - wp * (d[2] - 2 * d[1] + d[0])) / (2 * delta);
76 T N = eps + FiniteDifferences::square(d[1] - d[0]);
77 T D = eps + FiniteDifferences::square(d[2] - d[1]);
79 T wp = D2 / (D2 + 2 * N * N);
81 return (d[1] + d[2] - wp * (d[0] - 2 * d[1] + d[2])) / (2 * delta);
88 static T weno5(
const T *x,
T dx,
bool plus,
T eps = 1e-6) {
92 for (
int i = 0; i < 5; ++i)
93 d[i] = x[i + 1] - x[i];
95 for (
int i = 0; i < 5; ++i)
96 d[i] = x[6 - i] - x[5 - i];
100 T s1 =
T(13.0 / 12.0) * FiniteDifferences::square(d[0] - 2 * d[1] + d[2]) +
101 T(1.0 / 4.0) * FiniteDifferences::square(d[0] - 4 * d[1] + 3 * d[2]);
102 T s2 =
T(13.0 / 12.0) * FiniteDifferences::square(d[1] - 2 * d[2] + d[3]) +
103 T(1.0 / 4.0) * FiniteDifferences::square(d[1] - d[3]);
104 T s3 =
T(13.0 / 12.0) * FiniteDifferences::square(d[2] - 2 * d[3] + d[4]) +
105 T(1.0 / 4.0) * FiniteDifferences::square(3 * d[2] - 4 * d[3] + d[4]);
108 T eps_scaled = eps * dx * dx;
110 T al1 =
T(0.1) / (eps_scaled + s1);
111 T al2 =
T(0.6) / (eps_scaled + s2);
112 T al3 =
T(0.3) / (eps_scaled + s3);
114 T alsum = al1 + al2 + al3;
117 T p1 =
T(1.0 / 6.0) * (2 * d[0] - 7 * d[1] + 11 * d[2]);
118 T p2 =
T(1.0 / 6.0) * (-d[1] + 5 * d[2] + 2 * d[3]);
119 T p3 =
T(1.0 / 6.0) * (2 * d[2] + 5 * d[3] - d[4]);
122 return (al1 * p1 + al2 * p2 + al3 * p3) / (alsum * dx);
134 return (values[1] - values[0]) / delta;
137 Logger::getInstance().addError(
"Second order scheme not implemented!");
140 return weno3(values, delta,
false);
142 return weno5(values, delta,
false);
144 Logger::getInstance().addError(
"Invalid finite differences scheme!");
157 return (values[2] - values[1]) / delta;
160 Logger::getInstance().addError(
"Second order scheme not implemented!");
163 return weno3(values, delta,
true);
165 return weno5(values, delta,
true);
167 Logger::getInstance().addError(
"Invalid finite differences scheme!");
constexpr int D
Definition Epitaxy.cpp:11
double T
Definition Epitaxy.cpp:12
static T differencePositive(const T *values, const double &delta)
Definition lsFiniteDifferences.hpp:155
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:88
static T calculateGradient(const T *values, const double &delta)
Definition lsFiniteDifferences.hpp:177
FiniteDifferences()=default
static T differenceNegative(const T *values, const double &delta)
Definition lsFiniteDifferences.hpp:132
static T calculateGradientDiff(const T *values, const double &delta)
Definition lsFiniteDifferences.hpp:183
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 lsAdvectIntegrationSchemes.hpp:41
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