Panzer  Version of the Day
Panzer_ModelEvaluator.hpp
Go to the documentation of this file.
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Panzer: A partial differential equation assembly
5 // engine for strongly coupled complex multiphysics systems
6 // Copyright (2011) Sandia Corporation
7 //
8 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9 // the U.S. Government retains certain rights in this software.
10 //
11 // Redistribution and use in source and binary forms, with or without
12 // modification, are permitted provided that the following conditions are
13 // met:
14 //
15 // 1. Redistributions of source code must retain the above copyright
16 // notice, this list of conditions and the following disclaimer.
17 //
18 // 2. Redistributions in binary form must reproduce the above copyright
19 // notice, this list of conditions and the following disclaimer in the
20 // documentation and/or other materials provided with the distribution.
21 //
22 // 3. Neither the name of the Corporation nor the names of the
23 // contributors may be used to endorse or promote products derived from
24 // this software without specific prior written permission.
25 //
26 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Questions? Contact Roger P. Pawlowski (rppawlo@sandia.gov) and
39 // Eric C. Cyr (eccyr@sandia.gov)
40 // ***********************************************************************
41 // @HEADER
42 
43 #ifndef PANZER_MODEL_EVALUATOR_DECL_HPP
44 #define PANZER_MODEL_EVALUATOR_DECL_HPP
45 
46 #include "PanzerDiscFE_config.hpp"
47 
48 #include "Panzer_Traits.hpp"
55 
56 #include "Teuchos_RCP.hpp"
57 #include "Teuchos_AbstractFactory.hpp"
58 
59 #include "Thyra_VectorBase.hpp"
60 #include "Thyra_VectorSpaceBase.hpp"
61 #include "Thyra_StateFuncModelEvaluatorBase.hpp"
62 #include "Thyra_LinearOpWithSolveFactoryBase.hpp"
63 
64 #include <Panzer_NodeType.hpp>
65 
66 namespace panzer {
67 
68 class FieldManagerBuilder;
69 template<typename> class LinearObjFactory;
70 struct GlobalData;
71 class ReadOnlyVectorGlobalEvaluationData;
72 
73 template<typename Scalar>
75  : public Thyra::StateFuncModelEvaluatorBase<Scalar>
76 {
77 public:
78 
79 public:
80 
83 
84  ModelEvaluator(const Teuchos::RCP<panzer::FieldManagerBuilder>& fmb,
85  const Teuchos::RCP<panzer::ResponseLibrary<panzer::Traits> >& rLibrary,
86  const Teuchos::RCP<const panzer::LinearObjFactory<panzer::Traits> >& lof,
87  const std::vector<Teuchos::RCP<Teuchos::Array<std::string> > >& p_names,
88  const std::vector<Teuchos::RCP<Teuchos::Array<double> > >& p_values,
89  const Teuchos::RCP<const Thyra::LinearOpWithSolveFactoryBase<Scalar> > & solverFactory,
90  const Teuchos::RCP<panzer::GlobalData>& global_data,
91  bool build_transient_support,double t_init);
92 
93  ModelEvaluator(const Teuchos::RCP<const panzer::LinearObjFactory<panzer::Traits> >& lof,
94  const Teuchos::RCP<const Thyra::LinearOpWithSolveFactoryBase<Scalar> > & solverFactory,
95  const Teuchos::RCP<panzer::GlobalData>& global_data,
96  bool build_transient_support,double t_init);
97 
100 
102 
105 
107  Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > get_x_space() const;
108 
110  Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > get_f_space() const;
111 
113  Teuchos::RCP<const Teuchos::Array<std::string> > get_p_names(int i) const;
114 
116  Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > get_p_space(int i) const;
117 
119  Teuchos::ArrayView<const std::string> get_g_names(int i) const override;
120 
122  const std::string & get_g_name(int i) const;
123 
125  Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > get_g_space(int i) const;
126 
128  Teuchos::RCP<Thyra::LinearOpBase<Scalar> > create_W_op() const;
129 
131  Teuchos::RCP<const Thyra::LinearOpWithSolveFactoryBase<Scalar> > get_W_factory() const;
132 
134  Teuchos::RCP<Thyra::LinearOpBase<Scalar> > create_DfDp_op(int i) const;
135 
137  Thyra::ModelEvaluatorBase::InArgs<Scalar> createInArgs() const;
138 
139  Thyra::ModelEvaluatorBase::InArgs<Scalar> getNominalValues() const;
140 
142 
143  void setupModel(const Teuchos::RCP<panzer::WorksetContainer> & wc,
144  const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
145  const std::vector<panzer::BC> & bcs,
146  const panzer::EquationSetFactory & eqset_factory,
147  const panzer::BCStrategyFactory& bc_factory,
150  const Teuchos::ParameterList& closure_models,
151  const Teuchos::ParameterList& user_data,
152  bool writeGraph=false,const std::string & graphPrefix="",
153  const Teuchos::ParameterList& me_params = Teuchos::ParameterList());
154 
166  int addParameter(const std::string & name,const Scalar & initial);
167 
178  int addParameter(const Teuchos::Array<std::string> & names,
179  const Teuchos::Array<Scalar> & initialValues);
180 
197  int addDistributedParameter(const std::string & name,
198  const Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > & vs,
199  const Teuchos::RCP<GlobalEvaluationData> & ged,
200  const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & initial,
201  const Teuchos::RCP<const UniqueGlobalIndexerBase> & ugi=Teuchos::null);
202 
211  void addNonParameterGlobalEvaluationData(const std::string & name,
212  const Teuchos::RCP<GlobalEvaluationData> & ged);
213 
230  int addFlexibleResponse(const std::string & responseName,
231  const std::vector<WorksetDescriptor> & wkst_desc,
232  const Teuchos::RCP<ResponseMESupportBuilderBase> & builder);
233 
249  template <typename ResponseEvaluatorFactory_BuilderT>
250  int addResponse(const std::string & responseName,
251  const std::vector<WorksetDescriptor> & wkst_desc,
252  const ResponseEvaluatorFactory_BuilderT & builder);
253 
258  const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
259  const panzer::EquationSetFactory & eqset_factory,
261  const Teuchos::ParameterList& closure_models,
262  const Teuchos::ParameterList& user_data,
263  const bool write_graphviz_file=false,
264  const std::string& graphviz_file_prefix="")
265  { responseLibrary_->buildResponseEvaluators(physicsBlocks,eqset_factory,cm_factory,closure_models,user_data,write_graphviz_file,graphviz_file_prefix);
268 
269  typedef Thyra::ModelEvaluatorBase MEB;
270  MEB::OutArgsSetup<Scalar> outArgs;
271  outArgs.setModelEvalDescription(this->description());
272  outArgs.set_Np_Ng(num_me_parameters_, responses_.size());
273  outArgs.setSupports(MEB::OUT_ARG_f);
274  outArgs.setSupports(MEB::OUT_ARG_W_op);
275  prototypeOutArgs_ = outArgs; }
276 
281  const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
283  const Teuchos::ParameterList& closure_models,
284  const Teuchos::ParameterList& user_data,
285  const bool write_graphviz_file=false,
286  const std::string& graphviz_file_prefix="")
287  { responseLibrary_->buildResponseEvaluators(physicsBlocks,cm_factory,closure_models,user_data,write_graphviz_file,graphviz_file_prefix);
290 
291  typedef Thyra::ModelEvaluatorBase MEB;
292  MEB::OutArgsSetup<Scalar> outArgs;
293  outArgs.setModelEvalDescription(this->description());
294  outArgs.set_Np_Ng(num_me_parameters_, responses_.size());
295  outArgs.setSupports(MEB::OUT_ARG_f);
296  outArgs.setSupports(MEB::OUT_ARG_W_op);
297  prototypeOutArgs_ = outArgs; }
298 
305  const Teuchos::RCP<panzer::WorksetContainer> & wc,
306  const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
307  const std::vector<panzer::BC> & bcs,
308  const panzer::EquationSetFactory & eqset_factory,
309  const panzer::BCStrategyFactory& bc_factory,
311  const Teuchos::ParameterList& closure_models,
312  const Teuchos::ParameterList& user_data,
313  const bool write_graphviz_file=false,
314  const std::string& graphviz_file_prefix="");
315 
323  const Teuchos::RCP<panzer::WorksetContainer> & wc,
324  const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
325  const std::vector<panzer::BC> & bcs,
326  const panzer::EquationSetFactory & eqset_factory,
327  const panzer::BCStrategyFactory& bc_factory,
329  const Teuchos::ParameterList& closure_models,
330  const Teuchos::ParameterList& user_data,
331  const bool write_graphviz_file=false,
332  const std::string& graphviz_file_prefix="");
333 
341  void setOneTimeDirichletBeta(const Scalar & beta) const;
342 
346  void applyDirichletBCs(const Teuchos::RCP<Thyra::VectorBase<Scalar> > & x,
347  const Teuchos::RCP<Thyra::VectorBase<Scalar> > & f) const;
348 
354  void setupAssemblyInArgs(const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
355  panzer::AssemblyEngineInArgs & ae_inargs) const;
356 
357  Teuchos::RCP<panzer::ResponseLibrary<panzer::Traits> > getResponseLibrary() const
358  { return responseLibrary_; }
359 
362  int getXTangentVectorIndex(const int index) const {
363  int v_index = 0;
364  for (int i=0; i<index; i++) {
365  if (!parameters_[i]->is_distributed)
366  ++v_index;
367  }
368  return v_index + parameters_.size();
369  }
370 
373  int getXDotTangentVectorIndex(const int index) const {
374  int v_index = 0;
375  for (int i=0; i<index; i++) {
376  if (!parameters_[i]->is_distributed)
377  ++v_index;
378  }
379  return v_index + parameters_.size() + tangent_space_.size();
380  }
381 
384  Teuchos::RCP<const Thyra::VectorBase<Scalar> > get_parameter_vector(int index) const {
385  return parameters_[index]->initial_value;
386  }
387 
395  void evalModel_D2gDx2(int rIndex,
396  const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
397  const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & delta_x,
398  const Teuchos::RCP<Thyra::VectorBase<Scalar> > & D2gDx2) const;
399 
408  void evalModel_D2gDp2(int rIndex,
409  int pIndex,
410  const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
411  const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & delta_x,
412  const Teuchos::RCP<Thyra::VectorBase<Scalar> > & D2gDp2) const;
413 
422  void evalModel_D2gDpDx(int rIndex,
423  int pIndex,
424  const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
425  const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & delta_x,
426  const Teuchos::RCP<Thyra::VectorBase<Scalar> > & D2gDpDx) const;
427 
436  void evalModel_D2gDxDp(int rIndex,
437  int pIndex,
438  const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
439  const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & delta_p,
440  const Teuchos::RCP<Thyra::VectorBase<Scalar> > & D2gDxDp) const;
441 
449  void evalModel_D2fDx2(const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
450  const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & delta_x,
451  const Teuchos::RCP<Thyra::LinearOpBase<Scalar> > & D2fDx2) const;
452 
461  void evalModel_D2fDp2(int pIndex,
462  const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
463  const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & delta_x,
464  const Teuchos::RCP<Thyra::LinearOpBase<Scalar> > & D2fDp2) const;
465 
474  void evalModel_D2fDpDx(int pIndex,
475  const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
476  const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & delta_x,
477  const Teuchos::RCP<Thyra::LinearOpBase<Scalar> > & D2fDpDx) const;
478 
487  void evalModel_D2fDxDp(int pIndex,
488  const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
489  const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & delta_p,
490  const Teuchos::RCP<Thyra::LinearOpBase<Scalar> > & D2fDxDp) const;
491 
492 protected:
493 
496 
498  Thyra::ModelEvaluatorBase::OutArgs<Scalar> createOutArgsImpl() const;
499 
501  virtual void evalModelImpl(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
502  const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
503 
505 
507  virtual void evalModelImpl_basic(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
508  const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
509 
511  virtual void evalModelImpl_basic_g(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
512  const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
513 
519  virtual void evalModelImpl_basic_dgdx(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
520  const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
521 
527  virtual void evalModelImpl_basic_dgdp_scalar(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
528  const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
529 
535  virtual void evalModelImpl_basic_dgdp_distro(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
536  const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
537 
543  virtual void evalModelImpl_basic_dfdp_scalar(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
544  const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
545 
551  virtual void evalModelImpl_basic_dfdp_scalar_fd(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
552  const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
553 
559  virtual void evalModelImpl_basic_dfdp_distro(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
560  const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
561 
563  bool required_basic_g(const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
564 
566  bool required_basic_dgdx(const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
567 
569  bool required_basic_dgdp_scalar(const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
570 
572  bool required_basic_dgdp_distro(const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
573 
575  bool required_basic_dfdp_scalar(const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
576 
578  bool required_basic_dfdp_distro(const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const;
579 
581  void initializeNominalValues() const;
582 
583  // Set parameters in model supplied by inArgs
584  void setParameters(const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs) const;
585 
586  // Reset parameters back to nominal values
587  void resetParameters() const;
588 
589 private: // data members
590 
592  bool is_distributed; // or (is scalar?)
593  Teuchos::RCP<Teuchos::Array<std::string> > names;
594  Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > space;
595  Teuchos::RCP<const Thyra::VectorBase<Scalar> > initial_value;
596 
597  // for distributed parameters
598  Teuchos::RCP<const UniqueGlobalIndexerBase> global_indexer;
599  Teuchos::RCP<panzer::ResponseLibrary<panzer::Traits> > dfdp_rl;
600  // for residual sensitivities with respect to a distributed parameter
601  Teuchos::RCP<panzer::ResponseLibrary<panzer::Traits> > dgdp_rl;
602  // for response sensitivities with respect to a distributed parameter
603 
604  // for scalar parameters
606  };
607 
608  struct ResponseObject {
609  std::string name;
610  Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > space;
611 
612  // for distributed parameter sensitivities
613  Teuchos::RCP<ResponseMESupportBuilderBase> builder;
614  // used for delayed construction of dgdp (distributed parameter) responses
615  std::vector<WorksetDescriptor> wkst_desc;
616  // used for delayed construction of dgdp (distributed parameter) responses
617 
618  struct SearchName {
619  std::string name;
620  SearchName(const std::string & n) : name(n) {}
621  bool operator()(const Teuchos::RCP<ResponseObject> & ro) { return name==ro->name; }
622  };
623  };
624 
625  Teuchos::RCP<ParameterObject> createScalarParameter(const Teuchos::Array<std::string> & names,
626  const Teuchos::Array<Scalar> & in_values) const;
627  Teuchos::RCP<ParameterObject> createDistributedParameter(const std::string & key,
628  const Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > & vs,
629  const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & initial,
630  const Teuchos::RCP<const UniqueGlobalIndexerBase> & ugi) const;
631 
632  double t_init_;
633 
634  Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > x_space_;
635  Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > f_space_;
636 
637  mutable Thyra::ModelEvaluatorBase::InArgs<Scalar> prototypeInArgs_;
638  mutable Thyra::ModelEvaluatorBase::OutArgs<Scalar> prototypeOutArgs_;
639 
640  mutable Thyra::ModelEvaluatorBase::InArgs<Scalar> nominalValues_;
641 
642  mutable panzer::AssemblyEngine_TemplateManager<panzer::Traits> ae_tm_; // they control and provide access to evaluate
643 
644  std::vector<Teuchos::RCP<ParameterObject> > parameters_;
645  std::vector<Teuchos::RCP<Thyra::VectorSpaceBase<double> > > tangent_space_;
649 
652 
653  // responses
654  mutable Teuchos::RCP<panzer::ResponseLibrary<panzer::Traits> > responseLibrary_;
655  std::vector<Teuchos::RCP<ResponseObject> > responses_;
656 
657  Teuchos::RCP<panzer::GlobalData> global_data_;
659 
660  // basic specific linear object objects
661  Teuchos::RCP<const panzer::LinearObjFactory<panzer::Traits> > lof_;
662  mutable Teuchos::RCP<panzer::LinearObjContainer> ghostedContainer_;
663  mutable Teuchos::RCP<ReadOnlyVector_GlobalEvaluationData> xContainer_;
664  mutable Teuchos::RCP<ReadOnlyVector_GlobalEvaluationData> xdotContainer_;
665 
666 
667  Teuchos::RCP<const Thyra::LinearOpWithSolveFactoryBase<Scalar> > solverFactory_;
668 
671 
673  mutable Scalar oneTimeDirichletBeta_;
674 };
675 
676 // Inline definition of the add response (its template on the builder type)
677 template<typename Scalar>
678 template <typename ResponseEvaluatorFactory_BuilderT>
680 addResponse(const std::string & responseName,
681  const std::vector<WorksetDescriptor> & wkst_desc,
682  const ResponseEvaluatorFactory_BuilderT & builder)
683 {
684  using Teuchos::RCP;
685  using Teuchos::rcp;
686 
687  // see if the response evaluators have been constucted yet
688  TEUCHOS_TEST_FOR_EXCEPTION(responseLibrary_->responseEvaluatorsBuilt(),std::logic_error,
689  "panzer::ModelEvaluator::addResponse: Response with name \"" << responseName << "\" "
690  "cannot be added to the model evaluator because evalModel has already been called!");
691 
692  // add the response
693  responseLibrary_->addResponse(responseName,wkst_desc,builder);
694 
695  // check that the response can be found
696  TEUCHOS_TEST_FOR_EXCEPTION(std::find_if(responses_.begin(),responses_.end(),typename ResponseObject::SearchName(responseName))!=responses_.end(),
697  std::logic_error,
698  "panzer::ModelEvaluator::addResponse: Response with name \"" << responseName << "\" "
699  "has already been added to the model evaluator!");
700 
701  // allocate response object
702  RCP<ResponseObject> respObject = rcp(new ResponseObject);
703 
704  // handle panzer::Traits::Residual
705  {
706  // check that at least there is a response value
707  Teuchos::RCP<panzer::ResponseBase> respBase = responseLibrary_->getResponse<panzer::Traits::Residual>(responseName);
708  TEUCHOS_TEST_FOR_EXCEPTION(respBase==Teuchos::null,std::logic_error,
709  "panzer::ModelEvaluator::addResponse: Response with name \"" << responseName << "\" "
710  "has no residual type! Not sure what is going on!");
711 
712  // check that the response supports interactions with the model evaluator
713  Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Residual> > resp =
714  Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<panzer::Traits::Residual> >(respBase);
715  TEUCHOS_TEST_FOR_EXCEPTION(resp==Teuchos::null,std::logic_error,
716  "panzer::ModelEvaluator::addResponse: Response with name \"" << responseName << "\" "
717  "resulted in bad cast to panzer::ResponseMESupportBase, the type of the response is incompatible!");
718 
719  // set the response in the model evaluator
720  Teuchos::RCP<const Thyra::VectorSpaceBase<double> > vs = resp->getVectorSpace();
721  respObject->space = vs;
722 
723  // lets be cautious and set a vector on the response
724  resp->setVector(Thyra::createMember(vs));
725  }
726 
727  // handle panzer::Traits::Jacobian (do a quick safety check, response is null or appropriate for jacobian)
728  Teuchos::RCP<panzer::ResponseBase> respJacBase = responseLibrary_->getResponse<panzer::Traits::Jacobian>(responseName);
729  if(respJacBase!=Teuchos::null) {
730  typedef panzer::Traits::Jacobian RespEvalT;
731 
732  // check that the response supports interactions with the model evaluator
733  Teuchos::RCP<panzer::ResponseMESupportBase<RespEvalT> > resp =
734  Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<RespEvalT> >(respJacBase);
735  TEUCHOS_TEST_FOR_EXCEPTION(resp==Teuchos::null,std::logic_error,
736  "panzer::ModelEvaluator::addResponse: Response with name \"" << responseName <<
737  "\" resulted in bad cast to panzer::ResponseMESupportBase<Jacobian>, the type "
738  "of the response is incompatible!");
739 
740  // setup the vector (register response as epetra)
741  if(resp->supportsDerivative())
742  resp->setDerivative(resp->buildDerivative());
743  }
744 
745 #ifdef Panzer_BUILD_HESSIAN_SUPPORT
746  // handle panzer::Traits::Hessian (do a quick safety check, response is null or appropriate for jacobian)
747  Teuchos::RCP<panzer::ResponseBase> respHesBase = responseLibrary_->getResponse<panzer::Traits::Hessian>(responseName);
748  if(respHesBase!=Teuchos::null) {
749  typedef panzer::Traits::Hessian RespEvalT;
750 
751  // check that the response supports interactions with the model evaluator
752  Teuchos::RCP<panzer::ResponseMESupportBase<RespEvalT> > resp =
753  Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<RespEvalT> >(respHesBase);
754  TEUCHOS_TEST_FOR_EXCEPTION(resp==Teuchos::null,std::logic_error,
755  "panzer::ModelEvaluator::addResponse: Response with name \"" << responseName <<
756  "\" resulted in bad cast to panzer::ResponseMESupportBase<Hessian>, the type "
757  "of the response is incompatible!");
758 
759  // setup the vector (register response as epetra)
760  if(resp->supportsDerivative())
761  resp->setDerivative(resp->buildDerivative());
762  }
763 #endif
764 
765  respObject->name = responseName;
766  respObject->wkst_desc = wkst_desc;
767 
768  responses_.push_back(respObject);
769 
770  require_in_args_refresh_ = true;
771  require_out_args_refresh_ = true;
772 
773  return responses_.size()-1;
774 }
775 
776 
777 }
778 
779 // #include "Panzer_ModelEvaluator_impl.hpp"
780 
781 #endif
Interface for constructing a BCStrategy_TemplateManager.
std::vector< WorksetDescriptor > wkst_desc
virtual void evalModelImpl_basic_dfdp_scalar(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Allocates and initializes an equation set template manager.
Thyra::ModelEvaluatorBase::InArgs< Scalar > getNominalValues() const
Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > dfdp_rl
std::vector< Teuchos::RCP< ParameterObject > > parameters_
void setParameters(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs) const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_g_space(int i) const
GlobalEvaluationDataContainer nonParamGlobalEvaluationData_
int addFlexibleResponse(const std::string &responseName, const std::vector< WorksetDescriptor > &wkst_desc, const Teuchos::RCP< ResponseMESupportBuilderBase > &builder)
int getXDotTangentVectorIndex(const int index) const
Teuchos::RCP< const Thyra::VectorBase< Scalar > > initial_value
const std::string & get_g_name(int i) const
Thyra::ModelEvaluatorBase::InArgs< Scalar > prototypeInArgs_
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > space
panzer::AssemblyEngine_TemplateManager< panzer::Traits > ae_tm_
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="")
std::vector< Teuchos::RCP< ResponseObject > > responses_
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 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
Teuchos::RCP< Teuchos::Array< std::string > > names
Teuchos::RCP< panzer::GlobalData > global_data_
void setupAssemblyInArgs(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, panzer::AssemblyEngineInArgs &ae_inargs) const
virtual void evalModelImpl_basic_dgdp_distro(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
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
void initializeNominalValues() const
Initialize the nominal values with good starting conditions.
Thyra::ModelEvaluatorBase::OutArgs< Scalar > createOutArgsImpl() const
virtual void evalModelImpl_basic_dgdp_scalar(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Sacado::ScalarParameterVector< panzer::EvaluationTraits > ParamVec
Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > dgdp_rl
Teuchos::RCP< const Thyra::LinearOpWithSolveFactoryBase< Scalar > > get_W_factory() const
bool operator()(const Teuchos::RCP< ResponseObject > &ro)
PHX::MDField< ScalarT > vector
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_x_space() const
int addResponse(const std::string &responseName, const std::vector< WorksetDescriptor > &wkst_desc, const ResponseEvaluatorFactory_BuilderT &builder)
Teuchos::RCP< panzer::GlobalData > global_data
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > x_space_
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
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > f_space_
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? DfDp.
Teuchos::ArrayView< const std::string > get_g_names(int i) const override
Teuchos::RCP< const UniqueGlobalIndexerBase > global_indexer
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...
virtual void evalModelImpl(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_p_space(int i) const
GlobalEvaluationDataContainer distrParamGlobalEvaluationData_
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > space
Teuchos::RCP< Thyra::LinearOpBase< Scalar > > create_DfDp_op(int i) const
Teuchos::RCP< const panzer::LinearObjFactory< panzer::Traits > > lof_
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="")
void applyDirichletBCs(const Teuchos::RCP< Thyra::VectorBase< Scalar > > &x, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &f) const
Thyra::ModelEvaluatorBase::OutArgs< Scalar > prototypeOutArgs_
std::vector< Teuchos::RCP< Thyra::VectorSpaceBase< double > > > tangent_space_
Teuchos::RCP< const Thyra::LinearOpWithSolveFactoryBase< Scalar > > solverFactory_
int getXTangentVectorIndex(const int index) 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 UniqueGlobalIndexerBase > &ugi) const
Teuchos::RCP< const Teuchos::Array< std::string > > get_p_names(int i) const
bool required_basic_g(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Does this set of out args require a simple response?
bool required_basic_dgdx(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are their required responses in the out args? DgDx.
Teuchos::RCP< ParameterObject > createScalarParameter(const Teuchos::Array< std::string > &names, const Teuchos::Array< Scalar > &in_values) const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_f_space() const
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="")
Thyra::ModelEvaluatorBase::InArgs< Scalar > createInArgs() const
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())
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
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
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
Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > getResponseLibrary() const
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.
Teuchos::RCP< Thyra::LinearOpBase< Scalar > > create_W_op() const
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 UniqueGlobalIndexerBase > &ugi=Teuchos::null)
void setOneTimeDirichletBeta(const Scalar &beta) const
Teuchos::RCP< ResponseMESupportBuilderBase > builder
Teuchos::RCP< panzer::LinearObjContainer > ghostedContainer_
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="")
Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > responseLibrary_
void addNonParameterGlobalEvaluationData(const std::string &name, const Teuchos::RCP< GlobalEvaluationData > &ged)
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< const Thyra::VectorBase< Scalar > > get_parameter_vector(int index) const
Thyra::ModelEvaluatorBase::InArgs< Scalar > nominalValues_
bool required_basic_dgdp_scalar(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are their required responses in the out args? DgDp.
virtual void evalModelImpl_basic_dfdp_distro(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
virtual void evalModelImpl_basic_dgdx(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
bool required_basic_dgdp_distro(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are their required responses in the out args? DgDp.
Teuchos::RCP< ReadOnlyVector_GlobalEvaluationData > xContainer_
int addParameter(const std::string &name, const Scalar &initial)
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
virtual void evalModelImpl_basic_dfdp_scalar_fd(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const