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,
  );
}