#pragma once #include "fesa/analysis/analysis_model.hpp" #include "fesa/math/vector.hpp" #include #include #include #include #include namespace fesa { enum class DofComponent : std::uint8_t { ux, uy, uz, urx, ury, urz }; struct SparsePattern { std::vector rowOffsets; std::vector columnIndices; }; // Owns every equation-space mapping so semantic model objects remain free of // analysis-specific equation IDs. class DofManager { public: static Result create(const AnalysisModel& model); std::size_t fullDofCount() const noexcept; std::size_t freeDofCount() const noexcept; std::size_t constrainedDofCount() const noexcept; std::size_t fullDof(EntityIndex node, DofComponent component) const; std::optional freeEquation(std::size_t fullDof) const; const std::array& elementScatter( EntityIndex element) const; const std::vector& freeDofs() const noexcept; const std::vector& constrainedDofs() const noexcept; const Vector& prescribedValues() const noexcept; const SparsePattern& sparsePattern() const noexcept; private: DofManager( std::size_t fullDofCount, std::vector> freeEquations, std::vector> elementScatters, std::vector freeDofs, std::vector constrainedDofs, Vector prescribedValues, SparsePattern sparsePattern); std::size_t fullDofCount_; std::vector> freeEquations_; std::vector> elementScatters_; std::vector freeDofs_; std::vector constrainedDofs_; Vector prescribedValues_; SparsePattern sparsePattern_; }; } // namespace fesa