Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#define CATCH_CONFIG_ENABLE_BENCHMARKING
#define CATCH_CONFIG_MAIN
#include <catch/catch.hpp>
#include "teqp/models/eos.hpp"
#include "teqp/models/pcsaft.hpp"
#include "teqp/derivs.hpp"
TEST_CASE("vdW derivatives", "[vdW]")
{
double Omega_b = 1.0 / 8, Omega_a = 27.0 / 64;
double Tcrit = 150.687, pcrit = 4863000.0; // Argon
double R = get_R_gas<double>(); // Universal gas constant
double b = Omega_b * R * Tcrit / pcrit;
double ba = Omega_b / Omega_a / Tcrit / R;
double a = b / ba;
auto model = vdWEOS1(a, b);
double T = 300, rho = 2;
std::valarray<double> z(2, 1.0);
using tdx = TDXDerivatives<decltype(model), double, decltype(z)>;
BENCHMARK("alphar") {
return model.alphar(T, rho, z);
};
BENCHMARK("alphar via get_Ar00") {
return tdx::get_Ar00(model, T, rho, z);
};
BENCHMARK("rho*dalphar/drho w/ autodiff") {
return tdx::get_Ar01(model, T, rho, z);
};
BENCHMARK("rho*dalphar/drho w/ multicomplex") {
return tdx::get_Ar01<ADBackends::multicomplex>(model, T, rho, z);
};
BENCHMARK("rho*dalphar/drho w/ complex step") {
return tdx::get_Ar01<ADBackends::complex_step>(model, T, rho, z);
};
BENCHMARK("rho^2*d^2alphar/drho^2 w/ autodiff") {
return tdx::get_Ar02(model, T, rho, z);
};
BENCHMARK("rho^2*d^2alphar/drho^2 w/ multicomplex") {
return tdx::get_Ar02<ADBackends::multicomplex>(model, T, rho, z);
};
BENCHMARK("(1/T)*dalphar/d(1/T) w/ autodiff") {
return tdx::get_Ar10(model, T, rho, z);
};
BENCHMARK("(1/T)*dalphar/d(1/T) w/ mcx") {
return tdx::get_Ar10<ADBackends::multicomplex>(model, T, rho, z);
};
}
TEST_CASE("PCSAFT derivatives", "[PCSAFT]")
{
std::vector<std::string> names = { "Methane", "Ethane" };
auto model = PCSAFTMixture(names);
double T = 300, rho = 2;
Eigen::ArrayX<double> z(2); z.fill(1.0);
using tdx = TDXDerivatives<decltype(model), double, decltype(z)>;
BENCHMARK("alphar") {
return model.alphar(T, rho, z);
};
BENCHMARK("alphar via get_Ar00") {
return tdx::get_Ar00(model, T, rho, z);
};
BENCHMARK("rho*dalphar/drho w/ autodiff") {
return tdx::get_Ar01(model, T, rho, z);
};
BENCHMARK("rho*dalphar/drho w/ multicomplex") {
return tdx::get_Ar01<ADBackends::multicomplex>(model, T, rho, z);
};
BENCHMARK("rho*dalphar/drho w/ complex step") {
return tdx::get_Ar01<ADBackends::complex_step>(model, T, rho, z);
};
BENCHMARK("rho^2*d^2alphar/drho^2 w/ autodiff") {
return tdx::get_Ar02(model, T, rho, z);
};
BENCHMARK("rho^2*d^2alphar/drho^2 w/ multicomplex") {
return tdx::get_Ar02<ADBackends::multicomplex>(model, T, rho, z);
};
BENCHMARK("(1/T)*dalphar/d(1/T) w/ autodiff") {
return tdx::get_Ar10(model, T, rho, z);
};
/*BENCHMARK("(1/T)*dalphar/d(1/T) w/ mcx") {
return tdx::get_Ar10<ADBackends::multicomplex>(model, T, rho, z);
};*/
}