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