computations.hpp array cstddef expected span string tuple type_traits serif/solver/normalization/detail/factor_computations.hpp serif/solver/normalization/detail/packing.hpp src/compile_time_checks/serif/model/barotropic_density.cpp src/compile_time_checks/serif/model/density_primal.cpp src/compile_time_checks/serif/model/normalization.cpp src/compile_time_checks/serif/solver/normalization/dimensionless.cpp src/compile_time_checks/serif/solver/normalization/plan.cpp src/include/serif/backend/mfem/model/normalization/computations.hpp src/include/serif/solver/normalization/normalization.hpp serif serif::solver serif::solver::normalization serif::solver::normalization::detail #pragmaonce #include<array> #include<cstddef> #include<expected> #include<span> #include<string> #include<tuple> #include<type_traits> #include"serif/solver/normalization/detail/factor_computations.hpp" #include"serif/solver/normalization/detail/packing.hpp" namespaceserif::solver::normalization { namespacedetail { template<typenameRulesT,typenameLayoutT,typenameScalesT,discretization::blocks::RepresentedValueKindKind,typename...Coordinates> [[nodiscard]]constevalboolcan_prepare_coordinates(utils::dependencies::KeyList<Coordinates...>) { return(requires { coordinate_computation<Kind, Coordinates, LayoutT, ScalesT>(utils::dependencies::bound_type_t<RulesT, Coordinates>{}); }&&...); } template<typenameRulesT,typenameLayoutT,typenameScalesT,discretization::blocks::RepresentedValueKindKind,typename...Coordinates> [[nodiscard]]autocoordinate_computations(utils::dependencies::KeyList<Coordinates...>) { returnstd::tuple{coordinate_computation<Kind, Coordinates, LayoutT, ScalesT>(utils::dependencies::bound_type_t<RulesT, Coordinates>{})...}; } template<typename...Values,typename...Residuals> [[nodiscard]]autopacking_computation(utils::dependencies::KeyList<Values...>,utils::dependencies::KeyList<Residuals...>) { usingnamespaceutils::dependencies; usingdiscretization::blocks::RepresentedValueKind; returnmake_computation<keys::Normalization,InputList<keys::Factors<RepresentedValueKind::value,Values>...,keys::Factors<RepresentedValueKind::residual, Residuals>...>>( [](constauto&...factors)->std::expected<DiagonalNormalization,std::string> { conststd::array<std::span<constdouble>,sizeof...(Values)+sizeof...(Residuals)>coordinates{factors...}; conststd::span<conststd::span<constdouble>>blocks{coordinates}; returnpack_normalization(blocks.first(sizeof...(Values)),blocks.subspan(sizeof...(Values))); }); } } template<typenamePlanT,typenameLayoutT,typenameScalesT=StellarReferenceScales> conceptNormalizationPreparable=CoordinateLayoutType<LayoutT>&& CompleteNormalizationFor<PlanT, typename std::remove_cvref_t<LayoutT>::Values,typenamestd::remove_cvref_t<LayoutT>::Residuals>&& detail::can_prepare_coordinates<typename std::remove_cvref_t<PlanT>::Values,std::remove_cvref_t<LayoutT>,std::remove_cvref_t<ScalesT>,discretization::blocks::RepresentedValueKind::value>(typenamestd::remove_cvref_t<LayoutT>::Values{})&& detail::can_prepare_coordinates<typenamestd::remove_cvref_t<PlanT>::Residuals,std::remove_cvref_t<LayoutT>,std::remove_cvref_t<ScalesT>,discretization::blocks::RepresentedValueKind::residual>(typenamestd::remove_cvref_t<LayoutT>::Residuals{}); template<typenamePlanT,typenameScalesT=StellarReferenceScales,typenameLayoutT> requiresNormalizationPreparable<PlanT,LayoutT,ScalesT> [[nodiscard]]automake_normalization_computations(constLayoutT&) { usingdiscretization::blocks::RepresentedValueKind; usingPlan=std::remove_cvref_t<PlanT>; usingLayout=std::remove_cvref_t<LayoutT>; usingScales=std::remove_cvref_t<ScalesT>; returnstd::tuple_cat( detail::coordinate_computations<typename Plan::Values, Layout, Scales, RepresentedValueKind::value>(typenameLayout::Values{}), detail::coordinate_computations<typename Plan::Residuals, Layout, Scales, RepresentedValueKind::residual>(typenameLayout::Residuals{}), std::tuple{detail::packing_computation(typenameLayout::Values{},typenameLayout::Residuals{})}); } }