diff --git a/include/teqp/models/multifluid.hpp b/include/teqp/models/multifluid.hpp index 4feb68ea07842163e4f327b6a1b8ba066773591a..322f53303f30aa7c4f0b33e32d5840b94cd4ac9d 100644 --- a/include/teqp/models/multifluid.hpp +++ b/include/teqp/models/multifluid.hpp @@ -43,7 +43,6 @@ public: resulttype alphar = 0.0; auto N = molefracs.size(); for (auto i = 0; i < N; ++i) { - if (molefracs[i] == 0.0) { continue; } alphar = alphar + molefracs[i] * EOSs[i].alphar(tau, delta); } return alphar; @@ -465,31 +464,6 @@ struct PowIUnaryFunctor { } }; -template<typename... Args> -class EOSTermContainer { -public: - using varEOSTerms = std::variant<Args...>; -private: - std::vector<varEOSTerms> coll; -public: - - auto size() const { return coll.size(); } - - template<typename Instance> - auto add_term(Instance&& instance) { - coll.emplace_back(std::move(instance)); - } - - template <class Tau, class Delta> - auto alphar(const Tau& tau, const Delta& delta) const { - std::common_type_t <Tau, Delta> ar = 0.0; - for (auto& term : coll) { - std::visit([&](auto& term) { ar = ar + term.alphar(tau, delta); }, term); - } - return ar; - } -}; - class PowerEOSTerm { public: Eigen::ArrayXd n, t, d, c, l; @@ -561,6 +535,42 @@ public: } }; + + +template<typename... Args> +class EOSTermContainer { +public: + using varEOSTerms = std::variant<Args...>; +private: + std::vector<varEOSTerms> coll; +public: + + auto size() const { return coll.size(); } + + template<typename Instance> + auto add_term(Instance&& instance) { + coll.emplace_back(std::move(instance)); + } + + template <class Tau, class Delta> + auto alphar(const Tau& tau, const Delta& delta) const { + std::common_type_t <Tau, Delta> ar = 0.0; + for (const auto& term : coll) { + auto contrib = std::visit([&](auto& t) { return t.alphar(tau, delta); }, term); + if (std::holds_alternative<NonAnalyticEOSTerm>(term)) { + double dbl = getbaseval(abs(contrib)); + if (std::isfinite(dbl)) { + ar = ar + contrib; + } + } + else { + ar = ar + contrib; + } + } + return ar; + } +}; + using EOSTerms = EOSTermContainer<PowerEOSTerm, GaussianEOSTerm, NonAnalyticEOSTerm, Lemmon2005EOSTerm, GaoBEOSTerm>; inline auto get_EOS_terms(const std::string& coolprop_root, const std::string& name) diff --git a/include/teqp/types.hpp b/include/teqp/types.hpp index f0ffc4155d64c9f68907e9dd076d990c048401b6..f315d2116760a3bae1e1bfa1086bbbc03f0cc585 100644 --- a/include/teqp/types.hpp +++ b/include/teqp/types.hpp @@ -26,4 +26,16 @@ auto forceeval(T&& expr) else { return expr; } +} + +template<typename T> +auto getbaseval(T&& expr) +{ + using namespace autodiff::detail; + if constexpr (isDual<T> || isExpr<T>) { + return val(expr); + } + else { + return expr; + } } \ No newline at end of file