#ifndef FESA_FEM_DOF_MANAGER_H_ #define FESA_FEM_DOF_MANAGER_H_ #include #include #include #include #include #include "fesa/analysis/analysis_model.h" #include "fesa/math/vector.h" namespace fesa { /// @brief Identifies one component in the stable six-DOF node layout. enum class DofComponent : std::uint8_t { kUx, kUy, kUz, kUrx, kUry, kUrz, }; /// @brief Stores the stable structural CSR pattern. struct SparsePattern { std::vector row_offsets; std::vector column_indices; }; /// @brief Owns full/free/constrained numbering, scatter maps, and CSR pattern. class DofManager { public: /// @brief Creates every equation-space mapping for an active model. static Result Create(const AnalysisModel& model); /// @brief Returns the full node-by-component DOF count. std::size_t FullDofCount() const noexcept; /// @brief Returns the free-equation count. std::size_t FreeDofCount() const noexcept; /// @brief Returns the prescribed-DOF count. std::size_t ConstrainedDofCount() const noexcept; /// @brief Maps a stable node index and component to a full DOF. std::size_t FullDof(EntityIndex node, DofComponent component) const; /// @brief Returns the free equation for a full DOF when unconstrained. std::optional FreeEquation(std::size_t full_dof) const; /// @brief Returns a beam scatter in endpoint/component order. const std::array& ElementScatter(EntityIndex element) const; /// @brief Returns a shell scatter in node/component order. const std::array& ShellElementScatter( EntityIndex element) const; /// @brief Returns free full DOFs in stable increasing order. const std::vector& FreeDofs() const noexcept; /// @brief Returns constrained full DOFs in stable increasing order. const std::vector& ConstrainedDofs() const noexcept; /// @brief Returns dc in constrained-DOF order. const Vector& PrescribedValues() const noexcept; /// @brief Returns the full-space structural CSR pattern. const SparsePattern& GetSparsePattern() const noexcept; private: /// @brief Takes ownership of fully validated stable equation mappings. DofManager(std::size_t full_dof_count, std::vector> free_equations, std::vector> element_scatters, std::vector> shell_element_scatters, std::vector free_dofs, std::vector constrained_dofs, Vector prescribed_values, SparsePattern sparse_pattern); std::size_t full_dof_count_; std::vector> free_equations_; std::vector> element_scatters_; std::vector> shell_element_scatters_; std::vector free_dofs_; std::vector constrained_dofs_; Vector prescribed_values_; SparsePattern sparse_pattern_; }; } // namespace fesa #endif // FESA_FEM_DOF_MANAGER_H_