9 #ifndef Tempus_WrapperModelEvaluatorSecondOrder_impl_hpp
10 #define Tempus_WrapperModelEvaluatorSecondOrder_impl_hpp
14 template <
typename Scalar>
18 #ifdef VERBOSE_DEBUG_OUTPUT
19 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
23 MEB::InArgsSetup<Scalar> inArgs;
24 inArgs.setModelEvalDescription(this->description());
25 inArgs.set_Np(appModel_->Np());
26 inArgs.setSupports(MEB::IN_ARG_x);
28 return std::move(inArgs);
31 template <
typename Scalar>
35 #ifdef VERBOSE_DEBUG_OUTPUT
36 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
40 MEB::OutArgsSetup<Scalar> outArgs;
41 outArgs.setModelEvalDescription(this->description());
42 outArgs.set_Np_Ng(appModel_->Np(), 0);
43 outArgs.setSupports(MEB::OUT_ARG_f);
44 outArgs.setSupports(MEB::OUT_ARG_W_op);
46 return std::move(outArgs);
49 template <
typename Scalar>
54 #ifdef VERBOSE_DEBUG_OUTPUT
55 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
62 MEB::InArgs<Scalar> appInArgs = appModel_->createInArgs();
63 MEB::OutArgs<Scalar> appOutArgs = appModel_->createOutArgs();
65 switch (schemeType_) {
66 case NEWMARK_IMPLICIT_AFORM: {
74 appInArgs.set_x_dot_dot(inArgs.
get_x());
78 auto velocity = Thyra::createMember(inArgs.
get_x()->space());
79 Thyra::V_StVpStV(velocity.ptr(), Scalar(1.0), *v_pred_, delta_t_ * gamma_,
81 appInArgs.set_x_dot(velocity);
85 auto displacement = Thyra::createMember(inArgs.
get_x()->space());
86 Thyra::V_StVpStV(displacement.ptr(), Scalar(1.0), *d_pred_,
87 beta_ * delta_t_ * delta_t_, *inArgs.
get_x());
88 appInArgs.set_x(displacement);
90 appInArgs.set_W_x_dot_dot_coeff(Scalar(1.0));
91 appInArgs.set_alpha(gamma_ * delta_t_);
92 appInArgs.set_beta(beta_ * delta_t_ * delta_t_);
95 for (
int i = 0; i < appModel_->Np(); ++i) {
96 if (inArgs.
get_p(i) != Teuchos::null)
97 appInArgs.set_p(i, inArgs.
get_p(i));
102 appOutArgs.set_f(outArgs.
get_f());
103 appOutArgs.set_W_op(outArgs.
get_W_op());
106 appModel_->evalModel(appInArgs, appOutArgs);
110 case NEWMARK_IMPLICIT_DFORM: {
113 RCP<Thyra::VectorBase<Scalar>
const> d = inArgs.
get_x();
115 RCP<Thyra::VectorBase<Scalar>> v =
116 Thyra::createMember(inArgs.
get_x()->space());
118 RCP<Thyra::VectorBase<Scalar>> a =
119 Thyra::createMember(inArgs.
get_x()->space());
124 *out_ <<
"\n*** d_bef ***\n";
125 RTOpPack::ConstSubVectorView<Scalar> dov;
126 d->acquireDetachedView(range, &dov);
127 auto doa = dov.values();
128 for (
auto i = 0; i < doa.size(); ++i) *out_ << doa[i] <<
" ";
129 *out_ <<
"\n*** d_bef ***\n";
131 *out_ <<
"\n*** v_bef ***\n";
132 RTOpPack::ConstSubVectorView<Scalar> vov;
133 v->acquireDetachedView(range, &vov);
134 auto voa = vov.values();
135 for (
auto i = 0; i < voa.size(); ++i) *out_ << voa[i] <<
" ";
136 *out_ <<
"\n*** v_bef ***\n";
138 *out_ <<
"\n*** a_bef ***\n";
139 RTOpPack::ConstSubVectorView<Scalar> aov;
140 a->acquireDetachedView(range, &aov);
141 auto aoa = aov.values();
142 for (
auto i = 0; i < aoa.size(); ++i) *out_ << aoa[i] <<
" ";
143 *out_ <<
"\n*** a_bef ***\n";
146 Scalar
const c = 1.0 / beta_ / delta_t_ / delta_t_;
150 Thyra::V_StVpStV(Teuchos::ptrFromRef(*a), c, *d, -c, *d_pred_);
154 Thyra::V_StVpStV(Teuchos::ptrFromRef(*v), 1.0, *v_pred_,
155 delta_t_ * gamma_, *a);
158 appInArgs.set_x_dot(v);
159 appInArgs.set_x_dot_dot(a);
161 appInArgs.set_W_x_dot_dot_coeff(c);
162 appInArgs.set_alpha(gamma_ / delta_t_ / beta_);
163 appInArgs.set_beta(1.0);
166 for (
int i = 0; i < appModel_->Np(); ++i) {
167 if (inArgs.
get_p(i) != Teuchos::null)
168 appInArgs.set_p(i, inArgs.
get_p(i));
173 appOutArgs.set_f(outArgs.
get_f());
174 appOutArgs.set_W_op(outArgs.
get_W_op());
177 appModel_->evalModel(appInArgs, appOutArgs);
181 Thyra::V_StVpStV(Teuchos::ptrFromRef(*a), c, *d, -c, *d_pred_);
185 Thyra::V_StVpStV(Teuchos::ptrFromRef(*v), 1.0, *v_pred_,
186 delta_t_ * gamma_, *a);
189 appInArgs.set_x_dot(v);
190 appInArgs.set_x_dot_dot(a);
193 *out_ <<
"\n*** d_aft ***\n";
194 RTOpPack::ConstSubVectorView<Scalar> dnv;
195 d->acquireDetachedView(range, &dnv);
196 auto dna = dnv.values();
197 for (
auto i = 0; i < dna.size(); ++i) *out_ << dna[i] <<
" ";
198 *out_ <<
"\n*** d_aft ***\n";
200 *out_ <<
"\n*** v_aft ***\n";
201 RTOpPack::ConstSubVectorView<Scalar> vnv;
202 v->acquireDetachedView(range, &vnv);
203 auto vna = vnv.values();
204 for (
auto i = 0; i < vna.size(); ++i) *out_ << vna[i] <<
" ";
205 *out_ <<
"\n*** v_aft ***\n";
207 *out_ <<
"\n*** a_aft ***\n";
208 RTOpPack::ConstSubVectorView<Scalar> anv;
209 a->acquireDetachedView(range, &anv);
210 auto ana = anv.values();
211 for (
auto i = 0; i < ana.size(); ++i) *out_ << ana[i] <<
" ";
212 *out_ <<
"\n*** a_aft ***\n";
221 #endif // Tempus_WrapperModelEvaluatorSecondOrder_impl_hpp
Thyra::ModelEvaluatorBase::OutArgs< Scalar > createOutArgsImpl() const
Evaluation< VectorBase< Scalar > > get_f() const
void evalModelImpl(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
RCP< LinearOpBase< Scalar > > get_W_op() const
Thyra::ModelEvaluatorBase::InArgs< Scalar > createInArgs() const
RCP< const VectorBase< Scalar > > get_x() const
RCP< const VectorBase< Scalar > > get_p(int l) const