Files
FESA/include/fesa/model/domain.hpp
T

95 lines
2.8 KiB
C++

#pragma once
#include <cstddef>
#include <cstdint>
#include <map>
#include <span>
#include <string>
#include <unordered_map>
#include <utility>
#include <vector>
#include <fesa/model/beam_element.hpp>
#include <fesa/model/beam_section.hpp>
#include <fesa/model/entity_set.hpp>
#include <fesa/model/material.hpp>
#include <fesa/model/node.hpp>
#include <fesa/model/step_definition.hpp>
namespace fesa {
class DomainBuilder;
class Domain final {
public:
Domain(const Domain&) = default;
Domain(Domain&&) noexcept = default;
Domain& operator=(const Domain&) = default;
Domain& operator=(Domain&&) noexcept = default;
[[nodiscard]] std::span<const Node> nodes() const noexcept {
return nodes_;
}
[[nodiscard]] std::span<const BeamElement> beam_elements() const noexcept {
return beam_elements_;
}
[[nodiscard]] std::span<const IsotropicElastic> materials() const noexcept {
return materials_;
}
[[nodiscard]] std::span<const BeamSection> sections() const noexcept {
return sections_;
}
[[nodiscard]] std::span<const NodeSet> node_sets() const noexcept {
return node_sets_;
}
[[nodiscard]] std::span<const ElementSet> element_sets() const noexcept {
return element_sets_;
}
[[nodiscard]] const StepDefinition& step() const noexcept {
return step_;
}
[[nodiscard]] const Node& node(NodeId id) const;
[[nodiscard]] const Node& node(const EntityOrigin& origin) const;
[[nodiscard]] const IsotropicElastic& material(MaterialId id) const;
[[nodiscard]] const BeamSection& section(SectionId id) const;
private:
friend class DomainBuilder;
using OriginKey = std::pair<std::string, std::int64_t>;
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);
[[nodiscard]] static OriginKey origin_key(const EntityOrigin& origin);
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_;
std::unordered_map<std::int64_t, std::size_t> node_indices_;
std::map<OriginKey, std::size_t> node_origin_indices_;
std::unordered_map<std::int64_t, std::size_t> beam_element_indices_;
std::map<OriginKey, std::size_t> beam_element_origin_indices_;
std::unordered_map<std::int64_t, std::size_t> material_indices_;
std::unordered_map<std::int64_t, std::size_t> section_indices_;
};
} // namespace fesa