teqp 0.22.0
Loading...
Searching...
No Matches
multifluid_activity.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "teqp/types.hpp"
4
7
9
10template<typename M, typename T, typename U>
11concept CallableLnGammaResid = requires(M m, T t, U u) {
12 { m.calc_lngamma_resid(t,u) } -> std::same_as<Eigen::ArrayXd>;
13};
14template<typename M, typename T, typename U>
15concept CallableLnGammaComb = requires(M m, T t, U u) {
16 { m.calc_lngamma_comb(t,u) } -> std::same_as<Eigen::ArrayXd>;
17};
18
19static_assert(!CallableLnGammaResid<NullResidualHelmholtzOverRT<double>, double, Eigen::ArrayXd>);
20static_assert(!CallableLnGammaComb<NullResidualHelmholtzOverRT<double>, double, Eigen::ArrayXd>);
21
24
32private:
33 using multifluid_t = decltype(multifluidfactory(nlohmann::json{}));
34 const multifluid_t m_multifluid;
35 const ResidualHelmholtzOverRTVariant m_activity;
36 const std::vector<double> b;
37 const double u;
38public:
39 MultifluidPlusActivity(const nlohmann::json &spec) :
40 m_multifluid(multifluidfactory(spec.at("multifluid"))),
41 m_activity(ares_model_factory(spec.at("activity").at("aresmodel"))),
42 b(spec.at("activity").at("options").at("b").get<std::vector<double>>()),
43 u(spec.at("activity").at("options").at("u")){}
44
46 auto calc_gER_over_RT(double T, const Eigen::ArrayXd& molefrac) const {
47 return std::visit([T, &molefrac](const auto& mod){return mod(T, molefrac); }, m_activity);
48 }
50 auto calc_lngamma_resid(const double T, const Eigen::ArrayXd& molefrac) const {
51 return std::visit([T, &molefrac](const auto& mod) -> Eigen::ArrayXd {
52 if constexpr (CallableLnGammaResid<decltype(mod), decltype(T), decltype(molefrac)>){
53 return mod.calc_lngamma_resid(T, molefrac);
54 }
55 else{
56 throw teqp::NotImplementedError("this method is not implemented");
57 }
58 }, m_activity);
59 }
61 Eigen::ArrayXd calc_lngamma_comb(const double T, const Eigen::ArrayXd& molefrac) const {
62 return std::visit([T, &molefrac](const auto& mod) -> Eigen::ArrayXd{
63 if constexpr (CallableLnGammaComb<decltype(mod), decltype(T), decltype(molefrac)>){
64 return mod.calc_lngamma_comb(T, molefrac);
65 }
66 else{
67 throw teqp::NotImplementedError("this method is not implemented");
68 }
69 }, m_activity);
70 }
71
72 template<class VecType>
73 auto R(const VecType& molefrac) const {
75 }
76
77 template <typename TType, typename RhoType, typename MoleFractions>
78 auto alphar_activity(const TType& T, const RhoType& rho, const MoleFractions& molefrac) const {
79 auto gER_over_RT = std::visit([T, &molefrac](const auto& mod){return mod(T, molefrac); }, m_activity); // dimensionless
80 if (static_cast<long>(b.size()) != molefrac.size()){
81 throw teqp::InvalidArgument("Size of mole fractions is incorrect");
82 }
83
84 auto bm = contiguous_dotproduct(b, molefrac);
85
86 const auto& Tcvec = m_multifluid.redfunc.Tc;
87 const auto& vcvec = m_multifluid.redfunc.vc;
88
89 auto rhor = m_multifluid.redfunc.get_rhor(molefrac);
90 auto Tr = m_multifluid.redfunc.get_Tr(molefrac);
91 auto tau = forceeval(Tr/T);
92 auto delta_ref = forceeval(1.0/(u*bm*rhor));
93
94 std::decay_t<std::common_type_t<TType, decltype(molefrac[0])>> summer = 0.0;
95 for (auto i = 0; i < molefrac.size(); ++i){
96 auto delta_i_ref = forceeval(1.0/(u*b[i]/vcvec(i)));
97 auto tau_i = forceeval(Tcvec(i)/T);
98 summer += molefrac(i)*(m_multifluid.alphar_taudeltai(tau, delta_ref, i) - m_multifluid.alphar_taudeltai(tau_i, delta_i_ref, i));
99 }
100 return forceeval(log(1.0+rho*bm)/log(1.0+1.0/u)*(gER_over_RT - summer));
101 }
102
103 template <typename TType, typename RhoType, typename MoleFractions>
104 auto alphar(const TType& T, const RhoType& rho, const MoleFractions& molefrac) const {
105 return forceeval(
106 m_multifluid.alphar(T, rho, molefrac)
107 + alphar_activity(T, rho, molefrac)
108 );
109 }
110};
111
112}; // namespace teqp
Eigen::ArrayXd calc_lngamma_comb(const double T, const Eigen::ArrayXd &molefrac) const
Calculate the value of array from the AC model without any of the AD types.
auto calc_lngamma_resid(const double T, const Eigen::ArrayXd &molefrac) const
Calculate the value of array from the AC model without any of the AD types.
auto alphar(const TType &T, const RhoType &rho, const MoleFractions &molefrac) const
auto calc_gER_over_RT(double T, const Eigen::ArrayXd &molefrac) const
Calculate the dimensionless value of from the AC model.
auto alphar_activity(const TType &T, const RhoType &rho, const MoleFractions &molefrac) const
ResidualHelmholtzOverRTVariant ares_model_factory(const nlohmann::json &armodel)
std::variant< NullResidualHelmholtzOverRT< double >, WilsonResidualHelmholtzOverRT< double >, BinaryInvariantResidualHelmholtzOverRT< double >, COSMOSAC::COSMO3 > ResidualHelmholtzOverRTVariant
auto multifluidfactory(const nlohmann::json &spec)
Load a model from a JSON data structure.
auto forceeval(T &&expr)
Definition types.hpp:52
auto get_R_gas()
< Gas constant, according to CODATA 2019, in the given number type
Definition constants.hpp:22
auto contiguous_dotproduct(const auto &x, const auto &y)
Take the dot-product of two vector-like objects that have contiguous memory and support the ....
Definition types.hpp:235