42 #ifndef THYRA_DEFAULT_STATE_ELIMINATION_MODEL_EVALUATOR_HPP 43 #define THYRA_DEFAULT_STATE_ELIMINATION_MODEL_EVALUATOR_HPP 45 #include "Thyra_ModelEvaluatorDelegatorBase.hpp" 46 #include "Thyra_DefaultNominalBoundsOverrideModelEvaluator.hpp" 47 #include "Thyra_NonlinearSolverBase.hpp" 48 #include "Teuchos_Time.hpp" 61 template<
class Scalar>
105 Teuchos::RCP<const VectorSpaceBase<Scalar> >
get_x_space()
const;
107 Teuchos::RCP<const VectorSpaceBase<Scalar> >
get_f_space()
const;
115 Teuchos::RCP<LinearOpWithSolveBase<Scalar> >
create_W()
const;
117 Teuchos::RCP<LinearOpBase<Scalar> >
create_W_op()
const;
141 Teuchos::RCP<ModelEvaluator<Scalar> > thyraModel_;
142 Teuchos::RCP<NonlinearSolverBase<Scalar> > stateSolver_;
144 Teuchos::RCP<DefaultNominalBoundsOverrideModelEvaluator<Scalar> > wrappedThyraModel_;
146 mutable Teuchos::RCP<VectorBase<Scalar> > x_guess_solu_;
155 template<
class Scalar>
159 template<
class Scalar>
165 initialize(thyraModel,stateSolver);
168 template<
class Scalar>
175 TEUCHOS_TEST_FOR_EXCEPT(!stateSolver.get());
176 stateSolver_ = stateSolver;
177 x_guess_solu_ = Teuchos::null;
178 wrappedThyraModel_ = Teuchos::rcp(
184 stateSolver_->setModel(wrappedThyraModel_);
187 template<
class Scalar>
193 if(thyraModel) *thyraModel = this->getUnderlyingModel();
194 if(stateSolver) *stateSolver = stateSolver_;
196 stateSolver_ = Teuchos::null;
197 wrappedThyraModel_ = Teuchos::null;
198 x_guess_solu_ = Teuchos::null;
204 template<
class Scalar>
207 const Teuchos::RCP<const ModelEvaluator<Scalar> >
208 thyraModel = this->getUnderlyingModel();
209 std::ostringstream oss;
210 oss <<
"Thyra::DefaultStateEliminationModelEvaluator{";
211 oss <<
"thyraModel=";
213 oss <<
"\'"<<thyraModel->description()<<
"\'";
216 oss <<
",stateSolver=";
217 if(stateSolver_.get())
218 oss <<
"\'"<<stateSolver_->description()<<
"\'";
227 template<
class Scalar>
228 Teuchos::RCP<const VectorSpaceBase<Scalar> >
231 return Teuchos::null;
234 template<
class Scalar>
235 Teuchos::RCP<const VectorSpaceBase<Scalar> >
238 return Teuchos::null;
241 template<
class Scalar>
246 const Teuchos::RCP<const ModelEvaluator<Scalar> >
247 thyraModel = this->getUnderlyingModel();
248 MEB::InArgsSetup<Scalar> nominalValues(thyraModel->getNominalValues());
249 nominalValues.setModelEvalDescription(this->description());
250 nominalValues.setUnsupportsAndRelated(MEB::IN_ARG_x);
251 return nominalValues;
254 template<
class Scalar>
259 const Teuchos::RCP<const ModelEvaluator<Scalar> >
260 thyraModel = this->getUnderlyingModel();
261 MEB::InArgsSetup<Scalar> lowerBounds(thyraModel->getLowerBounds());
262 lowerBounds.setModelEvalDescription(this->description());
263 lowerBounds.setUnsupportsAndRelated(MEB::IN_ARG_x);
267 template<
class Scalar>
272 const Teuchos::RCP<const ModelEvaluator<Scalar> >
273 thyraModel = this->getUnderlyingModel();
274 MEB::InArgsSetup<Scalar> upperBounds(thyraModel->getUpperBounds());
275 upperBounds.setModelEvalDescription(this->description());
276 upperBounds.setUnsupportsAndRelated(MEB::IN_ARG_x);
280 template<
class Scalar>
281 Teuchos::RCP<LinearOpWithSolveBase<Scalar> >
284 return Teuchos::null;
287 template<
class Scalar>
288 Teuchos::RCP<LinearOpBase<Scalar> >
291 return Teuchos::null;
295 template<
class Scalar>
300 const Teuchos::RCP<const ModelEvaluator<Scalar> >
301 thyraModel = this->getUnderlyingModel();
302 const MEB::InArgs<Scalar> wrappedInArgs = thyraModel->createInArgs();
303 MEB::InArgsSetup<Scalar> inArgs;
304 inArgs.setModelEvalDescription(this->description());
305 inArgs.set_Np(wrappedInArgs.Np());
306 inArgs.setSupports(wrappedInArgs);
307 inArgs.setUnsupportsAndRelated(MEB::IN_ARG_x);
315 template<
class Scalar>
320 const Teuchos::RCP<const ModelEvaluator<Scalar> >
321 thyraModel = this->getUnderlyingModel();
322 const MEB::OutArgs<Scalar> wrappedOutArgs = thyraModel->createOutArgs();
323 const int Np = wrappedOutArgs.Np(), Ng = wrappedOutArgs.Ng();
324 MEB::OutArgsSetup<Scalar> outArgs;
325 outArgs.setModelEvalDescription(this->description());
326 outArgs.set_Np_Ng(Np,Ng);
327 outArgs.setSupports(wrappedOutArgs);
328 outArgs.setUnsupportsAndRelated(MEB::IN_ARG_x);
329 outArgs.setUnsupportsAndRelated(MEB::OUT_ARG_f);
333 template<
class Scalar>
334 void DefaultStateEliminationModelEvaluator<Scalar>::evalModelImpl(
335 const ModelEvaluatorBase::InArgs<Scalar> &inArgs,
336 const ModelEvaluatorBase::OutArgs<Scalar> &outArgs
339 typedef ModelEvaluatorBase MEB;
341 using Teuchos::rcp_const_cast;
342 using Teuchos::rcp_dynamic_cast;
343 using Teuchos::OSTab;
346 Teuchos::Time totalTimer(
""), timer(
"");
347 totalTimer.start(
true);
349 const Teuchos::RCP<Teuchos::FancyOStream> out = this->getOStream();
350 const Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel();
351 Teuchos::OSTab tab(out);
352 if(out.get() &&
static_cast<int>(verbLevel) >= static_cast<int>(Teuchos::VERB_LOW))
353 *out <<
"\nEntering Thyra::DefaultStateEliminationModelEvaluator<Scalar>::evalModel(...) ...\n";
355 const Teuchos::RCP<const ModelEvaluator<Scalar> >
356 thyraModel = this->getUnderlyingModel();
358 const int Np = outArgs.Np(), Ng = outArgs.Ng();
361 if (is_null(x_guess_solu_)) {
362 const ModelEvaluatorBase::InArgs<Scalar>
363 nominalValues = thyraModel->getNominalValues();
364 if(nominalValues.get_x().get()) {
365 x_guess_solu_ = nominalValues.get_x()->clone_v();
368 x_guess_solu_ = createMember(thyraModel->get_x_space());
369 assign(x_guess_solu_.ptr(), as<Scalar>(0.0));
374 MEB::InArgs<Scalar> wrappedNominalValues = thyraModel->getNominalValues();
375 wrappedNominalValues.setArgs(inArgs,
true);
376 wrappedNominalValues.set_x(x_guess_solu_);
378 typedef Teuchos::VerboseObjectTempState<ModelEvaluatorBase> VOTSME;
381 typedef Teuchos::VerboseObjectTempState<NonlinearSolverBase<Scalar> > VOTSNSB;
382 VOTSNSB statSolver_outputTempState(
384 ,static_cast<int>(verbLevel) >= static_cast<int>(Teuchos::VERB_LOW) ? Teuchos::VERB_LOW : Teuchos::VERB_NONE
387 if(out.get() &&
static_cast<int>(verbLevel) >= static_cast<int>(Teuchos::VERB_EXTREME))
389 <<
"\ninArgs =\n" << Teuchos::describe(inArgs,verbLevel)
390 <<
"\noutArgs on input =\n" << Teuchos::describe(outArgs,Teuchos::VERB_LOW);
392 if(out.get() &&
static_cast<int>(verbLevel) >= static_cast<int>(Teuchos::VERB_LOW))
393 *out <<
"\nSolving f(x,...) for x ...\n";
395 wrappedThyraModel_->setNominalValues(
396 rcp(
new MEB::InArgs<Scalar>(wrappedNominalValues))
399 SolveStatus<Scalar> solveStatus = stateSolver_->solve(&*x_guess_solu_,NULL);
403 if(out.get() &&
static_cast<int>(verbLevel) >= static_cast<int>(Teuchos::VERB_LOW))
404 *out <<
"\nComputing the output functions at the solved state solution ...\n";
406 MEB::InArgs<Scalar> wrappedInArgs = thyraModel->createInArgs();
407 MEB::OutArgs<Scalar> wrappedOutArgs = thyraModel->createOutArgs();
408 wrappedInArgs.setArgs(inArgs,
true);
409 wrappedInArgs.set_x(x_guess_solu_);
410 wrappedOutArgs.setArgs(outArgs,
true);
412 for(
int l = 0; l < Np; ++l ) {
413 for(
int j = 0; j < Ng; ++j ) {
415 outArgs.supports(MEB::OUT_ARG_DgDp,j,l).none()==
false 416 && outArgs.get_DgDp(j,l).isEmpty()==false
422 TEUCHOS_TEST_FOR_EXCEPT(
true);
427 thyraModel->evalModel(wrappedInArgs,wrappedOutArgs);
432 for(
int l = 0; l < Np; ++l ) {
434 wrappedOutArgs.supports(MEB::OUT_ARG_DfDp,l).none()==
false 435 && wrappedOutArgs.get_DfDp(l).isEmpty()==false
441 TEUCHOS_TEST_FOR_EXCEPT(
true);
442 for(
int j = 0; j < Ng; ++j ) {
444 outArgs.supports(MEB::OUT_ARG_DgDp,j,l).none()==
false 445 && outArgs.get_DgDp(j,l).isEmpty()==false
451 TEUCHOS_TEST_FOR_EXCEPT(
true);
461 if(out.get() &&
static_cast<int>(verbLevel) >= static_cast<int>(Teuchos::VERB_LOW))
462 *out <<
"\nFailed to converge, returning NaNs ...\n";
467 if(out.get() &&
static_cast<int>(verbLevel) >= static_cast<int>(Teuchos::VERB_EXTREME))
469 <<
"\noutArgs on output =\n" << Teuchos::describe(outArgs,verbLevel);
472 if(out.get() &&
static_cast<int>(verbLevel) >= static_cast<int>(Teuchos::VERB_LOW))
474 <<
"\nTotal evaluation time = "<<totalTimer.totalElapsedTime()<<
" sec\n" 475 <<
"\nLeaving Thyra::DefaultStateEliminationModelEvaluator<Scalar>::evalModel(...) ...\n";
483 #endif // THYRA_DEFAULT_STATE_ELIMINATION_MODEL_EVALUATOR_HPP Pure abstract base interface for evaluating a stateless "model" that can be mapped into a number of d...
ModelEvaluatorBase::InArgs< Scalar > createInArgs() const
Concrete aggregate class for all output arguments computable by a ModelEvaluator subclass object...
ModelEvaluatorBase::InArgs< Scalar > getLowerBounds() const
void uninitialize()
Uninitialize.
This is a base class that delegetes almost all function to a wrapped model evaluator object...
void initialize(const RCP< ModelEvaluator< Scalar > > &model)
Initialize given a non-const model evaluator.
Base class for all nonlinear equation solvers.
This class wraps any ModelEvaluator object along with a NonlinearSolverBase object and eliminates the...
Teuchos::RCP< LinearOpBase< Scalar > > create_W_op() const
Teuchos::RCP< const VectorSpaceBase< Scalar > > get_x_space() const
DefaultStateEliminationModelEvaluator()
This class wraps any ModelEvaluator object and allows the client to overide the state contained in th...
void initialize(const Teuchos::RCP< ModelEvaluator< Scalar > > &thyraModel, const Teuchos::RCP< NonlinearSolverBase< Scalar > > &stateSolver)
Base subclass for ModelEvaluator that defines some basic types.
ModelEvaluatorBase::InArgs< Scalar > getUpperBounds() const
The requested solution criteria has likely been achieved.
Teuchos::RCP< const VectorSpaceBase< Scalar > > get_f_space() const
Teuchos::RCP< LinearOpWithSolveBase< Scalar > > create_W() const
ModelEvaluatorBase::InArgs< Scalar > getNominalValues() const
std::string description() const
Concrete aggregate class for all output arguments computable by a ModelEvaluator subclass object...