예제 #1
0
파일: Valve.cs 프로젝트: shao130/OpenFMSL
        public Valve(string name, ThermodynamicSystem system) : base(name, system)
        {
            Class         = "Valve";
            Icon.IconType = IconTypes.Valve;
            MaterialPorts.Add(new Port <MaterialStream>("In", PortDirection.In, 1));
            MaterialPorts.Add(new Port <MaterialStream>("Out", PortDirection.Out, 1));

            dp = system.VariableFactory.CreateVariable("DP", "Pressure Drop", PhysicalDimension.Pressure);
            p1 = system.VariableFactory.CreateVariable("P1", "Pressure in valve inlet", PhysicalDimension.Pressure);
            p2 = system.VariableFactory.CreateVariable("P2", "Pressure in valve outlet", PhysicalDimension.Pressure);

            KVS = new Variable("KVS", 10, 0, 1e6, SI.cum / SI.h / METRIC.bar, "Nominal valve coefficient");
            KV  = new Variable("KV", 10, 0, 1e6, SI.cum / SI.h / METRIC.bar, "Effective valve coefficient");

            Opening  = new Variable("Open", 50, 0, 100, SI.nil, "Valve opening in %");
            Position = new Variable("Pos", 50, 0, 100, SI.nil, "Valve position in %");

            dp.LowerBound = 0;
            dp.ValueInSI  = 0;
            AddVariable(dp);
            AddVariable(KVS);
            AddVariable(KV);
            AddVariable(Opening);
            AddVariable(Position);
            AddVariable(p1);
            AddVariable(p2);
        }
예제 #2
0
파일: Heater.cs 프로젝트: shao130/OpenFMSL
        public Heater(string name, ThermodynamicSystem system) : base(name, system)
        {
            Class         = "Heater";
            Icon.IconType = IconTypes.Heater;

            MaterialPorts.Add(new Port <MaterialStream>("In", PortDirection.In, 1));
            MaterialPorts.Add(new Port <MaterialStream>("Out", PortDirection.Out, 1));
            HeatPorts.Add(new Port <HeatStream>("Duty", PortDirection.In, 1));

            dp            = system.VariableFactory.CreateVariable("DP", "Pressure Drop", PhysicalDimension.Pressure);
            p             = system.VariableFactory.CreateVariable("P", "Pressure in heater outlet", PhysicalDimension.Pressure);
            T             = system.VariableFactory.CreateVariable("T", "Temperature in heater outlet", PhysicalDimension.Temperature);
            VF            = system.VariableFactory.CreateVariable("VF", "Vapor fraction in heater outlet", PhysicalDimension.MolarFraction);
            Q             = system.VariableFactory.CreateVariable("Q", "Heat Duty", PhysicalDimension.HeatFlow);
            dp.LowerBound = 0;
            dp.ValueInSI  = 0;



            AddVariable(dp);
            AddVariable(p);
            AddVariable(T);
            AddVariable(VF);
            AddVariable(Q);
        }
예제 #3
0
        public FeedStage(string name, ThermodynamicSystem system) : base(name, system)
        {
            Class         = "Flash";
            Icon.IconType = IconTypes.FeedStage;

            MaterialPorts.Add(new Port <MaterialStream>("In", PortDirection.In, 1));
            MaterialPorts.Add(new Port <MaterialStream>("VIn", PortDirection.In, 1));
            MaterialPorts.Add(new Port <MaterialStream>("LIn", PortDirection.In, 1));
            MaterialPorts.Add(new Port <MaterialStream>("VOut", PortDirection.Out, 1));
            MaterialPorts.Add(new Port <MaterialStream>("LOut", PortDirection.Out, 1));

            dp = system.VariableFactory.CreateVariable("DP", "Pressure Drop", PhysicalDimension.Pressure);
            p  = system.VariableFactory.CreateVariable("P", "Pressure in flash", PhysicalDimension.Pressure);
            T  = system.VariableFactory.CreateVariable("T", "Temperature in flash", PhysicalDimension.Temperature);
            Q  = system.VariableFactory.CreateVariable("Q", "Heat Duty", PhysicalDimension.HeatFlow);

            K = new Variable[system.Components.Count];
            for (int i = 0; i < system.Components.Count; i++)
            {
                K[i]           = system.VariableFactory.CreateVariable("K", "Equilibrium partition coefficient", PhysicalDimension.Dimensionless);
                K[i].Subscript = system.Components[i].ID;
                K[i].ValueInSI = 1.2;
            }
            dp.LowerBound = -1e10;
            dp.ValueInSI  = 0;

            AddVariable(p);
            AddVariable(T);
            AddVariable(Q);

            AddVariable(dp);
            AddVariables(K);
        }
예제 #4
0
        public BlackBoxReactor(string name, ThermodynamicSystem system, int numberOfReactions) : base(name, system)
        {
            Class = "Reactor";
            _numberOfReactions = numberOfReactions;

            MaterialPorts.Add(new Port <MaterialStream>("In", PortDirection.In, 1));
            MaterialPorts.Add(new Port <MaterialStream>("Out", PortDirection.Out, 1));

            R             = new Variable[_numberOfReactions];
            DHR           = new Variable[_numberOfReactions];
            _stochiometry = new double[_numberOfReactions, System.Components.Count];

            for (int i = 0; i < _numberOfReactions; i++)
            {
                R[i]             = system.VariableFactory.CreateVariable("R", (i + 1).ToString(), "Converted Molar Flow for reaction " + (i + 1).ToString(), PhysicalDimension.MolarFlow);
                DHR[i]           = system.VariableFactory.CreateVariable("DHR", (i + 1).ToString(), "Reaction enthalpy", PhysicalDimension.SpecificMolarEnthalpy);
                DHR[i].ValueInSI = 0;
                DHR[i].IsFixed   = true;
            }

            dp = system.VariableFactory.CreateVariable("DP", "Pressure Drop", PhysicalDimension.Pressure);
            p  = system.VariableFactory.CreateVariable("P", "Pressure in heater outlet", PhysicalDimension.Pressure);
            T  = system.VariableFactory.CreateVariable("T", "Temperature in heater outlet", PhysicalDimension.Temperature);
            Q  = system.VariableFactory.CreateVariable("Q", "Heat Duty", PhysicalDimension.HeatFlow);


            dp.LowerBound = -1e9;
            dp.ValueInSI  = 0;
            AddVariable(dp);
            AddVariable(p);
            AddVariable(T);
            AddVariables(R);
            AddVariable(Q);
            AddVariables(DHR);
        }
예제 #5
0
        public void Show(ThermodynamicSystem system)
        {
            var vm = _thermoEditorFactory.Create(system);

            _aggregator.PublishOnUIThread(new AddNewDocumentMessage {
                TimeStamp = DateTime.Now, Sender = this, Title = system.Name, Parameter = vm
            });
        }
예제 #6
0
        public MixtureHenryCoefficient(ThermodynamicSystem system, Variable T, List<Variable> x, int idx)
        {
            index = idx;
            _system = system;

            var parameterSet = _system.BinaryParameters.FirstOrDefault(ps => ps.Name == "HENRY");
            if (parameterSet == null)
                throw new ArgumentNullException("No HENRY parameters defined");

            double[,] a = parameterSet.Matrices["A"];
            double[,] b = parameterSet.Matrices["B"];
            double[,] c = parameterSet.Matrices["C"];
            double[,] d = parameterSet.Matrices["D"];


            Symbol = "HENRY";

            this.T = T;
            this.x = x;

            Parameters.Add(T);
            foreach (var comp in x)
                Parameters.Add(comp);

            NC = system.Components.Count;

            Expression sumxj = 0;
            Expression _lnHenry = 0;

            for (int j = 0; j < system.Components.Count; j++)
            {
                if (!system.Components[j].IsInert)
                {

                    Expression lnHij = a[idx, j];
                    if (b[idx, j] != 0.0)
                        lnHij += b[idx, j] / T;
                    if (c[idx, j] != 0.0)
                        lnHij += c[idx, j] * Sym.Ln(T);
                    if (d[idx, j] != 0.0)
                        lnHij += d[idx, j] * T;

                    sumxj += x[j];
                    _lnHenry += x[j] * Sym.Par(lnHij);
                }
            }

            _lnHenry = _lnHenry / Sym.Par(sumxj);

            _henry = Sym.Exp(_lnHenry);

            _dhenryDx = new Expression[NC];

            DiffFunctional = (cache, v) => _henry.Diff(cache, v);
            EvalFunctional = (cache) => _henry.Eval(cache);
        }
예제 #7
0
        public EquilibriumTray(int number, ThermodynamicSystem system)
        {
            _system = system;
            Number  = number;
            var numString = number.ToString();

            T             = system.VariableFactory.CreateVariable("T", numString, "Stage Temperature", PhysicalDimension.Temperature);
            TV            = system.VariableFactory.CreateVariable("TV", numString, "Stage Vapor Temperature", PhysicalDimension.Temperature);
            DP            = system.VariableFactory.CreateVariable("DP", numString, "Pressure Drop", PhysicalDimension.Pressure);
            DP.LowerBound = 0;
            DP.ValueInSI  = 0;

            p = system.VariableFactory.CreateVariable("P", numString, "Stage Pressure", PhysicalDimension.Pressure);
            Q = system.VariableFactory.CreateVariable("Q", numString, "Heat Duty", PhysicalDimension.HeatFlow);

            L = system.VariableFactory.CreateVariable("L", numString, "Liquid molar flow", PhysicalDimension.MolarFlow);
            V = system.VariableFactory.CreateVariable("V", numString, "Vapor molar flow", PhysicalDimension.MolarFlow);
            U = system.VariableFactory.CreateVariable("U", numString, "Liquid molar flow", PhysicalDimension.MolarFlow);
            W = system.VariableFactory.CreateVariable("W", numString, "Vapor molar flow", PhysicalDimension.MolarFlow);
            F = system.VariableFactory.CreateVariable("F", numString, "Feed molar flow", PhysicalDimension.MolarFlow);

            RL            = system.VariableFactory.CreateVariable("RL", numString, "Liquid sidestream fraction", PhysicalDimension.Dimensionless);
            RV            = system.VariableFactory.CreateVariable("RV", numString, "Vapor sidestream fraction", PhysicalDimension.Dimensionless);
            RV.LowerBound = 0;
            RL.LowerBound = 0;

            HF = system.VariableFactory.CreateVariable("HF", numString, "Feed specific molar enthalpy", PhysicalDimension.SpecificMolarEnthalpy);
            HL = system.VariableFactory.CreateVariable("HL", numString, "Liquid specific molar enthalpy", PhysicalDimension.SpecificMolarEnthalpy);
            HV = system.VariableFactory.CreateVariable("HV", numString, "Vapor specific molar enthalpy", PhysicalDimension.SpecificMolarEnthalpy);

            eps            = system.VariableFactory.CreateVariable("eps", numString, "Tray efficiency", PhysicalDimension.Dimensionless);
            eps.ValueInSI  = 1;
            eps.LowerBound = 0;
            eps.UpperBound = 1;

            K   = new Variable[system.Components.Count];
            x   = new Variable[system.Components.Count];
            y   = new Variable[system.Components.Count];
            yeq = new Variable[system.Components.Count];
            z   = new Variable[system.Components.Count];
            for (int i = 0; i < system.Components.Count; i++)
            {
                K[i]            = system.VariableFactory.CreateVariable("K", numString + ", " + system.Components[i].ID, "Equilibrium partition coefficient", PhysicalDimension.Dimensionless);
                K[i].ValueInSI  = 1.2;
                K[i].LowerBound = 1e-8;
                K[i].UpperBound = 1e6;
                x[i]            = system.VariableFactory.CreateVariable("x", numString + ", " + system.Components[i].ID, "Liquid molar fraction", PhysicalDimension.MolarFraction);
                y[i]            = system.VariableFactory.CreateVariable("y", numString + ", " + system.Components[i].ID, "Vapor molar fraction", PhysicalDimension.MolarFraction);
                yeq[i]          = system.VariableFactory.CreateVariable("yeq", numString + ", " + system.Components[i].ID, "Equilibrium Vapor molar fraction", PhysicalDimension.MolarFraction);
                z[i]            = system.VariableFactory.CreateVariable("z", numString + ", " + system.Components[i].ID, "Feed molar fraction", PhysicalDimension.MolarFraction);
            }
        }
예제 #8
0
        public Mixer(string name, ThermodynamicSystem system) : base(name, system)
        {
            Class         = "Mixer";
            Icon.IconType = IconTypes.Mixer;

            MaterialPorts.Add(new Port <MaterialStream>("In", PortDirection.In, -1));
            MaterialPorts.Add(new Port <MaterialStream>("Out", PortDirection.Out, 1));

            dp            = system.VariableFactory.CreateVariable("DP", "Pressure Drop", PhysicalDimension.Pressure);
            p             = system.VariableFactory.CreateVariable("P", "Pressure in mixer", PhysicalDimension.Pressure);
            dp.LowerBound = -1e8;
            dp.ValueInSI  = 0;
            AddVariable(dp);
            AddVariable(p);
        }
예제 #9
0
        public Splitter(string name, ThermodynamicSystem system) : base(name, system)
        {
            Class         = "Splitter";
            Icon.IconType = IconTypes.Splitter;
            MaterialPorts.Add(new Port <MaterialStream>("In", PortDirection.In, 1));
            MaterialPorts.Add(new Port <MaterialStream>("Out1", PortDirection.Out, 1));
            MaterialPorts.Add(new Port <MaterialStream>("Out2", PortDirection.Out, 1));

            dp            = system.VariableFactory.CreateVariable("DP", "Pressure Drop", PhysicalDimension.Pressure);
            p             = system.VariableFactory.CreateVariable("P", "Pressure in splitter", PhysicalDimension.Pressure);
            SplitFactor   = system.VariableFactory.CreateVariable("K", "Split factor (molar)", PhysicalDimension.MolarFraction);
            dp.LowerBound = 0;
            AddVariable(dp);
            AddVariable(SplitFactor);
            AddVariable(p);
        }
예제 #10
0
        public ShellAndTubeHeatExchanger(string name, ThermodynamicSystem system, int passes, int discretization) : base(name, system)
        {
            Class           = "Shell&Tube";
            Icon.IconType   = IconTypes.HeatExchanger;
            _numberOfPasses = passes;
            _discretization = discretization;

            MaterialPorts.Add(new Port <MaterialStream>("ShellIn", PortDirection.In, 1));
            MaterialPorts.Add(new Port <MaterialStream>("ShellOut", PortDirection.Out, 1));

            MaterialPorts.Add(new Port <MaterialStream>("TubeIn", PortDirection.In, 1));
            MaterialPorts.Add(new Port <MaterialStream>("TubeOut", PortDirection.Out, 1));

            _area     = system.VariableFactory.CreateVariable("A", "Area", PhysicalDimension.Area);
            _koverall = system.VariableFactory.CreateVariable("k", "Effective Heat Transfer Coefficient", PhysicalDimension.HeatTransferCoefficient);
            AddVariables(_area, _koverall);
        }
예제 #11
0
        public ActivityCoefficientWilson(ThermodynamicSystem system, Variable T, List <Variable> x, int idx)
        {
            Symbol  = "WILSON_GAMMA";
            _system = system;
            index   = idx;

            Parameters.Add(T);
            foreach (var comp in x)
            {
                Parameters.Add(comp);
            }

            NC     = system.Components.Count;
            this.T = T;
            this.x = x;

            var parameterSet = _system.BinaryParameters.FirstOrDefault(ps => ps.Name == "WILSON");

            if (parameterSet == null)
            {
                throw new ArgumentNullException("No WILSON parameters defined");
            }

            double[,] a = parameterSet.Matrices["A"];
            double[,] b = parameterSet.Matrices["B"];
            double[,] c = parameterSet.Matrices["C"];
            double[,] d = parameterSet.Matrices["D"];

            var lambda = new Expression[NC, NC];

            for (int i = 0; i < NC; i++)
            {
                for (int j = 0; j < NC; j++)
                {
                    lambda[i, j] = Sym.Exp(a[i, j] + b[i, j] / T + c[i, j] * Sym.Ln(T) + d[i, j] * T);
                }
            }
            Expression H1 = Sym.Sum(0, NC, (k) => x[k] * lambda[index, k]);
            Expression H2 = Sym.Sum(0, NC, (k) => x[k] * lambda[k, index] / Sym.Sum(0, NC, (j) => x[j] * lambda[k, j]));

            _gammaExp = Sym.Exp(1 - Sym.Ln(H1) - H2);
            _dgammaDx = new Expression[NC];

            DiffFunctional = (cache, v) => _gammaExp.Diff(cache, v);
            EvalFunctional = (cache) => _gammaExp.Eval(cache);
        }
예제 #12
0
파일: Adapter.cs 프로젝트: shao130/OpenFMSL
        void FillNRTL(ThermodynamicSystem system)
        {
            if (!File.Exists(".\\Data\\nrtl.ipd"))
            {
                throw new FileNotFoundException("NRTL parameter database not found. Please install ChemSep Lite and copy the nrtl.ipd file to the Data directory of this program.");
            }

            if (nrtlDB == null)
            {
                LoadNRTLDB();
            }

            var nrtlParamSet = new NRTL(system);

            if (system.BinaryParameters.Count(ps => ps.Name == "NRTL") == 0)
            {
                system.BinaryParameters.Add(nrtlParamSet);
            }

            //var Rcal = 1.9872;

            for (int i = 0; i < system.Components.Count; i++)
            {
                var c1 = system.Components[i];
                for (int j = i; j < system.Components.Count; j++)
                {
                    var c2 = system.Components[j];

                    var entry = (from e in nrtlDB
                                 where (e.Cas1 == c1.CasNumber && e.Cas2 == c2.CasNumber) || (e.Cas1 == c2.CasNumber && e.Cas2 == c1.CasNumber)
                                 select e).FirstOrDefault();

                    if (entry != null)
                    {
                        nrtlParamSet.SetParam("B", c1, c2, entry.Aij / 1.9872);
                        nrtlParamSet.SetParam("B", c2, c1, entry.Aji / 1.9872);

                        nrtlParamSet.SetParam("C", c1, c2, entry.Alpha);
                        nrtlParamSet.SetParam("C", c2, c1, entry.Alpha);
                        Write("Found NRTL parameter set for " + c1.ID + " / " + c2.ID + Environment.NewLine);
                    }
                }
            }
        }
예제 #13
0
파일: Phase.cs 프로젝트: shao130/OpenFMSL
        public Phase(string symbol, ThermodynamicSystem system)
        {
            Name    = symbol;
            _system = system;

            Temperature      = _system.VariableFactory.CreateVariable("T" + symbol, "Temperature", PhysicalDimension.Temperature);
            Pressure         = _system.VariableFactory.CreateVariable("p" + symbol, "Pressure", PhysicalDimension.Pressure);
            SpecificEnthalpy = _system.VariableFactory.CreateVariable("h" + symbol, "Molar specific enthalpy", PhysicalDimension.SpecificMolarEnthalpy);
            TotalEnthalpy    = _system.VariableFactory.CreateVariable("H" + symbol, "Total enthalpy", PhysicalDimension.Enthalpy);
            TotalVolumeflow  = _system.VariableFactory.CreateVariable("V" + symbol, "Volume flow", PhysicalDimension.VolumeFlow);
            TotalMolarflow   = _system.VariableFactory.CreateVariable("n" + symbol, "Total molar flow", PhysicalDimension.MolarFlow);
            TotalMassflow    = _system.VariableFactory.CreateVariable("m" + symbol, "Total mass flow", PhysicalDimension.MassFlow);
            Density          = _system.VariableFactory.CreateVariable("rho" + symbol, "Density", PhysicalDimension.MassDensity);
            DensityMolar     = _system.VariableFactory.CreateVariable("rhom" + symbol, "Density", PhysicalDimension.MolarDensity);
            TotalMolarVolume = _system.VariableFactory.CreateVariable("v" + symbol, "Total molar volume", PhysicalDimension.MolarVolume);


            Variables.Add(Temperature);
            Variables.Add(Pressure);
            Variables.Add(SpecificEnthalpy);
            Variables.Add(Density);
            Variables.Add(DensityMolar);
            Variables.Add(TotalEnthalpy);
            Variables.Add(TotalVolumeflow);
            Variables.Add(TotalMolarflow);
            Variables.Add(TotalMassflow);

            foreach (var comp in system.Components)
            {
                ComponentMolarFraction.Add(_system.VariableFactory.CreateVariable("x" + symbol, comp.ID, "Molar Fraction of component " + comp.ID, PhysicalDimension.MolarFraction));
                ComponentMassFraction.Add(_system.VariableFactory.CreateVariable("w" + symbol, comp.ID, "Molar Fraction of component " + comp.ID, PhysicalDimension.MassFraction));
                ComponentMolarflow.Add(_system.VariableFactory.CreateVariable("n" + symbol, comp.ID, "Molar flow of component " + comp.ID, PhysicalDimension.MolarFlow));
                ComponentMassflow.Add(_system.VariableFactory.CreateVariable("m" + symbol, comp.ID, "Mass flow of component " + comp.ID, PhysicalDimension.MassFlow));
                ComponentMolarVolume.Add(_system.VariableFactory.CreateVariable("v" + symbol, comp.ID, "Molar volume of component " + comp.ID, PhysicalDimension.MolarVolume));
                ComponentEnthalpy.Add(_system.VariableFactory.CreateVariable("h" + symbol, comp.ID, "Specific Molar Enthalpy of component " + comp.ID, PhysicalDimension.SpecificMolarEnthalpy));
            }

            Variables.AddRange(ComponentMolarFraction);
            Variables.AddRange(ComponentMassFraction);
            Variables.AddRange(ComponentMolarflow);
            Variables.AddRange(ComponentMassflow);
            Variables.AddRange(ComponentMolarVolume);
            Variables.AddRange(ComponentEnthalpy);
        }
예제 #14
0
파일: Adapter.cs 프로젝트: shao130/OpenFMSL
        public void FillBIPs(ThermodynamicSystem system)
        {
            switch (system.EquilibriumMethod.Activity)
            {
            case ActivityMethod.NRTL:
            case ActivityMethod.NRTLRP:
                FillNRTL(system);
                break;

            case ActivityMethod.UNIQUAC:
                FillUniquac(system);
                break;
            }

            if (system.EquilibriumMethod.Fugacity == FugacityMethod.SoaveRedlichKwong || system.EquilibriumMethod.EquationOfState == EquationOfState.SoaveRedlichKwong)
            {
                FillSRK(system);
            }
        }
예제 #15
0
        public Decanter(string name, ThermodynamicSystem system) : base(name, system)
        {
            Class         = "Decanter";
            Icon.IconType = IconTypes.ThreePhaseFlash;

            MaterialPorts.Add(new Port <MaterialStream>("In", PortDirection.In, 1));
            MaterialPorts.Add(new Port <MaterialStream>("Vap", PortDirection.Out, 1));
            MaterialPorts.Add(new Port <MaterialStream>("Liq1", PortDirection.Out, 1));
            MaterialPorts.Add(new Port <MaterialStream>("Liq2", PortDirection.Out, 1));

            dp = system.VariableFactory.CreateVariable("DP", "Pressure Drop", PhysicalDimension.Pressure);
            p  = system.VariableFactory.CreateVariable("P", "Pressure in flash", PhysicalDimension.Pressure);
            T  = system.VariableFactory.CreateVariable("T", "Temperature in flash", PhysicalDimension.Temperature);
            Q  = system.VariableFactory.CreateVariable("Q", "Heat Duty", PhysicalDimension.HeatFlow);
            VF = system.VariableFactory.CreateVariable("VF", "Vapor Fraction", PhysicalDimension.MolarFraction);

            KLL = new Variable[system.Components.Count];
            S   = new Variable[system.Components.Count];

            for (int i = 0; i < system.Components.Count; i++)
            {
                KLL[i]            = system.VariableFactory.CreateVariable("KLL", "Equilibrium partition coefficient (LLE)", PhysicalDimension.Dimensionless);
                KLL[i].Subscript  = system.Components[i].ID;
                KLL[i].ValueInSI  = 1.2;
                KLL[i].UpperBound = 1e6;

                S[i]            = system.VariableFactory.CreateVariable("S", "Split fraction between Liquid Phases)", PhysicalDimension.Dimensionless);
                S[i].Subscript  = system.Components[i].ID;
                S[i].ValueInSI  = 0.5;
                S[i].UpperBound = 1;
            }
            dp.LowerBound = -1e10;
            dp.ValueInSI  = 0;

            AddVariable(p);
            AddVariable(T);
            AddVariable(Q);
            AddVariable(VF);
            AddVariable(dp);
            AddVariables(KLL);
            AddVariables(S);
        }
예제 #16
0
파일: Program.cs 프로젝트: shao130/OpenFMSL
        static void Main(string[] args)
        {
            var sys = new ThermodynamicSystem("Test", "NRTL", "default");

            var adapter = new ChemSepDBAdapter.Adapter();

            adapter.SetLogCallback(Console.Write);

            var comp1 = adapter.FindComponent("Ethanol");
            var comp2 = adapter.FindComponent("Water");

            sys.AddComponent(comp1);
            sys.AddComponent(comp2);

            adapter.FillBIPs(sys);

            Console.WriteLine(comp1.Name + "[" + comp1.CasNumber + "]");
            Console.WriteLine(comp2.Name + "[" + comp2.CasNumber + "]");
            Console.ReadLine();
        }
        public ThermodynamicSystemEditorViewModel(IEventAggregator aggregator, ThermodynamicSystem source, IThermodynamicSystemImporter importer, IChartViewModelFactory chartFactory)
        {
            _aggregator = aggregator;
            //  _source = new ThermodynamicSystemEntity(source.Name);
            CurrentSystem = source;
            _importer     = importer;
            _chartFactory = chartFactory;
            _aggregator.Subscribe(this);
            //ScriptDocument = new TextDocument(_source.SourceCode);

            var types = Enum.GetValues(typeof(EvaluatedProperties));

            foreach (var type in types.OfType <EvaluatedProperties>())
            {
                AvailableFunctionTypes.Add(type);
            }
            // ParseInputFile();
            ComponentsForPureAnalysis = CurrentSystem.Components.Select(c => new CheckableComponent()
            {
                Data = c
            }).ToList();
        }
예제 #18
0
        public ComponentSplitter(string name, ThermodynamicSystem system) : base(name, system)
        {
            Class = "CSplitter";

            MaterialPorts.Add(new Port <MaterialStream>("In", PortDirection.In, 1));
            MaterialPorts.Add(new Port <MaterialStream>("Out1", PortDirection.Out, 1));
            MaterialPorts.Add(new Port <MaterialStream>("Out2", PortDirection.Out, 1));

            dp = system.VariableFactory.CreateVariable("DP", "Pressure Drop", PhysicalDimension.Pressure);
            p  = system.VariableFactory.CreateVariable("P", "Pressure in splitter", PhysicalDimension.Pressure);

            SplitFactors = new Variable[system.Components.Count];
            for (int i = 0; i < system.Components.Count; i++)
            {
                SplitFactors[i]           = system.VariableFactory.CreateVariable("K", "Component Split factor (molar)", PhysicalDimension.MolarFraction);
                SplitFactors[i].Subscript = system.Components[i].ID;
            }
            dp.LowerBound = 0;
            AddVariable(dp);
            AddVariables(SplitFactors);
            AddVariable(p);
        }
예제 #19
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);
        }
예제 #20
0
        public NonEquilibriumTray(int number, ThermodynamicSystem system)
        {
            _system = system;
            Number  = number;
            var numString = number.ToString();

            h     = system.VariableFactory.CreateVariable("h", numString, "Packing height", PhysicalDimension.Length);
            d     = system.VariableFactory.CreateVariable("d", numString, "Packing diameter", PhysicalDimension.Length);
            aspez = system.VariableFactory.CreateVariable("aspec", numString, "Specific Area", PhysicalDimension.SpecificArea);
            aeff  = system.VariableFactory.CreateVariable("aeff", numString, "Effective Area", PhysicalDimension.Area);

            dhyd = system.VariableFactory.CreateVariable("dhyd", numString, "Hydrodynamic diameter", PhysicalDimension.Length);
            uV   = system.VariableFactory.CreateVariable("uV", numString, "Superficial velocity", PhysicalDimension.Velocity);
            ReV  = system.VariableFactory.CreateVariable("ReV", numString, "Reynolds number vapor", PhysicalDimension.Dimensionless);

            dhyd.ValueInSI = 0.00723;

            h.ValueInSI     = 3;
            d.ValueInSI     = 0.7;
            aspez.ValueInSI = 250;
            aeff.ValueInSI  = 100;
            h.IsFixed       = true;
            d.IsFixed       = true;
            aspez.IsFixed   = true;
            dhyd.IsFixed    = true;


            TL = system.VariableFactory.CreateVariable("TL", numString, "Liquid Temperature", PhysicalDimension.Temperature);
            TI = system.VariableFactory.CreateVariable("TI", numString, "Interphase Temperature", PhysicalDimension.Temperature);
            TV = system.VariableFactory.CreateVariable("TV", numString, "Vapor Temperature", PhysicalDimension.Temperature);

            DP            = system.VariableFactory.CreateVariable("DP", numString, "Pressure Drop", PhysicalDimension.Pressure);
            DP.LowerBound = 0;
            DP.ValueInSI  = 0;

            p = system.VariableFactory.CreateVariable("P", numString, "Pressure", PhysicalDimension.Pressure);
            Q = system.VariableFactory.CreateVariable("Q", numString, "Heat Duty to liquid phase", PhysicalDimension.HeatFlow);
            E = system.VariableFactory.CreateVariable("E", numString, "Total heat transfer rate (Interface)", PhysicalDimension.HeatFlow);

            L = system.VariableFactory.CreateVariable("L", numString, "Liquid molar flow", PhysicalDimension.MolarFlow);
            V = system.VariableFactory.CreateVariable("V", numString, "Vapor molar flow", PhysicalDimension.MolarFlow);

            HL = system.VariableFactory.CreateVariable("HL", numString, "Liquid specific molar enthalpy", PhysicalDimension.SpecificMolarEnthalpy);
            HV = system.VariableFactory.CreateVariable("HV", numString, "Vapor specific molar enthalpy", PhysicalDimension.SpecificMolarEnthalpy);


            K  = new Variable[system.Components.Count];
            x  = new Variable[system.Components.Count];
            y  = new Variable[system.Components.Count];
            xI = new Variable[system.Components.Count];
            yI = new Variable[system.Components.Count];

            N = new Variable[system.Components.Count];

            BetaV = new Variable[system.Components.Count, system.Components.Count];
            BetaL = new Variable[system.Components.Count, system.Components.Count];

            for (int i = 0; i < system.Components.Count; i++)
            {
                K[i]           = system.VariableFactory.CreateVariable("K", numString + ", " + system.Components[i].ID, "Equilibrium partition coefficient", PhysicalDimension.Dimensionless);
                K[i].ValueInSI = 1.2;
                x[i]           = system.VariableFactory.CreateVariable("x", numString + ", " + system.Components[i].ID, "Liquid molar fraction", PhysicalDimension.MolarFraction);
                y[i]           = system.VariableFactory.CreateVariable("y", numString + ", " + system.Components[i].ID, "Vapor molar fraction", PhysicalDimension.MolarFraction);
                yI[i]          = system.VariableFactory.CreateVariable("yI", numString + ", " + system.Components[i].ID, "Vapor molar fraction (Interface)", PhysicalDimension.MolarFraction);
                xI[i]          = system.VariableFactory.CreateVariable("xI", numString + ", " + system.Components[i].ID, "Liquid molar fraction (Interface)", PhysicalDimension.MolarFraction);

                N[i]            = system.VariableFactory.CreateVariable("N", numString + ", " + system.Components[i].ID, "Total transfer rate (Interface)", PhysicalDimension.MolarFlow);
                N[i].LowerBound = -1e6;
                N[i].ValueInSI  = 0.0;

                for (int j = 0; j < system.Components.Count; j++)
                {
                    BetaV[i, j]         = system.VariableFactory.CreateVariable("BetaV", numString + ", " + system.Components[i].ID + ", " + system.Components[j].ID, "Vapor Mass-transfer coefficient)", PhysicalDimension.MassTransferCoefficient);
                    BetaV[i, j].IsFixed = true;
                    if (i != j)
                    {
                        BetaV[i, j].ValueInSI = 0.02;
                    }

                    BetaL[i, j]         = system.VariableFactory.CreateVariable("BetaL", numString + ", " + system.Components[i].ID + ", " + system.Components[j].ID, "Liquid Mass-transfer coefficient)", PhysicalDimension.MassTransferCoefficient);
                    BetaL[i, j].IsFixed = true;
                    if (i != j)
                    {
                        BetaL[i, j].ValueInSI = 0.02;
                    }
                }
            }
        }
예제 #21
0
        public RateBasedSection(string name, ThermodynamicSystem system, int numberOfElements) : base(name, system)
        {
            Class            = "RateSection";
            NumberOfElements = numberOfElements;
            Icon.IconType    = IconTypes.RateBasedSection;
            var NC = system.Components.Count;

            MaterialPorts.Add(new Port <MaterialStream>("VIn", PortDirection.In, 1));
            MaterialPorts.Add(new Port <MaterialStream>("LIn", PortDirection.In, 1));
            MaterialPorts.Add(new Port <MaterialStream>("VOut", PortDirection.Out, 1));
            MaterialPorts.Add(new Port <MaterialStream>("LOut", PortDirection.Out, 1));


            for (int i = 0; i < NumberOfElements; i++)
            {
                var tray = new NonEquilibriumTray(i + 1, system);
                _trays.Add(tray);
            }

            AddVariables(_trays.Select(t => t.TL).ToArray());
            AddVariables(_trays.Select(t => t.TI).ToArray());
            AddVariables(_trays.Select(t => t.TV).ToArray());

            AddVariables(_trays.Select(t => t.p).ToArray());
            AddVariables(_trays.Select(t => t.DP).ToArray());
            AddVariables(_trays.Select(t => t.Q).ToArray());
            AddVariables(_trays.Select(t => t.E).ToArray());
            AddVariables(_trays.Select(t => t.L).ToArray());
            AddVariables(_trays.Select(t => t.V).ToArray());

            AddVariables(_trays.Select(t => t.HL).ToArray());
            AddVariables(_trays.Select(t => t.HV).ToArray());
            AddVariables(_trays.Select(t => t.aeff).ToArray());

            AddVariables(_trays.Select(t => t.aspez).ToArray());
            AddVariables(_trays.Select(t => t.d).ToArray());
            AddVariables(_trays.Select(t => t.h).ToArray());
            AddVariables(_trays.Select(t => t.dhyd).ToArray());

            AddVariables(_trays.Select(t => t.ReV).ToArray());
            AddVariables(_trays.Select(t => t.uV).ToArray());

            for (int i = 0; i < NumberOfElements; i++)
            {
                AddVariables(_trays[i].K);
            }
            for (int i = 0; i < NumberOfElements; i++)
            {
                AddVariables(_trays[i].x);
            }

            for (int i = 0; i < NumberOfElements; i++)
            {
                AddVariables(_trays[i].xI);
            }

            for (int i = 0; i < NumberOfElements; i++)
            {
                AddVariables(_trays[i].y);
            }

            for (int i = 0; i < NumberOfElements; i++)
            {
                AddVariables(_trays[i].yI);
            }

            for (int i = 0; i < NumberOfElements; i++)
            {
                AddVariables(_trays[i].N);
            }

            for (int n = 0; n < NumberOfElements; n++)
            {
                for (int i = 0; i < NC; i++)
                {
                    for (int j = 0; j < NC; j++)
                    {
                        AddVariables(_trays[n].BetaV[i, j]);
                    }
                }
            }
        }
예제 #22
0
 public ProcessUnit(string name, ThermodynamicSystem system) : base(name, system)
 {
 }
예제 #23
0
        public ActivityCoefficientNRTL(ThermodynamicSystem system, Variable T, List <Variable> x, int idx)
        {
            index   = idx;
            _system = system;

            var parameterSet = _system.BinaryParameters.FirstOrDefault(ps => ps.Name == "NRTL");

            if (parameterSet == null)
            {
                throw new ArgumentNullException("No NRTL parameters defined");
            }

            double[,] a = parameterSet.Matrices["A"];
            double[,] b = parameterSet.Matrices["B"];
            double[,] c = parameterSet.Matrices["C"];
            double[,] d = parameterSet.Matrices["D"];
            double[,] e = parameterSet.Matrices["E"];
            double[,] f = parameterSet.Matrices["F"];

            Symbol = "NRTL_GAMMA";

            this.T = T;
            this.x = x;

            Parameters.Add(T);
            foreach (var comp in x)
            {
                Parameters.Add(comp);
            }

            NC  = system.Components.Count;
            tau = new Expression[NC, NC];
            G   = new Expression[NC, NC];

            int i = index;

            for (int ii = 0; ii < NC; ii++)
            {
                for (int j = 0; j < NC; j++)
                {
                    tau[ii, j] = a[ii, j];

                    if (b[ii, j] != 0.0)
                    {
                        tau[ii, j] += b[ii, j] / T;
                    }
                    if (e[ii, j] != 0.0)
                    {
                        tau[ii, j] += e[ii, j] * Sym.Ln(T);
                    }
                    if (f[ii, j] != 0.0)
                    {
                        tau[ii, j] += f[ii, j] * T;
                    }

                    Expression sij = c[ii, j];
                    if (d[ii, j] != 0.0)
                    {
                        sij += d[ii, j] * (T - 273.15);
                    }

                    if (c[ii, j] == 0.0 && d[i, j] == 0.0)
                    {
                        G[ii, j] = 1.0;
                    }
                    else
                    {
                        G[ii, j] = (Sym.Exp(-sij * tau[ii, j]));
                    }
                }
            }
            Expression lnGamma = 0.0;
            Expression S1      = 0.0;

            Expression[] S2 = new Expression[NC];
            Expression   S3 = 0.0;

            for (int j = 0; j < NC; j++)
            {
                if (a[j, i] == 0.0 && b[j, i] == 0.0)
                {
                    continue;
                }
                if (c[j, i] == 0.0 && d[j, i] == 0.0)
                {
                    continue;
                }

                S1 += x[j] * tau[j, i] * G[j, i];
            }

            for (int ii = 0; ii < NC; ii++)
            {
                S2[ii] = 0.0;
                for (int k = 0; k < NC; k++)
                {
                    S2[ii] += x[k] * G[k, ii];
                }
            }
            for (int j = 0; j < NC; j++)
            {
                Expression S5 = 0.0;

                for (int m = 0; m < NC; m++)
                {
                    if (a[m, j] == 0.0 && b[m, j] == 0.0)
                    {
                        continue;
                    }


                    S5 += x[m] * tau[m, j] * G[m, j];
                }

                S3 += x[j] * G[i, j] / Sym.Par(S2[j]) * (tau[i, j] - S5 / Sym.Par(S2[j]));
            }

            lnGamma = S1 / S2[i] + S3;

            _gammaExp = Sym.Exp(lnGamma);
            _dgammaDx = new Expression[NC];

            DiffFunctional = (cache, v) => _gammaExp.Diff(cache, v);
            EvalFunctional = (cache) => _gammaExp.Eval(cache);
        }
예제 #24
0
 public HeatExchangerCell(string name, ThermodynamicSystem system) : base(name, system)
 {
     Class = "HexCell";
 }
예제 #25
0
        public void Report(ThermodynamicSystem system)
        {
            WriteLine("");
            WriteLine("Report for thermodynamic system " + system.Name);
            WriteLine("================================================");

            WriteLine("");
            WriteLine("Equilibrium");
            WriteLine("");

            WriteLine("VLEQ Method      : " + system.EquilibriumMethod.EquilibriumApproach);
            WriteLine("Activity Method  : " + system.EquilibriumMethod.Activity);
            WriteLine("Fugacity Method  : " + system.EquilibriumMethod.Fugacity);
            WriteLine("Henry Method     : " + system.EquilibriumMethod.AllowHenryComponents);

            WriteLine("");
            WriteLine("Unit of Measure");
            WriteLine("");
            WriteLine(String.Format("{0,-25} {1,-15} {2,-15}", "Dimension", "Input", "Output"));

            foreach (var unit in system.VariableFactory.Internal.UnitDictionary)
            {
                WriteLine(String.Format("{0,-25} {1,-15} {2,-15}", unit.Key, unit.Value, system.VariableFactory.Output.UnitDictionary[unit.Key]));
            }

            WriteLine("");
            WriteLine("Components");
            WriteLine("");

            WriteLine(String.Format("{0,-25} {1,-15} {2,-15} {3,-15} {4,-15} {5,-15} {6,-15}", "Name", "ID", "CAS-No", "Inert", "MOLW", "TC", "PC"));
            foreach (var comp in system.Components)
            {
                WriteLine(String.Format("{0,-25} {1,-15} {2,-15} {3,-15} {4,-15} {5,-15} {6,-15}",
                                        comp.Name,
                                        comp.ID,
                                        comp.CasNumber,
                                        comp.IsInert,
                                        comp.GetConstant(ConstantProperties.MolarWeight).ValueInSI.ToString("G6", System.Globalization.NumberFormatInfo.InvariantInfo),
                                        comp.GetConstant(ConstantProperties.CriticalTemperature).ValueInSI.ToString("G6", System.Globalization.NumberFormatInfo.InvariantInfo),
                                        comp.GetConstant(ConstantProperties.CriticalPressure).ValueInSI.ToString("G6", System.Globalization.NumberFormatInfo.InvariantInfo)));
            }
            WriteLine("");
            WriteLine("Enthalpy Functions");
            WriteLine("");
            WriteLine(String.Format("{0,-15} {1,-10} {2,-12} {3,-8} {4,-8} {5,-5}", "Comp", "Phase", "Href", "Tref", "TPc", "Fixed Phase Change"));
            foreach (var enth in system.EnthalpyMethod.PureComponentEnthalpies)
            {
                WriteLine(String.Format("{0,-15} {1,-10} {2,-12} {3,-8} {4,-8} {5,-5}",
                                        enth.Component.ID,
                                        enth.ReferenceState,
                                        enth.Href.ValueInOutputUnit.ToString("G6", System.Globalization.NumberFormatInfo.InvariantInfo),
                                        enth.Tref.ValueInOutputUnit.ToString("G6", System.Globalization.NumberFormatInfo.InvariantInfo),
                                        enth.TPhaseChange.ValueInOutputUnit.ToString("G6", System.Globalization.NumberFormatInfo.InvariantInfo),
                                        !enth.PhaseChangeAtSystemTemperature));
            }


            WriteLine("");
            WriteLine("Property Functions");
            WriteLine("");
            WriteLine(String.Format("{0,-15} {1,-25} {2,-15} {3,-8} {4,-8} {5,-5} {6,-25}", "Comp", "Property", "Form", "Min T", "Max T", "Coeff", "Equation"));
            foreach (var comp in system.Components)
            {
                foreach (var func in comp.Functions)
                {
                    WriteLine(String.Format("{0,-15} {1,-25} {2,-15} {3,-8} {4,-8} {5,-5} {6,-25}",
                                            comp.ID,
                                            func.Property,
                                            func.Type,
                                            func.MinimumX.ValueInSI.ToString("G6", System.Globalization.NumberFormatInfo.InvariantInfo),
                                            func.MaximumX.ValueInSI.ToString("G6", System.Globalization.NumberFormatInfo.InvariantInfo),
                                            func.Coefficients.Count,
                                            "Y = " + system.CorrelationFactory.CreateExpression(func.Type, func, new OpenFMSL.Core.Expressions.Variable("T", 1), new OpenFMSL.Core.Expressions.Variable("TC", 1), new OpenFMSL.Core.Expressions.Variable("PC", 1)).ToString()));
                }
            }

            WriteLine("");
            WriteLine("Chemistry blocks");
            WriteLine("");
            WriteLine(String.Format("{0,-10} {1,-10} {2,-10} {3,-40} {4,-20} ", "Label", "Type", "DHR", "Reaction", "Stoichiometry"));


            foreach (var chem in system.ChemistryBlocks)
            {
                foreach (var reac in chem.Reactions)
                {
                    WriteLine(String.Format("{0,-10} {1,-10} {2,-10} {3,-40} {4,-20} ",
                                            chem.Label,
                                            reac.Type,
                                            reac.ReactionEnthalpy,
                                            GetReactionFunction(reac),
                                            GetReactionStoichiometry(reac)
                                            ));
                }
            }
        }
예제 #26
0
 void ParseSystem(string[] line)
 {
     _currentSystem      = new ThermodynamicSystem();
     _currentSystem.Name = line[1];
     Systems.Add(_currentSystem);
 }
예제 #27
0
        /// <summary>
        /// Creates a new instance of the liquid phase activity coefficient calculation object
        /// </summary>
        /// <param name="sys">Thermodynamic system to take parameters from</param>
        /// <param name="T">Temperature variable</param>
        /// <param name="x">Vector of composition variables (molar fractions)</param>
        /// <param name="idx">Index of the active variables to calculate for</param>
        public ActivityCoefficientUNIQUAC(ThermodynamicSystem sys, Variable T, List <Variable> x, int idx)
        {
            Symbol  = "UNIQUAC_GAMMA";
            _system = sys;
            index   = idx;
            //Bind variables to this instance
            this.T = T;
            this.x = x;
            Parameters.Add(T);
            foreach (var comp in x)
            {
                Parameters.Add(comp);
            }
            NC  = _system.Components.Count;
            tau = new Expression[NC, NC];

            int i = index;

            var parameterSet = _system.BinaryParameters.FirstOrDefault(ps => ps.Name == "UNIQUAC");

            if (parameterSet == null)
            {
                throw new ArgumentNullException("No UNIQUAC parameters defined");
            }

            double[,] a = parameterSet.Matrices["A"];
            double[,] b = parameterSet.Matrices["B"];
            double[,] c = parameterSet.Matrices["C"];
            double[,] d = parameterSet.Matrices["D"];
            double[,] e = parameterSet.Matrices["E"];

            for (int ii = 0; ii < NC; ii++)
            {
                for (int j = 0; j < NC; j++)
                {
                    tau[ii, j] = Sym.Exp(a[ii, j] + b[ii, j] / T + c[ii, j] * Sym.Ln(T) + d[ii, j] * T + e[ii, j] / Sym.Pow(T, 2));
                }
            }
            Expression lnGamma     = 0.0;
            Expression lnGammaComb = 0.0;
            Expression lnGammaRes  = 0.0;
            Expression Vi          = 0;
            Expression Fi          = 0;
            Expression FiP         = 0;
            Expression Sxl         = 0;

            var ri  = _system.Components.Select(co => co.GetParameter(MethodTypes.Uniquac, "R").ValueInSI).ToList();
            var qi  = _system.Components.Select(co => co.GetParameter(MethodTypes.Uniquac, "Q").ValueInSI).ToList();
            var qpi = _system.Components.Select(co => co.GetParameter(MethodTypes.Uniquac, "Q'").ValueInSI).ToList();

            double[] li = new double[NC];
            for (int j = 0; j < NC; j++)
            {
                li[j] = 5 * (ri[j] - qi[j]) - (ri[j] - 1);
            }

            Vi  = ri[i] * x[i] / Sym.Sum(0, NC, (j) => ri[j] * x[j]);
            Fi  = qi[i] * x[i] / Sym.Sum(0, NC, (j) => qi[j] * x[j]);
            FiP = qpi[i] * x[i] / Sym.Sum(0, NC, (j) => qpi[j] * x[j]);

            //Sxl = Sym.Sum(0, NC, (j) => (5 * (_system.Components[j].GetParameter(MethodTypes.Uniquac, "R").ValueInSI - _system.Components[j].GetParameter(MethodTypes.Uniquac, "Q").ValueInSI) - (_system.Components[j].GetParameter(MethodTypes.Uniquac, "R").ValueInSI - 1)) * x[j]);

            lnGammaComb = Sym.Ln(Vi / Sym.Max(1e-10, x[i])) + 5 * qi[i] * Sym.Ln(Fi / Vi) + li[i] - Vi / Sym.Max(1e-10, x[i]) * Sym.Sum(0, NC, j => x[j] * li[j]);

            Expression[] FPj = new Expression[_system.Components.Count];
            for (int j = 0; j < NC; j++)
            {
                FPj[j] = qpi[j] * x[j] / Sym.Sum(0, NC, (kj) => qpi[kj] * x[kj]);
            }

            var doubleSum = Sym.Sum(0, NC, (j) => FPj[j] * tau[i, j] / (Sym.Sum(0, NC, (k) => FPj[k] * tau[k, j])));
            var SFP       = Sym.Sum(0, NC, (j) => FPj[j] * tau[j, i]);

            lnGammaRes = qpi[i] * (1.0 - Sym.Ln(SFP) - doubleSum);
            lnGamma    = lnGammaComb + lnGammaRes;
            _gamma_exp = Sym.Exp(lnGamma);

            _dgamma_dx = new Expression[NC];

            DiffFunctional = (cache, v) => _gamma_exp.Diff(cache, v);
            EvalFunctional = (cache) => _gamma_exp.Eval(cache);
        }
예제 #28
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);
        }
예제 #29
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);
        }
예제 #30
0
        public TraySection(string name, ThermodynamicSystem system, int numberOfTrays) : base(name, system)
        {
            Class         = "TraySection";
            NumberOfTrays = numberOfTrays;
            Icon.IconType = IconTypes.ColumnSection;

            MaterialPorts.Add(new Port <MaterialStream>("Feeds", PortDirection.In, -1));
            MaterialPorts.Add(new Port <MaterialStream>("VIn", PortDirection.In, 1));
            MaterialPorts.Add(new Port <MaterialStream>("LIn", PortDirection.In, 1));
            MaterialPorts.Add(new Port <MaterialStream>("VOut", PortDirection.Out, 1));
            MaterialPorts.Add(new Port <MaterialStream>("LOut", PortDirection.Out, 1));
            MaterialPorts.Add(new Port <MaterialStream>("Sidestreams", PortDirection.Out, -1));

            for (int i = 0; i < NumberOfTrays; i++)
            {
                var tray = new EquilibriumTray(i + 1, system);
                _trays.Add(tray);
            }

            AddVariables(_trays.Select(t => t.T).ToArray());
            AddVariables(_trays.Select(t => t.TV).ToArray());

            AddVariables(_trays.Select(t => t.p).ToArray());
            AddVariables(_trays.Select(t => t.DP).ToArray());
            AddVariables(_trays.Select(t => t.Q).ToArray());
            AddVariables(_trays.Select(t => t.F).ToArray());
            AddVariables(_trays.Select(t => t.L).ToArray());
            AddVariables(_trays.Select(t => t.V).ToArray());
            AddVariables(_trays.Select(t => t.U).ToArray());
            AddVariables(_trays.Select(t => t.W).ToArray());
            AddVariables(_trays.Select(t => t.RL).ToArray());
            AddVariables(_trays.Select(t => t.RV).ToArray());
            AddVariables(_trays.Select(t => t.eps).ToArray());
            AddVariables(_trays.Select(t => t.HF).ToArray());
            AddVariables(_trays.Select(t => t.HL).ToArray());
            AddVariables(_trays.Select(t => t.HV).ToArray());

            for (int i = 0; i < NumberOfTrays; i++)
            {
                AddVariables(_trays[i].K);
            }
            for (int i = 0; i < NumberOfTrays; i++)
            {
                AddVariables(_trays[i].x);
            }
            for (int i = 0; i < NumberOfTrays; i++)
            {
                AddVariables(_trays[i].y);
            }
            for (int i = 0; i < NumberOfTrays; i++)
            {
                AddVariables(_trays[i].yeq);
            }

            for (int i = 0; i < NumberOfTrays; i++)
            {
                AddVariables(_trays[i].z);
            }


            int NC = System.Components.Count;

            for (var tray = 0; tray < NumberOfTrays; tray++)
            {
                _trays[tray].U.FixValue(0);
                _trays[tray].W.FixValue(0);
                _trays[tray].RL.FixValue(0);
                _trays[tray].RV.FixValue(0);
                _trays[tray].F.FixValue(0);
                _trays[tray].HF.FixValue(0);

                /*     _trays[tray].U.IsConstant = true;
                 *   _trays[tray].W.IsConstant = true;
                 *   _trays[tray].RL.IsConstant = true;
                 *   _trays[tray].RV.IsConstant = true;
                 *   _trays[tray].F.IsConstant = true;
                 *    _trays[tray].HF.IsConstant = true;*/

                for (var comp = 0; comp < NC; comp++)
                {
                    _trays[tray].z[comp].FixValue(0);
                    //  _trays[tray].z[comp].IsConstant = true;
                }
            }
        }