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
205 // Add generic global evaluation data to include in Assembly Engine input arguments
207 const std::string & name,
208 const Teuchos::RCP<GlobalEvaluationData> & ged);
209
226 int addFlexibleResponse(const std::string & responseName,
227 const std::vector<WorksetDescriptor> & wkst_desc,
228 const Teuchos::RCP<ResponseMESupportBuilderBase> & builder);
229
245 template <typename ResponseEvaluatorFactory_BuilderT>
246 int addResponse(const std::string & responseName,
247 const std::vector<WorksetDescriptor> & wkst_desc,
248 const ResponseEvaluatorFactory_BuilderT & builder);
249
254 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
255 const panzer::EquationSetFactory & eqset_factory,
257 const Teuchos::ParameterList& closure_models,
258 const Teuchos::ParameterList& user_data,
259 const bool write_graphviz_file=false,
260 const std::string& graphviz_file_prefix="")
261 { responseLibrary_->buildResponseEvaluators(physicsBlocks,eqset_factory,cm_factory,closure_models,user_data,write_graphviz_file,graphviz_file_prefix);
264 this->resetDefaultBase();
265
266 typedef Thyra::ModelEvaluatorBase MEB;
267 MEB::OutArgsSetup<Scalar> outArgs;
268 outArgs.setModelEvalDescription(this->description());
269 outArgs.set_Np_Ng(num_me_parameters_, responses_.size());
270 outArgs.setSupports(MEB::OUT_ARG_f);
271 outArgs.setSupports(MEB::OUT_ARG_W_op);
272 prototypeOutArgs_ = outArgs; }
273
278 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
280 const Teuchos::ParameterList& closure_models,
281 const Teuchos::ParameterList& user_data,
282 const bool write_graphviz_file=false,
283 const std::string& graphviz_file_prefix="")
284 { responseLibrary_->buildResponseEvaluators(physicsBlocks,cm_factory,closure_models,user_data,write_graphviz_file,graphviz_file_prefix);
287 this->resetDefaultBase();
288
289 typedef Thyra::ModelEvaluatorBase MEB;
290 MEB::OutArgsSetup<Scalar> outArgs;
291 outArgs.setModelEvalDescription(this->description());
292 outArgs.set_Np_Ng(num_me_parameters_, responses_.size());
293 outArgs.setSupports(MEB::OUT_ARG_f);
294 outArgs.setSupports(MEB::OUT_ARG_W_op);
295 prototypeOutArgs_ = outArgs; }
296
303 const Teuchos::RCP<panzer::WorksetContainer> & wc,
304 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
305 const std::vector<panzer::BC> & bcs,
306 const panzer::EquationSetFactory & eqset_factory,
307 const panzer::BCStrategyFactory& bc_factory,
309 const Teuchos::ParameterList& closure_models,
310 const Teuchos::ParameterList& user_data,
311 const bool write_graphviz_file=false,
312 const std::string& graphviz_file_prefix="");
313
321 const Teuchos::RCP<panzer::WorksetContainer> & wc,
322 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
323 const std::vector<panzer::BC> & bcs,
324 const panzer::EquationSetFactory & eqset_factory,
325 const panzer::BCStrategyFactory& bc_factory,
327 const Teuchos::ParameterList& closure_models,
328 const Teuchos::ParameterList& user_data,
329 const bool write_graphviz_file=false,
330 const std::string& graphviz_file_prefix="");
331
339 void setOneTimeDirichletBeta(const Scalar & beta) const;
340
344 void applyDirichletBCs(const Teuchos::RCP<Thyra::VectorBase<Scalar> > & x,
345 const Teuchos::RCP<Thyra::VectorBase<Scalar> > & f) const;
346
352 void setupAssemblyInArgs(const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
353 panzer::AssemblyEngineInArgs & ae_inargs) const;
354
355
363
364 Teuchos::RCP<panzer::ResponseLibrary<panzer::Traits> > getResponseLibrary() const
365 { return responseLibrary_; }
366
369 int getXTangentVectorIndex(const int index) const {
370 int v_index = 0;
371 for (int i=0; i<index; i++) {
372 if (!parameters_[i]->is_distributed)
373 ++v_index;
374 }
375 return v_index + parameters_.size();
376 }
377
380 int getXDotTangentVectorIndex(const int index) const {
381 int v_index = 0;
382 for (int i=0; i<index; i++) {
383 if (!parameters_[i]->is_distributed)
384 ++v_index;
385 }
386 return v_index + parameters_.size() + tangent_space_.size();
387 }
388
391 Teuchos::RCP<const Thyra::VectorBase<Scalar> > get_parameter_vector(int index) const {
392 return parameters_[index]->initial_value;
393 }
394
402 void evalModel_D2gDx2(int rIndex,
403 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
404 const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & delta_x,
405 const Teuchos::RCP<Thyra::VectorBase<Scalar> > & D2gDx2) const;
406
415 void evalModel_D2gDp2(int rIndex,
416 int pIndex,
417 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
418 const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & delta_x,
419 const Teuchos::RCP<Thyra::VectorBase<Scalar> > & D2gDp2) const;
420
429 void evalModel_D2gDpDx(int rIndex,
430 int pIndex,
431 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
432 const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & delta_x,
433 const Teuchos::RCP<Thyra::VectorBase<Scalar> > & D2gDpDx) const;
434
443 void evalModel_D2gDxDp(int rIndex,
444 int pIndex,
445 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
446 const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & delta_p,
447 const Teuchos::RCP<Thyra::VectorBase<Scalar> > & D2gDxDp) const;
448
456 void evalModel_D2fDx2(const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
457 const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & delta_x,
458 const Teuchos::RCP<Thyra::LinearOpBase<Scalar> > & D2fDx2) const;
459
468 void evalModel_D2fDp2(int pIndex,
469 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
470 const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & delta_x,
471 const Teuchos::RCP<Thyra::LinearOpBase<Scalar> > & D2fDp2) const;
472
481 void evalModel_D2fDpDx(int pIndex,
482 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
483 const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & delta_x,
484 const Teuchos::RCP<Thyra::LinearOpBase<Scalar> > & D2fDpDx) const;
485
494 void evalModel_D2fDxDp(int pIndex,
495 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
496 const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & delta_p,
497 const Teuchos::RCP<Thyra::LinearOpBase<Scalar> > & D2fDxDp) const;
498
499protected:
500
503
505 Thyra::ModelEvaluatorBase::OutArgs<Scalar> createOutArgsImpl() const override;
506
508 virtual void evalModelImpl(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
509 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const override;
510
512
514 virtual void evalModelImpl_basic(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
515 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
516
518 virtual void evalModelImpl_basic_g(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
519 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
520
526 virtual void evalModelImpl_basic_dgdx(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
527 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
528
534 virtual void evalModelImpl_basic_dgdp_scalar(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
535 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
536
542 virtual void evalModelImpl_basic_dgdp_distro(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
543 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
544
550 virtual void evalModelImpl_basic_dfdp_scalar(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
551 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
552
558 virtual void evalModelImpl_basic_dfdp_scalar_fd(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
559 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
560
566 virtual void evalModelImpl_basic_dfdp_distro(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
567 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
568
570 bool required_basic_g(const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
571
573 bool required_basic_dgdx(const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
574
576 bool required_basic_dgdp_scalar(const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
577
579 bool required_basic_dgdp_distro(const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
580
582 bool required_basic_dfdp_scalar(const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
583
585 bool required_basic_dfdp_distro(const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
586
588 void initializeNominalValues() const;
589
590 // Set parameters in model supplied by inArgs
591 void setParameters(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs) const;
592
593 // Reset parameters back to nominal values
594 void resetParameters() const;
595
596private: // data members
597
599 bool is_distributed; // or (is scalar?)
600 Teuchos::RCP<Teuchos::Array<std::string> > names;
601 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > space;
602 Teuchos::RCP<const Thyra::VectorBase<Scalar> > initial_value;
603
604 // for distributed parameters
605 Teuchos::RCP<const GlobalIndexer> global_indexer;
606 Teuchos::RCP<panzer::ResponseLibrary<panzer::Traits> > dfdp_rl;
607 // for residual sensitivities with respect to a distributed parameter
608 Teuchos::RCP<panzer::ResponseLibrary<panzer::Traits> > dgdp_rl;
609 // for response sensitivities with respect to a distributed parameter
610
611 // for scalar parameters
613 };
614
616 std::string name;
617 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > space;
618
619 // for distributed parameter sensitivities
620 Teuchos::RCP<ResponseMESupportBuilderBase> builder;
621 // used for delayed construction of dgdp (distributed parameter) responses
622 std::vector<WorksetDescriptor> wkst_desc;
623 // used for delayed construction of dgdp (distributed parameter) responses
624
625 struct SearchName {
626 std::string name;
627 SearchName(const std::string & n) : name(n) {}
628 bool operator()(const Teuchos::RCP<ResponseObject> & ro) { return name==ro->name; }
629 };
630 };
631
632 Teuchos::RCP<ParameterObject> createScalarParameter(const Teuchos::Array<std::string> & names,
633 const Teuchos::Array<Scalar> & in_values) const;
634 Teuchos::RCP<ParameterObject> createDistributedParameter(const std::string & key,
635 const Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > & vs,
636 const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & initial,
637 const Teuchos::RCP<const GlobalIndexer> & ugi) const;
638
639 double t_init_;
640
641 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > x_space_;
642 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > f_space_;
643
644 mutable Thyra::ModelEvaluatorBase::InArgs<Scalar> prototypeInArgs_;
645 mutable Thyra::ModelEvaluatorBase::OutArgs<Scalar> prototypeOutArgs_;
646
647 mutable Thyra::ModelEvaluatorBase::InArgs<Scalar> nominalValues_;
648
649 mutable panzer::AssemblyEngine_TemplateManager<panzer::Traits> ae_tm_; // they control and provide access to evaluate
650
651 std::vector<Teuchos::RCP<ParameterObject> > parameters_;
652 std::vector<Teuchos::RCP<Thyra::VectorSpaceBase<double> > > tangent_space_;
656
659
660 // responses
661 mutable Teuchos::RCP<panzer::ResponseLibrary<panzer::Traits> > responseLibrary_;
662 std::vector<Teuchos::RCP<ResponseObject> > responses_;
663
664 Teuchos::RCP<panzer::GlobalData> global_data_;
666
667 // basic specific linear object objects
668 Teuchos::RCP<const panzer::LinearObjFactory<panzer::Traits> > lof_;
669 mutable Teuchos::RCP<panzer::LinearObjContainer> ghostedContainer_;
670 mutable Teuchos::RCP<ReadOnlyVector_GlobalEvaluationData> xContainer_;
671 mutable Teuchos::RCP<ReadOnlyVector_GlobalEvaluationData> xdotContainer_;
672
673
674 Teuchos::RCP<const Thyra::LinearOpWithSolveFactoryBase<Scalar> > solverFactory_;
675
679
681 mutable Scalar oneTimeDirichletBeta_;
682
685 std::vector<bool> active_evaluation_types_;
686
687 mutable unsigned long long write_matrix_count_;
688};
689
690// Inline definition of the add response (its template on the builder type)
691template<typename Scalar>
692template <typename ResponseEvaluatorFactory_BuilderT>
694addResponse(const std::string & responseName,
695 const std::vector<WorksetDescriptor> & wkst_desc,
696 const ResponseEvaluatorFactory_BuilderT & builder)
697{
698 using Teuchos::RCP;
699 using Teuchos::rcp;
700
701 // see if the response evaluators have been constucted yet
702 TEUCHOS_TEST_FOR_EXCEPTION(responseLibrary_->responseEvaluatorsBuilt(),std::logic_error,
703 "panzer::ModelEvaluator::addResponse: Response with name \"" << responseName << "\" "
704 "cannot be added to the model evaluator because evalModel has already been called!");
705
706 // add the response
707 responseLibrary_->addResponse(responseName,wkst_desc,builder);
708
709 // check that the response can be found
710 TEUCHOS_TEST_FOR_EXCEPTION(std::find_if(responses_.begin(),responses_.end(),typename ResponseObject::SearchName(responseName))!=responses_.end(),
711 std::logic_error,
712 "panzer::ModelEvaluator::addResponse: Response with name \"" << responseName << "\" "
713 "has already been added to the model evaluator!");
714
715 // allocate response object
716 RCP<ResponseObject> respObject = rcp(new ResponseObject);
717
718 // handle panzer::Traits::Residual
719 {
720 // check that at least there is a response value
721 Teuchos::RCP<panzer::ResponseBase> respBase = responseLibrary_->getResponse<panzer::Traits::Residual>(responseName);
722 TEUCHOS_TEST_FOR_EXCEPTION(respBase==Teuchos::null,std::logic_error,
723 "panzer::ModelEvaluator::addResponse: Response with name \"" << responseName << "\" "
724 "has no residual type! Not sure what is going on!");
725
726 // check that the response supports interactions with the model evaluator
727 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Residual> > resp =
728 Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<panzer::Traits::Residual> >(respBase);
729 TEUCHOS_TEST_FOR_EXCEPTION(resp==Teuchos::null,std::logic_error,
730 "panzer::ModelEvaluator::addResponse: Response with name \"" << responseName << "\" "
731 "resulted in bad cast to panzer::ResponseMESupportBase, the type of the response is incompatible!");
732
733 // set the response in the model evaluator
734 Teuchos::RCP<const Thyra::VectorSpaceBase<double> > vs = resp->getVectorSpace();
735 respObject->space = vs;
736
737 // lets be cautious and set a vector on the response
738 resp->setVector(Thyra::createMember(vs));
739 }
740
741 // handle panzer::Traits::Jacobian (do a quick safety check, response is null or appropriate for jacobian)
742 Teuchos::RCP<panzer::ResponseBase> respJacBase = responseLibrary_->getResponse<panzer::Traits::Jacobian>(responseName);
743 if(respJacBase!=Teuchos::null) {
744 typedef panzer::Traits::Jacobian RespEvalT;
745
746 // check that the response supports interactions with the model evaluator
747 Teuchos::RCP<panzer::ResponseMESupportBase<RespEvalT> > resp =
748 Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<RespEvalT> >(respJacBase);
749 TEUCHOS_TEST_FOR_EXCEPTION(resp==Teuchos::null,std::logic_error,
750 "panzer::ModelEvaluator::addResponse: Response with name \"" << responseName <<
751 "\" resulted in bad cast to panzer::ResponseMESupportBase<Jacobian>, the type "
752 "of the response is incompatible!");
753
754 // setup the vector (register response as epetra)
755 if(resp->supportsDerivative())
756 resp->setDerivative(resp->buildDerivative());
757 }
758
759#ifdef Panzer_BUILD_HESSIAN_SUPPORT
760 // handle panzer::Traits::Hessian (do a quick safety check, response is null or appropriate for jacobian)
761 Teuchos::RCP<panzer::ResponseBase> respHesBase = responseLibrary_->getResponse<panzer::Traits::Hessian>(responseName);
762 if(respHesBase!=Teuchos::null) {
763 typedef panzer::Traits::Hessian RespEvalT;
764
765 // check that the response supports interactions with the model evaluator
766 Teuchos::RCP<panzer::ResponseMESupportBase<RespEvalT> > resp =
767 Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<RespEvalT> >(respHesBase);
768 TEUCHOS_TEST_FOR_EXCEPTION(resp==Teuchos::null,std::logic_error,
769 "panzer::ModelEvaluator::addResponse: Response with name \"" << responseName <<
770 "\" resulted in bad cast to panzer::ResponseMESupportBase<Hessian>, the type "
771 "of the response is incompatible!");
772
773 // setup the vector (register response as epetra)
774 if(resp->supportsDerivative())
775 resp->setDerivative(resp->buildDerivative());
776 }
777#endif
778
779 respObject->name = responseName;
780 respObject->wkst_desc = wkst_desc;
781
782 responses_.push_back(respObject);
783
784 require_in_args_refresh_ = true;
785 require_out_args_refresh_ = true;
786 this->resetDefaultBase();
787
788 return responses_.size()-1;
789}
790
791
792}
793
794// #include "Panzer_ModelEvaluator_impl.hpp"
795
796#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?...
GlobalEvaluationDataContainer assemblyGlobalEvaluationData_
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="")
void addGlobalEvaluationDataToAssemblyInArgs(const std::string &name, const Teuchos::RCP< GlobalEvaluationData > &ged)
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.