module; #include #include #include export module mean_field:eos.evaluation; export import :eos.concepts; export namespace mean_field::eos { enum class EvaluationErrorCode { unsupported_relation, unsupported_derivative, wrong_input_count, wrong_input_quantity, nonfinite_input, outside_domain, nonfinite_result }; class EvaluationError final : public std::domain_error { public: explicit EvaluationError( const EvaluationErrorCode code, std::string message ) : std::domain_error(std::move(message)), m_code(code) { } [[nodiscard]] EvaluationErrorCode code() const noexcept { return m_code; } private: EvaluationErrorCode m_code; }; template < ThermodynamicQuantityType OutputQuantity, EquationOfStateModel EquationOfState, QuantityValueType... InputValues> requires SupportsRelation< EquationOfState, Relation< OutputQuantity, QuantityOfT...>> [[nodiscard]] constexpr QuantityValue evaluate( const EquationOfState &equationOfState, const InputValues... inputValues ) noexcept(noexcept(equationOfState .evaluate( Relation< OutputQuantity, QuantityOfT...>{}, inputValues... ))) { return equationOfState.evaluate(Relation...>{}, inputValues...); } template < ThermodynamicQuantityType OutputQuantity, ThermodynamicQuantityType InputQuantity, EquationOfStateModel EquationOfState, QuantityValueType... InputValues> requires SupportsPartialDerivative< EquationOfState, Relation< OutputQuantity, QuantityOfT...>, InputQuantity> [[nodiscard]] constexpr PartialDerivative< OutputQuantity, InputQuantity> partialDerivative( const EquationOfState &equationOfState, const InputValues... inputValues ) noexcept(noexcept(equationOfState .partialDerivative( Relation< OutputQuantity, QuantityOfT...>{}, WithRespectTo{}, inputValues... ))) { return equationOfState.partialDerivative( Relation...>{}, WithRespectTo{}, inputValues... ); } } // namespace mean_field::eos