Virtual Testbed
Ship dynamics simulator for extreme conditions
core/derivative.hh
1 #ifndef VTESTBED_CORE_DERIVATIVE_HH
2 #define VTESTBED_CORE_DERIVATIVE_HH
3 
4 #include <vtestbed/core/types.hh>
5 
6 namespace vtb {
7 
8  namespace core {
9 
10  template <class T, int N>
11  void
12  derivative(
13  Array<T,N> func,
14  const T delta,
15  int dimension,
16  Array<T,N>& result
17  );
18 
19  template <class T, int N>
20  inline Array<T,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);
24  return result;
25  }
26 
27  template <class T, int N>
28  T
29  derivative(
30  const blitz::TinyVector<int,N>& idx,
31  int idx_min,
32  int idx_max,
33  int dimension,
34  const T delta,
35  const Array<T,N>& func
36  ) {
37  typedef blitz::TinyVector<int,N> intN;
38  const int idx_d = idx(dimension);
39  T result;
40  if (idx_d == idx_min) {
47  intN idx1(idx);
48  ++idx1(dimension);
49  intN idx2(idx1);
50  ++idx2(dimension);
51  result = T(0.5)
52  * (-func(idx2) + T(4)*func(idx1) - T(3)*func(idx))
53  / delta;
54  } else if (idx_d == idx_max) {
61  intN idx1(idx);
62  --idx1(dimension);
63  intN idx2(idx1);
64  --idx2(dimension);
65  result = T(0.5)
66  * (T(3)*func(idx) - T(4)*func(idx1) + func(idx2))
67  / delta;
68  } else {
75  intN idx0(idx);
76  --idx0(dimension);
77  intN idx1(idx);
78  ++idx1(dimension);
79  result = T(0.5)
80  * (func(idx1) - func(idx0))
81  / delta;
82  }
83  return result;
84  }
85 
86  template <class T, int N>
87  T
88  derivative(
89  const blitz::TinyVector<int,N>& idx,
90  int dimension,
91  const T delta,
92  const Array<T,N>& func
93  ) {
94  return ::vtb::core::derivative<T,N>(
95  idx, 0, func.extent(dimension)-1, dimension, delta, func
96  );
97  }
98 
99  template <class T, int N>
100  blitz::TinyVector<T,N>
101  gradient(
102  const blitz::TinyVector<int,N>& idx,
103  const blitz::TinyVector<T,N>& delta,
104  const Array<T,N>& func
105  ) {
106  blitz::TinyVector<T,N> result;
107  for (int i=0; i<N; ++i) {
108  result(i) = derivative(idx, i, delta(i), func);
109  }
110  return result;
111  }
112 
113  template <class T>
114  blitz::TinyVector<T,4>
115  gradient(
116  const blitz::TinyVector<int,4>& idx,
117  const blitz::TinyVector<T,4>& delta,
118  const Array<T,4>& func
119  ) {
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);
125  return result;
126  }
127 
128  }
129 
130 }
131 
132 #endif // vim:filetype=cpp
Main namespace.
Definition: convert.hh:9