From ab0888b569e059046eed279c8cf2b4970019cf16 Mon Sep 17 00:00:00 2001 From: Andrew Cantino Date: Tue, 29 Oct 2019 12:01:41 -0700 Subject: [PATCH 1/4] Update to satellite.js 3.0.1 --- jspredict.js | 2 +- package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/jspredict.js b/jspredict.js index 59edfe2..2ff2bca 100644 --- a/jspredict.js +++ b/jspredict.js @@ -69,7 +69,7 @@ // Npm if (typeof require !== 'undefined') { - var satellite = require('satellite.js').satellite; + var satellite = require('satellite.js'); m_moment = require('moment'); } // Meteor diff --git a/package.json b/package.json index 2d46365..5a3ece0 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ }, "homepage": "https://github.com/nsat/jspredict", "dependencies": { - "moment": "^2.10.6", - "satellite.js": "^1.2.0" + "moment": "^2.24.0", + "satellite.js": "^3.0.1" } } From f8b2b66a5084a3f834eb053db90062e1c912c57b Mon Sep 17 00:00:00 2001 From: Andrew Cantino Date: Tue, 29 Oct 2019 12:54:26 -0700 Subject: [PATCH 2/4] gstimeFromDate became gstime in https://github.com/shashwatak/satellite-js/commit/907e74ed9dad8a0c786fddef545f153213899922 --- jspredict.js | 2 +- satellite.js | 3728 -------------------------------------------------- 2 files changed, 1 insertion(+), 3729 deletions(-) delete mode 100644 satellite.js diff --git a/jspredict.js b/jspredict.js index 2ff2bca..305ae83 100644 --- a/jspredict.js +++ b/jspredict.js @@ -385,7 +385,7 @@ _gmst: function(date) { date = new Date(date.valueOf()); - return satellite.gstimeFromDate( + return satellite.gstime( date.getUTCFullYear(), date.getUTCMonth() + 1, // months range 1-12 date.getUTCDate(), diff --git a/satellite.js b/satellite.js deleted file mode 100644 index 3761766..0000000 --- a/satellite.js +++ /dev/null @@ -1,3728 +0,0 @@ -(function (root, factory) { - if (typeof define === 'function' && define.amd) { - //Allow using this built library as an AMD module - //in another project. That other project will only - //see this AMD call, not the internal modules in - //the closure below. - define([], factory); - } else { - //Browser globals case. Just assign the - //result to a property on the global. - root.satellite = factory(); - } -}(this, function () {/** - * @license almond 0.2.9 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved. - * Available via the MIT or new BSD license. - * see: http://github.com/jrburke/almond for details - */ -//Going sloppy to avoid 'use strict' string cost, but strict practices should -//be followed. -/*jslint sloppy: true */ -/*global setTimeout: false */ - -var requirejs, require, define; -(function (undef) { - var main, req, makeMap, handlers, - defined = {}, - waiting = {}, - config = {}, - defining = {}, - hasOwn = Object.prototype.hasOwnProperty, - aps = [].slice, - jsSuffixRegExp = /\.js$/; - - function hasProp(obj, prop) { - return hasOwn.call(obj, prop); - } - - /** - * Given a relative module name, like ./something, normalize it to - * a real name that can be mapped to a path. - * @param {String} name the relative name - * @param {String} baseName a real name that the name arg is relative - * to. - * @returns {String} normalized name - */ - function normalize(name, baseName) { - var nameParts, nameSegment, mapValue, foundMap, lastIndex, - foundI, foundStarMap, starI, i, j, part, - baseParts = baseName && baseName.split("/"), - map = config.map, - starMap = (map && map['*']) || {}; - - //Adjust any relative paths. - if (name && name.charAt(0) === ".") { - //If have a base name, try to normalize against it, - //otherwise, assume it is a top-level require that will - //be relative to baseUrl in the end. - if (baseName) { - //Convert baseName to array, and lop off the last part, - //so that . matches that "directory" and not name of the baseName's - //module. For instance, baseName of "one/two/three", maps to - //"one/two/three.js", but we want the directory, "one/two" for - //this normalization. - baseParts = baseParts.slice(0, baseParts.length - 1); - name = name.split('/'); - lastIndex = name.length - 1; - - // Node .js allowance: - if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { - name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); - } - - name = baseParts.concat(name); - - //start trimDots - for (i = 0; i < name.length; i += 1) { - part = name[i]; - if (part === ".") { - name.splice(i, 1); - i -= 1; - } else if (part === "..") { - if (i === 1 && (name[2] === '..' || name[0] === '..')) { - //End of the line. Keep at least one non-dot - //path segment at the front so it can be mapped - //correctly to disk. Otherwise, there is likely - //no path mapping for a path starting with '..'. - //This can still fail, but catches the most reasonable - //uses of .. - break; - } else if (i > 0) { - name.splice(i - 1, 2); - i -= 2; - } - } - } - //end trimDots - - name = name.join("/"); - } else if (name.indexOf('./') === 0) { - // No baseName, so this is ID is resolved relative - // to baseUrl, pull off the leading dot. - name = name.substring(2); - } - } - - //Apply map config if available. - if ((baseParts || starMap) && map) { - nameParts = name.split('/'); - - for (i = nameParts.length; i > 0; i -= 1) { - nameSegment = nameParts.slice(0, i).join("/"); - - if (baseParts) { - //Find the longest baseName segment match in the config. - //So, do joins on the biggest to smallest lengths of baseParts. - for (j = baseParts.length; j > 0; j -= 1) { - mapValue = map[baseParts.slice(0, j).join('/')]; - - //baseName segment has config, find if it has one for - //this name. - if (mapValue) { - mapValue = mapValue[nameSegment]; - if (mapValue) { - //Match, update name to the new value. - foundMap = mapValue; - foundI = i; - break; - } - } - } - } - - if (foundMap) { - break; - } - - //Check for a star map match, but just hold on to it, - //if there is a shorter segment match later in a matching - //config, then favor over this star map. - if (!foundStarMap && starMap && starMap[nameSegment]) { - foundStarMap = starMap[nameSegment]; - starI = i; - } - } - - if (!foundMap && foundStarMap) { - foundMap = foundStarMap; - foundI = starI; - } - - if (foundMap) { - nameParts.splice(0, foundI, foundMap); - name = nameParts.join('/'); - } - } - - return name; - } - - function makeRequire(relName, forceSync) { - return function () { - //A version of a require function that passes a moduleName - //value for items that may need to - //look up paths relative to the moduleName - return req.apply(undef, aps.call(arguments, 0).concat([relName, forceSync])); - }; - } - - function makeNormalize(relName) { - return function (name) { - return normalize(name, relName); - }; - } - - function makeLoad(depName) { - return function (value) { - defined[depName] = value; - }; - } - - function callDep(name) { - if (hasProp(waiting, name)) { - var args = waiting[name]; - delete waiting[name]; - defining[name] = true; - main.apply(undef, args); - } - - if (!hasProp(defined, name) && !hasProp(defining, name)) { - throw new Error('No ' + name); - } - return defined[name]; - } - - //Turns a plugin!resource to [plugin, resource] - //with the plugin being undefined if the name - //did not have a plugin prefix. - function splitPrefix(name) { - var prefix, - index = name ? name.indexOf('!') : -1; - if (index > -1) { - prefix = name.substring(0, index); - name = name.substring(index + 1, name.length); - } - return [prefix, name]; - } - - /** - * Makes a name map, normalizing the name, and using a plugin - * for normalization if necessary. Grabs a ref to plugin - * too, as an optimization. - */ - makeMap = function (name, relName) { - var plugin, - parts = splitPrefix(name), - prefix = parts[0]; - - name = parts[1]; - - if (prefix) { - prefix = normalize(prefix, relName); - plugin = callDep(prefix); - } - - //Normalize according - if (prefix) { - if (plugin && plugin.normalize) { - name = plugin.normalize(name, makeNormalize(relName)); - } else { - name = normalize(name, relName); - } - } else { - name = normalize(name, relName); - parts = splitPrefix(name); - prefix = parts[0]; - name = parts[1]; - if (prefix) { - plugin = callDep(prefix); - } - } - - //Using ridiculous property names for space reasons - return { - f: prefix ? prefix + '!' + name : name, //fullName - n: name, - pr: prefix, - p: plugin - }; - }; - - function makeConfig(name) { - return function () { - return (config && config.config && config.config[name]) || {}; - }; - } - - handlers = { - require: function (name) { - return makeRequire(name); - }, - exports: function (name) { - var e = defined[name]; - if (typeof e !== 'undefined') { - return e; - } else { - return (defined[name] = {}); - } - }, - module: function (name) { - return { - id: name, - uri: '', - exports: defined[name], - config: makeConfig(name) - }; - } - }; - - main = function (name, deps, callback, relName) { - var cjsModule, depName, ret, map, i, - args = [], - callbackType = typeof callback, - usingExports; - - //Use name if no relName - relName = relName || name; - - //Call the callback to define the module, if necessary. - if (callbackType === 'undefined' || callbackType === 'function') { - //Pull out the defined dependencies and pass the ordered - //values to the callback. - //Default to [require, exports, module] if no deps - deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps; - for (i = 0; i < deps.length; i += 1) { - map = makeMap(deps[i], relName); - depName = map.f; - - //Fast path CommonJS standard dependencies. - if (depName === "require") { - args[i] = handlers.require(name); - } else if (depName === "exports") { - //CommonJS module spec 1.1 - args[i] = handlers.exports(name); - usingExports = true; - } else if (depName === "module") { - //CommonJS module spec 1.1 - cjsModule = args[i] = handlers.module(name); - } else if (hasProp(defined, depName) || - hasProp(waiting, depName) || - hasProp(defining, depName)) { - args[i] = callDep(depName); - } else if (map.p) { - map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {}); - args[i] = defined[depName]; - } else { - throw new Error(name + ' missing ' + depName); - } - } - - ret = callback ? callback.apply(defined[name], args) : undefined; - - if (name) { - //If setting exports via "module" is in play, - //favor that over return value and exports. After that, - //favor a non-undefined return value over exports use. - if (cjsModule && cjsModule.exports !== undef && - cjsModule.exports !== defined[name]) { - defined[name] = cjsModule.exports; - } else if (ret !== undef || !usingExports) { - //Use the return value from the function. - defined[name] = ret; - } - } - } else if (name) { - //May just be an object definition for the module. Only - //worry about defining if have a module name. - defined[name] = callback; - } - }; - - requirejs = require = req = function (deps, callback, relName, forceSync, alt) { - if (typeof deps === "string") { - if (handlers[deps]) { - //callback in this case is really relName - return handlers[deps](callback); - } - //Just return the module wanted. In this scenario, the - //deps arg is the module name, and second arg (if passed) - //is just the relName. - //Normalize module name, if it contains . or .. - return callDep(makeMap(deps, callback).f); - } else if (!deps.splice) { - //deps is a config object, not an array. - config = deps; - if (config.deps) { - req(config.deps, config.callback); - } - if (!callback) { - return; - } - - if (callback.splice) { - //callback is an array, which means it is a dependency list. - //Adjust args if there are dependencies - deps = callback; - callback = relName; - relName = null; - } else { - deps = undef; - } - } - - //Support require(['a']) - callback = callback || function () {}; - - //If relName is a function, it is an errback handler, - //so remove it. - if (typeof relName === 'function') { - relName = forceSync; - forceSync = alt; - } - - //Simulate async callback; - if (forceSync) { - main(undef, deps, callback, relName); - } else { - //Using a non-zero value because of concern for what old browsers - //do, and latest browsers "upgrade" to 4 if lower value is used: - //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout: - //If want a value immediately, use require('id') instead -- something - //that works in almond on the global level, but not guaranteed and - //unlikely to work in other AMD implementations. - setTimeout(function () { - main(undef, deps, callback, relName); - }, 4); - } - - return req; - }; - - /** - * Just drops the config on the floor, but returns req in case - * the config return value is used. - */ - req.config = function (cfg) { - return req(cfg); - }; - - /** - * Expose module registry for debugging and tooling - */ - requirejs._defined = defined; - - define = function (name, deps, callback) { - - //This module may not have dependencies - if (!deps.splice) { - //deps is not an array, so probably means - //an object literal or factory function for - //the value. Adjust args. - callback = deps; - deps = []; - } - - if (!hasProp(defined, name) && !hasProp(waiting, name)) { - waiting[name] = [name, deps, callback]; - } - }; - - define.amd = { - jQuery: true - }; -}()); - -define("almond", function(){}); - -/* - * satellite-js v1.2 - * (c) 2013 Shashwat Kandadai and UCSC - * https://github.com/shashwatak/satellite-js - * License: MIT - */ - -define('constants',[], function() { - 'use strict'; - - var pi = Math.PI, - mu = 398600.5, // in km3 / s2 - earthRadius = 6378.137, // in km - xke = 60.0 / Math.sqrt(earthRadius * earthRadius * earthRadius / mu), - j2 = 0.00108262998905, - j3 = -0.00000253215306; - - return { - pi: pi, - twoPi: pi * 2, - deg2rad: pi / 180.0, - rad2deg: 180 / pi, - minutesPerDay: 1440.0, - mu: mu, - earthRadius: earthRadius, - xke: xke, - tumin: 1.0 / xke, - j2: j2, - j3: j3, - j4: -0.00000161098761, - j3oj2: j3 / j2, - x2o3: 2.0 / 3.0 - }; -}); -/* - * satellite-js v1.2 - * (c) 2013 Shashwat Kandadai and UCSC - * https://github.com/shashwatak/satellite-js - * License: MIT - */ - -define('coordinate-transforms/degrees-lat',[ - '../constants' -], function( - constants -) { - 'use strict'; - - return function(radians) { - if (radians > constants.pi/2 || radians < (-constants.pi/2)){ - return 'Err'; - } - var degrees = (radians/constants.pi*180); - if (degrees < 0){ - degrees = degrees; - } - else{ - degrees = degrees; - } - return degrees; - }; -}); -/* - * satellite-js v1.2 - * (c) 2013 Shashwat Kandadai and UCSC - * https://github.com/shashwatak/satellite-js - * License: MIT - */ - -define('coordinate-transforms/degrees-long',[ - '../constants' -], function( - constants -) { - 'use strict'; - - return function (radians) { - var degrees = (radians/constants.pi*180) % (360); - if (degrees > 180){ - degrees = 360 - degrees; - } - else if (degrees < -180){ - degrees = 360 + degrees; - } - return degrees; - }; -}); -/* - * satellite-js v1.2 - * (c) 2013 Shashwat Kandadai and UCSC - * https://github.com/shashwatak/satellite-js - * License: MIT - */ - -define('coordinate-transforms/ecf-to-eci',[], function() { - 'use strict'; - - return function ecfToEci (ecfCoords, gmst){ - // ccar.colorado.edu/ASEN5070/handouts/coordsys.doc - // - // [X] [C -S 0][X] - // [Y] = [S C 0][Y] - // [Z]eci [0 0 1][Z]ecf - // - var X = (ecfCoords.x * Math.cos(gmst)) - (ecfCoords.y * Math.sin(gmst)); - var Y = (ecfCoords.x * (Math.sin(gmst))) + (ecfCoords.y * Math.cos(gmst)); - var Z = ecfCoords.z; - return { x : X, y : Y, z : Z }; - }; -}); -/* - * satellite-js v1.2 - * (c) 2013 Shashwat Kandadai and UCSC - * https://github.com/shashwatak/satellite-js - * License: MIT - */ - -define('coordinate-transforms/geodetic-to-ecf',[], function() { - 'use strict'; - - return function (geodeticCoords) { - var longitude = geodeticCoords.longitude; - var latitude = geodeticCoords.latitude; - var height = geodeticCoords.height; - var a = 6378.137; - var b = 6356.7523142; - var f = (a - b)/a; - var e2 = ((2*f) - (f*f)); - var normal = a / Math.sqrt( 1 - (e2*(Math.sin(latitude)*Math.sin(latitude)))); - - var X = (normal + height) * Math.cos (latitude) * Math.cos (longitude); - var Y = (normal + height) * Math.cos (latitude) * Math.sin (longitude); - var Z = ((normal*(1-e2)) + height) * Math.sin (latitude); - return { x : X, y : Y, z : Z }; - }; -}); -/* - * satellite-js v1.2 - * (c) 2013 Shashwat Kandadai and UCSC - * https://github.com/shashwatak/satellite-js - * License: MIT - */ - -define('coordinate-transforms/topocentric',[ - './geodetic-to-ecf' -], function( - geodeticToEcf -) { - 'use strict'; - - return function(observerCoords, satelliteCoords) { - // http://www.celestrak.com/columns/v02n02/ - // TS Kelso's method, except I'm using ECF frame - // and he uses ECI. - - var longitude = observerCoords.longitude; - var latitude = observerCoords.latitude; - - // TODO: defined but never used - //var height = observerCoords.height; - - var observerEcf = geodeticToEcf (observerCoords); - - var rx = satelliteCoords.x - observerEcf.x; - var ry = satelliteCoords.y - observerEcf.y; - var rz = satelliteCoords.z - observerEcf.z; - - var topS = ( (Math.sin(latitude) * Math.cos(longitude) * rx) + - (Math.sin(latitude) * Math.sin(longitude) * ry) - - (Math.cos(latitude) * rz)); - var topE = ( -Math.sin(longitude) * rx) + (Math.cos(longitude) * ry); - var topZ = ( (Math.cos(latitude)*Math.cos(longitude)*rx) + - (Math.cos(latitude)*Math.sin(longitude)*ry) + - (Math.sin(latitude)*rz)); - return { topS : topS, topE : topE, topZ : topZ }; - }; -}); -/* - * satellite-js v1.2 - * (c) 2013 Shashwat Kandadai and UCSC - * https://github.com/shashwatak/satellite-js - * License: MIT - */ - -define('coordinate-transforms/topocentric-to-look-angles',[ - '../constants' -], function( - constants -) { - 'use strict'; - - /** - * @param {Object} topocentric - * @param {Number} topocentric.topS - * @param {Number} topocentric.topE - * @param {Number} topocentric.topZ - */ - return function(topocentric) { - var topS = topocentric.topS; - var topE = topocentric.topE; - var topZ = topocentric.topZ; - var rangeSat = Math.sqrt((topS*topS) + (topE*topE) + (topZ*topZ)); - var El = Math.asin (topZ/rangeSat); - var Az = Math.atan2 (-topE, topS) + constants.pi; - - return { - azimuth : Az, - elevation : El, - rangeSat : rangeSat - }; - }; -}); -/* - * satellite-js v1.2 - * (c) 2013 Shashwat Kandadai and UCSC - * https://github.com/shashwatak/satellite-js - * License: MIT - */ - -define('coordinate-transforms/ecf-to-look-angles',[ - './topocentric', - './topocentric-to-look-angles' -], function( - topocentric, - topocentricToLookAngles -) { - 'use strict'; - - return function (observerCoordsEcf, satelliteCoordsEcf) { - var topocentricCoords = topocentric(observerCoordsEcf, satelliteCoordsEcf); - return topocentricToLookAngles(topocentricCoords); - }; -}); -/* - * satellite-js v1.2 - * (c) 2013 Shashwat Kandadai and UCSC - * https://github.com/shashwatak/satellite-js - * License: MIT - */ - -define('coordinate-transforms/eci-to-ecf',[], function() { - 'use strict'; - - return function(eciCoords, gmst){ - // ccar.colorado.edu/ASEN5070/handouts/coordsys.doc - // - // [X] [C -S 0][X] - // [Y] = [S C 0][Y] - // [Z]eci [0 0 1][Z]ecf - // - // - // Inverse: - // [X] [C S 0][X] - // [Y] = [-S C 0][Y] - // [Z]ecf [0 0 1][Z]eci - - var X = (eciCoords.x * Math.cos(gmst)) + (eciCoords.y * Math.sin(gmst)); - var Y = (eciCoords.x * (-Math.sin(gmst))) + (eciCoords.y * Math.cos(gmst)); - var Z = eciCoords.z; - return { x : X, y : Y, z : Z }; - }; -}); -/* - * satellite-js v1.2 - * (c) 2013 Shashwat Kandadai and UCSC - * https://github.com/shashwatak/satellite-js - * License: MIT - */ - -define('coordinate-transforms/eci-to-geodetic',[], function() { - 'use strict'; - - return function (eciCoords, gmst) { - // http://www.celestrak.com/columns/v02n03/ - var a = 6378.137; - var b = 6356.7523142; - var R = Math.sqrt( (eciCoords.x * eciCoords.x) + (eciCoords.y * eciCoords.y) ); - var f = (a - b)/a; - var e2 = ((2*f) - (f*f)); - var longitude = Math.atan2(eciCoords.y, eciCoords.x) - gmst; - var kmax = 20; - var k = 0; - var latitude = Math.atan2(eciCoords.z, - Math.sqrt(eciCoords.x * eciCoords.x + - eciCoords.y * eciCoords.y)); - var C; - while (k < kmax){ - C = 1 / Math.sqrt( 1 - e2*(Math.sin(latitude)*Math.sin(latitude)) ); - latitude = Math.atan2 (eciCoords.z + (a*C*e2*Math.sin(latitude)), R); - k += 1; - } - var height = (R/Math.cos(latitude)) - (a*C); - return { longitude : longitude, latitude : latitude, height : height }; - }; -}); -/* - * satellite-js v1.2 - * (c) 2013 Shashwat Kandadai and UCSC - * https://github.com/shashwatak/satellite-js - * License: MIT - */ - -define('doppler-factor',[], function() { - 'use strict'; - - return function (myLocation, position, velocity) { - var currentRange = Math.sqrt( - Math.pow(position.x - myLocation.x, 2) + - Math.pow(position.y - myLocation.y, 2) + - Math.pow(position.z - myLocation.z, 2)); - var nextPos = { - x : position.x + velocity.x, - y : position.y + velocity.y, - z : position.z + velocity.z - }; - var nextRange = Math.sqrt( - Math.pow(nextPos.x - myLocation.x, 2) + - Math.pow(nextPos.y - myLocation.y, 2) + - Math.pow(nextPos.z - myLocation.z, 2)); - var rangeRate = nextRange - currentRange; - - function sign(value) { - return value >= 0 ? 1 : -1; - } - - rangeRate *= sign(rangeRate); - var c = 299792.458; // Speed of light in km/s - var factor = (1 + rangeRate/c); - return factor; - }; -}); -define('gstime/days2mdhms',[], function() { - 'use strict'; - - return function(year, days){ - /* ----------------------------------------------------------------------------- - * - * procedure days2mdhms - * - * this procedure converts the day of the year, days, to the equivalent month - * day, hour, minute and second. - * - * algorithm : set up array for the number of days per month - * find leap year - use 1900 because 2000 is a leap year - * loop through a temp value while the value is < the days - * perform int conversions to the correct day and month - * convert remainder into h m s using type conversions - * - * author : david vallado 719-573-2600 1 mar 2001 - * - * inputs description range / units - * year - year 1900 .. 2100 - * days - julian day of the year 0.0 .. 366.0 - * - * outputs : - * mon - month 1 .. 12 - * day - day 1 .. 28,29,30,31 - * hr - hour 0 .. 23 - * min - minute 0 .. 59 - * sec - second 0.0 .. 59.999 - * - * locals : - * dayofyr - day of year - * temp - temporary extended values - * inttemp - temporary int value - * i - index - * lmonth[12] - int array containing the number of days per month - * - * coupling : - * none. - * --------------------------------------------------------------------------- */ - - var lmonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; - - var dayofyr = Math.floor(days); - // ----------------- find month and day of month ---------------- - if ((year % 4) === 0){ - lmonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; - } - - var i = 1; - var inttemp = 0; - while ((dayofyr > (inttemp + lmonth[i-1])) && i < 12) { - inttemp = inttemp + lmonth[i-1]; - i += 1; - } - var mon = i; - var day = dayofyr - inttemp; - - // ----------------- find hours minutes and seconds ------------- - var temp = (days - dayofyr) * 24.0; - var hr = Math.floor(temp); - temp = (temp - hr) * 60.0; - var minute = Math.floor(temp); - var sec = (temp - minute) * 60.0; - - var mdhmsResult = { - mon : mon, - day : day, - hr : hr, - minute : minute, - sec : sec - }; - - return mdhmsResult; - }; -}); -define('gstime/gstime',[ - '../constants' -], function( - constants -) { - 'use strict'; - - return function(jdut1) { - /* ----------------------------------------------------------------------------- - * - * function gstime - * - * this function finds the greenwich sidereal time. - * - * author : david vallado 719-573-2600 1 mar 2001 - * - * inputs description range / units - * jdut1 - julian date in ut1 days from 4713 bc - * - * outputs : - * gstime - greenwich sidereal time 0 to 2pi rad - * - * locals : - * temp - temporary variable for doubles rad - * tut1 - julian centuries from the - * jan 1, 2000 12 h epoch (ut1) - * - * coupling : - * none - * - * references : - * vallado 2004, 191, eq 3-45 - * --------------------------------------------------------------------------- */ - - var tut1 = (jdut1 - 2451545.0) / 36525.0; - var temp = -6.2e-6* tut1 * tut1 * tut1 + 0.093104 * tut1 * tut1 + - (876600.0*3600 + 8640184.812866) * tut1 + 67310.54841; //# sec - temp = (temp * constants.deg2rad / 240.0) % constants.twoPi; // 360/86400 = 1/240, to deg, to rad - - // ------------------------ check quadrants --------------------- - if (temp < 0.0){ - temp += constants.twoPi; - } - return temp; - }; -}); -define('gstime/jday',[], function() { - 'use strict'; - - return function(year, mon, day, hr, minute, sec) { - return (367.0 * year - - Math.floor((7 * (year + Math.floor((mon + 9) / 12.0))) * 0.25) + - Math.floor( 275 * mon / 9.0 ) + - day + 1721013.5 + - ((sec / 60.0 + minute) / 60.0 + hr) / 24.0 // ut in days - //# - 0.5*sgn(100.0*year + mon - 190002.5) + 0.5; - ); - }; -}); -/* - * satellite-js v1.2 - * (c) 2013 Shashwat Kandadai and UCSC - * https://github.com/shashwatak/satellite-js - * License: MIT - */ - -define('dpper',[ - './constants' -], function( - constants -) { - 'use strict'; - - return function(satrec, dpperParameters) { - /* ----------------------------------------------------------------------------- - * - * procedure dpper - * - * this procedure provides deep space long period periodic contributions - * to the mean elements. by design, these periodics are zero at epoch. - * this used to be dscom which included initialization, but it's really a - * recurring function. - * - * author : david vallado 719-573-2600 28 jun 2005 - * - * inputs : - * e3 - - * ee2 - - * peo - - * pgho - - * pho - - * pinco - - * plo - - * se2 , se3 , sgh2, sgh3, sgh4, sh2, sh3, si2, si3, sl2, sl3, sl4 - - * t - - * xh2, xh3, xi2, xi3, xl2, xl3, xl4 - - * zmol - - * zmos - - * ep - eccentricity 0.0 - 1.0 - * inclo - inclination - needed for lyddane modification - * nodep - right ascension of ascending node - * argpp - argument of perigee - * mp - mean anomaly - * - * outputs : - * ep - eccentricity 0.0 - 1.0 - * inclp - inclination - * nodep - right ascension of ascending node - * argpp - argument of perigee - * mp - mean anomaly - * - * locals : - * alfdp - - * betdp - - * cosip , sinip , cosop , sinop , - * dalf - - * dbet - - * dls - - * f2, f3 - - * pe - - * pgh - - * ph - - * pinc - - * pl - - * sel , ses , sghl , sghs , shl , shs , sil , sinzf , sis , - * sll , sls - * xls - - * xnoh - - * zf - - * zm - - * - * coupling : - * none. - * - * references : - * hoots, roehrich, norad spacetrack report #3 1980 - * hoots, norad spacetrack report #6 1986 - * hoots, schumacher and glover 2004 - * vallado, crawford, hujsak, kelso 2006 - ----------------------------------------------------------------------------*/ - - // TODO: defined but never used - //var inclo = dpperParameters.inclo; - - var init = dpperParameters.init, - ep = dpperParameters.ep, - inclp = dpperParameters.inclp, - nodep = dpperParameters.nodep, - argpp = dpperParameters.argpp, - mp = dpperParameters.mp, - opsmode = dpperParameters.opsmode; - - - // Copy satellite attributes into local variables for convenience - // and symmetry in writing formulae. - - var alfdp, betdp, - cosip, sinip, cosop, sinop, - dalf, dbet, dls, - f2, f3, - pe, pgh, ph, pinc, pl, - sel, ses, sghl, sghs, shs, sil, sinzf, sis, sll, sls, - xls, xnoh, zf, zm, shll; - - // TODO: defined but never used - //var shl; - - var e3 = satrec.e3; - var ee2 = satrec.ee2; - var peo = satrec.peo; - var pgho = satrec.pgho; - var pho = satrec.pho; - var pinco = satrec.pinco; - var plo = satrec.plo; - var se2 = satrec.se2; - var se3 = satrec.se3; - var sgh2 = satrec.sgh2; - var sgh3 = satrec.sgh3; - var sgh4 = satrec.sgh4; - var sh2 = satrec.sh2; - var sh3 = satrec.sh3; - var si2 = satrec.si2; - var si3 = satrec.si3; - var sl2 = satrec.sl2; - var sl3 = satrec.sl3; - var sl4 = satrec.sl4; - var t = satrec.t; - var xgh2 = satrec.xgh2; - var xgh3 = satrec.xgh3; - var xgh4 = satrec.xgh4; - var xh2 = satrec.xh2; - var xh3 = satrec.xh3; - var xi2 = satrec.xi2; - var xi3 = satrec.xi3; - var xl2 = satrec.xl2; - var xl3 = satrec.xl3; - var xl4 = satrec.xl4; - var zmol = satrec.zmol; - var zmos = satrec.zmos; - - // ---------------------- constants ----------------------------- - var zns = 1.19459e-5; - var zes = 0.01675; - var znl = 1.5835218e-4; - var zel = 0.05490; - - // --------------- calculate time varying periodics ----------- - zm = zmos + zns * t; - // be sure that the initial call has time set to zero - if (init === 'y') { - zm = zmos; - } - zf = zm + 2.0 * zes * Math.sin(zm); - sinzf = Math.sin(zf); - f2 = 0.5 * sinzf * sinzf - 0.25; - f3 = -0.5 * sinzf * Math.cos(zf); - ses = se2 * f2 + se3 * f3; - sis = si2 * f2 + si3 * f3; - sls = sl2 * f2 + sl3 * f3 + sl4 * sinzf; - sghs = sgh2 * f2 + sgh3 * f3 + sgh4 * sinzf; - shs = sh2 * f2 + sh3 * f3; - zm = zmol + znl * t; - if (init === 'y') { - zm = zmol; - } - - zf = zm + 2.0 * zel * Math.sin(zm); - sinzf = Math.sin(zf); - f2 = 0.5 * sinzf * sinzf - 0.25; - f3 = -0.5 * sinzf * Math.cos(zf); - sel = ee2 * f2 + e3 * f3; - sil = xi2 * f2 + xi3 * f3; - sll = xl2 * f2 + xl3 * f3 + xl4 * sinzf; - sghl = xgh2 * f2 + xgh3 * f3 + xgh4 * sinzf; - shll = xh2 * f2 + xh3 * f3; - pe = ses + sel; - pinc = sis + sil; - pl = sls + sll; - pgh = sghs + sghl; - ph = shs + shll; - - if (init === 'n'){ - pe = pe - peo; - pinc = pinc - pinco; - pl = pl - plo; - pgh = pgh - pgho; - ph = ph - pho; - inclp = inclp + pinc; - ep = ep + pe; - sinip = Math.sin(inclp); - cosip = Math.cos(inclp); - - /* ----------------- apply periodics directly ------------ */ - // sgp4fix for lyddane choice - // strn3 used original inclination - this is technically feasible - // gsfc used perturbed inclination - also technically feasible - // probably best to readjust the 0.2 limit value and limit discontinuity - // 0.2 rad = 11.45916 deg - // use next line for original strn3 approach and original inclination - // if (inclo >= 0.2) - // use next line for gsfc version and perturbed inclination - if (inclp >= 0.2) { - ph = ph / sinip; - pgh = pgh - cosip * ph; - argpp = argpp + pgh; - nodep = nodep + ph; - mp = mp + pl; - } - else { - // ---- apply periodics with lyddane modification ---- - sinop = Math.sin(nodep); - cosop = Math.cos(nodep); - alfdp = sinip * sinop; - betdp = sinip * cosop; - dalf = ph * cosop + pinc * cosip * sinop; - dbet = -ph * sinop + pinc * cosip * cosop; - alfdp = alfdp + dalf; - betdp = betdp + dbet; - nodep = nodep % constants.twoPi; - // sgp4fix for afspc written intrinsic functions - // nodep used without a trigonometric function ahead - if (nodep < 0.0 && opsmode === 'a') { - nodep = nodep + constants.twoPi; - } - xls = mp + argpp + cosip * nodep; - dls = pl + pgh - pinc * nodep * sinip; - xls = xls + dls; - xnoh = nodep; - nodep = Math.atan2(alfdp, betdp); - // sgp4fix for afspc written intrinsic functions - // nodep used without a trigonometric function ahead - if (nodep < 0.0 && opsmode === 'a'){ - nodep = nodep + constants.twoPi; - } - if (Math.abs(xnoh - nodep) > constants.pi) { - if (nodep < xnoh){ - nodep = nodep + constants.twoPi; - } - else{ - nodep = nodep - constants.twoPi; - } - } - mp = mp + pl; - argpp = xls - mp - cosip * nodep; - } - } - var dpperResult = { - ep : ep, - inclp : inclp, - nodep : nodep, - argpp : argpp, - mp : mp - }; - return dpperResult; - }; -}); -/* - * satellite-js v1.2 - * (c) 2013 Shashwat Kandadai and UCSC - * https://github.com/shashwatak/satellite-js - * License: MIT - */ - -define('dspace',[ - './constants' -], function( - constants -) { - 'use strict'; - - return function(dspaceParameters) { - /*----------------------------------------------------------------------------- - * - * procedure dspace - * - * this procedure provides deep space contributions to mean elements for - * perturbing third body. these effects have been averaged over one - * revolution of the sun and moon. for earth resonance effects, the - * effects have been averaged over no revolutions of the satellite. - * (mean motion) - * - * author : david vallado 719-573-2600 28 jun 2005 - * - * inputs : - * d2201, d2211, d3210, d3222, d4410, d4422, d5220, d5232, d5421, d5433 - - * dedt - - * del1, del2, del3 - - * didt - - * dmdt - - * dnodt - - * domdt - - * irez - flag for resonance 0-none, 1-one day, 2-half day - * argpo - argument of perigee - * argpdot - argument of perigee dot (rate) - * t - time - * tc - - * gsto - gst - * xfact - - * xlamo - - * no - mean motion - * atime - - * em - eccentricity - * ft - - * argpm - argument of perigee - * inclm - inclination - * xli - - * mm - mean anomaly - * xni - mean motion - * nodem - right ascension of ascending node - * - * outputs : - * atime - - * em - eccentricity - * argpm - argument of perigee - * inclm - inclination - * xli - - * mm - mean anomaly - * xni - - * nodem - right ascension of ascending node - * dndt - - * nm - mean motion - * - * locals : - * delt - - * ft - - * theta - - * x2li - - * x2omi - - * xl - - * xldot - - * xnddt - - * xndt - - * xomi - - * - * coupling : - * none - - * - * references : - * hoots, roehrich, norad spacetrack report #3 1980 - * hoots, norad spacetrack report #6 1986 - * hoots, schumacher and glover 2004 - * vallado, crawford, hujsak, kelso 2006 - ----------------------------------------------------------------------------*/ - - var delt, ft, theta, x2li, x2omi, - xl, xldot, xnddt, xndt, xomi; - - var irez = dspaceParameters.irez, - d2201 = dspaceParameters.d2201, - d2211 = dspaceParameters.d2211, - d3210 = dspaceParameters.d3210, - d3222 = dspaceParameters.d3222, - d4410 = dspaceParameters.d4410, - d4422 = dspaceParameters.d4422, - d5220 = dspaceParameters.d5220, - d5232 = dspaceParameters.d5232, - d5421 = dspaceParameters.d5421, - d5433 = dspaceParameters.d5433, - dedt = dspaceParameters.dedt, - del1 = dspaceParameters.del1, - del2 = dspaceParameters.del2, - del3 = dspaceParameters.del3, - didt = dspaceParameters.didt, - dmdt = dspaceParameters.dmdt, - dnodt = dspaceParameters.dnodt, - domdt = dspaceParameters.domdt, - argpo = dspaceParameters.argpo, - argpdot = dspaceParameters.argpdot, - t = dspaceParameters.t, - tc = dspaceParameters.tc, - gsto = dspaceParameters.gsto, - xfact = dspaceParameters.xfact, - xlamo = dspaceParameters.xlamo, - no = dspaceParameters.no, - atime = dspaceParameters.atime, - em = dspaceParameters.em, - argpm = dspaceParameters.argpm, - inclm = dspaceParameters.inclm, - xli = dspaceParameters.xli, - mm = dspaceParameters.mm, - xni = dspaceParameters.xni, - nodem = dspaceParameters.nodem, - nm = dspaceParameters.nm; - - - var fasx2 = 0.13130908; - var fasx4 = 2.8843198; - var fasx6 = 0.37448087; - var g22 = 5.7686396; - var g32 = 0.95240898; - var g44 = 1.8014998; - var g52 = 1.0508330; - var g54 = 4.4108898; - var rptim = 4.37526908801129966e-3; // equates to 7.29211514668855e-5 rad/sec - var stepp = 720.0; - var stepn = -720.0; - var step2 = 259200.0; - - // ----------- calculate deep space resonance effects ----------- - var dndt = 0.0; - theta = (gsto + tc * rptim) % constants.twoPi; - em = em + dedt * t; - - inclm = inclm + didt * t; - argpm = argpm + domdt * t; - nodem = nodem + dnodt * t; - mm = mm + dmdt * t; - - - // sgp4fix for negative inclinations - // the following if statement should be commented out - // if (inclm < 0.0) - // { - // inclm = -inclm; - // argpm = argpm - pi; - // nodem = nodem + pi; - // } - - /* - update resonances : numerical (euler-maclaurin) integration - */ - /* ------------------------- epoch restart ---------------------- */ - // sgp4fix for propagator problems - // the following integration works for negative time steps and periods - // the specific changes are unknown because the original code was so convoluted - - // sgp4fix take out atime = 0.0 and fix for faster operation - - ft = 0.0; - if (irez !== 0){ - // sgp4fix streamline check - if (atime === 0.0 || t * atime <= 0.0 || Math.abs(t) < Math.abs(atime)){ - atime = 0.0; - xni = no; - xli = xlamo; - } - - // sgp4fix move check outside loop - if (t > 0.0){ - delt = stepp; - } - else { - delt = stepn; - } - var iretn = 381; // added for do loop - var iret = 0; // added for loop - while (iretn === 381){ - // ------------------- dot terms calculated ------------- - // ----------- near - synchronous resonance terms ------- - if (irez !== 2){ - xndt = del1 * Math.sin(xli - fasx2) + del2 * Math.sin(2.0 * (xli - fasx4)) + - del3 * Math.sin(3.0 * (xli - fasx6)); - xldot = xni + xfact; - xnddt = del1 * Math.cos(xli - fasx2) + - 2.0 * del2 * Math.cos(2.0 * (xli - fasx4)) + - 3.0 * del3 * Math.cos(3.0 * (xli - fasx6)); - xnddt = xnddt * xldot; - } - else{ - // --------- near - half-day resonance terms -------- - xomi = argpo + argpdot * atime; - x2omi = xomi + xomi; - x2li = xli + xli; - xndt = (d2201 * Math.sin(x2omi + xli - g22) + d2211 * Math.sin( xli - g22) + - d3210 * Math.sin(xomi + xli - g32) + d3222 * Math.sin(-xomi + xli - g32) + - d4410 * Math.sin(x2omi + x2li - g44) + d4422 * Math.sin( x2li - g44) + - d5220 * Math.sin(xomi + xli - g52) + d5232 * Math.sin(-xomi + xli - g52) + - d5421 * Math.sin(xomi + x2li - g54) + d5433 * Math.sin(-xomi + x2li - g54)); - xldot = xni + xfact; - xnddt = (d2201 * Math.cos(x2omi + xli - g22) + d2211 * Math.cos(xli - g22) + - d3210 * Math.cos( xomi + xli - g32) + d3222 * Math.cos(-xomi + xli - g32) + - d5220 * Math.cos( xomi + xli - g52) + d5232 * Math.cos(-xomi + xli - g52) + - 2.0 * (d4410 * Math.cos(x2omi + x2li - g44) + - d4422 * Math.cos( x2li - g44) + d5421 * Math.cos(xomi + x2li - g54) + - d5433 * Math.cos(-xomi + x2li - g54))); - xnddt = xnddt * xldot; - } - // ----------------------- integrator ------------------- - // sgp4fix move end checks to end of routine - if (Math.abs(t - atime) >= stepp){ - iret = 0; - iretn = 381; - } - else{ - ft = t - atime; - iretn = 0; - } - if (iretn === 381){ - xli = xli + xldot * delt + xndt * step2; - xni = xni + xndt * delt + xnddt * step2; - atime = atime + delt; - } - } - nm = xni + xndt * ft + xnddt * ft * ft * 0.5; - xl = xli + xldot * ft + xndt * ft * ft * 0.5; - if (irez !== 1){ - mm = xl - 2.0 * nodem + 2.0 * theta; - dndt = nm - no; - } - else{ - mm = xl - nodem - argpm + theta; - dndt = nm - no; - } - nm = no + dndt; - } - var dspaceResults = { - atime : atime, - em : em, - argpm : argpm, - inclm : inclm, - xli : xli, - mm : mm, - xni : xni, - nodem : nodem, - dndt : dndt, - nm : nm - }; - return dspaceResults; - }; -}); -/* - * satellite-js v1.2 - * (c) 2013 Shashwat Kandadai and UCSC - * https://github.com/shashwatak/satellite-js - * License: MIT - */ - -define('sgp4',[ - './constants', - './dpper', - './dspace' -], function( - constants, - dpper, - dspace -) { - 'use strict'; - - return function (satrec, tsince) { - /*----------------------------------------------------------------------------- - * - * procedure sgp4 - * - * this procedure is the sgp4 prediction model from space command. this is an - * updated and combined version of sgp4 and sdp4, which were originally - * published separately in spacetrack report //3. this version follows the - * methodology from the aiaa paper (2006) describing the history and - * development of the code. - * - * author : david vallado 719-573-2600 28 jun 2005 - * - * inputs : - * satrec - initialised structure from sgp4init() call. - * tsince - time since epoch (minutes) - * - * outputs : - * r - position vector km - * v - velocity km/sec - * return code - non-zero on error. - * 1 - mean elements, ecc >= 1.0 or ecc < -0.001 or a < 0.95 er - * 2 - mean motion less than 0.0 - * 3 - pert elements, ecc < 0.0 or ecc > 1.0 - * 4 - semi-latus rectum < 0.0 - * 5 - epoch elements are sub-orbital - * 6 - satellite has decayed - * - * locals : - * am - - * axnl, aynl - - * betal - - * cosim , sinim , cosomm , sinomm , cnod , snod , cos2u , - * sin2u , coseo1 , sineo1 , cosi , sini , cosip , sinip , - * cosisq , cossu , sinsu , cosu , sinu - * delm - - * delomg - - * dndt - - * eccm - - * emsq - - * ecose - - * el2 - - * eo1 - - * eccp - - * esine - - * argpm - - * argpp - - * omgadf - - * pl - - * r - - * rtemsq - - * rdotl - - * rl - - * rvdot - - * rvdotl - - * su - - * t2 , t3 , t4 , tc - * tem5, temp , temp1 , temp2 , tempa , tempe , templ - * u , ux , uy , uz , vx , vy , vz - * inclm - inclination - * mm - mean anomaly - * nm - mean motion - * nodem - right asc of ascending node - * xinc - - * xincp - - * xl - - * xlm - - * mp - - * xmdf - - * xmx - - * xmy - - * nodedf - - * xnode - - * nodep - - * np - - * - * coupling : - * getgravconst- - * dpper - * dspace - * - * references : - * hoots, roehrich, norad spacetrack report //3 1980 - * hoots, norad spacetrack report //6 1986 - * hoots, schumacher and glover 2004 - * vallado, crawford, hujsak, kelso 2006 - ----------------------------------------------------------------------------*/ - - var am, axnl, aynl, betal, - cosim, sinim, cnod, snod, cos2u, - sin2u, coseo1, sineo1, cosi, sini, cosip, sinip, - cosisq, cossu, sinsu, cosu, sinu, - delm, delomg, dndt, - emsq, ecose, el2, eo1, esine, - argpm, argpp, pl, - r, v, rdotl, rl, rvdot, rvdotl, su, - t2, t3, t4, tc, - tem5, temp, temp1, temp2, tempa, tempe, templ, - u, ux, uy, uz, vx, vy, vz, - inclm, mm, nm, nodem, - xinc, xincp, xl, xlm, mp, xmdf, xmx, xmy, - nodedf, xnode, nodep; - - // TODO: defined but never used - //var cosomm, sinomm, eccm, eccp, omgadf, rtemsq, np; - - var mrt = 0.0; - - /* ------------------ set mathematical constants --------------- */ - // sgp4fix divisor for divide by zero check on inclination - // the old check used 1.0 + cos(pi-1.0e-9), but then compared it to - // 1.5 e-12, so the threshold was changed to 1.5e-12 for consistency - - var temp4 = 1.5e-12; - - var vkmpersec = constants.earthRadius * constants.xke / 60.0; - - // --------------------- clear sgp4 error flag ----------------- - satrec.t = tsince; - satrec.error = 0; - - // ------- update for secular gravity and atmospheric drag ----- - xmdf = satrec.mo + satrec.mdot * satrec.t; - var argpdf = satrec.argpo + satrec.argpdot * satrec.t; - nodedf = satrec.nodeo + satrec.nodedot * satrec.t; - argpm = argpdf; - mm = xmdf; - t2 = satrec.t * satrec.t; - nodem = nodedf + satrec.nodecf * t2; - tempa = 1.0 - satrec.cc1 * satrec.t; - tempe = satrec.bstar * satrec.cc4 * satrec.t; - templ = satrec.t2cof * t2; - - if (satrec.isimp !== 1) { - delomg = satrec.omgcof * satrec.t; - // sgp4fix use mutliply for speed instead of pow - var delmtemp = 1.0 + satrec.eta * Math.cos(xmdf); - delm = satrec.xmcof * - (delmtemp * delmtemp * delmtemp - - satrec.delmo); - temp = delomg + delm; - mm = xmdf + temp; - argpm = argpdf - temp; - t3 = t2 * satrec.t; - t4 = t3 * satrec.t; - tempa = tempa - satrec.d2 * t2 - satrec.d3 * t3 - - satrec.d4 * t4; - tempe = tempe + satrec.bstar * satrec.cc5 * (Math.sin(mm) - - satrec.sinmao); - templ = templ + satrec.t3cof * t3 + t4 * (satrec.t4cof + - satrec.t * satrec.t5cof); - } - nm = satrec.no; - var em = satrec.ecco; - inclm = satrec.inclo; - if (satrec.method === 'd') { - tc = satrec.t; - - var dspaceParameters = { - irez: satrec.irez, - d2201: satrec.d2201, - d2211: satrec.d2211, - d3210: satrec.d3210, - d3222: satrec.d3222, - d4410: satrec.d4410, - d4422: satrec.d4422, - d5220: satrec.d5220, - d5232: satrec.d5232, - d5421: satrec.d5421, - d5433: satrec.d5433, - dedt: satrec.dedt, - del1: satrec.del1, - del2: satrec.del2, - del3: satrec.del3, - didt: satrec.didt, - dmdt: satrec.dmdt, - dnodt: satrec.dnodt, - domdt: satrec.domdt, - argpo: satrec.argpo, - argpdot: satrec.argpdot, - t: satrec.t, - tc: tc, - gsto: satrec.gsto, - xfact: satrec.xfact, - xlamo: satrec.xlamo, - no: satrec.no, - atime: satrec.atime, - em: em, - argpm: argpm, - inclm: inclm, - xli: satrec.xli, - mm: mm, - xni: satrec.xni, - nodem: nodem, - nm: nm - }; - - var dspaceResult = dspace(dspaceParameters); - - // TODO: defined but never used - //var atime = dspaceResult.atime; - - em = dspaceResult.em; - argpm = dspaceResult.argpm; - inclm = dspaceResult.inclm; - - // TODO: defined but never used - //var xli = dspaceResult.xli; - - mm = dspaceResult.mm; - - // TODO: defined but never used - //var xni = dspaceResult.xni; - - nodem = dspaceResult.nodem; - dndt = dspaceResult.dndt; - nm = dspaceResult.nm; - } - - if (nm <= 0.0) { - // printf("// error nm %f\n", nm); - satrec.error = 2; - // sgp4fix add return - return [false, false]; - } - am = Math.pow((constants.xke / nm), constants.x2o3) * tempa * tempa; - nm = constants.xke / Math.pow(am, 1.5); - em = em - tempe; - - // fix tolerance for error recognition - // sgp4fix am is fixed from the previous nm check - if (em >= 1.0 || em < -0.001) { // || (am < 0.95) - // printf("// error em %f\n", em); - satrec.error = 1; - // sgp4fix to return if there is an error in eccentricity - return [false, false]; - } - // sgp4fix fix tolerance to avoid a divide by zero - if (em < 1.0e-6) { - em = 1.0e-6; - } - mm = mm + satrec.no * templ; - xlm = mm + argpm + nodem; - emsq = em * em; - temp = 1.0 - emsq; - - nodem = (nodem) % constants.twoPi; - argpm = (argpm) % constants.twoPi; - xlm = (xlm) % constants.twoPi; - mm = (xlm - argpm - nodem) % constants.twoPi; - - // ----------------- compute extra mean quantities ------------- - sinim = Math.sin(inclm); - cosim = Math.cos(inclm); - - // -------------------- add lunar-solar periodics -------------- - var ep = em; - xincp = inclm; - argpp = argpm; - nodep = nodem; - mp = mm; - sinip = sinim; - cosip = cosim; - if (satrec.method === 'd') { - - var dpperParameters = { - inclo: satrec.inclo, - init: 'n', - ep: ep, - inclp: xincp, - nodep: nodep, - argpp: argpp, - mp: mp, - opsmode: satrec.operationmod - }; - - var dpperResult = dpper(satrec, dpperParameters); - ep = dpperResult.ep; - xincp = dpperResult.inclp; - nodep = dpperResult.nodep; - argpp = dpperResult.argpp; - mp = dpperResult.mp; - - if (xincp < 0.0) { - xincp = -xincp; - nodep = nodep + constants.pi; - argpp = argpp - constants.pi; - } - if (ep < 0.0 || ep > 1.0) { - // printf("// error ep %f\n", ep); - satrec.error = 3; - // sgp4fix add return - return [false, false]; - } - } - // -------------------- long period periodics ------------------ - if (satrec.method === 'd') { - sinip = Math.sin(xincp); - cosip = Math.cos(xincp); - satrec.aycof = -0.5 * constants.j3oj2 * sinip; - // sgp4fix for divide by zero for xincp = 180 deg - if (Math.abs(cosip + 1.0) > 1.5e-12) { - satrec.xlcof = -0.25 * constants.j3oj2 * sinip * (3.0 + 5.0 * cosip) / (1.0 + cosip); - } - else { - satrec.xlcof = -0.25 * constants.j3oj2 * sinip * (3.0 + 5.0 * cosip) / temp4; - } - } - axnl = ep * Math.cos(argpp); - temp = 1.0 / (am * (1.0 - ep * ep)); - aynl = ep * Math.sin(argpp) + temp * satrec.aycof; - xl = mp + argpp + nodep + temp * satrec.xlcof * axnl; - - // --------------------- solve kepler's equation --------------- - u = (xl - nodep) % constants.twoPi; - eo1 = u; - tem5 = 9999.9; - var ktr = 1; - // sgp4fix for kepler iteration - // the following iteration needs better limits on corrections - while (Math.abs(tem5) >= 1.0e-12 && ktr <= 10) { - sineo1 = Math.sin(eo1); - coseo1 = Math.cos(eo1); - tem5 = 1.0 - coseo1 * axnl - sineo1 * aynl; - tem5 = (u - aynl * coseo1 + axnl * sineo1 - eo1) / tem5; - if (Math.abs(tem5) >= 0.95) { - if (tem5 > 0.0) { - tem5 = 0.95; - } - else { - tem5 = -0.95; - } - } - eo1 = eo1 + tem5; - ktr = ktr + 1; - } - // ------------- short period preliminary quantities ----------- - ecose = axnl * coseo1 + aynl * sineo1; - esine = axnl * sineo1 - aynl * coseo1; - el2 = axnl * axnl + aynl * aynl; - pl = am * (1.0 - el2); - if (pl < 0.0) { - - // printf("// error pl %f\n", pl); - satrec.error = 4; - // sgp4fix add return - return [false, false]; - } - else { - rl = am * (1.0 - ecose); - rdotl = Math.sqrt(am) * esine / rl; - rvdotl = Math.sqrt(pl) / rl; - betal = Math.sqrt(1.0 - el2); - temp = esine / (1.0 + betal); - sinu = am / rl * (sineo1 - aynl - axnl * temp); - cosu = am / rl * (coseo1 - axnl + aynl * temp); - su = Math.atan2(sinu, cosu); - sin2u = (cosu + cosu) * sinu; - cos2u = 1.0 - 2.0 * sinu * sinu; - temp = 1.0 / pl; - temp1 = 0.5 * constants.j2 * temp; - temp2 = temp1 * temp; - - // -------------- update for short period periodics ------------ - if (satrec.method === 'd') { - cosisq = cosip * cosip; - satrec.con41 = 3.0 * cosisq - 1.0; - satrec.x1mth2 = 1.0 - cosisq; - satrec.x7thm1 = 7.0 * cosisq - 1.0; - } - mrt = rl * (1.0 - 1.5 * temp2 * betal * satrec.con41) + - 0.5 * temp1 * satrec.x1mth2 * cos2u; - su = su - 0.25 * temp2 * satrec.x7thm1 * sin2u; - xnode = nodep + 1.5 * temp2 * cosip * sin2u; - xinc = xincp + 1.5 * temp2 * cosip * sinip * cos2u; - var mvt = rdotl - nm * temp1 * satrec.x1mth2 * sin2u / constants.xke; - rvdot = rvdotl + nm * temp1 * (satrec.x1mth2 * cos2u + - 1.5 * satrec.con41) / constants.xke; - - // --------------------- orientation vectors ------------------- - sinsu = Math.sin(su); - cossu = Math.cos(su); - snod = Math.sin(xnode); - cnod = Math.cos(xnode); - sini = Math.sin(xinc); - cosi = Math.cos(xinc); - xmx = -snod * cosi; - xmy = cnod * cosi; - ux = xmx * sinsu + cnod * cossu; - uy = xmy * sinsu + snod * cossu; - uz = sini * sinsu; - vx = xmx * cossu - cnod * sinsu; - vy = xmy * cossu - snod * sinsu; - vz = sini * cossu; - - // --------- position and velocity (in km and km/sec) ---------- - r = {x: 0.0, y: 0.0, z: 0.0}; - r.x = (mrt * ux) * constants.earthRadius; - r.y = (mrt * uy) * constants.earthRadius; - r.z = (mrt * uz) * constants.earthRadius; - v = {x: 0.0, y: 0.0, z: 0.0}; - v.x = (mvt * ux + rvdot * vx) * vkmpersec; - v.y = (mvt * uy + rvdot * vy) * vkmpersec; - v.z = (mvt * uz + rvdot * vz) * vkmpersec; - } - // sgp4fix for decaying satellites - if (mrt < 1.0) { - // printf("// decay condition %11.6f \n",mrt); - satrec.error = 6; - return {position: false, velocity: false}; - } - return {position: r, velocity: v}; - }; -}); -/* - * satellite-js v1.2 - * (c) 2013 Shashwat Kandadai and UCSC - * https://github.com/shashwatak/satellite-js - * License: MIT - */ - -define('propagate/propagate',[ - '../constants', - '../gstime/jday', - '../sgp4' -], function( - constants, - jday, - sgp4 -) { - 'use strict'; - - return function propagate(satrec, year, month, day, hour, minute, second){ - //Return a position and velocity vector for a given date and time. - var j = jday(year, month, day, hour, minute, second); - var m = (j - satrec.jdsatepoch) * constants.minutesPerDay; - return sgp4(satrec, m); - }; -}); -/* - * satellite-js v1.2 - * (c) 2013 Shashwat Kandadai and UCSC - * https://github.com/shashwatak/satellite-js - * License: MIT - */ - -define('dscom',[ - './constants' -], function( - constants -) { - 'use strict'; - - return function(dscomParameters) { - /*----------------------------------------------------------------------------- - * - * procedure dscom - * - * this procedure provides deep space common items used by both the secular - * and periodics subroutines. input is provided as shown. this routine - * used to be called dpper, but the functions inside weren't well organized. - * - * author : david vallado 719-573-2600 28 jun 2005 - * - * inputs : - * epoch - - * ep - eccentricity - * argpp - argument of perigee - * tc - - * inclp - inclination - * nodep - right ascension of ascending node - * np - mean motion - * - * outputs : - * sinim , cosim , sinomm , cosomm , snodm , cnodm - * day - - * e3 - - * ee2 - - * em - eccentricity - * emsq - eccentricity squared - * gam - - * peo - - * pgho - - * pho - - * pinco - - * plo - - * rtemsq - - * se2, se3 - - * sgh2, sgh3, sgh4 - - * sh2, sh3, si2, si3, sl2, sl3, sl4 - - * s1, s2, s3, s4, s5, s6, s7 - - * ss1, ss2, ss3, ss4, ss5, ss6, ss7, sz1, sz2, sz3 - - * sz11, sz12, sz13, sz21, sz22, sz23, sz31, sz32, sz33 - - * xgh2, xgh3, xgh4, xh2, xh3, xi2, xi3, xl2, xl3, xl4 - - * nm - mean motion - * z1, z2, z3, z11, z12, z13, z21, z22, z23, z31, z32, z33 - - * zmol - - * zmos - - * - * locals : - * a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 - - * betasq - - * cc - - * ctem, stem - - * x1, x2, x3, x4, x5, x6, x7, x8 - - * xnodce - - * xnoi - - * zcosg , zsing , zcosgl , zsingl , zcosh , zsinh , zcoshl , zsinhl , - * zcosi , zsini , zcosil , zsinil , - * zx - - * zy - - * - * coupling : - * none. - * - * references : - * hoots, roehrich, norad spacetrack report #3 1980 - * hoots, norad spacetrack report #6 1986 - * hoots, schumacher and glover 2004 - * vallado, crawford, hujsak, kelso 2006 - ----------------------------------------------------------------------------*/ - - var epoch = dscomParameters.epoch, - ep = dscomParameters.ep, - argpp = dscomParameters.argpp, - tc = dscomParameters.tc, - inclp = dscomParameters.inclp, - nodep = dscomParameters.nodep, - np = dscomParameters.np, - e3 = dscomParameters.e3, - ee2 = dscomParameters.ee2, - peo = dscomParameters.peo, - pgho = dscomParameters.pgho, - pho = dscomParameters.pho, - pinco = dscomParameters.pinco, - plo = dscomParameters.plo, - se2 = dscomParameters.se2, - se3 = dscomParameters.se3, - sgh2 = dscomParameters.sgh2, - sgh3 = dscomParameters.sgh3, - sgh4 = dscomParameters.sgh4, - sh2 = dscomParameters.sh2, - sh3 = dscomParameters.sh3, - si2 = dscomParameters.si2, - si3 = dscomParameters.si3, - sl2 = dscomParameters.sl2, - sl3 = dscomParameters.sl3, - sl4 = dscomParameters.sl4, - xgh2 = dscomParameters.xgh2, - xgh3 = dscomParameters.xgh3, - xgh4 = dscomParameters.xgh4, - xh2 = dscomParameters.xh2, - xh3 = dscomParameters.xh3, - xi2 = dscomParameters.xi2, - xi3 = dscomParameters.xi3, - xl2 = dscomParameters.xl2, - xl3 = dscomParameters.xl3, - xl4 = dscomParameters.xl4, - zmol = dscomParameters.zmol, - zmos = dscomParameters.zmos; - - - var a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, - betasq, cc, ctem, stem, - x1, x2, x3, x4, x5, x6, x7, x8, - xnodce, xnoi, - zcosg, zsing, zcosgl, zsingl, - zcosh, zsinh, zcoshl, zsinhl, - zcosi, zsini, zcosil, zsinil, - zx, zy; - - var ss1, ss2, ss3, ss4, ss5, ss6, ss7, - sz1, sz2, sz3, - sz11, sz12, sz13, - sz21, sz22, sz23, - sz31, sz32, sz33; - var s1, s2, s3, s4, s5, s6, s7; - var z1, z2, z3, - z11,z12,z13, - z21,z22,z23, - z31,z32,z33; - - // -------------------------- constants ------------------------- - var zes = 0.01675; - var zel = 0.05490; - var c1ss = 2.9864797e-6; - var c1l = 4.7968065e-7; - var zsinis = 0.39785416; - var zcosis = 0.91744867; - var zcosgs = 0.1945905; - var zsings = -0.98088458; - // --------------------- local variables ------------------------ - var nm = np; - var em = ep; - var snodm = Math.sin(nodep); - var cnodm = Math.cos(nodep); - var sinomm = Math.sin(argpp); - var cosomm = Math.cos(argpp); - var sinim = Math.sin(inclp); - var cosim = Math.cos(inclp); - var emsq = em * em; - betasq = 1.0 - emsq; - var rtemsq = Math.sqrt(betasq); - - // ----------------- initialize lunar solar terms --------------- - peo = 0.0; - pinco = 0.0; - plo = 0.0; - pgho = 0.0; - pho = 0.0; - var day = epoch + 18261.5 + tc / 1440.0; - xnodce = (4.5236020 - 9.2422029e-4 * day) % constants.twoPi; - stem = Math.sin(xnodce); - ctem = Math.cos(xnodce); - zcosil = 0.91375164 - 0.03568096 * ctem; - zsinil = Math.sqrt(1.0 - zcosil * zcosil); - zsinhl = 0.089683511 * stem / zsinil; - zcoshl = Math.sqrt(1.0 - zsinhl * zsinhl); - var gam = 5.8351514 + 0.0019443680 * day; - zx = 0.39785416 * stem / zsinil; - zy = zcoshl * ctem + 0.91744867 * zsinhl * stem; - zx = Math.atan2(zx, zy); - zx = gam + zx - xnodce; - zcosgl = Math.cos(zx); - zsingl = Math.sin(zx); - - // ------------------------- do solar terms --------------------- - zcosg = zcosgs; - zsing = zsings; - zcosi = zcosis; - zsini = zsinis; - zcosh = cnodm; - zsinh = snodm; - cc = c1ss; - xnoi = 1.0 / nm; - - var lsflg = 0; - while (lsflg < 2) { - lsflg += 1; - a1 = zcosg * zcosh + zsing * zcosi * zsinh; - a3 = -zsing * zcosh + zcosg * zcosi * zsinh; - a7 = -zcosg * zsinh + zsing * zcosi * zcosh; - a8 = zsing * zsini; - a9 = zsing * zsinh + zcosg * zcosi * zcosh; - a10 = zcosg * zsini; - a2 = cosim * a7 + sinim * a8; - a4 = cosim * a9 + sinim * a10; - a5 = -sinim * a7 + cosim * a8; - a6 = -sinim * a9 + cosim * a10; - - x1 = a1 * cosomm + a2 * sinomm; - x2 = a3 * cosomm + a4 * sinomm; - x3 = -a1 * sinomm + a2 * cosomm; - x4 = -a3 * sinomm + a4 * cosomm; - x5 = a5 * sinomm; - x6 = a6 * sinomm; - x7 = a5 * cosomm; - x8 = a6 * cosomm; - - z31 = 12.0 * x1 * x1 - 3.0 * x3 * x3; - z32 = 24.0 * x1 * x2 - 6.0 * x3 * x4; - z33 = 12.0 * x2 * x2 - 3.0 * x4 * x4; - z1 = 3.0 * (a1 * a1 + a2 * a2) + z31 * emsq; - z2 = 6.0 * (a1 * a3 + a2 * a4) + z32 * emsq; - z3 = 3.0 * (a3 * a3 + a4 * a4) + z33 * emsq; - z11 = -6.0 * a1 * a5 + emsq * - (-24.0 * x1 * x7-6.0 * x3 * x5); - z12 = -6.0 * (a1 * a6 + a3 * a5) + emsq * - (-24.0 * (x2 * x7 + x1 * x8) + - -6.0 * (x3 * x6 + x4 * x5)); - z13 = -6.0 * a3 * a6 + emsq * - (-24.0 * x2 * x8 - 6.0 * x4 * x6); - z21 = 6.0 * a2 * a5 + emsq * - ( 24.0 * x1 * x5 - 6.0 * x3 * x7); - z22 = 6.0 * (a4 * a5 + a2 * a6) + emsq * - ( 24.0 * (x2 * x5 + x1 * x6) - - 6.0 * (x4 * x7 + x3 * x8)); - z23 = 6.0 * a4 * a6 + emsq * - ( 24.0 * x2 * x6 - 6.0 * x4 * x8); - z1 = z1 + z1 + betasq * z31; - z2 = z2 + z2 + betasq * z32; - z3 = z3 + z3 + betasq * z33; - s3 = cc * xnoi; - s2 = -0.5 * s3 / rtemsq; - s4 = s3 * rtemsq; - s1 = -15.0 * em * s4; - s5 = x1 * x3 + x2 * x4; - s6 = x2 * x3 + x1 * x4; - s7 = x2 * x4 - x1 * x3; - - // ----------------------- do lunar terms ------------------- - if (lsflg === 1) { - ss1 = s1; - ss2 = s2; - ss3 = s3; - ss4 = s4; - ss5 = s5; - ss6 = s6; - ss7 = s7; - sz1 = z1; - sz2 = z2; - sz3 = z3; - sz11 = z11; - sz12 = z12; - sz13 = z13; - sz21 = z21; - sz22 = z22; - sz23 = z23; - sz31 = z31; - sz32 = z32; - sz33 = z33; - zcosg = zcosgl; - zsing = zsingl; - zcosi = zcosil; - zsini = zsinil; - zcosh = zcoshl * cnodm + zsinhl * snodm; - zsinh = snodm * zcoshl - cnodm * zsinhl; - cc = c1l; - } - } - zmol = (4.7199672 + 0.22997150 * day - gam) % constants.twoPi; - zmos = (6.2565837 + 0.017201977 * day) % constants.twoPi; - - // ------------------------ do solar terms ---------------------- - se2 = 2.0 * ss1 * ss6; - se3 = 2.0 * ss1 * ss7; - si2 = 2.0 * ss2 * sz12; - si3 = 2.0 * ss2 * (sz13 - sz11); - sl2 = -2.0 * ss3 * sz2; - sl3 = -2.0 * ss3 * (sz3 - sz1); - sl4 = -2.0 * ss3 * (-21.0 - 9.0 * emsq) * zes; - sgh2 = 2.0 * ss4 * sz32; - sgh3 = 2.0 * ss4 * (sz33 - sz31); - sgh4 = -18.0 * ss4 * zes; - sh2 = -2.0 * ss2 * sz22; - sh3 = -2.0 * ss2 * (sz23 - sz21); - - // ------------------------ do lunar terms ---------------------- - ee2 = 2.0 * s1 * s6; - e3 = 2.0 * s1 * s7; - xi2 = 2.0 * s2 * z12; - xi3 = 2.0 * s2 * (z13 - z11); - xl2 = -2.0 * s3 * z2; - xl3 = -2.0 * s3 * (z3 - z1); - xl4 = -2.0 * s3 * (-21.0 - 9.0 * emsq) * zel; - xgh2 = 2.0 * s4 * z32; - xgh3 = 2.0 * s4 * (z33 - z31); - xgh4 = -18.0 * s4 * zel; - xh2 = -2.0 * s2 * z22; - xh3 = -2.0 * s2 * (z23 - z21); - - var dscomResults = { - snodm : snodm, - cnodm : cnodm, - sinim : sinim, - cosim : cosim, - sinomm : sinomm, - - cosomm : cosomm, - day : day, - e3 : e3, - ee2 : ee2, - em : em, - - emsq : emsq, - gam : gam, - peo : peo, - pgho : pgho, - pho : pho, - - pinco : pinco, - plo : plo, - rtemsq : rtemsq, - se2 : se2, - se3 : se3, - - sgh2 : sgh2, - sgh3 : sgh3, - sgh4 : sgh4, - sh2 : sh2, - sh3 : sh3, - - si2 : si2, - si3 : si3, - sl2 : sl2, - sl3 : sl3, - sl4 : sl4, - - s1 : s1, - s2 : s2, - s3 : s3, - s4 : s4, - s5 : s5, - - s6 : s6, - s7 : s7, - ss1 : ss1, - ss2 : ss2, - ss3 : ss3, - - ss4 : ss4, - ss5 : ss5, - ss6 : ss6, - ss7 : ss7, - sz1 : sz1, - - sz2 : sz2, - sz3 : sz3, - sz11 : sz11, - sz12 : sz12, - sz13 : sz13, - - sz21 : sz21, - sz22 : sz22, - sz23 : sz23, - sz31 : sz31, - sz32 : sz32, - - sz33 : sz33, - xgh2 : xgh2, - xgh3 : xgh3, - xgh4 : xgh4, - xh2 : xh2, - - xh3 : xh3, - xi2 : xi2, - xi3 : xi3, - xl2 : xl2, - xl3 : xl3, - - xl4 : xl4, - nm : nm, - z1 : z1, - z2 : z2, - z3 : z3, - - z11 : z11, - z12 : z12, - z13 : z13, - z21 : z21, - z22 : z22, - - z23 : z23, - z31 : z31, - z32 : z32, - z33 : z33, - zmol : zmol, - - zmos : zmos - }; - return dscomResults; - }; -}); -/* - * satellite-js v1.2 - * (c) 2013 Shashwat Kandadai and UCSC - * https://github.com/shashwatak/satellite-js - * License: MIT - */ - -define('dsinit',[ - './constants' -], function( - constants -) { - 'use strict'; - - return function(dsinitParameters) { - /*----------------------------------------------------------------------------- - * - * procedure dsinit - * - * this procedure provides deep space contributions to mean motion dot due - * to geopotential resonance with half day and one day orbits. - * - * author : david vallado 719-573-2600 28 jun 2005 - * - * inputs : - * cosim, sinim- - * emsq - eccentricity squared - * argpo - argument of perigee - * s1, s2, s3, s4, s5 - - * ss1, ss2, ss3, ss4, ss5 - - * sz1, sz3, sz11, sz13, sz21, sz23, sz31, sz33 - - * t - time - * tc - - * gsto - greenwich sidereal time rad - * mo - mean anomaly - * mdot - mean anomaly dot (rate) - * no - mean motion - * nodeo - right ascension of ascending node - * nodedot - right ascension of ascending node dot (rate) - * xpidot - - * z1, z3, z11, z13, z21, z23, z31, z33 - - * eccm - eccentricity - * argpm - argument of perigee - * inclm - inclination - * mm - mean anomaly - * xn - mean motion - * nodem - right ascension of ascending node - * - * outputs : - * em - eccentricity - * argpm - argument of perigee - * inclm - inclination - * mm - mean anomaly - * nm - mean motion - * nodem - right ascension of ascending node - * irez - flag for resonance 0-none, 1-one day, 2-half day - * atime - - * d2201, d2211, d3210, d3222, d4410, d4422, d5220, d5232, d5421, d5433 - - * dedt - - * didt - - * dmdt - - * dndt - - * dnodt - - * domdt - - * del1, del2, del3 - - * ses , sghl , sghs , sgs , shl , shs , sis , sls - * theta - - * xfact - - * xlamo - - * xli - - * xni - * - * locals : - * ainv2 - - * aonv - - * cosisq - - * eoc - - * f220, f221, f311, f321, f322, f330, f441, f442, f522, f523, f542, f543 - - * g200, g201, g211, g300, g310, g322, g410, g422, g520, g521, g532, g533 - - * sini2 - - * temp - - * temp1 - - * theta - - * xno2 - - * - * coupling : - * getgravconst - * - * references : - * hoots, roehrich, norad spacetrack report #3 1980 - * hoots, norad spacetrack report #6 1986 - * hoots, schumacher and glover 2004 - * vallado, crawford, hujsak, kelso 2006 - ----------------------------------------------------------------------------*/ - - var cosim = dsinitParameters.cosim, - emsq = dsinitParameters.emsq, - argpo = dsinitParameters.argpo, - - s1 = dsinitParameters.s1, - s2 = dsinitParameters.s2, - s3 = dsinitParameters.s3, - s4 = dsinitParameters.s4, - s5 = dsinitParameters.s5, - sinim = dsinitParameters.sinim, - - ss1 = dsinitParameters.ss1, - ss2 = dsinitParameters.ss2, - ss3 = dsinitParameters.ss3, - ss4 = dsinitParameters.ss4, - ss5 = dsinitParameters.ss5, - - sz1 = dsinitParameters.sz1, - sz3 = dsinitParameters.sz3, - sz11 = dsinitParameters.sz11, - sz13 = dsinitParameters.sz13, - sz21 = dsinitParameters.sz21, - sz23 = dsinitParameters.sz23, - sz31 = dsinitParameters.sz31, - sz33 = dsinitParameters.sz33, - - t = dsinitParameters.t, - tc = dsinitParameters.tc, - gsto = dsinitParameters.gsto, - - mo = dsinitParameters.mo, - mdot = dsinitParameters.mdot, - no = dsinitParameters.no, - nodeo = dsinitParameters.nodeo, - nodedot = dsinitParameters.nodedot, - - xpidot = dsinitParameters.xpidot, - - z1 = dsinitParameters.z1, - z3 = dsinitParameters.z3, - z11 = dsinitParameters.z11, - z13 = dsinitParameters.z13, - z21 = dsinitParameters.z21, - z23 = dsinitParameters.z23, - z31 = dsinitParameters.z31, - z33 = dsinitParameters.z33, - - ecco = dsinitParameters.ecco, - eccsq = dsinitParameters.eccsq, - em = dsinitParameters.em, - - argpm = dsinitParameters.argpm, - inclm = dsinitParameters.inclm, - mm = dsinitParameters.mm, - nm = dsinitParameters.nm, - nodem = dsinitParameters.nodem, - irez = dsinitParameters.irez, - atime = dsinitParameters.atime, - - d2201 = dsinitParameters.d2201, - d2211 = dsinitParameters.d2211, - d3210 = dsinitParameters.d3210, - d3222 = dsinitParameters.d3222, - d4410 = dsinitParameters.d4410, - d4422 = dsinitParameters.d4422, - - d5220 = dsinitParameters.d5220, - d5232 = dsinitParameters.d5232, - d5421 = dsinitParameters.d5421, - d5433 = dsinitParameters.d5433, - - dedt = dsinitParameters.dedt, - didt = dsinitParameters.didt, - dmdt = dsinitParameters.dmdt, - dnodt = dsinitParameters.dnodt, - domdt = dsinitParameters.domdt, - - del1 = dsinitParameters.del1, - del2 = dsinitParameters.del2, - del3 = dsinitParameters.del3, - - xfact = dsinitParameters.xfact, - xlamo = dsinitParameters.xlamo, - xli = dsinitParameters.xli, - xni = dsinitParameters.xni; - - var f220, f221, f311, f321, f322, f330, f441, f442, f522, f523, f542, f543; - var g200, g201, g211, g300, g310, g322, g410, g422, g520, g521, g532, g533; - var sini2, temp, temp1, theta, xno2, - ainv2, aonv, cosisq, eoc; - - var q22 = 1.7891679e-6; - var q31 = 2.1460748e-6; - var q33 = 2.2123015e-7; - var root22 = 1.7891679e-6; - var root44 = 7.3636953e-9; - var root54 = 2.1765803e-9; - var rptim = 4.37526908801129966e-3; // equates to 7.29211514668855e-5 rad/sec - var root32 = 3.7393792e-7; - var root52 = 1.1428639e-7; - var x2o3 = 2.0 / 3.0; - var znl = 1.5835218e-4; - var zns = 1.19459e-5; - - - // -------------------- deep space initialization ------------ - irez = 0; - if (0.0034906585 < nm < 0.0052359877){ - irez = 1; - } - if (8.26e-3 <= nm <= 9.24e-3 && em >= 0.5){ - irez = 2; - } - - // ------------------------ do solar terms ------------------- - var ses = ss1 * zns * ss5; - var sis = ss2 * zns * (sz11 + sz13); - var sls = -zns * ss3 * (sz1 + sz3 - 14.0 - 6.0 * emsq); - var sghs= ss4 * zns * (sz31 + sz33 - 6.0); - var shs = -zns * ss2 * (sz21 + sz23); - - // sgp4fix for 180 deg incl - if (inclm < 5.2359877e-2 || inclm > constants.pi - 5.2359877e-2){ - shs = 0.0; - } - if (sinim !== 0.0){ - shs = shs / sinim; - } - var sgs = sghs - cosim * shs; - - // ------------------------- do lunar terms ------------------ - dedt = ses + s1 * znl * s5; - didt = sis + s2 * znl * (z11 + z13); - dmdt = sls - znl * s3 * (z1 + z3 - 14.0 - 6.0 * emsq); - var sghl = s4 * znl * (z31 + z33 - 6.0); - var shll = -znl * s2 * (z21 + z23); - // sgp4fix for 180 deg incl - if ((inclm < 5.2359877e-2) || (inclm > (constants.pi - 5.2359877e-2))){ - shll = 0.0; - } - domdt = sgs + sghl; - dnodt = shs; - if (sinim !== 0.0){ - domdt = domdt - cosim / sinim * shll; - dnodt = dnodt + shll / sinim; - } - - - // ----------- calculate deep space resonance effects -------- - var dndt = 0.0; - theta = (gsto + tc * rptim) % constants.twoPi; - em = em + dedt * t; - inclm = inclm + didt * t; - argpm = argpm + domdt * t; - nodem = nodem + dnodt * t; - mm = mm + dmdt * t; - - // sgp4fix for negative inclinations - // the following if statement should be commented out - //if (inclm < 0.0) - // { - // inclm = -inclm; - // argpm = argpm - pi; - // nodem = nodem + pi; - // } - - - // -------------- initialize the resonance terms ------------- - if (irez !== 0) { - aonv = Math.pow(nm / constants.xke, x2o3); - // ---------- geopotential resonance for 12 hour orbits ------ - if (irez === 2) { - cosisq = cosim * cosim; - var emo= em; - em = ecco; - var emsqo = emsq; - emsq = eccsq; - eoc = em * emsq; - g201 = -0.306 - (em - 0.64) * 0.440; - - if (em <= 0.65){ - g211 = 3.616 - 13.2470 * em + 16.2900 * emsq; - g310 = -19.302 + 117.3900 * em - 228.4190 * emsq + 156.5910 * eoc; - g322 = -18.9068 + 109.7927 * em - 214.6334 * emsq + 146.5816 * eoc; - g410 = -41.122 + 242.6940 * em - 471.0940 * emsq + 313.9530 * eoc; - g422 = -146.407 + 841.8800 * em - 1629.014 * emsq + 1083.4350 * eoc; - g520 = -532.114 + 3017.977 * em - 5740.032 * emsq + 3708.2760 * eoc; - } - else { - g211 = -72.099 + 331.819 * em - 508.738 * emsq + 266.724 * eoc; - g310 = -346.844 + 1582.851 * em - 2415.925 * emsq + 1246.113 * eoc; - g322 = -342.585 + 1554.908 * em - 2366.899 * emsq + 1215.972 * eoc; - g410 = -1052.797 + 4758.686 * em - 7193.992 * emsq + 3651.957 * eoc; - g422 = -3581.690 + 16178.110 * em - 24462.770 * emsq + 12422.520 * eoc; - if (em > 0.715) { - g520 =-5149.66 + 29936.92 * em - 54087.36 * emsq + 31324.56 * eoc; - } - else { - g520 = 1464.74 - 4664.75 * em + 3763.64 * emsq; - } - } - if (em < 0.7) { - g533 = -919.22770 + 4988.6100 * em - 9064.7700 * emsq + 5542.21 * eoc; - g521 = -822.71072 + 4568.6173 * em - 8491.4146 * emsq + 5337.524 * eoc; - g532 = -853.66600 + 4690.2500 * em - 8624.7700 * emsq + 5341.4 * eoc; - } - else{ - g533 =-37995.780 + 161616.52 * em - 229838.20 * emsq + 109377.94 * eoc; - g521 =-51752.104 + 218913.95 * em - 309468.16 * emsq + 146349.42 * eoc; - g532 =-40023.880 + 170470.89 * em - 242699.48 * emsq + 115605.82 * eoc; - } - sini2 = sinim * sinim; - f220 = 0.75 * (1.0 + 2.0 * cosim+cosisq); - f221 = 1.5 * sini2; - f321 = 1.875 * sinim * (1.0 - 2.0 * cosim - 3.0 * cosisq); - f322 = -1.875 * sinim * (1.0 + 2.0 * cosim - 3.0 * cosisq); - f441 = 35.0 * sini2 * f220; - f442 = 39.3750 * sini2 * sini2; - f522 = 9.84375 * sinim * (sini2 * (1.0 - 2.0 * cosim- 5.0 * cosisq) + - 0.33333333 * (-2.0 + 4.0 * cosim + 6.0 * cosisq) ); - f523 = sinim * (4.92187512 * sini2 * (-2.0 - 4.0 * cosim + - 10.0 * cosisq) + 6.56250012 * (1.0+2.0 * cosim - 3.0 * cosisq)); - f542 = 29.53125 * sinim * (2.0 - 8.0 * cosim + cosisq * - (-12.0 + 8.0 * cosim + 10.0 * cosisq)); - f543 = 29.53125 * sinim * (-2.0 - 8.0 * cosim+cosisq * - ( 12.0 + 8.0 * cosim - 10.0 * cosisq)); - - xno2 = nm * nm; - ainv2 = aonv * aonv; - temp1 = 3.0 * xno2 * ainv2; - temp = temp1 * root22; - d2201 = temp * f220 * g201; - d2211 = temp * f221 * g211; - temp1 = temp1 * aonv; - temp = temp1 * root32; - d3210 = temp * f321 * g310; - d3222 = temp * f322 * g322; - temp1 = temp1 * aonv; - temp = 2.0 * temp1 * root44; - d4410 = temp * f441 * g410; - d4422 = temp * f442 * g422; - temp1 = temp1 * aonv; - temp = temp1 * root52; - d5220 = temp * f522 * g520; - d5232 = temp * f523 * g532; - temp = 2.0 * temp1 * root54; - d5421 = temp * f542 * g521; - d5433 = temp * f543 * g533; - xlamo = (mo + nodeo + nodeo - theta - theta) % constants.twoPi; - xfact = mdot + dmdt + 2.0 * (nodedot + dnodt - rptim) - no; - em = emo; - emsq = emsqo; - } - // ---------------- synchronous resonance terms -------------- - if (irez === 1) { - g200 = 1.0 + emsq * (-2.5 + 0.8125 * emsq); - g310 = 1.0 + 2.0 * emsq; - g300 = 1.0 + emsq * (-6.0 + 6.60937 * emsq); - f220 = 0.75 * (1.0 + cosim) * (1.0 + cosim); - f311 = 0.9375 * sinim * sinim * (1.0 + 3.0 * cosim) - 0.75 * (1.0 + cosim); - f330 = 1.0 + cosim; - f330 = 1.875 * f330 * f330 * f330; - del1 = 3.0 * nm * nm * aonv * aonv; - del2 = 2.0 * del1 * f220 * g200 * q22; - del3 = 3.0 * del1 * f330 * g300 * q33 * aonv; - del1 = del1 * f311 * g310 * q31 * aonv; - xlamo = (mo + nodeo + argpo - theta) % constants.twoPi; - xfact = mdot + xpidot - rptim + dmdt + domdt + dnodt - no; - } - // ------------ for sgp4, initialize the integrator ---------- - xli = xlamo; - xni = no; - atime = 0.0; - nm = no + dndt; - } - var dsinitResults = { - em : em, - argpm : argpm, - inclm : inclm, - mm : mm, - nm : nm, - nodem : nodem, - - irez : irez, - atime : atime, - - d2201 : d2201, - d2211 : d2211, - d3210 : d3210, - d3222 : d3222, - d4410 : d4410, - - d4422 : d4422, - d5220 : d5220, - d5232 : d5232, - d5421 : d5421, - d5433 : d5433, - - dedt : dedt, - didt : didt, - dmdt : dmdt, - dndt : dndt, - dnodt : dnodt, - domdt : domdt, - - del1 : del1, - del2 : del2, - del3 : del3, - - xfact : xfact, - xlamo : xlamo, - xli : xli, - xni : xni - }; - return dsinitResults; - }; -}); -/* - * satellite-js v1.2 - * (c) 2013 Shashwat Kandadai and UCSC - * https://github.com/shashwatak/satellite-js - * License: MIT - */ - -define('initl',[ - './constants', - './gstime/gstime' -], function( - constants, - gstime -) { - 'use strict'; - - return function (initlParameters) { - /*----------------------------------------------------------------------------- - * - * procedure initl - * - * this procedure initializes the spg4 propagator. all the initialization is - * consolidated here instead of having multiple loops inside other routines. - * - * author : david vallado 719-573-2600 28 jun 2005 - * - * inputs : - * ecco - eccentricity 0.0 - 1.0 - * epoch - epoch time in days from jan 0, 1950. 0 hr - * inclo - inclination of satellite - * no - mean motion of satellite - * satn - satellite number - * - * outputs : - * ainv - 1.0 / a - * ao - semi major axis - * con41 - - * con42 - 1.0 - 5.0 cos(i) - * cosio - cosine of inclination - * cosio2 - cosio squared - * eccsq - eccentricity squared - * method - flag for deep space 'd', 'n' - * omeosq - 1.0 - ecco * ecco - * posq - semi-parameter squared - * rp - radius of perigee - * rteosq - square root of (1.0 - ecco*ecco) - * sinio - sine of inclination - * gsto - gst at time of observation rad - * no - mean motion of satellite - * - * locals : - * ak - - * d1 - - * del - - * adel - - * po - - * - * coupling : - * getgravconst - * gstime - find greenwich sidereal time from the julian date - * - * references : - * hoots, roehrich, norad spacetrack report #3 1980 - * hoots, norad spacetrack report #6 1986 - * hoots, schumacher and glover 2004 - * vallado, crawford, hujsak, kelso 2006 - ----------------------------------------------------------------------------*/ - - // TODO: defined but never used - //var satn = initlParameters.satn; - - var ecco = initlParameters.ecco, - epoch = initlParameters.epoch, - inclo = initlParameters.inclo, - no = initlParameters.no, - method = initlParameters.method, - opsmode = initlParameters.opsmode; - - var ak, d1, adel, po, gsto; - - // TODO: defined but never used - // var del; - - // sgp4fix use old way of finding gst - // ----------------------- earth constants ---------------------- - // sgp4fix identify constants and allow alternate values - - // ------------- calculate auxillary epoch quantities ---------- - var eccsq = ecco * ecco; - var omeosq = 1.0 - eccsq; - var rteosq = Math.sqrt(omeosq); - var cosio = Math.cos(inclo); - var cosio2 = cosio * cosio; - - // ------------------ un-kozai the mean motion ----------------- - ak = Math.pow(constants.xke / no, constants.x2o3); - d1 = 0.75 * constants.j2 * (3.0 * cosio2 - 1.0) / (rteosq * omeosq); - var delPrime = d1 / (ak * ak); - adel = ak * (1.0 - delPrime * delPrime - delPrime * - (1.0 / 3.0 + 134.0 * delPrime * delPrime / 81.0)); - delPrime = d1 / (adel * adel); - no = no / (1.0 + delPrime); - - var ao = Math.pow(constants.xke / no, constants.x2o3); - var sinio = Math.sin(inclo); - po = ao * omeosq; - var con42 = 1.0 - 5.0 * cosio2; - var con41 = -con42 - cosio2 - cosio2; - var ainv = 1.0 / ao; - var posq = po * po; - var rp = ao * (1.0 - ecco); - method = 'n'; - - // sgp4fix modern approach to finding sidereal time - if (opsmode === 'a') { - // sgp4fix use old way of finding gst - // count integer number of days from 0 jan 1970 - var ts70 = epoch - 7305.0; - var ds70 = Math.floor(ts70 + 1.0e-8); - var tfrac = ts70 - ds70; - // find greenwich location at epoch - var c1 = 1.72027916940703639e-2; - var thgr70 = 1.7321343856509374; - var fk5r = 5.07551419432269442e-15; - var c1p2p = c1 + constants.twoPi; - gsto = ( thgr70 + c1 * ds70 + c1p2p * tfrac + ts70 * ts70 * fk5r) % constants.twoPi; - if (gsto < 0.0) { - gsto = gsto + constants.twoPi; - } - } - else { - gsto = gstime(epoch + 2433281.5); - } - - var initlResults = { - no: no, - - method: method, - - ainv: ainv, - ao: ao, - con41: con41, - con42: con42, - cosio: cosio, - - cosio2: cosio2, - eccsq: eccsq, - omeosq: omeosq, - posq: posq, - - rp: rp, - rteosq: rteosq, - sinio: sinio, - gsto: gsto - }; - return initlResults; - }; -}); -/* - * satellite-js v1.2 - * (c) 2013 Shashwat Kandadai and UCSC - * https://github.com/shashwatak/satellite-js - * License: MIT - */ - -define('sgp4init',[ - './constants', - './dpper', - './dscom', - './dsinit', - './initl', - './sgp4' -], function( - constants, - dpper, - dscom, - dsinit, - initl, - sgp4 -) { - 'use strict'; - - return function(satrec, sgp4initParameters) { - /*----------------------------------------------------------------------------- - * - * procedure sgp4init - * - * this procedure initializes variables for sgp4. - * - * author : david vallado 719-573-2600 28 jun 2005 - * - * inputs : - * opsmode - mode of operation afspc or improved 'a', 'i' - * satn - satellite number - * bstar - sgp4 type drag coefficient kg/m2er - * ecco - eccentricity - * epoch - epoch time in days from jan 0, 1950. 0 hr - * argpo - argument of perigee (output if ds) - * inclo - inclination - * mo - mean anomaly (output if ds) - * no - mean motion - * nodeo - right ascension of ascending node - * - * outputs : - * satrec - common values for subsequent calls - * return code - non-zero on error. - * 1 - mean elements, ecc >= 1.0 or ecc < -0.001 or a < 0.95 er - * 2 - mean motion less than 0.0 - * 3 - pert elements, ecc < 0.0 or ecc > 1.0 - * 4 - semi-latus rectum < 0.0 - * 5 - epoch elements are sub-orbital - * 6 - satellite has decayed - * - * locals : - * cnodm , snodm , cosim , sinim , cosomm , sinomm - * cc1sq , cc2 , cc3 - * coef , coef1 - * cosio4 - - * day - - * dndt - - * em - eccentricity - * emsq - eccentricity squared - * eeta - - * etasq - - * gam - - * argpm - argument of perigee - * nodem - - * inclm - inclination - * mm - mean anomaly - * nm - mean motion - * perige - perigee - * pinvsq - - * psisq - - * qzms24 - - * rtemsq - - * s1, s2, s3, s4, s5, s6, s7 - - * sfour - - * ss1, ss2, ss3, ss4, ss5, ss6, ss7 - - * sz1, sz2, sz3 - * sz11, sz12, sz13, sz21, sz22, sz23, sz31, sz32, sz33 - - * tc - - * temp - - * temp1, temp2, temp3 - - * tsi - - * xpidot - - * xhdot1 - - * z1, z2, z3 - - * z11, z12, z13, z21, z22, z23, z31, z32, z33 - - * - * coupling : - * getgravconst- - * initl - - * dscom - - * dpper - - * dsinit - - * sgp4 - - * - * references : - * hoots, roehrich, norad spacetrack report #3 1980 - * hoots, norad spacetrack report #6 1986 - * hoots, schumacher and glover 2004 - * vallado, crawford, hujsak, kelso 2006 - ----------------------------------------------------------------------------*/ - - var opsmode = sgp4initParameters.opsmode, - satn = sgp4initParameters.satn, - epoch = sgp4initParameters.epoch, - - xbstar = sgp4initParameters.xbstar, - xecco = sgp4initParameters.xecco, - xargpo = sgp4initParameters.xargpo, - - xinclo = sgp4initParameters.xinclo, - xmo = sgp4initParameters.xmo, - xno = sgp4initParameters.xno, - - xnodeo = sgp4initParameters.xnodeo; - - - var cnodm, snodm, cosim, sinim, cosomm, sinomm, - cc1sq, cc2, cc3, coef, coef1, cosio4, - day, dndt, - em, emsq, eeta, etasq, gam, - argpm, nodem, inclm, mm, nm, - perige, pinvsq, psisq, qzms24, rtemsq, - s1, s2, s3, s4, s5, s6, s7, sfour, - ss1,ss2, ss3, ss4, ss5, ss6, ss7, - sz1, sz2, sz3, - sz11, sz12, sz13, sz21, sz22, sz23, sz31, sz32, sz33, - tc, temp, temp1, temp2, temp3, temp4, tsi, - xpidot, xhdot1, - z1, z2, z3, - z11, z12, z13, z21, z22, z23, z31, z32, z33; - /* ------------------------ initialization --------------------- */ - // sgp4fix divisor for divide by zero check on inclination - // the old check used 1.0 + Math.cos(pi-1.0e-9), but then compared it to - // 1.5 e-12, so the threshold was changed to 1.5e-12 for consistency - - temp4 = 1.5e-12; - - // ----------- set all near earth variables to zero ------------ - satrec.isimp = 0; satrec.method = 'n'; satrec.aycof = 0.0; - satrec.con41 = 0.0; satrec.cc1 = 0.0; satrec.cc4 = 0.0; - satrec.cc5 = 0.0; satrec.d2 = 0.0; satrec.d3 = 0.0; - satrec.d4 = 0.0; satrec.delmo = 0.0; satrec.eta = 0.0; - satrec.argpdot = 0.0; satrec.omgcof = 0.0; satrec.sinmao = 0.0; - satrec.t = 0.0; satrec.t2cof = 0.0; satrec.t3cof = 0.0; - satrec.t4cof = 0.0; satrec.t5cof = 0.0; satrec.x1mth2 = 0.0; - satrec.x7thm1 = 0.0; satrec.mdot = 0.0; satrec.nodedot = 0.0; - satrec.xlcof = 0.0; satrec.xmcof = 0.0; satrec.nodecf = 0.0; - - // ----------- set all deep space variables to zero ------------ - satrec.irez = 0; satrec.d2201 = 0.0; satrec.d2211 = 0.0; - satrec.d3210 = 0.0; satrec.d3222 = 0.0; satrec.d4410 = 0.0; - satrec.d4422 = 0.0; satrec.d5220 = 0.0; satrec.d5232 = 0.0; - satrec.d5421 = 0.0; satrec.d5433 = 0.0; satrec.dedt = 0.0; - satrec.del1 = 0.0; satrec.del2 = 0.0; satrec.del3 = 0.0; - satrec.didt = 0.0; satrec.dmdt = 0.0; satrec.dnodt = 0.0; - satrec.domdt = 0.0; satrec.e3 = 0.0; satrec.ee2 = 0.0; - satrec.peo = 0.0; satrec.pgho = 0.0; satrec.pho = 0.0; - satrec.pinco = 0.0; satrec.plo = 0.0; satrec.se2 = 0.0; - satrec.se3 = 0.0; satrec.sgh2 = 0.0; satrec.sgh3 = 0.0; - satrec.sgh4 = 0.0; satrec.sh2 = 0.0; satrec.sh3 = 0.0; - satrec.si2 = 0.0; satrec.si3 = 0.0; satrec.sl2 = 0.0; - satrec.sl3 = 0.0; satrec.sl4 = 0.0; satrec.gsto = 0.0; - satrec.xfact = 0.0; satrec.xgh2 = 0.0; satrec.xgh3 = 0.0; - satrec.xgh4 = 0.0; satrec.xh2 = 0.0; satrec.xh3 = 0.0; - satrec.xi2 = 0.0; satrec.xi3 = 0.0; satrec.xl2 = 0.0; - satrec.xl3 = 0.0; satrec.xl4 = 0.0; satrec.xlamo = 0.0; - satrec.zmol = 0.0; satrec.zmos = 0.0; satrec.atime = 0.0; - satrec.xli = 0.0; satrec.xni = 0.0; - - - // sgp4fix - note the following variables are also passed directly via satrec. - // it is possible to streamline the sgp4init call by deleting the "x" - // variables, but the user would need to set the satrec.* values first. we - // include the additional assignments in case twoline2rv is not used. - - satrec.bstar = xbstar; - satrec.ecco = xecco; - satrec.argpo = xargpo; - satrec.inclo = xinclo; - satrec.mo = xmo; - satrec.no = xno; - satrec.nodeo = xnodeo; - - // sgp4fix add opsmode - satrec.operationmode = opsmode; - - // ------------------------ earth constants ----------------------- - // sgp4fix identify constants and allow alternate values - - - var ss = 78.0 / constants.earthRadius + 1.0; - // sgp4fix use multiply for speed instead of pow - var qzms2ttemp = (120.0 - 78.0) / constants.earthRadius; - var qzms2t = qzms2ttemp * qzms2ttemp * qzms2ttemp * qzms2ttemp; - var x2o3 = 2.0 / 3.0; - - satrec.init = 'y'; - satrec.t = 0.0; - - var initlParameters = { - satn : satn, - ecco : satrec.ecco, - - epoch : epoch, - inclo : satrec.inclo, - no : satrec.no, - - method : satrec.method, - opsmode : satrec.operationmode - }; - - var initlResult= initl(initlParameters); - - satrec.no = initlResult.no; - - // TODO: defined but never used - //var method = initlResult.method; - //var ainv = initlResult.ainv; - - var ao = initlResult.ao; - satrec.con41 = initlResult.con41; - var con42 = initlResult.con42; - var cosio = initlResult.cosio; - var cosio2 = initlResult.cosio2; - var eccsq = initlResult.eccsq; - var omeosq = initlResult.omeosq; - var posq = initlResult.posq; - var rp = initlResult.rp; - var rteosq = initlResult.rteosq; - var sinio = initlResult.sinio; - satrec.gsto = initlResult.gsto; - - satrec.error = 0; - - // sgp4fix remove this check as it is unnecessary - // the mrt check in sgp4 handles decaying satellite cases even if the starting - // condition is below the surface of te earth - // if (rp < 1.0) - // { - // printf("// *** satn%d epoch elts sub-orbital ***\n", satn); - // satrec.error = 5; - // } - - - if (omeosq >= 0.0 || satrec.no >= 0.0){ - satrec.isimp = 0; - if (rp < 220.0 / constants.earthRadius + 1.0){ - satrec.isimp = 1; - } - sfour = ss; - qzms24 = qzms2t; - perige = (rp - 1.0) * constants.earthRadius; - - // - for perigees below 156 km, s and qoms2t are altered - - if (perige < 156.0){ - sfour = perige - 78.0; - if (perige < 98.0){ - sfour = 20.0; - } - // sgp4fix use multiply for speed instead of pow - var qzms24temp = (120.0 - sfour) / constants.earthRadius; - qzms24 = qzms24temp * qzms24temp * qzms24temp * qzms24temp; - sfour = sfour / constants.earthRadius + 1.0; - } - pinvsq = 1.0 / posq; - - tsi = 1.0 / (ao - sfour); - satrec.eta = ao * satrec.ecco * tsi; - etasq = satrec.eta * satrec.eta; - eeta = satrec.ecco * satrec.eta; - psisq = Math.abs(1.0 - etasq); - coef = qzms24 * Math.pow(tsi, 4.0); - coef1 = coef / Math.pow(psisq, 3.5); - cc2 = coef1 * satrec.no * (ao * (1.0 + 1.5 * etasq + eeta * - (4.0 + etasq)) + 0.375 * constants.j2 * tsi / psisq * satrec.con41 * - (8.0 + 3.0 * etasq * (8.0 + etasq))); - satrec.cc1 = satrec.bstar * cc2; - cc3 = 0.0; - if (satrec.ecco > 1.0e-4) { - cc3 = -2.0 * coef * tsi * constants.j3oj2 * satrec.no * sinio / satrec.ecco; - } - satrec.x1mth2 = 1.0 - cosio2; - satrec.cc4 = 2.0 * satrec.no * coef1 * ao * omeosq * - (satrec.eta * (2.0 + 0.5 * etasq) + satrec.ecco * - (0.5 + 2.0 * etasq) - constants.j2 * tsi / (ao * psisq) * - (-3.0 * satrec.con41 * (1.0 - 2.0 * eeta + etasq * - (1.5 - 0.5 * eeta)) + 0.75 * satrec.x1mth2 * - (2.0 * etasq - eeta * (1.0 + etasq)) * Math.cos(2.0 * satrec.argpo))); - satrec.cc5 = 2.0 * coef1 * ao * omeosq * (1.0 + 2.75 * - (etasq + eeta) + eeta * etasq); - cosio4 = cosio2 * cosio2; - temp1 = 1.5 * constants.j2 * pinvsq * satrec.no; - temp2 = 0.5 * temp1 * constants.j2 * pinvsq; - temp3 = -0.46875 * constants.j4 * pinvsq * pinvsq * satrec.no; - satrec.mdot = satrec.no + 0.5 * temp1 * rteosq * satrec.con41 + 0.0625 * - temp2 * rteosq * (13.0 - 78.0 * cosio2 + 137.0 * cosio4); - satrec.argpdot = (-0.5 * temp1 * con42 + 0.0625 * temp2 * - (7.0 - 114.0 * cosio2 + 395.0 * cosio4) + - temp3 * (3.0 - 36.0 * cosio2 + 49.0 * cosio4)); - xhdot1 = -temp1 * cosio; - satrec.nodedot = xhdot1 + (0.5 * temp2 * (4.0 - 19.0 * cosio2) + - 2.0 * temp3 * (3.0 - 7.0 * cosio2)) * cosio; - xpidot = satrec.argpdot+ satrec.nodedot; - satrec.omgcof = satrec.bstar * cc3 * Math.cos(satrec.argpo); - satrec.xmcof = 0.0; - if (satrec.ecco > 1.0e-4) { - satrec.xmcof = -x2o3 * coef * satrec.bstar / eeta; - } - satrec.nodecf = 3.5 * omeosq * xhdot1 * satrec.cc1; - satrec.t2cof = 1.5 * satrec.cc1; - // sgp4fix for divide by zero with xinco = 180 deg - if (Math.abs(cosio+1.0) > 1.5e-12){ - satrec.xlcof = -0.25 * constants.j3oj2 * sinio * (3.0 + 5.0 * cosio) / (1.0 + cosio); - } - else{ - satrec.xlcof = -0.25 * constants.j3oj2 * sinio * (3.0 + 5.0 * cosio) / temp4; - } - satrec.aycof = -0.5 * constants.j3oj2 * sinio; - // sgp4fix use multiply for speed instead of pow - var delmotemp = 1.0 + satrec.eta * Math.cos(satrec.mo); - satrec.delmo = delmotemp * delmotemp * delmotemp; - satrec.sinmao = Math.sin(satrec.mo); - satrec.x7thm1 = 7.0 * cosio2 - 1.0; - - // --------------- deep space initialization ------------- - if (2*constants.pi / satrec.no >= 225.0){ - satrec.method = 'd'; - satrec.isimp = 1; - tc = 0.0; - inclm = satrec.inclo; - - var dscomParameters = { - epoch : epoch, - ep : satrec.ecco, - argpp : satrec.argpo, - tc : tc, - inclp : satrec.inclo, - nodep : satrec.nodeo, - - np : satrec.no, - - e3 : satrec.e3, - ee2 : satrec.ee2, - - peo : satrec.peo, - pgho : satrec.pgho, - pho : satrec.pho, - pinco : satrec.pinco, - - plo : satrec.plo, - se2 : satrec.se2, - se3 : satrec.se3, - - sgh2 : satrec.sgh2, - sgh3 : satrec.sgh3, - sgh4 : satrec.sgh4, - - sh2 : satrec.sh2, - sh3 : satrec.sh3, - si2 : satrec.si2, - si3 : satrec.si3, - - sl2 : satrec.sl2, - sl3 : satrec.sl3, - sl4 : satrec.sl4, - - xgh2 : satrec.xgh2, - xgh3 : satrec.xgh3, - xgh4 : satrec.xgh4, - xh2 : satrec.xh2, - - xh3 : satrec.xh3, - xi2 : satrec.xi2, - xi3 : satrec.xi3, - xl2 : satrec.xl2, - - xl3 : satrec.xl3, - xl4 : satrec.xl4, - - zmol : satrec.zmol, - zmos : satrec.zmos - }; - - var dscomResult = dscom(dscomParameters); - - snodm = dscomResult.snodm; - cnodm = dscomResult.cnodm; - sinim = dscomResult.sinim; - cosim = dscomResult.cosim; - sinomm = dscomResult.sinomm; - - cosomm = dscomResult.cosomm; - day = dscomResult.day; - satrec.e3 = dscomResult.e3; - satrec.ee2 = dscomResult.ee2; - em = dscomResult.em; - - emsq = dscomResult.emsq; - gam = dscomResult.gam; - satrec.peo = dscomResult.peo; - satrec.pgho = dscomResult.pgho; - satrec.pho = dscomResult.pho; - - satrec.pinco = dscomResult.pinco; - satrec.plo = dscomResult.plo; - rtemsq = dscomResult.rtemsq; - satrec.se2 = dscomResult.se2; - satrec.se3 = dscomResult.se3; - - satrec.sgh2 = dscomResult.sgh2; - satrec.sgh3 = dscomResult.sgh3; - satrec.sgh4 = dscomResult.sgh4; - satrec.sh2 = dscomResult.sh2; - satrec.sh3 = dscomResult.sh3; - - satrec.si2 = dscomResult.si2; - satrec.si3 = dscomResult.si3; - satrec.sl2 = dscomResult.sl2; - satrec.sl3 = dscomResult.sl3; - satrec.sl4 = dscomResult.sl4; - - s1 = dscomResult.s1; - s2 = dscomResult.s2; - s3 = dscomResult.s3; - s4 = dscomResult.s4; - s5 = dscomResult.s5; - - s6 = dscomResult.s6; - s7 = dscomResult.s7; - ss1 = dscomResult.ss1; - ss2 = dscomResult.ss2; - ss3 = dscomResult.ss3; - - ss4 = dscomResult.ss4; - ss5 = dscomResult.ss5; - ss6 = dscomResult.ss6; - ss7 = dscomResult.ss7; - sz1 = dscomResult.sz1; - - sz2 = dscomResult.sz2; - sz3 = dscomResult.sz3; - sz11 = dscomResult.sz11; - sz12 = dscomResult.sz12; - sz13 = dscomResult.sz13; - - sz21 = dscomResult.sz21; - sz22 = dscomResult.sz22; - sz23 = dscomResult.sz23; - sz31 = dscomResult.sz31; - sz32 = dscomResult.sz32; - - sz33 = dscomResult.sz33; - satrec.xgh2 = dscomResult.xgh2; - satrec.xgh3 = dscomResult.xgh3; - satrec.xgh4 = dscomResult.xgh4; - satrec.xh2 = dscomResult.xh2; - - satrec.xh3 = dscomResult.xh3; - satrec.xi2 = dscomResult.xi2; - satrec.xi3 = dscomResult.xi3; - satrec.xl2 = dscomResult.xl2; - satrec.xl3 = dscomResult.xl3; - - satrec.xl4 = dscomResult.xl4; - nm = dscomResult.nm; - z1 = dscomResult.z1; - z2 = dscomResult.z2; - z3 = dscomResult.z3; - - z11 = dscomResult.z11; - z12 = dscomResult.z12; - z13 = dscomResult.z13; - z21 = dscomResult.z21; - z22 = dscomResult.z22; - - z23 = dscomResult.z23; - z31 = dscomResult.z31; - z32 = dscomResult.z32; - z33 = dscomResult.z33; - satrec.zmol = dscomResult.zmol; - satrec.zmos = dscomResult.zmos; - - var dpperParameters = { - inclo : inclm, - init : satrec.init, - ep : satrec.ecco, - inclp : satrec.inclo, - nodep : satrec.nodeo, - argpp : satrec.argpo, - mp : satrec.mo, - opsmode : satrec.operationmode - }; - - var dpperResult = dpper(satrec, dpperParameters); - - satrec.ecco = dpperResult.ep; - satrec.inclo = dpperResult.inclp; - satrec.nodeo = dpperResult.nodep; - satrec.argpo = dpperResult.argpp; - satrec.mo = dpperResult.mp; - - argpm = 0.0; - nodem = 0.0; - mm = 0.0; - - var dsinitParameters = { - cosim : cosim, - emsq : emsq, - argpo : satrec.argpo, - s1 : s1, - s2 : s2, - s3 : s3, - s4 : s4, - s5 : s5, - sinim : sinim, - ss1 : ss1, - ss2 : ss2, - ss3 : ss3, - ss4 : ss4, - ss5 : ss5, - sz1 : sz1, - sz3 : sz3, - sz11 : sz11, - sz13 : sz13, - sz21 : sz21, - sz23 : sz23, - sz31 : sz31, - sz33 : sz33, - t : satrec.t, - tc : tc, - gsto : satrec.gsto, - mo : satrec.mo, - mdot : satrec.mdot, - no : satrec.no, - nodeo : satrec.nodeo, - nodedot : satrec.nodedot, - xpidot : xpidot, - z1 : z1, - z3 : z3, - z11 : z11, - z13 : z13, - z21 : z21, - z23 : z23, - z31 : z31, - z33 : z33, - ecco : satrec.ecco, - eccsq : eccsq, - em : em, - argpm : argpm, - inclm : inclm, - mm : mm, - nm : nm, - nodem : nodem, - irez : satrec.irez, - atime : satrec.atime, - d2201 : satrec.d2201, - d2211 : satrec.d2211, - d3210 : satrec.d3210, - d3222 : satrec.d3222 , - d4410 : satrec.d4410, - d4422 : satrec.d4422, - d5220 : satrec.d5220, - d5232 : satrec.d5232, - d5421 : satrec.d5421, - d5433 : satrec.d5433, - dedt : satrec.dedt, - didt : satrec.didt, - dmdt : satrec.dmdt, - dnodt : satrec.dnodt, - domdt : satrec.domdt, - del1 : satrec.del1, - del2 : satrec.del2, - del3 : satrec.del3, - xfact : satrec.xfact, - xlamo : satrec.xlamo, - xli : satrec.xli, - xni : satrec.xni - }; - - var dsinitResult = dsinit( dsinitParameters ); - - em = dsinitResult.em; - argpm = dsinitResult.argpm; - inclm = dsinitResult.inclm; - mm = dsinitResult.mm; - nm = dsinitResult.nm; - - nodem = dsinitResult.nodem; - satrec.irez = dsinitResult.irez; - satrec.atime = dsinitResult.atime; - satrec.d2201 = dsinitResult.d2201; - satrec.d2211 = dsinitResult.d2211; - - satrec.d3210 = dsinitResult.d3210; - satrec.d3222 = dsinitResult.d3222; - satrec.d4410 = dsinitResult.d4410; - satrec.d4422 = dsinitResult.d4422; - satrec.d5220 = dsinitResult.d5220; - - satrec.d5232 = dsinitResult.d5232; - satrec.d5421 = dsinitResult.d5421; - satrec.d5433 = dsinitResult.d5433; - satrec.dedt = dsinitResult.dedt; - satrec.didt = dsinitResult.didt; - - satrec.dmdt = dsinitResult.dmdt; - dndt = dsinitResult.dndt; - satrec.dnodt = dsinitResult.dnodt; - satrec.domdt = dsinitResult.domdt; - satrec.del1 = dsinitResult.del1; - - satrec.del2 = dsinitResult.del2; - satrec.del3 = dsinitResult.del3; - satrec.xfact = dsinitResult.xfact; - satrec.xlamo = dsinitResult.xlamo; - satrec.xli = dsinitResult.xli; - - satrec.xni = dsinitResult.xni; - } - - //----------- set variables if not deep space ----------- - if (satrec.isimp !== 1){ - cc1sq = satrec.cc1 * satrec.cc1; - satrec.d2 = 4.0 * ao * tsi * cc1sq; - temp = satrec.d2 * tsi * satrec.cc1 / 3.0; - satrec.d3 = (17.0 * ao + sfour) * temp; - satrec.d4 = 0.5 * temp * ao * tsi * (221.0 * ao + 31.0 * sfour) * satrec.cc1; - satrec.t3cof= satrec.d2 + 2.0 * cc1sq; - satrec.t4cof= 0.25 * (3.0 * satrec.d3 + satrec.cc1 * - (12.0 * satrec.d2 + 10.0 * cc1sq)); - satrec.t5cof= 0.2 * (3.0 * satrec.d4 + - 12.0 * satrec.cc1 * satrec.d3 + - 6.0 * satrec.d2 * satrec.d2 + - 15.0 * cc1sq * (2.0 * satrec.d2 + cc1sq)); - } - - - /* finally propogate to zero epoch to initialize all others. */ - // sgp4fix take out check to let satellites process until they are actually below earth surface - // if(satrec.error == 0) - } - sgp4(satrec, 0.0); - - satrec.init = 'n'; - - // sgp4fix return boolean. satrec.error contains any error codes - return true; - }; -}); -/* - * satellite-js v1.2 - * (c) 2013 Shashwat Kandadai and UCSC - * https://github.com/shashwatak/satellite-js - * License: MIT - */ - -define('propagate/twoline2satrec',[ - '../constants', - '../gstime/days2mdhms', - '../gstime/jday', - '../sgp4init' -], function( - constants, - days2mdhms, - jday, - sgp4init -) { - 'use strict'; - - return function twoline2rv(longstr1, longstr2){ - /*Return a Satellite imported from two lines of TLE data. - - Provide the two TLE lines as strings `longstr1` and `longstr2`, - and select which standard set of gravitational constants you want - by providing `gravity_constants`: - - `sgp4.propagation.wgs72` - Standard WGS 72 model - `sgp4.propagation.wgs84` - More recent WGS 84 model - `sgp4.propagation.wgs72old` - Legacy support for old SGP4 behavior - - Normally, computations are made using various recent improvements - to the algorithm. If you want to turn some of these off and go - back into "afspc" mode, then set `afspc_mode` to `True`. */ - - var opsmode = 'i'; - var xpdotp = 1440.0 / (2.0 *constants.pi); // 229.1831180523293; - var revnum = 0; - var elnum = 0; - var year = 0; - - var satrec = {}; - satrec.error = 0; - - // TODO: defined but never used - //var cardnumb = parseInt(longstr1.substring(0, 1), 10); - - satrec.satnum = longstr1.substring(2, 7); - - // TODO: defined but never used - //var classification = longstr1.substring(7, 8); - //var intldesg = longstr1.substring(9, 11); - - satrec.epochyr = parseInt(longstr1.substring(18, 20), 10); - satrec.epochdays = parseFloat(longstr1.substring(20, 32)); - satrec.ndot = parseFloat(longstr1.substring(33, 43)); - satrec.nddot = parseFloat( - '.' + parseInt(longstr1.substring(44, 50), 10) + - 'E' + longstr1.substring(50, 52) - ); - satrec.bstar = parseFloat( - longstr1.substring(53, 54) + - '.' + parseInt(longstr1.substring(54, 59), 10) + - 'E' + longstr1.substring(59, 61) - ); - - // TODO: defined but never used - //var numb = parseInt(longstr1.substring(62, 63), 10); - - elnum = parseInt(longstr1.substring(64, 68), 10); - - //satrec.satnum = longstr2.substring(2, 7); - satrec.inclo = parseFloat(longstr2.substring(8, 16)); - satrec.nodeo = parseFloat(longstr2.substring(17, 25)); - satrec.ecco = parseFloat('.' + longstr2.substring(26, 33)); - satrec.argpo = parseFloat(longstr2.substring(34, 42)); - satrec.mo = parseFloat(longstr2.substring(43, 51)); - satrec.no = parseFloat(longstr2.substring(52, 63)); - revnum = parseFloat(longstr2.substring(63, 68)); - - - // ---- find no, ndot, nddot ---- - satrec.no = satrec.no / xpdotp; // rad/min - //satrec.nddot= satrec.nddot * Math.pow(10.0, nexp); - //satrec.bstar= satrec.bstar * Math.pow(10.0, ibexp); - - // ---- convert to sgp4 units ---- - satrec.a = Math.pow( satrec.no*constants.tumin , (-2.0/3.0) ); - satrec.ndot = satrec.ndot / (xpdotp*1440.0); // ? * minperday - satrec.nddot= satrec.nddot / (xpdotp*1440.0*1440); - - // ---- find standard orbital elements ---- - satrec.inclo = satrec.inclo * constants.deg2rad; - satrec.nodeo = satrec.nodeo * constants.deg2rad; - satrec.argpo = satrec.argpo * constants.deg2rad; - satrec.mo = satrec.mo * constants.deg2rad; - - satrec.alta = satrec.a*(1.0 + satrec.ecco) - 1.0; - satrec.altp = satrec.a*(1.0 - satrec.ecco) - 1.0; - - - // ---------------------------------------------------------------- - // find sgp4epoch time of element set - // remember that sgp4 uses units of days from 0 jan 1950 (sgp4epoch) - // and minutes from the epoch (time) - // ---------------------------------------------------------------- - - // ---------------- temp fix for years from 1957-2056 ------------------- - // --------- correct fix will occur when year is 4-digit in tle --------- - - if (satrec.epochyr < 57){ - year = satrec.epochyr + 2000; - } - else{ - year = satrec.epochyr + 1900; - } - - - var mdhmsResult = days2mdhms(year, satrec.epochdays); - var mon = mdhmsResult.mon; - var day = mdhmsResult.day; - var hr = mdhmsResult.hr; - var minute = mdhmsResult.minute; - var sec = mdhmsResult.sec; - satrec.jdsatepoch = jday(year, mon, day, hr, minute, sec); - - // ---------------- initialize the orbit at sgp4epoch ------------------- - var sgp4initParameters = { - opsmode : opsmode, - satn : satrec.satnum, - epoch : satrec.jdsatepoch-2433281.5, - xbstar : satrec.bstar, - - xecco : satrec.ecco, - xargpo : satrec.argpo, - xinclo : satrec.inclo, - xmo : satrec.mo, - xno : satrec.no, - - xnodeo : satrec.nodeo - }; - - sgp4init(satrec, sgp4initParameters ); - - return satrec; - }; -}); -define('satellite',[ - './constants', - './coordinate-transforms/degrees-lat', - './coordinate-transforms/degrees-long', - './coordinate-transforms/ecf-to-eci', - './coordinate-transforms/ecf-to-look-angles', - './coordinate-transforms/eci-to-ecf', - './coordinate-transforms/eci-to-geodetic', - './coordinate-transforms/geodetic-to-ecf', - './coordinate-transforms/topocentric', - './coordinate-transforms/topocentric-to-look-angles', - './doppler-factor', - './gstime/days2mdhms', - './gstime/gstime', - './gstime/jday', - './propagate/propagate', - './propagate/twoline2satrec', - './sgp4' -], function( - constants, - degreesLat, - degreesLong, - ecfToEci, - ecfToLookAngles, - eciToEcf, - eciToGeodetic, - geodeticToEcf, - topocentric, - topocentricToLookAngles, - dopplerFactor, - days2mdhms, - gstime, - jday, - propagate, - twoline2satrec, - sgp4 -) { - 'use strict'; - - return { - version: '1.2.0', - constants: constants, - - // Coordinate transforms - degreesLat: degreesLat, - degreesLong: degreesLong, - eciToEcf: eciToEcf, - ecfToEci: ecfToEci, - eciToGeodetic: eciToGeodetic, - ecfToLookAngles: ecfToLookAngles, - geodeticToEcf: geodeticToEcf, - - dopplerFactor: dopplerFactor, - gstimeFromJday: gstime, - gstimeFromDate: function(year, mon, day, hr, minute, sec) { - return gstime(jday(year, mon, day, hr, minute, sec)); - }, - propagate: propagate, - twoline2satrec: twoline2satrec, - sgp4: sgp4 - }; -}); - return require('satellite'); -})); -//# sourceMappingURL=satellite.js.map From f2ba6b44aac400589f273b067b877e2e6c821556 Mon Sep 17 00:00:00 2001 From: Andrew Cantino Date: Thu, 31 Oct 2019 15:40:21 -0700 Subject: [PATCH 3/4] Add a basic test --- jspredict.test.js | 19 +++++++++++++++++++ package.json | 6 ++++++ 2 files changed, 25 insertions(+) create mode 100644 jspredict.test.js diff --git a/jspredict.test.js b/jspredict.test.js new file mode 100644 index 0000000..97b764c --- /dev/null +++ b/jspredict.test.js @@ -0,0 +1,19 @@ +const jspredict = require('./jspredict'); + +describe('transits', () => { + test('it computes predictable transits', () => { + const tle = '0 LEMUR-2 JEROEN\n1 40934U 15052E 15306.10048119 .00001740 00000-0 15647-3 0 9990\n2 40934 6.0033 141.2190 0010344 133.6141 226.4604 14.76056230 5130'; + const qth = [15, 130, .1]; + const transits = jspredict.transits(tle, qth, 1446516345242, 1446545135046, 2, 4); + + // From the README. + const firstTransit = transits[0]; + expect(firstTransit.start).toBeCloseTo(1446519623929.2715); + expect(firstTransit.end).toBeCloseTo(1446520436786.1265); + expect(firstTransit.maxElevation).toBeCloseTo(26.592307317708105); + expect(firstTransit.apexAzimuth).toBeCloseTo(173.4489444396936); + expect(firstTransit.maxAzimuth).toBeCloseTo(244.2708297009277); + expect(firstTransit.minAzimuth).toBeCloseTo(108.07476128814044); + expect(firstTransit.duration).toBeCloseTo(812856.8549804688); + }); +}); diff --git a/package.json b/package.json index 5a3ece0..8940a06 100644 --- a/package.json +++ b/package.json @@ -32,5 +32,11 @@ "dependencies": { "moment": "^2.24.0", "satellite.js": "^3.0.1" + }, + "devDependencies": { + "jest": "^24.9.0" + }, + "scripts": { + "test": "jest" } } From 0360832664f87f54d39726bb11d84308f2e70de2 Mon Sep 17 00:00:00 2001 From: Andrew Cantino Date: Thu, 31 Oct 2019 15:58:08 -0700 Subject: [PATCH 4/4] Ignore geostationary transits to prevent infinite loops --- jspredict.js | 5 ++++- jspredict.test.js | 11 ++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/jspredict.js b/jspredict.js index 305ae83..4dabb19 100644 --- a/jspredict.js +++ b/jspredict.js @@ -148,13 +148,16 @@ var iterations = 0; while (iterations < max_iterations && transits.length < maxTransits) { - transit = this._quickPredict(satrec, qth, time); + let transit = this._quickPredict(satrec, qth, time); if (!transit) { break; } if (transit.end > end.valueOf()) { break; } + if (transit.end === 0) { // Geostationary + break; + } if (transit.end > start.valueOf() && transit.maxElevation > minElevation) { transits.push(transit); } diff --git a/jspredict.test.js b/jspredict.test.js index 97b764c..f7f53be 100644 --- a/jspredict.test.js +++ b/jspredict.test.js @@ -2,7 +2,7 @@ const jspredict = require('./jspredict'); describe('transits', () => { test('it computes predictable transits', () => { - const tle = '0 LEMUR-2 JEROEN\n1 40934U 15052E 15306.10048119 .00001740 00000-0 15647-3 0 9990\n2 40934 6.0033 141.2190 0010344 133.6141 226.4604 14.76056230 5130'; + const tle = "0 LEMUR-2 JEROEN\n1 40934U 15052E 15306.10048119 .00001740 00000-0 15647-3 0 9990\n2 40934 6.0033 141.2190 0010344 133.6141 226.4604 14.76056230 5130"; const qth = [15, 130, .1]; const transits = jspredict.transits(tle, qth, 1446516345242, 1446545135046, 2, 4); @@ -16,4 +16,13 @@ describe('transits', () => { expect(firstTransit.minAzimuth).toBeCloseTo(108.07476128814044); expect(firstTransit.duration).toBeCloseTo(812856.8549804688); }); + + test('it returns no transits for geostationary satellites', () => { + // INTELSAT 39 on Oct 31, 2019 + // https://www.n2yo.com/satellite/?s=44476 + const tle = "INTELSAT 39\n1 44476U 19049B 19304.31021668 .00000022 00000-0 00000+0 0 9995\n2 44476 0.0018 233.4327 0000272 5.2638 334.3170 1.00274937 908"; + const qth = [20.5937, 78.9629, 0.840]; + const transits = jspredict.transits(tle, qth, 1572562039000, 1572568039000, 2, 4); + expect(transits).toStrictEqual([]); + }); });