/// <summary>
        /// Binary phase diagram constructor.
        /// </summary>
        /// <param name="system">Binary system to calphad</param>
        public BinaryPhaseDiagram(IBinarySystem system)
        {
            this.system = system;

            // Расчет коэффициентов c0 и с1 в приближении модели субрегулярных растворов
            this.c0 = -2 * (system.leftElement.dG(system.azeotrope.temperature)
                        / system.azeotrope.coordinate)
                      - system.rightElement.dG(system.azeotrope.temperature)
                        * (1 - 2 * system.azeotrope.coordinate)
                        / (Math.Pow((1 - system.azeotrope.coordinate), 2));

            this.c1 = system.leftElement.dG(system.azeotrope.temperature)
                        / Math.Pow(system.azeotrope.coordinate, 2)
                      - system.rightElement.dG(system.azeotrope.temperature)
                        / Math.Pow((1 - system.azeotrope.coordinate), 2);

            // Вспомогательные переменные
            double a11 = (Math.Pow(system.experimentalPoint.solidusCoordinate, 2)
                           - Math.Pow(system.experimentalPoint.liquidusCoordinate, 2))
                          / (Constants.R * system.experimentalPoint.temperature);

            double a12 = (2 * Math.Pow(system.experimentalPoint.solidusCoordinate, 3)
                            - Math.Pow(system.experimentalPoint.solidusCoordinate, 2)
                              - Math.Pow(system.experimentalPoint.liquidusCoordinate, 2)
                                + 2 * Math.Pow(system.experimentalPoint.liquidusCoordinate, 3))
                          / (Constants.R * system.experimentalPoint.temperature);

            double a21 = (2 * system.experimentalPoint.liquidusCoordinate
                            - 2 * system.experimentalPoint.solidusCoordinate)
                          / (Constants.R * system.experimentalPoint.temperature);

            double a22 = (2 * system.experimentalPoint.solidusCoordinate
                            - 3 * Math.Pow(system.experimentalPoint.solidusCoordinate, 2)
                                - 2 * system.experimentalPoint.liquidusCoordinate
                                    + 3 * Math.Pow(system.experimentalPoint.liquidusCoordinate, 2))
                          / (Constants.R * system.experimentalPoint.temperature);

            double b1 = Math.Log((1 - system.experimentalPoint.liquidusCoordinate)
                                    / (1 - system.experimentalPoint.solidusCoordinate))
                          + (system.leftElement.dG(system.experimentalPoint.temperature)
                               - Math.Pow(system.experimentalPoint.liquidusCoordinate, 2) * (c0 - c1)
                                 + 2 * Math.Pow(system.experimentalPoint.liquidusCoordinate, 3) * c1)
                             / (Constants.R * system.experimentalPoint.temperature);

            double b2 = Math.Log((system.experimentalPoint.liquidusCoordinate
                                   * (1 - system.experimentalPoint.solidusCoordinate))
                                   / (system.experimentalPoint.solidusCoordinate
                                   * (1 - system.experimentalPoint.liquidusCoordinate)))
                          + (system.rightElement.dG(system.experimentalPoint.temperature)
                               - system.leftElement.dG(system.experimentalPoint.temperature)
                                 + c0 + 2 * c1 * system.experimentalPoint.liquidusCoordinate
                                   - 2 * c0 * system.experimentalPoint.liquidusCoordinate
                                     - 3 * Math.Pow(system.experimentalPoint.liquidusCoordinate, 2) * c1)
                             / (Constants.R * system.experimentalPoint.temperature);

            // Расчет коэффициентов a0 и a1 в приближении модели субрегулярных растворов
            this.a0 = (b1 * a22 - a12 * b2) / (a11 * a22 - a21 * a12);
            this.a1 = (b2 * a11 - b1 * a21) / (a11 * a22 - a21 * a12);
        }
Example #2
0
 private double minimalTemperature(IBinarySystem system)
 {
     double tMin = Double.PositiveInfinity;
     if (system.azeotrope.temperature < tMin)
     {
         tMin = system.azeotrope.temperature;
     }
     if (system.leftElement.Ta_b < tMin)
     {
         tMin = system.leftElement.Ta_b;
     }
     if (system.rightElement.Ta_b < tMin)
     {
         tMin = system.rightElement.Ta_b;
     }
     return tMin;
 }
Example #3
0
 private double maximalTemperature(IBinarySystem system)
 {
     double tMax = Double.NegativeInfinity;
     if (system.azeotrope.temperature > tMax)
     {
         tMax = system.azeotrope.temperature;
     }
     if (system.leftElement.Ta_b > tMax)
     {
         tMax = system.leftElement.Ta_b;
     }
     if (system.rightElement.Ta_b > tMax)
     {
         tMax = system.rightElement.Ta_b;
     }
     return tMax;
 }
Example #4
0
        private void comboBoxBPS_SelectedIndexChanged(object sender, EventArgs e)
        {
            IBinarySystem newSelectedSystem = systems[comboBoxBPS.SelectedIndex];
            if (newSelectedSystem != selectedSystem)
            {
                selectedSystem = newSelectedSystem;
                phaseDiagram = new BinaryPhaseDiagram(selectedSystem);
                phaseDiagram.CalculateTX(TStep);

                gibbsTempBar.Maximum = (int)maximalTemperature(selectedSystem);
                gibbsTempBar.Minimum = (int)minimalTemperature(selectedSystem);
                gibbsTempBar.Value = gibbsTempBar.Minimum;
                gibbsTempLabel.Text = "T = " + gibbsTempBar.Value.ToString() + " K";
            }
        }