43 #ifndef PANZER_GATHER_TANGENT_TPETRA_IMPL_HPP
44 #define PANZER_GATHER_TANGENT_TPETRA_IMPL_HPP
46 #include "Teuchos_Assert.hpp"
47 #include "Phalanx_DataLayout.hpp"
56 #include "Teuchos_FancyOStream.hpp"
58 #include "Tpetra_Vector.hpp"
59 #include "Tpetra_Map.hpp"
61 template<
typename EvalT,
typename TRAITS,
typename LO,
typename GO,
typename NodeT>
66 : globalIndexer_(indexer)
67 , useTimeDerivativeSolutionVector_(false)
68 , globalDataKey_(
"Tangent Gather Container")
70 const std::vector<std::string>& names =
83 for (std::size_t fd = 0; fd < names.size(); ++fd) {
93 if (p.
isType<
bool>(
"Use Time Derivative Solution Vector"))
96 if (p.
isType<std::string>(
"Global Data Key"))
99 this->setName(
"Gather Tangent");
103 template<
typename EvalT,
typename TRAITS,
typename LO,
typename GO,
typename NodeT>
110 fieldIds_.resize(gatherFields_.size());
112 gatherFieldsVoV_.initialize(
"GatherSolution_Teptra<Tangent>",gatherFields_.size());
114 for (std::size_t fd = 0; fd < gatherFields_.size(); ++fd) {
115 const std::string& fieldName = (*indexerNames_)[fd];
116 fieldIds_[fd] = globalIndexer_->getFieldNum(fieldName);
117 gatherFieldsVoV_.addView(gatherFields_[fd].get_static_view(),fd);
120 gatherFieldsVoV_.syncHostToDevice();
122 indexerNames_ = Teuchos::null;
126 template<
typename EvalT,
typename TRAITS,
typename LO,
typename GO,
typename NodeT>
131 using Teuchos::rcp_dynamic_cast;
136 if (d.gedc->containsDataObject(globalDataKey_)) {
141 if(loc_pair!=Teuchos::null) {
143 tpetraContainer_ = rcp_dynamic_cast<LOC>(loc,
true);
146 if(tpetraContainer_==Teuchos::null) {
147 tpetraContainer_ = rcp_dynamic_cast<LOC>(ged,
true);
153 template<
typename EvalT,
typename TRAITS,
typename LO,
typename GO,
typename NodeT>
159 if (tpetraContainer_ == Teuchos::null)
164 std::string blockId = this->wda(workset).block_id;
167 if (useTimeDerivativeSolutionVector_)
168 x = tpetraContainer_->get_dxdt();
170 x = tpetraContainer_->get_x();
172 auto cellLocalIdsKokkos = this->wda(workset).getLocalCellIDs();
173 auto lids = globalIndexer_->getLIDs();
174 auto vov = Teuchos::rcp_dynamic_cast<
const panzer::DOFManager>(globalIndexer_,
true)->getGIDFieldOffsetsKokkos(blockId,fieldIds_);
175 auto gidFieldOffsets = vov.getViewDevice();
176 auto gatherFieldsDevice = gatherFieldsVoV_.getViewDevice();
177 auto x_view = x->getLocalViewDevice(Tpetra::Access::ReadWrite);
178 Kokkos::MDRangePolicy<PHX::Device::execution_space,Kokkos::Rank<2>> policy({0,0},{cellLocalIdsKokkos.extent(0),gidFieldOffsets.extent(0)});
179 Kokkos::parallel_for(
"GatherSolutionTpetra<Tangent>",policy,KOKKOS_LAMBDA(
const int worksetCellIndex,
const int fieldIndex) {
180 for(std::size_t basis=0;basis<gidFieldOffsets(fieldIndex).extent(0);basis++) {
181 int offset = gidFieldOffsets(fieldIndex)(basis);
182 LO lid =
lids(cellLocalIdsKokkos(worksetCellIndex),offset);
183 auto& gf_ref = (gatherFieldsDevice[fieldIndex])(worksetCellIndex,basis);
184 gf_ref = x_view(lid,0);
Teuchos::RCP< std::vector< std::string > > indexerNames_
void preEvaluate(typename TRAITS::PreEvalData d)
void evaluateFields(typename TRAITS::EvalData d)
T & get(const std::string &name, T def_value)
virtual Teuchos::RCP< CloneableEvaluator > clone(const Teuchos::ParameterList &pl) const
std::vector< PHX::MDField< ScalarT, Cell, NODE > > gatherFields_
Teuchos::RCP< LinearObjContainer > getGhostedLOC() const
bool useTimeDerivativeSolutionVector_
std::string globalDataKey_
bool isType(const std::string &name) const
void postRegistrationSetup(typename TRAITS::SetupData d, PHX::FieldManager< TRAITS > &vm)
#define TEUCHOS_ASSERT(assertion_test)
Kokkos::View< const LO **, Kokkos::LayoutRight, PHX::Device > lids