43 #ifndef PANZER_RESPONSE_SCATTER_EVALUATOR_FUNCTIONAL_HPP 44 #define PANZER_RESPONSE_SCATTER_EVALUATOR_FUNCTIONAL_HPP 49 #include "PanzerDiscFE_config.hpp" 56 #include "Phalanx_Evaluator_Macros.hpp" 57 #include "Phalanx_MDField.hpp" 67 virtual void scatterDerivative(
const PHX::MDField<const panzer::Traits::Jacobian::ScalarT,panzer::Cell> & cellIntegral,
72 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 73 virtual void scatterHessian(
const PHX::MDField<const panzer::Traits::Hessian::ScalarT,panzer::Cell> & cellIntegral,
80 template <
typename LO,
typename GO>
85 if(globalIndexer!=Teuchos::null)
86 ugis_.push_back(globalIndexer);
92 void scatterDerivative(
const PHX::MDField<const panzer::Traits::Jacobian::ScalarT,panzer::Cell> & cellIntegral,
97 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 98 void scatterHessian(
const PHX::MDField<const panzer::Traits::Hessian::ScalarT,panzer::Cell> & cellIntegral,
106 std::vector<Teuchos::RCP<const panzer::UniqueGlobalIndexer<LO,GO> > >
ugis_;
112 template<
typename EvalT,
typename Traits>
114 public PHX::EvaluatorDerived<EvalT, Traits> {
141 template <
typename LO,
typename GO>
147 std::vector<LO> LIDs;
150 std::string blockId = wda(workset).block_id;
152 std::vector<int> blockOffsets;
158 const std::vector<std::size_t> & localCellIds = wda(workset).cell_local_ids;
159 for(std::size_t worksetCellIndex=0;worksetCellIndex<localCellIds.size();++worksetCellIndex) {
160 std::size_t cellLocalId = localCellIds[worksetCellIndex];
162 for(std::size_t b=0;b<ugis_.size();b++) {
163 int start = blockOffsets[b];
165 LIDs = ugis_[b]->getElementLIDs(cellLocalId);
170 for(std::size_t i=0;i<LIDs.size();i++) {
171 dgdx_b[LIDs[i]] += cellIntegral(worksetCellIndex).dx(start+i);
177 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 178 template <
typename LO,
typename GO>
184 std::vector<LO> LIDs;
187 std::string blockId = wda(workset).block_id;
189 std::vector<int> blockOffsets;
195 const std::vector<std::size_t> & localCellIds = wda(workset).cell_local_ids;
196 for(std::size_t worksetCellIndex=0;worksetCellIndex<localCellIds.size();++worksetCellIndex) {
197 std::size_t cellLocalId = localCellIds[worksetCellIndex];
199 for(std::size_t b=0;b<ugis_.size();b++) {
200 int start = blockOffsets[b];
202 LIDs = ugis_[b]->getElementLIDs(cellLocalId);
207 for(std::size_t i=0;i<LIDs.size();i++) {
208 d2gdx2_b[LIDs[i]] += cellIntegral(worksetCellIndex).dx(start+i).dx(0);
virtual ~FunctionalScatterBase()
ResponseScatterEvaluator_Functional(const std::string &name, const CellData &cd, const Teuchos::RCP< FunctionalScatterBase > &functionalScatter)
A constructor with concrete arguments instead of a parameter list.
std::vector< Teuchos::RCP< const panzer::UniqueGlobalIndexer< LO, GO > > > ugis_
void computeBlockOffsets(const std::string &blockId, const std::vector< Teuchos::RCP< UniqueGlobalIndexer< LocalOrdinalT, GlobalOrdinalT > > > &ugis, std::vector< int > &blockOffsets)
Teuchos::RCP< FunctionalScatterBase > scatterObj_
virtual void scatterDerivative(const PHX::MDField< const panzer::Traits::Jacobian::ScalarT, panzer::Cell > &cellIntegral, panzer::Traits::EvalData workset, WorksetDetailsAccessor &wda, const std::vector< Teuchos::ArrayRCP< double > > &dgdx) const =0
void scatterDerivative(const PHX::MDField< const panzer::Traits::Jacobian::ScalarT, panzer::Cell > &cellIntegral, panzer::Traits::EvalData workset, WorksetDetailsAccessor &wda, const std::vector< Teuchos::ArrayRCP< double > > &dgdx) const
void preEvaluate(typename Traits::PreEvalData d)
std::string responseName_
PHX::MDField< ScalarT > vector
PHX::MDField< const ScalarT, panzer::Cell > cellIntegral_
void postRegistrationSetup(typename Traits::SetupData d, PHX::FieldManager< Traits > &fm)
Data for determining cell topology and dimensionality.
Wrapper to PHX::EvaluatorWithBaseImpl that implements Panzer-specific helpers.
FunctionalScatter(const std::vector< Teuchos::RCP< const panzer::UniqueGlobalIndexer< LO, GO > > > &ugis)
FunctionalScatter(const Teuchos::RCP< const panzer::UniqueGlobalIndexer< LO, GO > > &globalIndexer)
void evaluateFields(typename Traits::EvalData d)
Teuchos::RCP< PHX::FieldTag > scatterHolder_
#define TEUCHOS_ASSERT(assertion_test)
Teuchos::RCP< Response_Functional< EvalT > > responseObj_