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
