9 #ifndef Tempus_WrapperModelEvaluatorSecondOrder_impl_hpp
10 #define Tempus_WrapperModelEvaluatorSecondOrder_impl_hpp
15 template <
typename Scalar>
16 Thyra::ModelEvaluatorBase::InArgs<Scalar>
20 #ifdef VERBOSE_DEBUG_OUTPUT
21 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
23 typedef Thyra::ModelEvaluatorBase MEB;
25 MEB::InArgsSetup<Scalar> inArgs;
26 inArgs.setModelEvalDescription(this->description());
27 inArgs.set_Np(appModel_->Np());
28 inArgs.setSupports(MEB::IN_ARG_x);
34 template <
typename Scalar>
35 Thyra::ModelEvaluatorBase::OutArgs<Scalar>
39 #ifdef VERBOSE_DEBUG_OUTPUT
40 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
42 typedef Thyra::ModelEvaluatorBase MEB;
44 MEB::OutArgsSetup<Scalar> outArgs;
45 outArgs.setModelEvalDescription(this->description());
46 outArgs.set_Np_Ng(appModel_->Np(),0);
47 outArgs.setSupports(MEB::OUT_ARG_f);
48 outArgs.setSupports(MEB::OUT_ARG_W_op);
54 template <
typename Scalar>
58 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
60 #ifdef VERBOSE_DEBUG_OUTPUT
61 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
63 typedef Thyra::ModelEvaluatorBase MEB;
68 MEB::InArgs<Scalar> appInArgs = appModel_->createInArgs();
69 MEB::OutArgs<Scalar> appOutArgs = appModel_->createOutArgs();
73 case NEWMARK_IMPLICIT_AFORM: {
78 appInArgs.set_x_dot_dot(inArgs.get_x());
79 RCP<Thyra::VectorBase<Scalar> > velocity = Thyra::createMember(inArgs.get_x()->space());
81 Thyra::V_StVpStV(Teuchos::ptrFromRef(*velocity), 1.0, *v_pred_, delta_t_*gamma_, *inArgs.get_x());
82 appInArgs.set_x_dot(velocity);
83 RCP<Thyra::VectorBase<Scalar> > displacement = Thyra::createMember(inArgs.get_x()->space());
85 Thyra::V_StVpStV(Teuchos::ptrFromRef(*displacement), 1.0, *d_pred_, beta_*delta_t_*delta_t_, *inArgs.get_x());
86 appInArgs.set_x(displacement);
87 appInArgs.set_W_x_dot_dot_coeff(1.0);
88 appInArgs.set_alpha(gamma_*delta_t_);
89 appInArgs.set_beta(beta_*delta_t_*delta_t_);
92 for (
int i=0; i<appModel_->Np(); ++i) {
93 if (inArgs.get_p(i) != Teuchos::null)
94 appInArgs.set_p(i, inArgs.get_p(i));
99 appOutArgs.set_f(outArgs.get_f());
100 appOutArgs.set_W_op(outArgs.get_W_op());
103 appModel_->evalModel(appInArgs,appOutArgs);
107 case NEWMARK_IMPLICIT_DFORM: {
110 RCP<Thyra::VectorBase<Scalar>
const>
113 RCP<Thyra::VectorBase<Scalar>>
114 v = Thyra::createMember(inArgs.get_x()->space());
116 RCP<Thyra::VectorBase<Scalar>>
117 a = Thyra::createMember(inArgs.get_x()->space());
120 Teuchos::Range1D range;
122 *out_ <<
"\n*** d_bef ***\n";
123 RTOpPack::ConstSubVectorView<Scalar> dov;
124 d->acquireDetachedView(range, &dov);
125 auto doa = dov.values();
126 for (
auto i = 0; i < doa.size(); ++i) *out_ << doa[i] <<
" ";
127 *out_ <<
"\n*** d_bef ***\n";
129 *out_ <<
"\n*** v_bef ***\n";
130 RTOpPack::ConstSubVectorView<Scalar> vov;
131 v->acquireDetachedView(range, &vov);
132 auto voa = vov.values();
133 for (
auto i = 0; i < voa.size(); ++i) *out_ << voa[i] <<
" ";
134 *out_ <<
"\n*** v_bef ***\n";
136 *out_ <<
"\n*** a_bef ***\n";
137 RTOpPack::ConstSubVectorView<Scalar> aov;
138 a->acquireDetachedView(range, &aov);
139 auto aoa = aov.values();
140 for (
auto i = 0; i < aoa.size(); ++i) *out_ << aoa[i] <<
" ";
141 *out_ <<
"\n*** a_bef ***\n";
145 c = 1.0 / beta_ / delta_t_ / delta_t_;
149 Thyra::V_StVpStV(Teuchos::ptrFromRef(*a), c, *d, -c, *d_pred_);
154 Teuchos::ptrFromRef(*v), 1.0, *v_pred_, delta_t_ * gamma_, *a);
157 appInArgs.set_x_dot(v);
158 appInArgs.set_x_dot_dot(a);
160 appInArgs.set_W_x_dot_dot_coeff(c);
161 appInArgs.set_alpha(gamma_ / delta_t_ / beta_);
162 appInArgs.set_beta(1.0);
165 for (
int i = 0; i < appModel_->Np(); ++i) {
166 if (inArgs.get_p(i) != Teuchos::null)
167 appInArgs.set_p(i, inArgs.get_p(i));
172 appOutArgs.set_f(outArgs.get_f());
173 appOutArgs.set_W_op(outArgs.get_W_op());
176 appModel_->evalModel(appInArgs, appOutArgs);
180 Thyra::V_StVpStV(Teuchos::ptrFromRef(*a), c, *d, -c, *d_pred_);
185 Teuchos::ptrFromRef(*v), 1.0, *v_pred_, delta_t_ * gamma_, *a);
188 appInArgs.set_x_dot(v);
189 appInArgs.set_x_dot_dot(a);
192 *out_ <<
"\n*** d_aft ***\n";
193 RTOpPack::ConstSubVectorView<Scalar> dnv;
194 d->acquireDetachedView(range, &dnv);
195 auto dna = dnv.values();
196 for (
auto i = 0; i < dna.size(); ++i) *out_ << dna[i] <<
" ";
197 *out_ <<
"\n*** d_aft ***\n";
199 *out_ <<
"\n*** v_aft ***\n";
200 RTOpPack::ConstSubVectorView<Scalar> vnv;
201 v->acquireDetachedView(range, &vnv);
202 auto vna = vnv.values();
203 for (
auto i = 0; i < vna.size(); ++i) *out_ << vna[i] <<
" ";
204 *out_ <<
"\n*** v_aft ***\n";
206 *out_ <<
"\n*** a_aft ***\n";
207 RTOpPack::ConstSubVectorView<Scalar> anv;
208 a->acquireDetachedView(range, &anv);
209 auto ana = anv.values();
210 for (
auto i = 0; i < ana.size(); ++i) *out_ << ana[i] <<
" ";
211 *out_ <<
"\n*** a_aft ***\n";
221 #endif // Tempus_WrapperModelEvaluatorSecondOrder_impl_hpp