Panzer  Version of the Day
Panzer_ResponseEvaluatorFactory_Functional_impl.hpp
Go to the documentation of this file.
1 #ifndef __Panzer_ResponseEvaluatorFactory_Functional_impl_hpp__
2 #define __Panzer_ResponseEvaluatorFactory_Functional_impl_hpp__
3 
4 #include <string>
5 
6 #include "PanzerDiscFE_config.hpp"
7 
10 #include "Panzer_Integrator_Scalar.hpp"
15 
16 namespace panzer {
17 
18 template <typename EvalT,typename LO,typename GO>
20 buildResponseObject(const std::string & responseName) const
21 {
22  Teuchos::RCP<ResponseBase> response = Teuchos::rcp(new Response_Functional<EvalT>(responseName,comm_,linearObjFactory_));
23  response->setRequiresDirichletAdjustment(applyDirichletToDerivative_);
24 
25  return response;
26 }
27 
28 template <typename EvalT,typename LO,typename GO>
30 buildAndRegisterEvaluators(const std::string & responseName,
32  const panzer::PhysicsBlock & physicsBlock,
33  const Teuchos::ParameterList & user_data) const
34 {
35  using Teuchos::RCP;
36  using Teuchos::rcp;
37 
38 
39  // build integration evaluator (integrate over element)
40  if(requiresCellIntegral_) {
41  std::string field = (quadPointField_=="" ? responseName : quadPointField_);
42 
43  // build integration rule to use in cell integral
44  RCP<IntegrationRule> ir = rcp(new IntegrationRule(cubatureDegree_,physicsBlock.cellData()));
45 
47  pl.set("Integral Name",field);
48  pl.set("Integrand Name",field);
49  pl.set("IR",ir);
50 
52  = Teuchos::rcp(new Integrator_Scalar<EvalT,panzer::Traits>(pl));
53 
54  this->template registerEvaluator<EvalT>(fm, eval);
55  }
56 
57 
58  // build scatter evaluator
59  {
61  if(linearObjFactory_!=Teuchos::null) {
62 
63  TEUCHOS_ASSERT(linearObjFactory_->getDomainGlobalIndexer()!=Teuchos::null);
64 
65  auto ugi = Teuchos::rcp_dynamic_cast<const UniqueGlobalIndexer<LO,GO> >(linearObjFactory_->getDomainGlobalIndexer());
66  auto bugi = Teuchos::rcp_dynamic_cast<const BlockedDOFManager<LO,GO> >(linearObjFactory_->getDomainGlobalIndexer());
67 
68  if(ugi!=Teuchos::null) {
69  std::vector<Teuchos::RCP<const UniqueGlobalIndexer<LO,GO> > > ugis;
70  ugis.push_back(ugi);
71 
72  scatterObj = Teuchos::rcp(new FunctionalScatter<LO,GO>(ugis));
73  }
74  else if(bugi!=Teuchos::null) {
75  scatterObj = Teuchos::rcp(new FunctionalScatter<LO,GO>(nc2c_vector(bugi->getFieldDOFManagers())));
76  }
77  else {
78  TEUCHOS_ASSERT(false); // no real global indexer to use
79  }
80  }
81 
82  std::string field = (quadPointField_=="" ? responseName : quadPointField_);
83 
84  // build useful evaluator
86  = Teuchos::rcp(new ResponseScatterEvaluator_Functional<EvalT,panzer::Traits>(field,responseName,physicsBlock.cellData(),scatterObj));
87 
88  this->template registerEvaluator<EvalT>(fm, eval);
89 
90  // require last field
91  fm.template requireField<EvalT>(*eval->evaluatedFields()[0]);
92  }
93 }
94 
95 template <typename EvalT,typename LO,typename GO>
98 {
99  if( PHX::typeAsString<EvalT>()==PHX::typeAsString<panzer::Traits::Residual>() ||
100  PHX::typeAsString<EvalT>()==PHX::typeAsString<panzer::Traits::Tangent>()
101  )
102  return true;
103 
104  if(PHX::typeAsString<EvalT>()==PHX::typeAsString<panzer::Traits::Jacobian>())
105  return linearObjFactory_!=Teuchos::null;
106 
107 #ifdef Panzer_BUILD_HESSIAN_SUPPORT
108  if(PHX::typeAsString<EvalT>()==PHX::typeAsString<panzer::Traits::Hessian>()) {
109  return linearObjFactory_!=Teuchos::null;
110  }
111 #endif
112 
113  return false;
114 }
115 
116 }
117 
118 #endif
Object that contains information on the physics and discretization of a block of elements with the SA...
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
std::vector< Teuchos::RCP< const UniqueGlobalIndexer< LocalOrdinalT, GlobalOrdinalT > > > nc2c_vector(const std::vector< Teuchos::RCP< UniqueGlobalIndexer< LocalOrdinalT, GlobalOrdinalT > > > &ugis)
virtual void buildAndRegisterEvaluators(const std::string &responseName, PHX::FieldManager< panzer::Traits > &fm, const panzer::PhysicsBlock &physicsBlock, const Teuchos::ParameterList &user_data) const
PHX::MDField< const ScalarT, Cell, IP > field
const panzer::CellData & cellData() const
#define TEUCHOS_ASSERT(assertion_test)
virtual Teuchos::RCP< ResponseBase > buildResponseObject(const std::string &responseName) const