cantera/interfaces/matlab/toolbox/@Solution/set.m

174 lines
4.3 KiB
Matlab

function a = set(a,varargin)
% SET - Set properties.
%
% The properties that may be set are
%
% Temperature (T)
% Density (Rho)
% Volume (V)
% Pressure (P)
% Enthalpy (H)
% Entropy (S)
% MoleFractions (X)
% MassFractions (Y)
% Vapor Fraction (Vapor)
% Liquid Fractio (Liquid)
%
% Either the full property name or the symbol may be
% specified. For the extensive properties (V,H,U,S), the values
% must be given per unit mass. H, U, and S must be set in
% conjunction with pressure (for H,S) or volume (for U,S). Either
% (specific) volume or density may be specified. Mole and mass
% fractions must be input as vectors (either row or column) with
% length equal to the number of species.
%
% Examples:
%
% set(gas,'Temperature',600.0);
% set(gas,'T',600.0);
% set(gas,'T',600.0,'P',2*oneatm,'Y',massfracs);
% set(gas,'H',0.5*enthalpy_mass(gas),'P',pressure(gas));
% set(gas,'S',entropy_mass(gas),'P',0.5*pressure(gas));
% set(gas,'X',ones(nSpecies(gas),1));
% set(gas,'T',500.0,'Vapor',0.8)
%
% Alternatively, individual methods to set properties may be
% called (setTemperature, setMoleFractions, etc.)
%
property_argin = varargin;
tval = -999;
pval = -999;
hval = -999;
uval = -999;
sval = -999;
vval = -999;
qval = -999;
np = 0;
nt = 0;
nv = 0;
nx = 0;
ny = 0;
ns = 0;
nh = 0;
nu = 0;
nq = 0;
while length(property_argin) >= 2,
prop = property_argin{1};
val = property_argin{2};
property_argin = property_argin(3:end);
switch prop
case 'Temperature'
nt = nt + 1;
tval = val;
case 'T'
nt = nt + 1;
tval = val;
case 'Density'
nv = nv + 1;
vval = 1.0/val;
case 'Rho'
nv = nv + 1;
vval = 1.0/val;
case 'V'
nv = nv + 1;
vval = val;
case 'MoleFractions'
nx = nx + 1;
setMoleFractions(a,val);
case 'X'
nx = nx + 1;
setMoleFractions(a,val);
case 'MassFractions'
ny = ny + 1;
setMassFractions(a,val);
case 'Y'
ny = ny + 1;
setMassFractions(a,val);
case 'Pressure'
pval = val;
np = np + 1;
case 'P'
pval = val;
np = np + 1;
case 'Enthalpy'
hval = val;
nh = nh + 1;
case 'H'
hval = val;
nh = nh + 1;
case 'IntEnergy'
uval = val;
nu = nu + 1;
case 'U'
uval = val;
nu = nu + 1;
case 'Entropy'
sval = val;
ns = ns + 1;
case 'S'
sval = val;
ns = ns + 1;
case 'Sat'
qval = val;
nq = nq + 1;
case 'Vapor'
qval = val;
nq = nq + 1;
case 'Liquid'
qval = 1.0 - val;
nq = nq + 1;
otherwise
error(['unknown property ' char(prop)])
end
end
if nx + ny > 1
error('composition specified multiple times');
end
ntot = nt + np + nv + ns + nh + nu + nq;
if ntot == 1
%
% set T, v, or P individually
%
if nt == 1
setTemperature(a,tval); % density held fixed
elseif nv == 1
setDensity(a,1.0/vval); % temperature held fixed
elseif np == 1
setPressure(a, pval); % temperature held fixed
else
error('pressure, volume, or density must also be specified');
end
elseif ntot == 2
%
% set property pairs
%
if nt == 1 && nv == 1
setTemperature(a,tval);
setDensity(a,1.0/vval);
elseif nt == 1 && np == 1
setTemperature(a,tval);
setPressure(a, pval);
elseif nt == 1 && nq == 1
setState_Tsat(a, [tval,qval]);
elseif np == 1 && nq == 1
setState_Psat(a, [pval,qval]);
elseif np == 1 && nh == 1
setState_HP(a,[hval,pval]);
elseif nu == 1 && nv == 1
setState_UV(a,[uval,vval]);
elseif ns == 1 && np == 1
setState_SP(a,[sval,pval]);
elseif ns == 1 && nv == 1
setState_SV(a,[sval,vval]);
else
error('unimplemented property pair');
end
elseif ntot > 2
error('too many properties specified');
end