plan.hpp concepts type_traits serif/dimensions/quantities.hpp serif/discretization/blocks/base.hpp serif/solver/normalization/metrics.hpp serif/solver/normalization/dimensionless.hpp serif/utils/dependencies/binding.hpp src/include/serif/solver/normalization/detail/factor_computations.hpp src/include/serif/solver/normalization/normalization.hpp src/include/serif/solver/normalization/physical_coordinates.hpp src/include/serif/utils/serialize/numerics.hpp serif::solver::normalization::NormalizationPrescriptionTag serif::solver::normalization::IdentityCoordinate serif::solver::normalization::PhysicalRieszCoordinate serif::solver::normalization::DimensionlessRieszCoordinate serif::solver::normalization::WithPointRows serif::solver::normalization::RuntimePreparedCoordinate serif::solver::normalization::NormalizationPlan serif::solver::normalization::detail::RuleKeys< utils::dependencies::Bindings< Rules... > > serif::solver::normalization::detail::MethodSupports serif::solver::normalization::detail::MethodSupports< IdentityCoordinate, KeyT, Kind > serif::solver::normalization::detail::MethodSupports< PhysicalRieszCoordinate< QuantityT, MetricT >, KeyT, Kind > serif::solver::normalization::detail::MethodSupports< WithPointRows< PhysicalRieszCoordinate< QuantityT, MetricT >, PointQuantityT, SelectionT >, KeyT, discretization::blocks::RepresentedValueKind::residual > serif::solver::normalization::detail::MethodSupports< DimensionlessRieszCoordinate< QuantityT, MetricT, Geometry >, KeyT, Kind > serif::solver::normalization::detail::MethodSupports< WithPointRows< DimensionlessRieszCoordinate< QuantityT, MetricT, Geometry >, PointQuantityT, SelectionT >, KeyT, discretization::blocks::RepresentedValueKind::residual > serif::solver::normalization::detail::MethodSupports< RuntimePreparedCoordinate< PrescriptionT >, KeyT, Kind > serif::solver::normalization::detail::ValidRules serif::solver::normalization::detail::ValidRules< utils::dependencies::Bindings< Rules... >, Kind > serif serif::solver serif::solver::normalization serif::solver::normalization::detail #pragmaonce #include<concepts> #include<type_traits> #include"serif/dimensions/quantities.hpp" #include"serif/discretization/blocks/base.hpp" #include"serif/solver/normalization/metrics.hpp" #include"serif/solver/normalization/dimensionless.hpp" #include"serif/utils/dependencies/binding.hpp" namespaceserif::solver::normalization { structNormalizationPrescriptionTag { }; template<typenameCandidate> conceptNormalizationPrescription=std::derived_from<std::remove_cvref_t<Candidate>,NormalizationPrescriptionTag>; structIdentityCoordinatefinal { }; template<dimensions::PhysicalQuantityTypeQuantityT,typenameMetricKeyT> structPhysicalRieszCoordinatefinal { usingQuantity=QuantityT; usingMetric=MetricKeyT; }; template<dimensions::PhysicalQuantityTypeQuantityT,typenameMetricKeyT,ReferenceGeometryGeometry=DimensionlessMetricGeometry<MetricKeyT>::value> structDimensionlessRieszCoordinatefinal{ usingQuantity=QuantityT; usingMetric=MetricKeyT; staticconstexprReferenceGeometrygeometry=Geometry; }; template<typenameVolumeMethodT,dimensions::PhysicalQuantityTypePointQuantityT,typenameSelectionKeyT> structWithPointRowsfinal { usingSelection=SelectionKeyT; }; template<NormalizationPrescriptionPrescriptionT> structRuntimePreparedCoordinatefinal { usingPrescription=std::remove_cvref_t<PrescriptionT>; }; template<typenameValueRulesT,typenameResidualRulesT> structNormalizationPlanfinal { usingValues=ValueRulesT; usingResiduals=ResidualRulesT; }; namespacedetail { template<typenameRulesT> structRuleKeys; template<typename...Rules> structRuleKeys<utils::dependencies::Bindings<Rules...>> { usingType=utils::dependencies::KeyList<typenameRules::Key...>; }; template<typename...Declared,typename...Required> [[nodiscard]]constevalboolexact_coordinates(utils::dependencies::KeyList<Declared...>,utils::dependencies::KeyList<Required...>) { returnsizeof...(Declared)==sizeof...(Required)&&(utils::dependencies::ContainsKey<Required,utils::dependencies::KeyList<Declared...>>&&...); } template<typenameKeyT,typenameQuantityT,discretization::blocks::RepresentedValueKindKind> [[nodiscard]]constevalboolquantity_matches() { ifconstexpr(Kind==discretization::blocks::RepresentedValueKind::value&&requires { typenameKeyT::Quantity; }) { returnstd::same_as<QuantityT,typenameKeyT::Quantity>; } elseifconstexpr(Kind==discretization::blocks::RepresentedValueKind::residual&&requires { typenameKeyT::ResidualQuantity; }) { returnstd::same_as<QuantityT,typenameKeyT::ResidualQuantity>; } else { returntrue; } } template<typenameMethodT,typenameKeyT,discretization::blocks::RepresentedValueKindKind> structMethodSupports:std::false_type { }; template<typenameKeyT,discretization::blocks::RepresentedValueKindKind> structMethodSupports<IdentityCoordinate,KeyT,Kind>:std::true_type { }; template<typenameQuantityT,typenameMetricT,typenameKeyT,discretization::blocks::RepresentedValueKindKind> structMethodSupports<PhysicalRieszCoordinate<QuantityT,MetricT>,KeyT,Kind>:std::bool_constant<MetricFor<MetricT,KeyT>&&quantity_matches<KeyT,QuantityT,Kind>()> { }; template<typenameQuantityT,typenameMetricT,typenamePointQuantityT,typenameSelectionT,typenameKeyT> structMethodSupports<WithPointRows<PhysicalRieszCoordinate<QuantityT,MetricT>,PointQuantityT,SelectionT>,KeyT,discretization::blocks::RepresentedValueKind::residual>:MethodSupports<PhysicalRieszCoordinate<QuantityT,MetricT>,KeyT,discretization::blocks::RepresentedValueKind::residual> { }; template<typenameQuantityT,typenameMetricT,ReferenceGeometryGeometry,typenameKeyT,discretization::blocks::RepresentedValueKindKind> structMethodSupports<DimensionlessRieszCoordinate<QuantityT,MetricT,Geometry>,KeyT,Kind>:std::bool_constant< MetricFor<MetricT,KeyT>&&quantity_matches<KeyT,QuantityT,Kind>()&& (Geometry==ReferenceGeometry::volume||Geometry==ReferenceGeometry::surface||Geometry==ReferenceGeometry::algebraic)&& (!std::same_as<MetricT,UnitMetric>||Geometry==ReferenceGeometry::algebraic)>{ }; template<typenameQuantityT,typenameMetricT,ReferenceGeometryGeometry,typenamePointQuantityT,typenameSelectionT,typenameKeyT> structMethodSupports<WithPointRows<DimensionlessRieszCoordinate<QuantityT,MetricT,Geometry>,PointQuantityT,SelectionT>,KeyT,discretization::blocks::RepresentedValueKind::residual>: MethodSupports<DimensionlessRieszCoordinate<QuantityT,MetricT,Geometry>,KeyT,discretization::blocks::RepresentedValueKind::residual>{ }; template<typenamePrescriptionT,typenameKeyT,discretization::blocks::RepresentedValueKindKind> structMethodSupports<RuntimePreparedCoordinate<PrescriptionT>,KeyT,Kind>:std::true_type { }; template<typenameRulesT,discretization::blocks::RepresentedValueKindKind> structValidRules:std::false_type { }; template<typename...Rules,discretization::blocks::RepresentedValueKindKind> structValidRules<utils::dependencies::Bindings<Rules...>,Kind>:std::bool_constant<utils::dependencies::IsBindings<utils::dependencies::Bindings<Rules...>>&&(MethodSupports<typenameRules::Target,typenameRules::Key,Kind>::value&&...)> { }; template<typenameCandidate> inlineconstexprboolvalid_plan=false; template<typenameValuesT,typenameResidualsT> inlineconstexprboolvalid_plan<NormalizationPlan<ValuesT, ResidualsT>>=ValidRules<ValuesT, discretization::blocks::RepresentedValueKind::value>::value&&ValidRules<ResidualsT, discretization::blocks::RepresentedValueKind::residual>::value; } template<typenameCandidate> conceptNormalizationPlanType=detail::valid_plan<std::remove_cvref_t<Candidate>>; template<typenamePlanT,typenameValuesT,typenameResidualsT> conceptCompleteNormalizationFor=NormalizationPlanType<PlanT>&&utils::dependencies::IsKeyList<ValuesT>&&utils::dependencies::IsKeyList<ResidualsT>&& detail::exact_coordinates(typenamedetail::RuleKeys<typenamestd::remove_cvref_t<PlanT>::Values>::Type{},std::remove_cvref_t<ValuesT>{})&& detail::exact_coordinates(typenamedetail::RuleKeys<typenamestd::remove_cvref_t<PlanT>::Residuals>::Type{},std::remove_cvref_t<ResidualsT>{}); }