defineSuite([ 'Core/EarthOrientationParameters', 'Core/defined', 'Core/JulianDate', 'Core/TimeStandard' ], function( EarthOrientationParameters, defined, JulianDate, TimeStandard) { 'use strict'; var officialLeapSeconds; beforeAll(function() { officialLeapSeconds = JulianDate.leapSeconds.slice(0); }); afterEach(function() { JulianDate.leapSeconds = officialLeapSeconds.slice(0); }); it('adds leap seconds found in the data by default', function() { var eop = new EarthOrientationParameters({ data : { 'columnNames' : ['dateIso8601', 'modifiedJulianDateUtc', 'xPoleWanderRadians', 'yPoleWanderRadians', 'xCelestialPoleOffsetRadians', 'yCelestialPoleOffsetRadians', 'ut1MinusUtcSeconds', 'taiMinusUtcSeconds', 'lengthOfDayCorrectionSeconds'], 'samples' : ['2011-08-25T00:00:00Z', 55798.0, 2.117957047295119e-7, 2.111518721609984e-6, 3.393695767766752e-11, 3.3452143996557983e-10, -0.2908948, 34.0, -2.956e-4, '2011-08-26T00:00:00Z', 55799.0, 2.193297093339541e-7, 2.115460256837405e-6, -8.241832578862112e-11, 5.623838700870617e-10, -0.29065, 34.5, -1.824e-4, '2011-08-27T00:00:00Z', 55800.0, 2.262286080161428e-7, 2.1191157519929706e-6, -3.490658503988659e-10, 6.981317007977318e-10, -0.2905572, 34.5, 1.9e-6, '2011-08-28T00:00:00Z', 55801.0, 2.3411652660779493e-7, 2.122751854601292e-6, -6.205615118202061e-10, 7.853981633974483e-10, -0.2907007, 34.5, 2.695e-4] } }); expect(eop).not.toBeNull(); var leapSeconds = JulianDate.leapSeconds; expect(leapSeconds.length).toBe(officialLeapSeconds.length + 1); var newDate = new JulianDate(2455799.5, 34.5, TimeStandard.TAI); var foundNew = false; var previousDate; for (var i = 0, len = leapSeconds.length; i < len; ++i) { var leapSecond = leapSeconds[i]; if (leapSecond.julianDate.equals(newDate)) { foundNew = true; } if (defined(previousDate)) { expect(JulianDate.compare(previousDate, leapSecond.julianDate)).toBeLessThan(0); } previousDate = leapSecond.julianDate; } expect(foundNew).toBe(true); }); it('does not add leap seconds if told not to do so', function() { var eop = new EarthOrientationParameters({ addNewLeapSeconds : false, data : { 'columnNames' : ['dateIso8601', 'modifiedJulianDateUtc', 'xPoleWanderRadians', 'yPoleWanderRadians', 'xCelestialPoleOffsetRadians', 'yCelestialPoleOffsetRadians', 'ut1MinusUtcSeconds', 'taiMinusUtcSeconds', 'lengthOfDayCorrectionSeconds'], 'samples' : ['2011-08-25T00:00:00Z', 55798.0, 2.117957047295119e-7, 2.111518721609984e-6, 3.393695767766752e-11, 3.3452143996557983e-10, -0.2908948, 35.0, -2.956e-4, '2011-08-26T00:00:00Z', 55799.0, 2.193297093339541e-7, 2.115460256837405e-6, -8.241832578862112e-11, 5.623838700870617e-10, -0.29065, 36.0, -1.824e-4, '2011-08-27T00:00:00Z', 55800.0, 2.262286080161428e-7, 2.1191157519929706e-6, -3.490658503988659e-10, 6.981317007977318e-10, -0.2905572, 36.0, 1.9e-6, '2011-08-28T00:00:00Z', 55801.0, 2.3411652660779493e-7, 2.122751854601292e-6, -6.205615118202061e-10, 7.853981633974483e-10, -0.2907007, 36.0, 2.695e-4] } }); expect(eop).not.toBeNull(); var leapSeconds = JulianDate.leapSeconds; expect(leapSeconds.length).toBe(officialLeapSeconds.length); }); describe('loading eop', function() { function linearInterp(dx, y1, y2) { return y1 + dx * (y2 - y1); } it('interpolates data correctly under normal circumstances', function() { var eopDescription = { url : undefined, data : { 'columnNames' : ['dateIso8601', 'modifiedJulianDateUtc', 'xPoleWanderRadians', 'yPoleWanderRadians', 'xCelestialPoleOffsetRadians', 'yCelestialPoleOffsetRadians', 'ut1MinusUtcSeconds', 'taiMinusUtcSeconds', 'lengthOfDayCorrectionSeconds'], 'samples' : ['2011-07-01T00:00:00Z', 55743.0, 2.117957047295119e-7, 2.111518721609984e-6, 3.393695767766752e-11, 3.3452143996557983e-10, -0.2908948, 34.0, -2.956e-4, '2011-07-02T00:00:00Z', 55744.0, 2.193297093339541e-7, 2.115460256837405e-6, -8.241832578862112e-11, 5.623838700870617e-10, -0.29065, 34.0, -1.824e-4, '2011-07-03T00:00:00Z', 55745.0, 2.262286080161428e-7, 2.1191157519929706e-6, -3.490658503988659e-10, 6.981317007977318e-10, -0.2905572, 34.0, 1.9e-6, '2011-07-04T00:00:00Z', 55746.0, 2.3411652660779493e-7, 2.122751854601292e-6, -6.205615118202061e-10, 7.853981633974483e-10, -0.2907007, 34.0, 2.695e-4] } }; var eop = new EarthOrientationParameters(eopDescription); var date = JulianDate.fromIso8601('2011-07-02T12:34:56Z'); var result = eop.compute(date); var nColumns = eopDescription.data.columnNames.length; var x0 = eopDescription.data.samples[1 * nColumns + 2]; var x1 = eopDescription.data.samples[2 * nColumns + 2]; var dt = JulianDate.secondsDifference(date, JulianDate.fromIso8601(eopDescription.data.samples[nColumns])) / 86400.0; var expected = linearInterp(dt, x0, x1); expect(result.xPoleWander).toEqualEpsilon(expected, 1e-22); x0 = eopDescription.data.samples[1 * nColumns + 3]; x1 = eopDescription.data.samples[2 * nColumns + 3]; expected = linearInterp(dt, x0, x1); expect(result.yPoleWander).toEqualEpsilon(expected, 1e-22); x0 = eopDescription.data.samples[1 * nColumns + 4]; x1 = eopDescription.data.samples[2 * nColumns + 4]; expected = linearInterp(dt, x0, x1); expect(result.xPoleOffset).toEqualEpsilon(expected, 1e-22); x0 = eopDescription.data.samples[1 * nColumns + 5]; x1 = eopDescription.data.samples[2 * nColumns + 5]; expected = linearInterp(dt, x0, x1); expect(result.yPoleOffset).toEqualEpsilon(expected, 1.0e-22); x0 = eopDescription.data.samples[1*nColumns + 6]; x1 = eopDescription.data.samples[2*nColumns + 6]; expected = linearInterp(dt, x0, x1); expect(result.ut1MinusUtc).toEqualEpsilon(expected, 1.0e-15); }); it('interpolates UT1 correctly over a leap second', function() { var eopDescription = { url : undefined, data : { 'columnNames':['dateIso8601', 'modifiedJulianDateUtc', 'xPoleWanderRadians', 'yPoleWanderRadians', 'xCelestialPoleOffsetRadians', 'yCelestialPoleOffsetRadians', 'ut1MinusUtcSeconds', 'taiMinusUtcSeconds', 'lengthOfDayCorrectionSeconds'], 'samples':[ '2008-12-30T00:00:00Z',54830.0,-4.6702101901281595e-8,6.989752766028624e-7,-7.80550026586353e-10,-1.052045688007693e-9,-0.5911461,33.0,5.7e-4, '2008-12-31T00:00:00Z',54831.0,-6.507169227852191e-8,7.02873178598983e-7,-7.80550026586353e-10,-1.8907733563271904e-9,-0.59187,33.0,8.303e-4, '2009-01-01T00:00:00Z',54832.0,-8.25443773457096e-8,7.089575902969077e-7,-8.047907106418297e-10,-2.0604581447155277e-9,0.4071533,34.0,0.0010604, '2009-01-02T00:00:00Z',54833.0,-9.884381330461219e-8,7.147559619229779e-7,-8.435758051305926e-10,-1.8228994409718553e-9,0.4059739,34.0,0.0012279, '2009-01-03T00:00:00Z',54834.0,-1.1269009203710055e-7,7.226826656091187e-7,-9.066015836748322e-10,-1.5029224114395617e-9,0.404674,34.0,0.0013014 ] } }; var eop = new EarthOrientationParameters(eopDescription); var dateAtLeapSecond = JulianDate.fromIso8601('2009-01-01T00:00:00Z'); var dateSlightlyBefore = JulianDate.addSeconds(dateAtLeapSecond, -1.0, new JulianDate()); var dateSlightlyAfter = JulianDate.addSeconds(dateAtLeapSecond, 1.0, new JulianDate()); var nColumns = eopDescription.data.columnNames.length; var x0 = eopDescription.data.samples[1*nColumns + 6]; var x1 = eopDescription.data.samples[2*nColumns + 6]; var x2 = eopDescription.data.samples[3*nColumns + 6]; var t0 = JulianDate.fromIso8601(eopDescription.data.samples[nColumns]); var t1 = JulianDate.fromIso8601(eopDescription.data.samples[2*nColumns]); var dt = JulianDate.secondsDifference(dateSlightlyBefore, t0) / (86400.0 + 1); // Adjust for leap second when interpolating var expectedBefore = linearInterp(dt, x0, (x1 - 1)); var resultBefore = eop.compute(dateSlightlyBefore); expect(resultBefore.ut1MinusUtc).toEqualEpsilon(expectedBefore, 1.0e-15); var expectedAt = eopDescription.data.samples[2*nColumns + 6]; var resultAt = eop.compute(dateAtLeapSecond); expect(resultAt.ut1MinusUtc).toEqualEpsilon(expectedAt, 1.0e-15); dt = JulianDate.secondsDifference(dateSlightlyAfter, t1) / (86400.0); var expectedAfter = linearInterp(dt, x1, x2); var resultAfter = eop.compute(dateSlightlyAfter); expect(resultAfter.ut1MinusUtc).toEqualEpsilon(expectedAfter, 1.0e-15); // Check to make sure the values are (correctly) discontinuous expect(Math.abs(resultBefore.ut1MinusUtc - resultAfter.ut1MinusUtc) > 0.5).toEqual(true); }); }); });