[unittests] Implement gtest for 'test-oneD'

This commit is contained in:
Ingmar Schoegl 2023-03-04 20:04:55 -06:00
parent 1f16bf247e
commit 2617e20b11
2 changed files with 120 additions and 2 deletions

View File

@ -282,10 +282,11 @@ def addMatlabTest(script, testName, dependencies=None, env_vars=()):
# Instantiate tests # Instantiate tests
addTestProgram('clib', 'clib') addTestProgram('clib', 'clib')
addTestProgram('general', 'general')
addTestProgram('thermo', 'thermo')
addTestProgram('equil', 'equil') addTestProgram('equil', 'equil')
addTestProgram('general', 'general')
addTestProgram('kinetics', 'kinetics') addTestProgram('kinetics', 'kinetics')
addTestProgram('oneD', 'oneD')
addTestProgram('thermo', 'thermo')
addTestProgram('transport', 'transport') addTestProgram('transport', 'transport')
addTestProgram('zeroD', 'zeroD') addTestProgram('zeroD', 'zeroD')

117
test/oneD/test_oneD.cpp Normal file
View File

@ -0,0 +1,117 @@
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include <fstream>
#include "cantera/core.h"
#include "cantera/onedim.h"
using namespace Cantera;
// This test is an exact equivalent of a clib test
// (clib::test_ctonedim.cpp::ctonedim::freeflame_from_parts)
TEST(onedim, freeflame)
{
auto sol = newSolution("h2o2.yaml", "ohmech", "Mix");
auto gas = sol->thermo();
size_t nsp = gas->nSpecies();
// reactants
double uin = .3;
double T = 300;
double P = 101325;
string X = "H2:0.65, O2:0.5, AR:2";
gas->setState_TPX(T, P, X);
double rho_in = gas->density();
vector<double> yin(nsp);
gas->getMassFractions(&yin[0]);
// product estimate
gas->equilibrate("HP");
vector<double> yout(nsp);
gas->getMassFractions(&yout[0]);
double rho_out = gas->density();
double Tad = gas->temperature();
// flow
StFlow flow(sol, "flow");
flow.setFreeFlow();
// grid
int nz = 21;
double lz = 0.02;
vector<double> z(nz);
double dz = lz;
dz /= (double)(nz - 1);
for (int iz = 0; iz < nz; iz++) {
z[iz] = iz * dz;
}
flow.setupGrid(nz, &z[0]);
// inlet
Inlet1D inlet(sol, "inlet");
inlet.setMoleFractions(X);
inlet.setMdot(uin * rho_in);
inlet.setTemperature(T);
// outlet
Outlet1D outlet(sol, "outlet");
double uout = inlet.mdot() / rho_out;
// set up simulation
std::vector<Domain1D*> domains { &inlet, &flow, &outlet };
Sim1D flame(domains);
int dom = flame.domainIndex("flow");
ASSERT_EQ(dom, 1);
// set up initial guess
vector<double> locs{0.0, 0.3, 0.7, 1.0};
vector<double> value{uin, uin, uout, uout};
flame.setInitialGuess("velocity", locs, value);
value = {T, T, Tad, Tad};
flame.setInitialGuess("T", locs, value);
for (size_t i = 0; i < nsp; i++) {
value = {yin[i], yin[i], yout[i], yout[i]};
flame.setInitialGuess(gas->speciesName(i), locs, value);
}
// simulation settings
double ratio = 15.0;
double slope = 0.3;
double curve = 0.5;
flame.setRefineCriteria(dom, ratio, slope, curve);
flame.setFixedTemperature(0.85 * T + .15 * Tad);
// solve
flow.solveEnergyEqn();
bool refine_grid = false;
int loglevel = 0;
flame.solve(loglevel, refine_grid);
flame.save("gtest-freeflame.yaml", "cpp", "Solution from C++ interface", 1);
if (usesHDF5()) {
flame.save("gtest-freeflame.h5", "cpp", "Solution from C++ interface", 1);
}
ASSERT_EQ(flow.nPoints(), nz + 1);
size_t comp = flow.componentIndex("T");
double Tprev = flame.value(dom, comp, 0);
for (size_t n = 0; n < flow.nPoints(); n++) {
T = flame.value(dom, comp, n);
ASSERT_GE(T, Tprev);
Tprev = T;
}
}
int main(int argc, char** argv)
{
printf("Running main() from test_oneD.cpp\n");
testing::InitGoogleTest(&argc, argv);
make_deprecation_warnings_fatal();
string fileName = "gtest-freeflame.h5";
if (std::ifstream(fileName).good()) {
std::remove(fileName.c_str());
}
int result = RUN_ALL_TESTS();
appdelete();
return result;
}