mirror of
https://github.com/Cantera/cantera.git
synced 2025-02-25 18:55:29 -06:00
[MATLAB] Added Equilibrium Tests
This commit is contained in:
parent
68f9bc8fda
commit
ff9cbf73bb
235
test/matlab_experimental/ctTestEquilibrium.m
Normal file
235
test/matlab_experimental/ctTestEquilibrium.m
Normal file
@ -0,0 +1,235 @@
|
||||
classdef ctTestEquilibrium < matlab.unittest.TestCase
|
||||
|
||||
properties
|
||||
phase
|
||||
mix
|
||||
end
|
||||
|
||||
properties (SetAccess = immutable)
|
||||
rtol = 1e-6;
|
||||
atol = 1e-8;
|
||||
end
|
||||
|
||||
methods (TestClassSetup)
|
||||
|
||||
function testSetUp(self)
|
||||
ctTestSetUp
|
||||
copyfile('../data/equilibrium.yaml', './equilibrium.yaml');
|
||||
copyfile('../data/IdealSolidSolnPhaseExample.yaml', ...
|
||||
'./IdealSolidSolnPhaseExample.yaml');
|
||||
copyfile('../data/koh-equil-TP.csv', './koh-equil-TP.csv');
|
||||
copyfile('../data/koh-equil-HP.csv', './koh-equil-HP.csv');
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
methods (TestClassTeardown)
|
||||
|
||||
function testTearDown(self)
|
||||
delete('./equilibrium.yaml');
|
||||
delete('./IdealSolidSolnPhaseExample.yaml');
|
||||
delete('./koh-equil-TP.csv');
|
||||
delete('./koh-equil-HP.csv');
|
||||
ctCleanUp
|
||||
ctTestTearDown
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
methods (TestMethodTeardown)
|
||||
|
||||
function deleteSolution(self)
|
||||
clear self.phase self.mix
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
methods
|
||||
function checkval(self, names, moles)
|
||||
ntot = sum(moles);
|
||||
xx = moles ./ ntot;
|
||||
for i = 1:length(names)
|
||||
val = self.phase.X(self.phase.speciesIndex(names{i}));
|
||||
self.verifyEqual(val, xx(i), 'AbsTol', self.atol);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
methods (Test)
|
||||
|
||||
function testEquilCompleteStoichiometric(self)
|
||||
self.phase = Solution('equilibrium.yaml', 'complete');
|
||||
self.phase.TPX = {298, 1.0e6, 'CH4:1.0, O2:2.0'};
|
||||
self.phase.equilibrate('TP');
|
||||
|
||||
names = {'CH4', 'O2', 'H2O', 'CO2'};
|
||||
moles = [0, 0, 2, 1];
|
||||
self.checkval(names, moles);
|
||||
end
|
||||
|
||||
function testEquilCompleteLean(self)
|
||||
self.phase = Solution('equilibrium.yaml', 'complete');
|
||||
self.phase.TPX = {298, 1.0e6, 'CH4:1.0, O2:3.0'};
|
||||
self.phase.equilibrate('TP');
|
||||
|
||||
names = {'CH4', 'O2', 'H2O', 'CO2'};
|
||||
moles = [0, 1, 2, 1];
|
||||
self.checkval(names, moles);
|
||||
end
|
||||
|
||||
function testEquilIncompleteStoichiometric(self)
|
||||
self.phase = Solution('equilibrium.yaml', 'incomplete');
|
||||
self.phase.TPX = {301, 1.0e6, 'CH4:1.0, O2:2.0'};
|
||||
self.phase.equilibrate('TP');
|
||||
|
||||
names = {'CH4', 'O2', 'H2O', 'CO2'};
|
||||
moles = [0, 0, 2, 1];
|
||||
self.checkval(names, moles);
|
||||
end
|
||||
|
||||
function testEquilIncompleteLean(self)
|
||||
self.phase = Solution('equilibrium.yaml', 'incomplete');
|
||||
self.phase.TPX = {301, 1.0e6, 'CH4:1.0, O2:3.0'};
|
||||
self.phase.equilibrate('TP');
|
||||
|
||||
names = {'CH4', 'O2', 'H2O', 'CO2'};
|
||||
moles = [0, 1, 2, 1];
|
||||
self.checkval(names, moles);
|
||||
end
|
||||
|
||||
function testEquilGriStoichiometric(self)
|
||||
self.phase = Solution('gri30.yaml', '', 'none');
|
||||
self.phase.TPX = {301, 1.0e6, 'CH4:1.0, O2:2.0'};
|
||||
self.phase.equilibrate('TP');
|
||||
|
||||
names = {'CH4', 'O2', 'H2O', 'CO2'};
|
||||
moles = [0, 0, 2, 1];
|
||||
self.checkval(names, moles);
|
||||
end
|
||||
|
||||
function testEquilGriLean(self)
|
||||
self.phase = Solution('gri30.yaml', '', 'none');
|
||||
self.phase.TPX = {301, 1.0e6, 'CH4:1.0, O2:3.0'};
|
||||
self.phase.equilibrate('TP');
|
||||
|
||||
names = {'CH4', 'O2', 'H2O', 'CO2'};
|
||||
moles = [0, 1, 2, 1];
|
||||
self.checkval(names, moles);
|
||||
end
|
||||
|
||||
function testEquilOverconstrained1(self)
|
||||
self.phase = Solution('equilibrium.yaml', 'overconstrained-1');
|
||||
self.phase.TPX = {301, 1.0e6, 'CH4:1.0, O2:1.0'};
|
||||
self.phase.equilibrate('TP');
|
||||
|
||||
names = {'CH4', 'O2'};
|
||||
moles = [1, 1];
|
||||
self.checkval(names, moles);
|
||||
end
|
||||
|
||||
function testEquilOverconstrained2(self)
|
||||
self.phase = Solution('equilibrium.yaml', 'overconstrained-2');
|
||||
self.phase.TPX = {301, 1.0e6, 'CH4:1.0, O2:1.0'};
|
||||
self.phase.equilibrate('TP');
|
||||
|
||||
names = {'CH4', 'O2'};
|
||||
moles = [1, 1];
|
||||
self.checkval(names, moles);
|
||||
end
|
||||
|
||||
function testEquilGriStoichiometricGibbs(self)
|
||||
self.phase = Solution('equilibrium.yaml', '', 'none');
|
||||
self.phase.TPX = {301, 1.0e6, 'CH4:1.0, O2:1.0'};
|
||||
self.phase.equilibrate('TP', 'gibbs');
|
||||
|
||||
names = {'CH4', 'O2', 'H2O', 'CO2'};
|
||||
moles = [0, 0, 2, 1];
|
||||
|
||||
self.assumeFail('Skipping multi-phase equilibrium test');
|
||||
self.checkval(names, moles);
|
||||
end
|
||||
|
||||
function testEquilGriLeanGibbs(self)
|
||||
self.phase = Solution('equilibrium.yaml', '', 'none');
|
||||
self.phase.TPX = {301, 1.0e6, 'CH4:1.0, O2:3.0'};
|
||||
self.phase.equilibrate('TP', 'gibbs');
|
||||
|
||||
names = {'CH4', 'O2', 'H2O', 'CO2'};
|
||||
moles = [0, 1, 2, 1];
|
||||
|
||||
self.assumeFail('Skipping multi-phase equilibrium test');
|
||||
self.checkval(names, moles);
|
||||
end
|
||||
|
||||
function testKOHEquilTP(self)
|
||||
phasenames = {'K_solid', 'K_liquid', ...
|
||||
'KOH_a', 'KOH_b', 'KOH_liquid', ...
|
||||
'K2O2_solid', 'K2O_solid', 'KO2_solid', ...
|
||||
'ice', 'liquid_water', 'KOH_plasma'};
|
||||
phases = ImportPhases('KOH.yaml', phasenames);
|
||||
self.mix = Mixture(phases);
|
||||
|
||||
temp = 350:300:5000;
|
||||
data = zeros(length(temp), self.mix.nSpecies + 1);
|
||||
data(:, 1) = temp;
|
||||
|
||||
for i = 1:length(temp)
|
||||
self.mix.T = temp(i);
|
||||
self.mix.P = OneAtm;
|
||||
self.mix.setSpeciesMoles('K:1.03, H2:2.12, O2:0.9');
|
||||
self.mix.equilibrate('TP');
|
||||
|
||||
data(i, 2:end) = self.mix.speciesMoles;
|
||||
end
|
||||
|
||||
refData = readmatrix('koh-equil-TP.csv');
|
||||
self.verifySize(data, size(refData), ...
|
||||
'Generated data does not match reference size');
|
||||
self.verifyEqual(data, refData, 'AbsTol', self.atol);
|
||||
end
|
||||
|
||||
function testKOHEquilHP(self)
|
||||
phasenames = {'K_solid', 'K_liquid', ...
|
||||
'KOH_a', 'KOH_b', 'KOH_liquid', ...
|
||||
'K2O2_solid', 'K2O_solid', 'KO2_solid', ...
|
||||
'ice', 'liquid_water', 'KOH_plasma'};
|
||||
phases = ImportPhases('KOH.yaml', phasenames);
|
||||
self.mix = Mixture(phases);
|
||||
|
||||
temp = 350:300:5000;
|
||||
dT = 1;
|
||||
data = zeros(length(temp), self.mix.nSpecies + 2);
|
||||
data(:, 1) = temp;
|
||||
|
||||
self.mix.P = OneAtm;
|
||||
for i = 1:length(temp)
|
||||
self.mix.setSpeciesMoles('K:1.03, H2:2.12, O2:0.9');
|
||||
self.mix.T = temp(i) - dT;
|
||||
self.mix.equilibrate('TP');
|
||||
self.mix.T = temp(i);
|
||||
self.mix.equilibrate('HP');
|
||||
|
||||
data(i, 2) = self.mix.T;
|
||||
data(i, 3:end) = self.mix.speciesMoles;
|
||||
end
|
||||
|
||||
refData = readmatrix('koh-equil-HP.csv');
|
||||
self.verifySize(data, size(refData), ...
|
||||
'Generated data does not match reference size');
|
||||
self.verifyEqual(data, refData, 'AbsTol', self.atol);
|
||||
end
|
||||
|
||||
function testIdealSolidSolnPhaseEquil(self)
|
||||
self.phase = Solution('IdealSolidSolnPhaseExample.yaml');
|
||||
self.phase.TPX = {500, OneAtm, 'C2H2-graph: 1.0'};
|
||||
self.phase.equilibrate('TP', 'element_potential');
|
||||
|
||||
self.verifyEqual(self.phase.X(self.phase.speciesIndex('C-graph')), ...
|
||||
2.0/3.0, 'AbsTol', self.atol);
|
||||
self.verifyEqual(self.phase.X(self.phase.speciesIndex('H2-solute')), ...
|
||||
1.0/3.0, 'AbsTol', self.atol);
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
Loading…
Reference in New Issue
Block a user