9 #ifndef TEMPUS_TEST_STEADY_QUADRATIC_MODEL_IMPL_HPP
10 #define TEMPUS_TEST_STEADY_QUADRATIC_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_MultiVectorStdOps.hpp"
21 #include "Thyra_VectorStdOps.hpp"
22 #include "Thyra_DefaultMultiVectorProductVector.hpp"
26 namespace Tempus_Test {
28 template <
class Scalar>
32 isInitialized_ =
false;
38 useDfDpAsTangent_ =
false;
42 x_space_ = Thyra::defaultSpmdVectorSpace<Scalar>(dim_);
43 f_space_ = Thyra::defaultSpmdVectorSpace<Scalar>(dim_);
45 p_space_ = Thyra::defaultSpmdVectorSpace<Scalar>(np_);
46 g_space_ = Thyra::defaultSpmdVectorSpace<Scalar>(ng_);
48 setParameterList(pList_);
51 DxDp_space_ = Thyra::multiVectorProductVectorSpace(x_space_, np_);
54 template <
class Scalar>
57 if (b_ < 0.0)
return b_;
61 template <
class Scalar>
64 if (b_ < 0.0)
return 1.0;
68 template <
class Scalar>
75 template <
class Scalar>
82 template <
class Scalar>
87 "Error, setupInOutArgs_ must be called first!\n");
88 return nominalValues_;
91 template <
class Scalar>
97 this->get_W_factory();
114 V_V(multivec->col(0).
ptr(), *vec);
118 Thyra::linearOpWithSolve<Scalar>(*W_factory, matrix);
122 template <
class Scalar>
127 Thyra::createMembers(x_space_, dim_);
131 template <
class Scalar>
136 Thyra::defaultSerialDenseLinearOpWithSolveFactory<Scalar>();
140 template <
class Scalar>
150 template <
class Scalar>
158 template <
class Scalar>
165 using Teuchos::rcp_dynamic_cast;
169 "Error, setupInOutArgs_ must be called first!\n");
176 if (p_in != Teuchos::null) {
182 if (inArgs.
get_p(1) != Teuchos::null)
183 DxDp_in = rcp_dynamic_cast<const DMVPV>(inArgs.
get_p(1))->getMultiVector();
184 if (inArgs.
get_p(2) != Teuchos::null)
186 rcp_dynamic_cast<const DMVPV>(inArgs.
get_p(2))->getMultiVector();
200 f_out_view[0] = x_in_view[0] * x_in_view[0] - b * b;
207 matrix_view(0, 0) = beta * 2.0 * x_in_view[0];
211 DfDp_out_view(0, 0) = -2.0 * b;
214 if (useDfDpAsTangent_ && !
is_null(DxDp_in)) {
216 DfDp_out_view(0, 0) += 2.0 * x_in_view[0] * DxDp(0, 0);
223 x_dot_in = inArgs.
get_x_dot().assert_not_null();
228 f_out_view[0] = x_dot_in_view[0] - (x_in_view[0] * x_in_view[0] - b * b);
235 matrix_view(0, 0) = alpha - beta * 2.0 * x_in_view[0];
239 DfDp_out_view(0, 0) = 2.0 * b;
242 if (useDfDpAsTangent_ && !
is_null(DxdotDp_in)) {
244 DfDp_out_view(0, 0) += DxdotDp(0, 0);
246 if (useDfDpAsTangent_ && !
is_null(DxDp_in)) {
248 DfDp_out_view(0, 0) += -2.0 * x_in_view[0] * DxDp(0, 0);
255 if (g_out != Teuchos::null) Thyra::assign(g_out.
ptr(), *x_in);
258 outArgs.
get_DgDp(0, 0).getMultiVector();
259 if (DgDp_out != Teuchos::null) Thyra::assign(DgDp_out.ptr(), Scalar(0.0));
262 outArgs.
get_DgDx(0).getMultiVector();
263 if (DgDx_out != Teuchos::null) {
265 DgDx_out_view(0, 0) = 1.0;
269 template <
class Scalar>
276 else if (l == 1 || l == 2)
278 return Teuchos::null;
281 template <
class Scalar>
289 p_strings->push_back(
"Model Coefficient: b");
292 p_strings->push_back(
"DxDp");
294 p_strings->push_back(
"Dx_dotDp");
298 template <
class Scalar>
308 template <
class Scalar>
311 if (isInitialized_) {
319 inArgs.
setSupports(Thyra::ModelEvaluatorBase::IN_ARG_t);
320 inArgs.
setSupports(Thyra::ModelEvaluatorBase::IN_ARG_x);
321 inArgs.
setSupports(Thyra::ModelEvaluatorBase::IN_ARG_beta);
322 inArgs.
setSupports(Thyra::ModelEvaluatorBase::IN_ARG_x_dot);
323 inArgs.
setSupports(Thyra::ModelEvaluatorBase::IN_ARG_alpha);
332 outArgs.
setSupports(Thyra::ModelEvaluatorBase::OUT_ARG_f);
333 outArgs.
setSupports(Thyra::ModelEvaluatorBase::OUT_ARG_W_op);
335 outArgs.
setSupports(Thyra::ModelEvaluatorBase::OUT_ARG_DfDp, 0,
336 Thyra::ModelEvaluatorBase::DERIV_MV_JACOBIAN_FORM);
337 outArgs.
setSupports(Thyra::ModelEvaluatorBase::OUT_ARG_DgDx, 0,
338 Thyra::ModelEvaluatorBase::DERIV_MV_GRADIENT_FORM);
339 outArgs.
setSupports(Thyra::ModelEvaluatorBase::OUT_ARG_DgDp, 0, 0,
340 Thyra::ModelEvaluatorBase::DERIV_MV_GRADIENT_FORM);
345 nominalValues_ = inArgs_;
346 nominalValues_.set_t(0.0);
352 nominalValues_.set_x(x_ic);
358 nominalValues_.set_p(0, p_ic);
361 createMember(x_space_);
364 x_dot_ic_view[0] = 0.0;
366 nominalValues_.set_x_dot(x_dot_ic);
368 isInitialized_ =
true;
371 template <
class Scalar>
379 if (paramList != Teuchos::null) tmpPL = paramList;
381 this->setMyParamList(tmpPL);
383 useDfDpAsTangent_ = get<bool>(*pl,
"Use DfDp as Tangent");
384 b_ = get<Scalar>(*pl,
"Coeff b");
385 isInitialized_ =
false;
389 template <
class Scalar>
396 pl->
set(
"Use DfDp as Tangent",
false);
397 Teuchos::setDoubleParameter(
"Coeff b", 1.0,
"Coefficient b in model", &*pl);
404 #endif // TEMPUS_TEST_STEADY_QUADRATIC_MODEL_IMPL_HPP
Teuchos::RCP< Thyra::LinearOpBase< Scalar > > create_W_op() const
void evalModelImpl(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs_bar, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs_bar) const
bool is_null(const boost::shared_ptr< T > &p)
Scalar getSteadyStateSolution() const
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)
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_p_space(int l) const
Evaluation< VectorBase< Scalar > > get_g(int j) const
Evaluation< VectorBase< Scalar > > get_f() const
Thyra::ModelEvaluatorBase::InArgs< Scalar > createInArgs() const
Derivative< Scalar > get_DgDp(int j, int l) const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_g_space(int j) const
#define TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(index, lower_inclusive, upper_exclusive)
void setSupports(EInArgsMembers arg, bool supports=true)
Teuchos::RCP< const Teuchos::Array< std::string > > get_p_names(int l) const
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
void setParameterList(Teuchos::RCP< Teuchos::ParameterList > const ¶mList)
Teuchos::RCP< Thyra::LinearOpWithSolveBase< Scalar > > create_W() const
void validateParametersAndSetDefaults(ParameterList const &validParamList, int const depth=1000)
Thyra::ModelEvaluatorBase::InArgs< Scalar > getNominalValues() const
void setSupports(EOutArgsMembers arg, bool supports=true)
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_f_space() const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_x_space() const
Teuchos::RCP< const Thyra::LinearOpWithSolveFactoryBase< Scalar > > get_W_factory() const
void setModelEvalDescription(const std::string &modelEvalDescription)
Thyra::ModelEvaluatorBase::OutArgs< Scalar > createOutArgsImpl() const
void setupInOutArgs_() const
RCP< LinearOpBase< Scalar > > get_W_op() const
RCP< const VectorBase< Scalar > > get_x() const
SteadyQuadraticModel(Teuchos::RCP< Teuchos::ParameterList > pList=Teuchos::null)
RCP< const VectorBase< Scalar > > get_p(int l) const
RCP< MultiVectorBase< Scalar > > getMultiVector() const
Derivative< Scalar > get_DgDx(int j) const
Scalar getSteadyStateSolutionSensitivity() const