9#ifndef TEMPUS_TEST_DAHLQUIST_TEST_MODEL_IMPL_HPP
10#define TEMPUS_TEST_DAHLQUIST_TEST_MODEL_IMPL_HPP
12#include "Thyra_DefaultSpmdVectorSpace.hpp"
13#include "Thyra_DetachedVectorView.hpp"
14#include "Thyra_DetachedMultiVectorView.hpp"
15#include "Thyra_DefaultSerialDenseLinearOpWithSolveFactory.hpp"
16#include "Thyra_DefaultMultiVectorLinearOpWithSolve.hpp"
17#include "Thyra_DefaultLinearOpSource.hpp"
18#include "Thyra_VectorStdOps.hpp"
19#include "Thyra_MultiVectorStdOps.hpp"
20#include "Thyra_DefaultMultiVectorProductVector.hpp"
29{ constructDahlquistTestModel(-1.0,
false); }
35{ constructDahlquistTestModel(lambda, includeXDot); }
44 includeXDot_ = includeXDot;
45 isInitialized_ =
false;
47 xDotIC_ = Scalar(lambda);
54 acceptModelParams_ =
false;
57 x_space_ = Thyra::defaultSpmdVectorSpace<Scalar>(dim_);
58 f_space_ = Thyra::defaultSpmdVectorSpace<Scalar>(dim_);
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 );
72 if (acceptModelParams_) inArgs.set_Np( Np_ );
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 );
84 if (acceptModelParams_) {
85 outArgs.set_Np_Ng(Np_,Ng_);
86 outArgs.setSupports( MEB::OUT_ARG_DfDp,0,
87 MEB::DERIV_MV_JACOBIAN_FORM );
88 outArgs.setSupports( MEB::OUT_ARG_DgDp,0,0,
89 MEB::DERIV_MV_JACOBIAN_FORM );
90 outArgs.setSupports( MEB::OUT_ARG_DgDx,0,
91 MEB::DERIV_MV_GRADIENT_FORM );
97 nominalValues_ = inArgs_;
99 nominalValues_.set_t(Scalar(0.0));
100 const RCP<Thyra::VectorBase<Scalar> > x_ic = createMember(x_space_);
102 Thyra::DetachedVectorView<Scalar> x_ic_view( *x_ic );
105 nominalValues_.set_x(x_ic);
109 const RCP<Thyra::VectorBase<Scalar> > x_dot_ic = createMember(x_space_);
111 Thyra::DetachedVectorView<Scalar> x_dot_ic_view( *x_dot_ic );
112 x_dot_ic_view[0] = xDotIC_;
114 nominalValues_.set_x_dot(x_dot_ic);
117 isInitialized_ =
true;
121template<
class Scalar>
122Thyra::ModelEvaluatorBase::InArgs<Scalar>
126 Thyra::ModelEvaluatorBase::InArgs<Scalar> inArgs = inArgs_;
128 inArgs.set_t(exact_t);
131 Teuchos::RCP<Thyra::VectorBase<Scalar> > exact_x = createMember(x_space_);
133 Thyra::DetachedVectorView<Scalar> exact_x_view(*exact_x);
134 exact_x_view[0] = exp(lambda_*exact_t);
136 inArgs.set_x(exact_x);
140 Teuchos::RCP<Thyra::VectorBase<Scalar> > exact_x_dot = createMember(x_space_);
142 Thyra::DetachedVectorView<Scalar> exact_x_dot_view(*exact_x_dot);
143 exact_x_dot_view[0] = lambda_ * exp(lambda_*exact_t);
145 inArgs.set_x_dot(exact_x_dot);
152template<
class Scalar>
153Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
161template<
class Scalar>
162Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
170template<
class Scalar>
171Thyra::ModelEvaluatorBase::InArgs<Scalar>
175 return nominalValues_;
179template<
class Scalar>
180Thyra::ModelEvaluatorBase::InArgs<Scalar>
188template<
class Scalar>
189Thyra::ModelEvaluatorBase::OutArgs<Scalar>
197template<
class Scalar>
201 const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
202 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs
208 using Teuchos::rcp_dynamic_cast;
209 TEUCHOS_TEST_FOR_EXCEPTION( !isInitialized_, std::logic_error,
210 "Error, setupInOutArgs_ must be called first!\n");
212 const RCP<const VectorBase<Scalar> > x_in = inArgs.get_x().assert_not_null();
213 Thyra::ConstDetachedVectorView<Scalar> x_in_view( *x_in );
214 const RCP<VectorBase<Scalar> > f_out = outArgs.get_f();
215 const RCP<Thyra::LinearOpBase<Scalar> > W_out = outArgs.get_W_op();
217 if (inArgs.get_x_dot().is_null()) {
220 if (!is_null(f_out)) {
221 Thyra::DetachedVectorView<Scalar> f_out_view( *f_out );
222 f_out_view[0] = lambda_*x_in_view[0];
224 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
225 "Error -- Dahlquist Test Model requires f_out!\n");
228 if (!is_null(W_out)) {
229 RCP<Thyra::MultiVectorBase<Scalar> > matrix =
230 Teuchos::rcp_dynamic_cast<Thyra::MultiVectorBase<Scalar> >(W_out,
true);
231 Thyra::DetachedMultiVectorView<Scalar> matrix_view( *matrix );
232 matrix_view(0,0) = lambda_;
238 RCP<const VectorBase<Scalar> > x_dot_in;
239 x_dot_in = inArgs.get_x_dot().assert_not_null();
240 Scalar alpha = inArgs.get_alpha();
241 Scalar beta = inArgs.get_beta();
243 if (!is_null(f_out)) {
244 Thyra::DetachedVectorView<Scalar> f_out_view( *f_out );
245 Thyra::ConstDetachedVectorView<Scalar> x_dot_in_view( *x_dot_in );
246 f_out_view[0] = x_dot_in_view[0] - lambda_*x_in_view[0];
249 if (!is_null(W_out)) {
250 RCP<Thyra::MultiVectorBase<Scalar> > matrix =
251 Teuchos::rcp_dynamic_cast<Thyra::MultiVectorBase<Scalar> >(W_out,
true);
252 Thyra::DetachedMultiVectorView<Scalar> matrix_view( *matrix );
253 matrix_view(0,0) = alpha - beta*lambda_;
261template<
class Scalar>
262Teuchos::RCP<Thyra::LinearOpWithSolveBase<Scalar> >
267 RCP<const Thyra::LinearOpWithSolveFactoryBase<Scalar> > W_factory = this->get_W_factory();
268 RCP<Thyra::LinearOpBase<Scalar> > matrix = this->create_W_op();
270 RCP<Thyra::MultiVectorBase<Scalar> > multivec = Teuchos::rcp_dynamic_cast<Thyra::MultiVectorBase<Scalar> >(matrix,
true);
272 RCP<Thyra::VectorBase<Scalar> > vec = Thyra::createMember(x_space_);
274 Thyra::DetachedVectorView<Scalar> vec_view( *vec );
275 vec_view[0] = lambda_;
277 V_V(multivec->col(0).ptr(),*vec);
280 RCP<Thyra::LinearOpWithSolveBase<Scalar> > W =
281 Thyra::linearOpWithSolve<Scalar>(
288template<
class Scalar>
289Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
294 Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > matrix = Thyra::createMembers(x_space_, dim_);
299template<
class Scalar>
300Teuchos::RCP<const Thyra::LinearOpWithSolveFactoryBase<Scalar> >
304 Teuchos::RCP<Thyra::LinearOpWithSolveFactoryBase<Scalar> > W_factory =
305 Thyra::defaultSerialDenseLinearOpWithSolveFactory<Scalar>();
309template<
class Scalar>
310Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
314 if (!acceptModelParams_) {
315 return Teuchos::null;
317 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE( l, 0, Np_ );
320 else if (l == 1 || l == 2)
322 return Teuchos::null;
326template<
class Scalar>
327Teuchos::RCP<const Teuchos::Array<std::string> >
331 if (!acceptModelParams_) {
332 return Teuchos::null;
334 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE( l, 0, Np_ );
335 Teuchos::RCP<Teuchos::Array<std::string> > p_strings =
336 Teuchos::rcp(
new Teuchos::Array<std::string>());
338 p_strings->push_back(
"Model Coefficient: a");
343 p_strings->push_back(
"DxDp");
345 p_strings->push_back(
"Dx_dotDp");
349template<
class Scalar>
350Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
354 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
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::LinearOpWithSolveFactoryBase< Scalar > > get_W_factory() const
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
Thyra::ModelEvaluatorBase::InArgs< Scalar > createInArgs() const
Thyra::ModelEvaluatorBase::InArgs< Scalar > getNominalValues() const
Teuchos::RCP< const Teuchos::Array< std::string > > get_p_names(int l) const