algebra.cpp concepts span type_traits utility mfem/linalg/densemat.hpp serif/solver/normalization/scales.hpp serif/backend/mfem/solver/normalization/operators.hpp #include<concepts> #include<span> #include<type_traits> #include<utility> #include<mfem/linalg/densemat.hpp> #include"serif/solver/normalization/scales.hpp" #include"serif/backend/mfem/solver/normalization/operators.hpp" namespace { namespacedimensions=serif::dimensions; namespacenormalization=serif::solver::normalization; namespacebackend=normalization::backend::mfem; usingMap=normalization::DiagonalNormalization; template<typenameQuantity> conceptHasStellarScale=requires(constnormalization::StellarReferenceScales&scales) { {normalization::characteristic_scale(scales,Quantity{})}->std::same_as<dimensions::QuantityValue<Quantity>>; }; static_assert(HasStellarScale<dimensions::Mass>); static_assert(HasStellarScale<dimensions::SpecificEnthalpy>); static_assert(HasStellarScale<dimensions::GravitationalPotential>); static_assert(HasStellarScale<dimensions::InverseTimeSquared>); static_assert(!HasStellarScale<dimensions::Temperature>); static_assert(!HasStellarScale<int>); static_assert(!std::convertible_to<double,dimensions::QuantityValue<dimensions::GravitationalConstant>>); static_assert(std::equality_comparable<normalization::StellarReferenceScales>); static_assert(!std::default_initializable<Map>); static_assert(std::same_as<decltype(std::declval<constMap&>().state_factors()),std::span<constdouble>>); static_assert(std::same_as<decltype(std::declval<constMap&>().residual_factors()),std::span<constdouble>>); static_assert(std::constructible_from<backend::ScaledJacobianOperator,constmfem::DenseMatrix&,constMap&>); static_assert(std::constructible_from<backend::ScaledJacobianOperator,constmfem::DenseMatrix&,Map&&>); static_assert(!std::constructible_from<backend::ScaledJacobianOperator,mfem::DenseMatrix&&,constMap&>); static_assert(!std::constructible_from<backend::ScaledJacobianOperator,constmfem::DenseMatrix&&,constMap&>); static_assert(std::constructible_from<backend::ScaledInverseOperator,constmfem::DenseMatrix&,constMap&>); static_assert(!std::constructible_from<backend::ScaledInverseOperator,mfem::DenseMatrix&&,constMap&>); static_assert(!std::constructible_from<backend::ScaledInverseOperator,constmfem::DenseMatrix&&,constMap&>); static_assert(!std::is_copy_assignable_v<backend::ScaledJacobianOperator>); static_assert(!std::is_move_assignable_v<backend::ScaledJacobianOperator>); static_assert(std::constructible_from<backend::ScaledPreconditioner,mfem::Solver&,constbackend::ScaledJacobianOperator&>); static_assert(!std::constructible_from<backend::ScaledPreconditioner,mfem::Solver&&,constbackend::ScaledJacobianOperator&>); static_assert(!std::constructible_from<backend::ScaledPreconditioner,mfem::Solver&,backend::ScaledJacobianOperator&&>); static_assert(!std::constructible_from<backend::ScaledPreconditioner,mfem::Solver&,constbackend::ScaledJacobianOperator&&>); }