UNPKG

meeusjs

Version:

Implementation of the Astronomical Algorithms of Jean Meeus in Javascript

385 lines (260 loc) 16.4 kB
// Copyright (c) 2016 Fabio Soldati, www.peakfinder.org // License MIT: http://www.opensource.org/licenses/MIT QUnit.test( "astro.moon parallax", function( assert ) { assert.close(A.Moon.parallax(359861)*180/Math.PI, 1.01, 0.01); assert.close(A.Moon.parallax(405948)*180/Math.PI, 0.90, 0.01); assert.close(A.Moon.parallax(359861 + (405948-359861)/2)*180/Math.PI, 0.954, 0.01); }); QUnit.test( "astro.moon apparentEquatorial vs apparentTopocentric", function( assert ) { var jd = A.JulianDay.dateToJD(new Date(Date.UTC(2016, 2-1, 21, 0, 0, 0))); var eclCoord = A.EclCoord.fromWgs84(47.3667, 8.5655); var jdo = new A.JulianDay(jd); var ae = A.Moon.apparentEquatorial(jdo); var aet = A.Moon.apparentTopocentric(jdo, eclCoord); // Date__(UT)__HR:MN Date_________JDUT R.A.__(a-apparent)__DEC Azi_(a-appr)_Elev L_Ap_Sid_Time // 2016-Feb-21 00:00 2457439.500000000 08 52 08.11 +14 02 40.2 .n.a. .n.a. // 2016-Feb-21 00:00 2457439.500000000 m 08 50 59.19 +13 30 52.1 221.5661 49.7236 10 35 41.5918 assert.close(ae.eq.ra*180/Math.PI, (A.Coord.calcRA(8, 52, 8.11))*180/Math.PI, 0.01, "exp:" + (A.Coord.calcRA(8, 52, 8.11))*180/Math.PI); assert.close(ae.eq.dec*180/Math.PI, A.Coord.calcAngle(false, 14, 2, 40.2)*180/Math.PI, 0.01, "exp:" + A.Coord.calcAngle(false, 14, 2, 40.2)*180/Math.PI); assert.close(aet.eq.ra*180/Math.PI, (A.Coord.calcRA(8, 50, 59.19))*180/Math.PI, 0.02, "exp:" + (A.Coord.calcRA(8, 50, 59.19))*180/Math.PI); assert.close(aet.eq.dec*180/Math.PI, A.Coord.calcAngle(false, 13, 30, 52.1)*180/Math.PI, 0.01, "exp:" + A.Coord.calcAngle(false, 13, 30, 52.1)*180/Math.PI); }) QUnit.test( "astro.moon geocentricPosition", function( assert ) { // Example 47.a var jde = A.JulianDay.calendarGregorianToJD(1992, 4, 12); var jd = A.DeltaT.jdeToJd(jde); var jdo = new A.JulianDay(jd); assert.close(jde, 2448724.500000, 0.000001); var T = jdo.jdJ2000Century(); assert.close(T, -0.077221, 0.000001); var moon = A.Moon.geocentricPosition(jdo); assert.close(moon.lng * 180/Math.PI, 133.162655, 0.000001); assert.close(moon.lat * 180/Math.PI, -3.229126, 0.000001); assert.close(moon.delta, 368409.7, 0.1); // 50km var nut = A.Nutation.nutation(jdo); assert.close(nut.deltalng*180/Math.PI, 0.004610, 0.000002); var obliquity0 = A.Nutation.meanObliquityLaskar(jdo); var obliquity = obliquity0 + nut.deltaobliquity; // true obliquity var apparentlng = moon.lng + nut.deltalng; // apparent longitude assert.close(apparentlng * 180/Math.PI, 133.167265, 0.000001); assert.close(obliquity*180/Math.PI, 23.440636, 0.000002); // get the moon's apparent right ascension and declination (see page 343) var eq = A.Coord.eclToEq(new A.EclCoord(apparentlng, moon.lat), obliquity); // values from meeus assert.close(eq.ra*180/Math.PI, 134.688470, 0.00001); assert.close(eq.dec*180/Math.PI, 13.768368, 0.00001); //assert.close((A.Coord.calcAngle(false, 0, 0, 10))*180/Math.PI, 134.688470, 0.005); //assert.close((A.Coord.calcRA(8, 56, 6.70))*180/Math.PI, 134.688470, 0.005); //assert.close(A.Coord.calcAngle(false, 13, 5, 53.5)*180/Math.PI, 13.768368, 0.005); // values from ssd.jpl.nasa.gov // Date__(UT)__HR:MN Date_________JDUT R.A.__(a-apparent)__DEC Azi_(a-appr)_Elev L_Ap_Sid_Time // 1992-Apr-12 00:00 2448724.500000000 m 08 56 06.70 +13 05 53.5 268.0399 19.7350 13 56 02.2291 // 1992-Apr-12 00:00 2448724.500000000 08 58 47.33 +13 45 54.5 .n.a. .n.a. assert.close(eq.ra*180/Math.PI, (A.Coord.calcRA(8, 58, 47.33))*180/Math.PI, 0.01); assert.close(eq.dec*180/Math.PI, A.Coord.calcAngle(false, 13, 45, 54.5)*180/Math.PI, 0.01); // values from calsky assert.close(eq.ra*180/Math.PI, (A.Coord.calcRA(8, 58, 47.3))*180/Math.PI, 0.01); assert.close(eq.dec*180/Math.PI, A.Coord.calcAngle(false, 13, 45, 54.3)*180/Math.PI, 0.01); }); QUnit.test( "astro.moon topocentricPosition", function( assert ) { // Date__(UT)__HR:MN Date_________JDUT R.A.__(a-apparent)__DEC Azi_(a-appr)_Elev L_Ap_Sid_Time // 2016-Feb-21 00:00 2457439.500000000 m 08 50 59.19 +13 30 52.1 221.5661 49.7236 10 35 41.5918 // 2016-Feb-21 00:00 2457439.500000000 08 52 08.11 +14 02 40.2 .n.a. .n.a. var jd = A.JulianDay.dateToJD(new Date(Date.UTC(2016, 2-1, 21, 0, 0, 0))); var jdo = new A.JulianDay(jd); assert.close(jd, 2457439.500000000, 0.00001); var moon = A.Moon.geocentricPosition(jdo); var nut = A.Nutation.nutation(jdo); var obliquity0 = A.Nutation.meanObliquityLaskar(jdo); var obliquity = obliquity0 + nut.deltaobliquity; // true obliquity var apparentlng = moon.lng + nut.deltalng; // apparent longitude var eq = A.Coord.eclToEq(new A.EclCoord(apparentlng, moon.lat), obliquity); var ae = A.Moon.apparentEquatorial(jdo); assert.close(eq.ra*180/Math.PI, (A.Coord.calcRA(8, 52, 8.11))*180/Math.PI, 0.01); assert.close(eq.dec*180/Math.PI, A.Coord.calcAngle(false, 14, 2, 40.2)*180/Math.PI, 0.01); assert.close(ae.eq.ra*180/Math.PI, (A.Coord.calcRA(8, 52, 8.11))*180/Math.PI, 0.01); assert.close(ae.eq.dec*180/Math.PI, A.Coord.calcAngle(false, 14, 2, 40.2)*180/Math.PI, 0.01); var eclCoord = A.EclCoord.fromWgs84(47.3667, 8.5655); var tp = A.Moon.topocentricPosition(jdo, eclCoord); assert.close(tp.hz.az*180/Math.PI + 180.0, 221.5661, 0.1); assert.close(tp.hz.alt*180/Math.PI, 49.7236, 0.01); // FIX to better precision }); QUnit.test( "astro.moon topocentricPosition calsky", function( assert ) { var jd = 2457442.1893519; var jdo = new A.JulianDay(jd); var moon = A.Moon.geocentricPosition(jdo); var nut = A.Nutation.nutation(jdo); var obliquity0 = A.Nutation.meanObliquityLaskar(jdo); var obliquity = obliquity0 + nut.deltaobliquity; // true obliquity var apparentlng = moon.lng + nut.deltalng; // apparent longitude var eq = A.Coord.eclToEq(new A.EclCoord(apparentlng, moon.lat), obliquity); assert.close(eq.ra*180/Math.PI, (A.Coord.calcRA(11, 3, 17.5))*180/Math.PI, 0.01); assert.close(eq.dec*180/Math.PI, A.Coord.calcAngle(false, 5, 22, 26.0)*180/Math.PI, 0.01); var eclCoord = A.EclCoord.fromWgs84(47.3667, 8.5655); var tp = A.Moon.topocentricPosition(jdo, eclCoord); assert.close(tp.hz.az*180/Math.PI + 180.0, 66.6786, 0.01); assert.close(tp.hz.alt*180/Math.PI, -14.0370, 0.01); }); QUnit.test( "astro.moon topocentricPosition south west", function( assert ) { // Date__(UT)__HR:MN Date_________JDUT R.A.__(a-apparent)__DEC Azi_(a-appr)_Elev L_Ap_Sid_Time // 2016-Feb-18 02:51 2457436.618750000 *r 06 17 57.08 +19 11 11.8 22.7975 -0.8156 // 2016-Feb-18 04:32 2457436.688888889 *t 06 21 17.50 +19 10 57.8 359.7495 0.8171 // 2016-Feb-18 06:13 2457436.759027778 Cs 06 24 37.73 +19 09 16.7 336.7012 -0.8551 function test(eclCoord, jd, az, alt) { var tp = A.Moon.topocentricPosition(new A.JulianDay(jd), eclCoord); assert.close(tp.hz.az*180/Math.PI + 180.0, az, 0.01); assert.close(tp.hz.alt*180/Math.PI, alt, 0.01); } var eclCoord = A.EclCoord.fromWgs84(-70, -120); test(eclCoord, 2457436.618750000, 22.7975, -0.8156); test(eclCoord, 2457436.688888889, 359.7495, 0.8171); test(eclCoord, 2457436.759027778, 336.7012, -0.8551); }) QUnit.test( "astro.moon topocentricPosition 1900", function( assert ) { // Date__(UT)__HR:MN Date_________JDUT R.A.__(a-apparent)__DEC Azi_(a-appr)_Elev L_Ap_Sid_Time // 1900-Feb-18 06:07 2415068.754861111 r 12 27 28.84 -08 46 18.8 114.1762 -0.7586 // 1900-Feb-18 10:35 2415068.940972222 t 12 34 42.49 -09 36 34.8 178.0022 10.3785 // 1900-Feb-18 15:00 2415069.125000000 Ns 12 41 50.30 -10 22 07.7 240.9092 -0.8362 function test(eclCoord, jd, az, alt) { var tp = A.Moon.topocentricPosition(new A.JulianDay(jd), eclCoord); assert.close(tp.hz.az*180/Math.PI + 180.0, az, 0.01); assert.close(tp.hz.alt*180/Math.PI, alt, 0.01); } var eclCoord = A.EclCoord.fromWgs84(70, -120); test(eclCoord, 2415068.754861111, 114.1762, -0.7586); test(eclCoord, 2415068.940972222, 178.0022, 10.3785); test(eclCoord, 2415069.125000000, 240.9092, -0.8362); }) QUnit.test( "astro.moon topocentricPosition AD1", function( assert ) { // Date__(UT)__HR:MN Date_________JDUT R.A.__(a-apparent)__DEC Azi_(a-appr)_Elev L_Ap_Sid_Time // 0001-Feb-18 00:30 1721471.520833333 Ct 02 06 07.23 +16 24 42.4 181.8930 36.4028 // 0001-Feb-18 11:21 1721471.972916667 s 02 29 59.81 +17 53 09.8 339.8819 -0.8531 // 0001-Feb-18 14:05 1721472.086805556 Ar 02 37 10.58 +18 16 19.6 17.1903 -0.8036 function test(eclCoord, jd, az, alt) { var tp = A.Moon.topocentricPosition(new A.JulianDay(jd), eclCoord); assert.close(tp.hz.az*180/Math.PI + 180.0, az, 0.1); assert.close(tp.hz.alt*180/Math.PI, alt, 0.1); } var eclCoord = A.EclCoord.fromWgs84(70, -120); test(eclCoord, 1721471.520833333, 181.8930, 36.4028); test(eclCoord, 1721471.972916667, 339.8819, -0.8531); test(eclCoord, 1721472.086805556, 17.1903, -0.8036); }) QUnit.test( "astro.moon topocentricPosition BC2000", function( assert ) { // Date__(UT)__HR:MN Date_________JDUT R.A.__(a-apparent)__DEC Azi_(a-appr)_Elev L_Ap_Sid_Time // b2016-Feb-21 03:59 985130.665972222 s 05 06 29.66 +26 59 07.7 313.3734 -0.8815 // b2016-Feb-21 11:37 985130.984027778 *r 05 31 31.76 +27 29 11.7 45.8009 -0.8252 // b2016-Feb-21 20:22 985131.348611111 t 05 52 35.12 +28 20 41.1 180.6815 70.9770 function test(eclCoord, jd, az, alt, ra, dec) { var tp = A.Moon.topocentricPosition(new A.JulianDay(jd), eclCoord); assert.close(tp.hz.az*180/Math.PI + 180.0, az, 0.3); assert.close(tp.hz.alt*180/Math.PI, alt, 0.1); var aet = A.Moon.apparentTopocentric(new A.JulianDay(jd), eclCoord); assert.close(aet.eq.ra*180/Math.PI, ra*180/Math.PI, 0.1, "exp ra: " + ra*180/Math.PI); // here seems to be still an error assert.close(aet.eq.dec*180/Math.PI, dec*180/Math.PI, 0.1, "exp dec: " + dec*180/Math.PI); } var eclCoord = A.EclCoord.fromWgs84(47.3667, 8.5655); test(eclCoord, 985130.665972222, 313.3734, -0.8815, A.Coord.calcRA(5, 6, 29.66), A.Coord.calcAngle(false, 26, 59, 7.7)); test(eclCoord, 985130.984027778, 45.8009, -0.8252, A.Coord.calcRA(5, 31, 31.76), A.Coord.calcAngle(false, 27, 29, 11.7)); test(eclCoord, 985131.348611111, 180.6815, 70.9770, A.Coord.calcRA(5, 52, 35.12), A.Coord.calcAngle(false, 28, 20, 41.1)); }) QUnit.test( "astro.moon topocentricPosition BC2016 calsky", function( assert ) { function test(latng, jd, az, alt) { var tp = A.Moon.topocentricPosition(new A.JulianDay(jd), eclCoord); assert.close(tp.hz.az*180/Math.PI + 180.0, az, 0.1); assert.close(tp.hz.alt*180/Math.PI, alt, 0.5); } var eclCoord = A.EclCoord.fromWgs84(47.3667, 8.5655); test(eclCoord, 985130.6668394, 313.57, -0.6); }) QUnit.test( "astro.moon topocentricPosition bulk", function( assert ) { // Date__(UT)__HR:MN Date_________JDUT R.A.__(a-apparent)__DEC Azi_(a-appr)_Elev L_Ap_Sid_Time // 2016-Feb-21 00:00 2457439.500000000 m 08 50 59.19 +13 30 52.1 221.5661 49.7236 10 35 41.5918 function test(eclCoord, jd, az, alt) { var tp = A.Moon.topocentricPosition(new A.JulianDay(jd), eclCoord); assert.close(tp.hz.az*180/Math.PI + 180.0, az, 0.02); assert.close(tp.hz.alt*180/Math.PI, alt, 0.02); } var eclCoord = A.EclCoord.fromWgs84(47.3667, 8.5655); test(eclCoord, 2457439.500000000, 221.5661, 49.7236); test(eclCoord, 2457439.541666667, 238.8223, 41.9835); test(eclCoord, 2457439.583333333, 252.6139, 32.8569); test(eclCoord, 2457439.625000000, 264.3107, 23.0851); test(eclCoord, 2457439.666666667, 274.9525, 13.1410); test(eclCoord, 2457439.708333333, 285.2977, 3.3736); test(eclCoord, 2457439.750000000, 295.9473, -5.8983); test(eclCoord, 2457439.791666667, 307.4194, -14.3254); test(eclCoord, 2457439.833333333, 320.1480, -21.4861); test(eclCoord, 2457439.875000000, 334.3771, -26.8790); test(eclCoord, 2457439.916666667, 349.9573, -29.9861); test(eclCoord, 2457439.958333333, 6.2066, -30.4311); test(eclCoord, 2457440.000000000, 22.1167, -28.1569); test(eclCoord, 2457440.041666667, 36.8608, -23.4580); test(eclCoord, 2457440.083333333, 50.1279, -16.8325); test(eclCoord, 2457440.125000000, 62.0673, -8.8040); test(eclCoord, 2457440.166666667, 73.0784, 0.1718); test(eclCoord, 2457440.208333333, 83.6692, 9.7147); test(eclCoord, 2457440.250000000, 94.4241, 19.4849); test(eclCoord, 2457440.291666667, 106.0514, 29.1238); test(eclCoord, 2457440.333333333, 119.4713, 38.1708); test(eclCoord, 2457440.375000000, 135.8404, 45.9416); test(eclCoord, 2457440.416666667, 156.1265, 51.4133); test(eclCoord, 2457440.458333333, 179.6605, 53.3880); test(eclCoord, 2457440.500000000, 203.1360, 51.2726); }); QUnit.test( "astro.moon parallactic angle", function( assert ) { var eclCoord = A.EclCoord.fromWgs84(47.3667, 8.5655); var jd = 2457439.5; // A.JulianDay.dateToJD(new Date(Date.UTC(2016, 2-1, 21, 0, 0, 0))); var hz = A.Moon.topocentricPosition(new A.JulianDay(jd), eclCoord); assert.close(hz.q*180/Math.PI, 27.5, 0.1); }); QUnit.test( "astro.moon approxTimes", function( assert ) { function test(jd, eclCoord, rise, transit, set, prec) { var at = A.Moon.approxTimes(new A.JulianDay(jd), eclCoord); assert.close(at.rise, rise, prec, at.transitd + " " + A.Coord.secondsToHMSStr(at.rise) + "- exp:" + A.Coord.secondsToHMSStr(rise)); assert.close(at.transit, transit, prec, at.rised + " " + A.Coord.secondsToHMSStr(at.transit) + "- exp:" + A.Coord.secondsToHMSStr(transit)); assert.close(at.set, set, prec, at.setd + " " + A.Coord.secondsToHMSStr(at.set) + "- exp:" + A.Coord.secondsToHMSStr(set)); } // 2016-Feb-21 05:27 2457439.727083333 Ns 09 01 12.25 +12 44 28.8 290.0207 -0.8804 // 2016-Feb-21 15:54 2457440.162500000 *r 09 28 06.06 +11 30 28.0 72.0060 -0.7564 // 2016-Feb-21 22:59 2457440.457638889 t 09 40 16.35 +10 45 26.1 179.2590 53.3886 var timezone = 1; test(A.JulianDay.calendarGregorianToJD(2016, 2, 21), A.EclCoord.fromWgs84(47.3667, 8.5655), A.JulianDay.secondsFromHMS(15, 54, 0), A.JulianDay.secondsFromHMS(22, 59, 0), A.JulianDay.secondsFromHMS(5, 27, 0), 2700); // not very precise }); QUnit.test( "astro.moon times", function( assert ) { function test(jd, eclCoord, rise, transit, set, prec) { var at = A.Moon.times(new A.JulianDay(jd), eclCoord); assert.close(at.rise, rise, prec, at.transitd + " " + A.Coord.secondsToHMSStr(at.rise) + "- exp:" + A.Coord.secondsToHMSStr(rise)); assert.close(at.transit, transit, prec, at.rised + " " + A.Coord.secondsToHMSStr(at.transit) + "- exp:" + A.Coord.secondsToHMSStr(transit)); assert.close(at.set, set, prec, at.setd + " " + A.Coord.secondsToHMSStr(at.set) + "- exp:" + A.Coord.secondsToHMSStr(set)); } // 2016-Feb-21 05:27 2457439.727083333 Ns 09 01 12.25 +12 44 28.8 290.0207 -0.8804 // 2016-Feb-21 15:54 2457440.162500000 *r 09 28 06.06 +11 30 28.0 72.0060 -0.7564 // 2016-Feb-21 22:59 2457440.457638889 t 09 40 16.35 +10 45 26.1 179.2590 53.3886 var timezone = 1; test(A.JulianDay.calendarGregorianToJD(2016, 2, 21), A.EclCoord.fromWgs84(47.3667, 8.5655), A.JulianDay.secondsFromHMS(15, 54, 0), A.JulianDay.secondsFromHMS(22, 59, 0), A.JulianDay.secondsFromHMS(5, 27, 0), 5*60); // the last number 5:22 -> 5:27 is not very precise }); QUnit.test( "astro.moon times bc2000", function( assert ) { function test(jd, eclCoord, rise, transit, set, prec) { var at = A.Moon.times(new A.JulianDay(jd), eclCoord); assert.close(at.rise, rise, prec, at.transitd + " " + A.Coord.secondsToHMSStr(at.rise) + "- exp:" + A.Coord.secondsToHMSStr(rise)); assert.close(at.transit, transit, prec, at.rised + " " + A.Coord.secondsToHMSStr(at.transit) + "- exp:" + A.Coord.secondsToHMSStr(transit)); assert.close(at.set, set, prec, at.setd + " " + A.Coord.secondsToHMSStr(at.set) + "- exp:" + A.Coord.secondsToHMSStr(set)); } // b2016-Feb-21 03:59 985130.665972222 s 05 06 29.66 +26 59 07.7 313.3734 -0.8815 // b2016-Feb-21 11:37 985130.984027778 *r 05 31 31.76 +27 29 11.7 45.8009 -0.8252 // b2016-Feb-21 20:22 985131.348611111 t 05 52 35.12 +28 20 41.1 180.6815 70.9770 test(985130.5, A.EclCoord.fromWgs84(47.3667, 8.5655), A.JulianDay.secondsFromHMS(11, 37, 0), A.JulianDay.secondsFromHMS(20, 22, 0), A.JulianDay.secondsFromHMS(3, 59, 0), 60*60); });