VTK  9.5.20250719
vtkHyperTree.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2// SPDX-License-Identifier: BSD-3-Clause
126#ifndef vtkHyperTree_h
127#define vtkHyperTree_h
128
129#include "vtkCommonDataModelModule.h" // For export macro
130#include "vtkDeprecation.h" // Include the macros.
131#include "vtkObject.h"
132
133#include <cassert> // Used internally
134#include <memory> // std::shared_ptr
135
136VTK_ABI_NAMESPACE_BEGIN
137class vtkBitArray;
138class vtkIdList;
140class vtkTypeInt64Array;
141
142//=============================================================================
144{
145 // Index of this tree in the hypertree grid
147
148 // Number of levels in the tree
149 unsigned int NumberOfLevels;
150
151 // Number of vertices in this tree (coarse and leaves)
153
154 // Number of nodes (non-leaf vertices) in the tree
156
157 // Offset start for the implicit global index mapping fixed by
158 // SetGlobalIndexStart after create a tree.
159 // If you don't choose implicit global index mapping then this
160 // value is -1. Then, you must to descrieb explicit global index
161 // mapping by using then SetGlobalIndexFromLocal for each cell
162 // in tree.
163 // The extra cost is equivalent to the cost of a field of values
164 // of cells.
166};
167
168//=============================================================================
169class VTKCOMMONDATAMODEL_EXPORT vtkHyperTree : public vtkObject
170{
171public:
172 vtkTypeMacro(vtkHyperTree, vtkObject);
173 void PrintSelf(ostream& os, vtkIndent indent) override;
174
183 unsigned char branchFactor, unsigned char dimension, unsigned char numberOfChildren);
184
204 virtual void InitializeForReader(vtkIdType numberOfLevels, vtkIdType nbVertices,
205 vtkIdType nbVerticesOfLastLevel, vtkBitArray* isParent, vtkBitArray* isMasked,
206 vtkBitArray* outIsMasked) = 0;
207
229 vtkBitArray* descriptor, vtkIdType numberOfBits, vtkIdType startIndex = 0) = 0;
230
270 virtual void ComputeBreadthFirstOrderDescriptor(unsigned int depthLimiter, vtkBitArray* inputMask,
271 vtkTypeInt64Array* numberOfVerticesPerDepth, vtkBitArray* descriptor,
272 vtkIdList* breadthFirstIdMap) = 0;
273
280
281 VTK_DEPRECATED_IN_9_6_0("No effect, do not use.")
282 virtual vtkHyperTree* Freeze(const char* vtkNotUsed(mode)) { return this; };
283
285
289 void SetTreeIndex(vtkIdType treeIndex)
290 {
291 assert("pre: datas_non_nullptr" && this->Datas != nullptr);
292 this->Datas->TreeIndex = treeIndex;
293 }
295 {
296 assert("pre: datas_non_nullptr" && this->Datas != nullptr);
297 return this->Datas->TreeIndex;
298 }
300
304 unsigned int GetNumberOfLevels() const
305 {
306 assert("pre: datas_non_nullptr" && this->Datas != nullptr);
307 assert("post: result_greater_or_equal_to_one" && this->Datas->NumberOfLevels >= 1);
308 return this->Datas->NumberOfLevels;
309 }
310
315 {
316 assert("pre: datas_non_nullptr" && this->Datas != nullptr);
317 return this->Datas->NumberOfVertices;
318 }
319
324 {
325 assert("pre: datas_non_nullptr" && this->Datas != nullptr);
326 return this->Datas->NumberOfNodes;
327 }
328
333 {
334 assert("pre: datas_non_nullptr" && this->Datas != nullptr);
335 return this->Datas->NumberOfVertices - this->Datas->NumberOfNodes;
336 }
337
341 int GetBranchFactor() const { return this->BranchFactor; }
342
346 int GetDimension() const { return this->Dimension; }
347
352 vtkIdType GetNumberOfChildren() const { return this->NumberOfChildren; }
353
355
359 void GetScale(double s[3]) const;
360 double GetScale(unsigned int d) const;
362
368 std::shared_ptr<vtkHyperTreeGridScales> InitializeScales(
369 const double* scales, bool reinitialize = false);
370
381 static vtkHyperTree* CreateInstance(unsigned char branchFactor, unsigned char dimension);
386 virtual unsigned long GetActualMemorySizeBytes() = 0;
387
392 unsigned int GetActualMemorySize()
393 {
394 // in kilibytes
395 return static_cast<unsigned int>(this->GetActualMemorySizeBytes() / 1024);
396 }
397
407 virtual bool IsGlobalIndexImplicit() = 0;
408
428 virtual void SetGlobalIndexStart(vtkIdType start) = 0;
429
435 {
436 assert("pre: datas_non_nullptr" && this->Datas != nullptr);
437 return this->Datas->GlobalIndexStart;
438 }
439
450
460
465 virtual vtkIdType GetGlobalNodeIndexMax() const = 0;
466
471 virtual bool IsLeaf(vtkIdType index) const = 0;
472
478 virtual void SubdivideLeaf(vtkIdType index, unsigned int level) = 0;
479
486 virtual bool IsTerminalNode(vtkIdType index) const = 0;
487
495 virtual vtkIdType GetElderChildIndex(unsigned int index_parent) const = 0;
496
501 virtual const unsigned int* GetElderChildIndexArray(size_t& nbElements) const = 0;
502
504
510 void SetScales(std::shared_ptr<vtkHyperTreeGridScales> scales) { this->Scales = scales; }
512
514
517 bool HasScales() const { return (this->Scales != nullptr); }
519
521
524 std::shared_ptr<vtkHyperTreeGridScales> GetScales() const
525 {
526 assert(this->Scales != nullptr);
527 return this->Scales;
528 }
530
531protected:
533
534 ~vtkHyperTree() override = default;
535
536 virtual void InitializePrivate() = 0;
537 virtual void PrintSelfPrivate(ostream& os, vtkIndent indent) = 0;
538 virtual void CopyStructurePrivate(vtkHyperTree* ht) = 0;
539
540 //-- Global information
541
542 // Branching factor of tree (2 or 3)
543 unsigned char BranchFactor;
544
545 // Dimension of tree (1, 2, or 3)
546 unsigned char Dimension;
547
548 // Number of children for coarse cell
549 unsigned char NumberOfChildren;
550
551 //-- Local information
552 std::shared_ptr<vtkHyperTreeData> Datas;
553
554 // Storage of pre-computed per-level cell scales
555 // In hypertree grid, one description by hypertree.
556 // In Uniform hypertree grid, one description by hypertree grid
557 // (all cells, different hypertree, are identical by level).
558 std::shared_ptr<vtkHyperTreeGridScales> Scales;
559
560private:
561 void InitializeBase(
562 unsigned char branchFactor, unsigned char dimension, unsigned char numberOfChildren);
563 vtkHyperTree(const vtkHyperTree&) = delete;
564 void operator=(const vtkHyperTree&) = delete;
565};
566
567VTK_ABI_NAMESPACE_END
568#endif
dynamic, self-adjusting array of bits
Definition vtkBitArray.h:29
Dynamic generation of scales for vtkHyperTree.
A data object structured as a tree.
std::shared_ptr< vtkHyperTreeGridScales > Scales
virtual vtkIdType GetGlobalIndexFromLocal(vtkIdType index) const =0
Get the global id of a local node identified by index.
unsigned char BranchFactor
virtual void BuildFromBreadthFirstOrderDescriptor(vtkBitArray *descriptor, vtkIdType numberOfBits, vtkIdType startIndex=0)=0
This method builds the indexing of this tree given a breadth first order descriptor.
virtual const unsigned int * GetElderChildIndexArray(size_t &nbElements) const =0
Return the elder child index array, internals of the tree structure Should be used with great care,...
void GetScale(double s[3]) const
Set/Get scale of the tree in each direction for the ground level (0).
virtual void PrintSelfPrivate(ostream &os, vtkIndent indent)=0
virtual void SubdivideLeaf(vtkIdType index, unsigned int level)=0
Subdivide a vertice, only if its a leaf.
virtual void SetGlobalIndexFromLocal(vtkIdType index, vtkIdType global)=0
Set the mapping between a node index in tree and a explicit global index mapping.
vtkIdType GetNumberOfVertices() const
Return the number of all vertices (coarse and fine) in the tree.
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
static vtkHyperTree * CreateInstance(unsigned char branchFactor, unsigned char dimension)
Return an instance of an implementation of a hypertree for given branch factor and dimension.
vtkIdType GetGlobalIndexStart() const
Get the start global index for the current tree for implicit global index mapping.
unsigned int GetNumberOfLevels() const
Return the number of levels.
virtual vtkIdType GetElderChildIndex(unsigned int index_parent) const =0
Return the elder child index, local index node of first child, of node, coarse cell,...
double GetScale(unsigned int d) const
Set/Get scale of the tree in each direction for the ground level (0).
std::shared_ptr< vtkHyperTreeGridScales > InitializeScales(const double *scales, bool reinitialize=false)
In an hypertree, all cells are the same size by level.
std::shared_ptr< vtkHyperTreeGridScales > GetScales() const
Return all scales.
virtual void ComputeBreadthFirstOrderDescriptor(unsigned int depthLimiter, vtkBitArray *inputMask, vtkTypeInt64Array *numberOfVerticesPerDepth, vtkBitArray *descriptor, vtkIdList *breadthFirstIdMap)=0
This method computes the breadth first order descriptor of the current tree.
unsigned char Dimension
unsigned int GetActualMemorySize()
Return memory used in kibibytes (1024 bytes).
bool HasScales() const
Return the existence scales.
vtkIdType GetNumberOfNodes() const
Return the number of nodes (coarse) in the tree.
int GetBranchFactor() const
Return the branch factor of the tree.
void SetScales(std::shared_ptr< vtkHyperTreeGridScales > scales)
In an hypertree, all cells are the same size by level.
virtual void SetGlobalIndexStart(vtkIdType start)=0
Set the start implicit global index mapping for the first cell in the current tree.
virtual void InitializePrivate()=0
std::shared_ptr< vtkHyperTreeData > Datas
unsigned char NumberOfChildren
void CopyStructure(vtkHyperTree *ht)
Copy the structure by sharing the decomposition description of the tree.
virtual bool IsGlobalIndexImplicit()=0
Return if implicit global index mapping has been used.
virtual bool IsTerminalNode(vtkIdType index) const =0
Return if a vertice identified by index in tree as a terminal node.
virtual void CopyStructurePrivate(vtkHyperTree *ht)=0
vtkIdType GetTreeIndex() const
Set/Get tree index in hypertree grid.
void Initialize(unsigned char branchFactor, unsigned char dimension, unsigned char numberOfChildren)
Restore the initial state: only one vertice is then a leaf: the root cell for the hypertree.
vtkIdType GetNumberOfLeaves() const
Return the number of leaf (fine) in the tree.
int GetDimension() const
Return the spatial dimension of the tree.
~vtkHyperTree() override=default
vtkIdType GetNumberOfChildren() const
Return the number of children per node of the tree.
virtual vtkIdType GetGlobalNodeIndexMax() const =0
Return the maximum value reached by global index mapping (implicit or explicit).
virtual void InitializeForReader(vtkIdType numberOfLevels, vtkIdType nbVertices, vtkIdType nbVerticesOfLastLevel, vtkBitArray *isParent, vtkBitArray *isMasked, vtkBitArray *outIsMasked)=0
Restore a state from read data, without using a cursor Call after create hypertree with initialize.
virtual unsigned long GetActualMemorySizeBytes()=0
Return memory used in bytes.
virtual bool IsLeaf(vtkIdType index) const =0
Return if a vertice identified by index in tree as being leaf.
void SetTreeIndex(vtkIdType treeIndex)
Set/Get tree index in hypertree grid.
list of point or cell ids
Definition vtkIdList.h:133
a simple class to control print indentation
Definition vtkIndent.h:108
abstract base class for most VTK objects
Definition vtkObject.h:162
unsigned int NumberOfLevels
vtkIdType NumberOfVertices
vtkIdType TreeIndex
vtkIdType NumberOfNodes
vtkIdType GlobalIndexStart
#define VTK_DEPRECATED_IN_9_6_0(reason)
int vtkIdType
Definition vtkType.h:332
#define VTK_NEWINSTANCE