/// <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); }
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); }
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); }
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); }
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); }
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); }
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 }
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); }
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"); }