コード例 #1
0
        public void SunStudyMurmanskAlwaysNightTimeDuringWinter2020()
        {
            double         latitude  = 68.971557;
            double         longitude = 33.070630;
            DateTimeOffset alertWinterDateDayAtNoon = new DateTimeOffset(2020, 1, 2, 12, 0, 0, new TimeSpan(-5, 0, 0));
            float          testAlwaysNightRatio     = SunStudy.CalculateSolarDimming(alertWinterDateDayAtNoon, latitude, longitude, 16 /* fake altitude */);

            Debug.Assert(testAlwaysNightRatio == 0);
        }
コード例 #2
0
        public void SunStudyAntarticaDavisAlwaysNightTimeDuringWinter2019()
        {
            double         latitude  = -68.682687;
            double         longitude = 79.295626;
            DateTimeOffset davisWinterDateNightAtNoon = new DateTimeOffset(2019, 06, 21, 12, 0, 0, new TimeSpan(-4, 0, 0));
            float          testAlwayNightRatio        = SunStudy.CalculateSolarDimming(davisWinterDateNightAtNoon, latitude, longitude, 1 /* fake altitude */);

            Debug.Assert(testAlwayNightRatio == 0);
        }
コード例 #3
0
        public void SunStudyAlertAlwaysNightTimeDuringWinter2020()
        {
            double         latitude  = 82.496299;
            double         longitude = -62.359018;
            DateTimeOffset alertWinterDateDayAtNoon = new DateTimeOffset(2020, 1, 2, 12, 0, 0, new TimeSpan(-5, 0, 0));
            float          testAlwaysNightRatio     = SunStudy.CalculateSolarDimming(alertWinterDateDayAtNoon, latitude, longitude, 16 /* fake altitude */);

            Debug.Assert(testAlwaysNightRatio == 0);
        }
コード例 #4
0
        public void SunStudyAlertAlwaysNightTimeDuringWinter2019()
        {
            double latitude  = 82.496299;
            double longitude = -62.359018;

            var   alertWinterDateDayAtNoon = new DateTimeOffset(2019, 12, 3, 0, 01, 0, new TimeSpan(-5, 0, 0));
            float testAlwaysNightRatio     = SunStudy.CalculateSolarDimming(alertWinterDateDayAtNoon, latitude, longitude, 16); // using a fake altitude

            Debug.Assert(testAlwaysNightRatio == 0);
        }
コード例 #5
0
 public static void SetSunStudyData(SunStudy sunStudy, SunStudyData sunStudyData)
 {
     sunStudy.MinuteOfDay    = sunStudyData.timeOfDay;
     sunStudy.DayOfYear      = sunStudyData.timeOfYear;
     sunStudy.UtcOffset      = sunStudyData.utcOffset / 100f;
     sunStudy.CoordLatitude  = sunStudyData.latitude;
     sunStudy.CoordLongitude = sunStudyData.longitude;
     sunStudy.NorthAngle     = sunStudyData.northAngle;
     sunStudy.Azimuth        = sunStudyData.azimuth;
     sunStudy.Altitude       = sunStudyData.altitude;
     sunStudy.PlacementMode  = sunStudyData.isStaticMode ? SunPlacementMode.Static: SunPlacementMode.Geographical;
 }
コード例 #6
0
        public void SunStudyAntarticaDavisAlwaysDayTimeDuringSummer2020()
        {
            double         latitude             = -68.682687;
            double         longitude            = 79.295626;
            DateTimeOffset davisSummerDateAt2AM = new DateTimeOffset(2020, 01, 11, 2, 0, 0, new TimeSpan(13, 0, 0));
            float          testAlwaysDay        = SunStudy.CalculateSolarDimming(davisSummerDateAt2AM, latitude, longitude, 1 /* fake altitude */);

            Debug.Assert(testAlwaysDay == 1);

            DateTimeOffset davisSummerDateAt10PM = new DateTimeOffset(2020, 01, 11, 22, 0, 0, new TimeSpan(13, 0, 0));

            testAlwaysDay = SunStudy.CalculateSolarDimming(davisSummerDateAt10PM, latitude, longitude, 1 /* fake altitude */);
            Debug.Assert(testAlwaysDay == 1);
        }
コード例 #7
0
        public void SunStudyMurmanskAlwaysDayTimeDuringSummer2019()
        {
            double         latitude  = 68.971557;
            double         longitude = 33.070630;
            DateTimeOffset alertSummerDateDayAt2AM = new DateTimeOffset(2019, 06, 21, 2, 0, 0, new TimeSpan(-4, 0, 0));
            float          testAlwaysDay           = SunStudy.CalculateSolarDimming(alertSummerDateDayAt2AM, latitude, longitude, 16 /* fake altitude */);

            Debug.Assert(testAlwaysDay == 1);

            DateTimeOffset alertSummerDateDayAt10PM = new DateTimeOffset(2019, 06, 21, 22, 0, 0, new TimeSpan(-4, 0, 0));

            testAlwaysDay = SunStudy.CalculateSolarDimming(alertSummerDateDayAt10PM, latitude, longitude, 16 /* fake altitude */);
            Debug.Assert(testAlwaysDay == 1);
        }
コード例 #8
0
        public void SunStudyAlertAlwaysDayTimeDuringSummer2019()
        {
            double         latitude  = 82.496299;
            double         longitude = -62.359018;
            DateTimeOffset alertSummerDateDayAt2AM = new DateTimeOffset(2019, 06, 21, 2, 0, 0, new TimeSpan(-4, 0, 0));
            float          testAlwaysDay           = SunStudy.CalculateSolarDimming(alertSummerDateDayAt2AM, latitude, longitude, 16 /* fake altitude */);

            Debug.Assert(testAlwaysDay == 1);

            DateTimeOffset alertSummerDateDayAt10PM = new DateTimeOffset(2019, 06, 21, 22, 0, 0, new TimeSpan(-4, 0, 0));

            testAlwaysDay = SunStudy.CalculateSolarDimming(alertSummerDateDayAt10PM, latitude, longitude, 16 /* fake altitude */);
            Debug.Assert(testAlwaysDay == 1);
        }
コード例 #9
0
        public void SunStudyAntarticaDavisAlwaysDayTimeDuringSummer2019()
        {
            double latitude  = -68.682687;
            double longitude = 79.295626;

            var   davisSummerDateAt2AM = new DateTimeOffset(2019, 12, 15, 2, 0, 0, new TimeSpan(13, 0, 0));
            float testAlwaysDay        = SunStudy.CalculateSolarDimming(davisSummerDateAt2AM, latitude, longitude, 1); // using a fake altitude

            Debug.Assert(testAlwaysDay == 1);

            var davisSummerDateAt10PM = new DateTimeOffset(2019, 12, 27, 22, 0, 0, new TimeSpan(13, 0, 0));

            testAlwaysDay = SunStudy.CalculateSolarDimming(davisSummerDateAt10PM, latitude, longitude, 1); // using a fake altitude
            Debug.Assert(testAlwaysDay == 1);
        }
コード例 #10
0
        protected void ExecuteSolarCycleTest(float errorThresholdMinutes, string testJsonFileName)
        {
            SunStudyTestJson.RootTest testData = LoadTestData(testJsonFileName);

            var geoCoordinates  = Tuple.Create <float, float>(testData.latitude, testData.longitude);
            int utcOffsetHour   = (int)testData.utcOffset;
            int utcOffsetMinute = (int)((testData.utcOffset - utcOffsetHour) * 60f);
            var offset          = new TimeSpan(utcOffsetHour, utcOffsetMinute, 0);

            foreach (var value in testData.values)
            {
                if (value.timeH != 0)
                {
                    // For solar tests, we can test only one hour entry per day since we are testing sunrise and sunset times.
                    continue;
                }

                double sunriseCheck        = value.localSunriseHourFraction;
                int    sunriseCheckHour    = (int)sunriseCheck;
                double sunriseCheckMinutes = sunriseCheckHour * 60.0 + (sunriseCheck - sunriseCheckHour);

                double sunsetCheck        = value.localSunsetHourFraction;
                int    sunsetCheckHour    = (int)sunsetCheck;
                double sunsetCheckMinutes = sunsetCheckHour * 60.0 + (sunsetCheck - sunsetCheckHour);

                var solarCheckDate = new DateTimeOffset(value.dateY, value.dateM, value.dateD, 0, 0, 0, offset);
                (double julianSunrise, double julianSunset, double transit) = SunStudy.GetJulianDatesForSunriseAndSunset(solarCheckDate, geoCoordinates.Item1, geoCoordinates.Item2);

                DateTimeOffset sunriseDateTime = SunStudy.MakeDateTimeOffsetWithJulianDateTimeFraction(julianSunrise, solarCheckDate);
                DateTimeOffset sunsetDateTime  = SunStudy.MakeDateTimeOffsetWithJulianDateTimeFraction(julianSunset, solarCheckDate);

                double sunriseTestMinutes = sunriseDateTime.Hour * 60.0 + sunriseDateTime.Minute;
                double sunsetTestMinutes  = sunsetDateTime.Hour * 60.0 + sunsetDateTime.Minute;

                Assert.AreEqual(sunriseCheckMinutes, sunriseTestMinutes, errorThresholdMinutes, $"Sunrise time not equal with {errorThresholdMinutes} minutes accuracy: JD Sunrise = {julianSunrise}, SPA Check JD value = {sunriseCheck}");
                Assert.AreEqual(sunsetCheckMinutes, sunsetTestMinutes, errorThresholdMinutes, $"Sunset time not equal with {errorThresholdMinutes} minutes accuracy: JD Sunrise = {julianSunrise}, SPA Check JD value = {sunsetCheck}");
            }
        }
コード例 #11
0
        private void GeoPositionExecuteTests(
            Tuple <float, float> geoCoordinates,                    // latitude, longitude
            List <DateTimeOffset> dateTimeInputList,
            List <Tuple <float, float> > expectedOutputsList,       // azimuth, elevation (uncorrected)
            float ERROR_RATE,
            bool testAzimuth)
        {
            Assert.IsTrue(dateTimeInputList.Count == expectedOutputsList.Count);
            for (int testCaseIndex = 0; testCaseIndex < dateTimeInputList.Count; ++testCaseIndex)
            {
                DateTimeOffset dt             = dateTimeInputList[testCaseIndex];
                var            expectedResult = expectedOutputsList[testCaseIndex];
                (float resultAzimuth, float resultAltitude) = SunStudy.CalculateSunPosition(dt, geoCoordinates.Item1, geoCoordinates.Item2);

                if (testAzimuth)
                {
                    Assert.AreEqual(expectedResult.Item1, resultAzimuth, ERROR_RATE, $"Azimuth not equal with {ERROR_RATE} acc.: TestH: {dt.Hour}");
                }
                else
                {
                    Assert.AreEqual(expectedResult.Item2, resultAltitude, ERROR_RATE, $"Elevation not equal with {ERROR_RATE} acc.: TestH: {dt.Hour}");
                }
            }
        }
コード例 #12
0
        void ExecuteTest(float errorThreshold, string testJsonFileName, bool testAzimuth)
        {
            SunStudyTestJson.RootTest testData = LoadTestData(testJsonFileName);

            var geoCoordinates  = Tuple.Create <float, float>(testData.latitude, testData.longitude);
            int utcOffsetHour   = (int)testData.utcOffset;
            int utcOffsetMinute = (int)((testData.utcOffset - utcOffsetHour) * 60f);
            var offset          = new TimeSpan(utcOffsetHour, utcOffsetMinute, 0);

            var dateTimeInputs  = new List <DateTimeOffset>();
            var expectedOutputs = new List <Tuple <float, float> >();

            foreach (var test in testData.values)
            {
                dateTimeInputs.Add(new DateTimeOffset(test.dateY, test.dateM, test.dateD, test.timeH, test.timeM, test.timeS, offset));
                expectedOutputs.Add(Tuple.Create <float, float>(test.azimuth, test.elevation));
            }

            Assert.IsTrue(dateTimeInputs.Count == expectedOutputs.Count);

            for (int testCaseIndex = 0; testCaseIndex < dateTimeInputs.Count; ++testCaseIndex)
            {
                DateTimeOffset dateTime       = dateTimeInputs[testCaseIndex];
                var            expectedResult = expectedOutputs[testCaseIndex];
                (float resultAzimuth, float resultAltitude) = SunStudy.CalculateSunPosition(dateTime, geoCoordinates.Item1, geoCoordinates.Item2);

                if (testAzimuth)
                {
                    Assert.AreEqual(expectedResult.Item1, resultAzimuth, errorThreshold, $"Azimuth not equal with {errorThreshold} accuracy at Hour {dateTime.Hour}.");
                }
                else
                {
                    Assert.AreEqual(expectedResult.Item2, resultAltitude, errorThreshold, $"Elevation not equal with {errorThreshold} accuracy at Hour {dateTime.Hour}.");
                }
            }
        }