module; #include #include export module mean_field:eos.concepts; export import :eos.relations; export namespace mean_field::eos { namespace detail { template struct ImplementsRelation : std::false_type { }; template < typename EquationOfState, typename Output, typename... Inputs> struct ImplementsRelation< EquationOfState, Relation< Output, Inputs...>> : std::bool_constant < requires( const std::remove_cvref_t &equationOfState, QuantityValue... inputValues ) { {equationOfState.evaluate(Relation{}, inputValues...)} ->std::same_as>; }>{}; template struct ImplementsRelationCatalog : std::false_type { }; template struct ImplementsRelationCatalog> : std::bool_constant<(ImplementsRelation::value && ...)> { }; template struct IsEquationOfStateModel : std::false_type { }; template struct IsEquationOfStateModel::Relations>> : std::bool_constant< ValidRelationCatalog::Relations> && ImplementsRelationCatalog< std::remove_cvref_t, typename std::remove_cvref_t::Relations>::value> { }; template struct ImplementsPartialDerivative : std::false_type { }; template < typename EquationOfState, typename Output, typename... Inputs, typename InputQuantity> struct ImplementsPartialDerivative< EquationOfState, Relation< Output, Inputs...>, InputQuantity> : std::bool_constant < (std::same_as< InputQuantity, Inputs> || ...) && requires( const std::remove_cvref_t &equationOfState, QuantityValue... inputValues ) { {equationOfState .partialDerivative(Relation{}, WithRespectTo{}, inputValues...)} ->std::same_as>; }>{}; } // namespace detail template concept EquationOfStateModel = detail::IsEquationOfStateModel::value; template concept SupportsRelation = EquationOfStateModel && ThermodynamicRelationType && relationCatalogContains::Relations, RelationType>; template concept SupportsPartialDerivative = SupportsRelation && ThermodynamicQuantityType && detail::ImplementsPartialDerivative::value; template concept StructureSeedEquationOfState = EquationOfStateModel && SupportsRelation; template concept BarotropicClosureEquationOfState = EquationOfStateModel && SupportsRelation && SupportsPartialDerivative; template concept PressureForceEquationOfState = EquationOfStateModel && SupportsRelation && SupportsPartialDerivative; } // namespace mean_field::eos