public Variable GetAverageVaporDensityExpression(ThermodynamicSystem system, Variable T, Variable p, List <Variable> y) { var NC = system.Components.Count; if ((system.EquilibriumMethod.EquilibriumApproach == EquilibriumApproach.PhiPhi && system.EquilibriumMethod.EquationOfState == EquationOfState.SoaveRedlichKwong) || (system.EquilibriumMethod.EquilibriumApproach == EquilibriumApproach.GammaPhi && system.EquilibriumMethod.Fugacity == FugacityMethod.SoaveRedlichKwong)) { var rhoV = new VOL_SRK(system, T, p, y); var pavg = Sym.Binding("DENV", 1.0 / rhoV); pavg.Subscript = "SRK"; return(pavg); } else { var R = new Variable("R", 8.3144621, SI.J / SI.mol / SI.K); var expression = p / (R * T); Variable prop = new Variable("DENV" + "(" + T.FullName + ")", 1); prop.Subscript = "ideal"; prop.BindTo(expression); return(prop); } }
public EnthalpyRoute(ThermodynamicSystem system, Variable T, Variable p, List <Variable> x, PhaseState phase) { Symbol = "H" + (phase == PhaseState.Liquid ? "L" : "V"); _system = system; this.T = T; this.p = p; this.x = x; Parameters.Add(T); Parameters.Add(p); foreach (var comp in x) { Parameters.Add(comp); } NC = _system.Components.Count; _hi = new Expression[NC]; for (int i = 0; i < NC; i++) { if (phase == PhaseState.Liquid) { _hi[i] = x[i] * _system.EquationFactory.GetLiquidEnthalpyExpression(_system, i, T); } else { _hi[i] = x[i] * _system.EquationFactory.GetVaporEnthalpyExpression(_system, i, T); } } _htotal = Sym.Binding(Symbol, (Sym.Sum(0, NC, (idx) => _hi[idx]))); DiffFunctional = (cache, v) => NumDiff(cache, v); EvalFunctional = (cache) => Evaluate(cache); }
public VOL_SRK(ThermodynamicSystem system, Variable T, Variable p, List <Variable> y) { _system = system; this._T = T; this._p = p; this.Phase = PhaseState.Vapour; Symbol = "VOL_SRK"; var NC = system.Components.Count; var ai = new double[NC]; var bi = new double[NC]; var Ai = new Expression[NC]; var aij = new Expression[NC, NC]; var bij = new double[NC, NC]; double[,] kij = new double[NC, NC]; double[,] kbij = new double[NC, NC]; // Parameters.Add(T); // Parameters.Add(p); // foreach (var c in y) // Parameters.Add(c); var parameterSet = _system.BinaryParameters.FirstOrDefault(ps => ps.Name == "SRK"); if (parameterSet != null) { kij = parameterSet.Matrices["kij"]; if (parameterSet.Matrices.ContainsKey("kbij")) { kbij = parameterSet.Matrices["kbij"]; } } for (int i = 0; i < system.Components.Count; i++) { var comp = system.Components[i]; var TC = comp.GetConstant(ConstantProperties.CriticalTemperature); var PC = comp.GetConstant(ConstantProperties.CriticalPressure); var AC = comp.GetConstant(ConstantProperties.AcentricFactor); if (comp.HasParameter(MethodTypes.RKS, "A")) { ai[i] = comp.GetParameter(MethodTypes.RKS, "A").ValueInSI; } else { ai[i] = 0.42748 * Math.Pow(_R.ValueInSI, 2.0) * Math.Pow(TC.ValueInSI, 2.0) / PC.ValueInSI; } if (comp.HasParameter(MethodTypes.RKS, "B")) { bi[i] = comp.GetParameter(MethodTypes.RKS, "B").ValueInSI; } else { bi[i] = 0.0867 * _R.ValueInSI * TC.ValueInSI / PC.ValueInSI; } var mi = 0.48 + 1.574 * AC.ValueInSI - 0.176 * Math.Pow(AC.ValueInSI, 2); var TR = Sym.Binding("TR", T / TC); var alphai = Sym.Pow(1.0 + mi * (1 - Sym.Sqrt(TR)), 2.0); Ai[i] = alphai * ai[i]; } for (int i = 0; i < system.Components.Count; i++) { for (int j = 0; j < system.Components.Count; j++) { aij[i, j] = Sym.Sqrt(Ai[i] * Ai[j]) * (1 - kij[i, j]); bij[i, j] = (bi[i] + bi[j]) / 2.0 * (1 - kbij[i, j]); } } _A = Sym.Sum(0, NC, i => y[i] * Sym.Sum(0, NC, j => y[j] * aij[i, j])); _B = Sym.Sum(0, NC, i => y[i] * Sym.Sum(0, NC, j => y[j] * bij[i, j])); DiffFunctional = (cache, v) => NumDiff(cache, v); EvalFunctional = (cache) => Evaluate(cache); }
public K_EOS_SRK(ThermodynamicSystem system, Variable T, Variable p, List <Variable> x, List <Variable> y, int idx) { index = idx; _system = system; this.T = T; this.p = p; this.x = x; this.y = y; Symbol = "EQ_SRK"; Parameters.Add(T); Parameters.Add(p); foreach (var c in x) { Parameters.Add(c); } foreach (var c in y) { Parameters.Add(c); } NC = system.Components.Count; var ai = new double[NC]; var bi = new double[NC]; var Ai = new Expression[NC]; var aij = new Expression[NC, NC]; var bij = new double[NC, NC]; double[,] kij = new double[NC, NC]; double[,] kbij = new double[NC, NC]; var parameterSet = _system.BinaryParameters.FirstOrDefault(ps => ps.Name == "SRK"); if (parameterSet != null) { kij = parameterSet.Matrices["kij"]; if (parameterSet.Matrices.ContainsKey("kbij")) { kbij = parameterSet.Matrices["kbij"]; } } for (int i = 0; i < system.Components.Count; i++) { var comp = system.Components[i]; var TC = comp.GetConstant(ConstantProperties.CriticalTemperature); var PC = comp.GetConstant(ConstantProperties.CriticalPressure); var AC = comp.GetConstant(ConstantProperties.AcentricFactor); if (comp.HasParameter(MethodTypes.RKS, "A")) { ai[i] = comp.GetParameter(MethodTypes.RKS, "A").ValueInSI; } else { ai[i] = 0.42748 * Math.Pow(R.ValueInSI, 2.0) * Math.Pow(TC.ValueInSI, 2.0) / PC.ValueInSI; } if (comp.HasParameter(MethodTypes.RKS, "B")) { bi[i] = comp.GetParameter(MethodTypes.RKS, "B").ValueInSI; } else { bi[i] = 0.0867 * R.ValueInSI * TC.ValueInSI / PC.ValueInSI; } var mi = 0.48 + 1.574 * AC.ValueInSI - 0.176 * Math.Pow(AC.ValueInSI, 2); var TR = Sym.Binding("TR", T / TC); var alphai = Sym.Pow(1.0 + mi * (1 - Sym.Sqrt(TR)), 2.0); Ai[i] = alphai * ai[i]; } for (int i = 0; i < system.Components.Count; i++) { for (int j = 0; j < system.Components.Count; j++) { aij[i, j] = Sym.Sqrt(Ai[i] * Ai[j]) * (1 - kij[i, j]); bij[i, j] = (bi[i] + bi[j]) / 2.0 * (1 - kbij[i, j]); } } for (int ph = 0; ph < 2; ph++) { var z = x; if (ph == 1) { z = y; } var am = Sym.Sum(0, NC, i => z[i] * Sym.Sum(0, NC, j => z[j] * aij[i, j])); var asi = Sym.Sum(0, NC, j => z[j] * aij[idx, j]); var bm = Sym.Sum(0, NC, i => z[i] * Sym.Sum(0, NC, j => z[j] * bij[i, j])); var bsi = Sym.Sum(0, NC, j => z[j] * bij[idx, j]); var vme = new VOL_SRK(T, p, am, bm, ph == 0 ? PhaseState.Liquid : PhaseState.Vapour); var vm = Sym.Binding("vm", vme); var Bi = 2 * bsi - bm; var zm = p * vm / (R * T); var eterm = -am / (bm * R * T) * (2 * asi / am - Bi / bm) * Sym.Ln(1 + bm / vm) + Bi / bm * (zm - 1); var eVariable = Sym.Binding("RKS_E", eterm); //PHI[ph] = (R * T) / ((vm - bm) * p) * Sym.Exp(eVariable); PHI[ph] = 1.0 / ((vm - bm)) * Sym.Exp(eVariable); } //_kEOS_SRK = Sym.Exp(lnPHI[0] - lnPHI[1]); _kEOS_SRK = PHI[0] / PHI[1]; _dphiDx = new Expression[NC]; _dphiDy = new Expression[NC]; DiffFunctional = (cache, v) => _kEOS_SRK.Diff(cache, v); EvalFunctional = (cache) => Evaluate(cache); }