public void Stoichiometry_CreateConversionTable2() { ChemicalEquation.PTable = new PeriodicTable("..\\..\\..\\Chemistry-Solver\\data\\ElementData.csv"); var stoichiometry = new Stoichiometry(); var equation = new ChemicalEquation("1Al_(1) + 1Cl_(2) --> 1Al_(1)Cl_(3)"); equation.Balance(); var canceledUnit = $"{equation.Reactants[0].Item2}{equation.Reactants[0].Item1.ToString()} mass"; var remainingUnit = $"{equation.Products[0].Item2}{equation.Products[0].Item1.ToString()} moles"; stoichiometry.CreateConversionTable(equation); stoichiometry.UnitConverter.InputValue = new ConversionValue(1d, new[] { canceledUnit }, null, equation.ToString()); stoichiometry.UnitConverter.ConversionRatio = stoichiometry.UnitConverter.ConversionTable.GetConversionValue(canceledUnit, remainingUnit); var actual = stoichiometry.UnitConverter.PerformConversion(); canceledUnit = $"{equation.Reactants[1].Item2}{equation.Reactants[1].Item1.ToString()} mass"; stoichiometry.UnitConverter.InputValue = new ConversionValue(1d, new[] { canceledUnit }, null, equation.ToString()); stoichiometry.UnitConverter.ConversionRatio = stoichiometry.UnitConverter.ConversionTable.GetConversionValue(canceledUnit, remainingUnit); var actual2 = stoichiometry.UnitConverter.PerformConversion(); }
/// <summary> /// Condenses the molcules in the list <paramref name="molecules"/> so that only one of each appear, with multiple copies of the same element /// being indicated by an increased subscript in that element. /// </summary> /// <param name="molecules"></param> public void CondenseMolecules(List <Tuple <Molecule, int> > molecules) { for (var i = 0; i < molecules.Count; ++i) { var molecule = molecules[i].Item1.ToString(); var elements = Regex.Matches(molecule, @"[A-Z]{1}[a-z]{0,2}"); var subscripts = Regex.Matches(molecule, @"\b\d{1,}\b"); var condensedFormat = "1"; // Iterate over the elements in the molecule for (var j = 0; j < elements.Count; ++j) { var elementSubscripts = Regex.Matches(molecule, elements[j].Value + @"_\(\d{1,}\)"); var subscript_sum = 0; foreach (Match subscript in elementSubscripts) { var subscript_string = Regex.Match(subscript.Value, @"\d{1,}"); var subscriptValue = 0; int.TryParse(subscript_string.Value, out subscriptValue); subscript_sum += subscriptValue; } condensedFormat += (!Regex.IsMatch(condensedFormat, elements[j].Value)) ? $"{elements[j].Value}_({subscript_sum})" : string.Empty; } molecules[i] = Tuple.Create(ChemicalEquation.CreateMolecule(condensedFormat), molecules[i].Item2); } }
/// <summary> /// Simplifies an equation entered into the equation input text box. /// </summary> /// <param name="equation">The equation to be simplified.</param> /// <returns>A simplfied equation as a string.</returns> public string SimplifyEquationFormat(string equation) { var chemical_equation = new ChemicalEquation(equation); CondenseMolecules(chemical_equation.Reactants); CondenseMolecules(chemical_equation.Products); return(chemical_equation.ToString()); }
public void Stoichiometry_CreateConversionTable() { ChemicalEquation.PTable = new PeriodicTable("..\\..\\..\\Chemistry-Solver\\data\\ElementData.csv"); var stoichiometry = new Stoichiometry(); var equation = new ChemicalEquation("1H_(2) + 1O_(2) --> 1H_(2)O_(1)"); equation.Balance(); var canceledUnit = $"{equation.Reactants[0].Item2}{equation.Reactants[0].Item1.ToString()} moles"; var remainingUnit = $"{equation.Reactants[1].Item2}{equation.Reactants[1].Item1.ToString()} moles"; stoichiometry.CreateConversionTable(equation); stoichiometry.UnitConverter.InputValue = new ConversionValue(14d, new[] { canceledUnit }, null, equation.ToString()); stoichiometry.UnitConverter.ConversionRatio = stoichiometry.UnitConverter.ConversionTable.GetConversionValue(canceledUnit, remainingUnit); var actual = stoichiometry.UnitConverter.PerformConversion(); var expected = new ConversionValue(7d, new[] { remainingUnit }, null, equation.ToString()); Assert.AreEqual(expected, actual); }
private float equivalentFormula(ChemicalEquation Equation) { float ratio = 0; ReactionComponent[] reactanti = Equation.reactanti; if (reactanti.Length == 0 || elements.Count == 0 || reactanti.Length != elements.Count) { return(0); } foreach (ReactionComponent reactant in reactanti) { if (elements.Exists(item => item.Data.id == reactant.id())) { InteractionChemicalElement element = elements.Find(item => item.Data.id == reactant.id()); if (ratio == 0) { ratio = (float)element.Coefficient / reactant.Coefficient; } else { if (ratio != (float)element.Coefficient / reactant.Coefficient) { return(0); } } } else { return(0); } } return(ratio); }
void Start() { Elements.Add(new Element(1, "H", "Hydrogen", 1.007825M )); Elements.Add(new Element(2, "He", "Helium", 4.00260M )); Elements.Add(new Element(3, "Li", "Lithium", 6.941M )); Elements.Add(new Element(4, "Be", "Beryllium", 9.01218M )); Elements.Add(new Element(5, "B", "Boron", 10.81M )); Elements.Add(new Element(6, "C", "Carbon", 12.011M )); Elements.Add(new Element(7, "N", "Nitrogen", 14.0067M )); Elements.Add(new Element(8, "O", "Oxygen", 15.999M )); Elements.Add(new Element(9, "F", "Fluorine", 18.99840M )); Elements.Add(new Element(10, "Ne", "Neon", 20.179M )); Elements.Add(new Element(11, "Na", "Sodium", 22.98977M )); Elements.Add(new Element(12, "Mg", "Magnesium", 24.305M )); Elements.Add(new Element(13, "Al", "Aluminum", 26.98154M )); Elements.Add(new Element(14, "Si", "Silicon", 28.0855M )); Elements.Add(new Element(15, "P", "Phosphorus", 0.0M )); Elements.Add(new Element(16, "S", "Sulphur", 32.06M )); Elements.Add(new Element(17, "Cl", "Chlorine", 35.453M )); Elements.Add(new Element(18, "Ar", "Argon", 39.948M )); Elements.Add(new Element(19, "K", "Potassium", 39.0983M )); Elements.Add(new Element(20, "Ca", "Calcium", 40.08M )); Elements.Add(new Element(21, "Sc", "Scandium", 44.9559M )); Elements.Add(new Element(22, "Ti", "Titanium", 47.90M )); Elements.Add(new Element(23, "V", "Vanadium", 50.9414M )); Elements.Add(new Element(24, "Cr", "Chromium", 51.996M )); Elements.Add(new Element(25, "Mn", "Manganese", 54.9380M )); Elements.Add(new Element(26, "Fe", "Iron", 55.85M )); Elements.Add(new Element(27, "Co", "Cobalt", 58.9332M )); Elements.Add(new Element(28, "Ni", "Nickel", 58.71M )); Elements.Add(new Element(29, "Cu", "Copper", 63.546M )); Elements.Add(new Element(30, "Zn", "Zinc", 65.37M )); Elements.Add(new Element(31, "Ga", "Gallium", 69.72M )); Elements.Add(new Element(32, "Ge", "Germanium", 72.59M )); Elements.Add(new Element(33, "As", "Arsenic", 74.9216M )); Elements.Add(new Element(34, "Se", "Selenium", 78.96M )); Elements.Add(new Element(35, "Br", "Bromine", 79.904M )); Elements.Add(new Element(36, "Kr", "Krypton", 83.80M )); Elements.Add(new Element(37, "Rb", "Rubidium", 85.4678M )); Elements.Add(new Element(38, "Sr", "Strontium", 87.62M )); Elements.Add(new Element(39, "Y", "Yttrium", 88.9059M )); Elements.Add(new Element(40, "Zr", "Zirconium", 91.22M )); Elements.Add(new Element(41, "Nb", "Niobium", 92.91M )); Elements.Add(new Element(42, "Mo", "Molybdenum", 95.94M )); Elements.Add(new Element(43, "Tc", "Technetium", 99.0M )); Elements.Add(new Element(44, "Ru", "Ruthenium", 101.1M )); Elements.Add(new Element(45, "Rh", "Rhodium", 102.91M )); Elements.Add(new Element(46, "Pd", "Palladium", 106.42M )); Elements.Add(new Element(47, "Ag", "Silver", 107.87M )); Elements.Add(new Element(48, "Cd", "Cadmium", 112.4M )); Elements.Add(new Element(49, "In", "Indium", 114.82M )); Elements.Add(new Element(50, "Sn", "Tin", 118.69M )); Elements.Add(new Element(51, "Sb", "Antimony", 121.75M )); Elements.Add(new Element(52, "Te", "Tellurium", 127.6M )); Elements.Add(new Element(53, "I", "Iodine", 126.9045M )); Elements.Add(new Element(54, "Xe", "Xenon", 131.29M )); Elements.Add(new Element(55, "Cs", "Cesium", 132.9054M )); Elements.Add(new Element(56, "Ba", "Barium", 137.33M )); Elements.Add(new Element(57, "La", "Lanthanum", 138.91M )); Elements.Add(new Element(58, "Ce", "Cerium", 140.12M )); Elements.Add(new Element(59, "Pr", "Praseodymium", 140.91M )); Elements.Add(new Element(60, "Nd", "Neodymium", 0.0M )); Elements.Add(new Element(61, "Pm", "Promethium", 147.0M )); Elements.Add(new Element(62, "Sm", "Samarium", 150.35M )); Elements.Add(new Element(63, "Eu", "Europium", 167.26M )); Elements.Add(new Element(64, "Gd", "Gadolinium", 157.25M )); Elements.Add(new Element(65, "Tb", "Terbium", 158.925M )); Elements.Add(new Element(66, "Dy", "Dysprosium", 162.50M )); Elements.Add(new Element(67, "Ho", "Holmium", 164.9M )); Elements.Add(new Element(68, "Er", "Erbium", 167.26M )); Elements.Add(new Element(69, "Tm", "Thulium", 168.93M )); Elements.Add(new Element(70, "Yb", "Ytterbium", 173.04M )); Elements.Add(new Element(71, "Lu", "Lutetium", 174.97M )); Elements.Add(new Element(72, "Hf", "Hafnium", 178.49M )); Elements.Add(new Element(73, "Ta", "Tantalum", 180.95M )); Elements.Add(new Element(74, "W", "Tungsten", 183.85M )); Elements.Add(new Element(75, "Re", "Rhenium", 186.23M )); Elements.Add(new Element(76, "Os", "Osmium", 190.2M )); Elements.Add(new Element(77, "Ir", "Iridium", 192.2M )); Elements.Add(new Element(78, "Pt", "Platinum", 195.09M )); Elements.Add(new Element(79, "Au", "Gold", 196.9655M )); Elements.Add(new Element(80, "Hg", "Mercury", 200.59M )); Elements.Add(new Element(81, "Tl", "Thallium", 204.383M )); Elements.Add(new Element(82, "Pb", "Lead", 207.2M )); Elements.Add(new Element(83, "Bi", "Bismuth", 208.9804M )); Elements.Add(new Element(84, "Po", "Polonium", 210.0M )); Elements.Add(new Element(85, "At", "Astatine", 210.0M )); Elements.Add(new Element(86, "Rn", "Radon", 222.0M )); Elements.Add(new Element(87, "Fr", "Francium", 233.0M )); Elements.Add(new Element(88, "Ra", "Radium", 226.0254M )); Elements.Add(new Element(89, "Ac", "Actinium", 227.0M )); Elements.Add(new Element(90, "Th", "Thorium", 232.04M )); Elements.Add(new Element(91, "Pa", "Protactinium", 231.0359M )); Elements.Add(new Element(92, "U", "Uranium", 238.03M )); Elements.Add(new Element(93, "Np", "Neptunium", 237.0M )); Elements.Add(new Element(94, "Pu", "Plutonium", 244.0M )); Elements.Add(new Element(95, "Am", "Americium", 243.0M )); Elements.Add(new Element(96, "Cm", "Curium", 247.0M )); Elements.Add(new Element(97, "Bk", "Berkelium", 247.0M )); Elements.Add(new Element(98, "Cf", "Californium", 251.0M )); Elements.Add(new Element(99, "Es", "Einsteinium", 254.0M )); Elements.Add(new Element(100, "Fm", "Fermium", 257.0M )); Elements.Add(new Element(101, "Md", "Mendelevium", 258.0M )); Elements.Add(new Element(102, "No", "Nobelium", 259.0M )); Elements.Add(new Element(103, "Lr", "Lawrencium", 262.0M )); Elements.Add(new Element(104, "Rf", "Rutherfordium",260.9M )); Elements.Add(new Element(105, "Db", "Dubnium", 261.9M )); Elements.Add(new Element(106, "Sg", "Seaborgium", 262.94M )); Elements.Add(new Element(107, "Bh", "Bohrium", 262.0M )); Elements.Add(new Element(108, "Hs", "Hassium", 264.8M )); Elements.Add(new Element(109, "Mt", "Meitnerium", 265.9M )); Elements.Add(new Element(110, "Ds", "Darmstadtium", 261.9M )); Elements.Add(new Element(112, "Uub", "Ununbium", 276.8M )); Elements.Add(new Element(114, "Uuq", "Ununquadium", 289.0M )); Elements.Add(new Element(116, "Uuh", "Ununhexium", 0.0M )); //Build list of Chemical Equations Equations.Add(new ChemicalEquation()); Equations[Equations.Count-1].Formulas.Add(new ChemicalFormula(2)); Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].Formula.Add(new Chemical(Elements[12], 1)); Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].molarMass = getMolarMass(Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1]); Equations[Equations.Count-1].formulaOperators.Add(" + "); Equations[Equations.Count-1].Formulas.Add(new ChemicalFormula(3)); Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].Formula.Add(new Chemical(Elements[28], 1)); Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].Formula.Add(new Chemical(Elements[16], 2)); Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].molarMass = getMolarMass(Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1]); Equations[Equations.Count-1].formulaOperators.Add(" --> "); Equations[Equations.Count-1].Formulas.Add(new ChemicalFormula(3)); Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].Formula.Add(new Chemical(Elements[28], 1)); Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].molarMass = getMolarMass(Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1]); Equations[Equations.Count-1].formulaOperators.Add(" + "); Equations[Equations.Count-1].Formulas.Add(new ChemicalFormula(2)); Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].Formula.Add(new Chemical(Elements[12], 1)); Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].Formula.Add(new Chemical(Elements[16], 3)); Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].molarMass = getMolarMass(Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1]); Equations[Equations.Count - 1].balanced = true; Equations.Add(new ChemicalEquation()); Equations[Equations.Count-1].Formulas.Add(new ChemicalFormula(16)); Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].Formula.Add(new Chemical(Elements[18], 1)); Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].molarMass = getMolarMass(Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1]); Equations[Equations.Count-1].formulaOperators.Add(" + "); Equations[Equations.Count-1].Formulas.Add(new ChemicalFormula(1)); Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].Formula.Add(new Chemical(Elements[15], 8)); Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].molarMass = getMolarMass(Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1]); Equations[Equations.Count-1].formulaOperators.Add(" --> "); Equations[Equations.Count-1].Formulas.Add(new ChemicalFormula(8)); Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].Formula.Add(new Chemical(Elements[18], 2)); Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].Formula.Add(new Chemical(Elements[15], 1)); Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].molarMass = getMolarMass(Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1]); Equations[Equations.Count-1].balanced = true; Equations.Add(new ChemicalEquation()); Equations[Equations.Count-1].Formulas.Add(new ChemicalFormula(2)); //Coefficient 2 Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].Formula.Add(new Chemical(Elements[0], 2)); //2 Hydrogen Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].Formula.Add(new Chemical(Elements[7], 2)); // 2 Oxygen Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].molarMass = getMolarMass(Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1]); Equations[Equations.Count-1].formulaOperators.Add(" --> "); // Reaction Equations[Equations.Count-1].Formulas.Add(new ChemicalFormula(2)); //Coefficient 2 Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].Formula.Add(new Chemical(Elements[0], 2)); // 2 Hydrogen Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].Formula.Add(new Chemical(Elements[7], 1)); //One Oxygen Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].molarMass = getMolarMass(Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1]); Equations[Equations.Count-1].formulaOperators.Add(" + "); //Add Equations[Equations.Count-1].Formulas.Add(new ChemicalFormula(1));//Coefficient 1 Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].Formula.Add(new Chemical(Elements[7], 2));//2 Oxygen Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1].molarMass = getMolarMass(Equations[Equations.Count-1].Formulas[Equations[Equations.Count-1].Formulas.Count - 1]); Equations[Equations.Count-1].balanced = true; currentEquation = Equations[Equations.Count-1]; displayChemicalEquation(); //setUpDragGame(8.25f, "g " + currentEquation.Formulas[0].displayName, currentEquation.Formulas[0], currentEquation.Formulas[currentEquation.Formulas.Count-1], "Grams", "Grams"); //equationHolder.GetComponent<EquationController>().addFormula(Equations[Equations.Count-1]); }
void balanceEquation(ChemicalEquation equ) { //start with most complex chemical formula to the least //work from first element of the most complex formula to the last //balance as you go //avoid breaking balance }
float molesToLitersOfSolution(ChemicalEquation form, float moles) { return (0.0f); }
public float CheckEquivalentFormula(ChemicalEquation Equation) { return(equivalentFormula(Equation)); }