10#ifndef TEMPUS_TEST_DAHLQUIST_TEST_MODEL_IMPL_HPP
11#define TEMPUS_TEST_DAHLQUIST_TEST_MODEL_IMPL_HPP
13#include "Thyra_DefaultSpmdVectorSpace.hpp"
14#include "Thyra_DetachedVectorView.hpp"
15#include "Thyra_DetachedMultiVectorView.hpp"
16#include "Thyra_DefaultSerialDenseLinearOpWithSolveFactory.hpp"
17#include "Thyra_DefaultMultiVectorLinearOpWithSolve.hpp"
18#include "Thyra_DefaultLinearOpSource.hpp"
19#include "Thyra_VectorStdOps.hpp"
20#include "Thyra_MultiVectorStdOps.hpp"
21#include "Thyra_DefaultMultiVectorProductVector.hpp"
27template <
class Scalar>
33template <
class Scalar>
39template <
class Scalar>
61 typedef Thyra::ModelEvaluatorBase MEB;
64 MEB::InArgsSetup<Scalar> inArgs;
65 inArgs.setModelEvalDescription(this->description());
66 inArgs.setSupports(MEB::IN_ARG_t);
67 inArgs.setSupports(MEB::IN_ARG_x);
68 inArgs.setSupports(MEB::IN_ARG_x_dot);
70 inArgs.setSupports(MEB::IN_ARG_beta);
71 inArgs.setSupports(MEB::IN_ARG_alpha);
79 MEB::OutArgsSetup<Scalar> outArgs;
80 outArgs.setModelEvalDescription(this->description());
81 outArgs.setSupports(MEB::OUT_ARG_f);
83 outArgs.setSupports(MEB::OUT_ARG_W_op);
85 outArgs.set_Np_Ng(
Np_,
Ng_);
86 outArgs.setSupports(MEB::OUT_ARG_DfDp, 0, MEB::DERIV_MV_JACOBIAN_FORM);
87 outArgs.setSupports(MEB::OUT_ARG_DgDp, 0, 0, MEB::DERIV_MV_JACOBIAN_FORM);
88 outArgs.setSupports(MEB::OUT_ARG_DgDx, 0, MEB::DERIV_MV_GRADIENT_FORM);
97 const RCP<Thyra::VectorBase<Scalar> > x_ic = createMember(
x_space_);
99 Thyra::DetachedVectorView<Scalar> x_ic_view(*x_ic);
106 const RCP<Thyra::VectorBase<Scalar> > x_dot_ic = createMember(
x_space_);
108 Thyra::DetachedVectorView<Scalar> x_dot_ic_view(*x_dot_ic);
117template <
class Scalar>
118Thyra::ModelEvaluatorBase::InArgs<Scalar>
121 Thyra::ModelEvaluatorBase::InArgs<Scalar> inArgs =
inArgs_;
123 inArgs.set_t(exact_t);
126 Teuchos::RCP<Thyra::VectorBase<Scalar> > exact_x = createMember(
x_space_);
128 Thyra::DetachedVectorView<Scalar> exact_x_view(*exact_x);
129 exact_x_view[0] = exp(
lambda_ * exact_t);
131 inArgs.set_x(exact_x);
135 Teuchos::RCP<Thyra::VectorBase<Scalar> > exact_x_dot =
138 Thyra::DetachedVectorView<Scalar> exact_x_dot_view(*exact_x_dot);
141 inArgs.set_x_dot(exact_x_dot);
147template <
class Scalar>
148Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
154template <
class Scalar>
155Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
161template <
class Scalar>
162Thyra::ModelEvaluatorBase::InArgs<Scalar>
168template <
class Scalar>
169Thyra::ModelEvaluatorBase::InArgs<Scalar>
175template <
class Scalar>
176Thyra::ModelEvaluatorBase::OutArgs<Scalar>
182template <
class Scalar>
184 const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
185 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
188 using Teuchos::rcp_dynamic_cast;
192 "Error, setupInOutArgs_ must be called first!\n");
194 const RCP<const VectorBase<Scalar> > x_in = inArgs.get_x().assert_not_null();
195 Thyra::ConstDetachedVectorView<Scalar> x_in_view(*x_in);
196 const RCP<VectorBase<Scalar> > f_out = outArgs.get_f();
197 const RCP<Thyra::LinearOpBase<Scalar> > W_out = outArgs.get_W_op();
199 if (inArgs.get_x_dot().is_null()) {
201 if (!is_null(f_out)) {
202 Thyra::DetachedVectorView<Scalar> f_out_view(*f_out);
203 f_out_view[0] =
lambda_ * x_in_view[0];
206 TEUCHOS_TEST_FOR_EXCEPTION(
207 true, std::logic_error,
208 "Error -- Dahlquist Test Model requires f_out!\n");
211 if (!is_null(W_out)) {
212 RCP<Thyra::MultiVectorBase<Scalar> > matrix =
213 Teuchos::rcp_dynamic_cast<Thyra::MultiVectorBase<Scalar> >(W_out,
215 Thyra::DetachedMultiVectorView<Scalar> matrix_view(*matrix);
221 RCP<const VectorBase<Scalar> > x_dot_in;
222 x_dot_in = inArgs.get_x_dot().assert_not_null();
223 Scalar alpha = inArgs.get_alpha();
224 Scalar beta = inArgs.get_beta();
226 if (!is_null(f_out)) {
227 Thyra::DetachedVectorView<Scalar> f_out_view(*f_out);
228 Thyra::ConstDetachedVectorView<Scalar> x_dot_in_view(*x_dot_in);
229 f_out_view[0] = x_dot_in_view[0] -
lambda_ * x_in_view[0];
232 if (!is_null(W_out)) {
233 RCP<Thyra::MultiVectorBase<Scalar> > matrix =
234 Teuchos::rcp_dynamic_cast<Thyra::MultiVectorBase<Scalar> >(W_out,
236 Thyra::DetachedMultiVectorView<Scalar> matrix_view(*matrix);
237 matrix_view(0, 0) = alpha - beta *
lambda_;
243template <
class Scalar>
244Teuchos::RCP<Thyra::LinearOpWithSolveBase<Scalar> >
248 RCP<const Thyra::LinearOpWithSolveFactoryBase<Scalar> > W_factory =
250 RCP<Thyra::LinearOpBase<Scalar> > matrix = this->
create_W_op();
252 RCP<Thyra::MultiVectorBase<Scalar> > multivec =
253 Teuchos::rcp_dynamic_cast<Thyra::MultiVectorBase<Scalar> >(matrix,
256 RCP<Thyra::VectorBase<Scalar> > vec = Thyra::createMember(
x_space_);
258 Thyra::DetachedVectorView<Scalar> vec_view(*vec);
261 V_V(multivec->col(0).ptr(), *vec);
264 RCP<Thyra::LinearOpWithSolveBase<Scalar> > W =
265 Thyra::linearOpWithSolve<Scalar>(*W_factory, matrix);
269template <
class Scalar>
270Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
274 Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > matrix =
279template <
class Scalar>
280Teuchos::RCP<const Thyra::LinearOpWithSolveFactoryBase<Scalar> >
283 Teuchos::RCP<Thyra::LinearOpWithSolveFactoryBase<Scalar> > W_factory =
284 Thyra::defaultSerialDenseLinearOpWithSolveFactory<Scalar>();
288template <
class Scalar>
289Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
293 return Teuchos::null;
295 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(l, 0,
Np_);
298 else if (l == 1 || l == 2)
300 return Teuchos::null;
303template <
class Scalar>
304Teuchos::RCP<const Teuchos::Array<std::string> >
308 return Teuchos::null;
310 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(l, 0,
Np_);
311 Teuchos::RCP<Teuchos::Array<std::string> > p_strings =
312 Teuchos::rcp(
new Teuchos::Array<std::string>());
314 p_strings->push_back(
"Model Coefficient: a");
319 p_strings->push_back(
"DxDp");
321 p_strings->push_back(
"Dx_dotDp");
325template <
class Scalar>
326Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
329 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(j, 0,
Ng_);
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_g_space(int j) const
Thyra::ModelEvaluatorBase::OutArgs< Scalar > createOutArgsImpl() const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_f_space() const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > DxDp_space_
void constructDahlquistTestModel(Scalar lambda, bool includeXDot)
Teuchos::RCP< Thyra::LinearOpWithSolveBase< Scalar > > create_W() const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_x_space() const
Teuchos::RCP< Thyra::LinearOpBase< Scalar > > create_W_op() const
Thyra::ModelEvaluatorBase::InArgs< Scalar > getExactSolution(double t) const
Exact solution.
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > x_space_
Thyra::ModelEvaluatorBase::OutArgs< Scalar > outArgs_
Teuchos::RCP< const Thyra::LinearOpWithSolveFactoryBase< Scalar > > get_W_factory() const
Thyra::ModelEvaluatorBase::InArgs< Scalar > inArgs_
Scalar xIC_
Initial condition for x.
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_p_space(int l) const
void evalModelImpl(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs_bar, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs_bar) const
Scalar xDotIC_
Initial condition for xDot.
Thyra::ModelEvaluatorBase::InArgs< Scalar > nominalValues_
Thyra::ModelEvaluatorBase::InArgs< Scalar > createInArgs() const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > p_space_
Thyra::ModelEvaluatorBase::InArgs< Scalar > getNominalValues() const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > f_space_
Teuchos::RCP< const Teuchos::Array< std::string > > get_p_names(int l) const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > g_space_