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