9 #ifndef TEMPUS_TEST_VANDERPOL_MODEL_IMPL_HPP
10 #define TEMPUS_TEST_VANDERPOL_MODEL_IMPL_HPP
12 #include "Teuchos_StandardParameterEntryValidators.hpp"
14 #include "Thyra_DefaultSpmdVectorSpace.hpp"
15 #include "Thyra_DetachedVectorView.hpp"
16 #include "Thyra_DetachedMultiVectorView.hpp"
17 #include "Thyra_DefaultSerialDenseLinearOpWithSolveFactory.hpp"
18 #include "Thyra_DefaultMultiVectorLinearOpWithSolve.hpp"
19 #include "Thyra_DefaultLinearOpSource.hpp"
20 #include "Thyra_VectorStdOps.hpp"
24 namespace Tempus_Test {
26 template <
class Scalar>
30 isInitialized_ =
false;
36 acceptModelParams_ =
false;
44 x_space_ = Thyra::defaultSpmdVectorSpace<Scalar>(dim_);
45 f_space_ = Thyra::defaultSpmdVectorSpace<Scalar>(dim_);
47 p_space_ = Thyra::defaultSpmdVectorSpace<Scalar>(np_);
48 g_space_ = Thyra::defaultSpmdVectorSpace<Scalar>(ng_);
50 setParameterList(pList_);
53 template <
class Scalar>
58 true, std::logic_error,
59 "Error - No exact solution for van der Pol problem!\n");
63 template <
class Scalar>
68 !isInitialized_, std::logic_error,
69 "Error - No exact sensitivities for van der Pol problem!\n");
73 template <
class Scalar>
80 template <
class Scalar>
87 template <
class Scalar>
92 "Error, setupInOutArgs_ must be called first!\n");
93 return nominalValues_;
96 template <
class Scalar>
102 this->get_W_factory();
120 V_V(multivec->col(0).
ptr(), *vec);
126 V_V(multivec->col(1).
ptr(), *vec);
130 Thyra::linearOpWithSolve<Scalar>(*W_factory, matrix);
135 template <
class Scalar>
140 Thyra::createMembers(x_space_, dim_);
144 template <
class Scalar>
149 Thyra::defaultSerialDenseLinearOpWithSolveFactory<Scalar>();
153 template <
class Scalar>
163 template <
class Scalar>
171 template <
class Scalar>
178 "Error, setupInOutArgs_ must be called first!\n");
181 inArgs.
get_x().assert_not_null();
185 Scalar epsilon = epsilon_;
186 if (acceptModelParams_) {
188 inArgs.
get_p(0).assert_not_null();
190 epsilon = p_in_view[0];
198 if (acceptModelParams_) {
207 f_out_view[0] = x_in_view[1];
209 ((1.0 - x_in_view[0] * x_in_view[0]) * x_in_view[1] - x_in_view[0]) /
217 matrix_view(0, 0) = 0.0;
218 matrix_view(0, 1) = +beta;
219 matrix_view(1, 0) = -beta * (2.0 * x_in_view[0] * x_in_view[1] + 1.0) /
221 matrix_view(1, 1) = beta * (1.0 - x_in_view[0] * x_in_view[0]) /
227 DfDp_out_view(0, 0) = 0.0;
228 DfDp_out_view(1, 0) =
229 -((1.0 - x_in_view[0] * x_in_view[0]) * x_in_view[1] - x_in_view[0]) /
236 x_dot_in = inArgs.
get_x_dot().assert_not_null();
241 f_out_view[0] = x_dot_in_view[0] - x_in_view[1];
244 ((1.0 - x_in_view[0] * x_in_view[0]) * x_in_view[1] - x_in_view[0]) /
252 matrix_view(0, 0) = alpha;
253 matrix_view(0, 1) = -beta;
254 matrix_view(1, 0) = beta * (2.0 * x_in_view[0] * x_in_view[1] + 1.0) /
256 matrix_view(1, 1) = alpha - beta * (1.0 - x_in_view[0] * x_in_view[0]) /
262 DfDp_out_view(0, 0) = 0.0;
263 DfDp_out_view(1, 0) =
264 ((1.0 - x_in_view[0] * x_in_view[0]) * x_in_view[1] - x_in_view[0]) /
270 template <
class Scalar>
274 if (!acceptModelParams_) {
275 return Teuchos::null;
281 template <
class Scalar>
285 if (!acceptModelParams_) {
286 return Teuchos::null;
291 p_strings->push_back(
"Model Coefficient: epsilon");
295 template <
class Scalar>
305 template <
class Scalar>
308 if (isInitialized_) {
316 inArgs.
setSupports(Thyra::ModelEvaluatorBase::IN_ARG_t);
317 inArgs.
setSupports(Thyra::ModelEvaluatorBase::IN_ARG_x);
318 inArgs.
setSupports(Thyra::ModelEvaluatorBase::IN_ARG_beta);
319 inArgs.
setSupports(Thyra::ModelEvaluatorBase::IN_ARG_x_dot);
320 inArgs.
setSupports(Thyra::ModelEvaluatorBase::IN_ARG_alpha);
321 if (acceptModelParams_) {
331 outArgs.
setSupports(Thyra::ModelEvaluatorBase::OUT_ARG_f);
332 outArgs.
setSupports(Thyra::ModelEvaluatorBase::OUT_ARG_W_op);
333 if (acceptModelParams_) {
335 outArgs.
setSupports(Thyra::ModelEvaluatorBase::OUT_ARG_DfDp, 0,
336 Thyra::ModelEvaluatorBase::DERIV_MV_JACOBIAN_FORM);
342 nominalValues_ = inArgs_;
345 nominalValues_.set_t(t0_ic_);
349 x_ic_view[0] = x0_ic_;
350 x_ic_view[1] = x1_ic_;
352 nominalValues_.set_x(x_ic);
353 if (acceptModelParams_) {
357 p_ic_view[0] = epsilon_;
359 nominalValues_.set_p(0, p_ic);
364 x_dot_ic_view[0] = x1_ic_;
365 x_dot_ic_view[1] = ((1.0 - x0_ic_ * x0_ic_) * x1_ic_ - x0_ic_) / epsilon_;
367 nominalValues_.set_x_dot(x_dot_ic);
370 isInitialized_ =
true;
373 template <
class Scalar>
381 if (paramList != Teuchos::null) tmpPL = paramList;
383 this->setMyParamList(tmpPL);
385 bool acceptModelParams = get<bool>(*pl,
"Accept model parameters");
386 bool haveIC = get<bool>(*pl,
"Provide nominal values");
387 if ((acceptModelParams != acceptModelParams_) || (haveIC != haveIC_)) {
388 isInitialized_ =
false;
390 acceptModelParams_ = acceptModelParams;
392 epsilon_ = get<Scalar>(*pl,
"Coeff epsilon");
393 x0_ic_ = get<Scalar>(*pl,
"IC x0");
394 x1_ic_ = get<Scalar>(*pl,
"IC x1");
395 t0_ic_ = get<Scalar>(*pl,
"IC t0");
399 template <
class Scalar>
406 pl->
set(
"Accept model parameters",
false);
407 pl->
set(
"Provide nominal values",
true);
408 Teuchos::setDoubleParameter(
"Coeff epsilon", 1.0e-06,
409 "Coefficient a in model", &*pl);
410 Teuchos::setDoubleParameter(
"IC x0", 2.0,
"Initial Condition for x0", &*pl);
411 Teuchos::setDoubleParameter(
"IC x1", 0.0,
"Initial Condition for x1", &*pl);
412 Teuchos::setDoubleParameter(
"IC t0", 0.0,
"Initial time t0", &*pl);
413 Teuchos::setIntParameter(
"Number of Time Step Sizes", 1,
414 "Number time step sizes for convergence study",
422 #endif // TEMPUS_TEST_VANDERPOL_MODEL_IMPL_HPP
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
bool is_null(const boost::shared_ptr< T > &p)
Derivative< Scalar > get_DfDp(int l) const
RCP< const VectorBase< Scalar > > get_x_dot() const
void setModelEvalDescription(const std::string &modelEvalDescription)
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
void set_Np_Ng(int Np, int Ng)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Evaluation< VectorBase< Scalar > > get_f() const
Thyra::ModelEvaluatorBase::InArgs< Scalar > getNominalValues() const
Thyra::ModelEvaluatorBase::InArgs< Scalar > getExactSolution(double t) const
Thyra::ModelEvaluatorBase::InArgs< Scalar > createInArgs() const
Teuchos::RCP< const Thyra::LinearOpWithSolveFactoryBase< Scalar > > get_W_factory() const
VanDerPolModel(Teuchos::RCP< Teuchos::ParameterList > pList=Teuchos::null)
#define TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(index, lower_inclusive, upper_exclusive)
void setSupports(EInArgsMembers arg, bool supports=true)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Teuchos::RCP< Thyra::LinearOpBase< Scalar > > create_W_op() const
Teuchos::RCP< Thyra::LinearOpWithSolveBase< Scalar > > create_W() const
void validateParametersAndSetDefaults(ParameterList const &validParamList, int const depth=1000)
void evalModelImpl(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs_bar, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs_bar) const
Teuchos::RCP< const Teuchos::Array< std::string > > get_p_names(int l) const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_g_space(int j) const
void setSupports(EOutArgsMembers arg, bool supports=true)
void setParameterList(Teuchos::RCP< Teuchos::ParameterList > const ¶mList)
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_x_space() const
Thyra::ModelEvaluatorBase::InArgs< Scalar > getExactSensSolution(int j, double t) const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_p_space(int l) const
void setupInOutArgs_() const
void setModelEvalDescription(const std::string &modelEvalDescription)
RCP< LinearOpBase< Scalar > > get_W_op() const
RCP< const VectorBase< Scalar > > get_x() const
Thyra::ModelEvaluatorBase::OutArgs< Scalar > createOutArgsImpl() const
RCP< const VectorBase< Scalar > > get_p(int l) const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_f_space() const
RCP< MultiVectorBase< Scalar > > getMultiVector() const