/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.cepmuvakkit.conversion.phaseEvents;
import com.cepmuvakkit.times.posAlgo.Ecliptic;
import com.cepmuvakkit.times.posAlgo.LunarPosition;
import com.cepmuvakkit.times.posAlgo.SolarPosition;
public class MoonPhases {
private SolarPosition solar;
private LunarPosition lunar;
private Ecliptic moonPos, solarPos;
public MoonPhases() {
solar = new SolarPosition();
lunar = new LunarPosition();
}
/**
* searchPhaseEvent the Goal function for search of phase events [-180, 180]
* Difference between the longitude of the Moon from the Sun and the nominal
* value for a given phase (New Moon 0, First Quarter 90, New Crescent 8,
* First Quarter 90, Full Moon 180, Last Quarter 270)
*
* @param jd Julian Day
* @param ΔT parameter delta-T (ΔT)
* @param phase the calculated Moon Phase [in degrees] New Moon=0 New
* Crescent=8 First Quarter=90 Full Moon=180 Last Quarter=270
* @return Difference between the longitude of the Moon from the Sun and the
* nominal value for a given phase (New Moon 0, First Quarter 90,
* etc.)
*/
public double searchPhaseEvent(double jd, double ΔT, int phase) {
double LongDiff, tau_Sun = 8.32 / (1440.0); // 8.32 min [cy]
moonPos = lunar.calculateMoonEclipticCoordinates(jd, ΔT);
solarPos = solar.calculateSunEclipticCoordinatesAstronomic(
jd - tau_Sun, ΔT);
LongDiff = moonPos.λ - solarPos.λ;
if (phase == 8)// Crescent Visibility at 8 degrees Angle
{
double elongation = Math.sqrt(LongDiff * LongDiff + moonPos.β
* moonPos.β);
// In case of Small angles of elongation lattitude is
// taken into root mean square due to accuracy
return phase - elongation;
}
return modulo((LongDiff - phase + 180), 360) - 180;
}
/**
* Modulo: calculates x mod y,
* <ul
* x mod y
* </ul>
*
* @param double x, double y
* @return reminder
*/
private double modulo(double x, double y) {
return y * frac(x / y);
}
/**
* Gives the fractional part of a number
*
* @param double x
* @return fractional part of a number
*/
private double frac(double x) {
return x - Math.floor(x);
}
}