void fillFieldContainer(int fieldNum,const std::string & blockId, const panzer::UniqueGlobalIndexer<short,int> & ugi, Intrepid::FieldContainer<int> & data) { data.resize(1,4); const std::vector<short> & elements = ugi.getElementBlock(blockId); const std::vector<int> & fieldOffsets = ugi.getGIDFieldOffsets(blockId,fieldNum); std::vector<int> gids; for(std::size_t e=0;e<elements.size();e++) { ugi.getElementGIDs(elements[e],gids); for(std::size_t f=0;f<fieldOffsets.size();f++) data(e,f) = gids[fieldOffsets[f]]; } }
void gather_in_block(const std::string & blockId, const panzer::UniqueGlobalIndexer<int,GlobalOrdinal> & dofMngr, const Epetra_Vector & x,const std::vector<std::size_t> & localCellIds, std::map<std::string,Kokkos::DynRankView<double,PHX::Device> > & fc) { const std::vector<int> & fieldNums = dofMngr.getBlockFieldNumbers(blockId); for(std::size_t fieldIndex=0;fieldIndex<fieldNums.size();fieldIndex++) { int fieldNum = fieldNums[fieldIndex]; std::string fieldStr = dofMngr.getFieldString(fieldNum); // grab the field const std::vector<int> & elmtOffset = dofMngr.getGIDFieldOffsets(blockId,fieldNum); fc[fieldStr] = Kokkos::DynRankView<double,PHX::Device>("fc",localCellIds.size(),elmtOffset.size()); // gather operation for each cell in workset for(std::size_t worksetCellIndex=0;worksetCellIndex<localCellIds.size();++worksetCellIndex) { std::vector<GlobalOrdinal> GIDs; std::vector<int> LIDs; std::size_t cellLocalId = localCellIds[worksetCellIndex]; dofMngr.getElementGIDs(cellLocalId,GIDs); // caculate the local IDs for this element LIDs.resize(GIDs.size()); for(std::size_t i=0;i<GIDs.size();i++) LIDs[i] = x.Map().LID(GIDs[i]); // loop over basis functions and fill the fields for(std::size_t basis=0;basis<elmtOffset.size();basis++) { int offset = elmtOffset[basis]; int lid = LIDs[offset]; fc[fieldStr](worksetCellIndex,basis) = x[lid]; } } } }