Skip to content

Commit

Permalink
Update to ThermoPhase tests
Browse files Browse the repository at this point in the history
  • Loading branch information
ssun30 authored and ischoegl committed Jul 29, 2023
1 parent 77039ac commit 9e13e3e
Showing 1 changed file with 256 additions and 18 deletions.
274 changes: 256 additions & 18 deletions interfaces/matlab_experimental/Test/ctMatlabTestThermo.m
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@

properties
phase
rtol
rtol = 1e-6;
atol = 1e-8;
end

methods (TestClassSetup)
function ctLoad(testCase)
% Load Cantera
ctLoad
testCase.rtol = 1e-6;
import matlab.unittest.constraints.Throws;
end
end

Expand All @@ -22,11 +23,11 @@ function ctUnload(testCase)

methods (TestMethodSetup)
% Setup for each test
function createSolution(testCase)
src = 'gri30.yaml';
id = 'gri30';
trans = 'mixture-averaged';
testCase.phase = Solution(src, id, trans);
function createPhase(testCase)
src = 'h2o2.yaml';
id = 'ohmech';
transport = 'none';
testCase.phase = Solution(src, id, transport);
end

end
Expand All @@ -38,25 +39,261 @@ function deleteSolution(testCase)
end
end

methods
% Generic function to set invalid values to attribute
function setInvalidValue(testCase, attr, val)
testCase.phase.(attr) = val;
end
% Generic function to get an invalid property
function a = getInvalidProperty(testCase)
a = testCase.phase.foobar;
end
% Generic function to set an invalid property
function setInvalidProperty(testCase, val)
testCase.phase.foobar = val;
end
end

methods (Test)
% Test methods

function testSource(testCase)
function testBaseAttributes(testCase)
testCase.verifyInstanceOf(testCase.phase.solnName, ...
'char');

testCase.verifyInstanceOf(testCase.phase.phaseName, ...
'char');

testCase.phase.phaseName = 'spam';
testCase.verifyEqual(testCase.phase.phaseName, ...
'spam');

testCase.verifyGreaterThanOrEqual(testCase.phase.tpID, 0);

testCase.verifyEqual(testCase.phase.basis, ...
'molar');
testCase.phase.basis = 'mass';
testCase.verifyEqual(testCase.phase.basis, ...
'mass');
end

function testPhases(testCase)
% Note: ThermoPhase.phaseOfMatter is not implemented in Clib
testCase.verifyEqual(testCase.phase.nPhases, 1);
end

function temperatureTest(testCase)
function testSpecies(testCase)
testCase.verifyEqual(testCase.phase.nSpecies, 10);

names = testCase.phase.speciesNames;
for i = 1:10
n = testCase.phase.speciesName(i);
m = testCase.phase.speciesIndex(n{:});

testCase.verifyEqual(n{:}, names{i});
testCase.verifyEqual(i, m);
end

testCase.verifyError(@() testCase.phase.speciesName(11), 'Cantera:ctError');
end

function testElements(testCase)
% Note: ThermoPhase.elementName is not implemented in Clib
testCase.verifyEqual(testCase.phase.nElements, 4);
end

function testNAtoms(testCase)
data = {{1, 'O', 'O'}, {2, 'O', 'O2'}, {1, 'H', 'OH'},...
{2, 'H', 'H2O'}, {2, 'O', 'H2O2'}, {1, 'Ar', 'AR'},...
{0, 'O', 'H'}, {0, 'H', 'AR'}, {0, 'Ar', 'HO2'}};
for i = 1:length(data)
n = data{i}{1};
element = data{i}{2};
species = data{i}{3};
mElem = testCase.phase.elementIndex(element);
kSpec = testCase.phase.speciesIndex(species);
n1 = testCase.phase.nAtoms(species, element);
n2 = testCase.phase.nAtoms(kSpec, mElem);

testCase.verifyEqual(n1, n);
testCase.verifyEqual(n2, n);

testCase.verifyError(@() testCase.phase.nAtoms('C', 'H2'),...
'Cantera:ctError');
testCase.verifyError(@() testCase.phase.nAtoms('H', 'CH4'),...
'Cantera:ctError');
end
end

function testElementalMassFraction(testCase)
testCase.phase.Y = 'H2O:0.5, O2:0.5';
Zo = testCase.phase.elementalMassFraction('O');
Zh = testCase.phase.elementalMassFraction('H');
Zar = testCase.phase.elementalMassFraction('Ar');

exp1 = 0.5 + 0.5 * (15.999 / 18.015);
exp2 = 0.5 * (2.016 / 18.015);
exp3 = 0.0;

diff1 = abs(Zo - exp1)/exp1;
diff2 = abs(Zh - exp2)/exp2;
diff3 = abs(Zar - exp3);

testCase.verifyLessThanOrEqual(diff1, testCase.rtol);
testCase.verifyLessThanOrEqual(diff2, testCase.rtol);
testCase.verifyLessThanOrEqual(diff3, testCase.atol);

testCase.verifyError(@() testCase.phase.elementalMassFraction('C'),...
'Cantera:ctError');
end

function testWeights(testCase)
aw = testCase.phase.atomicMasses;
mw = testCase.phase.molecularWeights;

testCase.verifyEqual(length(aw), testCase.phase.nElements);
testCase.verifyEqual(length(mw), testCase.phase.nSpecies);

for i = 1:length(mw)
testWeight = 0.0;
for j = 1:length(aw)
testWeight = testWeight + ...
aw(j) * testCase.phase.nAtoms(i, j);
end
diff = (testWeight - mw(i))/mw(i);

testCase.verifyLessThanOrEqual(diff, testCase.rtol);
end
end

function testCharges(testCase)
chargePhase = Solution('gri30_ion.yaml', 'gas');
charges = chargePhase.charges;
test = {{'E',-1}, {'N2',0}, {'H3O+',1}};

for i = 1:length(test)
species = test{i}{1};
charge = test{i}{2};

flag = sum(ismember(chargePhase.speciesNames, species));
testCase.verifyGreaterThan(flag, 0);

idx = chargePhase.speciesIndex(species);
testCase.verifyEqual(charges(idx), charge);
end
clear chargePhase
end

function testSetComposition(testCase)
xx = zeros(1, testCase.phase.nSpecies);
xx(3) = 1.0;
testCase.phase.X = xx;
yy = testCase.phase.Y;

testCase.verifyEqual(xx, yy)
end

function testSetCompositionString(testCase)
testCase.phase.X = 'h2:1.0, o2:1.0';
xx = testCase.phase.X;

diff1 = abs(xx(1) - 0.5)/0.5;
diff2 = abs(xx(4) - 0.5)/0.5;

testCase.verifyLessThanOrEqual(diff1, testCase.rtol);
testCase.verifyLessThanOrEqual(diff2, testCase.rtol);
end

function testSetCompositionStringBad(testCase)
testCase.verifyError(@()...
testCase.setInvalidValue('X','H2:1.0,CO2:1.5'),...
'Cantera:ctError');
testCase.verifyError(@()...
testCase.setInvalidValue('X','H2:1.0,O2:asdf'),...
'Cantera:ctError');
testCase.verifyError(@()...
testCase.setInvalidValue('X','H2:1.e-x4'),...
'Cantera:ctError');
testCase.verifyError(@()...
testCase.setInvalidValue('X','H2:1e-1.4'),...
'Cantera:ctError');
testCase.verifyError(@()...
testCase.setInvalidValue('X','H2:0.5,O2:1.0,H2:0.1'),...
'Cantera:ctError');
end

function testReport(testCase)
str = testCase.phase.report;

testCase.verifySubstring(str, testCase.phase.phaseName);
testCase.verifySubstring(str, 'temperature');

for i = 1:testCase.phase.nSpecies
name = testCase.phase.speciesName(i);
testCase.verifySubstring(str, name{:});
end
end

function checkGetters(testCase)
val = testCase.phase.T;
exp = 300;
diff = abs(val - exp)/exp;
testCase.verifyLessThanOrEqual(diff, testCase.rtol);
end
testCase.verifyGreaterThan(testCase.phase.maxTemp, 0);
testCase.verifyGreaterThan(testCase.phase.minTemp, 0);

function pressureTest(testCase)
val = testCase.phase.P;
exp = 101325;
diff = abs(val - exp)/exp;
testCase.verifyLessThanOrEqual(diff, testCase.rtol);

val = testCase.phase.D;
exp = 0.081894;
diff = abs(val - exp)/exp;
testCase.verifyLessThanOrEqual(diff, testCase.rtol);

val = testCase.phase.V;
exp = 1/0.081894;
diff = abs(val - exp)/exp;
testCase.verifyLessThanOrEqual(diff, testCase.rtol);

val = testCase.phase.molarDensity;
exp = testCase.phase.D/testCase.phase.meanMolecularWeight;
diff = abs(val - exp)/exp;
testCase.verifyLessThanOrEqual(diff, testCase.rtol);

testCase.verifyEqual(testCase.phase.eosType, 'ideal-gas');
testCase.verifyTrue(testCase.phase.isIdealGas);

val = testCase.phase.X;
exp = zeros(1, 10);
exp(1) = 1.0;
testCase.verifyEqual(val, exp);

val = testCase.phase.Y;
testCase.verifyEqual(val, exp);

val1 = [testCase.phase.H, testCase.phase.S, ...
testCase.phase.U, testCase.phase.G, ...
testCase.phase.cp,testCase.phase.cv];
testCase.phase.basis = 'mass';
val2 = [testCase.phase.H, testCase.phase.S, ...
testCase.phase.U, testCase.phase.G, ...
testCase.phase.cp,testCase.phase.cv];
exp = val2.*testCase.phase.meanMolecularWeight;
testCase.verifyEqual(val1, exp);

end

function checkSetters(testCase)

end

function testInvalidProperty(testCase)
testCase.verifyError(@() testCase.getInvalidProperty(),...
'MATLAB:noSuchMethodOrField');
testCase.verifyError(@() testCase.setInvalidProperty(300),...
'MATLAB:noPublicFieldForClass');
end

function temperatureSetTest(testCase)
Expand All @@ -67,14 +304,15 @@ function temperatureSetTest(testCase)
testCase.verifyLessThanOrEqual(diff, testCase.rtol);

setPoint = -1;
errMessage = ?MException;
function setTnegative(sp)
testCase.phase.TP = {sp, testCase.phase.P};
end
errMessage = 'Cantera:ctError';

testCase.verifyError(@() setTnegative(setPoint), ...
errMessage);
end
% testCase.verifyError(@() testCase.setInvalidValue('TP',...
% {setPoint, testCase.phase.P}), ...
% errMessage);
testCase.verifyThat(@() testCase.setInvalidValue('TP',...
{setPoint, testCase.phase.P}), ...
Throws(errMessage));
end

end

Expand Down

0 comments on commit 9e13e3e

Please sign in to comment.