24#ifndef _GEMA_PLUGIN_GEMA_CR_H_
25#define _GEMA_PLUGIN_GEMA_CR_H_
97template <
class IntVector>
127template <
class IntVector>
172#define MAKE_SR_FUNCTION(mainFunctionName, classFunction, classValue) \
173 virtual int mainFunctionName##SR(int id) const \
175 if constexpr(Partition) \
178 return mainFunctionName(id); \
179 int localId = mainFunctionName##Impl(id); \
180 if(localId >= 0 && classFunction(localId) == classValue) \
185 return mainFunctionName(id); \
208template <
template <
class>
class Vector,
bool Partition>
215 :
GmPCR(simulation, id, description, logger), _mesh(NULL),
216 _coloringType(NO_COLORING), _nodeRenumberRequested(true), _cellRenumberRequested(true),
217 _isNodeRenumbered(false), _isCellRenumbered(false), _skipRemote(false), _noColorData(NULL), _colorMethod(NULL),
218 _nodeRenumberMethod(NULL), _cellRenumberMethod(NULL), _numGeomNodes(0), _numOriginalGeomNodes(0)
220 if constexpr(Partition)
222 _part._partitioned =
false;
223 _part._nodesRenumbered =
false;
224 _part._cellsRenumbered =
false;
231 virtual const char*
pluginName()
const {
return "GemaPCR"; }
234 virtual const char*
pluginType()
const {
if constexpr(std::is_same<Vector<int>,
GmSingleVector<int>>::value)
return "cr";
else return "crd"; }
241 virtual bool hasCapability(
QString capabilityName)
const {
return capabilityName ==
"femColoring" || capabilityName ==
"fvmColoring" || capabilityName ==
"renumbering"; }
244 virtual GmMesh*
mesh()
const {
return _mesh; }
251 virtual size_t usedMemory()
const {
return nodeRenumberMemory() + cellRenumberMemory() + colorMemory() + partitionMemory(); }
259 virtual int partition()
const {
return 0; }
260 virtual int numGlobalNodes()
const { assert(_mesh);
return _mesh->numNodes(); }
264 virtual CellClass
cellClass (
int cellId)
const { Q_UNUSED(cellId);
return MY_CELL; }
265 virtual int cellClassData (
int cellId)
const { Q_UNUSED(cellId);
return 0; }
266 virtual int numCellsInClass(CellClass cellClass)
const { Q_UNUSED(cellClass);
return 0; }
267 virtual NodeClass
nodeClass (
int nodeId)
const { Q_UNUSED(nodeId);
return MY_NODE; }
268 virtual int nodeClassData (
int nodeId)
const { Q_UNUSED(nodeId);
return 0; }
269 virtual int numNodesInClass(NodeClass nodeClass,
GmCellFillMode mode = GM_CELL_NODES)
const { Q_UNUSED(nodeClass); Q_UNUSED(mode);
return 0; }
270 virtual int numRemoteRanks (
int templateIndex)
const { Q_UNUSED(templateIndex);
return 0; }
271 virtual const int*
remoteRanks (
int templateIndex)
const { Q_UNUSED(templateIndex);
return NULL; }
272 virtual bool skipRemote ()
const {
return _skipRemote; }
283 virtual ColorType
coloringType()
const {
return _coloringType; }
318 virtual int originalToLocalOrderNode (
int originalNodeId)
const {
return _isNodeRenumbered ? originalToLocalOrderNodeImpl(originalNodeId) : originalNodeId; }
319 virtual int originalToLocalOrderGeomNode (
int originalNodeId)
const {
return _isNodeRenumbered ? originalToLocalOrderGeomNodeImpl(originalNodeId) : originalNodeId; }
320 virtual int originalToLocalOrderGhostNodeHighSet (
int originalNodeId)
const {
return _isNodeRenumbered ? originalToLocalOrderGhostNodeHighSetImpl(originalNodeId) : originalNodeId; }
323 virtual int localOrderToOriginalNode (
int nodeId)
const {
return _isNodeRenumbered ? localOrderToOriginalNodeImpl(nodeId) : nodeId; }
324 virtual int localOrderToOriginalGeomNode (
int nodeId)
const {
return _isNodeRenumbered ? localOrderToOriginalGeomNodeImpl(nodeId) : nodeId; }
328 virtual int originalToLocalOrderCell(
int originalCellId)
const {
return _isCellRenumbered ? originalToLocalOrderCellImpl(originalCellId) : originalCellId; }
329 virtual int localOrderToOriginalCell(
int cellId)
const {
return _isCellRenumbered ? localOrderToOriginalCellImpl(cellId) : cellId; }
332 MAKE_SR_FUNCTION(originalToLocalOrderNode, nodeClass, REMOTE_NODE);
333 MAKE_SR_FUNCTION(originalToLocalOrderGeomNode, nodeClass, REMOTE_NODE);
334 MAKE_SR_FUNCTION(originalToLocalOrderGhostNodeHighSet, nodeClass, REMOTE_NODE);
335 MAKE_SR_FUNCTION(originalToLocalOrderGhostNodeHighClear, nodeClass, REMOTE_NODE);
336 MAKE_SR_FUNCTION(originalToLocalOrderCell, cellClass, REMOTE_HALO_CELL);
344 virtual bool initPartitions(
int numPartitions,
int partition) { Q_UNUSED(numPartitions); Q_UNUSED(partition);
return false; }
354 virtual bool addNodes(
int numNodes);
356 virtual bool addCells(
int numCells);
358 virtual void clear();
360 virtual bool addStateGeometryData(
GmStateDump* state,
int groupId);
361 virtual bool fillDumpControlMapData(QVariantMap* map,
const GmLogCategory& logger);
362 virtual bool dumpControlMapDataLoaded(QVariantMap* map,
const GmLogCategory& logger);
369 using IntVectorOrMap = std::conditional_t<Partition, QMap<int, int>, Vector<int>>;
373 virtual size_t nodeRenumberMemory()
const;
374 virtual size_t cellRenumberMemory()
const;
375 virtual size_t colorMemory()
const;
376 virtual size_t partitionMemory()
const {
return 0; }
384 return addAttributeToMesh<GmValueAccessor, GM_NODE_ATTRIBUTE>(name, description, type);
390 return addAttributeToMesh<GmCellAccessor, GM_CELL_ATTRIBUTE>(name, description, type);
395 void renumberColoredGroupSets(
const QVector<int>& partLocToOrigOrder);
397 inline int originalToLocalOrderNodeImpl (
int originalNodeId)
const;
398 inline int originalToLocalOrderGeomNodeImpl (
int originalNodeId)
const;
399 inline int originalToLocalOrderGhostNodeHighSetImpl (
int originalNodeId)
const;
400 inline int originalToLocalOrderGhostNodeHighClearImpl(
int originalNodeId)
const;
401 inline int originalToLocalOrderCellImpl (
int originalCellId)
const;
403 inline int localOrderToOriginalNodeImpl (
int nodeId)
const;
404 inline int localOrderToOriginalGeomNodeImpl (
int nodeId)
const;
405 inline int localOrderToOriginalGhostNodeHighSetImpl (
int nodeId)
const;
406 inline int localOrderToOriginalGhostNodeHighClearImpl(
int nodeId)
const;
407 inline int localOrderToOriginalCellImpl (
int cellId)
const;
409 inline int originalNodeTraversalOrderImpl(
int i)
const;
410 inline int originalCellTraversalOrderImpl(
int i)
const;
415 void initReverseMapping(
const IntVector& localToOriginal, IntVectorOrMap& originalToLocal);
416 void initOrdering (
const IntVectorOrMap& originalToLocal, IntVector& orderVec);
418 bool addVectors (
size_t numAddedEntries, IntVector* localToOriginal, IntVectorOrMap* originalToLocal, IntVector* orderVec);
419 bool addAndInitVectors(
size_t numAddedEntries, IntVector* localToOriginal, IntVectorOrMap* originalToLocal, IntVector* orderVec,
420 int localToOriginalInit,
int originalToLocalInit,
int orderVecInit);
422 template <
class Ac, GmValueSetKind SetKind>
532 using PartitionT = std::conditional_t<Partition, PartitionTrue, PartitionFalse>;
virtual int numCells() const=0
virtual void printPartitionClassStatistics(const GmLogCategory &logger) const=0
virtual int originalToLocalOrderCell(int originalCellId) const=0
virtual int partition() const=0
virtual int nodeClassData(int nodeId) const=0
virtual bool addPartitionInfoAsMeshAttributes(QString cellAttrPrefix, QString nodeAttrPrefix)=0
virtual const int * remoteRanks(int templateIndex) const=0
virtual int originalToLocalOrderNode(int originalNodeId) const=0
virtual int originalNodeTraversalOrder(int i) const=0
virtual int numGlobalCells() const=0
virtual int numGlobalGhostNodes() const=0
virtual const QVector< GmCellGroupSet * > & coloredHaloSets(const GmCellGroupSet *gs)=0
virtual bool addNodes(int numNodes)=0
virtual QStringList cellMappingRequiredGroups()=0
virtual int localOrderToOriginalGeomNode(int nodeId) const=0
virtual bool setMesh(GmMesh *mesh)=0
virtual bool initCellMapping(bool *renumbered, QMap< int, int > &partOrigToLocOrder, QVector< int > &partLocToOrigOrder)=0
virtual bool cellsRenumbered() const=0
virtual ColorState coloringState(const GmCellGroupSet *gs)=0
virtual bool addCells(int numCells)=0
virtual const QVector< GmCellGroupSet * > & coloredSets(const GmCellGroupSet *gs)=0
virtual bool initPartitions(int numPartitions, int partition)=0
virtual void printPartitionRankTemplateData(const GmLogCategory &logger) const=0
virtual int originalToLocalOrderGhostNodeHighSet(int originalNodeId) const=0
virtual int originalToLocalOrderGhostNodeHighClear(int originalNodeId) const=0
virtual bool hasCapability(QString capabilityName) const=0
virtual const GmCellGroupSet * sequentialSet(const GmCellGroupSet *gs)=0
virtual bool skipRemote() const=0
virtual GmMesh * mesh() const=0
virtual int cellClassData(int cellId) const=0
virtual int originalToLocalOrderGeomNode(int originalNodeId) const=0
virtual CellClass cellClass(int cellId) const=0
virtual size_t printMemoryStatistics(const GmLogCategory &logger, GmLogLevel level) const=0
virtual int localOrderToOriginalGhostNodeHighClear(int nodeId) const=0
virtual bool nodesRenumbered() const=0
virtual void printColoringStatistics(const GmLogCategory &logger) const=0
virtual int numRemoteRanks(int templateIndex) const=0
virtual bool addDebugPartitionInfoAsMeshAttributes(QString cellAttrPrefix, QString nodeAttrPrefix)=0
virtual int originalCellTraversalOrder(int i) const=0
virtual int localOrderToOriginalNode(int nodeId) const=0
virtual const GmCellGroupSet * sequentialHaloSet(const GmCellGroupSet *gs)=0
virtual bool addGhostNodes(int numGhostNodes)=0
virtual ColorType coloringType() const=0
virtual int localOrderToOriginalCell(int cellId) const=0
virtual NodeClass nodeClass(int nodeId) const=0
virtual int numPartitions() const=0
virtual bool addColoringAsMeshAttribute(const GmCellGroupSet *gs, QString attrName)=0
virtual int numNodesInClass(NodeClass nodeClass, GmCellFillMode mode=GM_CELL_NODES) const=0
virtual int localOrderToOriginalGhostNodeHighSet(int nodeId) const=0
virtual int numGlobalNodes() const=0
virtual int numCellsInClass(CellClass cellClass) const=0
virtual bool initNodeMapping(GmValueAccessor *ac, bool ghost, bool *renumbered, QMap< int, int > &partOrigToLocOrder)=0
virtual void printParameters(const GmLogCategory &logger)
virtual const char * pluginType() const=0
virtual bool loadPrivateData(LuaTable &table)=0
virtual const char * pluginName() const=0
The abstract interface for a cell renumbering method implementation. Template parameter is the type f...
Definition gmpGemaCR.h:129
const QVariantMap & _options
The user provided options.
Definition gmpGemaCR.h:165
virtual bool checkOptions(const GmLogCategory &logger)=0
Virtual method responsible for validating the parameters supplied on the class constructor....
virtual bool renumber(GmPCR *pcr, IntVector &sortedToOriginal, const GmLogCategory &logger) const =0
The cell renumbering function. It gets as input parameter a pointer to the PCR object so that it can ...
virtual void printParameters(const GmLogCategory &logger) const =0
Virtual method responsible for printing the renumbering method description.
virtual QStringList cellMappingRequiredGroups() const =0
Returns the list of cell group names required for the cell renumbering, if that is the case....
virtual bool usesSequentialColoring() const =0
Virtual method that should return true if the renumbering is based on sequentially numbering the cell...
The abstract interface for a coloring method implementation.
Definition gmpGemaCR.h:51
HaloColoring _haloOption
How do we color halo cells if the mesh was partitioned?
Definition gmpGemaCR.h:89
HaloColoring
How to color halo cells for partitioned meshes.
Definition gmpGemaCR.h:56
@ HC_TOGETHER
Regular and halo cells are colored together. Remote cells are ignored.
Definition gmpGemaCR.h:57
@ HC_SPLIT_REMOTE
Regular cells are colored in a group, halo and remote in another.
Definition gmpGemaCR.h:60
@ HC_SPLIT
Regular and halo cells are colored separately. Remote cells are ignored.
Definition gmpGemaCR.h:59
@ HC_TOGETHER_REMOTE
All cells are colored together, including remote cells.
Definition gmpGemaCR.h:58
virtual void printParameters(const GmLogCategory &logger) const =0
Virtual method responsible for printing the coloring method description.
virtual void color(GmpColorData *colorData, const GmLogCategory &logger) const =0
The coloring function. It gets as parameters a GmpColorData object with the _srcGroup filled and _sta...
GmPCR::ColorType _colorType
The requested coloring type.
Definition gmpGemaCR.h:87
const QVariantMap & _options
The user provided options.
Definition gmpGemaCR.h:90
bool _partition
Was the mesh partitioned?
Definition gmpGemaCR.h:88
virtual bool checkOptions(const GmLogCategory &logger)=0
Virtual method responsible for validating the parameters supplied on the class constructor....
An implementation of the CR (color and renumbering) object interface. The partition interface does no...
Definition gmpGemaCR.h:210
GmValueAccessor * addNodeAttributeToMesh(QString name, QString description, GmStorageType type)
Adds to the mesh a new node attribute, with default value equal to -1 and the given name,...
Definition gmpGemaCR.h:382
GmpNodeRenumberingMethod< IntVector > * _nodeRenumberMethod
The configured node reordering object.
Definition gmpGemaCR.h:437
GmpGemaCRBase(GmSimulationData *simulation, QString id, QString description, const GmLogCategory &logger)
Default plugin object constructor.
Definition gmpGemaCR.h:214
GmCellAccessor * addCellAttributeToMesh(QString name, QString description, GmStorageType type)
Like addNodeAttributeToMesh() but adding a cell attribute.
Definition gmpGemaCR.h:388
bool _nodeRenumberRequested
Is node renumbering requested by the user? Can be false even if Partition is true.
Definition gmpGemaCR.h:429
GmMesh * _mesh
The associated cell mesh.
Definition gmpGemaCR.h:427
GmpColorData * _noColorData
The GmpColorData object if coloring is disabled.
Definition gmpGemaCR.h:435
QMap< const GmCellGroupSet *, GmpColorData * > _gsColorMap
Map storing coloring data for each registered group set.
Definition gmpGemaCR.h:434
QVariantMap _options
The set of user options.
Definition gmpGemaCR.h:426
PartitionT _part
Structure storing extra vectors needed when Partition is true, empty otherwise.
Definition gmpGemaCR.h:535
bool _skipRemote
A flag set to true by GmpGemaPCR if the mesh was partitioned, includes remote halo cells AND the keep...
Definition gmpGemaCR.h:433
ColorType _coloringType
The type of coloring produced by this object.
Definition gmpGemaCR.h:428
IntVectorOrMap _originalToLocalCell
If Partition is false, stores a vector indexed by original cell numbers, storing their local cell num...
Definition gmpGemaCR.h:478
bool _isNodeRenumbered
Have we renumbered the set of nodes? Always true if the mesh was partitioned.
Definition gmpGemaCR.h:431
virtual size_t usedMemory() const
Returns an estimate of the used memory by the PCR object. This does not includes fixed (small) sizes.
Definition gmpGemaCR.h:251
int _numGeomNodes
Cached value for _mesh->numNodes(). Updated whenever new geometry nodes are added to the mesh.
Definition gmpGemaCR.h:441
IntVector _localToOriginalCell
A vector mapping local cell numbers to original cell numbers. Size equal to _mesh->numCells()....
Definition gmpGemaCR.h:469
IntVectorOrMap _originalToLocalGeomNode
If Partition is false, stores a vector indexed by original geometry node numbers, storing their local...
Definition gmpGemaCR.h:464
int _numOriginalGeomNodes
Cached value for _mesh->numGlobalNodes(). If Partition is false, this is effectively equal to _numGeo...
Definition gmpGemaCR.h:448
bool _isCellRenumbered
Have we renumbered the set of cell? Always true if the mesh was partitioned.
Definition gmpGemaCR.h:432
IntVector _localToOriginalGeomNode
A vector mapping local geometry node numbers to original node numbers. Size equal to _mesh->numNodes(...
Definition gmpGemaCR.h:455
bool _cellRenumberRequested
Is cell renumbering requested by the user? Can be false even if Partition is true.
Definition gmpGemaCR.h:430
GmpColoringMethod * _colorMethod
The configured coloring object.
Definition gmpGemaCR.h:436
GmpCellRenumberingMethod< IntVector > * _cellRenumberMethod
The configured cell reordering object.
Definition gmpGemaCR.h:438
std::conditional_t< Partition, QMap< int, int >, Vector< int > > IntVectorOrMap
A Vector<int> for Partition = false and a QMap<int, int> for Partition = true.
Definition gmpGemaCR.h:369
Vector< int > IntVector
A Vector<int>
Definition gmpGemaCR.h:366
The abstract interface for a node renumbering method implementation. Template parameters is the type ...
Definition gmpGemaCR.h:99
const QVariantMap & _options
The user provided options.
Definition gmpGemaCR.h:120
virtual void printParameters(const GmLogCategory &logger) const =0
Virtual method responsible for printing the renumbering method description.
virtual bool renumber(GmValueAccessor *ac, IntVector &sortedToOriginal, const GmLogCategory &logger) const =0
The node renumbering function. It gets as input parameter an accessor to the mesh coordinates....
virtual bool checkOptions(const GmLogCategory &logger)=0
Virtual method responsible for validating the parameters supplied on the class constructor....
GmpGemaCRBase< GmSingleVector, false > GmpGemaCR
Typedef for the CR implementation with single vector.
Definition gmpGemaCR.h:539
GmpGemaCRBase< GmDualVector, false > GmpGemaCRD
Typedef for the CR implementation with dual vector.
Definition gmpGemaCR.h:542
Declaration of useful configuration definitions for the plugin library.
Helper struct grouping coloring data together.
Definition gmpGemaCR.h:35
GmCellGroupSet * _seqHaloSet
The sequential set of halo elements when state is COLORED_WITH_HALO.
Definition gmpGemaCR.h:39
GmPCR::ColorState _state
Coloring state.
Definition gmpGemaCR.h:37
size_t usedMemory() const
Returns an estimate of the used memory by this color data object, taking into account the size of the...
Definition gmpGemaCR.cpp:60
GmCellGroupSet * _seqSet
The sequential set of elements.
Definition gmpGemaCR.h:38
const GmCellGroupSet * _srcGroup
The source group that originated the coloring.
Definition gmpGemaCR.h:36
QVector< GmCellGroupSet * > _coloredHaloSets
The colored set of halo elements when state is COLORED_WITH_HALO.
Definition gmpGemaCR.h:41
QVector< GmCellGroupSet * > _coloredSets
The colored set of elements.
Definition gmpGemaCR.h:40
~GmpColorData()
Virtual destructor for the GmpColorData auxiliar structure.
Definition gmpGemaCR.cpp:47
Empty structure for use when Partition is false. If we where using C++ 20, we could mark this as [[no...
Definition gmpGemaCR.h:486
Additional partition info when Partition is true. Stores the vectors needed for ghost node reordering...
Definition gmpGemaCR.h:493
bool _cellsRenumbered
Were the cells renumbered again after the partition renumbering?
Definition gmpGemaCR.h:498
bool _nodesRenumbered
Were the nodes renumbered again after the partition renumbering?
Definition gmpGemaCR.h:497
IntVector _originalCellTraversalOrder
Same as _originalNodeTraversalOrder, but for cells. Only filled if _cellsRenumbered is true.
Definition gmpGemaCR.h:529
IntVector _localToOriginalGhostNode
Stores a vector indexed by local ghost numbers WITH the high bit CLEARED, storing their global ghost ...
Definition gmpGemaCR.h:507
IntVector _originalNodeTraversalOrder
A vector storing the order in which local geometric nodes should be traversed to produce the original...
Definition gmpGemaCR.h:526
bool _partitioned
Was the mesh effectively partitioned? Can be false when GmpGemaPCR is used in debug mode.
Definition gmpGemaCR.h:495
IntVectorOrMap _originalToLocalGhostNode
Stores a map keyed by original ghost numbers WITH the high bit CLEARED, storing their local ghost nod...
Definition gmpGemaCR.h:516