vector_view.hpp span ranges stdexcept type_traits serif/discretization/blocks/system_layout.hpp serif/utils/error/errors.hpp src/compile_time_checks/serif/solver/preconditioner/layout.cpp src/include/serif/backend/mfem/solver/admissibility/geometry.hpp src/include/serif/model/state.hpp serif::discretization::blocks::BlockVectorView serif serif::discretization serif::discretization::blocks This file includes a class for viewing some SystemLayout as a span of coefficients without copying the underlying storage. Emily M. Boudreaux #pragmaonce #include<span> #include<ranges> #include<stdexcept> #include<type_traits> #include"serif/discretization/blocks/system_layout.hpp" #include"serif/utils/error/errors.hpp" namespaceserif::discretization::blocks { template<RepresentedValueKindKind,SystemLayoutTypeLayout,typenameScalar=double> requires(Kind==RepresentedValueKind::value||Kind==RepresentedValueKind::residual) classBlockVectorViewfinal { public: usingLayoutType=std::remove_cvref_t<Layout>; BlockVectorView( constLayoutType&layout, std::span<Scalar>values ): m_layout(layout), m_values(values){ conststd::size_trequired=layout.templatetotal_size<Kind>(); utils::errors::serif_ensure<utils::errors::SERiFErrorCode::INVALID_DOF_COUNT, std::domain_error>(values.size()==required,"Packedstoragehas{}coefficientsbutthesystemlayoutrequires{}.Bindthematchingstateorresidualvector.",values.size(),required); } BlockVectorView(constLayoutType&&,std::span<Scalar>)=delete; template<typenameRange> requires(!std::is_lvalue_reference_v<Range>&&!std::ranges::borrowed_range<Range>) BlockVectorView(constLayoutType&,Range&&)=delete; template<typenameCoordinate> requiresutils::dependencies::ContainsKey<Coordinate, typename LayoutType::template Coordinates<Kind>> [[nodiscard]]std::span<Scalar>get()const { conststd::size_toffset=m_layout.templateoffset<Kind,Coordinate>(); conststd::size_tcount=m_layout.templatesize<Kind,Coordinate>(); utils::errors::serif_ensure<utils::errors::SERiFErrorCode::INVALID_DOF_COUNT>(offset<=m_values.size()&&count<=m_values.size()-offset,"Thesystemlayoutchangedafterthisvectorviewwasbound.Rebindtheviewtomatchingstorage."); returnm_values.subspan(offset,count); } private: constLayoutType&m_layout; std::span<Scalar>m_values; }; template<SystemLayoutTypeLayout,typenameScalar=double> usingStateView=BlockVectorView<RepresentedValueKind::value, Layout, Scalar>; template<SystemLayoutTypeLayout,typenameScalar=double> usingResidualView=BlockVectorView<RepresentedValueKind::residual, Layout, Scalar>; }//namespaceserif::discretization::blocks