Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
194 changes: 93 additions & 101 deletions src/gas/adaptive_lut_CEA.d
Original file line number Diff line number Diff line change
Expand Up @@ -705,108 +705,100 @@ private:
double[4] _Cp_hat, _gamma_hat, _mu, _k;
}




// These test functions are the same as in uniform_lut.d
version(adaptive_lut_CEA_test)
{
import util.msg_service;

int main() {
GasModel gm;

try {
lua_State* L = init_lua_State();
doLuaFile(L, "sample-data/cea-adaptive-lut-air-bezier.lua");
gm = new AdaptiveLUT(L);
}
catch (Exception e) {
writeln(e.msg);
string msg;
msg ~= "Test of look up table in adaptive_lut_CEA.d require file:";
msg ~= "cea-adaptive-lut-air-bezier.lua ";
msg ~= " in directory: gas/sample_data";
throw new Exception(msg);
}

// An arbitrary state was defined for 'Air', massf=1, in CEA2
// using the utility cea2_gas.py
double p_given = 1.0e6; // Pa
double T_given = 1.0e3; // K
double rho_given = 3.4837; // kg/m^^3
// CEA uses a reference temperature of 298K (Eilmer uses 0K) so the
// temperature was offset by amount e_offset
double e_CEA = 456600; // J/kg
double e_offset = 303949.904; // J/kg
double e_given = e_CEA + e_offset; // J/kg
double h_CEA = 743650; // J/kg
double h_given = h_CEA + e_offset; // J/kg
double a_given = 619.2; // m/s
double s_given = 7475.7; // J(kg.K)
double R_given = 287.036; // J/(kg.K)
double gamma_given = 1.3866;
double Cp_given = 1141; // J/(kg.K)
double mu_given = 4.3688e-05; // Pa.s
double k_given = 0.0662; // W/(m.K)
double Cv_given = e_given / T_given; // J/(kg.K)


auto Q = GasState(gm, p_given, T_given);
// Return values not stored in the GasState
// The constructor of the gas state will call update_thermo_from_pT
// which itself calls update_thermo_from_rhou, so we are testing both
double Cv = gm.dudT_const_v(Q);
double Cp = gm.dhdT_const_p(Q);
double R = gm.gas_constant(Q);
double h = gm.enthalpy(Q);
double s = gm.entropy(Q);

assert(gm.n_modes == 0, failedUnitTest());
assert(gm.n_species == 1, failedUnitTest());
assert(isClose(e_given, Q.u, 1.0e-4), failedUnitTest());
assert(isClose(rho_given, Q.rho, 1.0e-4), failedUnitTest());
assert(isClose(a_given, Q.a, 1.0e-4), failedUnitTest());
assert(isClose(Cp_given, Cp, 1.0e-3), failedUnitTest());
assert(isClose(h_given, h, 1.0e-4), failedUnitTest());
assert(isClose(mu_given, Q.mu, 1.0e-4), failedUnitTest());
assert(isClose(k_given, Q.k, 1.0e-4), failedUnitTest());
assert(isClose(s_given, s, 1.0e-4), failedUnitTest());
assert(isClose(R_given, R, 1.0e-4), failedUnitTest());



// Now do the same test for the linear implementation
try {
lua_State* L = init_lua_State();
doLuaFile(L, "sample-data/cea-adaptive-lut-air-linear.lua");
gm = new AdaptiveLUT(L);
}
catch (Exception e) {
writeln(e.msg);
string msg;
msg ~= "Test of look up table in adaptive_lut_CEA.d require file:";
msg ~= "cea-adaptive-lut-air-linear.lua";
msg ~= " in directory: gas/sample_data";
throw new Exception(msg);
}
unittest {
import std.file;

// Find the lua files in sample-data
chdir("./sample-data");
scope (exit)
chdir("..");

GasModel gm;

try {
lua_State* L = init_lua_State();
doLuaFile(L, "cea-adaptive-lut-air-bezier.lua");
gm = new AdaptiveLUT(L);
} catch (Exception e) {
writeln(e.msg);
string msg;
msg ~= "Test of look up table in adaptive_lut_CEA.d require file:";
msg ~= "cea-adaptive-lut-air-bezier.lua ";
msg ~= " in directory: gas/sample_data";
throw new Exception(msg);
}

Q = GasState(gm, p_given, T_given);

// Note that the unit tests are to a higher error tolerance
// because the look-up table was generated higher error allowed
assert(gm.n_modes == 0, failedUnitTest());
assert(gm.n_species == 1, failedUnitTest());
assert(isClose(e_given, Q.u, 1.0e-3), failedUnitTest());
assert(isClose(rho_given, Q.rho, 1.0e-3), failedUnitTest());
assert(isClose(a_given, Q.a, 1.0e-3), failedUnitTest());
assert(isClose(Cp_given, Cp, 1.0e-3), failedUnitTest());
assert(isClose(h_given, h, 1.0e-3), failedUnitTest());
assert(isClose(mu_given, Q.mu, 1.0e-2), failedUnitTest());
assert(isClose(k_given, Q.k, 1.0e-3), failedUnitTest());
assert(isClose(s_given, s, 1.0e-3), failedUnitTest());
assert(isClose(R_given, R, 1.0e-3), failedUnitTest());

return 0;
// An arbitrary state was defined for 'Air', massf=1, in CEA2
// using the utility cea2_gas.py
double p_given = 1.0e6; // Pa
double T_given = 1.0e3; // K
double rho_given = 3.4837; // kg/m^^3
// CEA uses a reference temperature of 298K (Eilmer uses 0K) so the
// temperature was offset by amount e_offset
double e_CEA = 456600; // J/kg
double e_offset = 303949.904; // J/kg
double e_given = e_CEA + e_offset; // J/kg
double h_CEA = 743650; // J/kg
double h_given = h_CEA + e_offset; // J/kg
double a_given = 619.2; // m/s
double s_given = 7475.7; // J(kg.K)
double R_given = 287.036; // J/(kg.K)
double gamma_given = 1.3866;
double Cp_given = 1141; // J/(kg.K)
double mu_given = 4.3688e-05; // Pa.s
double k_given = 0.0662; // W/(m.K)
double Cv_given = e_given / T_given; // J/(kg.K)

auto Q = GasState(gm, p_given, T_given);
// Return values not stored in the GasState
// The constructor of the gas state will call update_thermo_from_pT
// which itself calls update_thermo_from_rhou, so we are testing both
double Cv = gm.dudT_const_v(Q);
double Cp = gm.dhdT_const_p(Q);
double R = gm.gas_constant(Q);
double h = gm.enthalpy(Q);
double s = gm.entropy(Q);

assert(gm.n_modes == 0);
assert(gm.n_species == 1);
assert(isClose(e_given, Q.u, 1.0e-4));
assert(isClose(rho_given, Q.rho, 1.0e-4));
assert(isClose(a_given, Q.a, 1.0e-4));
assert(isClose(Cp_given, Cp, 1.0e-3));
assert(isClose(h_given, h, 1.0e-4));
assert(isClose(mu_given, Q.mu, 1.0e-4));
assert(isClose(k_given, Q.k, 1.0e-4));
assert(isClose(s_given, s, 1.0e-4));
assert(isClose(R_given, R, 1.0e-4));

// Now do the same test for the linear implementation
try {
lua_State* L = init_lua_State();
doLuaFile(L, "cea-adaptive-lut-air-linear.lua");
gm = new AdaptiveLUT(L);
} catch (Exception e) {
writeln(e.msg);
string msg;
msg ~= "Test of look up table in adaptive_lut_CEA.d require file:";
msg ~= "cea-adaptive-lut-air-linear.lua";
msg ~= " in directory: gas/sample_data";
throw new Exception(msg);
}

Q = GasState(gm, p_given, T_given);

// Note that the unit tests are to a higher error tolerance
// because the look-up table was generated higher error allowed
assert(gm.n_modes == 0);
assert(gm.n_species == 1);
assert(isClose(e_given, Q.u, 1.0e-3));
assert(isClose(rho_given, Q.rho, 1.0e-3));
assert(isClose(a_given, Q.a, 1.0e-3));
assert(isClose(Cp_given, Cp, 1.0e-3));
assert(isClose(h_given, h, 1.0e-3));
assert(isClose(mu_given, Q.mu, 1.0e-2));
assert(isClose(k_given, Q.k, 1.0e-3));
assert(isClose(s_given, s, 1.0e-3));
assert(isClose(R_given, R, 1.0e-3));
}
71 changes: 35 additions & 36 deletions src/gas/cea_gas.d
Original file line number Diff line number Diff line change
Expand Up @@ -578,47 +578,46 @@ private:
} // end callCEA()
} // end class CEAGgas

version(cea_gas_test) {
import std.stdio;
import util.msg_service;
unittest {
import std.file;

int main() {
lua_State* L = init_lua_State();
doLuaFile(L, "sample-data/cea-air5species-gas-model.lua");
auto gm = new CEAGas(L);
lua_close(L);
// Find the lua files in sample-data
chdir("./sample-data");
scope(exit) chdir("..");

auto gd = GasState(1, 0, true);
gd.p = 1.0e5;
gd.T = 300.0;
gd.massf[0] = 1.0;
gm.update_thermo_from_pT(gd);
assert(isClose(gm.R(gd), 288.198, 0.01), failedUnitTest());
assert(gm.n_modes == 0, failedUnitTest());
assert(gm.n_species == 1, failedUnitTest());
assert(isClose(gd.p, 1.0e5, 1.0e-6), failedUnitTest());
assert(isClose(gd.T, 300.0, 1.0e-6), failedUnitTest());
assert(isClose(gd.massf[0], 1.0, 1.0e-6), failedUnitTest());
assert(isClose(gd.rho, 1.1566, 1.0e-4), failedUnitTest());
assert(isClose(gd.u, -84587.0, 0.1), failedUnitTest());
assert(isClose(gd.ceaSavedData.massf["N2"], 0.76708, 1.0e-5), failedUnitTest());
assert(isClose(gd.ceaSavedData.massf["O2"], 0.23292, 1.0e-5), failedUnitTest());
lua_State* L = init_lua_State();
doLuaFile(L, "cea-air5species-gas-model.lua");
auto gm = new CEAGas(L);
lua_close(L);

gm.update_sound_speed(gd);
assert(isClose(gd.a, 347.7, 0.1), failedUnitTest());
auto gd = GasState(1, 0, true);
gd.p = 1.0e5;
gd.T = 300.0;
gd.massf[0] = 1.0;
gm.update_thermo_from_pT(gd);
assert(isClose(gm.R(gd), 288.198, 0.01));
assert(gm.n_modes == 0);
assert(gm.n_species == 1);
assert(isClose(gd.p, 1.0e5, 1.0e-6));
assert(isClose(gd.T, 300.0, 1.0e-6));
assert(isClose(gd.massf[0], 1.0, 1.0e-6));
assert(isClose(gd.rho, 1.1566, 1.0e-4));
assert(isClose(gd.u, -84_587.0, 0.1));
assert(isClose(gd.ceaSavedData.massf["N2"], 0.76708, 1.0e-5));
assert(isClose(gd.ceaSavedData.massf["O2"], 0.23292, 1.0e-5));

gm.update_trans_coeffs(gd);
assert(isClose(gd.mu, 1.87e-05, 0.01), failedUnitTest());
assert(isClose(gd.k, 0.02647, 1.0e-5), failedUnitTest());
gm.update_sound_speed(gd);
assert(isClose(gd.a, 347.7, 0.1));

gm.update_thermo_from_ps(gd, gd.ceaSavedData.s);
assert(isClose(gd.p, 1.0e5, 1.0), failedUnitTest());
assert(isClose(gd.T, 300.0, 0.1), failedUnitTest());
gm.update_trans_coeffs(gd);
assert(isClose(gd.mu, 1.87e-05, 0.01));
assert(isClose(gd.k, 0.02647, 1.0e-5));

gm.update_thermo_from_rhou(gd);
assert(isClose(gd.p, 1.0e5, 1.0), failedUnitTest());
assert(isClose(gd.T, 300.0, 0.1), failedUnitTest());
gm.update_thermo_from_ps(gd, gd.ceaSavedData.s);
assert(isClose(gd.p, 1.0e5, 1.0));
assert(isClose(gd.T, 300.0, 0.1));

return 0;
}
gm.update_thermo_from_rhou(gd);
assert(isClose(gd.p, 1.0e5, 1.0));
assert(isClose(gd.T, 300.0, 0.1));
}
Loading