159 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						||
 | 
						||
Object.defineProperty(exports, '__esModule', { value: true });
 | 
						||
 | 
						||
var base = require('./base.cjs');
 | 
						||
var coord = require('./coord.cjs');
 | 
						||
var illum = require('./illum.cjs');
 | 
						||
var nutation = require('./nutation.cjs');
 | 
						||
var planetposition = require('./planetposition.cjs');
 | 
						||
 | 
						||
/**
 | 
						||
 * @copyright 2013 Sonia Keys
 | 
						||
 * @copyright 2016 commenthol
 | 
						||
 * @license MIT
 | 
						||
 * @module mars
 | 
						||
 */
 | 
						||
 | 
						||
/**
 | 
						||
 * Physical computes quantities for physical observations of Mars.
 | 
						||
 *
 | 
						||
 * Results:
 | 
						||
 *  DE  planetocentric declination of the Earth.
 | 
						||
 *  DS  planetocentric declination of the Sun.
 | 
						||
 *  ω   Areographic longitude of the central meridian, as seen from Earth.
 | 
						||
 *  P   Geocentric position angle of Mars' northern rotation pole.
 | 
						||
 *  Q   Position angle of greatest defect of illumination.
 | 
						||
 *  d   Apparent diameter of Mars.
 | 
						||
 *  k   Illuminated fraction of the disk.
 | 
						||
 *  q   Greatest defect of illumination.
 | 
						||
 *
 | 
						||
 * All angular results (all results except k) are in radians.
 | 
						||
 *
 | 
						||
 * @param {number} jde - Julian ephemeris day
 | 
						||
 * @param {Planet} earth
 | 
						||
 * @param {Planet} mars
 | 
						||
 */
 | 
						||
function physical (jde, earth, mars) { // (jde float64, earth, mars *pp.V87Planet)  (DE, DS, ω, P, Q, d, k, q float64)
 | 
						||
  // Step 1.0
 | 
						||
  const T = base["default"].J2000Century(jde);
 | 
						||
  const p = Math.PI / 180;
 | 
						||
  // (42.1) p. 288
 | 
						||
  let λ0 = 352.9065 * p + 1.1733 * p * T;
 | 
						||
  const β0 = 63.2818 * p - 0.00394 * p * T;
 | 
						||
  // Step 2.0
 | 
						||
  const earthPos = earth.position(jde);
 | 
						||
  const R = earthPos.range;
 | 
						||
  const fk5 = planetposition["default"].toFK5(earthPos.lon, earthPos.lat, jde);
 | 
						||
  const [l0, b0] = [fk5.lon, fk5.lat];
 | 
						||
  // Steps 3, 4.0
 | 
						||
  const [sl0, cl0] = base["default"].sincos(l0);
 | 
						||
  const sb0 = Math.sin(b0);
 | 
						||
  let Δ = 0.5; // surely better than 0.0
 | 
						||
  let τ = base["default"].lightTime(Δ);
 | 
						||
  let l = 0;
 | 
						||
  let b = 0;
 | 
						||
  let r = 0;
 | 
						||
  let x = 0;
 | 
						||
  let y = 0;
 | 
						||
  let z = 0;
 | 
						||
 | 
						||
  function f () {
 | 
						||
    const marsPos = mars.position(jde - τ);
 | 
						||
    r = marsPos.range;
 | 
						||
    const fk5 = planetposition["default"].toFK5(marsPos.lon, marsPos.lat, jde);
 | 
						||
    l = fk5.lon;
 | 
						||
    b = fk5.lat;
 | 
						||
    const [sb, cb] = base["default"].sincos(b);
 | 
						||
    const [sl, cl] = base["default"].sincos(l);
 | 
						||
    // (42.2) p. 289
 | 
						||
    x = r * cb * cl - R * cl0;
 | 
						||
    y = r * cb * sl - R * sl0;
 | 
						||
    z = r * sb - R * sb0;
 | 
						||
    // (42.3) p. 289
 | 
						||
    Δ = Math.sqrt(x * x + y * y + z * z);
 | 
						||
    τ = base["default"].lightTime(Δ);
 | 
						||
  }
 | 
						||
 | 
						||
  f();
 | 
						||
  f();
 | 
						||
  // Step 5.0
 | 
						||
  let λ = Math.atan2(y, x);
 | 
						||
  let β = Math.atan(z / Math.hypot(x, y));
 | 
						||
  // Step 6.0
 | 
						||
  const [sβ0, cβ0] = base["default"].sincos(β0);
 | 
						||
  const [sβ, cβ] = base["default"].sincos(β);
 | 
						||
  const DE = Math.asin(-sβ0 * sβ - cβ0 * cβ * Math.cos(λ0 - λ));
 | 
						||
  // Step 7.0
 | 
						||
  const N = 49.5581 * p + 0.7721 * p * T;
 | 
						||
  const lʹ = l - 0.00697 * p / r;
 | 
						||
  const bʹ = b - 0.000225 * p * Math.cos(l - N) / r;
 | 
						||
  // Step 8.0
 | 
						||
  const [sbʹ, cbʹ] = base["default"].sincos(bʹ);
 | 
						||
  const DS = Math.asin(-sβ0 * sbʹ - cβ0 * cbʹ * Math.cos(λ0 - lʹ));
 | 
						||
  // Step 9.0
 | 
						||
  const W = 11.504 * p + 350.89200025 * p * (jde - τ - 2433282.5);
 | 
						||
  // Step 10.0
 | 
						||
  const ε0 = nutation["default"].meanObliquity(jde);
 | 
						||
  const [sε0, cε0] = base["default"].sincos(ε0);
 | 
						||
  let eq = new coord["default"].Ecliptic(λ0, β0).toEquatorial(ε0);
 | 
						||
  const [α0, δ0] = [eq.ra, eq.dec];
 | 
						||
  // Step 11.0
 | 
						||
  const u = y * cε0 - z * sε0;
 | 
						||
  const v = y * sε0 + z * cε0;
 | 
						||
  const α = Math.atan2(u, x);
 | 
						||
  const δ = Math.atan(v / Math.hypot(x, u));
 | 
						||
  const [sδ, cδ] = base["default"].sincos(δ);
 | 
						||
  const [sδ0, cδ0] = base["default"].sincos(δ0);
 | 
						||
  const [sα0α, cα0α] = base["default"].sincos(α0 - α);
 | 
						||
  const ζ = Math.atan2(sδ0 * cδ * cα0α - sδ * cδ0, cδ * sα0α);
 | 
						||
  // Step 12.0
 | 
						||
  const ω = base["default"].pmod(W - ζ, 2 * Math.PI);
 | 
						||
  // Step 13.0
 | 
						||
  const [Δψ, Δε] = nutation["default"].nutation(jde);
 | 
						||
  // Step 14.0
 | 
						||
  const [sl0λ, cl0λ] = base["default"].sincos(l0 - λ);
 | 
						||
  λ += 0.005693 * p * cl0λ / cβ;
 | 
						||
  β += 0.005693 * p * sl0λ * sβ;
 | 
						||
  // Step 15.0
 | 
						||
  λ0 += Δψ;
 | 
						||
  λ += Δψ;
 | 
						||
  const ε = ε0 + Δε;
 | 
						||
  // Step 16.0
 | 
						||
  const [sε, cε] = base["default"].sincos(ε);
 | 
						||
  eq = new coord["default"].Ecliptic(λ0, β0).toEquatorial(ε);
 | 
						||
  const [α0ʹ, δ0ʹ] = [eq.ra, eq.dec];
 | 
						||
  eq = new coord["default"].Ecliptic(λ, β).toEquatorial(ε);
 | 
						||
  const [αʹ, δʹ] = [eq.ra, eq.dec];
 | 
						||
  // Step 17.0
 | 
						||
  const [sδ0ʹ, cδ0ʹ] = base["default"].sincos(δ0ʹ);
 | 
						||
  const [sδʹ, cδʹ] = base["default"].sincos(δʹ);
 | 
						||
  const [sα0ʹαʹ, cα0ʹαʹ] = base["default"].sincos(α0ʹ - αʹ);
 | 
						||
  // (42.4) p. 290
 | 
						||
  let P = Math.atan2(cδ0ʹ * sα0ʹαʹ, sδ0ʹ * cδʹ - cδ0ʹ * sδʹ * cα0ʹαʹ);
 | 
						||
  if (P < 0) {
 | 
						||
    P += 2 * Math.PI;
 | 
						||
  }
 | 
						||
  // Step 18.0
 | 
						||
  const s = l0 + Math.PI;
 | 
						||
  const [ss, cs] = base["default"].sincos(s);
 | 
						||
  const αs = Math.atan2(cε * ss, cs);
 | 
						||
  const δs = Math.asin(sε * ss);
 | 
						||
  const [sδs, cδs] = base["default"].sincos(δs);
 | 
						||
  const [sαsα, cαsα] = base["default"].sincos(αs - α);
 | 
						||
  const χ = Math.atan2(cδs * sαsα, sδs * cδ - cδs * sδ * cαsα);
 | 
						||
  const Q = χ + Math.PI;
 | 
						||
  // Step 19.0
 | 
						||
  const d = 9.36 / 60 / 60 * Math.PI / 180 / Δ;
 | 
						||
  const k = illum["default"].fraction(r, Δ, R);
 | 
						||
  const q = (1 - k) * d;
 | 
						||
  return [DE, DS, ω, P, Q, d, k, q]
 | 
						||
}
 | 
						||
 | 
						||
var mars = {
 | 
						||
  physical
 | 
						||
};
 | 
						||
 | 
						||
exports["default"] = mars;
 | 
						||
exports.physical = physical;
 |