9 #ifndef Tempus_InterpolatorLagrange_impl_hpp
10 #define Tempus_InterpolatorLagrange_impl_hpp
16 #include "Thyra_VectorStdOps.hpp"
20 template <
class Scalar>
24 int n = (*nodes_).size();
27 lagrange(order_, t, state_out);
29 lagrange(n - 1, t, state_out);
32 template <
class Scalar>
36 pl_ = Teuchos::parameterList();
37 if (paramList == Teuchos::null)
38 *pl_ = *(this->getValidParameters());
42 order_ = pl_->get<
int>(
"Order");
45 template <
class Scalar>
52 template <
class Scalar>
61 template <
class Scalar>
66 tmp->
set<std::string>(
"Interpolator Type",
"Lagrange");
67 tmp->
set<
int>(
"Order", 0);
71 template <
class Scalar>
77 using Thyra::V_StVpStV;
81 int n = nodes_->size();
84 const Scalar t_begin = (*nodes_)[0]->getTime();
85 const Scalar t_final = (*nodes_)[n - 1]->getTime();
92 else if (t >= t_final)
95 auto it = std::find_if(nodes_->begin(), nodes_->end(),
96 [=](
const RCP<SolutionState<Scalar> >& s) {
97 return t <= s->getTime();
99 i = std::distance(nodes_->begin(), it) - 1;
105 state_out->
copy((*nodes_)[i]);
110 state_out->
copy((*nodes_)[i + 1]);
117 if (k + p + 1 > n) k = n - p - 1;
120 RCP<VectorBase<Scalar> > x = state_out->
getX();
121 RCP<VectorBase<Scalar> > xdot = state_out->
getXDot();
122 RCP<VectorBase<Scalar> > xdotdot = state_out->
getXDotDot();
125 Thyra::assign(x.ptr(), zero);
126 if (!
is_null(xdot)) Thyra::assign(xdot.ptr(), zero);
127 if (!
is_null(xdotdot)) Thyra::assign(xdotdot.ptr(), zero);
129 for (
int j = 0; j <= p; ++j) {
130 const Scalar tj = (*nodes_)[k + j]->getTime();
131 RCP<const VectorBase<Scalar> > xj = (*nodes_)[k + j]->getX();
132 RCP<const VectorBase<Scalar> > xdotj = (*nodes_)[k + j]->getXDot();
133 RCP<const VectorBase<Scalar> > xdotdotj = (*nodes_)[k + j]->getXDotDot();
137 for (
int l = 0; l <= p; ++l) {
139 const Scalar tl = (*nodes_)[k + l]->getTime();
144 const Scalar a = num / den;
145 Thyra::Vp_StV(x.ptr(), a, *xj);
146 if (!
is_null(xdot)) Thyra::Vp_StV(xdot.ptr(), a, *xdotj);
147 if (!
is_null(xdotdot)) Thyra::Vp_StV(xdotdot.ptr(), a, *xdotdotj);
151 state_out->
getMetaData()->copy((*nodes_)[i]->getMetaData());
153 state_out->
getMetaData()->setDt(t - (*nodes_)[i]->getTime());
160 #endif // Tempus_InterpolatorLagrange_impl_hpp
bool is_null(const boost::shared_ptr< T > &p)
virtual Teuchos::RCP< Thyra::VectorBase< Scalar > > getXDot()
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
bool is_null(const std::shared_ptr< T > &p)
Teuchos::RCP< Teuchos::ParameterList > getNonconstParameterList()
Teuchos::RCP< Teuchos::ParameterList > unsetParameterList()
virtual Teuchos::RCP< Thyra::VectorBase< Scalar > > getXDotDot()
void validateParametersAndSetDefaults(ParameterList const &validParamList, int const depth=1000)
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
void lagrange(const int p, const Scalar &t, SolutionState< Scalar > *state_out) const
virtual Teuchos::RCP< const SolutionStateMetaData< Scalar > > getMetaData() const
bool floating_compare_equals(const Scalar &a, const Scalar &b, const Scalar &scale)
Helper function for comparing times.
void interpolate(const Scalar &t, SolutionState< Scalar > *state_out) const
Perform an interpolation.
#define TEUCHOS_ASSERT(assertion_test)
virtual Teuchos::RCP< Thyra::VectorBase< Scalar > > getX()
Solution state for integrators and steppers.
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > ¶mList)
virtual void copy(const Teuchos::RCP< const SolutionState< Scalar > > &ss)
This is a deep copy.