From 4d46df0eb15c98cf16357c45094a0737ae807796 Mon Sep 17 00:00:00 2001 From: Ian Bell <ian.bell@nist.gov> Date: Tue, 12 Oct 2021 10:12:50 -0400 Subject: [PATCH] Add benchmarking script with Catch2 --- src/bench.cpp | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 src/bench.cpp diff --git a/src/bench.cpp b/src/bench.cpp new file mode 100644 index 0000000..9e25ac4 --- /dev/null +++ b/src/bench.cpp @@ -0,0 +1,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); + };*/ +} \ No newline at end of file -- GitLab