80 int id()
const {
return _id; }
81 int size()
const {
return _size; }
83 int getNumberOfStoredReferences()
const {
return _nextReferenceId; }
84 const GmpMmBIReference<T>& getReference(
int index)
const { assert(index >= 0 && index < _nextReferenceId);
return _referenceList.at(index); }
86 bool isEmpty()
const {
return _nextReferenceId == 0; }
87 bool isFull()
const {
return _nextReferenceId == _size; }
88 bool isShared()
const {
return _gridIdList.size() > 1; }
91 void detachToAllGridCells() { _gridIdList.clear(); }
92 bool detachToCellGrid(
int gridCellId) {
return _gridIdList.removeOne(gridCellId); }
93 void attachToCellGrid(
int gridCellId) { _gridIdList.append(gridCellId); }
100 int _nextReferenceId;
164 const GmLogCategory& logger,
const QVariantMap& options = QVariantMap());
166 virtual const char* pluginName()
const {
return "MmProcess"; }
168 void init(
const QVariantMap& options);
169 virtual bool loadPrivateData(
LuaTable& table);
173 virtual bool activeOnly()
const {
return _activeOnly; }
174 virtual int ruleSet()
const {
return _ruleSet; }
176 virtual bool isOutsideOfDomain(
const GmVector& crd)
const;
179 bool getClosestReference(
const GmVector& crd,
GmpRefDist<T>& closestRef,
const PointValidator& pv = defaultPointValidator)
const;
180 void getClosestReferences(
const GmVector& crd,
int n,
QVector<
GmpRefDist<T> >& refList,
bool sort,
const PointValidator& pv = defaultPointValidator)
const;
181 void getClosestReferences(
const GmVector& crd,
double radius,
QVector<
GmpRefDist<T> >& refList,
bool sort,
const PointValidator& pv = defaultPointValidator)
const;
187 virtual bool testUniqueness()
const;
193 bool meshHasChanged()
const {
return false; }
195 void insertValue(
const T& val,
int gridId);
196 bool getGridCrd(
const GmVector& crd,
int gridCrd[GMP_MAX_INDEX_DIM])
const;
197 int getGridId(
const GmVector& crd)
const;
198 int getBucketId(
int gridId)
const;
199 void getBoxBucketIds(
const int minGrid[GMP_MAX_INDEX_DIM],
const int maxGrid[GMP_MAX_INDEX_DIM], ISet& bucketIds)
const;
200 void getBoxBucketIds1D(
int x0,
int x1, ISet& buecketIds)
const;
201 void getBoxBucketIds2D(
int x0,
int x1,
int y0,
int y1, ISet& bucketIds)
const;
202 void getBoxBucketIds3D(
int x0,
int x1,
int y0,
int y1,
int z0,
int z1, ISet& bucketIds)
const;
205 void processRadiusLayerBucketIds(
const GmVector& crd,
double radius, std::function<
void(
int[])>& proc,
206 int curMin[GMP_MAX_INDEX_DIM],
int curMax[GMP_MAX_INDEX_DIM])
const;
208 void processLayerBuckets1D(
const int curMin[GMP_MAX_INDEX_DIM],
const int curMax[GMP_MAX_INDEX_DIM],
209 const int newMin[GMP_MAX_INDEX_DIM],
const int newMax[GMP_MAX_INDEX_DIM], std::function<
void(
int[])>& proc)
const;
210 void processLayerBuckets2D(
const int curMin[GMP_MAX_INDEX_DIM],
const int curMax[GMP_MAX_INDEX_DIM],
211 const int newMin[GMP_MAX_INDEX_DIM],
const int newMax[GMP_MAX_INDEX_DIM], std::function<
void(
int[])>& proc)
const;
212 void processLayerBuckets3D(
const int curMin[GMP_MAX_INDEX_DIM],
const int curMax[GMP_MAX_INDEX_DIM],
213 const int newMin[GMP_MAX_INDEX_DIM],
const int newMax[GMP_MAX_INDEX_DIM], std::function<
void(
int[])>& proc)
const;
215 void getLayerBucketIds(
const int gridCrd[GMP_MAX_INDEX_DIM],
int layer, ISet& bucketIds,
216 int min[GMP_MAX_INDEX_DIM],
int max[GMP_MAX_INDEX_DIM],
217 const int minBound[GMP_MAX_INDEX_DIM],
const int maxBound[GMP_MAX_INDEX_DIM])
const;
221 bool _maxRefineReached;
224 double _step[GMP_MAX_INDEX_DIM];
231 void computeInitGridSize(
const GmVector& bboxSize,
int* initialSize,
int* finalSize);
233 virtual void insertValues() = 0;
235 int computeGridSize(
int dim)
const;
236 int getGridSize(
int dim)
const;
238 double getGridLength(
int dim)
const;
239 double getCellLength(
int dim)
const;
241 bool getGridDimCrd(
int dim,
double dimCrd,
int& gridDimCrd)
const;
243 int getMaxCellLengthDim()
const;
244 int getMinCellLengthDim()
const;
249 void recBoxBucketIds(
const int minGrid[GMP_MAX_INDEX_DIM],
const int maxGrid[GMP_MAX_INDEX_DIM],
250 int gridCrd[GMP_MAX_INDEX_DIM],
int dim, ISet& bucketIds)
const;
251 void recLayerBucketIds(
const int minGrid[GMP_MAX_INDEX_DIM],
const int maxGrid[GMP_MAX_INDEX_DIM],
252 const int minBound[GMP_MAX_INDEX_DIM],
const int maxBound[GMP_MAX_INDEX_DIM],
253 int gridCrd[GMP_MAX_INDEX_DIM],
int dim, ISet& bucketIds)
const;
255 int gridLinearizeCrd(
const int gridCrd[GMP_MAX_INDEX_DIM])
const;
256 int gridLinearizeCrd(
const int gridCrd[GMP_MAX_INDEX_DIM],
const int gridSizes[GMP_MAX_INDEX_DIM])
const;
257 void gridExtractId(
int gridId,
const int gridSizes[GMP_MAX_INDEX_DIM],
int crd[GMP_MAX_INDEX_DIM])
const;
260 bool redistributeBucket(
int fullBucketId);
261 int createBucket(
int gridId);
267 int _gridStartingSize;
272 int _nSplit[GMP_MAX_INDEX_DIM];
273 int _gridSize[GMP_MAX_INDEX_DIM];
274 double _min[GMP_MAX_INDEX_DIM];
275 double _max[GMP_MAX_INDEX_DIM];
287 const QVariantMap& options = QVariantMap());
291 virtual const char* pluginType()
const {
return "node"; }
292 virtual bool hasCapability(
QString capabilityName)
const {
return capabilityName ==
"nearestNode"; }
294 virtual bool getClosestNode(
const GmVector& crd,
double& sqrDist,
int& outNodeId,
const PointValidator& pv = defaultPointValidator)
const;
295 virtual void getClosestNodes(
const GmVector& crd,
int n,
QVector<int>& nodeList,
bool ordered,
const PointValidator& pv = defaultPointValidator)
const;
296 virtual void getClosestNodes(
const GmVector& crd,
int n,
QVector<
GmpRefDist<int>>& nodeList,
bool ordered,
const PointValidator& pv = defaultPointValidator)
const;
297 virtual void getClosestNodes(
const GmVector& crd,
double r,
QVector<int>& nodeList,
bool ordered,
const PointValidator& pv = defaultPointValidator)
const;
298 virtual void getClosestNodes(
const GmVector& crd,
double r,
QVector<
GmpRefDist<int>>& nodeList,
bool ordered,
const PointValidator& pv = defaultPointValidator)
const;
305 gmWarnMsg(logger(),
QObject::tr(
"getContainingCell() method is not supported for this bucket type."));
309 virtual bool getClosestGaussPoint(
const GmVector& crd,
double& sqrDist,
GmpMmGaussData& outRef,
const PointValidator& pv = defaultPointValidator)
const
311 Q_UNUSED(crd); Q_UNUSED(sqrDist); Q_UNUSED(outRef); Q_UNUSED(pv);
312 gmWarnMsg(logger(),
QObject::tr(
"getClosestGaussPoints() method is not supported by '%1' bucket type.").arg(bucketTypeToStr(_type)));
316 virtual void getClosestGaussPoints(
const GmVector& crd,
int n,
QVector<GmpMmGaussData>& gpList,
bool ordered,
const PointValidator& pv = defaultPointValidator)
const
318 Q_UNUSED(crd); Q_UNUSED(n); Q_UNUSED(gpList); Q_UNUSED(ordered); Q_UNUSED(pv);
319 gmWarnMsg(logger(),
QObject::tr(
"getClosestGaussPoints() method is not supported by '%1' bucket type.").arg(bucketTypeToStr(_type)));
324 Q_UNUSED(crd); Q_UNUSED(n); Q_UNUSED(gpList); Q_UNUSED(ordered); Q_UNUSED(pv);
325 gmWarnMsg(logger(),
QObject::tr(
"getClosestGaussPoints() method is not supported by '%1' bucket type.").arg(bucketTypeToStr(_type)));
328 virtual void getClosestGaussPoints(
const GmVector& crd,
double r,
QVector<GmpMmGaussData>& gpList,
bool ordered,
const PointValidator& pv = defaultPointValidator)
const
330 Q_UNUSED(crd); Q_UNUSED(r); Q_UNUSED(gpList); Q_UNUSED(ordered); Q_UNUSED(pv);
331 gmWarnMsg(logger(),
QObject::tr(
"getClosestGaussPoints() method is not supported by '%1' bucket type.").arg(bucketTypeToStr(_type)));
335 Q_UNUSED(crd); Q_UNUSED(r); Q_UNUSED(gpList); Q_UNUSED(ordered); Q_UNUSED(pv);
336 gmWarnMsg(logger(),
QObject::tr(
"getClosestGaussPoints() method is not supported by '%1' bucket type.").arg(bucketTypeToStr(_type)));
340 virtual bool testReciprocity()
const;
341 bool testClosestNode()
const;
346 virtual void insertValues();
358 const QVariantMap& options = QVariantMap());
362 virtual const char* pluginType()
const {
return "cell"; }
363 virtual bool hasCapability(
QString capabilityName)
const {
return capabilityName ==
"containingCell"; }
365 virtual bool getClosestNode(
const GmVector& crd,
double& sqrDist,
int& outNodeId,
const PointValidator& pv = defaultPointValidator)
const;
368 virtual void getClosestNodes(
const GmVector& crd,
int n,
QVector<int>& nodeList,
bool ordered,
const PointValidator& pv = defaultPointValidator)
const
370 Q_UNUSED(crd); Q_UNUSED(n); Q_UNUSED(nodeList); Q_UNUSED(ordered); Q_UNUSED(pv);
371 gmWarnMsg(logger(),
QObject::tr(
"getClosestNodes() method is not supported by '%1' bucket type.").arg(bucketTypeToStr(_type)));
374 virtual void getClosestNodes(
const GmVector& crd,
int n,
QVector<
GmpRefDist<int>>& nodeList,
bool ordered,
const PointValidator& pv = defaultPointValidator)
const
376 Q_UNUSED(crd); Q_UNUSED(n); Q_UNUSED(nodeList); Q_UNUSED(ordered); Q_UNUSED(pv);
377 gmWarnMsg(logger(),
QObject::tr(
"getClosestNodes() method is not supported by '%1' bucket type.").arg(bucketTypeToStr(_type)));
380 virtual void getClosestNodes(
const GmVector& crd,
double r,
QVector<int>& nodeList,
bool ordered,
const PointValidator& pv = defaultPointValidator)
const
382 Q_UNUSED(crd); Q_UNUSED(r); Q_UNUSED(nodeList); Q_UNUSED(ordered); Q_UNUSED(pv);
383 gmWarnMsg(logger(),
QObject::tr(
"getClosestNodes() method is not supported by '%1' bucket type.").arg(bucketTypeToStr(_type)));
385 virtual void getClosestNodes(
const GmVector& crd,
double r,
QVector<
GmpRefDist<int>>& nodeList,
bool ordered,
const PointValidator& pv = defaultPointValidator)
const
387 Q_UNUSED(crd); Q_UNUSED(r); Q_UNUSED(nodeList); Q_UNUSED(ordered); Q_UNUSED(pv);
388 gmWarnMsg(logger(),
QObject::tr(
"getClosestNodes() method is not supported by '%1' bucket type.").arg(bucketTypeToStr(_type)));
394 virtual bool getClosestGaussPoint(
const GmVector& crd,
double& sqrDist,
GmpMmGaussData& outRef,
const PointValidator& pv = defaultPointValidator)
const
396 Q_UNUSED(crd); Q_UNUSED(sqrDist); Q_UNUSED(outRef); Q_UNUSED(pv);
397 gmWarnMsg(logger(),
QObject::tr(
"getClosestGaussPoints() method is not supported by '%1' bucket type.").arg(bucketTypeToStr(_type)));
401 virtual void getClosestGaussPoints(
const GmVector& crd,
int n,
QVector<GmpMmGaussData>& gpList,
bool ordered,
const PointValidator& pv = defaultPointValidator)
const
403 Q_UNUSED(crd); Q_UNUSED(n); Q_UNUSED(gpList); Q_UNUSED(ordered); Q_UNUSED(pv);
404 gmWarnMsg(logger(),
QObject::tr(
"getClosestGaussPoints() method is not supported by '%1' bucket type.").arg(bucketTypeToStr(_type)));
409 Q_UNUSED(crd); Q_UNUSED(n); Q_UNUSED(gpList); Q_UNUSED(ordered); Q_UNUSED(pv);
410 gmWarnMsg(logger(),
QObject::tr(
"getClosestGaussPoints() method is not supported by '%1' bucket type.").arg(bucketTypeToStr(_type)));
413 virtual void getClosestGaussPoints(
const GmVector& crd,
double r,
QVector<GmpMmGaussData>& gpList,
bool ordered,
const PointValidator& pv = defaultPointValidator)
const
415 Q_UNUSED(crd); Q_UNUSED(r); Q_UNUSED(gpList); Q_UNUSED(ordered); Q_UNUSED(pv);
416 gmWarnMsg(logger(),
QObject::tr(
"getClosestGaussPoints() method is not supported by '%1' bucket type.").arg(bucketTypeToStr(_type)));
420 Q_UNUSED(crd); Q_UNUSED(r); Q_UNUSED(gpList); Q_UNUSED(ordered); Q_UNUSED(pv);
421 gmWarnMsg(logger(),
QObject::tr(
"getClosestGaussPoints() method is not supported by '%1' bucket type.").arg(bucketTypeToStr(_type)));
425 virtual bool testReciprocity()
const;
426 bool testContainingCell()
const;
433 virtual void insertValues();
435 void setContainsFunction();
437 std::function<bool(
const GmCell* c,
const GmVector&)> _containsFunc;
454 const QVariantMap& options = QVariantMap());
458 virtual const char* pluginType()
const {
return "gauss"; }
459 virtual bool hasCapability(
QString capabilityName)
const {
return capabilityName ==
"nearestGauss"; }
462 virtual bool getClosestNode(
const GmVector& crd,
double& sqrDist,
int& outNodeId,
const PointValidator& pv = defaultPointValidator)
const
464 Q_UNUSED(crd); Q_UNUSED(sqrDist); Q_UNUSED(outNodeId); Q_UNUSED(pv);
465 gmWarnMsg(logger(),
QObject::tr(
"getClosestNode() method is not supported by '%1' bucket type.").arg(bucketTypeToStr(_type)));
469 virtual void getClosestNodes(
const GmVector& crd,
int n,
QVector<int>& nodeList,
bool ordered,
const PointValidator& pv = defaultPointValidator)
const
471 Q_UNUSED(crd); Q_UNUSED(n); Q_UNUSED(nodeList); Q_UNUSED(ordered); Q_UNUSED(pv);
472 gmWarnMsg(logger(),
QObject::tr(
"getClosestNodes() method is not supported by '%1' bucket type.").arg(bucketTypeToStr(_type)));
475 virtual void getClosestNodes(
const GmVector& crd,
int n,
QVector<
GmpRefDist<int>>& nodeList,
bool ordered,
const PointValidator& pv = defaultPointValidator)
const
477 Q_UNUSED(crd); Q_UNUSED(n); Q_UNUSED(nodeList); Q_UNUSED(ordered); Q_UNUSED(pv);
478 gmWarnMsg(logger(),
QObject::tr(
"getClosestNodes() method is not supported by '%1' bucket type.").arg(bucketTypeToStr(_type)));
481 virtual void getClosestNodes(
const GmVector& crd,
double r,
QVector<int>& nodeList,
bool ordered,
const PointValidator& pv = defaultPointValidator)
const
483 Q_UNUSED(crd); Q_UNUSED(r); Q_UNUSED(nodeList); Q_UNUSED(ordered); Q_UNUSED(pv);
484 gmWarnMsg(logger(),
QObject::tr(
"getClosestNodes() method is not supported by '%1' bucket type.").arg(bucketTypeToStr(_type)));
487 virtual void getClosestNodes(
const GmVector& crd,
double r,
QVector<
GmpRefDist<int>>& nodeList,
bool ordered,
const PointValidator& pv = defaultPointValidator)
const
489 Q_UNUSED(crd); Q_UNUSED(r); Q_UNUSED(nodeList); Q_UNUSED(ordered); Q_UNUSED(pv);
490 gmWarnMsg(logger(),
QObject::tr(
"getClosestNodes() method is not supported by '%1' bucket type.").arg(bucketTypeToStr(_type)));
496 gmWarnMsg(logger(),
QObject::tr(
"getContainingCell() method is not supported for this bucket type."));
500 virtual bool getClosestGaussPoint(
const GmVector& crd,
double& sqrDist,
GmpMmGaussData& outRef,
const PointValidator& pv = defaultPointValidator)
const;
501 virtual void getClosestGaussPoints(
const GmVector& crd,
int n,
QVector<GmpMmGaussData>& gpList,
bool ordered,
const PointValidator& pv = defaultPointValidator)
const;
503 virtual void getClosestGaussPoints(
const GmVector& crd,
double r,
QVector<GmpMmGaussData>& gpList,
bool ordered,
const PointValidator& pv = defaultPointValidator)
const;
507 virtual bool testReciprocity()
const;
512 virtual void insertValues();