Rythmos_SingleResidualModelEvaluator.hpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef RYTHMOS_SINGLE_RESIDUAL_MODEL_EVALUATOR_HPP
00031 #define RYTHMOS_SINGLE_RESIDUAL_MODEL_EVALUATOR_HPP
00032
00033
00034 #include "Rythmos_SingleResidualModelEvaluatorBase.hpp"
00035 #include "Thyra_ModelEvaluatorDelegatorBase.hpp"
00036 #include "Thyra_ModelEvaluatorHelpers.hpp"
00037 #include "Thyra_VectorStdOps.hpp"
00038 #include "Thyra_TestingTools.hpp"
00039 #include "Teuchos_as.hpp"
00040
00041
00042 namespace Rythmos {
00043
00044
00066 template<class Scalar>
00067 class SingleResidualModelEvaluator
00068 : virtual public SingleResidualModelEvaluatorBase<Scalar>,
00069 virtual public Thyra::ModelEvaluatorDelegatorBase<Scalar>
00070 {
00071 public:
00072
00075
00077 SingleResidualModelEvaluator();
00078
00080
00083
00085 void initializeSingleResidualModel(
00086 const RCP<const Thyra::ModelEvaluator<Scalar> > &daeModel,
00087 const Thyra::ModelEvaluatorBase::InArgs<Scalar> &basePoint,
00088 const Scalar &coeff_x_dot,
00089 const RCP<const Thyra::VectorBase<Scalar> > &x_dot_base,
00090 const Scalar &coeff_x,
00091 const RCP<const Thyra::VectorBase<Scalar> > &x_base,
00092 const Scalar &t_base,
00093 const RCP<const Thyra::VectorBase<Scalar> > &x_bar_init
00094 );
00095
00097 Scalar get_coeff_x_dot() const;
00098
00100 RCP<const Thyra::VectorBase<Scalar> >
00101 get_x_dot_base() const;
00102
00104 Scalar get_coeff_x() const;
00105
00107 RCP<const Thyra::VectorBase<Scalar> >
00108 get_x_base() const;
00109
00111 Scalar get_t_base() const;
00112
00114
00117
00119 Thyra::ModelEvaluatorBase::InArgs<Scalar> getNominalValues() const;
00121 Thyra::ModelEvaluatorBase::InArgs<Scalar> createInArgs() const;
00122
00124
00125 private:
00126
00129
00131 Thyra::ModelEvaluatorBase::OutArgs<Scalar> createOutArgsImpl() const;
00133 void evalModelImpl(
00134 const Thyra::ModelEvaluatorBase::InArgs<Scalar>& inArgs,
00135 const Thyra::ModelEvaluatorBase::OutArgs<Scalar>& outArgs
00136 ) const;
00137
00139
00140
00141 private:
00142
00143 Thyra::ModelEvaluatorBase::InArgs<Scalar> basePoint_;
00144 Scalar coeff_x_dot_;
00145 RCP<const Thyra::VectorBase<Scalar> > x_dot_base_;
00146 Scalar coeff_x_;
00147 RCP<const Thyra::VectorBase<Scalar> > x_base_;
00148 Scalar t_base_;
00149
00150 Thyra::ModelEvaluatorBase::InArgs<Scalar> nominalValues_;
00151
00152
00153 RCP<Thyra::VectorBase<Scalar> > x_;
00154 RCP<Thyra::VectorBase<Scalar> > x_dot_;
00155
00156 };
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166 template<class Scalar>
00167 SingleResidualModelEvaluator<Scalar>::SingleResidualModelEvaluator()
00168 {}
00169
00170
00171
00172
00173
00174 template<class Scalar>
00175 void SingleResidualModelEvaluator<Scalar>::initializeSingleResidualModel(
00176 const RCP<const Thyra::ModelEvaluator<Scalar> > &daeModel,
00177 const Thyra::ModelEvaluatorBase::InArgs<Scalar> &basePoint,
00178 const Scalar &coeff_x_dot,
00179 const RCP<const Thyra::VectorBase<Scalar> > &x_dot_base,
00180 const Scalar &coeff_x,
00181 const RCP<const Thyra::VectorBase<Scalar> > &x_base,
00182 const Scalar &t_base,
00183 const RCP<const Thyra::VectorBase<Scalar> > &x_bar_init
00184 )
00185 {
00186 this->Thyra::ModelEvaluatorDelegatorBase<Scalar>::initialize(daeModel);
00187 basePoint_ = basePoint;
00188 coeff_x_dot_ = coeff_x_dot;
00189 x_dot_base_ = x_dot_base;
00190 coeff_x_ = coeff_x;
00191 x_base_ = x_base;
00192 t_base_ = t_base;
00193
00194 nominalValues_ = daeModel->getNominalValues();
00195 nominalValues_.set_x(x_bar_init);
00196
00197 x_dot_ = createMember( daeModel->get_x_space() );
00198 x_ = createMember( daeModel->get_x_space() );
00199
00200
00201
00202 #ifdef THYRA_RYTHMOS_DEBUG
00203 std::cout << "----------------------------------------------------------------------" << std::endl;
00204 std::cout << "Rythmos::SingleResidualModelEvaluator::initialize" << std::endl;
00205 std::cout << "coeff_x_dot_ = " << coeff_x_dot_ << std::endl;
00206 std::cout << "x_dot_base_ = ";
00207 if ( x_dot_base_.get() )
00208 std::cout << "\n" << *x_dot_base_ << std::endl;
00209 else
00210 std::cout << "null" << std::endl;
00211 std::cout << "coeff_x_ = " << coeff_x_ << std::endl;
00212 std::cout << "x_base_ = ";
00213 if ( x_base_.get() )
00214 std::cout << "\n" << *x_base_ << std::endl;
00215 else
00216 std::cout << "null" << std::endl;
00217 std::cout << "t_base_ = " << t_base_ << std::endl;
00218 std::cout << "x_bar_init = ";
00219 if ( x_bar_init.get() )
00220 std::cout << "\n" << *x_bar_init_ << std::endl;
00221 else
00222 std::cout << "null" << std::endl;
00223 std::cout << "x_dot_ = ";
00224 if ( x_dot_.get() )
00225 std::cout << "\n" << *x_dot_ << std::endl;
00226 else
00227 std::cout << "null" << std::endl;
00228 std::cout << "x_ = ";
00229 if ( x_.get() )
00230 std::cout << "\n" << *x_ << std::endl;
00231 else
00232 std::cout << "null" << std::endl;
00233 std::cout << "----------------------------------------------------------------------" << std::endl;
00234 #endif // THYRA_RYTHMOS_DEBUG
00235 }
00236
00237
00238 template<class Scalar>
00239 Scalar SingleResidualModelEvaluator<Scalar>::get_coeff_x_dot() const
00240 {
00241 return coeff_x_dot_;
00242 }
00243
00244
00245 template<class Scalar>
00246 RCP<const Thyra::VectorBase<Scalar> >
00247 SingleResidualModelEvaluator<Scalar>::get_x_dot_base() const
00248 {
00249 return x_dot_base_;
00250 }
00251
00252
00253 template<class Scalar>
00254 Scalar SingleResidualModelEvaluator<Scalar>::get_coeff_x() const
00255 {
00256 return coeff_x_;
00257 }
00258
00259
00260 template<class Scalar>
00261 RCP<const Thyra::VectorBase<Scalar> >
00262 SingleResidualModelEvaluator<Scalar>::get_x_base() const
00263 {
00264 return x_base_;
00265 }
00266
00267
00268 template<class Scalar>
00269 Scalar SingleResidualModelEvaluator<Scalar>::get_t_base() const
00270 {
00271 return t_base_;
00272 }
00273
00274
00275
00276
00277
00278 template<class Scalar>
00279 Thyra::ModelEvaluatorBase::InArgs<Scalar>
00280 SingleResidualModelEvaluator<Scalar>::getNominalValues() const
00281 {
00282 return nominalValues_;
00283 }
00284
00285
00286 template<class Scalar>
00287 Thyra::ModelEvaluatorBase::InArgs<Scalar>
00288 SingleResidualModelEvaluator<Scalar>::createInArgs() const
00289 {
00290 typedef Thyra::ModelEvaluatorBase MEB;
00291 MEB::InArgsSetup<Scalar> inArgs;
00292 inArgs.setModelEvalDescription(this->description());
00293 inArgs.setSupports(MEB::IN_ARG_x);
00294 return inArgs;
00295 }
00296
00297
00298
00299
00300
00301 template<class Scalar>
00302 Thyra::ModelEvaluatorBase::OutArgs<Scalar>
00303 SingleResidualModelEvaluator<Scalar>::createOutArgsImpl() const
00304 {
00305 typedef Thyra::ModelEvaluatorBase MEB;
00306 MEB::OutArgsSetup<Scalar> outArgs;
00307 outArgs.setModelEvalDescription(this->description());
00308 outArgs.setSupports(MEB::OUT_ARG_f);
00309 outArgs.setSupports(MEB::OUT_ARG_W);
00310 return outArgs;
00311 }
00312
00313
00314 template<class Scalar>
00315 void SingleResidualModelEvaluator<Scalar>::evalModelImpl(
00316 const Thyra::ModelEvaluatorBase::InArgs<Scalar>& inArgs_bar,
00317 const Thyra::ModelEvaluatorBase::OutArgs<Scalar>& outArgs_bar
00318 ) const
00319 {
00320
00321 using std::endl;
00322 using Teuchos::as;
00323 typedef Thyra::ModelEvaluatorBase MEB;
00324
00325 const RCP<const Thyra::ModelEvaluator<Scalar> >
00326 daeModel = this->getUnderlyingModel();
00327
00328 THYRA_MODEL_EVALUATOR_DECORATOR_EVAL_MODEL_BEGIN(
00329 "Rythmos::SingleResidualModelEvaluator",inArgs_bar,outArgs_bar
00330 );
00331
00332 const bool dumpAll = ( as<int>(verbLevel) >= as<int>(Teuchos::VERB_EXTREME) );
00333
00334 const Thyra::VectorBase<Scalar> &x_bar = *inArgs_bar.get_x();
00335
00336
00337
00338 if (x_dot_base_.get())
00339 Thyra::V_StVpV( &*x_dot_, coeff_x_dot_, x_bar, *x_dot_base_ );
00340 else
00341 Thyra::V_StV( &*x_dot_, coeff_x_dot_, x_bar);
00342
00343 if (dumpAll) {
00344 *out << "\nx_dot_ = coeff_x_dot_ * x_bar + x_dot_base_\n";
00345 *out << "\ncoeff_x_dot_ = " << coeff_x_dot_ << endl;
00346 *out << "\nx_bar = " << x_bar;
00347 *out << "\nx_dot_base_ = ";
00348 if ( x_dot_base_.get() )
00349 *out << *x_dot_base_;
00350 else
00351 *out << "null" << endl;
00352 *out << "\nx_dot_ = ";
00353 if ( x_dot_.get() )
00354 *out << *x_dot_;
00355 else
00356 *out << "null" << endl;
00357 }
00358
00359
00360
00361 if (x_base_.get())
00362 Thyra::V_StVpV( &*x_, coeff_x_, x_bar, *x_base_ );
00363 else
00364 Thyra::V_StV( &*x_, coeff_x_, x_bar);
00365
00366 if (dumpAll) {
00367 *out << "\nx_ = coeff_x_ * x_bar + x_base_\n";
00368 *out << "\ncoeff_x_ = " << coeff_x_ << endl;
00369 *out << "\nx_bar = " << x_bar;
00370 *out << "\nx_base_ = ";
00371 if ( x_base_.get() )
00372 *out << *x_base_;
00373 else
00374 *out << "null" << endl;
00375 *out << "\nx_ = ";
00376 if ( x_.get() )
00377 *out << *x_;
00378 else
00379 *out << "null" << endl;
00380 }
00381
00382
00383
00384 if (as<int>(verbLevel) >= as<int>(Teuchos::VERB_LOW))
00385 *out << "\nEvaluating the underlying DAE model at (x_bar_dot,x_bar,t) ...\n";
00386
00387 RCP<Thyra::LinearOpWithSolveBase<Scalar> > W;
00388
00389 MEB::InArgs<Scalar> daeInArgs = daeModel->createInArgs();
00390 daeInArgs.setArgs(basePoint_);
00391 daeInArgs.set_x_dot(x_dot_);
00392 daeInArgs.set_x(x_);
00393 daeInArgs.set_t(t_base_);
00394 daeInArgs.set_alpha(coeff_x_dot_);
00395 daeInArgs.set_beta(coeff_x_);
00396 MEB::OutArgs<Scalar> daeOutArgs = daeModel->createOutArgs();
00397 daeOutArgs.set_f(outArgs_bar.get_f());
00398 daeOutArgs.set_W(outArgs_bar.get_W());
00399 daeModel->evalModel(daeInArgs,daeOutArgs);
00400
00401 THYRA_MODEL_EVALUATOR_DECORATOR_EVAL_MODEL_END();
00402
00403 }
00404
00405
00406 }
00407
00408
00409 #endif // RYTHMOS_SINGLE_RESIDUAL_MODEL_EVALUATOR_HPP