76 using Teuchos::is_null;
78 using Thyra::V_StVpStV;
82 int n = nodes_->size();
83 TEUCHOS_ASSERT(n >= p);
85 const Scalar t_begin = (*nodes_)[0]->getTime();
86 const Scalar t_final = (*nodes_)[n - 1]->getTime();
93 else if (t >= t_final)
96 auto it = std::find_if(nodes_->begin(), nodes_->end(),
98 return t <= s->getTime();
100 i = std::distance(nodes_->begin(), it) - 1;
102 TEUCHOS_ASSERT(i >= 0 && i <= n - 1);
106 state_out->
copy((*nodes_)[i]);
111 state_out->
copy((*nodes_)[i + 1]);
118 if (k + p + 1 > n) k = n - p - 1;
119 TEUCHOS_ASSERT(k >= 0 && k + p + 1 <= n);
121 RCP<VectorBase<Scalar> > x = state_out->
getX();
122 RCP<VectorBase<Scalar> > xdot = state_out->
getXDot();
123 RCP<VectorBase<Scalar> > xdotdot = state_out->
getXDotDot();
125 Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
126 Thyra::assign(x.ptr(), zero);
127 if (!is_null(xdot)) Thyra::assign(xdot.ptr(), zero);
128 if (!is_null(xdotdot)) Thyra::assign(xdotdot.ptr(), zero);
130 for (
int j = 0; j <= p; ++j) {
131 const Scalar tj = (*nodes_)[k + j]->getTime();
132 RCP<const VectorBase<Scalar> > xj = (*nodes_)[k + j]->getX();
133 RCP<const VectorBase<Scalar> > xdotj = (*nodes_)[k + j]->getXDot();
134 RCP<const VectorBase<Scalar> > xdotdotj = (*nodes_)[k + j]->getXDotDot();
138 for (
int l = 0; l <= p; ++l) {
140 const Scalar tl = (*nodes_)[k + l]->getTime();
145 const Scalar a = num / den;
146 Thyra::Vp_StV(x.ptr(), a, *xj);
147 if (!is_null(xdot)) Thyra::Vp_StV(xdot.ptr(), a, *xdotj);
148 if (!is_null(xdotdot)) Thyra::Vp_StV(xdotdot.ptr(), a, *xdotdotj);
152 state_out->
getMetaData()->copy((*nodes_)[i]->getMetaData());
154 state_out->
getMetaData()->setDt(t - (*nodes_)[i]->getTime());