FiberVISH 0.2
Fish - The Fiber Bundle API for the Vish Visualization Shell
FiniteDifferences.hpp
1#ifndef __FIBER_FINITE_DIFFERENCING_HPP
2#define __FIBER_FINITE_DIFFERENCING_HPP
3
4#include <eagle/Vector.hpp>
5#include "MultiArray.hpp"
6#include "MultiOperate.hpp"
7
8namespace Fiber
9{
10
19template <class ResultType>
21{
22 template <Dims_t Dims, class DifferenceType>
23static void assign( MultiArray<Dims, ResultType>&result,
24 const MultiIndex<Dims>&Index,
25 int EvalDim,
26 const DifferenceType&DT)
27 {
28 result [ Index ][ EvalDim ] = DT;
29 }
30};
31
40template <>
42{
43 template <Dims_t Dims, class DifferenceType>
44static void assign( MultiArray<Dims, double>&result,
45 const MultiIndex<Dims>&Index,
46 int EvalDim,
47 const DifferenceType&DT)
48 {
49 result [ Index ] = DT;
50 }
51};
52
53
54/*
55template <class ValueType>
56struct FiniteDifferenceDifferentionTrait
57{
58static auto difference(const ValueType&L, const ValueType&R)
59 {
60 return L - R;
61 }
62};
63*/
64
65
66#if 0
67
68/* @ingroup marray
69 Compute Finite Differences along one line within
70 a multidimensional array in the given index.
71 The evaluation dimension is given at runtime.
72 Not sure if we need this.
73 @note Internal use only.
74 */
75template <Dims_t Dims, typename Value, typename ResultType>
77FiniteDifference( MultiArray<Dims, ResultType>&result,
78 const MultiArray<Dims, Value>&ValueField,
79 const MultiIndex<Dims>&Index,
80 int EvalDimension)
81{
82const MultiIndex<Dims>&Sz = ValueField.Size();
83
84 if (Sz[EvalDimension] < 2)
85 {
86// throw something ?
87 return result;
88 }
89
90MultiIndex<Dims> StartIndex = Index,
91 MiddleIndex = Index,
92 EndIndex = Index;
93
94 {
95 StartIndex[ EvalDimension ] = 0;
96 EndIndex [ EvalDimension ] = 1;
97
98 FiniteDifferenceTrait<ResultType>::assign( result,
99 StartIndex, EvalDimension,
100 ValueField[ EndIndex ] - ValueField[ StartIndex ] );
101
102// result[ StartIndex ][EvalDimension] = ValueField[ EndIndex ] - ValueField[ StartIndex ];
103 }
104
105 for(index_t i=1; i<Sz[EvalDimension]-1; i++)
106 {
107 StartIndex [ EvalDimension ] = i-1;
108 MiddleIndex[ EvalDimension ] = i ;
109 EndIndex [ EvalDimension ] = i+1;
110
111 FiniteDifferenceTrait<ResultType>::assign( result,
112 MiddleIndex, EvalDimension,
113 0.5*(ValueField[ EndIndex ] - ValueField[ StartIndex ]) );
114
115
116// result[ MiddleIndex ][EvalDimension] = 0.5*(ValueField[ EndIndex ] - ValueField[ StartIndex ] );
117 }
118
119 {
120 StartIndex[ EvalDimension ] = Sz[EvalDimension]-2;
121 EndIndex [ EvalDimension ] = Sz[EvalDimension]-1;
122
123 FiniteDifferenceTrait<ResultType>::assign( result,
124 EndIndex, EvalDimension,
125 ValueField[ EndIndex ] - ValueField[ StartIndex ] );
126
127// result[ EndIndex ][EvalDimension] = ValueField[ EndIndex ] - ValueField[ StartIndex ];
128 }
129
130
131 return result;
132}
133
134
135template <Dims_t Dims, typename Value, typename ResultType>
136struct FiniteDifferenceOperation
137{
138 MultiArray<Dims, ResultType>* result;
139 const MultiArray<Dims, Value>* ValueField;
140 int EvalDimension;
141
142 FiniteDifferenceOperation()
143 {}
144
145 void apply(const MultiIndex<Dims>&Index)
146 {
147 FiniteDifference( *result, *ValueField, Index, EvalDimension);
148 }
149};
150
156template <Dims_t Dims, typename Value, typename ResultType, int Diff>
157const MultiArray<Dims, ResultType>&
158FiniteDifference( MultiArray<Dims, ResultType>&result,
159 const MultiArray<Dims, Value>&ValueField, const MultiIndex<Diff>&)
160{
161typedef FiniteDifferenceOperation<Dims, Value, ResultType>
162 FiniteDifferenceOperation_t;
163
164typedef MultiOperate<Dims, FiniteDifferenceOperation_t, Diff> FD0_t;
165
166FD0_t FD0;
167 FD0.result = &result;
168 FD0.ValueField = &ValueField;
169 FD0.EvalDimension = Diff;
170
171 FD0.iterate( ValueField.Size() );
172
173 return result;
174}
175#endif
176
177
178
183template <Dims_t EvalDimension>
185{
186
192 template <Dims_t Dims, typename Value, typename ResultType>
195 const MultiArray<Dims, Value>&ValueField,
196 const MultiIndex<Dims>&Index)
197 {
198 const MultiIndex<Dims>&Sz = ValueField.Size();
199
200 if (Sz[EvalDimension] < 2)
201 {
202// throw something ?
203 return result;
204 }
205
207 MiddleIndex = Index,
208 EndIndex = Index;
209
210 {
212 EndIndex [ EvalDimension ] = 1;
213
216 ValueField[ EndIndex ] - ValueField[ StartIndex ] );
217
218 // result[ StartIndex ][EvalDimension] = ValueField[ EndIndex ] - ValueField[ StartIndex ];
219 }
220
221 for(index_t i=1; i<Sz[EvalDimension]-1; i++)
222 {
223 StartIndex [ EvalDimension ] = i-1;
225 EndIndex [ EvalDimension ] = i+1;
226
229 0.5*(ValueField[ EndIndex ] - ValueField[ StartIndex ]) );
230
231
232 // result[ MiddleIndex ][EvalDimension] = 0.5*(ValueField[ EndIndex ] - ValueField[ StartIndex ] );
233 }
234
235 {
238
241 ValueField[ EndIndex ] - ValueField[ StartIndex ] );
242
243 // result[ EndIndex ][EvalDimension] = ValueField[ EndIndex ] - ValueField[ StartIndex ];
244 }
245 return result;
246 }
247
248
249template <Dims_t Dims, typename Value, typename ResultType>
251 {
253 const MultiArray<Dims, Value>* ValueField;
254
256 {}
257
258 void apply(const MultiIndex<Dims>&Index)
259 {
260 FiniteDifference( *result, *ValueField, Index);
261 }
262 };
263
264
270template <Dims_t Dims, typename Value, typename ResultType>
273 const MultiArray<Dims, Value>&ValueField)
274 {
277
279
280 FD_t FD;
281 FD.result = &result;
282 FD.ValueField = &ValueField;
283
284 FD.iterate( ValueField.Size() );
285
286 return result;
287 }
288
294template <Dims_t Dims, typename Value, typename ResultType>
297 const MultiArray<Dims, Value>&ValueField)
298 {
300 FiniteDifference( result, ValueField), ValueField
301 );
302 }
303};
304
305
311template <>
313{
314template <Dims_t Dims, typename Value, typename ResultType>
317 const MultiArray<Dims, Value>&ValueField)
318 {
319 return result;
320 }
321
322};
323
324
338template <Dims_t Dims, typename Value, typename ResultType>
341 const MultiArray<Dims, Value>&ValueField)
342{
343 return ComputePartialDerivative<Dims-1>::compute( result, ValueField);
344}
345
346
347
348} /* namespace Fiber */
349
350#endif /* __FIBER_FINITE_DIFFERENCING_HPP */
_Expr< _ValFunClos< _ValArray, _Tp >, _Tp > apply(_Tp __func(_Tp)) const
An iterator with an optional DataCreator, which is just a class to intercept creation of data along a...
Definition CreativeIterator.hpp:34
const MultiArray< Dims, ResultType > & ComputeDerivative(MultiArray< Dims, ResultType > &result, const MultiArray< Dims, Value > &ValueField)
Compute the derivative of a multidimensional array.
Definition FiniteDifferences.hpp:340
static MultiArray< Dims, ResultType > & FiniteDifference(MultiArray< Dims, ResultType > &result, const MultiArray< Dims, Value > &ValueField)
Compute Finite Differences within a multidimensional array, putting the directional derivative along ...
Definition FiniteDifferences.hpp:272
Given a fragmented field of curvilinear coordinates, (3D array of coordinates), build a uniform Grid ...
Definition FAQ.dox:2
Compute the partial derivative of a multidimensional array in the given index direction.
Definition FiniteDifferences.hpp:185
static const MultiArray< Dims, ResultType > & FiniteDifference(MultiArray< Dims, ResultType > &result, const MultiArray< Dims, Value > &ValueField, const MultiIndex< Dims > &Index)
Compute Finite Differences along one line within a multidimensional array in the given index.
Definition FiniteDifferences.hpp:194
static MultiArray< Dims, ResultType > & compute(MultiArray< Dims, ResultType > &result, const MultiArray< Dims, Value > &ValueField)
Recursively computing the partial derivatives over all dimensions.
Definition FiniteDifferences.hpp:296
Type trait class to assign the partial derivative of some difference type to some result type.
Definition FiniteDifferences.hpp:21