1#ifndef __FIBER_FINITE_DIFFERENCING_HPP
2#define __FIBER_FINITE_DIFFERENCING_HPP
4#include <eagle/Vector.hpp>
5#include "MultiArray.hpp"
6#include "MultiOperate.hpp"
19template <
class ResultType>
22 template <Dims_t Dims,
class DifferenceType>
43 template <Dims_t Dims,
class DifferenceType>
49 result [ Index ] =
DT;
75template <Dims_t Dims,
typename Value,
typename ResultType>
90MultiIndex<Dims> StartIndex = Index,
95 StartIndex[ EvalDimension ] = 0;
96 EndIndex [ EvalDimension ] = 1;
98 FiniteDifferenceTrait<ResultType>::assign( result,
99 StartIndex, EvalDimension,
100 ValueField[ EndIndex ] - ValueField[ StartIndex ] );
105 for(index_t i=1; i<Sz[EvalDimension]-1; i++)
107 StartIndex [ EvalDimension ] = i-1;
108 MiddleIndex[ EvalDimension ] = i ;
109 EndIndex [ EvalDimension ] = i+1;
111 FiniteDifferenceTrait<ResultType>::assign( result,
112 MiddleIndex, EvalDimension,
113 0.5*(ValueField[ EndIndex ] - ValueField[ StartIndex ]) );
120 StartIndex[ EvalDimension ] = Sz[EvalDimension]-2;
121 EndIndex [ EvalDimension ] = Sz[EvalDimension]-1;
123 FiniteDifferenceTrait<ResultType>::assign( result,
124 EndIndex, EvalDimension,
125 ValueField[ EndIndex ] - ValueField[ StartIndex ] );
135template <Dims_t Dims,
typename Value,
typename ResultType>
136struct FiniteDifferenceOperation
138 MultiArray<Dims, ResultType>* result;
139 const MultiArray<Dims, Value>* ValueField;
142 FiniteDifferenceOperation()
145 void apply(
const MultiIndex<Dims>&Index)
147 FiniteDifference( *result, *ValueField, Index, EvalDimension);
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>&)
161typedef FiniteDifferenceOperation<Dims, Value, ResultType>
162 FiniteDifferenceOperation_t;
164typedef MultiOperate<Dims, FiniteDifferenceOperation_t, Diff> FD0_t;
167 FD0.result = &result;
168 FD0.ValueField = &ValueField;
169 FD0.EvalDimension = Diff;
171 FD0.iterate( ValueField.Size() );
183template <Dims_t EvalDimension>
192 template <Dims_t Dims,
typename Value,
typename ResultType>
249template <Dims_t Dims,
typename Value,
typename ResultType>
270template <Dims_t Dims,
typename Value,
typename ResultType>
282 FD.ValueField = &ValueField;
284 FD.iterate( ValueField.Size() );
294template <Dims_t Dims,
typename Value,
typename ResultType>
314template <Dims_t Dims,
typename Value,
typename ResultType>
338template <Dims_t Dims,
typename Value,
typename ResultType>
_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
Definition FiniteDifferences.hpp:251
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