53 if(globalIndexer!=Teuchos::null)
54 ugis_.push_back(globalIndexer);
60 void scatterDerivative(
const PHX::MDField<const panzer::Traits::Jacobian::ScalarT,panzer::Cell> & cellIntegral,
63 const std::vector<Teuchos::ArrayRCP<double> > & dgdx)
const;
65#ifdef Panzer_BUILD_HESSIAN_SUPPORT
66 void scatterHessian(
const PHX::MDField<const panzer::Traits::Hessian::ScalarT,panzer::Cell> & cellIntegral,
69 const std::vector<Teuchos::ArrayRCP<double> > & d2gdx2)
const;
74 std::vector<Teuchos::RCP<const panzer::GlobalIndexer> >
ugis_;
82 public PHX::EvaluatorDerived<EvalT, Traits> {
87 const Teuchos::RCP<FunctionalScatterBase> & functionalScatter);
89 const Teuchos::RCP<FunctionalScatterBase> & functionalScatter);
110 const std::vector<Teuchos::ArrayRCP<double> > & dgdx)
const
113 std::string blockId = wda(workset).block_id;
115 std::vector<int> blockOffsets;
118 TEUCHOS_ASSERT(dgdx.size()==ugis_.size());
120 auto cellIntegral_h = Kokkos::create_mirror_view(cellIntegral.get_view());
121 Kokkos::deep_copy(cellIntegral_h, cellIntegral.get_view());
123 const std::vector<std::size_t> & localCellIds = wda(workset).cell_local_ids;
125 for(std::size_t b=0;b<ugis_.size();b++) {
126 int start = blockOffsets[b];
128 auto LIDs = ugis_[b]->getLIDs();
129 auto LIDs_h = Kokkos::create_mirror_view(LIDs);
130 Kokkos::deep_copy(LIDs_h, LIDs);
132 Teuchos::ArrayRCP<double> dgdx_b = dgdx[b];
135 for(std::size_t worksetCellIndex=0;worksetCellIndex<localCellIds.size();++worksetCellIndex) {
136 std::size_t cellLocalId = localCellIds[worksetCellIndex];
139 for(std::size_t i=0;i<LIDs_h.extent(1);i++) {
140 dgdx_b[LIDs_h(cellLocalId, i)] += cellIntegral_h(worksetCellIndex).dx(start+i);
151 const std::vector<Teuchos::ArrayRCP<double> > & d2gdx2)
const
153 PHX::View<const LO*> LIDs;
156 std::string blockId = wda(workset).block_id;
158 std::vector<int> blockOffsets;
161 TEUCHOS_ASSERT(d2gdx2.size()==ugis_.size());
164 const std::vector<std::size_t> & localCellIds = wda(workset).cell_local_ids;
165 for(std::size_t worksetCellIndex=0;worksetCellIndex<localCellIds.size();++worksetCellIndex) {
166 std::size_t cellLocalId = localCellIds[worksetCellIndex];
168 for(std::size_t b=0;b<ugis_.size();b++) {
169 int start = blockOffsets[b];
171 LIDs = ugis_[b]->getElementLIDs(cellLocalId);
173 Teuchos::ArrayRCP<double> d2gdx2_b = d2gdx2[b];
176 for(std::size_t i=0;i<LIDs.size();i++) {
177 d2gdx2_b[LIDs[i]] += cellIntegral(worksetCellIndex).dx(start+i).dx(0);
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
virtual void scatterHessian(const PHX::MDField< const panzer::Traits::Hessian::ScalarT, panzer::Cell > &cellIntegral, panzer::Traits::EvalData workset, WorksetDetailsAccessor &wda, const std::vector< Teuchos::ArrayRCP< double > > &d2gdx2) const =0