system_layout.hpp array cstddef span type_traits serif/discretization/blocks/base.hpp serif/utils/dependencies/key_list_operations.hpp src/include/serif/backend/mfem/model/computations/pressure_boundary.hpp src/include/serif/backend/mfem/model/computations/solver_layout.hpp src/include/serif/backend/mfem/model/volume_actions.hpp src/include/serif/backend/mfem/solver/preconditioner/computations/ordering.hpp src/include/serif/discretization/blocks/vector_view.hpp src/include/serif/model/plan.hpp src/include/serif/operators/linearized_system_view.hpp src/include/serif/solver/normalization/layout.hpp src/include/serif/solver/preconditioner/default_preconditioners.hpp src/lib/serif/discretization/blocks/system_layout.cpp serif::discretization::blocks::SystemLayout serif serif::discretization serif::discretization::blocks serif::discretization::blocks::detail Describe the independently ordered physical state and residual coordinates of a discrete system. This is an accounting layer to keep index offsets straight in memory. Emily M. Boudreaux #pragmaonce #include<array> #include<cstddef> #include<span> #include<type_traits> #include"serif/discretization/blocks/base.hpp" #include"serif/utils/dependencies/key_list_operations.hpp" namespaceserif::discretization::blocks { [[nodiscard]]std::size_tchecked_block_size(std::span<conststd::size_t>sizes); template<utils::dependencies::IsKeyListValuesT,utils::dependencies::IsKeyListResidualsT> structSystemLayoutfinal{ usingValues=std::remove_cvref_t<ValuesT>; usingResiduals=std::remove_cvref_t<ResidualsT>; template<RepresentedValueKindKind> requires(Kind==RepresentedValueKind::value||Kind==RepresentedValueKind::residual) usingCoordinates=std::conditional_t<Kind==RepresentedValueKind::value,Values,Residuals>; std::array<std::size_t,utils::dependencies::key_count_v<Values>>state_sizes; std::array<std::size_t,utils::dependencies::key_count_v<Residuals>>residual_sizes; template<RepresentedValueKindKind> requires(Kind==RepresentedValueKind::value||Kind==RepresentedValueKind::residual) [[nodiscard]]std::span<conststd::size_t>sizes()constnoexcept{ ifconstexpr(Kind==RepresentedValueKind::value){ returnstate_sizes; } else{ returnresidual_sizes; } } template<RepresentedValueKindKind,typenameCoordinate> requiresutils::dependencies::ContainsKey<Coordinate, Coordinates<Kind>> [[nodiscard]]staticconstevalstd::size_tindex(){ ifconstexpr(Kind==RepresentedValueKind::value){ returnutils::dependencies::key_index<Coordinate, Values>(); } else{ returnutils::dependencies::key_index<Coordinate, Residuals>(); } } template<RepresentedValueKindKind,typenameCoordinate> requiresutils::dependencies::ContainsKey<Coordinate, Coordinates<Kind>> [[nodiscard]]std::size_tsize()constnoexcept{ returnsizes<Kind>()[index<Kind, Coordinate>()];//AnotefromEMBonOct142026toafuturedev.MaybeIamsorryIpickedC++?Weendupwithstufflikethesyntaxontheleft...Butperhapswewouldonewayortheother. } template<RepresentedValueKindKind,typenameCoordinate> requiresutils::dependencies::ContainsKey<Coordinate, Coordinates<Kind>> [[nodiscard]]std::size_toffset()const{ returnchecked_block_size(sizes<Kind>().first(index<Kind, Coordinate>())); } template<RepresentedValueKindKind> requires(Kind==RepresentedValueKind::value||Kind==RepresentedValueKind::residual) [[nodiscard]]std::size_ttotal_size()const{ returnchecked_block_size(sizes<Kind>()); } [[nodiscard]]booloperator==(constSystemLayout&)const=default; }; namespacedetail { template<typenameCandidate> inlineconstexprboolis_system_layout=false; template<typenameValues,typenameResiduals> inlineconstexprboolis_system_layout<SystemLayout<Values, Residuals>>=true; }//namespacedetail template<typenameCandidate> conceptSystemLayoutType=detail::is_system_layout<std::remove_cvref_t<Candidate>>; template<SystemLayoutTypeLayout,typenameSizeResolver> [[nodiscard]]constexprstd::remove_cvref_t<Layout>make_system_layout(constSizeResolver&size){ usingResult=std::remove_cvref_t<Layout>; constautosizes=[&]<typename...Coordinates>(utils::dependencies::KeyList<Coordinates...>){ returnstd::array<std::size_t,sizeof...(Coordinates)>{static_cast<std::size_t>(size.templateoperator()<Coordinates>())...}; }; return{.state_sizes=sizes(typenameResult::Values{}),.residual_sizes=sizes(typenameResult::Residuals{})}; } }//namespaceserif::discretization::blocks