feat(domain-and-input-skeleton): step 1 — domain-validation
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
#include <fesa/model/domain.hpp>
|
||||
|
||||
#include <cstddef>
|
||||
#include <stdexcept>
|
||||
|
||||
namespace fesa {
|
||||
|
||||
Domain::Domain(
|
||||
std::vector<Node> nodes,
|
||||
std::vector<BeamElement> beam_elements,
|
||||
std::vector<IsotropicElastic> materials,
|
||||
std::vector<BeamSection> sections,
|
||||
std::vector<NodeSet> node_sets,
|
||||
std::vector<ElementSet> element_sets,
|
||||
StepDefinition step)
|
||||
: nodes_{std::move(nodes)},
|
||||
beam_elements_{std::move(beam_elements)},
|
||||
materials_{std::move(materials)},
|
||||
sections_{std::move(sections)},
|
||||
node_sets_{std::move(node_sets)},
|
||||
element_sets_{std::move(element_sets)},
|
||||
step_{std::move(step)} {
|
||||
for (std::size_t index = 0; index < nodes_.size(); ++index) {
|
||||
node_indices_.emplace(nodes_[index].id.value(), index);
|
||||
node_origin_indices_.emplace(origin_key(nodes_[index].origin), index);
|
||||
}
|
||||
for (std::size_t index = 0; index < beam_elements_.size(); ++index) {
|
||||
beam_element_indices_.emplace(
|
||||
beam_elements_[index].id.value(), index);
|
||||
beam_element_origin_indices_.emplace(
|
||||
origin_key(beam_elements_[index].origin), index);
|
||||
}
|
||||
for (std::size_t index = 0; index < materials_.size(); ++index) {
|
||||
material_indices_.emplace(materials_[index].id.value(), index);
|
||||
}
|
||||
for (std::size_t index = 0; index < sections_.size(); ++index) {
|
||||
section_indices_.emplace(sections_[index].id.value(), index);
|
||||
}
|
||||
}
|
||||
|
||||
const Node& Domain::node(const NodeId id) const {
|
||||
const auto found = node_indices_.find(id.value());
|
||||
if (found == node_indices_.end()) {
|
||||
throw std::out_of_range{"Node ID is not present in the Domain."};
|
||||
}
|
||||
return nodes_[found->second];
|
||||
}
|
||||
|
||||
const Node& Domain::node(const EntityOrigin& origin) const {
|
||||
const auto found = node_origin_indices_.find(origin_key(origin));
|
||||
if (found == node_origin_indices_.end()) {
|
||||
throw std::out_of_range{
|
||||
"Node origin is not present in the Domain."};
|
||||
}
|
||||
return nodes_[found->second];
|
||||
}
|
||||
|
||||
Domain::OriginKey Domain::origin_key(const EntityOrigin& origin) {
|
||||
return {origin.instance_name, origin.local_label};
|
||||
}
|
||||
|
||||
} // namespace fesa
|
||||
Reference in New Issue
Block a user