public Substance(Pressure pressure, Enthalpy enthalpy)
        {
            Pressure = pressure;

            //Checking what region the Substanse belong to:

            //1. check if it is region 1
            try
            {
                Temperature = new Temperature(Region1BackwardEquation_Tph.CalculateTemperature(pressure.Value, enthalpy.Value));
                CalculateProperties(Temperature, Pressure);
            }
            catch (CantDetermineRegionException)
            { }
            if (SpecificEnthalpy!=null && Math.Round(SpecificEnthalpy.Value) == Math.Round(enthalpy.Value))
            {
                //it is region 1
                return;
            }

            //2. check if it is region 2

            if (pressure.Value<=4)
            {
                Temperature = new Temperature(Region2aBackwardEquation_Tph.CalculateTemperature(pressure.Value, enthalpy.Value));
                CalculateProperties(Temperature, Pressure);
                if (Math.Round(SpecificEnthalpy.Value, 1) == Math.Round(enthalpy.Value, 1))
                {
                    //it is region 2a
                    return;
                }
            }
            else if (Region2B2bcEquation.is2cSubregion(pressure.Value, enthalpy.Value) == false)
            {
                Temperature = new Temperature(Region2bBackwardEquation_Tph.CalculateTemperature(pressure.Value, enthalpy.Value));
                CalculateProperties(Temperature, Pressure);
                if (Math.Round(SpecificEnthalpy.Value, 1) == Math.Round(enthalpy.Value, 1))
                {
                    //it is region 2b
                    return;
                }
            }
            else if (Region2B2bcEquation.is2cSubregion(pressure.Value, enthalpy.Value))
            {
                Temperature = new Temperature(Region2cBackwardEquation_Tph.CalculateTemperature(pressure.Value, enthalpy.Value));
                CalculateProperties(Temperature, Pressure);
                if (Math.Round(SpecificEnthalpy.Value, 1) == Math.Round(enthalpy.Value, 1))
                {
                    //it is region 2c
                    return;
                }
            }
            else
            {
                throw new CantDetermineRegionException("It seems no region fits to these values pressure and enthalpy");
            }
        }
        public Substance(Pressure pressure, Entropy entropy)
        {
            Pressure = pressure;

            //Checking what region the Substanse belong to:

            //1. check if it is region 1
            try
            {
                Temperature = new Temperature(Region1BackwardEquation_Tps.CalculateTemperature(pressure.Value, entropy.Value));
                CalculateProperties(Temperature, Pressure);
            }
            catch (CantDetermineRegionException)
            { }

            if (SpecificEntropy!=null && Math.Round(SpecificEntropy.Value, 3) == Math.Round(entropy.Value, 3))
            {
                //it is region 1
                return;
            }

            //2. check if it is region 2

            if (pressure.Value <= 4)
            {
                Temperature = new Temperature(Region2aBackwardEquation_Tps.CalculateTemperature(pressure.Value, entropy.Value ));
                CalculateProperties(Temperature, Pressure);
                if (Math.Round(SpecificEntropy.Value, 3) == Math.Round(entropy.Value, 3))
                {
                    //it is region 2a
                    return;
                }
            }
            else if (entropy.Value>=5.85)
            {
                Temperature = new Temperature(Region2bBackwardEquation_Tps.CalculateTemperature(pressure.Value, entropy.Value));
                CalculateProperties(Temperature, Pressure);
                if (Math.Round(SpecificEntropy.Value, 3) == Math.Round(entropy.Value, 3))
                {
                    //it is region 2b
                    return;
                }
            }
            else
            {
                Temperature = new Temperature(Region2cBackwardEquation_Tps.CalculateTemperature(pressure.Value, entropy.Value));
                CalculateProperties(Temperature, Pressure);
                if (Math.Round(SpecificEntropy.Value, 3) == Math.Round(entropy.Value, 3))
                {
                    //it is region 2c
                    return;
                }
            }
        }
 private void Region5Calculations(Temperature temperature, Pressure pressure)
 {
     Temperature = temperature;
     Pressure = pressure;
     SpecificVolume = Region5.CalculateSpecificVolume(temperature.Value, pressure.Value);
     SpecificEnthalpy = new Enthalpy(Region5.CalculateSpecificEnthalpy(temperature.Value, pressure.Value));
     SpecificInternalEnergy = Region5.CalculateSpecificInternalEnergy(temperature.Value, pressure.Value);
     SpecificEntropy = new Entropy(Region5.CalculateSpecificEntropy(temperature.Value, pressure.Value));
     SpecificIsobaricHeatCapacity = Region5.SpecificIsobaricHeatCapacity(temperature.Value, pressure.Value);
     SpeedOfSound = Region5.SpeedOfSound(temperature.Value, pressure.Value);
     SpecificIsochoricHeatCapacity = Region5.SpecificIsochoricHeatCapacity(temperature.Value, pressure.Value);
 }
 private void Region4Calculations(Temperature temperature, Pressure pressure, State state)
 {
     switch (state)
     {
         case State.Water:
             if (IsRegion1(temperature, pressure))
             {
                 Region1Calculations(temperature, pressure);
             }
             break;
         case State.Steam:
             if (IsRegion2(temperature, pressure))
             {
                 Region2Calculations(temperature, pressure);
             }
             break;
         default:
             throw new CantDetermineRegionException
                 ("The pressure value may be out of range. If you do not trying to find saturation line properties, you must not specify the state");
     }
 }
        private void CalculateProperties(Temperature temperature, Pressure pressure)
        {
            //check if it is region 1
            if (IsRegion1(temperature, pressure))
            {
                Region1Calculations(temperature, pressure);
            }

            //check if it is region 2
            else if (IsRegion2(temperature, pressure))
            {
                Region2Calculations(temperature, pressure);
            }

            //check if it is region 5
            else if (IsRegion5(temperature, pressure))
            {
                Region5Calculations(temperature, pressure);
            }

            else
            {
                throw new CantDetermineRegionException
                    ("Can not determine what region substance belongs to, temperature or pressure value may be out of range");
            }
        }
 private static bool IsRegion5(Temperature temperature, Pressure pressure)
 {
     return temperature.Value >= 1073.15 && temperature.Value <= 2273.15
                         && pressure.Value > 0 && pressure.Value <= 50;
 }
 public Substance(Temperature temperature, Pressure pressure)
 {
     CalculateProperties(temperature, pressure);
 }
 private static bool IsRegion2(Temperature temperature, Pressure pressure)
 {
     return
                             (
                                 temperature.Value >= 273.15 && temperature.Value <= 623.15 &&
                                  pressure.Value > 0 && pressure.Value <= Region4.CalculateSaturationPressure(temperature.Value)
                             )
                             ||
                             (
                                 temperature.Value >= 623.15 && temperature.Value <= 863.15 &&
                                  pressure.Value > 0 && pressure.Value <= BoundaryRegion2Region3.CalculateBoundaryPressure(temperature.Value)
                             )
                             ||
                             (
                                 temperature.Value > 863.15 && temperature.Value <= 1073.15 &&
                                 pressure.Value > 0 && pressure.Value <= 100
                             );
 }
 private static bool IsRegion1(Temperature temperature, Pressure pressure)
 {
     return temperature.Value >= 273.15 &&
                     temperature.Value <= 623.15 &&
                     Math.Round(pressure.Value, 9) >= Math.Round(Region4.CalculateSaturationPressure(temperature.Value), 9) &&
                     pressure.Value <= 100;
 }
 /// <summary>
 /// Get saturation line substance properties
 /// </summary>
 public Substance(Temperature temperature, State state)
 {
     Pressure pressure = new Pressure(Region4.CalculateSaturationPressure(temperature.Value));
     Region4Calculations(temperature, pressure, state);
 }