10template<
typename NumType>
13 template<
typename TType,
typename MoleFractions>
14 auto operator () (
const TType& ,
const MoleFractions& molefracs)
const {
15 std::common_type_t<TType,
decltype(molefracs[0])> val = 0.0;
40template<
typename NumType>
44 const std::vector<double>
b;
45 const Eigen::ArrayXXd
m,
n;
48 template<
typename TType,
typename MoleFractions>
49 auto combinatorial(
const TType& ,
const MoleFractions& molefracs)
const {
50 if (
b.size() !=
static_cast<std::size_t
>(molefracs.size())){
54 using TYPE = std::common_type_t<TType,
decltype(molefracs[0])>;
57 for (
auto i = 0U; i < molefracs.size(); ++i){
59 Vtot += molefracs[i]*v_i;
63 for (
auto i = 0U; i < molefracs.size(); ++i){
68 auto phi_i_over_z_i = v_i/Vtot;
69 summer += molefracs[i]*log(phi_i_over_z_i);
74 template<
typename TType>
75 auto get_Aij(std::size_t i, std::size_t j,
const TType& T)
const{
79 template<
typename TType,
typename MoleFractions>
80 auto total(
const TType& T,
const MoleFractions& molefracs)
const {
82 using TYPE = std::common_type_t<TType,
decltype(molefracs[0])>;
84 for (
auto i = 0U; i < molefracs.size(); ++i){
87 for (
auto j = 0U; j < molefracs.size(); ++j){
90 auto Omega_ji = v_j/v_i*exp(-Aij/T);
91 summerj += molefracs[j]*Omega_ji;
93 summer += molefracs[i]*log(summerj);
99 template<
typename TType,
typename MoleFractions>
100 auto operator () (
const TType& T,
const MoleFractions& molefracs)
const {
126template<
typename NumType>
130 const std::vector<double>
c;
134 template<
typename TType,
typename MoleFractions>
135 auto operator () (
const TType& ,
const MoleFractions& molefracs)
const {
136 if (molefracs.size() != 2){
139 std::decay_t<std::common_type_t<TType,
decltype(molefracs[0])>> out =
c[0]*molefracs[0]*molefracs[1]*(
c[1] +
c[2]*molefracs[1]);
148 std::string type = armodel.at(
"type");
149 if (type ==
"Wilson"){
150 std::vector<double> b = armodel.at(
"b");
159 else if (type ==
"binaryInvariant"){
160 std::vector<double> c = armodel.at(
"c");
163 else if (type ==
"COSMO-SAC-2010"){
164 std::vector<double> A_COSMOSAC_A2 = armodel.at(
"A_COSMOSAC / A^2");
165 std::vector<double> V_COSMOSAC_A3 = armodel.at(
"V_COSMOSAC / A^3");
166 std::vector<COSMOSAC::FluidSigmaProfiles> profiles;
167 for (
auto& el : armodel.at(
"profiles")){
169 auto get_ = [](
const auto& j){
171 j.at(
"sigma / e/A^2").template get<std::vector<double>>(),
172 j.at(
"p(sigma)*A / A^2").template get<std::vector<double>>()
175 prof.
nhb = get_(el.at(
"nhb"));
176 prof.
oh = get_(el.at(
"oh"));
177 prof.
ot = get_(el.at(
"ot"));
178 profiles.push_back(prof);
181 if (armodel.contains(
"constants")){
182 const auto &jconstants = armodel.at(
"constants");
183 constants.
A_ES = jconstants.value(
"A_ES / kcal A^4 /(mol e^2)", constants.
A_ES);
184 constants.
B_ES = jconstants.value(
"B_ES / kcal A^4 K^2/(mol e^2)", constants.
B_ES);
187 std::cout << constants.
A_ES << std::endl;
188 std::cout << constants.
B_ES << std::endl;
auto operator()(const TType &, const MoleFractions &molefracs) const
BinaryInvariantResidualHelmholtzOverRT(const std::vector< double > &c)
const std::vector< double > c
auto operator()(const TType &, const MoleFractions &molefracs) const
const std::vector< double > b
auto combinatorial(const TType &, const MoleFractions &molefracs) const
auto total(const TType &T, const MoleFractions &molefracs) const
auto get_Aij(std::size_t i, std::size_t j, const TType &T) const
auto operator()(const TType &T, const MoleFractions &molefracs) const
WilsonResidualHelmholtzOverRT(const std::vector< double > &b, const Eigen::ArrayXXd &m, const Eigen::ArrayXXd &n)
ResidualHelmholtzOverRTVariant ares_model_factory(const nlohmann::json &armodel)
std::variant< NullResidualHelmholtzOverRT< double >, WilsonResidualHelmholtzOverRT< double >, BinaryInvariantResidualHelmholtzOverRT< double >, COSMOSAC::COSMO3 > ResidualHelmholtzOverRTVariant
SigmaProfile ot
The profile for the "other" segments.
SigmaProfile oh
The profile for the OH-bonding segments.
SigmaProfile nhb
The profile for the non-hydrogen-bonding segments.