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,
70 const std::vector<Teuchos::ArrayRCP<double> > & dgdx)
const = 0;
72 #ifdef Panzer_BUILD_HESSIAN_SUPPORT
73 virtual void scatterHessian(
const PHX::MDField<const panzer::Traits::Hessian::ScalarT,panzer::Cell> & cellIntegral,
76 const std::vector<Teuchos::ArrayRCP<double> > & d2gdx2)
const = 0;
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,
95 const std::vector<Teuchos::ArrayRCP<double> > & dgdx)
const;
97 #ifdef Panzer_BUILD_HESSIAN_SUPPORT
98 void scatterHessian(
const PHX::MDField<const panzer::Traits::Hessian::ScalarT,panzer::Cell> & cellIntegral,
101 const std::vector<Teuchos::ArrayRCP<double> > & d2gdx2)
const;
106 std::vector<Teuchos::RCP<const panzer::UniqueGlobalIndexer<LO,GO> > >
ugis_;
112 template<
typename EvalT,
typename Traits>
114 public PHX::EvaluatorDerived<EvalT, Traits> {
119 const Teuchos::RCP<FunctionalScatterBase> & functionalScatter);
121 const Teuchos::RCP<FunctionalScatterBase> & functionalScatter);
138 template <
typename LO,
typename GO>
142 const std::vector<Teuchos::ArrayRCP<double> > & dgdx)
const
144 Kokkos::View<const LO*, PHX::Device> LIDs;
147 std::string blockId = wda(workset).block_id;
149 std::vector<int> blockOffsets;
152 TEUCHOS_ASSERT(dgdx.size()==ugis_.size());
155 const std::vector<std::size_t> & localCellIds = wda(workset).cell_local_ids;
156 for(std::size_t worksetCellIndex=0;worksetCellIndex<localCellIds.size();++worksetCellIndex) {
157 std::size_t cellLocalId = localCellIds[worksetCellIndex];
159 for(std::size_t b=0;b<ugis_.size();b++) {
160 int start = blockOffsets[b];
162 LIDs = ugis_[b]->getElementLIDs(cellLocalId);
164 Teuchos::ArrayRCP<double> dgdx_b = dgdx[b];
167 for(std::size_t i=0;i<LIDs.size();i++) {
168 dgdx_b[LIDs[i]] += cellIntegral(worksetCellIndex).dx(start+i);
174 #ifdef Panzer_BUILD_HESSIAN_SUPPORT
175 template <
typename LO,
typename GO>
179 const std::vector<Teuchos::ArrayRCP<double> > & d2gdx2)
const
181 Kokkos::View<const LO*, PHX::Device> LIDs;
184 std::string blockId = wda(workset).block_id;
186 std::vector<int> blockOffsets;
189 TEUCHOS_ASSERT(d2gdx2.size()==ugis_.size());
192 const std::vector<std::size_t> & localCellIds = wda(workset).cell_local_ids;
193 for(std::size_t worksetCellIndex=0;worksetCellIndex<localCellIds.size();++worksetCellIndex) {
194 std::size_t cellLocalId = localCellIds[worksetCellIndex];
196 for(std::size_t b=0;b<ugis_.size();b++) {
197 int start = blockOffsets[b];
199 LIDs = ugis_[b]->getElementLIDs(cellLocalId);
201 Teuchos::ArrayRCP<double> d2gdx2_b = d2gdx2[b];
204 for(std::size_t i=0;i<LIDs.size();i++) {
205 d2gdx2_b[LIDs[i]] += cellIntegral(worksetCellIndex).dx(start+i).dx(0);