metrics.hpp concepts type_traits serif/discretization/blocks/concepts.hpp serif/utils/dependencies/key_list_operations.hpp src/include/serif/backend/mfem/solver/normalization/metric_computations.hpp src/include/serif/solver/normalization/dimensionless.hpp src/include/serif/solver/normalization/plan.hpp serif::solver::normalization::UnitMetric serif::solver::normalization::ReferenceVolumeMetric serif::solver::normalization::MetricCoordinates serif::solver::normalization::MetricCoordinates< MetricT, std::void_t< typename MetricT::Coordinates > > serif::solver::normalization::MetricCoordinates< UnitMetric > serif::solver::normalization::MetricCoordinates< geometry::deformation::keys::SurfaceMetric > serif serif::geometry serif::geometry::deformation serif::geometry::deformation::keys serif::solver serif::solver::normalization serif::solver::normalization::detail #pragmaonce #include<concepts> #include<type_traits> #include"serif/discretization/blocks/concepts.hpp" #include"serif/utils/dependencies/key_list_operations.hpp" namespaceserif::geometry::deformation::keys { structSurfaceMetric; } namespaceserif::solver::normalization { structUnitMetricfinal { }; template<discretization::blocks::SpatialTermTermT> structReferenceVolumeMetricfinal { usingCoordinates=utils::dependencies::KeyList<TermT>; }; template<typenameMetricT,typename=void> structMetricCoordinates { usingType=utils::dependencies::KeyList<>; }; template<typenameMetricT> structMetricCoordinates<MetricT,std::void_t<typenameMetricT::Coordinates>> { usingType=typenameMetricT::Coordinates; }; template<> structMetricCoordinates<UnitMetric> { usingType=utils::dependencies::KeyList<discretization::blocks::surface_deformation::shape_equilibrium>; }; template<> structMetricCoordinates<geometry::deformation::keys::SurfaceMetric> { usingType=utils::dependencies::KeyList<discretization::blocks::surface_deformation::coefficients, discretization::blocks::surface_deformation::shape_equilibrium>; }; namespacedetail { template<typenameCoordinateT> [[nodiscard]]constevalautometric_term() { ifconstexpr(requires { typenameCoordinateT::Border; }) { returnstd::type_identity<typenameCoordinateT::Border>{}; } elseifconstexpr(requires { typenameCoordinateT::Test; }) { returnstd::type_identity<typenameCoordinateT::Test>{}; } else { returnstd::type_identity<CoordinateT>{}; } } } template<typenameMetricT,typenameCoordinateT> conceptMetricFor=(std::same_as<MetricT,UnitMetric>&&discretization::blocks::GlobalScalarTerm<typename decltype(detail::metric_term<CoordinateT>())::type>)|| utils::dependencies::ContainsKey<typename decltype(detail::metric_term<CoordinateT>())::type,typenameMetricCoordinates<MetricT>::Type>; }