31 std::vector<double>
c;
47 virtual double term(
double tau, std::size_t itau) = 0;
50 for (
int k = 0; k < 5; ++k)
51 terms[k] =
term(tau, k);
76 double term(
double tau, std::size_t itau)
override;
77 void calc_all_terms(
double tau, std::array<double, 5>& terms)
override;
90 double term(
double tau, std::size_t itau)
override;
91 void calc_all_terms(
double tau, std::array<double, 5>& terms)
override;
104 double term(
double tau, std::size_t itau)
override;
105 void calc_all_terms(
double tau, std::array<double, 5>& terms)
override;
114 std::vector<double>
Tc,
121 std::vector<std::vector<double>>
k;
123 std::vector<shared_ptr<AbstractCubicAlphaFunction>>
alpha;
138 for (
int i = 0; i <
N; ++i) {
148 for (
int i = 0; i <
N; ++i) {
167 const std::vector<double>& C1 = std::vector<double>(),
const std::vector<double>& C2 = std::vector<double>(),
168 const std::vector<double>& C3 = std::vector<double>());
171 void set_alpha(
const std::vector<double>& C1,
const std::vector<double>& C2,
const std::vector<double>& C3);
175 m_tau_cache = std::numeric_limits<double>::quiet_NaN();
188 m_tau_cache = std::numeric_limits<double>::quiet_NaN();
192 const std::vector<std::vector<double>>&
get_kmat() {
196 void set_kmat(
const std::vector<std::vector<double>>&
k) {
200 void set_kij(std::size_t i, std::size_t j,
double val) {
205 double get_kij(std::size_t i, std::size_t j) {
235 for (std::size_t i = 0; i <
alpha.size(); ++i) {
238 m_tau_cache = std::numeric_limits<double>::quiet_NaN();
254 void set_C_MC(std::size_t i,
double c1,
double c2,
double c3) {
255 alpha[i] = std::make_shared<MathiasCopemanAlphaFunction>(
a0_ii(i), c1, c2, c3,
T_r /
Tc[i]);
256 m_tau_cache = std::numeric_limits<double>::quiet_NaN();
259 void set_C_Twu(std::size_t i,
double L,
double M,
double N) {
260 alpha[i] = std::make_shared<TwuAlphaFunction>(
a0_ii(i), L, M,
N,
T_r /
Tc[i]);
261 m_tau_cache = std::numeric_limits<double>::quiet_NaN();
265 virtual double a0_ii(std::size_t i) = 0;
268 virtual double b0_ii(std::size_t i) = 0;
270 virtual double m_ii(std::size_t i) = 0;
273 virtual double alphar(
double tau,
double delta,
const std::vector<double>& x, std::size_t itau, std::size_t idelta);
275 virtual double d_alphar_dxi(
double tau,
double delta,
const std::vector<double>& x, std::size_t itau, std::size_t idelta, std::size_t i,
276 bool xN_independent);
278 virtual double d2_alphar_dxidxj(
double tau,
double delta,
const std::vector<double>& x, std::size_t itau, std::size_t idelta, std::size_t i,
279 std::size_t j,
bool xN_independent);
281 virtual double d3_alphar_dxidxjdxk(
double tau,
double delta,
const std::vector<double>& x, std::size_t itau, std::size_t idelta, std::size_t i,
282 std::size_t j, std::size_t
k,
bool xN_independent);
290 virtual double am_term(
double tau,
const std::vector<double>& x, std::size_t itau);
299 virtual double d_am_term_dxi(
double tau,
const std::vector<double>& x, std::size_t itau, std::size_t i,
bool xN_independent);
309 virtual double d2_am_term_dxidxj(
double tau,
const std::vector<double>& x, std::size_t itau, std::size_t i, std::size_t j,
bool xN_independent);
320 virtual double d3_am_term_dxidxjdxk(
double tau,
const std::vector<double>& x, std::size_t itau, std::size_t i, std::size_t j, std::size_t
k,
321 bool xN_independent);
327 virtual double bm_term(
const std::vector<double>& x);
333 virtual double d_bm_term_dxi(
const std::vector<double>& x, std::size_t i,
bool xN_independent);
340 virtual double d2_bm_term_dxidxj(
const std::vector<double>& x, std::size_t i, std::size_t j,
bool xN_independent);
348 virtual double d3_bm_term_dxidxjdxk(
const std::vector<double>& x, std::size_t i, std::size_t j, std::size_t
k,
bool xN_independent);
363 virtual void set_Q_k(
const size_t sgi,
const double value) {
367 virtual double get_Q_k(
const size_t sgi)
const {
378 double aij_term(
double tau, std::size_t i, std::size_t j, std::size_t itau);
385 double u_term(
double tau, std::size_t i, std::size_t j, std::size_t itau);
391 double aii_term(
double tau, std::size_t i, std::size_t itau);
400 double psi_minus(
double delta,
const std::vector<double>& x, std::size_t itau, std::size_t idelta);
410 double d_psi_minus_dxi(
double delta,
const std::vector<double>& x, std::size_t itau, std::size_t idelta, std::size_t i,
bool xN_independent);
421 double d2_psi_minus_dxidxj(
double delta,
const std::vector<double>& x, std::size_t itau, std::size_t idelta, std::size_t i, std::size_t j,
422 bool xN_independent);
434 double d3_psi_minus_dxidxjdxk(
double delta,
const std::vector<double>& x, std::size_t itau, std::size_t idelta, std::size_t i, std::size_t j,
435 std::size_t
k,
bool xN_independent);
445 double PI_12(
double delta,
const std::vector<double>& x, std::size_t idelta);
454 double d_PI_12_dxi(
double delta,
const std::vector<double>& x, std::size_t idelta, std::size_t i,
bool xN_independent);
464 double d2_PI_12_dxidxj(
double delta,
const std::vector<double>& x, std::size_t idelta, std::size_t i, std::size_t j,
bool xN_independent);
475 double d3_PI_12_dxidxjdxk(
double delta,
const std::vector<double>& x, std::size_t idelta, std::size_t i, std::size_t j, std::size_t
k,
476 bool xN_independent);
484 double tau_times_a(
double tau,
const std::vector<double>& x, std::size_t itau);
493 double d_tau_times_a_dxi(
double tau,
const std::vector<double>& x, std::size_t itau, std::size_t i,
bool xN_independent);
503 double d2_tau_times_a_dxidxj(
double tau,
const std::vector<double>& x, std::size_t itau, std::size_t i, std::size_t j,
bool xN_independent);
514 double d3_tau_times_a_dxidxjdxk(
double tau,
const std::vector<double>& x, std::size_t itau, std::size_t i, std::size_t j, std::size_t
k,
515 bool xN_independent);
525 double psi_plus(
double delta,
const std::vector<double>& x, std::size_t idelta);
534 double d_psi_plus_dxi(
double delta,
const std::vector<double>& x, std::size_t idelta, std::size_t i,
bool xN_independent);
544 double d2_psi_plus_dxidxj(
double delta,
const std::vector<double>& x, std::size_t idelta, std::size_t i, std::size_t j,
bool xN_independent);
555 double d3_psi_plus_dxidxjdxk(
double delta,
const std::vector<double>& x, std::size_t idelta, std::size_t i, std::size_t j, std::size_t
k,
556 bool xN_independent);
566 double c_term(
const std::vector<double>& x) {
575 double d_c_term_dxi(
const std::vector<double>& x, std::size_t i,
bool xN_independent) {
585 double d2_c_term_dxidxj(
const std::vector<double>& x, std::size_t i, std::size_t j,
bool xN_independent) {
598 double d3_c_term_dxidxjdxk(
const std::vector<double>& x, std::size_t i, std::size_t j, std::size_t
k,
bool xN_independent) {
600 return 1 / pow(bm, 4)
619 double A_term(
double delta,
const std::vector<double>& x) {
631 double d_A_term_dxi(
double delta,
const std::vector<double>& x, std::size_t i,
bool xN_independent) {
632 std::size_t idelta = 0;
643 double d2_A_term_dxidxj(
double delta,
const std::vector<double>& x, std::size_t i, std::size_t j,
bool xN_independent) {
644 std::size_t idelta = 0;
645 double PI12 =
PI_12(delta, x, idelta);
659 double d3_A_term_dxidxjdxk(
double delta,
const std::vector<double>& x, std::size_t i, std::size_t j, std::size_t
k,
bool xN_independent) {
660 std::size_t idelta = 0;
661 double PI12 =
PI_12(delta, x, idelta);
674 virtual void set_interaction_parameter(
const std::size_t mgi1,
const std::size_t mgi2,
const std::string& parameter,
const double value) {
687 const std::vector<double>& C1 = std::vector<double>(),
const std::vector<double>& C2 = std::vector<double>(),
688 const std::vector<double>& C3 = std::vector<double>())
694 :
AbstractCubic(std::vector<double>(1,
Tc), std::vector<double>(1,
pc), std::vector<double>(1,
acentric),
R_u, 1 + sqrt(2.0), 1 - sqrt(2.0)) {
695 set_alpha(std::vector<double>(), std::vector<double>(), std::vector<double>());
698 double a0_ii(std::size_t i)
override;
699 double b0_ii(std::size_t i)
override;
700 double m_ii(std::size_t i)
override;
707 const std::vector<double>& C1 = std::vector<double>(),
const std::vector<double>& C2 = std::vector<double>(),
708 const std::vector<double>& C3 = std::vector<double>())
714 set_alpha(std::vector<double>(), std::vector<double>(), std::vector<double>());
717 double a0_ii(std::size_t i)
override;
718 double b0_ii(std::size_t i)
override;
719 double m_ii(std::size_t i)
override;