Skip to content
Snippets Groups Projects
catch_test_mutant.cxx 5.58 KiB
Newer Older
  • Learn to ignore specific revisions
  • Ian Bell's avatar
    Ian Bell committed
    #include "catch/catch.hpp"
    
    #include "teqp/models/multifluid.hpp"
    
    #include "teqp/algorithms/critical_tracing.hpp"
    
    Ian Bell's avatar
    Ian Bell committed
    
    
    using namespace teqp;
    
    
    Ian Bell's avatar
    Ian Bell committed
    TEST_CASE("Test construction of mutant", "[mutant]")
    {
    
    	std::string coolprop_root = "../mycp";
    	auto BIPcollection = coolprop_root + "/dev/mixtures/mixture_binary_pairs.json";
    
    	auto model = build_multifluid_model({ "Nitrogen", "Ethane" }, coolprop_root, BIPcollection);
    
        std::string s0 = R"({"0": {} })";
        nlohmann::json j0 = nlohmann::json::parse(s0);
    
        std::string s = R"({
            "0": {
                "1": {
                    "BIP": {
                        "betaT": 1.1,
                        "gammaT": 0.9,
                        "betaV": 1.05,
                        "gammaV": 1.3,
                        "Fij": 1.0
                    },
                    "departure":{
                        "type": "none"
                    }
                }
            }
        })";
    	nlohmann::json j = nlohmann::json::parse(s);
        auto mutant = build_multifluid_mutant(model, j);
    
        double T = 300, rho = 300;
        Eigen::ArrayXd molefrac(2); molefrac = 0.5;
        auto Ar02base = TDXDerivatives<decltype(model)>::get_Ar02(model, T, rho, molefrac);
        auto Ar02mut = TDXDerivatives<decltype(mutant)>::get_Ar02(mutant, T, rho, molefrac);
        CHECK(Ar02base != Ar02mut);
    
    Ian Bell's avatar
    Ian Bell committed
    
    
    TEST_CASE("Crashing mutant construction", "[mutant]") {
        std::string root = "../mycp";
        nlohmann::json flags = { {"estimate", "Lorentz-Berthelot"} };
        auto BIPcollection =  root + "/dev/mixtures/mixture_binary_pairs.json";
        auto model = build_multifluid_model({ "R32", "R1234ZEE" }, "../mycp", BIPcollection, flags);
        std::string s0 = R"({"0": {"1": {"BIP": {"betaT": 0.850879634551532, "gammaT": 1.2416653630048216, "betaV": 0.7616480056314916, "gammaV": 0.9947751468478655, "Fij": 1.0}, "departure": {"type": "Exponential", "n": [], "t": [], "d": [], "l": []}}}})";
        nlohmann::json j = nlohmann::json::parse(s0);
        auto mutant = build_multifluid_mutant(model, j);
    }
    
    
    TEST_CASE("Test construction of mutant with invariant departure function", "[mutant][invariant]")
    {
    
        std::string coolprop_root = "../mycp";
        auto BIPcollection = coolprop_root + "/dev/mixtures/mixture_binary_pairs.json";
    
        auto model = build_multifluid_model({ "Nitrogen", "Ethane" }, coolprop_root, BIPcollection);
    
    
        // Check that missing fields throw
        nlohmann::json jbad = nlohmann::json::parse(R"(
        {
            "0": {
                "1": {
                    "BIP": {
    
    Ian Bell's avatar
    Ian Bell committed
                        "phiT": 1.1
    
                    },
                    "departure":{
                        "type": "none"
                    }
                }
            }
        }
        )");
        CHECK_THROWS(build_multifluid_mutant_invariant(model, jbad));
    
    
        std::string s = R"({
            "0": {
                "1": {
                    "BIP": {
                        "type": "invariant",
                        "phiT": 1.1,
                        "lambdaT": 0.0,
                        "phiV": 1.0,
                        "lambdaV": 0.0,
                        "Fij": 1.0
                    },
                    "departure":{
                        "type": "none"
                    }
                }
            }
        })";
        nlohmann::json j = nlohmann::json::parse(s);
        auto mutant = build_multifluid_mutant_invariant(model, j);
    
        //for (auto x0 = 0.0; x0 < 1.0; x0 += 0.1) {
        //    std::vector<double> z = { x0, 1 - x0 };
        //    std::cout << x0 << " " << mutant.redfunc.get_Tr(z) << std::endl;
        //}
    
        double T = 300, rho = 300;
        Eigen::ArrayXd molefrac(2); molefrac = 0.5;
        auto Ar02base = TDXDerivatives<decltype(model)>::get_Ar02(model, T, rho, molefrac);
        auto Ar02mut = TDXDerivatives<decltype(mutant)>::get_Ar02(mutant, T, rho, molefrac);
        CHECK(Ar02base != Ar02mut);
    
    Ian Bell's avatar
    Ian Bell committed
    TEST_CASE("Test infinite dilution critical locus derivatives for multifluid mutant with both orders", "[crit],[multifluid],[xxx]")
    
    {
        std::string root = "../mycp";
    
        auto pure_endpoint = [&](const std::vector < std::string>& fluids, int i) {
            const auto model = build_multifluid_model(fluids, root);
    
    Ian Bell's avatar
    Ian Bell committed
    
            std::string s0 = R"({"0": {"1": {"BIP": {"betaT": 0.850879634551532, "gammaT": 1.2416653630048216, "betaV": 0.7616480056314916, "gammaV": 0.9947751468478655, "Fij": 0.0}, "departure": {"type": "Exponential", "n": [], "t": [], "d": [], "l": []}}}})";
    
            nlohmann::json j = nlohmann::json::parse(s0);
    
    Ian Bell's avatar
    Ian Bell committed
            if (fluids[0] == "Ethane"){
                double betaT = j["0"]["1"]["BIP"]["betaT"], betaV = j["0"]["1"]["BIP"]["betaV"];
                j["0"]["1"]["BIP"]["betaT"] = 1.0/betaT;
                j["0"]["1"]["BIP"]["betaV"] = 1.0/betaV;
            }
    
            auto rhoc0 = 1 / model.redfunc.vc[i];
            double T0 = model.redfunc.Tc[i]; 
            Eigen::ArrayXd rhovec0(2); rhovec0.setZero(); rhovec0[i] = rhoc0; 
            
            auto mutant = build_multifluid_mutant(model, j);
            using ct = CriticalTracing<decltype(mutant), double, Eigen::ArrayXd>;
            // Values for infinite dilution
            auto infdil = ct::get_drhovec_dT_crit(mutant, T0, rhovec0);
            auto der = ct::get_derivs(mutant, T0, rhovec0);
            auto epinfdil = ct::eigen_problem(mutant, T0, rhovec0);
            using tdx = TDXDerivatives<decltype(mutant), double, Eigen::ArrayXd>;
            auto z = (rhovec0 / rhovec0.sum()).eval();
            auto alphar = mutant.alphar(T0, rhoc0, z);
            return std::make_tuple(T0, rhoc0, alphar, infdil, der);
        };
        auto [T0, rho0, alphar0, infdil0, der0] = pure_endpoint({ "Nitrogen", "Ethane" }, 0);
        auto [T1, rho1, alphar1, infdil1, der1] = pure_endpoint({ "Ethane", "Nitrogen" }, 1);
        CHECK(T0 == T1);
        CHECK(rho0 == rho1);
        CHECK(alphar0 == alphar1);
    
    Ian Bell's avatar
    Ian Bell committed
        CHECK(infdil0(0) == Approx(infdil1(1)));
        CHECK(infdil0(1) == Approx(infdil1(0)));
    
    Ian Bell's avatar
    Ian Bell committed
    }