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