#pragma once #include #include #include #include #include #include #include #include namespace fesa { enum class NodeDof : std::uint8_t { ux, uy, uz, rx, ry, rz, }; struct DofAddress final { NodeId node; NodeDof dof; }; class DofManager final { public: [[nodiscard]] static DofManager build(const Domain& domain); [[nodiscard]] std::size_t full_dof_count() const noexcept; [[nodiscard]] std::size_t free_equation_count() const noexcept; [[nodiscard]] std::optional equation( DofAddress address) const; [[nodiscard]] std::optional equation( std::size_t full_dof) const; [[nodiscard]] std::optional prescribed_value( DofAddress address) const; [[nodiscard]] std::optional prescribed_value( std::size_t full_dof) const; [[nodiscard]] std::size_t full_dof(DofAddress address) const; [[nodiscard]] std::array element_full_dofs( const BeamElement& element) const; [[nodiscard]] std::vector reconstruct_full( std::span reduced) const; private: [[nodiscard]] std::size_t node_full_dof_base(NodeId node) const; std::map node_full_dof_bases_; std::vector> equations_; std::vector prescribed_values_; std::size_t free_equation_count_ = 0; }; } // namespace fesa