solar function

({bool central, double gamma, double jmax, double mag, double p, int type, double u}) solar(
  1. double year
)

Solar eclipse nearest decimal year.

Returns eclipse type (none/partial/annular/annularTotal/total), whether central, jmax, gamma, u, penumbral cone radius, and magnitude.

Implementation

({int type, bool central, double jmax, double gamma, double u, double p, double mag})
    solar(double year) {
  final r = _g(_snap(year, 0), moonphase.meanNew(year), -0.4075, 0.1721);
  final penumbra = r.u + 0.5461;
  if (!r.eclipse) {
    return (type: none, central: false, jmax: 0, gamma: 0, u: 0, p: 0, mag: 0);
  }
  final aGamma = r.gamma.abs();
  if (aGamma > 1.5433 + r.u) {
    return (type: none, central: false, jmax: r.jmax, gamma: r.gamma, u: r.u, p: penumbra, mag: 0);
  }
  final central = aGamma < 0.9972;
  int eclType;
  double mag = 0;
  if (!central) {
    eclType = partial;
    if (aGamma < 1.026 && aGamma < 0.9972 + r.u.abs()) {
      eclType = total;
    }
  } else if (r.u < 0) {
    eclType = total;
  } else if (r.u > 0.0047) {
    eclType = annular;
  } else {
    final omega = 0.00464 * math.sqrt(1 - r.gamma * r.gamma);
    eclType = r.u < omega ? annularTotal : annular;
  }
  if (eclType == partial) {
    mag = (1.5433 + r.u - aGamma) / (0.5461 + 2 * r.u);
  }
  return (type: eclType, central: central, jmax: r.jmax, gamma: r.gamma, u: r.u, p: penumbra, mag: mag);
}