Skip to content
Snippets Groups Projects
bench.cpp 2.93 KiB
Newer Older
  • Learn to ignore specific revisions
  • #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);
        };*/
    }