10template<
typename M,
typename T,
typename U>
12 { m.calc_lngamma_resid(t,u) } -> std::same_as<Eigen::ArrayXd>;
14template<
typename M,
typename T,
typename U>
16 { m.calc_lngamma_comb(t,u) } -> std::same_as<Eigen::ArrayXd>;
34 const multifluid_t m_multifluid;
36 const std::vector<double> b;
42 b(spec.at(
"activity").at(
"options").at(
"b").get<std::vector<double>>()),
43 u(spec.at(
"activity").at(
"options").at(
"u")){}
47 return std::visit([T, &molefrac](
const auto& mod){
return mod(T, molefrac); }, m_activity);
51 return std::visit([T, &molefrac](
const auto& mod) -> Eigen::ArrayXd {
53 return mod.calc_lngamma_resid(T, molefrac);
62 return std::visit([T, &molefrac](
const auto& mod) -> Eigen::ArrayXd{
64 return mod.calc_lngamma_comb(T, molefrac);
72 template<
class VecType>
73 auto R(
const VecType& molefrac)
const {
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);
80 if (
static_cast<long>(b.size()) != molefrac.size()){
86 const auto& Tcvec = m_multifluid.redfunc.Tc;
87 const auto& vcvec = m_multifluid.redfunc.vc;
89 auto rhor = m_multifluid.redfunc.get_rhor(molefrac);
90 auto Tr = m_multifluid.redfunc.get_Tr(molefrac);
92 auto delta_ref =
forceeval(1.0/(u*bm*rhor));
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)));
98 summer += molefrac(i)*(m_multifluid.alphar_taudeltai(tau, delta_ref, i) - m_multifluid.alphar_taudeltai(tau_i, delta_i_ref, i));
100 return forceeval(log(1.0+rho*bm)/log(1.0+1.0/u)*(gER_over_RT - summer));
103 template <
typename TType,
typename RhoType,
typename MoleFractions>
104 auto alphar(
const TType& T,
const RhoType& rho,
const MoleFractions& molefrac)
const {
106 m_multifluid.alphar(T, rho, molefrac)
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.
MultifluidPlusActivity(const nlohmann::json &spec)
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
auto R(const VecType &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 get_R_gas()
< Gas constant, according to CODATA 2019, in the given number type
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 ....