This commit is contained in:
2026-10-21 19:32:02 -04:00
commit b74d278c8e
96 changed files with 54476 additions and 0 deletions
+131
View File
@@ -0,0 +1,131 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.sunPos = sunPos;
var _constants = require("./constants");
////////////////////////////////////////////////////////////////////////////////////
/* Line by Line MATLAB-to-Javascript conversion of "sun.mat" from Vallado package */
////////////////////////////////////////////////////////////////////////////////////
/* -----------------------------------------------------------------------------
*
* function sunPos
*
* this function calculates the geocentric equatorial position vector
* the sun given the julian date. this is the low precision formula and
* is valid for years from 1950 to 2050. accuaracy of apparent coordinates
* is 0.01 degrees. notice many of the calculations are performed in
* degrees, and are not changed until later. this is due to the fact that
* the almanac uses degrees exclusively in their formulations.
*
* author : david vallado 719-573-2600 1 mar 2001
*
* inputs description range / units
* jd - julian date days from 4713 bc
*
* outputs :
* rsun - ijk position vector of the sun au
* rtasc - right ascension rad
* decl - declination rad
*
* coupling :
* -
*
* references :
* VALLADO, DAVID A. (2022) ‘Computer software in MATLAB’, in Fundamentals of astrodynamics and applications. 5th edn.
* Computer software in MATLAB: http://celestrak.org/software/vallado-sw.php
* --------------------------------------------------------------------------- */
function sunPos(jday) {
// ------------------------- implementation -----------------
// ------------------- initialize values --------------------
var tut1 = (jday - 2451545) / 36525;
var meanlong = (280.460 + 36000.77 * tut1) % 360; //deg
var ttdb = tut1; // is this declaration required instead of replacing `ttdb` with `tut1`
var meananomaly = (357.5277233 + 35999.05034 * ttdb * _constants.deg2rad) % _constants.twoPi; //rad
if (meananomaly < 0) {
meananomaly += _constants.twoPi;
}
var eclplong_raw = (meanlong + 1.914666471 * Math.sin(meananomaly) + 0.019994643 * Math.sin(2.0 * meananomaly)) % 360.0 * _constants.deg2rad; //rad
var obliquity = (23.439291 - 0.0130042 * ttdb) * _constants.deg2rad; //rad
// --------- find magnitude of sun vector, and it's components ------
var magr = 1.000140612 - 0.016708617 * Math.cos(meananomaly) - 0.000139589 * Math.cos(2.0 * meananomaly); // in au's
var rsun = [magr * Math.cos(eclplong_raw), magr * Math.cos(obliquity) * Math.sin(eclplong_raw), magr * Math.sin(obliquity) * Math.sin(eclplong_raw)];
var rtasc_raw = Math.atan(Math.cos(obliquity) * Math.tan(eclplong_raw));
// --- check that rtasc is in the same quadrant as eclplong_raw ----
var eclplong = eclplong_raw;
if (eclplong < 0.0) {
eclplong += _constants.twoPi; // make sure it's in 0 to 2pi range
}
var rtasc = rtasc_raw;
if (Math.abs(eclplong_raw - rtasc) > _constants.pi * 0.5) {
rtasc += 0.5 * _constants.pi * Math.round((eclplong_raw - rtasc_raw) / (0.5 * _constants.pi));
}
var decl = Math.asin(Math.sin(obliquity) * Math.sin(eclplong_raw));
return {
rsun: rsun,
rtasc: rtasc,
decl: decl
};
}
/* Original MATLAB code for Sun position from Vallado package (sun.mat) */
/*
function [rsun,rtasc,decl] = sun ( jd );
twopi = 2.0*pi;
deg2rad = pi/180.0;
show = 'n';
% ------------------------- implementation -----------------
% ------------------- initialize values --------------------
tut1= ( jd - 2451545.0 )/ 36525.0;
if show == 'y'
fprintf(1,'tut1 %14.9f \n',tut1);
end
meanlong= 280.460 + 36000.77*tut1;
meanlong= rem( meanlong,360.0 ); %deg
ttdb= tut1;
meananomaly= 357.5277233 + 35999.05034 *ttdb;
meananomaly= rem( meananomaly*deg2rad,twopi ); %rad
if ( meananomaly < 0.0 )
meananomaly= twopi + meananomaly;
end
eclplong_raw= meanlong + 1.914666471 *sin(meananomaly) ...
+ 0.019994643 *sin(2.0 *meananomaly); %deg
eclplong_raw= rem( eclplong_raw,360.0 ); %deg
obliquity= 23.439291 - 0.0130042 *ttdb; %deg
eclplong_raw = eclplong_raw *deg2rad;
obliquity= obliquity *deg2rad;
% --------- find magnitude of sun vector, ) components ------
magr= 1.000140612 - 0.016708617 *cos( meananomaly ) ...
- 0.000139589 *cos( 2.0 *meananomaly ); % in au's
rsun(1)= magr*cos( eclplong_raw );
rsun(2)= magr*cos(obliquity)*sin(eclplong_raw);
rsun(3)= magr*sin(obliquity)*sin(eclplong_raw);
if show == 'y'
fprintf(1,'meanlon %11.6f meanan %11.6f eclplon %11.6f obli %11.6f \n', ...
meanlong,meananomaly/deg2rad,eclplong_raw/deg2rad,obliquity/deg2rad);
fprintf(1,'rs %11.9f %11.9f %11.9f \n',rsun);
fprintf(1,'magr %14.7f \n',magr);
end
rtasc= atan( cos(obliquity)*tan(eclplong_raw) );
% --- check that rtasc is in the same quadrant as eclplong_raw ----
if ( eclplong_raw < 0.0 )
eclplong_raw= eclplong_raw + twopi; % make sure it's in 0 to 2pi range
end
if ( abs( eclplong_raw-rtasc ) > pi*0.5 )
rtasc= rtasc + 0.5 *pi*round( (eclplong_raw-rtasc)/(0.5 *pi));
end
decl = asin( sin(obliquity)*sin(eclplong_raw) );
*/