9 #ifndef _fei_Lookup_Impl_hpp_
10 #define _fei_Lookup_Impl_hpp_
12 #include <fei_macros.hpp>
13 #include <fei_MatrixGraph.hpp>
14 #include <fei_Pattern.hpp>
15 #include <fei_ConnectivityBlock.hpp>
16 #include <fei_SharedIDs.hpp>
17 #include <snl_fei_RecordCollection.hpp>
18 #include <snl_fei_PointBlockMap.hpp>
19 #include <fei_TemplateUtils.hpp>
20 #include <fei_Lookup.hpp>
52 if (len < 1)
return(NULL);
55 return(&fieldIDs_[0]);
62 if (fieldIDs == NULL)
return(NULL);
64 unsigned numFields = fieldIDs_.size();
65 fieldSizes_.resize(numFields);
66 int* fsPtr = &fieldSizes_[0];
67 for(
unsigned i=0; i<numFields; ++i) {
81 return(err==0 ? &elemBlockIDs_[0] : NULL);
86 int& interleaveStrategy,
int& lumpingStrategy,
87 int& numElemDOF,
int& numElements,
88 int& numNodesPerElem,
int& numEqnsPerElem)
90 interleaveStrategy = 0; lumpingStrategy = 0;
103 if (cblock==NULL)
return(NULL);
111 if (cblock==NULL)
return(NULL);
115 fieldIDs_2D_.resize(numNodes);
116 const int** f2dPtr = &fieldIDs_2D_[0];
118 for(
int i=0; i<numNodes; ++i) {
119 f2dPtr[i] = fieldIDs + offset;
120 offset += numFieldsPerNode[i];
131 int getAssociatedNodeID(
int eqnNumber);
142 std::vector<int>* subdomains = NULL;
143 std::map<int,std::vector<int>* >::iterator
144 nns_iter = nodenumSubdomainDB_.find(nodeNumber);
145 if (nns_iter != nodenumSubdomainDB_.end()) subdomains = (*nns_iter).second;
146 return( subdomains==0 ? 0 : subdomains->size() );
152 std::vector<int>* subdomains = NULL;
153 std::map<int,std::vector<int>* >::iterator
154 nns_iter = nodenumSubdomainDB_.find(nodeNumber);
155 if (nns_iter != nodenumSubdomainDB_.end()) subdomains = (*nns_iter).second;
157 return( subdomains==0 ? NULL : &(*subdomains)[0] );
165 return(err==0 ? numShared : -1);
174 workspace_.resize(numShared*2);
175 int* wkPtr = &workspace_[0];
181 for(
int i=0; i<numShared; ++i) {
183 if (node == NULL)
return NULL;
187 return(wkPtr+numShared);
193 std::map<int,fei::Record<int>*>::iterator
194 nnp_iter = nodenumPairs_.find(nodeNumber);
196 if (nnp_iter == nodenumPairs_.end())
return(0);
202 int shID = node->
getID();
206 if (iter == sharedIDs.
getSharedIDs().end())
return(NULL);
208 const std::set<int>& shprocs = iter->second;
211 return(&workspace_[0]);
217 std::map<int,fei::Record<int>*>::iterator
218 nnp_iter = nodenumPairs_.find(nodeNumber);
220 if (nnp_iter == nodenumPairs_.end())
return(0);
226 int shID = node->
getID();
232 const std::set<int>& shprocs = iter->second;
233 return(shprocs.size());
254 int buildDatabases();
261 std::map<int, fei::Record<int>*> nodenumPairs_;
262 std::map<int,fei::Record<int>*> eqnnumPairs_;
264 std::map<int,std::vector<int>*> nodenumSubdomainDB_;
266 bool databasesBuilt_;
268 std::vector<int> fieldIDs_;
269 std::vector<int> fieldSizes_;
270 std::vector<GlobalID> elemBlockIDs_;
271 std::vector<const int*> fieldIDs_2D_;
272 std::vector<int> workspace_;
276 #endif // _fei_Lookup_Impl_hpp_