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_STEPPER_AS_MODEL_EVALUATOR_HPP
00031 #define RYTHMOS_STEPPER_AS_MODEL_EVALUATOR_HPP
00032
00033
00034 #include "Thyra_ResponseOnlyModelEvaluatorBase.hpp"
00035
00036 #include "Rythmos_StepperBase.hpp"
00037 #include "Rythmos_IntegratorBase.hpp"
00038 #include "Teuchos_StandardMemberCompositionMacros.hpp"
00039 #include "Teuchos_Assert.hpp"
00040
00041
00042 namespace Rythmos {
00043
00044
00051 template<class Scalar>
00052 class StepperAsModelEvaluator
00053 : virtual public Thyra::ResponseOnlyModelEvaluatorBase<Scalar>
00054 {
00055 public:
00056
00059
00061 StepperAsModelEvaluator();
00062
00064 void initialize(
00065 const RCP<StepperBase<Scalar> > &stepper,
00066 const RCP<IntegratorBase<Scalar> > &integrator,
00067 const Thyra::ModelEvaluatorBase::InArgs<Scalar> &initialCondition
00068 );
00069
00071
00074
00076 int Np() const;
00078 int Ng() const;
00080 RCP<const Thyra::VectorSpaceBase<Scalar> >
00081 get_p_space(int l) const;
00083 RCP<const Thyra::VectorSpaceBase<Scalar> >
00084 get_g_space(int j) const;
00086 Thyra::ModelEvaluatorBase::InArgs<Scalar> createInArgs() const;
00087
00089
00090 private:
00091
00094
00096 Thyra::ModelEvaluatorBase::OutArgs<Scalar> createOutArgsImpl() const;
00098 void evalModelImpl(
00099 const Thyra::ModelEvaluatorBase::InArgs<Scalar>& inArgs,
00100 const Thyra::ModelEvaluatorBase::OutArgs<Scalar>& outArgs
00101 ) const;
00102
00104
00105 private:
00106
00107
00108
00109
00110 typedef Array<RCP<const Thyra::VectorSpaceBase<Scalar> > > SpaceArray_t;
00111
00112
00113
00114
00115
00116 RCP<StepperBase<Scalar> > stepper_;
00117 RCP<IntegratorBase<Scalar> > integrator_;
00118 Thyra::ModelEvaluatorBase::InArgs<Scalar> initialCondition_;
00119
00120 int Np_;
00121 int Ng_;
00122
00123 SpaceArray_t g_space_;
00124 SpaceArray_t p_space_;
00125
00126 mutable Thyra::ModelEvaluatorBase::InArgs<Scalar> currentInitialCondition_;
00127
00128 };
00129
00130
00132 template<class Scalar>
00133 RCP<StepperAsModelEvaluator<Scalar> >
00134 stepperAsModelEvaluator(
00135 const RCP<StepperBase<Scalar> > &stepper,
00136 const RCP<IntegratorBase<Scalar> > &integrator,
00137 const Thyra::ModelEvaluatorBase::InArgs<Scalar> &initialCondition
00138 )
00139 {
00140 using Teuchos::rcp;
00141 RCP<StepperAsModelEvaluator<Scalar> >
00142 stepperAsModelEvaluator = rcp(new StepperAsModelEvaluator<Scalar>());
00143 stepperAsModelEvaluator->initialize(stepper,integrator,initialCondition);
00144 return stepperAsModelEvaluator;
00145 }
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155 template<class Scalar>
00156 StepperAsModelEvaluator<Scalar>::StepperAsModelEvaluator()
00157 : Np_(0), Ng_(0)
00158 {}
00159
00160
00161 template<class Scalar>
00162 void StepperAsModelEvaluator<Scalar>::initialize(
00163 const RCP<StepperBase<Scalar> > &stepper,
00164 const RCP<IntegratorBase<Scalar> > &integrator,
00165 const Thyra::ModelEvaluatorBase::InArgs<Scalar> &initialCondition
00166 )
00167 {
00168
00169 #ifdef TEUCHOS_DEBUG
00170 TEST_FOR_EXCEPT(is_null(stepper));
00171 TEST_FOR_EXCEPT(is_null(stepper->getModel()));
00172 TEST_FOR_EXCEPT(is_null(integrator));
00173 #endif
00174 stepper_ = stepper;
00175 integrator_ = integrator;
00176 initialCondition_ = initialCondition;
00177 currentInitialCondition_ = initialCondition;
00178
00179 const RCP<const Thyra::ModelEvaluator<Scalar> >
00180 stepperModel = stepper_->getModel();
00181
00182 Np_ = stepperModel->Np();
00183 p_space_.clear();
00184 for ( int l = 0; l < Np_; ++l ) {
00185 p_space_.push_back(stepperModel->get_p_space(l));
00186 }
00187
00188 Ng_ = 1;
00189 g_space_.clear();
00190 g_space_.push_back(stepper_->getModel()->get_x_space());
00191
00192 }
00193
00194
00195
00196
00197
00198 template<class Scalar>
00199 int StepperAsModelEvaluator<Scalar>::Np() const
00200 {
00201 return Np_;
00202 }
00203
00204
00205 template<class Scalar>
00206 int StepperAsModelEvaluator<Scalar>::Ng() const
00207 {
00208 return Ng_;
00209 }
00210
00211
00212 template<class Scalar>
00213 RCP<const Thyra::VectorSpaceBase<Scalar> >
00214 StepperAsModelEvaluator<Scalar>::get_p_space(int l) const
00215 {
00216 #ifdef TEUCHOS_DEBUG
00217 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE( l, 0, Np_ );
00218 #endif
00219 return p_space_[l];
00220 }
00221
00222
00223 template<class Scalar>
00224 RCP<const Thyra::VectorSpaceBase<Scalar> >
00225 StepperAsModelEvaluator<Scalar>::get_g_space(int j) const
00226 {
00227 #ifdef TEUCHOS_DEBUG
00228 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE( j, 0, Ng_ );
00229 #endif
00230 return g_space_[j];
00231 }
00232
00233
00234 template<class Scalar>
00235 Thyra::ModelEvaluatorBase::InArgs<Scalar>
00236 StepperAsModelEvaluator<Scalar>::createInArgs() const
00237 {
00238 typedef Thyra::ModelEvaluatorBase MEB;
00239 MEB::InArgsSetup<Scalar> inArgs;
00240 inArgs.setModelEvalDescription(this->description());
00241 inArgs.set_Np(Np_);
00242 inArgs.setSupports(MEB::IN_ARG_t);
00243 return inArgs;
00244 }
00245
00246
00247
00248
00249
00250 template<class Scalar>
00251 Thyra::ModelEvaluatorBase::OutArgs<Scalar>
00252 StepperAsModelEvaluator<Scalar>::createOutArgsImpl() const
00253 {
00254 typedef Thyra::ModelEvaluatorBase MEB;
00255 MEB::OutArgsSetup<Scalar> outArgs;
00256 outArgs.setModelEvalDescription(this->description());
00257 outArgs.set_Np_Ng(Np_,Ng_);
00258 return outArgs;
00259 }
00260
00261
00262 template<class Scalar>
00263 void StepperAsModelEvaluator<Scalar>::evalModelImpl(
00264 const Thyra::ModelEvaluatorBase::InArgs<Scalar>& inArgs,
00265 const Thyra::ModelEvaluatorBase::OutArgs<Scalar>& outArgs
00266 ) const
00267 {
00268
00269 using Teuchos::as;
00270 using Teuchos::describe;
00271 typedef Teuchos::ScalarTraits<Scalar> ST;
00272 typedef Teuchos::VerboseObjectTempState<InterpolationBufferBase<Scalar> > VOTSSB;
00273
00274 THYRA_MODEL_EVALUATOR_DECORATOR_EVAL_MODEL_GEN_BEGIN(
00275 "Rythmos::StepperAsModelEvaluator", inArgs, outArgs, Teuchos::null
00276 );
00277 VOTSSB integrator_outputTempState(integrator_,out,incrVerbLevel(verbLevel,-1));
00278
00279
00280
00281
00282 const Scalar finalTime = inArgs.get_t();
00283 for ( int l = 0; l < Np_; ++l ) {
00284 currentInitialCondition_.set_p(l,inArgs.get_p(l));
00285 }
00286
00287
00288
00289 RCP<Thyra::VectorBase<Scalar> >
00290 g_out = outArgs.get_g(0);
00291
00292 TEST_FOR_EXCEPT(
00293 is_null(g_out) && "You must ask for g(0) when you call this function!"
00294 );
00295
00296 #ifdef TEUCHOS_DEBUG
00297
00298 THYRA_ASSERT_VEC_SPACES(
00299 "StepperAsModelEvaluator<Scalar>::evalModel(...)",
00300 *g_out->space(), *stepper_->get_x_space() );
00301
00302 #endif
00303
00304
00305
00306 stepper_->setInitialCondition(currentInitialCondition_);
00307 integrator_->setStepper(stepper_,finalTime);
00308
00309
00310
00311 if (!is_null(g_out)) {
00312
00313
00314 Array<Scalar> time_vec = Teuchos::tuple<Scalar>(finalTime);
00315 Array<RCP<const Thyra::VectorBase<Scalar> > > x_vec, xdot_vec;
00316 integrator_->getFwdPoints( time_vec, &x_vec, &xdot_vec, 0 );
00317
00318 Thyra::V_V( &*g_out, *x_vec[0] );
00319
00320 }
00321
00322 THYRA_MODEL_EVALUATOR_DECORATOR_EVAL_MODEL_END();
00323
00324 }
00325
00326
00327 }
00328
00329
00330 #endif // RYTHMOS_STEPPER_AS_MODEL_EVALUATOR_HPP