LehrFEM++ 1.0.0
A simple Finite Element Library for teaching
Loading...
Searching...
No Matches
gmsh_file_v4_detail.h
1
11
12#ifndef INCGc3071f8127a44f7e8cb57f0b1dd3335a
13#define INCGc3071f8127a44f7e8cb57f0b1dd3335a
14
15#include <boost/fusion/adapted.hpp>
16#include <boost/fusion/adapted/std_tuple.hpp>
17#include <boost/fusion/include/adapt_struct.hpp>
18#include <boost/fusion/include/adapt_struct_named.hpp>
19#include <boost/fusion/include/at_c.hpp>
20#include <boost/fusion/include/boost_array.hpp>
21#include <boost/fusion/include/io.hpp>
22#include <boost/fusion/include/std_pair.hpp>
23#include <boost/fusion/iterator.hpp>
24#include <boost/fusion/sequence/intrinsic/at_c.hpp>
25#include <boost/fusion/support/category_of.hpp>
26#include <boost/fusion/support/iterator_base.hpp>
27#include <boost/fusion/support/tag_of.hpp>
28#include <boost/fusion/support/tag_of_fwd.hpp>
29#include <boost/mpl/minus.hpp>
30#include <boost/phoenix.hpp>
31#include <boost/phoenix/core.hpp>
32#include <boost/phoenix/function/adapt_function.hpp>
33#include <boost/phoenix/fusion.hpp>
34#include <boost/phoenix/object.hpp>
35#include <boost/phoenix/operator.hpp>
36#include <boost/phoenix/stl.hpp>
37#include <boost/spirit/include/qi.hpp>
38#include <boost/spirit/include/qi_binary.hpp>
39#include <boost/spirit/include/qi_uint.hpp>
40
41#include "eigen_fusion_adapter.h"
42#include "gmsh_file_v4.h"
43
44// Boost Fusion Adaptions (needed so boost spirit can parse directly into
45// GmshFileV4 struct)
48
49BOOST_FUSION_ADAPT_STRUCT(lf::io::GMshFileV4::PhysicalName,
50 (int, dimension)(int, physical_tag)(std::string,
51 name));
52
53BOOST_FUSION_ADAPT_STRUCT(lf::io::GMshFileV4::PointEntity,
54 (int, tag)(Eigen::Vector3d, coord)(std::vector<int>,
55 physical_tags));
56
57BOOST_FUSION_ADAPT_STRUCT(
59 (int, tag)(Eigen::Vector3d, min_coord)(Eigen::Vector3d, max_coord)(
60 std::vector<int>, physical_tags)(std::vector<int>, bounding_entities));
61
62BOOST_FUSION_ADAPT_STRUCT(lf::io::GMshFileV4::GhostEntity,
63 (int, tag)(int, partition));
64
65BOOST_FUSION_ADAPT_STRUCT(
67 (int, tag)(int, parent_dim)(int, parent_tag)(std::vector<int>, partitions)(
68 Eigen::Vector3d, coord)(std::vector<int>, physical_tags));
69
70BOOST_FUSION_ADAPT_STRUCT(
72 (int, tag)(int, parent_dim)(int, parent_tag)(std::vector<int>, partitions)(
73 Eigen::Vector3d, min_coord)(Eigen::Vector3d, max_coord)(
74 std::vector<int>, physical_tags)(std::vector<int>, bounding_entities));
75
76using partitionedEntities_t =
77 std::tuple<std::vector<lf::io::GMshFileV4::PartitionedPointEntity>,
78 std::vector<lf::io::GMshFileV4::PartitionedEntity>,
79 std::vector<lf::io::GMshFileV4::PartitionedEntity>,
80 std::vector<lf::io::GMshFileV4::PartitionedEntity>>;
81
82BOOST_FUSION_ADAPT_STRUCT(
84 (std::size_t, num_partitions)(std::vector<lf::io::GMshFileV4::GhostEntity>,
85 ghost_entities)(partitionedEntities_t,
86 partitioned_entities));
87
88// To prevent comma in preprocessor invocation
89using nodeMapping_t = std::pair<std::size_t, Eigen::Vector3d>;
90
91BOOST_FUSION_ADAPT_STRUCT(lf::io::GMshFileV4::NodeBlock,
92 (int, entity_dim)(int, entity_tag)(bool, parametric)(
93 std::vector<nodeMapping_t>, nodes));
94
95BOOST_FUSION_ADAPT_STRUCT(lf::io::GMshFileV4::Nodes,
96 (std::size_t, num_nodes)(std::size_t,
97 min_node_tag)(std::size_t,
98 max_node_tag)(
99 std::vector<lf::io::GMshFileV4::NodeBlock>,
100 node_blocks));
101
102// To prevent comma in preprocessor invocation
103using elementMapping_t = std::pair<std::size_t, std::vector<std::size_t>>;
104
105BOOST_FUSION_ADAPT_STRUCT(lf::io::GMshFileV4::ElementBlock,
106 (int, dimension)(int, entity_tag)(
108 element_type)(std::vector<elementMapping_t>,
109 elements));
110
111BOOST_FUSION_ADAPT_STRUCT(
113 (std::size_t, num_elements)(std::size_t, min_element_tag)(std::size_t,
114 max_element_tag)(
115 std::vector<lf::io::GMshFileV4::ElementBlock>, element_blocks));
116
117// to prevent comma in preprocessor invocation
118using periodicLink_t = std::pair<std::size_t, std::size_t>;
119BOOST_FUSION_ADAPT_STRUCT(
121 (int, dimension)(int, entity_tag_slave)(int, entity_tag_master)(
122 std::optional<Eigen::Matrix4d>,
123 affine_transform)(std::vector<periodicLink_t>, node_mapping));
124
125BOOST_FUSION_ADAPT_STRUCT(lf::io::GMshFileV4::GhostElement,
126 (std::size_t, element_tag)(int, partition_tag)(
127 std::vector<int>, ghost_partition_tags));
128
129// to prevent comma in preprocessor invocation:
130using entities_t = std::tuple<std::vector<lf::io::GMshFileV4::PointEntity>,
131 std::vector<lf::io::GMshFileV4::Entity>,
132 std::vector<lf::io::GMshFileV4::Entity>,
133 std::vector<lf::io::GMshFileV4::Entity>>;
134
135// clang-format off
136// NOLINTBEGIN
137BOOST_FUSION_ADAPT_STRUCT_NAMED(
138 lf::io::GMshFileV4, MshFileV4Adapted,
139 (std::vector<lf::io::GMshFileV4::PhysicalName>, physical_names)
140 (entities_t, entities)
141 (lf::io::GMshFileV4::PartitionedEntities, partitioned_entities)
144 (std::vector<lf::io::GMshFileV4::PeriodicLink>, periodic_links)
145 (std::vector<lf::io::GMshFileV4::GhostElement>, ghost_elements)
146)
147// NOLINTEND
148// clang-format on
149
150namespace lf::io {
151// NOLINTNEXTLINE
152BOOST_PHOENIX_ADAPT_FUNCTION(int, numNodesAdapted, NumNodes, 1);
153} // namespace lf::io
154
156namespace boost::spirit::traits {
157
158template <class Enum, class RawValue>
159struct assign_to_attribute_from_value<
160 Enum, RawValue,
161 typename std::enable_if_t<std::is_enum_v<Enum> &&
162 !std::is_same_v<Enum, RawValue>>> {
163 static void call(RawValue const& raw, Enum& cat) {
164 if constexpr (detail::has_value_type<RawValue>::value) { // NOLINT
165 // specialization for endian::endian
166 const typename RawValue::value_type value = raw;
167 cat = static_cast<Enum>(value);
168 } else { // NOLINT
169 cat = static_cast<Enum>(raw);
170 }
171 }
172};
173
174} // namespace boost::spirit::traits
176#endif // INCGc3071f8127a44f7e8cb57f0b1dd3335a
Mesh input (from file) and output (in various formats) facilities.
size_type NumNodes(GMshFileV2::ElementType et)
Number of nodes that this element type has.
Represents number of mesh elements (such as triangles/quadrilaterals/points/lines) that share the sam...
A higher-dimensional entity (which is not a point) such as a curve, surface or volume....
A higher dimensional partitioned entity.
When a mesh is partitioned, the entities are also partitioned. This is a node entity which is typical...
Represents a physical name as defined in gmsh. In GMSH a Physical name is created through one of the ...
An entity of dimension 0. Usually an entity corresponds to a geometric construct as it is defined in ...
A representation of a .msh file (V4) in a c++ data structure.
ElementType
All possible element types (see GMSH documentation)