OGS
GocadNode.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#include <bitset>
7#include <vector>
8
9#include "BaseLib/Error.h"
10
11#include "MeshLib/Node.h"
12
13namespace FileIO
14{
15namespace Gocad
16{
17enum class FaceDirection : char
18{
22};
23
25{
26public:
27 GocadNode(double const* const coords, std::size_t id,
28 std::size_t layer_transition_idx)
29 : Node(coords, id), _layer_transition_idx(layer_transition_idx)
30 {
31 }
32
33 GocadNode() = delete;
34 GocadNode(GocadNode const& src) = default;
35 GocadNode(GocadNode&& src) = default;
36 GocadNode& operator=(GocadNode&& rhs) = default;
37 GocadNode& operator=(GocadNode const& rhs) = default;
38 ~GocadNode() override = default;
39
40 void setFaceSet(std::size_t face_set_number, std::size_t face_indicator)
41 {
42 _face_set_membership.set(face_set_number);
43 switch (face_indicator)
44 {
45 case 0:
46 _face_directions.emplace_back(face_set_number,
48 break;
49 case 1:
50 _face_directions.emplace_back(face_set_number,
52 break;
53 case 2:
54 _face_directions.emplace_back(face_set_number,
56 break;
57 default:
59 "GocadNode::setFaceSet(): unknown face indicator {:d}.",
60 face_indicator);
61 }
62 }
63
70 bool isMemberOfFaceSet(std::size_t face_set_number) const
71 {
72 return _face_set_membership[face_set_number];
73 }
74
75 bool isMemberOfAnyFaceSet() const { return _face_set_membership.any(); }
76
77 void resetID(std::size_t id) { this->setID(id); }
78
79 std::bitset<128> const& getFaceSetMembership() const
80 {
82 }
83
84 FaceDirection getFaceDirection(std::size_t const face_set_number) const
85 {
86 auto const it = std::find_if(
88 [&](auto const fi) { return fi.first == face_set_number; });
89 if (it == _face_directions.end())
90 {
92 "GocadNode {:d}: Could not found face indicator for face set "
93 "{:d}",
94 getID(), face_set_number);
95 }
96 return it->second;
97 }
98
99 std::size_t getLayerTransitionIndex() const
100 {
102 }
103
104protected:
105 friend class GocadSplitNode;
106 std::vector<std::pair<std::size_t, FaceDirection>> _face_directions;
107
108private:
109 std::bitset<128> _face_set_membership;
111};
112
113bool operator<=(GocadNode const& n0, GocadNode const& n1);
114
115class GocadSplitNode final : public GocadNode
116{
117public:
118 GocadSplitNode(double const* const coords, std::size_t id,
119 std::array<std::size_t, 3> const& grid_coords,
120 std::bitset<8> const& affected_cells,
121 std::size_t layer_transition_idx)
122 : GocadNode(coords, id, layer_transition_idx),
123 _grid_coords(grid_coords),
124 _affected_cells(affected_cells)
125 {
126 }
127
128 std::array<std::size_t, 3> const& getGridCoords() const
129 {
130 return _grid_coords;
131 }
132 std::bitset<8> const& getAffectedCells() const
133 {
134 return _affected_cells;
135 }
136 void transmitFaceDirections(GocadNode const& gocad_node)
137 {
139 }
140
141private:
142 std::array<std::size_t, 3> _grid_coords;
143 std::bitset<8> const _affected_cells;
144};
145
146} // end namespace Gocad
147} // end namespace FileIO
148
#define OGS_FATAL(...)
Definition Error.h:19
friend class GocadSplitNode
Definition GocadNode.h:105
~GocadNode() override=default
GocadNode(GocadNode &&src)=default
void setFaceSet(std::size_t face_set_number, std::size_t face_indicator)
Definition GocadNode.h:40
std::bitset< 128 > const & getFaceSetMembership() const
Definition GocadNode.h:79
GocadNode & operator=(GocadNode &&rhs)=default
FaceDirection getFaceDirection(std::size_t const face_set_number) const
Definition GocadNode.h:84
std::size_t getLayerTransitionIndex() const
Definition GocadNode.h:99
GocadNode(double const *const coords, std::size_t id, std::size_t layer_transition_idx)
Definition GocadNode.h:27
bool isMemberOfAnyFaceSet() const
Definition GocadNode.h:75
GocadNode & operator=(GocadNode const &rhs)=default
bool isMemberOfFaceSet(std::size_t face_set_number) const
Definition GocadNode.h:70
std::bitset< 128 > _face_set_membership
Definition GocadNode.h:109
void resetID(std::size_t id)
Definition GocadNode.h:77
std::vector< std::pair< std::size_t, FaceDirection > > _face_directions
Definition GocadNode.h:106
std::size_t _layer_transition_idx
Definition GocadNode.h:110
GocadNode(GocadNode const &src)=default
std::bitset< 8 > const & getAffectedCells() const
Definition GocadNode.h:132
std::array< std::size_t, 3 > _grid_coords
Definition GocadNode.h:142
void transmitFaceDirections(GocadNode const &gocad_node)
Definition GocadNode.h:136
std::bitset< 8 > const _affected_cells
Definition GocadNode.h:143
std::array< std::size_t, 3 > const & getGridCoords() const
Definition GocadNode.h:128
GocadSplitNode(double const *const coords, std::size_t id, std::array< std::size_t, 3 > const &grid_coords, std::bitset< 8 > const &affected_cells, std::size_t layer_transition_idx)
Definition GocadNode.h:118
std::size_t getID() const
void setID(std::size_t id)
Sets the ID of a node to the given value.
Node(const double coords[3], std::size_t id=std::numeric_limits< std::size_t >::max())
Constructor using a coordinate array.
Definition Node.cpp:10
bool operator<=(GocadNode const &n0, GocadNode const &n1)
Definition GocadNode.cpp:10