コード例 #1
0
ファイル: TestMaterials.cs プロジェクト: sjvannTMU/Sage
        /// <summary>
        /// Loads the reaction processor in the model with sample reactions.
        /// </summary>
        /// <param name="brs">The instance of ISupportsReactions that we will load..</param>
        private static void LoadSampleReactions(BasicReactionSupporter brs)
        {
            Reaction r1 = new Reaction(null, "Reaction 1", Guid.NewGuid());

            r1.AddReactant(brs.MyMaterialCatalog["Caustic Soda"], 0.5231);
            r1.AddReactant(brs.MyMaterialCatalog["Hydrochloric Acid"], 0.4769);
            r1.AddProduct(brs.MyMaterialCatalog["Water"], 0.2356);
            r1.AddProduct(brs.MyMaterialCatalog["Sodium Chloride"], 0.7644);
            brs.MyReactionProcessor.AddReaction(r1);

            Reaction r2 = new Reaction(null, "Reaction 2", Guid.NewGuid());

            r2.AddReactant(brs.MyMaterialCatalog["Sulfuric Acid"], 0.533622);
            r2.AddReactant(brs.MyMaterialCatalog["Potassium Hydroxide"], 0.466378);
            r2.AddProduct(brs.MyMaterialCatalog["Water"], 0.171333);
            r2.AddProduct(brs.MyMaterialCatalog["Potassium Sulfate"], 0.828667);
            brs.MyReactionProcessor.AddReaction(r2);

            Reaction r3 = new Reaction(null, "Reaction 3", Guid.NewGuid());

            r3.AddReactant(brs.MyMaterialCatalog["Caustic Soda"], 0.459681368);
            r3.AddReactant(brs.MyMaterialCatalog["Nitrous Acid"], 0.540318632);
            r3.AddProduct(brs.MyMaterialCatalog["Water"], 0.207047552);
            r3.AddProduct(brs.MyMaterialCatalog["Sodium Nitrite"], 0.792952448);
            brs.MyReactionProcessor.AddReaction(r3);

            Reaction r4 = new Reaction(null, "Reaction 4", Guid.NewGuid());

            r4.AddReactant(brs.MyMaterialCatalog["Potassium Hydroxide"], 0.544102);
            r4.AddReactant(brs.MyMaterialCatalog["Nitrous Acid"], 0.455898);
            r4.AddProduct(brs.MyMaterialCatalog["Water"], 0.174698);
            r4.AddProduct(brs.MyMaterialCatalog["Potassium Nitrite"], 0.825302);
            brs.MyReactionProcessor.AddReaction(r4);
        }
コード例 #2
0
ファイル: TestMaterials.cs プロジェクト: sjvannTMU/Sage
        public void TestReactions()
        {
            Model model = new Model("Test Model", Guid.NewGuid());
            BasicReactionSupporter brs = new BasicReactionSupporter();

            LoadSampleCatalog(brs.MyMaterialCatalog);

            // Define reaction
            Reaction r = new Reaction(null, "Reaction", Guid.NewGuid());

            r.AddReactant(brs.MyMaterialCatalog["Potassium Hydroxide"], 0.544102);
            r.AddReactant(brs.MyMaterialCatalog["Nitrous Acid"], 0.455898);
            r.AddProduct(brs.MyMaterialCatalog["Water"], 0.174698);
            r.AddProduct(brs.MyMaterialCatalog["Potassium Nitrite"], 0.825302);
            brs.MyReactionProcessor.AddReaction(r);

            Mixture mixture = new Mixture(model, "Contents of vat 1", Guid.NewGuid());

            brs.MyReactionProcessor.Watch(mixture);

            Debug.WriteLine("Adding two reactants to the mixture.");
            AddSubstance(ref mixture, brs.MyMaterialCatalog["Potassium Hydroxide"], 150, 41);
            AddSubstance(ref mixture, brs.MyMaterialCatalog["Nitrous Acid"], 100, 20);

            /* Calculation:
             * 0.544102 + 0.455898 = 0.174698 + 0.825302
             * 100 % Ractions = min(150kg / 0.544102, 100 kg / 0.455898) = about 219.35
             * --> Left over Pot Hyd = 150 kg - (219.35 * 0.544102)	= about  30.65 kg
             *     Water = 219.35 * 0.174698						= about  38.32 kg
             *     Pot Nit = 219.35 * 0.825302						= about 181.03 kg
             *														=		250.00 kg
             */
            Substance water      = null;
            Substance potassiumH = null;
            Substance potassiumN = null;

            foreach (Substance s in mixture.Constituents)
            {
                switch (s.Name)
                {
                case "Water": water = s; break;

                case "Potassium Hydroxide": potassiumH = s; break;

                case "Potassium Nitrite": potassiumN = s; break;
                }
            }

            Assert.IsTrue(Math.Abs(potassiumH.Mass - 30.65) < 0.01, "The Potassium Hidroxide part is not 30.65 kg");
            Assert.IsTrue(Math.Abs(water.Mass - 38.32) < 0.01, "The Water part is not 38.32 kg");
            Assert.IsTrue(Math.Abs(potassiumN.Mass - 181.03) < 0.01, "The Potassium Nitrite part is not 181.03 kg");

            Debug.WriteLine(mixture);
        }
コード例 #3
0
            private void Initialize(BasicReactionSupporter brs)
            {
                MaterialCatalog   mcat = brs.MyMaterialCatalog;
                ReactionProcessor rp   = brs.MyReactionProcessor;

                //                        Model  Name    Guid           SpecGrav SpecHeat
                mcat.Add(new MaterialType(null, "Water", Guid.NewGuid(), 1.0000, 4.1800, MaterialState.Liquid));
                mcat.Add(new MaterialType(null, "Hydrochloric Acid", Guid.NewGuid(), 1.1890, 2.5500, MaterialState.Liquid));
                mcat.Add(new MaterialType(null, "Caustic Soda", Guid.NewGuid(), 2.0000, 4.1800, MaterialState.Liquid));
                mcat.Add(new MaterialType(null, "Sodium Chloride", Guid.NewGuid(), 2.1650, 4.1800, MaterialState.Liquid));
                mcat.Add(new MaterialType(null, "Sulfuric Acid 98%", Guid.NewGuid(), 1.8420, 4.1800, MaterialState.Liquid));
                mcat.Add(new MaterialType(null, "Potassium Hydroxide", Guid.NewGuid(), 1.3000, 4.1800, MaterialState.Liquid));
                mcat.Add(new MaterialType(null, "Potassium Sulfate", Guid.NewGuid(), 1.0000, 4.1800, MaterialState.Liquid));
                mcat.Add(new MaterialType(null, "Nitrous Acid", Guid.NewGuid(), 1.0000, 4.1800, MaterialState.Liquid));
                mcat.Add(new MaterialType(null, "Sodium Nitrite", Guid.NewGuid(), 2.3800, 4.1800, MaterialState.Liquid));
                mcat.Add(new MaterialType(null, "Potassium Nitrite", Guid.NewGuid(), 1.9150, 4.1800, MaterialState.Liquid));
                mcat.Add(new MaterialType(null, "Aluminum Hydroxide", Guid.NewGuid(), 1.0000, 4.1800, MaterialState.Liquid));
                mcat.Add(new MaterialType(null, "Ammonia", Guid.NewGuid(), 1.0000, 4.1800, MaterialState.Liquid));
                mcat.Add(new MaterialType(null, "Ammonium Hydroxide", Guid.NewGuid(), 1.0000, 4.1800, MaterialState.Liquid));
                mcat.Add(new MaterialType(null, "Bromine", Guid.NewGuid(), 3.1200, 4.1800, MaterialState.Liquid));

                Reaction r1 = new Reaction(null, "Reaction 1", Guid.NewGuid());

                r1.AddReactant(mcat["Caustic Soda"], 0.5231);
                r1.AddReactant(mcat["Hydrochloric Acid"], 0.4769);
                r1.AddProduct(mcat["Water"], 0.2356);
                r1.AddProduct(mcat["Sodium Chloride"], 0.7644);
                rp.AddReaction(r1);

                Reaction r2 = new Reaction(null, "Reaction 2", Guid.NewGuid());

                r2.AddReactant(mcat["Sulfuric Acid 98%"], 0.533622);
                r2.AddReactant(mcat["Potassium Hydroxide"], 0.466378);
                r2.AddProduct(mcat["Water"], 0.171333);
                r2.AddProduct(mcat["Potassium Sulfate"], 0.828667);
                rp.AddReaction(r2);

                Reaction r3 = new Reaction(null, "Reaction 3", Guid.NewGuid());

                r3.AddReactant(mcat["Caustic Soda"], 0.459681368);
                r3.AddReactant(mcat["Nitrous Acid"], 0.540318632);
                r3.AddProduct(mcat["Water"], 0.207047552);
                r3.AddProduct(mcat["Sodium Nitrite"], 0.792952448);
                rp.AddReaction(r3);

                Reaction r4 = new Reaction(null, "Reaction 4", Guid.NewGuid());

                r4.AddReactant(mcat["Potassium Hydroxide"], 0.544102);
                r4.AddReactant(mcat["Nitrous Acid"], 0.455898);
                r4.AddProduct(mcat["Water"], 0.174698);
                r4.AddProduct(mcat["Potassium Nitrite"], 0.825302);
                rp.AddReaction(r4);
            }
コード例 #4
0
ファイル: TestMaterials.cs プロジェクト: sjvannTMU/Sage
        public void TestReactions3()
        {
            Model model = new Model("Test Model", Guid.NewGuid());
            BasicReactionSupporter brs = new BasicReactionSupporter();

            InitializeForTesting(brs);

            MaterialType potassiumSulfateType = (MaterialType)brs.MyMaterialCatalog["Potassium Sulfate"];
            MaterialType acetoneType          = (MaterialType)brs.MyMaterialCatalog["Acetone"];
            MaterialType hexaneType           = (MaterialType)brs.MyMaterialCatalog["Hexane"];


            Reaction r1 = new Reaction(model, "Reaction 1", Guid.NewGuid());

            r1.AddReactant(potassiumSulfateType, 1.0);
            r1.AddReactant(acetoneType, 2.5);
            r1.AddProduct(hexaneType, 3.0);
            r1.AddProduct(acetoneType, 0.5);
            r1.HeatOfReaction = 0;

            brs.MyReactionProcessor.AddReaction(r1);

            Mixture m       = new Mixture(model, "Mixture");
            string  results = "";

            r1.ReactionGoingToHappenEvent += new ReactionGoingToHappenEvent(delegate(Reaction reaction, Mixture mixture) {
                results += ("\r\nBefore = " + m.ToString("F2", "F4"));
            });
            r1.ReactionHappenedEvent += new ReactionHappenedEvent(delegate(ReactionInstance reactionInstance) {
                results += ("\r\nAfter = " + m.ToString("F2", "F4") + "\r\n");
            });


            brs.MyReactionProcessor.Watch(m);

            Console.WriteLine(r1.ToString());

            m.AddMaterial(potassiumSulfateType.CreateMass(100, 37));
            m.AddMaterial(acetoneType.CreateMass(100, 37));

            Console.WriteLine(results);
            Assert.AreEqual(results, EXPECTED_3);
        }
コード例 #5
0
ファイル: TestMaterials.cs プロジェクト: sjvannTMU/Sage
        public void TestBadReactionDefinition1()
        {
            Model model = new Model("Test Model", Guid.NewGuid());
            BasicReactionSupporter brs = new BasicReactionSupporter();

            InitializeForTesting(brs);

            MaterialType waterType = (MaterialType)brs.MyMaterialCatalog["Water"];

            Reaction r1 = new Reaction(model, "Reaction 1", Guid.NewGuid());

            r1.AddReactant(brs.MyMaterialCatalog["Water"], 2.0);
            r1.AddProduct(brs.MyMaterialCatalog["Water"], 2.0);
            r1.HeatOfReaction = 0;
            brs.MyReactionProcessor.AddReaction(r1);
        }
コード例 #6
0
ファイル: TestMaterials.cs プロジェクト: sjvannTMU/Sage
        public void TestReactions2()
        {
            Model model = new Model("Test Model", Guid.NewGuid());
            BasicReactionSupporter brs = new BasicReactionSupporter();

            InitializeForTesting(brs);

            MaterialType waterType   = (MaterialType)brs.MyMaterialCatalog["Water"];
            MaterialType ethanolType = (MaterialType)brs.MyMaterialCatalog["Ethanol"];

            Reaction r1 = new Reaction(model, "Reaction 1", Guid.NewGuid());

            r1.AddReactant(brs.MyMaterialCatalog["Water"], 2.0);
            r1.AddProduct(brs.MyMaterialCatalog["Ethanol"], 2.0);
            r1.HeatOfReaction = 0;
            brs.MyReactionProcessor.AddReaction(r1);

            string  actualResults = "";
            Mixture m             = new Mixture(model, "Mixture");

            r1.ReactionGoingToHappenEvent += new ReactionGoingToHappenEvent(delegate(Reaction reaction, Mixture mixture) {
                actualResults += ("\r\nBefore = " + m.ToString("F2", "F4"));
            });
            r1.ReactionHappenedEvent += new ReactionHappenedEvent(delegate(ReactionInstance reactionInstance) {
                actualResults += ("\r\nAfter = " + m.ToString("F2", "F4") + "\r\n");
            });

            brs.MyReactionProcessor.Watch(m);

            m.AddMaterial(waterType.CreateMass(100, 37));

            m.AddMaterial(waterType.CreateMass(10, 37));

            Console.WriteLine(actualResults);
            string expected =
                "\r\nBefore = Mixture (37.00 deg C) of 100.0000 kg of Water\r\nAfter = Mixture (37.00 deg C) of 100.0000 kg of Ethanol\r\n\r\nBefore = Mixture (37.00 deg C) of 100.0000 kg of Ethanol and 10.0000 kg of Water\r\nAfter = Mixture (37.00 deg C) of 110.0000 kg of Ethanol\r\n";

            Assert.AreEqual(expected, actualResults);
        }
コード例 #7
0
ファイル: TestMaterials.cs プロジェクト: sjvannTMU/Sage
        public void TestRemovalByPercentageFromMixture()
        {
            Model model = new Model("Hello, world.", Guid.NewGuid());
            BasicReactionSupporter brs = new BasicReactionSupporter();

            LoadSampleCatalog(brs.MyMaterialCatalog);

            // Define reactions
            Reaction r = new Reaction(null, "Reaction", Guid.NewGuid());

            r.AddReactant(brs.MyMaterialCatalog["Caustic Soda"], 0.5231);
            r.AddReactant(brs.MyMaterialCatalog["Hydrochloric Acid"], 0.4769);
            r.AddProduct(brs.MyMaterialCatalog["Water"], 0.2356);
            r.AddProduct(brs.MyMaterialCatalog["Sodium Chloride"], 0.7644);
            brs.MyReactionProcessor.AddReaction(r);

            Mixture mixture = new Mixture(model, "Test mixture 1", Guid.NewGuid());

            brs.MyReactionProcessor.Watch(mixture);

            // Add substances
            AddSubstance(ref mixture, brs.MyMaterialCatalog["Caustic Soda"], 40, 20.0);
            AddSubstance(ref mixture, brs.MyMaterialCatalog["Hydrochloric Acid"], 40, 20.0);
            mixture.Temperature = 100.0;

            // Definitions to retrive substances from mixture
            Substance water            = null;
            Substance hydrochloricAcid = null;
            Substance sodiumCloride    = null;

            foreach (Substance su in mixture.Constituents)
            {
                switch (su.Name)
                {
                case "Water": water = su; break;

                case "Hydrochloric Acid": hydrochloricAcid = su; break;

                case "Sodium Chloride": sodiumCloride = su; break;
                }
            }

            Assert.IsTrue(Math.Abs(hydrochloricAcid.Mass - 3.53) < 0.01, "The Hydrochloric Acid part is not 3.53 kg");
            Assert.IsTrue(Math.Abs(water.Mass - 18.01) < 0.01, "The Water part is not 18.01 kg");
            Assert.IsTrue(Math.Abs(sodiumCloride.Mass - 58.45) < 0.01, "The Sodium Cloride part is not 58.45 kg");

            // Duration for removing mass given is per 1 kg
            MaterialTransferSpecByPercentage tsbp = new MaterialTransferSpecByPercentage(brs.MyMaterialCatalog["Water"], .5, TimeSpan.FromMinutes(5));

            IMaterial removee = tsbp.GetExtract(mixture);

            Debug.WriteLine("Want to remove " + tsbp);
            Debug.WriteLine("Successful in removing " + removee + ".\r\nWhat remains is ");
            Debug.WriteLine(mixture);

            // Now try to remove by mass from a substance.
            foreach (Substance su in mixture.Constituents)
            {
                switch (su.Name)
                {
                case "Water": water = su; break;

                case "Hydrochloric Acid": hydrochloricAcid = su; break;

                case "Sodium Chloride": sodiumCloride = su; break;
                }
            }

            Assert.IsTrue(Math.Abs(hydrochloricAcid.Mass - 3.53) < 0.01, "The Hydrochloric Acid part is not 3.53 kg");
            Assert.IsTrue(Math.Abs(water.Mass - 9.00) < 0.01, "The Water part is not 9.00 kg");
            Assert.IsTrue(Math.Abs(sodiumCloride.Mass - 58.45) < 0.01, "The Sodium Cloride part is not 58.45 kg");
            Assert.IsTrue(tsbp.Duration.Minutes == 45, "Removing 50% Water part did not take 5 Min"); // there are also a few seconds and miliseconds
        }
コード例 #8
0
ファイル: TestMaterials.cs プロジェクト: sjvannTMU/Sage
        public void TestSecondaryReactions()
        {
            Model model = new Model("Hello, world.", Guid.NewGuid());
            BasicReactionSupporter brs = new BasicReactionSupporter();

            LoadSampleCatalog(brs.MyMaterialCatalog);

            // Add more substances to catalog
            brs.MyMaterialCatalog.Add(new MaterialType(model, "Tuberus Magnificus", Guid.NewGuid(), 1.02, 4.9, MaterialState.Solid, 22.5));
            brs.MyMaterialCatalog.Add(new MaterialType(model, "French Fried Potatoes", Guid.NewGuid(), 1.02, 5.1, MaterialState.Liquid, 22.8));

            // Define reactions
            Reaction r1 = new Reaction(null, "Reaction 1", Guid.NewGuid());

            r1.AddReactant(brs.MyMaterialCatalog["Caustic Soda"], 0.5231);
            r1.AddReactant(brs.MyMaterialCatalog["Hydrochloric Acid"], 0.4769);
            r1.AddProduct(brs.MyMaterialCatalog["Water"], 0.2356);
            r1.AddProduct(brs.MyMaterialCatalog["Sodium Chloride"], 0.7644);
            brs.MyReactionProcessor.AddReaction(r1);

            Reaction r2 = new Reaction(null, "Make French Fries", Guid.NewGuid());

            r2.AddReactant(brs.MyMaterialCatalog["Sodium Chloride"], 0.1035);
            r2.AddReactant(brs.MyMaterialCatalog["Tuberus Magnificus"], 0.8965);
            r2.AddProduct(brs.MyMaterialCatalog["French Fried Potatoes"], 1.000);
            brs.MyReactionProcessor.AddReaction(r2);

            Mixture mixture = new Mixture(model, "Contents of vat 1", Guid.NewGuid());

            brs.MyReactionProcessor.Watch(mixture);

            AddSubstance(ref mixture, brs.MyMaterialCatalog["Caustic Soda"], 40, 20.0);
            AddSubstance(ref mixture, brs.MyMaterialCatalog["Hydrochloric Acid"], 40, 20.0);
            AddSubstance(ref mixture, brs.MyMaterialCatalog["Tuberus Magnificus"], 40, 20.0);
            mixture.Temperature = 100.0;

            Substance water            = null;
            Substance hydrochloricAcid = null;
            Substance sodiumCloride    = null;
            Substance ff = null;

            foreach (Substance s in mixture.Constituents)
            {
                switch (s.Name)
                {
                case "Water": water = s; break;

                case "Hydrochloric Acid": hydrochloricAcid = s; break;

                case "Sodium Chloride": sodiumCloride = s; break;

                case "French Fried Potatoes": ff = s; break;
                }
            }

            Assert.IsTrue(Math.Abs(hydrochloricAcid.Mass - 3.53) < 0.01, "The Hydrochloric Acid part is not 3.53 kg");
            Assert.IsTrue(Math.Abs(water.Mass - 18.01) < 0.01, "The Water part is not 18.01 kg");
            Assert.IsTrue(Math.Abs(sodiumCloride.Mass - 53.83) < 0.01, "The Sodium Cloride part is not 53.83 kg");
            Assert.IsTrue(Math.Abs(ff.Mass - 44.62) < 0.01, "The French Fries part is not 44.62 kg");

            Debug.WriteLine(mixture);
        }
コード例 #9
0
ファイル: TestMaterials.cs プロジェクト: stuarthillary/Sage-1
        public void TestRemovalByMassFromMixture()
        {
            Model model = new Model("Hello, world.", Guid.NewGuid());
            BasicReactionSupporter brs = new BasicReactionSupporter();

            LoadSampleCatalog(brs.MyMaterialCatalog);

            // Define reactions
            Reaction r = new Reaction(null, "Reaction", Guid.NewGuid());

            r.AddReactant(brs.MyMaterialCatalog["Caustic Soda"], 0.5231);
            r.AddReactant(brs.MyMaterialCatalog["Hydrochloric Acid"], 0.4769);
            r.AddProduct(brs.MyMaterialCatalog["Water"], 0.2356);
            r.AddProduct(brs.MyMaterialCatalog["Sodium Chloride"], 0.7644);
            brs.MyReactionProcessor.AddReaction(r);

            Mixture mixture = new Mixture(model, "Test mixture 1", Guid.NewGuid());

            brs.MyReactionProcessor.Watch(mixture);

            // Add substances
            AddSubstance(ref mixture, brs.MyMaterialCatalog["Caustic Soda"], 40, 20.0);
            AddSubstance(ref mixture, brs.MyMaterialCatalog["Hydrochloric Acid"], 40, 20.0);
            mixture.Temperature = 100.0;

            // Definitions to retrive substances from mixture
            Substance water            = null;
            Substance hydrochloricAcid = null;
            Substance sodiumCloride    = null;

            foreach (Substance su in mixture.Constituents)
            {
                switch (su.Name)
                {
                case "Water": water = su; break;

                case "Hydrochloric Acid": hydrochloricAcid = su; break;

                case "Sodium Chloride": sodiumCloride = su; break;
                }
            }

            _Debug.Assert(Math.Abs(hydrochloricAcid.Mass - 3.53) < 0.01, "The Hydrochloric Acid part is not 3.53 kg");
            _Debug.Assert(Math.Abs(water.Mass - 18.01) < 0.01, "The Water part is not 18.01 kg");
            _Debug.Assert(Math.Abs(sodiumCloride.Mass - 58.45) < 0.01, "The Sodium Cloride part is not 58.45 kg");

            // Remove 10 kg of water
            MaterialTransferSpecByMass tsbm = new MaterialTransferSpecByMass(brs.MyMaterialCatalog["Water"], 10, TimeSpan.FromMinutes(5));

            _Debug.WriteLine("Want to remove " + tsbm);
            IMaterial removee = tsbm.GetExtract(mixture);

            _Debug.WriteLine("Successful in removing " + removee + ".\r\nWhat remains is ");
            _Debug.WriteLine(mixture);

            foreach (Substance su in mixture.Constituents)
            {
                switch (su.Name)
                {
                case "Water": water = su; break;

                case "Hydrochloric Acid": hydrochloricAcid = su; break;

                case "Sodium Chloride": sodiumCloride = su; break;
                }
            }

            _Debug.Assert(Math.Abs(hydrochloricAcid.Mass - 3.53) < 0.01, "The Hydrochloric Acid part is not 3.53 kg");
            _Debug.Assert(Math.Abs(water.Mass - 8.01) < 0.01, "The Water part is not 8.01 kg");
            _Debug.Assert(Math.Abs(sodiumCloride.Mass - 58.45) < 0.01, "The Sodium Chloride part is not 58.45 kg");
            _Debug.Assert(tsbm.Duration.Equals(new TimeSpan(0, 0, 5, 0, 0)), "Removing 10 kg Water part did not take 5 Min");
        }