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