Newer
Older
#include "catch/catch.hpp"
#include "teqp/models/multifluid.hpp"
#include "teqp/algorithms/critical_tracing.hpp"
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
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);
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": {
},
"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);
}
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);
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);
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);
CHECK(infdil0(0) == Approx(infdil1(1)));
CHECK(infdil0(1) == Approx(infdil1(0)));