lunar function
({double gamma, double jmax, double mag, double rho, double sdPartial, double sdPenumbral, double sdTotal, double sigma, int type})
lunar(
- double year
Lunar eclipse nearest decimal year.
Returns eclipse type, jmax, gamma, rho, sigma, magnitude, and semidurations (total, partial, penumbral) in days.
Implementation
({int type, double jmax, double gamma, double rho, double sigma, double mag,
double sdTotal, double sdPartial, double sdPenumbral})
lunar(double year) {
final r = _g(_snap(year, 0.5), moonphase.meanFull(year), -0.4065, 0.1727);
if (!r.eclipse) {
return (type: none, jmax: 0, gamma: 0, rho: 0, sigma: 0, mag: 0,
sdTotal: 0, sdPartial: 0, sdPenumbral: 0);
}
final rho = 1.2848 + r.u;
final sigma = 0.7403 - r.u;
final aGamma = r.gamma.abs();
var mag = (1.0128 - r.u - aGamma) / 0.545;
int eclType;
if (mag > 1) {
eclType = total;
} else if (mag > 0) {
eclType = umbral;
} else {
mag = (1.5573 + r.u - aGamma) / 0.545;
if (mag < 0) {
return (type: none, jmax: r.jmax, gamma: r.gamma, rho: rho, sigma: sigma,
mag: 0, sdTotal: 0, sdPartial: 0, sdPenumbral: 0);
}
eclType = penumbral;
}
final p = 1.0128 - r.u;
final t = 0.4678 - r.u;
final n = 0.5458 + 0.04 * math.cos(r.mPrime);
final g2 = r.gamma * r.gamma;
final sdTotal = eclType == total
? math.sqrt(t * t - g2) / n / 24
: 0.0;
final sdPartial = (eclType == total || eclType == umbral)
? math.sqrt(p * p - g2) / n / 24
: 0.0;
final h = 1.5573 + r.u;
final sdPenumbral = math.sqrt(h * h - g2) / n / 24;
return (type: eclType, jmax: r.jmax, gamma: r.gamma, rho: rho, sigma: sigma,
mag: mag, sdTotal: sdTotal, sdPartial: sdPartial, sdPenumbral: sdPenumbral);
}