1 #ifndef VTESTBED_CORE_DERIVATIVE_HH 2 #define VTESTBED_CORE_DERIVATIVE_HH 4 #include <vtestbed/core/types.hh> 10 template <
class T,
int N>
19 template <
class T,
int N>
21 derivative(Array<T, N> func,
const T delta,
int dimension) {
22 Array<T,N> result{func.shape()};
23 ::vtb::core::derivative<T,N>(func, delta, dimension, result);
27 template <
class T,
int N>
30 const blitz::TinyVector<int,N>& idx,
35 const Array<T,N>& func
37 typedef blitz::TinyVector<int,N> intN;
38 const int idx_d = idx(dimension);
40 if (idx_d == idx_min) {
52 * (-func(idx2) + T(4)*func(idx1) - T(3)*func(idx))
54 }
else if (idx_d == idx_max) {
66 * (T(3)*func(idx) - T(4)*func(idx1) + func(idx2))
80 * (func(idx1) - func(idx0))
86 template <
class T,
int N>
89 const blitz::TinyVector<int,N>& idx,
92 const Array<T,N>& func
94 return ::vtb::core::derivative<T,N>(
95 idx, 0, func.extent(dimension)-1, dimension, delta, func
99 template <
class T,
int N>
100 blitz::TinyVector<T,N>
102 const blitz::TinyVector<int,N>& idx,
103 const blitz::TinyVector<T,N>& delta,
104 const Array<T,N>& func
106 blitz::TinyVector<T,N> result;
107 for (
int i=0; i<N; ++i) {
108 result(i) = derivative(idx, i, delta(i), func);
114 blitz::TinyVector<T,4>
116 const blitz::TinyVector<int,4>& idx,
117 const blitz::TinyVector<T,4>& delta,
118 const Array<T,4>& func
120 blitz::TinyVector<T,4> result;
121 result(0) = derivative(idx, 0, delta(0), func);
122 result(1) = derivative(idx, 1, delta(1), func);
123 result(2) = derivative(idx, 2, delta(2), func);
124 result(3) = derivative(idx, 3, delta(3), func);
132 #endif // vim:filetype=cpp