73 if(geomAggPattern==Teuchos::null) {
74 std::vector<FPPtr> patternVec;
77 std::vector<std::pair<int,FPPtr> >::const_iterator itr;
78 for(itr=patterns.begin();itr!=patterns.end();++itr)
79 patternVec.push_back(itr->second);
98 "Geometric field pattern not yet set, call buildPatterns first");
100 return geomPattern->getDimension();
107 "Geometric field pattern not yet set, call buildPatterns first");
109 return geomPattern->getCellTopology();
125 "FieldAggPattern::getSubcellClosureIndices should not be called");
132 os <<
"FieldPattern: FieldAggPattern" << std::endl;
133 os <<
"FieldPattern: |numFields| = " <<
numFields_.size() << std::endl;
134 os <<
"FieldPattern: numFields = [ ";
136 for(std::size_t i=0;i<
numFields_.size();i++) {
140 os <<
"]" << std::endl;
141 os <<
"FieldPattern: |fieldIds| = " <<
fieldIds_.size() <<
" (" << total <<
")" << std::endl;
142 os <<
"FieldPattern: fieldIds = [ ";
143 for(std::size_t i=0;i<
fieldIds_.size();i++)
145 os <<
"]" << std::endl;
146 os <<
"FieldPattern: local offsets\n";
148 std::map<int,int>::const_iterator itr;
150 int fieldId = itr->first;
152 os <<
"FieldPattern: field " << itr->first <<
" = [ ";
153 for(std::size_t i=0;i<
offsets.size();i++)
155 os <<
"]" << std::endl;
163 "FieldID = " << fieldId <<
" not defined in this pattern");
165 return patterns_[idxIter->second].second;
172 std::vector<std::pair<int,FPPtr> >::const_iterator itr;
183 numFields_.resize(geomAggPattern->numberIds());
188 int numSubcell = geomAggPattern->getSubcellCount(dim);
189 for(
int sc=0;sc<numSubcell;sc++) {
206 if (geomIndices.size() > 0) {
207 const int geomIndex = geomIndices[0];
211 std::vector<std::pair<int,FPPtr> >::const_iterator itr;
213 std::size_t fieldSize = itr->second->getSubcellIndices(dim,subcell).size();
216 for (std::size_t i=0;i<fieldSize;++i)
234 int numSubcell = geomIdsPattern->getSubcellCount(d);
238 for(
int sc=0;sc<numSubcell;sc++) {
241 const std::vector<int> & geomIds = geomIdsPattern->getSubcellIndices(d,sc);
243 if (geomIds.size() > 0) {
244 const int geomId = geomIds[0];
256 std::map<int,std::vector<int> >::const_iterator itr =
fieldOffsets_.find(fieldId);
267 if(a[0] < b[0])
return true;
268 if(a[0] > b[0])
return false;
271 if(a[1] < b[1])
return true;
272 if(a[1] > b[1])
return false;
275 if(a[2] < b[2])
return true;
276 if(a[2] > b[2])
return false;
283 const std::pair<std::vector<int>,std::vector<int> > &
287 typedef std::map<Teuchos::Tuple<int,3>, std::pair<std::vector<int>,std::vector<int> >,
LessThan> OffsetMap;
291 OffsetMap::const_iterator itr
298 "FieldAggPattern::localOffsets_closure precondition subcellDim<getDimension() failed");
300 "FieldAggPattern::localOffsets_closure precondition subcellId>=0 failed");
302 "FieldAggPattern::localOffsets_closure precondition subcellId<getSubcellCount(subcellDim) failed");
308 const std::vector<int> & fieldOffsets =
localOffsets(fieldId);
311 std::vector<int> closureOffsets;
313 fieldPattern->getSubcellClosureIndices(subcellDim,subcellId,closureOffsets);
316 std::pair<std::vector<int>,std::vector<int> > & indicesPair
319 std::vector<int> & closureIndices = indicesPair.first;
320 for(std::size_t i=0;i<closureOffsets.size();i++)
321 closureIndices.push_back(fieldOffsets[closureOffsets[i]]);
323 std::vector<int> & basisIndices = indicesPair.second;
324 basisIndices.assign(closureOffsets.begin(),closureOffsets.end());
344 offsets.resize(fieldPattern->numberIds(),-111111);
349 std::vector<int> fieldIdsGeomOrder;
350 for(std::size_t i=0;i<
fieldIds_.size();++i) {
352 fieldIdsGeomOrder.push_back(i);
354 TEUCHOS_ASSERT((
int) fieldIdsGeomOrder.size()==fieldPattern->numberIds());
359 for(
int dim=0;dim<geomPattern.getDimension()+1;dim++) {
360 for(
int sc=0;sc<geomPattern.getSubcellCount(dim);sc++) {
361 const std::vector<int> & fIndices = fieldPattern->getSubcellIndices(dim,sc);
363 for(std::size_t i=0;i<fIndices.size();i++)
364 offsets[fIndices[i]] = fieldIdsGeomOrder[cnt++];
369 for(std::size_t i=0;i<
offsets.size();i++) {
void buildFieldPatternData()
void mergeFieldPatterns(int dim, int subcell)
std::map< int, std::vector< int > > fieldOffsets_
std::map< Teuchos::Tuple< int, 3 >, std::pair< std::vector< int >, std::vector< int > >, LessThan > fieldSubcellOffsets_closure_
std::vector< int > numFields_
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
std::map< int, int > fieldIdToPatternIdx_
std::vector< std::pair< int, Teuchos::RCP< const FieldPattern > > > patterns_
virtual const std::vector< int > & getSubcellIndices(int dimension, int subcell) const
std::vector< std::vector< std::vector< int > > > patternData_
virtual Teuchos::RCP< const FieldPattern > getFieldPattern(int fieldId) const
bool operator()(const Teuchos::Tuple< int, 3 > &a, const Teuchos::Tuple< int, 3 > &b) const
Teuchos::RCP< const FieldPattern > geomAggPattern_
PHX::MDField< ScalarT > vector
virtual void buildPattern(const std::vector< std::pair< int, Teuchos::RCP< const FieldPattern > > > &patterns, const Teuchos::RCP< const FieldPattern > &geomAggPattern=Teuchos::null)
void localOffsets_build(int fieldId, std::vector< int > &offsets) const
virtual int getDimension() const
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
void buildFieldIdToPatternIdx()
virtual Teuchos::RCP< const FieldPattern > getGeometricAggFieldPattern() const
virtual void print(std::ostream &os) const
virtual void print(std::ostream &os) const
Print this pattern.
const std::vector< int > & localOffsets(int fieldId) const
virtual void getSubcellClosureIndices(int, int, std::vector< int > &) const
void buildFieldIdsVector()
#define TEUCHOS_ASSERT(assertion_test)
virtual shards::CellTopology getCellTopology() const
virtual int getSubcellCount(int dimension) const
Kokkos::View< const int *, PHX::Device > offsets
std::vector< int > fieldIds_
const std::pair< std::vector< int >, std::vector< int > > & localOffsets_closure(int fieldId, int subcellDim, int subcellId) const