/home/runner/work/kynema/kynema/kynema/src/model/mesh_connectivity.hpp Source File

Kynema API: /home/runner/work/kynema/kynema/kynema/src/model/mesh_connectivity.hpp Source File
Kynema API
A flexible multibody structural dynamics code for wind turbines
Loading...
Searching...
No Matches
mesh_connectivity.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <fstream>
4#include <span>
5#include <unordered_map>
6#include <vector>
7
8#include <yaml-cpp/yaml.h>
9
10namespace kynema::model {
11
19public:
20 MeshConnectivity() = default;
21
27 void AddBeamElementConnectivity(size_t elem_id, std::span<const size_t> node_ids) {
28 beams_[elem_id].assign(std::begin(node_ids), std::end(node_ids));
29 }
30
36 void AddMassElementConnectivity(size_t elem_id, size_t node_id) {
37 masses_[elem_id] = std::vector<size_t>{node_id};
38 }
39
45 void AddSpringElementConnectivity(size_t elem_id, const std::array<size_t, 2>& node_ids) {
46 springs_[elem_id] = std::vector<size_t>{node_ids[0], node_ids[1]};
47 }
48
54 void AddConstraintConnectivity(size_t constraint_id, std::span<const size_t> node_ids) {
55 constraints_[constraint_id].assign(std::begin(node_ids), std::end(node_ids));
56 }
57
63 [[nodiscard]] const std::vector<size_t>& GetBeamElementConnectivity(size_t elem_id) const {
64 return beams_.at(elem_id);
65 }
66
72 [[nodiscard]] const std::vector<size_t>& GetMassElementConnectivity(size_t elem_id) const {
73 return masses_.at(elem_id);
74 }
75
81 [[nodiscard]] const std::vector<size_t>& GetSpringElementConnectivity(size_t elem_id) const {
82 return springs_.at(elem_id);
83 }
84
90 [[nodiscard]] const std::vector<size_t>& GetConstraintConnectivity(size_t constraint_id) const {
91 return constraints_.at(constraint_id);
92 }
93
98 void ExportToYAML(std::ostream& file) const {
99 YAML::Node root;
100
101 ExportElementTypeToYAML(root, "beams", beams_);
102 ExportElementTypeToYAML(root, "masses", masses_);
103 ExportElementTypeToYAML(root, "springs", springs_);
104 ExportElementTypeToYAML(root, "constraints", constraints_);
105
106 file << root;
107 }
108
113 void ExportToYAML(const std::string& filename) const {
114 std::ofstream file(filename);
115 ExportToYAML(file);
116 }
117
122 void ImportFromYAML(const YAML::Node& root) {
123 masses_.clear();
124 springs_.clear();
125 beams_.clear();
126 constraints_.clear();
127
128 // Import masses
129 if (root["masses"]) {
130 for (const auto& entry : root["masses"]) {
131 const size_t id = std::stoul(entry.first.as<std::string>());
132 masses_[id] = entry.second.as<std::vector<size_t>>();
133 }
134 }
135
136 // Import springs
137 if (root["springs"]) {
138 for (const auto& entry : root["springs"]) {
139 const size_t id = std::stoul(entry.first.as<std::string>());
140 springs_[id] = entry.second.as<std::vector<size_t>>();
141 }
142 }
143
144 // Import beams
145 if (root["beams"]) {
146 for (const auto& entry : root["beams"]) {
147 const size_t id = std::stoul(entry.first.as<std::string>());
148 beams_[id] = entry.second.as<std::vector<size_t>>();
149 }
150 }
151
152 // Import constraints
153 if (root["constraints"]) {
154 for (const auto& entry : root["constraints"]) {
155 const size_t id = std::stoul(entry.first.as<std::string>());
156 constraints_[id] = entry.second.as<std::vector<size_t>>();
157 }
158 }
159 }
160
165 void ImportFromYAML(const std::string& filename) { ImportFromYAML(YAML::LoadFile(filename)); }
166
167private:
168 std::unordered_map<size_t, std::vector<size_t>> beams_;
169 std::unordered_map<size_t, std::vector<size_t>> masses_;
170 std::unordered_map<size_t, std::vector<size_t>> springs_;
171 std::unordered_map<size_t, std::vector<size_t>> constraints_;
172
179 template <typename MapType>
180 static void ExportElementTypeToYAML(
181 YAML::Node& root, const std::string& element_type, const MapType& map
182 ) {
183 if (map.empty()) {
184 return;
185 }
186
187 YAML::Node element_node;
188
189 // Get all keys from the map and sort them to maintain consistent order
190 std::vector<size_t> keys;
191 keys.reserve(map.size());
192 for (const auto& [id, _] : map) {
193 keys.push_back(id);
194 }
195 std::sort(keys.begin(), keys.end());
196
197 // Add each element in sorted order of id
198 for (const auto& id : keys) {
199 YAML::Node array_node;
200 std::for_each(map.at(id).begin(), map.at(id).end(), [&array_node](const auto& node_id) {
201 array_node.push_back(node_id);
202 });
203
204 array_node.SetStyle(YAML::EmitterStyle::Flow);
205 element_node[std::to_string(id)] = array_node;
206 }
207
208 root[element_type] = element_node;
209 }
210};
211
212} // namespace kynema::model
Class to manage element-to-node connectivity information for a mesh.
Definition mesh_connectivity.hpp:18
void AddSpringElementConnectivity(size_t elem_id, const std::array< size_t, 2 > &node_ids)
Adds a spring element's node connectivity.
Definition mesh_connectivity.hpp:45
void ExportToYAML(const std::string &filename) const
Export mesh connectivity information to a YAML file.
Definition mesh_connectivity.hpp:113
void ImportFromYAML(const YAML::Node &root)
Import mesh connectivity information from a YAML file.
Definition mesh_connectivity.hpp:122
void AddBeamElementConnectivity(size_t elem_id, std::span< const size_t > node_ids)
Adds a beam element's node connectivity.
Definition mesh_connectivity.hpp:27
void ExportToYAML(std::ostream &file) const
Export mesh connectivity inforation to a YAML file.
Definition mesh_connectivity.hpp:98
void AddMassElementConnectivity(size_t elem_id, size_t node_id)
Adds a mass element's node connectivity.
Definition mesh_connectivity.hpp:36
const std::vector< size_t > & GetMassElementConnectivity(size_t elem_id) const
Get nodes connected to a specific mass element.
Definition mesh_connectivity.hpp:72
void AddConstraintConnectivity(size_t constraint_id, std::span< const size_t > node_ids)
Adds a constraint's node connectivity.
Definition mesh_connectivity.hpp:54
const std::vector< size_t > & GetSpringElementConnectivity(size_t elem_id) const
Get nodes connected to a specific spring element.
Definition mesh_connectivity.hpp:81
const std::vector< size_t > & GetConstraintConnectivity(size_t constraint_id) const
Get nodes connected to a specific constraint.
Definition mesh_connectivity.hpp:90
const std::vector< size_t > & GetBeamElementConnectivity(size_t elem_id) const
Get nodes connected to a specific beam element.
Definition mesh_connectivity.hpp:63
void ImportFromYAML(const std::string &filename)
Import mesh connectivity information from a YAML file.
Definition mesh_connectivity.hpp:165
Definition copy_nodes_to_state.hpp:11