/*****************************************************************************\
 * DarkCalCalc
\*****************************************************************************/

package com.mhuss.AstroLib;

//import java.io.*;

/**
 * A class to calculate and store DarkCal data, and optionally
 * cache the data to a file.
 */
public class DarkCalCalc {
  private DarkCalCalc() {}

 /**
  * Constructor
  *
  * @param dci Month, year, and observer location to use
  * @param ignoreDst true to ignore Daylight time
  */
  public DarkCalCalc(DarkCalInput dci, boolean ignoreDst) {
    calc(dci, ignoreDst);
  }

  DarkCalData dcd;

  //----------------------------------------------------------------------------
  // figure out the darkest hours for day (i) & put into dark[i]
  //
  private void findDark(int i) {
    if ( i > DarkCalData.DAYS-2 ) {
      System.err.println("illegal index");
      return;
    }

    double a_ = dcd.astTwi[i].b;
    double b_ = dcd.astTwi[i+1].a;

    dcd.dark[i] = new TimePair(a_,b_);

    // define day + time vars to deal with 'yesterday' and 'tomorrow'
    double darkStart = dcd.astTwi[i].b + i;
    double darkEnd = dcd.astTwi[i+1].a + (i+1);

    double moonRise;
    if ( dcd.moonRS2[i].a < 0. || dcd.moonRS2[i].b > dcd.moonRS2[i].a) {
        moonRise = dcd.moonRS2[i+1].a + (i+1);
        dcd.moonRS2[i].a = dcd.moonRS2[i+1].a;
    }
    else
        moonRise = dcd.moonRS2[i].a + i;

    double moonSet;
    if ( dcd.moonRS2[i].b < 0. || dcd.moonRS2[i].a > dcd.moonRS2[i].b ) {
      moonSet = dcd.moonRS2[i+1].b + (i+1);
      dcd.moonRS2[i].b = dcd.moonRS2[i+1].b;
    }
    else
      moonSet = dcd.moonRS2[i].b + i;

    // check moon rise & set
    if (moonSet > darkStart && moonSet < darkEnd) {
      darkStart = moonSet;
      dcd.dark[i].a = dcd.moonRS2[i].b;
    }
    if (moonRise > darkStart && moonRise < darkEnd ) {
      darkEnd = moonRise;
      dcd.dark[i].b = dcd.moonRS2[i].a;
    }

    dcd.noDarkness[i] = (moonRise < darkStart && moonSet > darkEnd );
  }

  //----------------------------------------------------------------------------
 /**
  * Calculate all the data using the given input
  *
  * @param dci Month, year, and observer location to use
  * @param ingnoreDst true to ignore Daylight time
  */
  void calc(DarkCalInput dci, boolean ignoreDst)
  {
    dcd = new DarkCalData(dci, ignoreDst);
    // calc. start and end days
    //
    dcd.jdStart = DateOps.dmyToDay( 1, dci.month, dci.year );
    dcd.jdEnd = ( dci.month < 12 ) ?
        DateOps.dmyToDay( 1, dci.month + 1, dci.year ) :
        DateOps.dmyToDay( 1, 1, dci.year + 1 );

    int end = (int)(dcd.jdEnd - dcd.jdStart);

    // fill in data for month in question
    //

    double tzAdj = (double)dci.tz * Astro.DAYS_PER_HOUR;
    dcd.dstStart = DateOps.dstStart( dci.year );
    dcd.dstEnd = DateOps.dstEnd( dci.year );
    PlanetData pd = new PlanetData();
    ObsInfo oi = new ObsInfo( new Latitude(dci.lat), new Longitude(dci.lon), dci.tz );

    for( int i=0; i<=end+1; i++ ) {
      long day = dcd.jdStart + i;

      // automatically adjust for DST if enabled
      // This 'rough' method will be off by one on moon rise/set between
      //   midnight and 2:00 on "clock change" days. (sun & astTwi never
      //   occur at these times.)
      //
      double dstAdj =
          ( false == ignoreDst && day>=dcd.dstStart && day 

Ads help maintain this website.