예제 #1
0
        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);
            }
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }