43 #ifndef PANZER_MODEL_EVALUATOR_DECL_HPP
44 #define PANZER_MODEL_EVALUATOR_DECL_HPP
46 #include "PanzerDiscFE_config.hpp"
56 #include "Teuchos_RCP.hpp"
57 #include "Teuchos_AbstractFactory.hpp"
59 #include "Thyra_VectorBase.hpp"
60 #include "Thyra_VectorSpaceBase.hpp"
61 #include "Thyra_StateFuncModelEvaluatorBase.hpp"
62 #include "Thyra_LinearOpWithSolveFactoryBase.hpp"
68 class FieldManagerBuilder;
69 template<
typename>
class LinearObjFactory;
72 template<
typename Scalar>
74 :
public Thyra::StateFuncModelEvaluatorBase<Scalar>
83 ModelEvaluator(
const Teuchos::RCP<panzer::FieldManagerBuilder>& fmb,
86 const std::vector<Teuchos::RCP<Teuchos::Array<std::string> > >& p_names,
87 const std::vector<Teuchos::RCP<Teuchos::Array<double> > >& p_values,
89 const Teuchos::RCP<panzer::GlobalData>& global_data,
90 bool build_transient_support,
double t_init);
94 const Teuchos::RCP<panzer::GlobalData>& global_data,
95 bool build_transient_support,
double t_init);
106 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
get_x_space()
const;
109 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
get_f_space()
const;
112 Teuchos::RCP<const Teuchos::Array<std::string> >
get_p_names(
int i)
const;
115 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
get_p_space(
int i)
const;
118 Teuchos::ArrayView<const std::string>
get_g_names(
int i)
const override;
124 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
get_g_space(
int i)
const;
127 Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
create_W_op()
const;
130 Teuchos::RCP<const Thyra::LinearOpWithSolveFactoryBase<Scalar> >
get_W_factory()
const;
133 Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
create_DfDp_op(
int i)
const;
136 Thyra::ModelEvaluatorBase::InArgs<Scalar>
createInArgs()
const;
142 void setupModel(
const Teuchos::RCP<panzer::WorksetContainer> & wc,
143 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
144 const std::vector<panzer::BC> & bcs,
149 const Teuchos::ParameterList& closure_models,
150 const Teuchos::ParameterList& user_data,
151 bool writeGraph=
false,
const std::string & graphPrefix=
"",
152 const Teuchos::ParameterList& me_params = Teuchos::ParameterList());
165 int addParameter(
const std::string & name,
const Scalar & initial);
177 int addParameter(
const Teuchos::Array<std::string> & names,
178 const Teuchos::Array<Scalar> & initialValues);
198 const Teuchos::RCP<GlobalEvaluationData> & ged,
200 const Teuchos::RCP<const UniqueGlobalIndexerBase> & ugi=Teuchos::null);
211 const Teuchos::RCP<GlobalEvaluationData> & ged);
230 const std::vector<WorksetDescriptor> & wkst_desc,
231 const Teuchos::RCP<ResponseMESupportBuilderBase> & builder);
248 template <
typename ResponseEvaluatorFactory_BuilderT>
250 const std::vector<WorksetDescriptor> & wkst_desc,
251 const ResponseEvaluatorFactory_BuilderT & builder);
257 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
260 const Teuchos::ParameterList& closure_models,
261 const Teuchos::ParameterList& user_data,
262 const bool write_graphviz_file=
false,
263 const std::string& graphviz_file_prefix=
"")
264 {
responseLibrary_->buildResponseEvaluators(physicsBlocks,eqset_factory,cm_factory,closure_models,user_data,write_graphviz_file,graphviz_file_prefix);
268 typedef Thyra::ModelEvaluatorBase MEB;
269 MEB::OutArgsSetup<Scalar> outArgs;
270 outArgs.setModelEvalDescription(this->description());
272 outArgs.setSupports(MEB::OUT_ARG_f);
273 outArgs.setSupports(MEB::OUT_ARG_W_op);
280 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
282 const Teuchos::ParameterList& closure_models,
283 const Teuchos::ParameterList& user_data,
284 const bool write_graphviz_file=
false,
285 const std::string& graphviz_file_prefix=
"")
286 {
responseLibrary_->buildResponseEvaluators(physicsBlocks,cm_factory,closure_models,user_data,write_graphviz_file,graphviz_file_prefix);
290 typedef Thyra::ModelEvaluatorBase MEB;
291 MEB::OutArgsSetup<Scalar> outArgs;
292 outArgs.setModelEvalDescription(this->description());
294 outArgs.setSupports(MEB::OUT_ARG_f);
295 outArgs.setSupports(MEB::OUT_ARG_W_op);
304 const Teuchos::RCP<panzer::WorksetContainer> & wc,
305 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
306 const std::vector<panzer::BC> & bcs,
310 const Teuchos::ParameterList& closure_models,
311 const Teuchos::ParameterList& user_data,
312 const bool write_graphviz_file=
false,
313 const std::string& graphviz_file_prefix=
"");
322 const Teuchos::RCP<panzer::WorksetContainer> & wc,
323 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
324 const std::vector<panzer::BC> & bcs,
328 const Teuchos::ParameterList& closure_models,
329 const Teuchos::ParameterList& user_data,
330 const bool write_graphviz_file=
false,
331 const std::string& graphviz_file_prefix=
"");
372 for (
int i=0; i<index; i++) {
383 for (
int i=0; i<index; i++) {
404 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
418 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
432 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
446 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
457 void evalModel_D2fDx2(
const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
470 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
483 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
496 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
509 virtual void evalModelImpl(
const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
510 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const;
516 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const;
520 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const;
528 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const;
536 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const;
544 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const;
552 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const;
560 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const;
568 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const;
571 bool required_basic_g(
const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const;
592 void setParameters(
const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs)
const;
601 Teuchos::RCP<Teuchos::Array<std::string> >
names;
602 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
space;
607 Teuchos::RCP<panzer::ResponseLibrary<panzer::Traits> >
dfdp_rl;
609 Teuchos::RCP<panzer::ResponseLibrary<panzer::Traits> >
dgdp_rl;
618 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
space;
621 Teuchos::RCP<ResponseMESupportBuilderBase>
builder;
629 bool operator()(
const Teuchos::RCP<ResponseObject> & ro) {
return name==ro->name; }
634 const Teuchos::Array<Scalar> & in_values)
const;
638 const Teuchos::RCP<const UniqueGlobalIndexerBase> & ugi)
const;
642 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
x_space_;
643 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
f_space_;
669 Teuchos::RCP<const panzer::LinearObjFactory<panzer::Traits> >
lof_;
671 mutable Teuchos::RCP<ReadOnlyVector_GlobalEvaluationData>
xContainer_;
685 template<
typename Scalar>
686 template <
typename ResponseEvaluatorFactory_BuilderT>
689 const std::vector<WorksetDescriptor> & wkst_desc,
690 const ResponseEvaluatorFactory_BuilderT & builder)
696 TEUCHOS_TEST_FOR_EXCEPTION(responseLibrary_->responseEvaluatorsBuilt(),std::logic_error,
697 "panzer::ModelEvaluator::addResponse: Response with name \"" << responseName <<
"\" "
698 "cannot be added to the model evaluator because evalModel has already been called!");
701 responseLibrary_->addResponse(responseName,wkst_desc,builder);
704 TEUCHOS_TEST_FOR_EXCEPTION(std::find_if(responses_.begin(),responses_.end(),
typename ResponseObject::SearchName(responseName))!=responses_.end(),
706 "panzer::ModelEvaluator::addResponse: Response with name \"" << responseName <<
"\" "
707 "has already been added to the model evaluator!");
715 Teuchos::RCP<panzer::ResponseBase> respBase = responseLibrary_->getResponse<
panzer::Traits::Residual>(responseName);
716 TEUCHOS_TEST_FOR_EXCEPTION(respBase==Teuchos::null,std::logic_error,
717 "panzer::ModelEvaluator::addResponse: Response with name \"" << responseName <<
"\" "
718 "has no residual type! Not sure what is going on!");
721 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Residual> > resp =
722 Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<panzer::Traits::Residual> >(respBase);
723 TEUCHOS_TEST_FOR_EXCEPTION(resp==Teuchos::null,std::logic_error,
724 "panzer::ModelEvaluator::addResponse: Response with name \"" << responseName <<
"\" "
725 "resulted in bad cast to panzer::ResponseMESupportBase, the type of the response is incompatible!");
728 Teuchos::RCP<const Thyra::VectorSpaceBase<double> > vs = resp->getVectorSpace();
729 respObject->space = vs;
732 resp->setVector(Thyra::createMember(vs));
736 Teuchos::RCP<panzer::ResponseBase> respJacBase = responseLibrary_->getResponse<
panzer::Traits::Jacobian>(responseName);
737 if(respJacBase!=Teuchos::null) {
741 Teuchos::RCP<panzer::ResponseMESupportBase<RespEvalT> > resp =
742 Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<RespEvalT> >(respJacBase);
743 TEUCHOS_TEST_FOR_EXCEPTION(resp==Teuchos::null,std::logic_error,
744 "panzer::ModelEvaluator::addResponse: Response with name \"" << responseName <<
745 "\" resulted in bad cast to panzer::ResponseMESupportBase<Jacobian>, the type "
746 "of the response is incompatible!");
749 if(resp->supportsDerivative())
750 resp->setDerivative(resp->buildDerivative());
753 #ifdef Panzer_BUILD_HESSIAN_SUPPORT
755 Teuchos::RCP<panzer::ResponseBase> respHesBase = responseLibrary_->getResponse<
panzer::Traits::Hessian>(responseName);
756 if(respHesBase!=Teuchos::null) {
760 Teuchos::RCP<panzer::ResponseMESupportBase<RespEvalT> > resp =
761 Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<RespEvalT> >(respHesBase);
762 TEUCHOS_TEST_FOR_EXCEPTION(resp==Teuchos::null,std::logic_error,
763 "panzer::ModelEvaluator::addResponse: Response with name \"" << responseName <<
764 "\" resulted in bad cast to panzer::ResponseMESupportBase<Hessian>, the type "
765 "of the response is incompatible!");
768 if(resp->supportsDerivative())
769 resp->setDerivative(resp->buildDerivative());
773 respObject->name = responseName;
774 respObject->wkst_desc = wkst_desc;
776 responses_.push_back(respObject);
778 require_in_args_refresh_ =
true;
779 require_out_args_refresh_ =
true;
781 return responses_.size()-1;