OGS
NumLib::NumericalDerivative< DerivativeStrategy > Struct Template Reference

Detailed Description

template<typename DerivativeStrategy>
struct NumLib::NumericalDerivative< DerivativeStrategy >

Computes numerical derivatives of almost arbitrary function (objects) with respect to scalar or vectorial (Eigen vectors) variables.

Template Parameters
DerivativeStrategycompute central or forward differences

Definition at line 208 of file NumericalDifferentiation.h.

#include <NumericalDifferentiation.h>

Collaboration diagram for NumLib::NumericalDerivative< DerivativeStrategy >:
[legend]

Public Member Functions

 NumericalDerivative (RelativeEpsilon const &rel_eps, MinimumPerturbation const &min_pert)
template<typename Function, typename... Args>
auto operator() (Function const &f, Args const &... args) const

Private Member Functions

template<typename Function, typename TupleOfArgs, typename DByDScalar, std::size_t... AllArgIdcs>
auto differentiate (Function const &f, TupleOfArgs const &args, DByDScalar const &d_by_dScalar, std::index_sequence< AllArgIdcs... > all_arg_idcs) const
template<typename Function, typename TupleOfArgs, typename DByDScalar, std::size_t... AllArgIdcs, std::size_t PerturbedArgIdx>
auto differentiateWrtScalarOrVectorialArgument (std::true_type, Function const &f, TupleOfArgs const &args, DByDScalar const &d_by_dScalar, std::integral_constant< std::size_t, PerturbedArgIdx > perturbed_arg_idx, std::index_sequence< AllArgIdcs... > all_arg_idcs) const
template<typename Function, typename TupleOfArgs, typename DByDScalar, std::size_t... AllArgIdcs, std::size_t PerturbedArgIdx>
auto differentiateWrtScalarOrVectorialArgument (std::false_type, Function const &f, TupleOfArgs const &args, DByDScalar const &d_by_dScalar, std::integral_constant< std::size_t, PerturbedArgIdx > perturbed_arg_idx, std::index_sequence< AllArgIdcs... > all_arg_idcs) const
template<typename Function, typename TupleOfArgs, typename DByDScalar, Eigen::Index... PerturbedArgComponents, std::size_t... AllArgIdcs, std::size_t PerturbedArgIdx>
auto differentiateWrtAllVectorComponents (Function const &f, TupleOfArgs const &args, DByDScalar const &d_by_dScalar, std::integer_sequence< Eigen::Index, PerturbedArgComponents... >, std::integral_constant< std::size_t, PerturbedArgIdx > perturbed_arg_idx, std::index_sequence< AllArgIdcs... > all_arg_idcs) const

Private Attributes

detail::DefaultPerturbationStrategy pert_strat_

Constructor & Destructor Documentation

◆ NumericalDerivative()

template<typename DerivativeStrategy>
NumLib::NumericalDerivative< DerivativeStrategy >::NumericalDerivative ( RelativeEpsilon const & rel_eps,
MinimumPerturbation const & min_pert )
inline

Definition at line 210 of file NumericalDifferentiation.h.

References pert_strat_.

Member Function Documentation

◆ differentiate()

template<typename DerivativeStrategy>
template<typename Function, typename TupleOfArgs, typename DByDScalar, std::size_t... AllArgIdcs>
auto NumLib::NumericalDerivative< DerivativeStrategy >::differentiate ( Function const & f,
TupleOfArgs const & args,
DByDScalar const & d_by_dScalar,
std::index_sequence< AllArgIdcs... > all_arg_idcs ) const
inlineprivate

Definition at line 232 of file NumericalDifferentiation.h.

235 {
241 all_arg_idcs)... /* "for each function argument" */};
242 }
auto differentiateWrtScalarOrVectorialArgument(std::true_type, Function const &f, TupleOfArgs const &args, DByDScalar const &d_by_dScalar, std::integral_constant< std::size_t, PerturbedArgIdx > perturbed_arg_idx, std::index_sequence< AllArgIdcs... > all_arg_idcs) const

References differentiateWrtScalarOrVectorialArgument().

Referenced by operator()().

◆ differentiateWrtAllVectorComponents()

template<typename DerivativeStrategy>
template<typename Function, typename TupleOfArgs, typename DByDScalar, Eigen::Index... PerturbedArgComponents, std::size_t... AllArgIdcs, std::size_t PerturbedArgIdx>
auto NumLib::NumericalDerivative< DerivativeStrategy >::differentiateWrtAllVectorComponents ( Function const & f,
TupleOfArgs const & args,
DByDScalar const & d_by_dScalar,
std::integer_sequence< Eigen::Index, PerturbedArgComponents... > ,
std::integral_constant< std::size_t, PerturbedArgIdx > perturbed_arg_idx,
std::index_sequence< AllArgIdcs... > all_arg_idcs ) const
inlineprivate

Definition at line 287 of file NumericalDifferentiation.h.

293 {
294 return std::array{
297 /* "for each component of the vectorial function argument being
298 perturbed" */
299 };
300 }

References pert_strat_.

Referenced by differentiateWrtScalarOrVectorialArgument().

◆ differentiateWrtScalarOrVectorialArgument() [1/2]

template<typename DerivativeStrategy>
template<typename Function, typename TupleOfArgs, typename DByDScalar, std::size_t... AllArgIdcs, std::size_t PerturbedArgIdx>
auto NumLib::NumericalDerivative< DerivativeStrategy >::differentiateWrtScalarOrVectorialArgument ( std::false_type ,
Function const & f,
TupleOfArgs const & args,
DByDScalar const & d_by_dScalar,
std::integral_constant< std::size_t, PerturbedArgIdx > perturbed_arg_idx,
std::index_sequence< AllArgIdcs... > all_arg_idcs ) const
inlineprivate

Definition at line 262 of file NumericalDifferentiation.h.

267 {
270 constexpr int N = VectorialArg::RowsAtCompileTime;
271
272 static_assert(N != Eigen::Dynamic);
273 static_assert(VectorialArg::ColsAtCompileTime == 1,
274 "Row vectors are not supported, yet. If you implement "
275 "support for them, make sure to test your implementation "
276 "thoroughly.");
277
282 }
auto differentiateWrtAllVectorComponents(Function const &f, TupleOfArgs const &args, DByDScalar const &d_by_dScalar, std::integer_sequence< Eigen::Index, PerturbedArgComponents... >, std::integral_constant< std::size_t, PerturbedArgIdx > perturbed_arg_idx, std::index_sequence< AllArgIdcs... > all_arg_idcs) const

References differentiateWrtAllVectorComponents(), and NumLib::N.

◆ differentiateWrtScalarOrVectorialArgument() [2/2]

template<typename DerivativeStrategy>
template<typename Function, typename TupleOfArgs, typename DByDScalar, std::size_t... AllArgIdcs, std::size_t PerturbedArgIdx>
auto NumLib::NumericalDerivative< DerivativeStrategy >::differentiateWrtScalarOrVectorialArgument ( std::true_type ,
Function const & f,
TupleOfArgs const & args,
DByDScalar const & d_by_dScalar,
std::integral_constant< std::size_t, PerturbedArgIdx > perturbed_arg_idx,
std::index_sequence< AllArgIdcs... > all_arg_idcs ) const
inlineprivate

Definition at line 247 of file NumericalDifferentiation.h.

References pert_strat_.

Referenced by differentiate().

◆ operator()()

template<typename DerivativeStrategy>
template<typename Function, typename... Args>
auto NumLib::NumericalDerivative< DerivativeStrategy >::operator() ( Function const & f,
Args const &... args ) const
inline

Definition at line 217 of file NumericalDifferentiation.h.

218 {
219 auto const d_by_dScalar =
221
222 // TODO also return value from the function, not only the derivatives?
223 return differentiate(f,
226 std::make_index_sequence<sizeof...(Args)>{});
227 }
auto differentiate(Function const &f, TupleOfArgs const &args, DByDScalar const &d_by_dScalar, std::index_sequence< AllArgIdcs... > all_arg_idcs) const

References differentiate().

Member Data Documentation

◆ pert_strat_

template<typename DerivativeStrategy>
detail::DefaultPerturbationStrategy NumLib::NumericalDerivative< DerivativeStrategy >::pert_strat_
private

The documentation for this struct was generated from the following file: