55 FlagUID const Domain_flag{
"domain"};
57 FlagUID const Boundary_flag{
"boundary"};
60 class DynamicValueCallback {
62 DynamicValueCallback() {
63 m_value_boundary = std::make_shared<std::unordered_map<Cell, T>>();
68 std::shared_ptr<blockforest::StructuredBlockForest>
const &
blocks,
69 IBlock &
block)
const {
76 auto const global =
Cell(node[0], node[1], node[2]);
81 auto const global =
Cell(node[0], node[1], node[2]);
83 m_value_boundary->erase(
global);
88 auto const global =
Cell(node[0], node[1], node[2]);
93 auto const global =
Cell(node[0], node[1], node[2]);
94 return m_value_boundary->count(
global) != 0;
98 std::shared_ptr<std::unordered_map<Cell, T>> m_value_boundary;
99 static constexpr T default_value{};
102 if (m_value_boundary->count(cell) == 0) {
103 return default_value;
105 return m_value_boundary->at(cell);
109 [[
nodiscard]]
inline auto get_flag_field_and_flag(IBlock *
block)
const {
123 m_callback(DynamicValueCallback()), m_pending_changes(
false) {
125 for (
auto block = m_blocks->begin();
block != m_blocks->end(); ++
block) {
129 std::function
callback = m_callback;
137 return m_callback.node_is_boundary(node);
142 return m_callback.get_node_boundary_value(node);
148 m_callback.set_node_boundary_value(node, v);
150 m_pending_changes =
true;
154 m_callback.set_node_boundary_value(node, v);
160 m_callback.unset_node_boundary_value(node);
162 m_pending_changes =
true;
167 if (m_pending_changes) {
169 m_blocks, m_flag_field_id, Boundary_flag, Domain_flag);
170 m_pending_changes =
false;
176 return {
static_cast<int>(field->xSize()),
static_cast<int>(field->ySize()),
177 static_cast<int>(field->zSize())};
181 std::shared_ptr<StructuredBlockForest> m_blocks;
183 DynamicValueCallback m_callback;
184 std::shared_ptr<BoundaryClass> m_boundary;
185 bool m_pending_changes;