Concepts#
System#
namespace pressio{ namespace ode{
template<class T, class enable = void>
struct OdeSystem : std::false_type{};
template<class T>
struct OdeSystem<
T,
std::enable_if_t<
::pressio::has_independent_variable_typedef<T>::value
&& ::pressio::has_state_typedef<T>::value
&& ::pressio::has_rhs_typedef<T>::value
&& std::is_copy_constructible<typename T::state_type>::value
&& std::is_copy_constructible<typename T::rhs_type>::value
&& ::pressio::ode::has_const_create_state_method_return_result<
T, typename T::state_type >::value
&& ::pressio::ode::has_const_create_rhs_method_return_result<
T, typename T::rhs_type >::value
&& std::is_void<
decltype(
std::declval<T const>().rhs
(
std::declval<typename T::state_type const&>(),
std::declval<typename T::independent_variable_type const &>(),
std::declval<typename T::rhs_type &>()
)
)
>::value
>
> : std::true_type{};
template<class T, class enable = void>
struct OdeSystemFusingRhsAndJacobian : std::false_type{};
template<class T>
struct OdeSystemFusingRhsAndJacobian<
T,
std::enable_if_t<
::pressio::has_independent_variable_typedef<T>::value
&& ::pressio::has_state_typedef<T>::value
&& ::pressio::has_rhs_typedef<T>::value
&& ::pressio::has_jacobian_typedef<T>::value
&& std::is_copy_constructible<typename T::state_type>::value
&& std::is_copy_constructible<typename T::rhs_type>::value
&& std::is_copy_constructible<typename T::jacobian_type>::value
&& ::pressio::ode::has_const_create_state_method_return_result<
T, typename T::state_type >::value
&& ::pressio::ode::has_const_create_rhs_method_return_result<
T, typename T::rhs_type >::value
&& ::pressio::ode::has_const_create_jacobian_method_return_result<
T, typename T::jacobian_type >::value
&& std::is_void<
decltype(
std::declval<T const>().rhsAndJacobian
(
std::declval<typename T::state_type const&>(),
std::declval<typename T::independent_variable_type const &>(),
std::declval<typename T::rhs_type &>(),
std::declval< std::optional<typename T::jacobian_type*> >()
)
)
>::value
>
> : std::true_type{};
template<class T, class enable = void>
struct OdeSystemFusingMassMatrixAndRhs : std::false_type{};
template<class T>
struct OdeSystemFusingMassMatrixAndRhs<
T,
std::enable_if_t<
::pressio::has_independent_variable_typedef<T>::value
&& ::pressio::has_state_typedef<T>::value
&& ::pressio::has_rhs_typedef<T>::value
&& ::pressio::has_mass_matrix_typedef<T>::value
&& std::is_copy_constructible<typename T::state_type>::value
&& std::is_copy_constructible<typename T::rhs_type>::value
&& std::is_copy_constructible<typename T::mass_matrix_type>::value
&& ::pressio::ode::has_const_create_state_method_return_result<
T, typename T::state_type >::value
&& ::pressio::ode::has_const_create_rhs_method_return_result<
T, typename T::rhs_type >::value
&& ::pressio::ode::has_const_create_mass_matrix_method_return_result<
T, typename T::mass_matrix_type >::value
//
&& std::is_void<
decltype(
std::declval<T const>().massMatrixAndRhs
(
std::declval<typename T::state_type const&>(),
std::declval<typename T::independent_variable_type const &>(),
std::declval<typename T::mass_matrix_type &>(),
typename T::independent_variable_type,
Real-valued system refinement#
namespace pressio{ namespace ode{
>::value
>
> : std::true_type{};
template<class T, class enable = void>
struct CompleteOdeSystem : std::false_type{};
template<class T>
struct CompleteOdeSystem<
T,
std::enable_if_t<
::pressio::has_independent_variable_typedef<T>::value
&& ::pressio::has_state_typedef<T>::value
&& ::pressio::has_rhs_typedef<T>::value
&& ::pressio::has_mass_matrix_typedef<T>::value
&& ::pressio::has_jacobian_typedef<T>::value
&& std::is_copy_constructible<typename T::state_type>::value
&& std::is_copy_constructible<typename T::rhs_type>::value
&& std::is_copy_constructible<typename T::mass_matrix_type>::value
&& std::is_copy_constructible<typename T::jacobian_type>::value
&& ::pressio::ode::has_const_create_state_method_return_result<
T, typename T::state_type >::value
&& ::pressio::ode::has_const_create_rhs_method_return_result<
T, typename T::rhs_type >::value
&& ::pressio::ode::has_const_create_mass_matrix_method_return_result<
T, typename T::mass_matrix_type >::value
&& ::pressio::ode::has_const_create_jacobian_method_return_result<
T, typename T::jacobian_type >::value
//
&& std::is_void<
decltype(
std::declval<T const>().massMatrixAndRhsAndJacobian
(
std::declval<typename T::state_type const&>(),
std::declval<typename T::independent_variable_type const &>(),
std::declval<typename T::mass_matrix_type &>(),
std::declval<typename T::rhs_type &>(),
std::declval< std::optional<typename T::jacobian_type*> >()
)
)
>::value
>
> : std::true_type{};
template<class T, int NumStates,class enable = void>
struct FullyDiscreteSystemWithJacobian : std::false_type{};
template<class T, int NumStates>
struct FullyDiscreteSystemWithJacobian<
typename T::independent_variable_type,
Others#
template <class T, class = void>
struct Steppable : std::false_type{};
template <class T>
struct Steppable<
T,
std::enable_if_t<
::pressio::has_independent_variable_typedef<T>::value
&& ::pressio::has_state_typedef<T>::value
&& std::is_void<
decltype
(
std::declval<T>()
(
std::declval< typename T::state_type & >(),
std::declval< ::pressio::ode::StepStartAt<typename T::independent_variable_type> >(),
std::declval< ::pressio::ode::StepCount >(),
std::declval< ::pressio::ode::StepSize<typename T::independent_variable_type> >()
)
)
>::value
//&& impl::stepper_accepting_lvalue_state<T>::value
>
> : std::true_type{};
template <class T, class AuxT, class ...Args>
struct SteppableWithAuxiliaryArgs : std::false_type{};
template <class T, class AuxT, class ...Args>
struct SteppableWithAuxiliaryArgs<
std::enable_if_t<
::pressio::has_independent_variable_typedef<T>::value
&& ::pressio::has_state_typedef<T>::value
&& std::is_void<
decltype
(
std::declval<T>()
(
std::declval<typename T::state_type & >(),
std::declval<::pressio::ode::StepStartAt<typename T::independent_variable_type> >(),
std::declval<::pressio::ode::StepCount >(),
std::declval<::pressio::ode::StepSize<typename T::independent_variable_type> >(),
std::declval< AuxT >(), std::declval<Args>()...
)
)
>::value
//&& impl::variadic_stepper_accepting_lvalue_state<void, T, AuxT, Args...>::value
>,
T, AuxT, Args...
> : std::true_type{};
template <class T>
using StronglySteppable = Steppable<T>;
template <class T, class AuxT, class ...Args>
using StronglySteppableWithAuxiliaryArgs = SteppableWithAuxiliaryArgs<T, AuxT, Args...>;
template <class T, class IndVarType, class StateType, class enable = void>
struct StateObserver : std::false_type{};
template <class T, class IndVarType, class StateType>
struct StateObserver<
T, IndVarType, StateType,
std::enable_if_t<
std::is_void<
decltype(
std::declval<T>().operator()
(
std::declval< ::pressio::ode::StepCount >(),
std::declval< IndVarType >(),
std::declval<StateType const &>()
)
)
>::value
>
> : std::true_type{};
template <class T, class IndVarType, class StateType, class enable = void>
struct StateGuesser : std::false_type{};
template <class T, class IndVarType, class StateType>
struct StateGuesser<
T, IndVarType, StateType,