VTK  9.7.20260912
vtkCellGridSidesCache.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
3
4#ifndef vtkCellGridSidesCache_h
5#define vtkCellGridSidesCache_h
6
7#include "vtkObject.h"
8
9#include "vtkCommonDataModelModule.h" // For export macro.
10#include "vtkHashCombiner.h" // For templated AddSide() method.
11#include "vtkStringToken.h" // For API.
12
13#include <functional>
14#include <map>
15#include <set>
16#include <unordered_map>
17#include <vector>
18
19VTK_ABI_NAMESPACE_BEGIN
20
21class vtkIdTypeArray;
22
33class VTKCOMMONDATAMODEL_EXPORT vtkCellGridSidesCache : public vtkObject
34{
35public:
38 void PrintSelf(ostream& os, vtkIndent indent) override;
39
44 struct Side
45 {
53 int SideId;
54
56 bool operator<(const Side& other) const
57 {
58 return (this->CellType < other.CellType) ||
59 (this->CellType == other.CellType &&
60 ((this->DOF < other.DOF) || (this->DOF == other.DOF && this->SideId < other.SideId)));
61 }
62 };
63
65 struct Entry
66 {
67 std::set<Side> Sides;
68 };
69
71 std::unordered_map<std::size_t, Entry>& GetHashes() { return this->Hashes; }
72
74 template <typename C, typename T = typename C::value_type>
75 std::size_t HashSide(vtkStringToken shape, const C& conn, std::size_t pointArrayId = 0)
76 {
77 std::size_t ss = 0;
78 std::size_t NN = conn.size();
79 if (NN == 0)
80 {
81 return 0;
82 }
83
84 T smin = conn[0];
85 for (std::size_t jj = 1; jj < NN; ++jj)
86 {
87 if (conn[jj] < smin)
88 {
89 smin = conn[jj];
90 ss = jj;
91 }
92 }
93 bool forward = conn[(ss + 1) % NN] > conn[(ss + NN - 1) % NN];
94
95 std::size_t hashedValue = std::hash<std::size_t>{}(NN);
96 vtkHashCombiner()(hashedValue, shape.GetId());
97 // Include the identity of the coordinate array that the point IDs index into
98 vtkHashCombiner()(hashedValue, pointArrayId);
99 // std::cout << "Hash(" << (forward ? "F" : "R") << ")";
100 if (forward)
101 {
102 for (std::size_t ii = 0; ii < NN; ++ii)
103 {
104 std::size_t hashedToken = std::hash<T>{}(conn[(ss + ii) % NN]);
105 vtkHashCombiner()(hashedValue, hashedToken);
106 // std::cout << " " << conn[(ss + ii) % NN];
107 }
108 }
109 else // backward
110 {
111 for (std::size_t ii = 0; ii < NN; ++ii)
112 {
113 std::size_t hashedToken = std::hash<T>{}(conn[(ss + NN - ii) % NN]);
114 // hashedValue = hashedValue ^ (hashedToken << (ii + 1));
115 vtkHashCombiner()(hashedValue, hashedToken);
116 // std::cout << " " << conn[(ss + NN - ii) % NN];
117 }
118 }
119 // std::cout << " = " << std::hex << hashedValue << std::dec << "\n";
120 return hashedValue;
121 }
122
140 //
150
151 template <typename C, typename T = typename C::value_type>
152 void AddSide(vtkStringToken cellType, vtkIdType cell, int side, vtkStringToken shape,
153 const C& conn, std::size_t pointArrayId = 0)
154 {
155 auto hashedValue = this->HashSide(shape, conn, pointArrayId);
156 this->Hashes[hashedValue].Sides.insert(Side{ cellType, shape, cell, side });
157 }
158
159
162
163protected:
165 ~vtkCellGridSidesCache() override = default;
166
167 std::unordered_map<std::size_t, Entry> Hashes;
168
169private:
171 void operator=(const vtkCellGridSidesCache&) = delete;
172};
173
174VTK_ABI_NAMESPACE_END
175#endif // vtkCellGridSidesCache_h
void AddSide(vtkStringToken cellType, vtkIdType cell, int side, vtkStringToken shape, const C &conn, std::size_t pointArrayId=0)
Add a side with the given shape and connectivity to the request's state.
void Initialize()
Empty the cache of all hashes.
std::unordered_map< std::size_t, Entry > & GetHashes()
Return the map of hashed side information.
static vtkCellGridSidesCache * New()
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
vtkCellGridSidesCache()=default
~vtkCellGridSidesCache() override=default
std::size_t HashSide(vtkStringToken shape, const C &conn, std::size_t pointArrayId=0)
Compute the hash of a side (but do not insert a side into the map).
std::unordered_map< std::size_t, Entry > Hashes
Combine 4- and 8-byte integers into a single hash value.
dynamic, self-adjusting array of vtkIdType
a simple class to control print indentation
Definition vtkIndent.h:108
Represent a string by its integer hash.
Hash GetId() const
Return the token's ID (usually its hash but possibly not in the case of collisions).
Each hash entry corresponds to one or more sides of one or more cells.
Records held by a hash-entry that represent the side of one cell.
int SideId
The ID of the side being hashed.
vtkStringToken CellType
The type of cell whose side is hashed.
bool operator<(const Side &other) const
Compare side-hashes to allow set insertion.
vtkStringToken SideShape
The shape of the side being hashed.
vtkIdType DOF
The degree of freedom starting the hash sequence.
int vtkIdType
Definition vtkType.h:363