43 #ifndef __Panzer_UniqueGlobalIndexer_hpp__ 44 #define __Panzer_UniqueGlobalIndexer_hpp__ 49 #include <unordered_map> 51 #include "Teuchos_RCP.hpp" 52 #include "Teuchos_Comm.hpp" 54 #include "Phalanx_KokkosDeviceTypes.hpp" 59 template <
typename LocalOrdinalT>
class ConnManagerBase;
68 virtual Teuchos::RCP<Teuchos::Comm<int> >
getComm()
const = 0;
88 virtual int getFieldNum(
const std::string & str)
const = 0;
92 virtual void getFieldOrder(std::vector<std::string> & fieldOrder)
const = 0;
107 virtual void getElementBlockIds(std::vector<std::string> & elementBlockIds)
const = 0;
111 virtual bool fieldInBlock(
const std::string &
field,
const std::string & block)
const = 0;
120 virtual const std::vector<int> &
getGIDFieldOffsets(
const std::string & blockId,
int fieldNum)
const = 0;
134 virtual const std::pair<std::vector<int>,std::vector<int> > &
136 int subcellDim,
int subcellId)
const = 0;
153 template <
typename LocalOrdinalT,
typename GlobalOrdinalT>
161 virtual Teuchos::RCP<Teuchos::Comm<int> >
getComm()
const = 0;
181 virtual int getFieldNum(
const std::string & str)
const = 0;
185 virtual void getFieldOrder(std::vector<std::string> & fieldOrder)
const = 0;
189 virtual void getElementBlockIds(std::vector<std::string> & elementBlockIds)
const = 0;
193 virtual bool fieldInBlock(
const std::string &
field,
const std::string & block)
const = 0;
202 virtual const std::vector<int> &
getGIDFieldOffsets(
const std::string & blockId,
int fieldNum)
const = 0;
216 virtual const std::pair<std::vector<int>,std::vector<int> > &
218 int subcellDim,
int subcellId)
const = 0;
225 virtual void getElementOrientation(LocalOrdinalT localElmtId,std::vector<double> & gidsOrientation)
const = 0;
234 virtual const std::vector<LocalOrdinalT> &
getElementBlock(
const std::string & blockId)
const = 0;
239 virtual void getElementGIDs(LocalOrdinalT localElmtId,std::vector<GlobalOrdinalT> & gids,
const std::string & blockIdHint=
"")
const = 0;
243 virtual void getOwnedIndices(std::vector<GlobalOrdinalT> & indices)
const = 0;
251 virtual void ownedIndices(
const std::vector<GlobalOrdinalT> & indices,std::vector<bool> & isOwned)
const = 0;
256 const std::vector<LocalOrdinalT> &
getElementLIDs(LocalOrdinalT localElmtId)
const 263 Kokkos::View<LocalOrdinalT**,PHX::Device>
lids)
const 265 CopyCellLIDsFunctor functor;
266 functor.cellIds = cellIds;
268 functor.local_lids =
lids;
270 Kokkos::parallel_for(cellIds.dimension_0(),functor);
289 virtual Teuchos::RCP<const ConnManagerBase<LocalOrdinalT> >
getConnManagerBase()
const = 0;
299 KOKKOS_INLINE_FUNCTION
302 for(
int i=0;i<Teuchos::as<int>(
local_lids.dimension_1());i++)
320 std::vector<std::vector<LocalOrdinalT> > localIDs;
339 for(std::size_t i=0;i<localIDs.size();i++)
340 max = localIDs[i].size() > max ? localIDs[i].size() : max;
343 Kokkos::View<LocalOrdinalT**,PHX::Device> localIDs_k
344 = Kokkos::View<LocalOrdinalT**,PHX::Device>(
"ugi:localIDs_",localIDs.size(),max);
345 for(std::size_t i=0;i<localIDs.size();i++) {
346 for(std::size_t j=0;j<localIDs[i].size();j++)
347 localIDs_k(i,j) = localIDs[i][j];
374 template <
typename LocalOrdinalT,
typename GlobalOrdinalT>
377 template <
typename LocalOrdinalT,
typename GlobalOrdinalT>
381 std::vector<GlobalOrdinalT> ownedAndGhosted;
382 this->getOwnedAndGhostedIndices(ownedAndGhosted);
385 std::unordered_map<GlobalOrdinalT,LocalOrdinalT> hashMap;
386 for(std::size_t i=0;i<ownedAndGhosted.size();i++)
387 hashMap[ownedAndGhosted[i]] = i;
389 std::vector<std::string> elementBlocks;
390 this->getElementBlockIds(elementBlocks);
393 std::size_t numElmts = 0;
394 for(std::size_t eb=0;eb<elementBlocks.size();eb++)
395 numElmts += this->getElementBlock(elementBlocks[eb]).size();
396 localIDs.resize(numElmts);
399 for(std::size_t eb=0;eb<elementBlocks.size();eb++) {
400 std::vector<GlobalOrdinalT> gids;
401 const std::vector<LocalOrdinalT> & elmts = this->getElementBlock(elementBlocks[eb]);
403 for(std::size_t e=0;e<elmts.size();e++) {
404 this->getElementGIDs(elmts[e],gids,elementBlocks[eb]);
405 std::vector<LocalOrdinalT> &
lids = localIDs[elmts[e]];
406 lids.resize(gids.size());
408 for(std::size_t g=0;g<gids.size();g++)
409 lids[g] = hashMap[gids[g]];
virtual int getNumFields() const =0
virtual const std::vector< int > & getGIDFieldOffsets(const std::string &blockId, int fieldNum) const =0
Use the field pattern so that you can find a particular field in the GIDs array.
virtual bool fieldInBlock(const std::string &field, const std::string &block) const =0
virtual void getElementGIDs(LocalOrdinalT localElmtId, std::vector< GlobalOrdinalT > &gids, const std::string &blockIdHint="") const =0
Get the global IDs for a particular element. This function overwrites the gids variable.
PHX::Device execution_space
virtual int getElementBlockGIDCount(const std::string &blockId) const =0
How any GIDs are associate with a particular element block.
virtual int getNumFields() const =0
virtual void getOwnedAndGhostedIndices(std::vector< GlobalOrdinalT > &indices) const =0
virtual void getElementBlockIds(std::vector< std::string > &elementBlockIds) const =0
virtual ~UniqueGlobalIndexer()=0
Pure virtual destructor: prevents warnings with inline empty implementation.
Kokkos::View< LocalOrdinalT **, PHX::Device > local_lids
Kokkos::View< const LocalOrdinalT **, PHX::Device > global_lids
void setLocalIds(const std::vector< std::vector< LocalOrdinalT > > &localIDs)
virtual ~UniqueGlobalIndexerBase()=0
Pure virtual destructor: prevents warnings with inline empty implementation.
virtual const std::pair< std::vector< int >, std::vector< int > > & getGIDFieldOffsets_closure(const std::string &blockId, int fieldNum, int subcellDim, int subcellId) const =0
Use the field pattern so that you can find a particular field in the GIDs array. This version lets yo...
KOKKOS_INLINE_FUNCTION void operator()(const int cell) const
virtual Teuchos::RCP< Teuchos::Comm< int > > getComm() const =0
void buildLocalIdsFromOwnedElements(std::vector< std::vector< LocalOrdinalT > > &localIDs) const
virtual void getElementOrientation(LocalOrdinalT localElmtId, std::vector< double > &gidsOrientation) const =0
Get a vector containg the orientation of the GIDs relative to the neighbors.
virtual const std::vector< int > & getGIDFieldOffsets(const std::string &blockId, int fieldNum) const =0
Use the field pattern so that you can find a particular field in the GIDs array.
virtual void getFieldOrder(std::vector< std::string > &fieldOrder) const =0
PHX::MDField< ScalarT > vector
virtual Teuchos::RCP< Teuchos::Comm< int > > getComm() const =0
Kokkos::View< const LO **, PHX::Device > lids
virtual bool fieldInBlock(const std::string &field, const std::string &block) const =0
Kokkos::View< const int *, PHX::Device > cellIds
const std::vector< LocalOrdinalT > & getElementLIDs(LocalOrdinalT localElmtId) const
virtual Teuchos::RCP< const ConnManagerBase< LocalOrdinalT > > getConnManagerBase() const =0
Returns the connection manager currently being used.
Kokkos::View< const LocalOrdinalT **, PHX::Device > localIDs_k_
virtual const std::pair< std::vector< int >, std::vector< int > > & getGIDFieldOffsets_closure(const std::string &blockId, int fieldNum, int subcellDim, int subcellId) const =0
Use the field pattern so that you can find a particular field in the GIDs array. This version lets yo...
virtual void getElementBlockIds(std::vector< std::string > &elementBlockIds) const =0
virtual const std::vector< int > & getBlockFieldNumbers(const std::string &blockId) const =0
PHX::MDField< const ScalarT, Cell, IP > field
virtual int getElementBlockGIDCount(const std::string &blockId) const =0
How many GIDs are associate with a particular element block.
void shareLocalIDs(const UniqueGlobalIndexer< LocalOrdinalT, GlobalOrdinalT > &src)
virtual const std::string & getFieldString(int num) const =0
Reverse lookup of the field string from a field number.
virtual int getFieldNum(const std::string &str) const =0
Get the number used for access to this field.
void getElementLIDs(Kokkos::View< const int *, PHX::Device > cellIds, Kokkos::View< LocalOrdinalT **, PHX::Device > lids) const
virtual void ownedIndices(const std::vector< GlobalOrdinalT > &indices, std::vector< bool > &isOwned) const =0
std::vector< std::vector< LocalOrdinalT > > localIDs_
virtual const std::vector< int > & getBlockFieldNumbers(const std::string &blockId) const =0
virtual void getFieldOrder(std::vector< std::string > &fieldOrder) const =0
virtual const std::vector< LocalOrdinalT > & getElementBlock(const std::string &blockId) const =0
virtual int getFieldNum(const std::string &str) const =0
Get the number used for access to this field.
virtual void getOwnedIndices(std::vector< GlobalOrdinalT > &indices) const =0