public void VerifyAllEnums()
 {
     var acceleration = new Acceleration(1, AccelerationUnit.BaseUnit);
     var angle = new Angle(1, AngleUnit.BaseUnit);
     var angularAcceleration = new AngularAcceleration(1, AngularAccelerationUnit.BaseUnit);
     var area = new Area(1, AreaUnit.BaseUnit);
     var density = new MassDensity(1, MassDensityUnit.BaseUnit);
     var electricCurrent = new ElectricCurrent(1, ElectricCurrentUnit.BaseUnit);
     var electricResistance = new ElectricResistance(1, ElectricResistanceUnit.BaseUnit);
     var electricVoltage = new ElectricPotential(1, ElectricPotentialUnit.BaseUnit);
     var energy = new Energy(1, EnergyUnit.BaseUnit);
     var force = new Force(1, ForceUnit.BaseUnit);
     var frequency = new Frequency(1, FrequencyUnit.BaseUnit);
     var jerk = new Jerk(1, JerkUnit.BaseUnit);
     var length = new Length(1, LengthUnit.BaseUnit);
     var mass = new Mass(1, MassUnit.BaseUnit);
     var massFlowRate = new MassFlowRate(1, MassFlowRateUnit.BaseUnit);
     var momentum = new Momentum(1, MomentumUnit.BaseUnit);
     var numeric = new Numeric(1, NumericUnit.BaseUnit);
     var power = new Power(1, PowerUnit.BaseUnit);
     var pressure = new Pressure(1, PressureUnit.BaseUnit);
     var speed = new Speed(1, SpeedUnit.BaseUnit);
     var temperature = new Temperature(1, TemperatureUnit.BaseUnit);
     var time = new Time(1, TimeUnit.BaseUnit);
     var torque = new Torque(1, TorqueUnit.BaseUnit);
     var volume = new Volume(1, VolumeUnit.BaseUnit);
     var volumetricFlowRate = new VolumetricFlowRate(1, VolumetricFlowRateUnit.BaseUnit);
 }
 public void OpAddition()
 {
     var pressure1 = new Pressure(1000, PressureUnit.Pascals);
     var pressure2 = new Pressure(1, PressureUnit.KiloPascals);
     var expected = new Pressure(2000, PressureUnit.Pascals);
     (pressure1 + pressure2).ShouldEqual(expected);
     (pressure2 + pressure1).ShouldEqual(expected);
 }
        public void OpDivision()
        {
            var pressure1 = new Pressure(4000, PressureUnit.Pascals);
            var pressure2 = new Pressure(4, PressureUnit.KiloPascals);
            (pressure1 / pressure2).ShouldBeWithinEpsilonOf(1);
            (pressure2 / pressure1).ShouldBeWithinEpsilonOf(1);

            (pressure1 / 2).ShouldEqual(new Pressure(2000, PressureUnit.Pascals));
            (pressure2 / 2).ShouldEqual(new Pressure(2, PressureUnit.KiloPascals));
        }
 public void OpGreaterThanOrEqual()
 {
     var pressure1 = new Pressure(1000, PressureUnit.Pascals);
     var pressure2 = new Pressure(1, PressureUnit.KiloPascals);
     var pressure3 = new Pressure(2, PressureUnit.KiloPascals);
     (pressure1 >= pressure3).ShouldBeFalse();
     (pressure3 >= pressure1).ShouldBeTrue();
     (pressure1 >= pressure2).ShouldBeTrue();
     (pressure2 >= pressure1).ShouldBeTrue();
 }
 public void OpInverseEquals()
 {
     var pressure1 = new Pressure(1000, PressureUnit.Pascals);
     var pressure2 = new Pressure(1, PressureUnit.KiloPascals);
     var pressure3 = new Pressure(2, PressureUnit.KiloPascals);
     (pressure1 != pressure2).ShouldBeFalse();
     (pressure2 != pressure1).ShouldBeFalse();
     (pressure1 != pressure3).ShouldBeTrue();
     (pressure3 != pressure1).ShouldBeTrue();
 }
 public void OpEquals()
 {
     var pressure1 = new Pressure(1000, PressureUnit.Pascals);
     var pressure2 = new Pressure(1, PressureUnit.KiloPascals);
     var pressure3 = new Pressure(2, PressureUnit.KiloPascals);
     (pressure1 == pressure2).ShouldBeTrue();
     (pressure2 == pressure1).ShouldBeTrue();
     (pressure1 == pressure3).ShouldBeFalse();
     (pressure3 == pressure1).ShouldBeFalse();
     pressure1.Equals(pressure2)
              .ShouldBeTrue();
     pressure1.Equals((object)pressure2)
              .ShouldBeTrue();
     pressure2.Equals(pressure1)
              .ShouldBeTrue();
     pressure2.Equals((object)pressure1)
              .ShouldBeTrue();
 }
 public static Pressure InchesOfMercury <T>(this T value) =>
 Pressure.FromInchesOfMercury(Convert.ToDouble(value));
 public static Pressure FeetOfElevation <T>(this T value) =>
 Pressure.FromFeetOfElevation(Convert.ToDouble(value));
 public static Pressure Micropascals <T>(this T value) =>
 Pressure.FromMicropascals(Convert.ToDouble(value));
 public static Pressure MillimetersOfMercury <T>(this T value) =>
 Pressure.FromMillimetersOfMercury(Convert.ToDouble(value));
 public static Pressure KilopoundsForcePerSquareInch <T>(this T value) =>
 Pressure.FromKilopoundsForcePerSquareInch(Convert.ToDouble(value));
 public static Pressure MetersOfElevation <T>(this T value) =>
 Pressure.FromMetersOfElevation(Convert.ToDouble(value));
        public virtual BodyType GetBodyType(Mass massSM,
                                            Mass gasMassSM,
                                            Mass molecularWeightRetained,
                                            Pressure surfacePressure,
                                            Ratio waterCoverFraction,
                                            Ratio iceCoverFraction,
                                            Temperature maxTemperature,
                                            Temperature boilingPointWater,
                                            Temperature surfaceTemperature)
        {
            if (TestIsGasGiant(massSM, gasMassSM, molecularWeightRetained))
            {
                if (gasMassSM / massSM < 0.20)
                {
                    return(BodyType.SubSubGasGiant);
                }
                else if (massSM.SolarMasses * GlobalConstants.SUN_MASS_IN_EARTH_MASSES < 20.0)
                {
                    return(BodyType.SubGasGiant);
                }
                else
                {
                    return(BodyType.GasGiant);
                }
            }

            // Assign planet type
            if (surfacePressure.Millibars < 1.0)
            {
                if (massSM.SolarMasses * GlobalConstants.SUN_MASS_IN_EARTH_MASSES < GlobalConstants.ASTEROID_MASS_LIMIT)
                {
                    return(BodyType.Asteroids);
                }
                else
                {
                    return(BodyType.Barren);
                }
            }
            else if (surfacePressure.Millibars > 6000.0 && molecularWeightRetained.Grams <= 2.0)             // Retains Hydrogen
            {
                return(BodyType.SubSubGasGiant);
            }
            else
            {
                // Atmospheres:
                // TODO remove PlanetType enum entirely and replace it with a more flexible classification systme
                if (waterCoverFraction.Value >= 0.95)                 // >95% water
                {
                    return(BodyType.Water);
                }
                else if (iceCoverFraction.Value >= 0.95)                 // >95% ice
                {
                    return(BodyType.Ice);
                }
                else if (waterCoverFraction.Value > 0.05)                 // Terrestrial
                {
                    return(BodyType.Terrestrial);
                }
                else if (maxTemperature > boilingPointWater)                 // Hot = Venusian
                {
                    return(BodyType.Venusian);
                }
                else if (gasMassSM / massSM > 0.0001)                 // Accreted gas, but no greenhouse or liquid water make it an ice world
                {
                    return(BodyType.Ice);
                    //planet.IceCoverFraction = 1.0;
                }
                else if (surfacePressure.Millibars <= 250.0)                 // Thin air = Martian
                {
                    return(BodyType.Martian);
                }
                else if (surfaceTemperature.Kelvins < GlobalConstants.FREEZING_POINT_OF_WATER)
                {
                    return(BodyType.Ice);
                }
                else
                {
                    return(BodyType.Undefined);
                }
            }
        }
 protected void SetScalarValue(DependencyProperty property, Pressure? quantity)
 {
     // we set this flag to prevent from setting scalar value changing quantity values.
     this.isUpdatingScalarValue = true;
     var value = quantity != null
         ? this.Unit.GetScalarValue(quantity.Value)
         : (double?)null;
     this.SetCurrentValue(property, value);
     this.isUpdatingScalarValue = false;
 }
        void ReleaseDesignerOutlets()
        {
            if (Humidity != null)
            {
                Humidity.Dispose();
                Humidity = null;
            }

            if (HumidityLabel != null)
            {
                HumidityLabel.Dispose();
                HumidityLabel = null;
            }

            if (MaxTemp != null)
            {
                MaxTemp.Dispose();
                MaxTemp = null;
            }

            if (MinTemp != null)
            {
                MinTemp.Dispose();
                MinTemp = null;
            }

            if (Pressure != null)
            {
                Pressure.Dispose();
                Pressure = null;
            }

            if (PressureLabel != null)
            {
                PressureLabel.Dispose();
                PressureLabel = null;
            }

            if (ShowDetails != null)
            {
                ShowDetails.Dispose();
                ShowDetails = null;
            }

            if (showHideLabel != null)
            {
                showHideLabel.Dispose();
                showHideLabel = null;
            }

            if (SomeDetailsView != null)
            {
                SomeDetailsView.Dispose();
                SomeDetailsView = null;
            }

            if (Temperature != null)
            {
                Temperature.Dispose();
                Temperature = null;
            }

            if (TemperatureLabel != null)
            {
                TemperatureLabel.Dispose();
                TemperatureLabel = null;
            }

            if (TempMaxLabel != null)
            {
                TempMaxLabel.Dispose();
                TempMaxLabel = null;
            }

            if (TempMinLabel != null)
            {
                TempMinLabel.Dispose();
                TempMinLabel = null;
            }

            if (Town != null)
            {
                Town.Dispose();
                Town = null;
            }

            if (WindSpeed != null)
            {
                WindSpeed.Dispose();
                WindSpeed = null;
            }

            if (WindSpeedLabel != null)
            {
                WindSpeedLabel.Dispose();
                WindSpeedLabel = null;
            }
        }
        /// <summary>
        /// This is Fogg's eq.20, and is also Hart's eq.20 in his "Evolution of
        ///	Earth's Atmosphere" article.  The effective temperature given is in
        ///	units of Kelvin, as is the rise in temperature produced by the
        ///	greenhouse effect, which is returned.
        ///	TODO: Validate opticalDepth units.
        /// </summary>
        /// <param name="opticalDepth"></param>
        /// <param name="effectiveTemp"></param>
        /// <param name="surfPressure"></param>
        /// <returns></returns>
        public virtual TemperatureDelta GetGreenhouseTemperatureRise(Ratio opticalDepth, Temperature effectiveTemp, Pressure surfPressure)
        {
            var convectionFactor = GlobalConstants.EARTH_CONVECTION_FACTOR * Math.Pow(surfPressure.Millibars / GlobalConstants.EARTH_SURF_PRES_IN_MILLIBARS, 0.25);
            var rise             = (Extensions.Pow1_4(1.0 + 0.75 * opticalDepth.Value) - 1.0) *
                                   effectiveTemp.Kelvins * convectionFactor;

            if (rise < 0.0)
            {
                rise = 0.0;
            }

            return(TemperatureDelta.FromKelvins(rise));
        }
 public static Pressure KilogramsForcePerSquareMeter <T>(this T value) =>
 Pressure.FromKilogramsForcePerSquareMeter(Convert.ToDouble(value));
 public static Pressure Kilobars <T>(this T value) =>
 Pressure.FromKilobars(Convert.ToDouble(value));
 public static Pressure InchesOfWaterColumn <T>(this T value) =>
 Pressure.FromInchesOfWaterColumn(Convert.ToDouble(value));
Example #20
0
 public static Force FromPressureByArea(Pressure p, Area area)
 {
     double newtons = p.Pascals*area.SquareMeters;
     return new Force(newtons);
 }
        /// <summary>
        /// The surface temperature passed in is in units of Kelvin.
        /// The cloud adjustment is the fraction of cloud cover obscuring each
        /// of the three major components of albedo that lie below the clouds.
        /// </summary>
        /// <param name="waterFraction"></param>
        /// <param name="cloudFraction"></param>
        /// <param name="iceFraction"></param>
        /// <param name="surfPressure"></param>
        /// <returns></returns>
        public virtual Ratio GetAlbedo(Ratio waterFractionParam, Ratio cloudFractionParam, Ratio iceFractionParam, Pressure surfPressure)
        {
            var waterFraction = waterFractionParam.Value;
            var cloudFraction = cloudFractionParam.Value;
            var iceFraction   = iceFractionParam.Value;

            double rock_fraction, cloud_adjustment, components, cloud_part,
                   rock_part, water_part, ice_part;

            rock_fraction = 1.0 - waterFraction - iceFraction;
            components    = 0.0;
            if (waterFraction > 0.0)
            {
                components = components + 1.0;
            }
            if (iceFraction > 0.0)
            {
                components = components + 1.0;
            }
            if (rock_fraction > 0.0)
            {
                components = components + 1.0;
            }

            cloud_adjustment = cloudFraction / components;

            if (rock_fraction >= cloud_adjustment)
            {
                rock_fraction = rock_fraction - cloud_adjustment;
            }
            else
            {
                rock_fraction = 0.0;
            }

            if (waterFraction > cloud_adjustment)
            {
                waterFraction = waterFraction - cloud_adjustment;
            }
            else
            {
                waterFraction = 0.0;
            }

            if (iceFraction > cloud_adjustment)
            {
                iceFraction = iceFraction - cloud_adjustment;
            }
            else
            {
                iceFraction = 0.0;
            }

            cloud_part = cloudFraction * GlobalConstants.CLOUD_ALBEDO;                 /* about(...,0.2); */

            if (surfPressure.Millibars == 0.0)
            {
                rock_part  = rock_fraction * GlobalConstants.ROCKY_AIRLESS_ALBEDO;                 /* about(...,0.3); */
                ice_part   = iceFraction * GlobalConstants.AIRLESS_ICE_ALBEDO;                     /* about(...,0.4); */
                water_part = 0;
            }
            else
            {
                rock_part  = rock_fraction * GlobalConstants.ROCKY_ALBEDO;                 /* about(...,0.1); */
                water_part = waterFraction * GlobalConstants.WATER_ALBEDO;                 /* about(...,0.2); */
                ice_part   = iceFraction * GlobalConstants.ICE_ALBEDO;                     /* about(...,0.1); */
            }

            return(Ratio.FromDecimalFractions(cloud_part + rock_part + water_part + ice_part));
        }
 /// <summary>
 /// initForecastObjects init and allocate all forecast objects
 /// </summary>
 private void initForecastObjects()
 {
     this.location = new Location();
     this.sunRise = new SunRise();
     this.temperature = new Temperature();
     this.humidity = new Humidity();
     this.pressure = new Pressure();
     this.windSpeed = new WindSpeed();
     this.windDirection = new WindDirection();
     this.clouds = new Clouds();
     this.precipitation = new Precipitation();
     this.weather = new Weather();
     this.lastupdate = new Lastupdate();
 }
Example #23
0
        /// <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);
        }
 public static Pressure KilonewtonsPerSquareMillimeter <T>(this T value) =>
 Pressure.FromKilonewtonsPerSquareMillimeter(Convert.ToDouble(value));
Example #25
0
 private static bool IsRegion5(Temperature temperature, Pressure pressure)
 {
     return(temperature.Value >= 1073.15 && temperature.Value <= 2273.15 &&
            pressure.Value > 0 && pressure.Value <= 50);
 }
 public static Pressure MeganewtonsPerSquareMeter <T>(this T value) =>
 Pressure.FromMeganewtonsPerSquareMeter(Convert.ToDouble(value));
Example #27
0
 public Substance(Temperature temperature, Pressure pressure)
 {
     CalculateProperties(temperature, pressure);
 }
 public static Pressure MetersOfHead <T>(this T value) =>
 Pressure.FromMetersOfHead(Convert.ToDouble(value));
 public static Pressure Torrs <T>(this T value) =>
 Pressure.FromTorrs(Convert.ToDouble(value));
 public static Pressure Millibars <T>(this T value) =>
 Pressure.FromMillibars(Convert.ToDouble(value));
 public void OpSubtraction()
 {
     var pressure1 = new Pressure(7000, PressureUnit.Pascals);
     var pressure2 = new Pressure(1, PressureUnit.KiloPascals);
     (pressure1 - pressure2).ShouldEqual(new Pressure(6000, PressureUnit.Pascals));
     (pressure2 - pressure1).ShouldEqual(new Pressure(-6, PressureUnit.KiloPascals));
 }
 public static Pressure Atmospheres <T>(this T value) =>
 Pressure.FromAtmospheres(Convert.ToDouble(value));
 public static Pressure FeetOfHead <T>(this T value) =>
 Pressure.FromFeetOfHead(Convert.ToDouble(value));
 public void OpMultiplicationScaler()
 {
     var pressure = new Pressure(1, PressureUnit.Pascals);
     var expected = new Pressure(2, PressureUnit.Pascals);
     (pressure * 2).ShouldEqual(expected);
     (2 * pressure).ShouldEqual(expected);
 }
Example #35
0
 private Pressure CreatePressure(IXmlService xmlService, XElement w)
 {
     Pressure pressure = new Pressure()
     {
         Value = xmlService.GetXmlAttributeValue(w, "pressure", "value"),
         Unit = xmlService.GetXmlAttributeText(w, "pressure", "unit")
     };
     if (pressure.Value == 0 &&
         string.IsNullOrEmpty(pressure.Unit))
     {
         return null;
     }
     else
     {
         return pressure;
     }
 }
Example #36
0
 public static Pressure operator /(ForcePerLength forcePerLength, Length length)
 {
     return(Pressure.FromNewtonsPerSquareMeter(forcePerLength.NewtonsPerMeter / length.Meters));
 }
 public static Pressure DynesPerSquareCentimeter <T>(this T value) =>
 Pressure.FromDynesPerSquareCentimeter(Convert.ToDouble(value));
Example #38
0
        internal static void Parse(string fileName, out Train train)
        {
            train = new Train();

            CultureInfo culture = CultureInfo.InvariantCulture;

            string[] lines = File.ReadAllLines(fileName, TextEncoding.GetSystemEncodingFromFile(fileName));

            for (int i = 0; i < lines.Length; i++)
            {
                int j = lines[i].IndexOf(';');

                if (j >= 0)
                {
                    lines[i] = lines[i].Substring(0, j).Trim();
                }
                else
                {
                    lines[i] = lines[i].Trim();
                }
            }

            bool ver1220000 = false;

            foreach (string line in lines)
            {
                if (line.Length != 0)
                {
                    string s = line.ToLowerInvariant();

                    switch (s)
                    {
                    case "bve1200000":
                    case "bve1210000":
                    case "bve1220000":
                        ver1220000 = true;
                        break;

                    case "bve2000000":
                    case "openbve":
                        //No action
                        break;

                    default:
                        if (s.ToLowerInvariant().StartsWith("openbve"))
                        {
                            string tt = s.Substring(7, s.Length - 7);
                            int    v;

                            if (int.TryParse(tt, NumberStyles.Float, culture, out v))
                            {
                                if (v > currentVersion)
                                {
                                    Interface.AddMessage(MessageType.Warning, false, $"The train.dat {fileName} was created with a newer version of openBVE. Please check for an update.");
                                }
                            }
                            else
                            {
                                Interface.AddMessage(MessageType.Error, false, $"The train.dat version {lines[0].ToLowerInvariant()} is invalid in {fileName}");
                            }
                        }

                        break;
                    }

                    break;
                }
            }

            Acceleration acceleration = new Acceleration();
            Performance  performance  = new Performance();
            Delay        delay        = new Delay();
            Move         move         = new Move();
            Brake        brake        = new Brake();
            Pressure     pressure     = new Pressure();
            Motor        motor        = new Motor();

            double motorCarMass          = 40.0;
            int    numberOfMotorCars     = 1;
            double trailerCarMass        = 40.0;
            int    numberOfTrailerCars   = 1;
            double lengthOfACar          = 20.0;
            bool   frontCarIsAMotorCar   = false;
            double widthOfACar           = 2.6;
            double heightOfACar          = 3.2;
            double centerOfGravityHeight = 1.5;
            double exposedFrontalArea    = 5.0;
            double unexposedFrontalArea  = 1.6;

            for (int i = 0; i < lines.Length; i++)
            {
                int n = 0;

                switch (lines[i].ToLowerInvariant())
                {
                case "#acceleration":
                    i++;

                    while (i < lines.Length && !lines[i].StartsWith("#", StringComparison.InvariantCultureIgnoreCase))
                    {
                        if (n == acceleration.Entries.Count)
                        {
                            acceleration.Entries.Add(new Acceleration.Entry());
                        }

                        string u = lines[i] + ",";
                        int    m = 0;

                        while (true)
                        {
                            int j = u.IndexOf(',');

                            if (j == -1)
                            {
                                break;
                            }

                            string s = u.Substring(0, j).Trim();
                            u = u.Substring(j + 1);
                            double a;

                            if (double.TryParse(s, NumberStyles.Float, culture, out a))
                            {
                                switch (m)
                                {
                                case 0:
                                    acceleration.Entries[n].A0 = Math.Max(a, 0.0);
                                    break;

                                case 1:
                                    acceleration.Entries[n].A1 = Math.Max(a, 0.0);
                                    break;

                                case 2:
                                    acceleration.Entries[n].V1 = Math.Max(a, 0.0);
                                    break;

                                case 3:
                                    acceleration.Entries[n].V2 = Math.Max(a, 0.0);

                                    if (acceleration.Entries[n].V2 < acceleration.Entries[n].V1)
                                    {
                                        double x = acceleration.Entries[n].V1;
                                        acceleration.Entries[n].V1 = acceleration.Entries[n].V2;
                                        acceleration.Entries[n].V2 = x;
                                    }

                                    break;

                                case 4:
                                    if (ver1220000)
                                    {
                                        if (a <= 0.0)
                                        {
                                            acceleration.Entries[n].E = 1.0;
                                        }
                                        else
                                        {
                                            const double c = 1.23315173118822;
                                            acceleration.Entries[n].E = 1.0 - Math.Log(a) * acceleration.Entries[n].V2 * c;

                                            if (acceleration.Entries[n].E > 4.0)
                                            {
                                                acceleration.Entries[n].E = 4.0;
                                            }
                                        }
                                    }
                                    else
                                    {
                                        acceleration.Entries[n].E = a;
                                    }

                                    break;
                                }
                            }

                            m++;
                        }

                        i++;
                        n++;
                    }

                    i--;
                    break;

                case "#performance":
                case "#deceleration":
                    i++;

                    while (i < lines.Length && !lines[i].StartsWith("#", StringComparison.InvariantCultureIgnoreCase))
                    {
                        double a;

                        if (double.TryParse(lines[i], NumberStyles.Float, culture, out a))
                        {
                            switch (n)
                            {
                            case 0:
                                if (a >= 0.0)
                                {
                                    performance.Deceleration = a;
                                }

                                break;

                            case 1:
                                if (a >= 0.0)
                                {
                                    performance.CoefficientOfStaticFriction = a;
                                }

                                break;

                            case 3:
                                if (a >= 0.0)
                                {
                                    performance.CoefficientOfRollingResistance = a;
                                }

                                break;

                            case 4:
                                if (a >= 0.0)
                                {
                                    performance.AerodynamicDragCoefficient = a;
                                }

                                break;
                            }
                        }

                        i++;
                        n++;
                    }

                    i--;
                    break;

                case "#delay":
                    i++;

                    double[] delayPowerUp       = delay.DelayPower.Select(x => x.Up).ToArray();
                    double[] delayPowerDown     = delay.DelayPower.Select(x => x.Down).ToArray();
                    double[] delayBrakeUp       = delay.DelayBrake.Select(x => x.Up).ToArray();
                    double[] delayBrakeDown     = delay.DelayBrake.Select(x => x.Down).ToArray();
                    double[] delayLocoBrakeUp   = delay.DelayLocoBrake.Select(x => x.Up).ToArray();
                    double[] delayLocoBrakeDown = delay.DelayLocoBrake.Select(x => x.Down).ToArray();

                    delay.DelayPower.Clear();
                    delay.DelayBrake.Clear();
                    delay.DelayLocoBrake.Clear();

                    while (i < lines.Length && !lines[i].StartsWith("#", StringComparison.InvariantCultureIgnoreCase))
                    {
                        double a;

                        if (double.TryParse(lines[i], NumberStyles.Float, culture, out a))
                        {
                            switch (n)
                            {
                            case 0:
                                if (a >= 0.0)
                                {
                                    delayPowerUp = new[] { a };
                                }

                                break;

                            case 1:
                                if (a >= 0.0)
                                {
                                    delayPowerDown = new[] { a };
                                }

                                break;

                            case 2:
                                if (a >= 0.0)
                                {
                                    delayBrakeUp = new[] { a };
                                }

                                break;

                            case 3:
                                if (a >= 0.0)
                                {
                                    delayBrakeDown = new[] { a };
                                }

                                break;
                            }
                        }
                        else if (lines[i].IndexOf(',') != -1)
                        {
                            switch (n)
                            {
                            case 0:
                                delayPowerUp = lines[i].Split(',').Select(x => double.Parse(x, culture)).ToArray();
                                break;

                            case 1:
                                delayPowerDown = lines[i].Split(',').Select(x => double.Parse(x, culture)).ToArray();
                                break;

                            case 2:
                                delayBrakeUp = lines[i].Split(',').Select(x => double.Parse(x, culture)).ToArray();
                                break;

                            case 3:
                                delayBrakeDown = lines[i].Split(',').Select(x => double.Parse(x, culture)).ToArray();
                                break;

                            case 4:
                                delayLocoBrakeUp = lines[i].Split(',').Select(x => double.Parse(x, culture)).ToArray();
                                break;

                            case 5:
                                delayLocoBrakeDown = lines[i].Split(',').Select(x => double.Parse(x, culture)).ToArray();
                                break;
                            }
                        }

                        i++;
                        n++;
                    }

                    for (int j = 0; j < Math.Max(delayPowerUp.Length, delayPowerDown.Length); j++)
                    {
                        Delay.Entry entry = new Delay.Entry();

                        if (j < delayPowerUp.Length)
                        {
                            entry.Up = delayPowerUp[j];
                        }

                        if (j < delayPowerDown.Length)
                        {
                            entry.Down = delayPowerDown[j];
                        }

                        delay.DelayPower.Add(entry);
                    }

                    for (int j = 0; j < Math.Max(delayBrakeUp.Length, delayBrakeDown.Length); j++)
                    {
                        Delay.Entry entry = new Delay.Entry();

                        if (j < delayBrakeUp.Length)
                        {
                            entry.Up = delayBrakeUp[j];
                        }

                        if (j < delayBrakeDown.Length)
                        {
                            entry.Down = delayBrakeDown[j];
                        }

                        delay.DelayBrake.Add(entry);
                    }

                    for (int j = 0; j < Math.Max(delayLocoBrakeUp.Length, delayLocoBrakeDown.Length); j++)
                    {
                        Delay.Entry entry = new Delay.Entry();

                        if (j < delayLocoBrakeUp.Length)
                        {
                            entry.Up = delayLocoBrakeUp[j];
                        }

                        if (j < delayLocoBrakeDown.Length)
                        {
                            entry.Down = delayLocoBrakeDown[j];
                        }

                        delay.DelayLocoBrake.Add(entry);
                    }

                    i--;
                    break;

                case "#move":
                    i++;

                    while (i < lines.Length && !lines[i].StartsWith("#", StringComparison.InvariantCultureIgnoreCase))
                    {
                        double a;

                        if (double.TryParse(lines[i], NumberStyles.Float, culture, out a))
                        {
                            switch (n)
                            {
                            case 0:
                                if (a >= 0.0)
                                {
                                    move.JerkPowerUp = a;
                                }

                                break;

                            case 1:
                                if (a >= 0.0)
                                {
                                    move.JerkPowerDown = a;
                                }

                                break;

                            case 2:
                                if (a >= 0.0)
                                {
                                    move.JerkBrakeUp = a;
                                }

                                break;

                            case 3:
                                if (a >= 0.0)
                                {
                                    move.JerkBrakeDown = a;
                                }

                                break;

                            case 4:
                                if (a >= 0.0)
                                {
                                    move.BrakeCylinderUp = a;
                                }

                                break;

                            case 5:
                                if (a >= 0.0)
                                {
                                    move.BrakeCylinderDown = a;
                                }

                                break;
                            }
                        }

                        i++;
                        n++;
                    }

                    i--;
                    break;

                case "#brake":
                    i++;

                    while (i < lines.Length && !lines[i].StartsWith("#", StringComparison.InvariantCultureIgnoreCase))
                    {
                        double a;

                        if (double.TryParse(lines[i], NumberStyles.Float, culture, out a))
                        {
                            int b = (int)Math.Round(a);

                            switch (n)
                            {
                            case 0:
                                if (b >= 0 & b <= 2)
                                {
                                    brake.BrakeType = (BrakeSystemType)b;
                                }

                                break;

                            case 1:
                                if (b >= 0 & b <= 2)
                                {
                                    brake.BrakeControlSystem = (EletropneumaticBrakeType)b;
                                }

                                break;

                            case 2:
                                if (a >= 0.0)
                                {
                                    brake.BrakeControlSpeed = a;
                                }

                                break;

                            case 3:
                                if (a <= 0 && a > 3)
                                {
                                    brake.LocoBrakeType = (Brake.LocoBrakeTypes)b;
                                }

                                break;
                            }
                        }

                        i++;
                        n++;
                    }

                    i--;
                    break;

                case "#pressure":
                    i++;

                    while (i < lines.Length && !lines[i].StartsWith("#", StringComparison.InvariantCultureIgnoreCase))
                    {
                        double a;

                        if (double.TryParse(lines[i], NumberStyles.Float, culture, out a))
                        {
                            switch (n)
                            {
                            case 0:
                                if (a > 0.0)
                                {
                                    pressure.BrakeCylinderServiceMaximumPressure = a;
                                }

                                break;

                            case 1:
                                if (a > 0.0)
                                {
                                    pressure.BrakeCylinderEmergencyMaximumPressure = a;
                                }

                                break;

                            case 2:
                                if (a > 0.0)
                                {
                                    pressure.MainReservoirMinimumPressure = a;
                                }

                                break;

                            case 3:
                                if (a > 0.0)
                                {
                                    pressure.MainReservoirMaximumPressure = a;
                                }

                                break;

                            case 4:
                                if (a > 0.0)
                                {
                                    pressure.BrakePipeNormalPressure = a;
                                }

                                break;
                            }
                        }

                        i++;
                        n++;
                    }

                    i--;
                    break;

                case "#handle":
                    i++;

                    while (i < lines.Length && !lines[i].StartsWith("#", StringComparison.InvariantCultureIgnoreCase))
                    {
                        double a;

                        if (double.TryParse(lines[i], NumberStyles.Float, culture, out a))
                        {
                            int b = (int)Math.Round(a);

                            switch (n)
                            {
                            case 0:
                                if (b >= 0 | b <= 3)
                                {
                                    train.Handle.HandleType = (HandleType)b;
                                }

                                break;

                            case 1:
                                if (b > 0)
                                {
                                    train.Handle.PowerNotches = b;
                                }

                                break;

                            case 2:
                                if (b > 0)
                                {
                                    train.Handle.BrakeNotches = b;
                                }

                                break;

                            case 3:
                                if (b >= 0)
                                {
                                    train.Handle.PowerNotchReduceSteps = b;
                                }

                                break;

                            case 4:
                                if (a >= 0 && a < 4)
                                {
                                    train.Handle.HandleBehaviour = (EbHandleBehaviour)b;
                                }

                                break;

                            case 5:
                                if (b > 0)
                                {
                                    train.Handle.LocoBrakeNotches = b;
                                }

                                break;

                            case 6:
                                if (a <= 0 && a > 3)
                                {
                                    train.Handle.LocoBrake = (LocoBrakeType)b;
                                }

                                break;

                            case 7:
                                if (b > 0)
                                {
                                    train.Handle.DriverPowerNotches = b;
                                }

                                break;

                            case 8:
                                if (b > 0)
                                {
                                    train.Handle.DriverBrakeNotches = b;
                                }

                                break;
                            }
                        }

                        i++;
                        n++;
                    }

                    i--;
                    break;

                case "#cockpit":
                case "#cab":
                    i++;

                    while (i < lines.Length && !lines[i].StartsWith("#", StringComparison.InvariantCultureIgnoreCase))
                    {
                        double a;

                        if (double.TryParse(lines[i], NumberStyles.Float, culture, out a))
                        {
                            switch (n)
                            {
                            case 0:
                                train.Cab.PositionX = a;
                                break;

                            case 1:
                                train.Cab.PositionY = a;
                                break;

                            case 2:
                                train.Cab.PositionZ = a;
                                break;

                            case 3:
                                train.Cab.DriverCar = (int)Math.Round(a);
                                break;
                            }
                        }

                        i++;
                        n++;
                    }

                    i--;
                    break;

                case "#car":
                    i++;

                    while (i < lines.Length && !lines[i].StartsWith("#", StringComparison.InvariantCultureIgnoreCase))
                    {
                        double a;

                        if (double.TryParse(lines[i], NumberStyles.Float, culture, out a))
                        {
                            int b = (int)Math.Round(a);

                            switch (n)
                            {
                            case 0:
                                if (a > 0.0)
                                {
                                    motorCarMass = a;
                                }

                                break;

                            case 1:
                                if (b >= 1)
                                {
                                    numberOfMotorCars = b;
                                }

                                break;

                            case 2:
                                if (a > 0.0)
                                {
                                    trailerCarMass = a;
                                }

                                break;

                            case 3:
                                if (b >= 0)
                                {
                                    numberOfTrailerCars = b;
                                }

                                break;

                            case 4:
                                if (b > 0.0)
                                {
                                    lengthOfACar = a;
                                }

                                break;

                            case 5:
                                frontCarIsAMotorCar = a == 1.0;
                                break;

                            case 6:
                                if (a > 0.0)
                                {
                                    widthOfACar = a;
                                }

                                break;

                            case 7:
                                if (a > 0.0)
                                {
                                    heightOfACar = a;
                                }

                                break;

                            case 8:
                                centerOfGravityHeight = a;
                                break;

                            case 9:
                                if (a > 0.0)
                                {
                                    exposedFrontalArea = a;
                                }

                                break;

                            case 10:
                                if (a > 0.0)
                                {
                                    unexposedFrontalArea = a;
                                }

                                break;
                            }
                        }

                        i++;
                        n++;
                    }

                    i--;
                    break;

                case "#device":
                    i++;

                    while (i < lines.Length && !lines[i].StartsWith("#", StringComparison.InvariantCultureIgnoreCase))
                    {
                        double a;

                        if (double.TryParse(lines[i], NumberStyles.Float, culture, out a))
                        {
                            int b = (int)Math.Round(a);

                            switch (n)
                            {
                            case 0:
                                if (b >= -1 & b <= 1)
                                {
                                    train.Device.Ats = (AtsModes)b;
                                }

                                break;

                            case 1:
                                if (b >= 0 & b <= 2)
                                {
                                    train.Device.Atc = (AtcModes)b;
                                }

                                break;

                            case 2:
                                train.Device.Eb = a == 1.0;
                                break;

                            case 3:
                                train.Device.ConstSpeed = a == 1.0;
                                break;

                            case 4:
                                train.Device.HoldBrake = a == 1.0;
                                break;

                            case 5:
                                if (b >= -1 & b <= 3)
                                {
                                    train.Device.ReAdhesionDevice = (ReadhesionDeviceType)b;
                                }

                                break;

                            case 6:
                                train.Device.LoadCompensatingDevice = a;
                                break;

                            case 7:
                                if (b >= 0 & b <= 2)
                                {
                                    train.Device.PassAlarm = (PassAlarmType)b;
                                }

                                break;

                            case 8:
                                if (b >= 0 & b <= 2)
                                {
                                    train.Device.DoorOpenMode = (DoorMode)b;
                                }

                                break;

                            case 9:
                                if (b >= 0 & b <= 2)
                                {
                                    train.Device.DoorCloseMode = (DoorMode)b;
                                }

                                break;

                            case 10:
                                if (a >= 0.0)
                                {
                                    train.Device.DoorWidth = a;
                                }

                                break;

                            case 11:
                                if (a >= 0.0)
                                {
                                    train.Device.DoorMaxTolerance = a;
                                }

                                break;
                            }
                        }

                        i++;
                        n++;
                    }

                    i--;
                    break;

                case "#motor_p1":
                case "#motor_p2":
                case "#motor_b1":
                case "#motor_b2":
                {
                    string section = lines[i].ToLowerInvariant();
                    i++;
                    BVEMotorSoundTableEntry[] entries = new BVEMotorSoundTableEntry[800];

                    while (i < lines.Length && !lines[i].StartsWith("#", StringComparison.InvariantCultureIgnoreCase))
                    {
                        if (n == entries.Length)
                        {
                            Array.Resize(ref entries, entries.Length << 1);
                        }

                        string u = lines[i] + ",";
                        int    k = 0;

                        while (true)
                        {
                            int j = u.IndexOf(',');

                            if (j == -1)
                            {
                                break;
                            }

                            string s = u.Substring(0, j).Trim();
                            u = u.Substring(j + 1);
                            double a;

                            if (double.TryParse(s, NumberStyles.Float, culture, out a))
                            {
                                int b = (int)Math.Round(a);

                                switch (k)
                                {
                                case 0:
                                    entries[n].SoundIndex = b >= 0 ? b : -1;
                                    break;

                                case 1:
                                    entries[n].Pitch = (float)Math.Max(a, 0.0);
                                    break;

                                case 2:
                                    entries[n].Gain = (float)Math.Max(a, 0.0);
                                    break;
                                }
                            }

                            k++;
                        }

                        i++;
                        n++;
                    }

                    Array.Resize(ref entries, n);
                    i--;

                    switch (section)
                    {
                    case "#motor_p1":
                        motor.Tracks[(int)Motor.TrackInfo.Power1] = Motor.Track.EntriesToTrack(entries);
                        break;

                    case "#motor_p2":
                        motor.Tracks[(int)Motor.TrackInfo.Power2] = Motor.Track.EntriesToTrack(entries);
                        break;

                    case "#motor_b1":
                        motor.Tracks[(int)Motor.TrackInfo.Brake1] = Motor.Track.EntriesToTrack(entries);
                        break;

                    case "#motor_b2":
                        motor.Tracks[(int)Motor.TrackInfo.Brake2] = Motor.Track.EntriesToTrack(entries);
                        break;
                    }
                }
                break;
                }
            }

            int numberOfCars = numberOfMotorCars + numberOfTrailerCars;

            bool[] isMotorCars = new bool[numberOfCars];
            if (numberOfMotorCars == 1)
            {
                if (frontCarIsAMotorCar | numberOfTrailerCars == 0)
                {
                    isMotorCars[0] = true;
                }
                else
                {
                    isMotorCars[numberOfCars - 1] = true;
                }
            }
            else if (numberOfMotorCars == 2)
            {
                if (frontCarIsAMotorCar | numberOfTrailerCars == 0)
                {
                    isMotorCars[0] = true;
                    isMotorCars[numberOfCars - 1] = true;
                }
                else if (numberOfTrailerCars == 1)
                {
                    isMotorCars[1] = true;
                    isMotorCars[2] = true;
                }
                else
                {
                    int i = (int)Math.Ceiling(0.25 * (numberOfCars - 1));
                    int j = (int)Math.Floor(0.75 * (numberOfCars - 1));
                    isMotorCars[i] = true;
                    isMotorCars[j] = true;
                }
            }
            else if (numberOfMotorCars > 0)
            {
                if (frontCarIsAMotorCar)
                {
                    isMotorCars[0] = true;
                    double t = 1.0 + numberOfTrailerCars / (double)(numberOfMotorCars - 1);
                    double r = 0.0;
                    double x = 0.0;

                    while (true)
                    {
                        double y = x + t - r;
                        x = Math.Ceiling(y);
                        r = x - y;
                        int i = (int)x;

                        if (i >= numberOfCars)
                        {
                            break;
                        }

                        isMotorCars[i] = true;
                    }
                }
                else
                {
                    isMotorCars[1] = true;
                    double t = 1.0 + (numberOfTrailerCars - 1) / (double)(numberOfMotorCars - 1);
                    double r = 0.0;
                    double x = 1.0;

                    while (true)
                    {
                        double y = x + t - r;
                        x = Math.Ceiling(y);
                        r = x - y;
                        int i = (int)x;

                        if (i >= numberOfCars)
                        {
                            break;
                        }

                        isMotorCars[i] = true;
                    }
                }
            }

            foreach (bool isMotorCar in isMotorCars)
            {
                Car car = isMotorCar ? (Car) new MotorCar() : new TrailerCar();

                car.Mass   = isMotorCar ? motorCarMass : trailerCarMass;
                car.Length = lengthOfACar;
                car.Width  = widthOfACar;
                car.Height = heightOfACar;
                car.CenterOfGravityHeight = centerOfGravityHeight;
                car.ExposedFrontalArea    = exposedFrontalArea;
                car.UnexposedFrontalArea  = unexposedFrontalArea;
                car.Performance           = (Performance)performance.Clone();
                car.Delay    = (Delay)delay.Clone();
                car.Move     = (Move)move.Clone();
                car.Brake    = (Brake)brake.Clone();
                car.Pressure = (Pressure)pressure.Clone();

                if (isMotorCar)
                {
                    ((MotorCar)car).Acceleration = (Acceleration)acceleration.Clone();
                    ((MotorCar)car).Motor        = (Motor)motor.Clone();
                }

                train.Cars.Add(car);
            }

            for (int i = 0; i < numberOfCars - 1; i++)
            {
                train.Couplers.Add(new Models.Trains.Coupler());
            }
        }
Example #39
0
        public void ForceDividedByAreaEqualsPressure()
        {
            Pressure pressure = Force.FromNewtons(90) / Area.FromSquareMeters(9);

            Assert.Equal(pressure, Pressure.FromNewtonsPerSquareMeter(10));
        }
 public void OpLessThan()
 {
     var pressure1 = new Pressure(1000, PressureUnit.Pascals);
     var pressure2 = new Pressure(1, PressureUnit.KiloPascals);
     var pressure3 = new Pressure(2, PressureUnit.KiloPascals);
     (pressure1 < pressure3).ShouldBeTrue();
     (pressure3 < pressure1).ShouldBeFalse();
     (pressure1 < pressure2).ShouldBeFalse();
     (pressure2 < pressure1).ShouldBeFalse();
 }
Example #41
0
        public void PressureByAreaEqualsForceUsingArea()
        {
            Force force = Force.FromPressureByArea(Pressure.FromNewtonsPerSquareMeter(5), Area.FromSquareMeters(7));

            Assert.Equal(force, Force.FromNewtons(35));
        }
Example #42
0
        // Method overloads with same number of argumnets not supported in Universal Windows Platform (WinRT Components)
#if !WINDOWS_UWP
        public static Force FromPressureByArea(Pressure p, Length2d area)
        {
            double metersSquared = area.Meters.X*area.Meters.Y;
            double newtons = p.Pascals*metersSquared;
            return new Force(newtons);
        }
Example #43
0
        public void PressureByAreaEqualsForceUsingLength2D()
        {
            var force = Force.FromPressureByArea(Pressure.FromNewtonsPerSquareMeter(6), Length2d.FromMeters(5, 2));

            Assert.Equal(force, Force.FromNewtons(60));
        }
	public ReactionTableEntry(string[] products, Move move, Temperature temperature, Pressure pressure) {
		this.products = products;
        this.move = move;
        this.temperature = temperature;
        this.pressure = pressure;
	}
Example #45
0
        /// <summary>
        /// Calibrates the sensor to operate at a specific barometric pressure.
        /// </summary>
        /// <param name="pressure">The pressure to use when calibrating the sensor.</param>
        public void SetPressureCalibration(Pressure pressure)
        {
            int delay = SetPressureCalibrationImpl(pressure);

            Thread.Sleep(delay);
        }
Example #46
0
			internal Train () {
				this.Acceleration = new Acceleration();
				this.Performance = new Performance();
				this.Delay = new Delay();
				this.Move = new Move();
				this.Brake = new Brake();
				this.Pressure = new Pressure();
				this.Handle = new Handle();
				this.Cab = new Cab();
				this.Car = new Car();
				this.Device = new Device();
				this.MotorP1 = new Motor();
				this.MotorP2 = new Motor();
				this.MotorB1 = new Motor();
				this.MotorB2 = new Motor();
			}
 protected virtual void OnMaxValueChanged(Pressure? oldValue, Pressure? newValue)
 {
     this.SetScalarValue(ScalarMaxValueProperty, newValue);
 }