Panzer Version of the Day
Loading...
Searching...
No Matches
Panzer_ModelEvaluator.hpp
Go to the documentation of this file.
1// @HEADER
2// *****************************************************************************
3// Panzer: A partial differential equation assembly
4// engine for strongly coupled complex multiphysics systems
5//
6// Copyright 2011 NTESS and the Panzer contributors.
7// SPDX-License-Identifier: BSD-3-Clause
8// *****************************************************************************
9// @HEADER
10
11#ifndef PANZER_MODEL_EVALUATOR_DECL_HPP
12#define PANZER_MODEL_EVALUATOR_DECL_HPP
13
14#include "PanzerDiscFE_config.hpp"
15
16#include "Panzer_Traits.hpp"
23
24#include "Teuchos_RCP.hpp"
25#include "Teuchos_AbstractFactory.hpp"
26
27#include "Thyra_VectorBase.hpp"
28#include "Thyra_VectorSpaceBase.hpp"
29#include "Thyra_StateFuncModelEvaluatorBase.hpp"
30#include "Thyra_LinearOpWithSolveFactoryBase.hpp"
31
32#include <Panzer_NodeType.hpp>
33
34namespace panzer {
35
36class FieldManagerBuilder;
37template<typename> class LinearObjFactory;
38struct GlobalData;
39
40template<typename Scalar>
42 : public Thyra::StateFuncModelEvaluatorBase<Scalar>
43{
44public:
45
46public:
47
50
51 ModelEvaluator(const Teuchos::RCP<panzer::FieldManagerBuilder>& fmb,
52 const Teuchos::RCP<panzer::ResponseLibrary<panzer::Traits> >& rLibrary,
53 const Teuchos::RCP<const panzer::LinearObjFactory<panzer::Traits> >& lof,
54 const std::vector<Teuchos::RCP<Teuchos::Array<std::string> > >& p_names,
55 const std::vector<Teuchos::RCP<Teuchos::Array<double> > >& p_values,
56 const Teuchos::RCP<const Thyra::LinearOpWithSolveFactoryBase<Scalar> > & solverFactory,
57 const Teuchos::RCP<panzer::GlobalData>& global_data,
58 bool build_transient_support,double t_init);
59
60 ModelEvaluator(const Teuchos::RCP<const panzer::LinearObjFactory<panzer::Traits> >& lof,
61 const Teuchos::RCP<const Thyra::LinearOpWithSolveFactoryBase<Scalar> > & solverFactory,
62 const Teuchos::RCP<panzer::GlobalData>& global_data,
63 bool build_transient_support,double t_init);
64
67
69
72
74 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > get_x_space() const override;
75
77 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > get_f_space() const override;
78
80 Teuchos::RCP<const Teuchos::Array<std::string> > get_p_names(int i) const override;
81
83 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > get_p_space(int i) const override;
84
86 Teuchos::ArrayView<const std::string> get_g_names(int i) const override;
87
89 const std::string & get_g_name(int i) const;
90
92 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > get_g_space(int i) const override;
93
95 Teuchos::RCP<Thyra::LinearOpBase<Scalar> > create_W_op() const override;
96
98 Teuchos::RCP<const Thyra::LinearOpWithSolveFactoryBase<Scalar> > get_W_factory() const override;
99
101 Teuchos::RCP<Thyra::LinearOpBase<Scalar> > create_DfDp_op(int i) const override;
102
104 Thyra::ModelEvaluatorBase::InArgs<Scalar> createInArgs() const override;
105
106 Thyra::ModelEvaluatorBase::InArgs<Scalar> getNominalValues() const override;
107
109
114 template<typename EvalT>
116 {
117 ae_tm_.template disableType<EvalT>();
118 auto idx = Sacado::mpl::find<panzer::Traits::EvalTypes,EvalT>::value;
119 active_evaluation_types_[idx] = false;
120 }
121
126 void buildVolumeFieldManagers(const bool value);
127
132 void buildBCFieldManagers(const bool value);
133
134 void setupModel(const Teuchos::RCP<panzer::WorksetContainer> & wc,
135 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
136 const std::vector<panzer::BC> & bcs,
137 const panzer::EquationSetFactory & eqset_factory,
138 const panzer::BCStrategyFactory& bc_factory,
141 const Teuchos::ParameterList& closure_models,
142 const Teuchos::ParameterList& user_data,
143 bool writeGraph=false,const std::string & graphPrefix="",
144 const Teuchos::ParameterList& me_params = Teuchos::ParameterList());
145
157 int addParameter(const std::string & name,const Scalar & initial);
158
169 int addParameter(const Teuchos::Array<std::string> & names,
170 const Teuchos::Array<Scalar> & initialValues);
171
188 int addDistributedParameter(const std::string & name,
189 const Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > & vs,
190 const Teuchos::RCP<GlobalEvaluationData> & ged,
191 const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & initial,
192 const Teuchos::RCP<const GlobalIndexer> & ugi=Teuchos::null);
193
202 void addNonParameterGlobalEvaluationData(const std::string & name,
203 const Teuchos::RCP<GlobalEvaluationData> & ged);
204
221 int addFlexibleResponse(const std::string & responseName,
222 const std::vector<WorksetDescriptor> & wkst_desc,
223 const Teuchos::RCP<ResponseMESupportBuilderBase> & builder);
224
240 template <typename ResponseEvaluatorFactory_BuilderT>
241 int addResponse(const std::string & responseName,
242 const std::vector<WorksetDescriptor> & wkst_desc,
243 const ResponseEvaluatorFactory_BuilderT & builder);
244
249 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
250 const panzer::EquationSetFactory & eqset_factory,
252 const Teuchos::ParameterList& closure_models,
253 const Teuchos::ParameterList& user_data,
254 const bool write_graphviz_file=false,
255 const std::string& graphviz_file_prefix="")
256 { responseLibrary_->buildResponseEvaluators(physicsBlocks,eqset_factory,cm_factory,closure_models,user_data,write_graphviz_file,graphviz_file_prefix);
259 this->resetDefaultBase();
260
261 typedef Thyra::ModelEvaluatorBase MEB;
262 MEB::OutArgsSetup<Scalar> outArgs;
263 outArgs.setModelEvalDescription(this->description());
264 outArgs.set_Np_Ng(num_me_parameters_, responses_.size());
265 outArgs.setSupports(MEB::OUT_ARG_f);
266 outArgs.setSupports(MEB::OUT_ARG_W_op);
267 prototypeOutArgs_ = outArgs; }
268
273 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
275 const Teuchos::ParameterList& closure_models,
276 const Teuchos::ParameterList& user_data,
277 const bool write_graphviz_file=false,
278 const std::string& graphviz_file_prefix="")
279 { responseLibrary_->buildResponseEvaluators(physicsBlocks,cm_factory,closure_models,user_data,write_graphviz_file,graphviz_file_prefix);
282 this->resetDefaultBase();
283
284 typedef Thyra::ModelEvaluatorBase MEB;
285 MEB::OutArgsSetup<Scalar> outArgs;
286 outArgs.setModelEvalDescription(this->description());
287 outArgs.set_Np_Ng(num_me_parameters_, responses_.size());
288 outArgs.setSupports(MEB::OUT_ARG_f);
289 outArgs.setSupports(MEB::OUT_ARG_W_op);
290 prototypeOutArgs_ = outArgs; }
291
298 const Teuchos::RCP<panzer::WorksetContainer> & wc,
299 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
300 const std::vector<panzer::BC> & bcs,
301 const panzer::EquationSetFactory & eqset_factory,
302 const panzer::BCStrategyFactory& bc_factory,
304 const Teuchos::ParameterList& closure_models,
305 const Teuchos::ParameterList& user_data,
306 const bool write_graphviz_file=false,
307 const std::string& graphviz_file_prefix="");
308
316 const Teuchos::RCP<panzer::WorksetContainer> & wc,
317 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
318 const std::vector<panzer::BC> & bcs,
319 const panzer::EquationSetFactory & eqset_factory,
320 const panzer::BCStrategyFactory& bc_factory,
322 const Teuchos::ParameterList& closure_models,
323 const Teuchos::ParameterList& user_data,
324 const bool write_graphviz_file=false,
325 const std::string& graphviz_file_prefix="");
326
334 void setOneTimeDirichletBeta(const Scalar & beta) const;
335
339 void applyDirichletBCs(const Teuchos::RCP<Thyra::VectorBase<Scalar> > & x,
340 const Teuchos::RCP<Thyra::VectorBase<Scalar> > & f) const;
341
347 void setupAssemblyInArgs(const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
348 panzer::AssemblyEngineInArgs & ae_inargs) const;
349
350
358
359 Teuchos::RCP<panzer::ResponseLibrary<panzer::Traits> > getResponseLibrary() const
360 { return responseLibrary_; }
361
364 int getXTangentVectorIndex(const int index) const {
365 int v_index = 0;
366 for (int i=0; i<index; i++) {
367 if (!parameters_[i]->is_distributed)
368 ++v_index;
369 }
370 return v_index + parameters_.size();
371 }
372
375 int getXDotTangentVectorIndex(const int index) const {
376 int v_index = 0;
377 for (int i=0; i<index; i++) {
378 if (!parameters_[i]->is_distributed)
379 ++v_index;
380 }
381 return v_index + parameters_.size() + tangent_space_.size();
382 }
383
386 Teuchos::RCP<const Thyra::VectorBase<Scalar> > get_parameter_vector(int index) const {
387 return parameters_[index]->initial_value;
388 }
389
397 void evalModel_D2gDx2(int rIndex,
398 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
399 const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & delta_x,
400 const Teuchos::RCP<Thyra::VectorBase<Scalar> > & D2gDx2) const;
401
410 void evalModel_D2gDp2(int rIndex,
411 int pIndex,
412 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
413 const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & delta_x,
414 const Teuchos::RCP<Thyra::VectorBase<Scalar> > & D2gDp2) const;
415
424 void evalModel_D2gDpDx(int rIndex,
425 int pIndex,
426 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
427 const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & delta_x,
428 const Teuchos::RCP<Thyra::VectorBase<Scalar> > & D2gDpDx) const;
429
438 void evalModel_D2gDxDp(int rIndex,
439 int pIndex,
440 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
441 const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & delta_p,
442 const Teuchos::RCP<Thyra::VectorBase<Scalar> > & D2gDxDp) const;
443
451 void evalModel_D2fDx2(const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
452 const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & delta_x,
453 const Teuchos::RCP<Thyra::LinearOpBase<Scalar> > & D2fDx2) const;
454
463 void evalModel_D2fDp2(int pIndex,
464 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
465 const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & delta_x,
466 const Teuchos::RCP<Thyra::LinearOpBase<Scalar> > & D2fDp2) const;
467
476 void evalModel_D2fDpDx(int pIndex,
477 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
478 const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & delta_x,
479 const Teuchos::RCP<Thyra::LinearOpBase<Scalar> > & D2fDpDx) const;
480
489 void evalModel_D2fDxDp(int pIndex,
490 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
491 const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & delta_p,
492 const Teuchos::RCP<Thyra::LinearOpBase<Scalar> > & D2fDxDp) const;
493
494protected:
495
498
500 Thyra::ModelEvaluatorBase::OutArgs<Scalar> createOutArgsImpl() const override;
501
503 virtual void evalModelImpl(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
504 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const override;
505
507
509 virtual void evalModelImpl_basic(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
510 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
511
513 virtual void evalModelImpl_basic_g(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
514 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
515
521 virtual void evalModelImpl_basic_dgdx(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
522 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
523
529 virtual void evalModelImpl_basic_dgdp_scalar(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
530 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
531
537 virtual void evalModelImpl_basic_dgdp_distro(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
538 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
539
545 virtual void evalModelImpl_basic_dfdp_scalar(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
546 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
547
553 virtual void evalModelImpl_basic_dfdp_scalar_fd(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
554 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
555
561 virtual void evalModelImpl_basic_dfdp_distro(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
562 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
563
565 bool required_basic_g(const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
566
568 bool required_basic_dgdx(const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
569
571 bool required_basic_dgdp_scalar(const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
572
574 bool required_basic_dgdp_distro(const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
575
577 bool required_basic_dfdp_scalar(const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
578
580 bool required_basic_dfdp_distro(const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
581
583 void initializeNominalValues() const;
584
585 // Set parameters in model supplied by inArgs
586 void setParameters(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs) const;
587
588 // Reset parameters back to nominal values
589 void resetParameters() const;
590
591private: // data members
592
594 bool is_distributed; // or (is scalar?)
595 Teuchos::RCP<Teuchos::Array<std::string> > names;
596 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > space;
597 Teuchos::RCP<const Thyra::VectorBase<Scalar> > initial_value;
598
599 // for distributed parameters
600 Teuchos::RCP<const GlobalIndexer> global_indexer;
601 Teuchos::RCP<panzer::ResponseLibrary<panzer::Traits> > dfdp_rl;
602 // for residual sensitivities with respect to a distributed parameter
603 Teuchos::RCP<panzer::ResponseLibrary<panzer::Traits> > dgdp_rl;
604 // for response sensitivities with respect to a distributed parameter
605
606 // for scalar parameters
608 };
609
611 std::string name;
612 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > space;
613
614 // for distributed parameter sensitivities
615 Teuchos::RCP<ResponseMESupportBuilderBase> builder;
616 // used for delayed construction of dgdp (distributed parameter) responses
617 std::vector<WorksetDescriptor> wkst_desc;
618 // used for delayed construction of dgdp (distributed parameter) responses
619
620 struct SearchName {
621 std::string name;
622 SearchName(const std::string & n) : name(n) {}
623 bool operator()(const Teuchos::RCP<ResponseObject> & ro) { return name==ro->name; }
624 };
625 };
626
627 Teuchos::RCP<ParameterObject> createScalarParameter(const Teuchos::Array<std::string> & names,
628 const Teuchos::Array<Scalar> & in_values) const;
629 Teuchos::RCP<ParameterObject> createDistributedParameter(const std::string & key,
630 const Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > & vs,
631 const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & initial,
632 const Teuchos::RCP<const GlobalIndexer> & ugi) const;
633
634 double t_init_;
635
636 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > x_space_;
637 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > f_space_;
638
639 mutable Thyra::ModelEvaluatorBase::InArgs<Scalar> prototypeInArgs_;
640 mutable Thyra::ModelEvaluatorBase::OutArgs<Scalar> prototypeOutArgs_;
641
642 mutable Thyra::ModelEvaluatorBase::InArgs<Scalar> nominalValues_;
643
644 mutable panzer::AssemblyEngine_TemplateManager<panzer::Traits> ae_tm_; // they control and provide access to evaluate
645
646 std::vector<Teuchos::RCP<ParameterObject> > parameters_;
647 std::vector<Teuchos::RCP<Thyra::VectorSpaceBase<double> > > tangent_space_;
651
654
655 // responses
656 mutable Teuchos::RCP<panzer::ResponseLibrary<panzer::Traits> > responseLibrary_;
657 std::vector<Teuchos::RCP<ResponseObject> > responses_;
658
659 Teuchos::RCP<panzer::GlobalData> global_data_;
661
662 // basic specific linear object objects
663 Teuchos::RCP<const panzer::LinearObjFactory<panzer::Traits> > lof_;
664 mutable Teuchos::RCP<panzer::LinearObjContainer> ghostedContainer_;
665 mutable Teuchos::RCP<ReadOnlyVector_GlobalEvaluationData> xContainer_;
666 mutable Teuchos::RCP<ReadOnlyVector_GlobalEvaluationData> xdotContainer_;
667
668
669 Teuchos::RCP<const Thyra::LinearOpWithSolveFactoryBase<Scalar> > solverFactory_;
670
673
675 mutable Scalar oneTimeDirichletBeta_;
676
679 std::vector<bool> active_evaluation_types_;
680
681 mutable unsigned long long write_matrix_count_;
682};
683
684// Inline definition of the add response (its template on the builder type)
685template<typename Scalar>
686template <typename ResponseEvaluatorFactory_BuilderT>
688addResponse(const std::string & responseName,
689 const std::vector<WorksetDescriptor> & wkst_desc,
690 const ResponseEvaluatorFactory_BuilderT & builder)
691{
692 using Teuchos::RCP;
693 using Teuchos::rcp;
694
695 // see if the response evaluators have been constucted yet
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!");
699
700 // add the response
701 responseLibrary_->addResponse(responseName,wkst_desc,builder);
702
703 // check that the response can be found
704 TEUCHOS_TEST_FOR_EXCEPTION(std::find_if(responses_.begin(),responses_.end(),typename ResponseObject::SearchName(responseName))!=responses_.end(),
705 std::logic_error,
706 "panzer::ModelEvaluator::addResponse: Response with name \"" << responseName << "\" "
707 "has already been added to the model evaluator!");
708
709 // allocate response object
710 RCP<ResponseObject> respObject = rcp(new ResponseObject);
711
712 // handle panzer::Traits::Residual
713 {
714 // check that at least there is a response value
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!");
719
720 // check that the response supports interactions with the model evaluator
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!");
726
727 // set the response in the model evaluator
728 Teuchos::RCP<const Thyra::VectorSpaceBase<double> > vs = resp->getVectorSpace();
729 respObject->space = vs;
730
731 // lets be cautious and set a vector on the response
732 resp->setVector(Thyra::createMember(vs));
733 }
734
735 // handle panzer::Traits::Jacobian (do a quick safety check, response is null or appropriate for jacobian)
736 Teuchos::RCP<panzer::ResponseBase> respJacBase = responseLibrary_->getResponse<panzer::Traits::Jacobian>(responseName);
737 if(respJacBase!=Teuchos::null) {
738 typedef panzer::Traits::Jacobian RespEvalT;
739
740 // check that the response supports interactions with the model evaluator
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!");
747
748 // setup the vector (register response as epetra)
749 if(resp->supportsDerivative())
750 resp->setDerivative(resp->buildDerivative());
751 }
752
753#ifdef Panzer_BUILD_HESSIAN_SUPPORT
754 // handle panzer::Traits::Hessian (do a quick safety check, response is null or appropriate for jacobian)
755 Teuchos::RCP<panzer::ResponseBase> respHesBase = responseLibrary_->getResponse<panzer::Traits::Hessian>(responseName);
756 if(respHesBase!=Teuchos::null) {
757 typedef panzer::Traits::Hessian RespEvalT;
758
759 // check that the response supports interactions with the model evaluator
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!");
766
767 // setup the vector (register response as epetra)
768 if(resp->supportsDerivative())
769 resp->setDerivative(resp->buildDerivative());
770 }
771#endif
772
773 respObject->name = responseName;
774 respObject->wkst_desc = wkst_desc;
775
776 responses_.push_back(respObject);
777
778 require_in_args_refresh_ = true;
779 require_out_args_refresh_ = true;
780 this->resetDefaultBase();
781
782 return responses_.size()-1;
783}
784
785
786}
787
788// #include "Panzer_ModelEvaluator_impl.hpp"
789
790#endif
A PHX::TemplateManager holding one panzer::AssemblyEngine<EvalT> per evaluation type in Traits::EvalT...
A PHX::TemplateManager holding one panzer::ClosureModelFactory<EvalT> per evaluation type in Traits::...
virtual void evalModelImpl_basic_dfdp_scalar_fd(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
void setOneTimeDirichletBeta(const Scalar &beta) const
virtual void evalModelImpl_basic_dgdp_scalar(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
void setupAssemblyInArgs(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, panzer::AssemblyEngineInArgs &ae_inargs) const
std::vector< bool > active_evaluation_types_
void setupModel(const Teuchos::RCP< panzer::WorksetContainer > &wc, const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const std::vector< panzer::BC > &bcs, const panzer::EquationSetFactory &eqset_factory, const panzer::BCStrategyFactory &bc_factory, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &volume_cm_factory, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &bc_cm_factory, const Teuchos::ParameterList &closure_models, const Teuchos::ParameterList &user_data, bool writeGraph=false, const std::string &graphPrefix="", const Teuchos::ParameterList &me_params=Teuchos::ParameterList())
Teuchos::RCP< panzer::LinearObjContainer > ghostedContainer_
unsigned long long write_matrix_count_
Teuchos::RCP< ReadOnlyVector_GlobalEvaluationData > xContainer_
Teuchos::RCP< const Thyra::VectorBase< Scalar > > get_parameter_vector(int index) const
Thyra::ModelEvaluatorBase::OutArgs< Scalar > createOutArgsImpl() const override
bool required_basic_g(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Does this set of out args require a simple response?
void evalModel_D2fDp2(int pIndex, const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_x, const Teuchos::RCP< Thyra::LinearOpBase< Scalar > > &D2fDp2) const
Teuchos::RCP< Thyra::LinearOpBase< Scalar > > create_DfDp_op(int i) const override
virtual void evalModelImpl_basic_dgdx(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > f_space_
void buildDistroParamDfDp_RL(const Teuchos::RCP< panzer::WorksetContainer > &wc, const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const std::vector< panzer::BC > &bcs, const panzer::EquationSetFactory &eqset_factory, const panzer::BCStrategyFactory &bc_factory, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &cm_factory, const Teuchos::ParameterList &closure_models, const Teuchos::ParameterList &user_data, const bool write_graphviz_file=false, const std::string &graphviz_file_prefix="")
Teuchos::RCP< const Thyra::LinearOpWithSolveFactoryBase< Scalar > > get_W_factory() const override
std::vector< Teuchos::RCP< ParameterObject > > parameters_
std::vector< Teuchos::RCP< ResponseObject > > responses_
void setParameters(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs) const
Teuchos::RCP< ParameterObject > createDistributedParameter(const std::string &key, const Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > &vs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &initial, const Teuchos::RCP< const GlobalIndexer > &ugi) const
std::vector< Teuchos::RCP< Thyra::VectorSpaceBase< double > > > tangent_space_
panzer::AssemblyEngine_TemplateManager< panzer::Traits > ae_tm_
virtual void evalModelImpl_basic_dfdp_scalar(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
bool required_basic_dfdp_scalar(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are derivatives of the residual with respect to the scalar parameters in the out args?...
Teuchos::RCP< const Thyra::LinearOpWithSolveFactoryBase< Scalar > > solverFactory_
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > x_space_
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_p_space(int i) const override
virtual void evalModelImpl_basic_g(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Construct a simple response dicatated by this set of out args.
Thyra::ModelEvaluatorBase::InArgs< Scalar > nominalValues_
void evalModel_D2fDx2(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_x, const Teuchos::RCP< Thyra::LinearOpBase< Scalar > > &D2fDx2) const
bool required_basic_dgdx(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are their required responses in the out args? DgDx.
bool required_basic_dgdp_distro(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are their required responses in the out args? DgDp.
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_x_space() const override
virtual void evalModelImpl(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const override
Thyra::ModelEvaluatorBase::InArgs< Scalar > prototypeInArgs_
Thyra::ModelEvaluatorBase::OutArgs< Scalar > prototypeOutArgs_
void evalModel_D2fDpDx(int pIndex, const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_x, const Teuchos::RCP< Thyra::LinearOpBase< Scalar > > &D2fDpDx) const
GlobalEvaluationDataContainer nonParamGlobalEvaluationData_
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_f_space() const override
void buildVolumeFieldManagers(const bool value)
virtual void evalModelImpl_basic_dgdp_distro(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
void evalModel_D2gDxDp(int rIndex, int pIndex, const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_p, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &D2gDxDp) const
panzer::AssemblyEngine_TemplateManager< panzer::Traits > getAssemblyEngineTemplateManager() const
return a copy of the model evaluators template manager, this is shallow class so pass by value
int addDistributedParameter(const std::string &name, const Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > &vs, const Teuchos::RCP< GlobalEvaluationData > &ged, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &initial, const Teuchos::RCP< const GlobalIndexer > &ugi=Teuchos::null)
bool required_basic_dgdp_scalar(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are their required responses in the out args? DgDp.
int addParameter(const std::string &name, const Scalar &initial)
Thyra::ModelEvaluatorBase::InArgs< Scalar > getNominalValues() const override
const std::string & get_g_name(int i) const
void buildDistroParamDgDp_RL(const Teuchos::RCP< panzer::WorksetContainer > &wc, const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const std::vector< panzer::BC > &bcs, const panzer::EquationSetFactory &eqset_factory, const panzer::BCStrategyFactory &bc_factory, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &cm_factory, const Teuchos::ParameterList &closure_models, const Teuchos::ParameterList &user_data, const bool write_graphviz_file=false, const std::string &graphviz_file_prefix="")
Teuchos::RCP< const Teuchos::Array< std::string > > get_p_names(int i) const override
int getXDotTangentVectorIndex(const int index) const
Teuchos::ArrayView< const std::string > get_g_names(int i) const override
void applyDirichletBCs(const Teuchos::RCP< Thyra::VectorBase< Scalar > > &x, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &f) const
Thyra::ModelEvaluatorBase::InArgs< Scalar > createInArgs() const override
int addFlexibleResponse(const std::string &responseName, const std::vector< WorksetDescriptor > &wkst_desc, const Teuchos::RCP< ResponseMESupportBuilderBase > &builder)
GlobalEvaluationDataContainer distrParamGlobalEvaluationData_
void evalModel_D2gDpDx(int rIndex, int pIndex, const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_x, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &D2gDpDx) const
void buildBCFieldManagers(const bool value)
Teuchos::RCP< const panzer::LinearObjFactory< panzer::Traits > > lof_
void buildResponses(const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const panzer::EquationSetFactory &eqset_factory, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &cm_factory, const Teuchos::ParameterList &closure_models, const Teuchos::ParameterList &user_data, const bool write_graphviz_file=false, const std::string &graphviz_file_prefix="")
virtual void evalModelImpl_basic_dfdp_distro(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
void evalModel_D2fDxDp(int pIndex, const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_p, const Teuchos::RCP< Thyra::LinearOpBase< Scalar > > &D2fDxDp) const
void evalModel_D2gDx2(int rIndex, const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_x, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &D2gDx2) const
virtual void evalModelImpl_basic(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Evaluate a simple model, meaning a residual and a jacobian, no fancy stochastic galerkin or multipoin...
Teuchos::RCP< ReadOnlyVector_GlobalEvaluationData > xdotContainer_
Teuchos::RCP< Thyra::LinearOpBase< Scalar > > create_W_op() const override
void buildResponses(const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &cm_factory, const Teuchos::ParameterList &closure_models, const Teuchos::ParameterList &user_data, const bool write_graphviz_file=false, const std::string &graphviz_file_prefix="")
Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > responseLibrary_
void evalModel_D2gDp2(int rIndex, int pIndex, const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_x, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &D2gDp2) const
bool required_basic_dfdp_distro(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are derivatives of the residual with respect to the distributed parameters in the out args?...
Teuchos::RCP< panzer::GlobalData > global_data_
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_g_space(int i) const override
Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > getResponseLibrary() const
int addResponse(const std::string &responseName, const std::vector< WorksetDescriptor > &wkst_desc, const ResponseEvaluatorFactory_BuilderT &builder)
void addNonParameterGlobalEvaluationData(const std::string &name, const Teuchos::RCP< GlobalEvaluationData > &ged)
void initializeNominalValues() const
Initialize the nominal values with good starting conditions.
int getXTangentVectorIndex(const int index) const
Teuchos::RCP< ParameterObject > createScalarParameter(const Teuchos::Array< std::string > &names, const Teuchos::Array< Scalar > &in_values) const
Sacado::ScalarParameterVector< panzer::EvaluationTraits > ParamVec
A vector of named scalar parameter entries drawn from a ParamLib, e.g. for use as LOCA continuation/b...
Interface for constructing a BCStrategy_TemplateManager.
Allocates and initializes an equation set template manager.
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > space
Teuchos::RCP< const Thyra::VectorBase< Scalar > > initial_value
Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > dfdp_rl
Teuchos::RCP< Teuchos::Array< std::string > > names
Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > dgdp_rl
Teuchos::RCP< const GlobalIndexer > global_indexer
bool operator()(const Teuchos::RCP< ResponseObject > &ro)
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > space
std::vector< WorksetDescriptor > wkst_desc
Teuchos::RCP< ResponseMESupportBuilderBase > builder
Evaluation type for computing second derivatives, using HessianType as the scalar type....
Evaluation type for computing the residual and its Jacobian, using FadType as the scalar type.
Evaluation type for computing the residual only, using RealType as the scalar type.