/*
File: MoonPert.java
University of Applied Science Berne,HTA-Biel/Bienne,
Computer Science Department.
Diploma thesis J3D Solar System Simulator
Originally written by Marcel Portner & Bernhard Hari (c) 2000
CVS - Information :
$Header: /var/cvsreps/projects/c450/2000/sss3d/source_diploma/sss3d/utils/astronomy/MoonPert.java,v 1.3 2000/12/13 13:42:48 portm Exp $
$Author: portm $
$Date: 2000/12/13 13:42:48 $
$State: Exp $
*/
package sss3d.utils.astronomy;
import sss3d.calculations.*;
import sss3d.calculations.constants.AstronomicalConstants;
/**
* This class add the permutation of the moon.
*
* @author Marcel Portner & Bernhard Hari
* @version $Revision: 1.3 $
*/
public class MoonPert {
private static final int O = 6; // Index-Versatz
private static final int DIM = 2 * O + 1; // Dimension eines Arbeits-Feldes
private double dgam; // Langperiodische Stoerung
private double dlam, ds, gam1C, sinPi, n; // Periodische Stoerungen
private double l0, l, ls, f, d; // Mittlere Argumente der Mondbahn
private double[][] mCos, mSin; // cos und sin d. mittleren Argumente
private double[] sincos;
/**
* Constructor
*/
public MoonPert() {
mCos = new double[DIM][4];
mSin = new double[DIM][4];
sincos = new double[2];
}
/**
* Initialization with the current time.
*
* @param time time in julianish century.
*/
public void init(double time) {
double dL0, dl, dls, dF, dD; // Langperiodische Stoerungen
double t2, arg, fac; // Hilfsgroessen
int max;
t2 = time * time; // Zeit
// Stoerungen auf Null setzen
dlam = 0.0;
ds = 0.0;
gam1C = 0.0;
sinPi = 3422.7000;
n = 0.0;
// Langperiodische Stoerungen
double s1 = sine(0.19833 + 0.05611 * time);
double s2 = sine(0.27869 + 0.04508 * time);
double s3 = sine(0.16827 - 0.36903 * time);
double s4 = sine(0.34734 - 5.37261 * time);
double s5 = sine(0.10498 - 5.37899 * time);
double s6 = sine(0.42681 - 0.41855 * time);
double s7 = sine(0.14943 - 5.37511 * time);
dL0 = 0.84 * s1 + 0.31 * s2 + 14.27 * s3 + 7.26 * s4 + 0.28 * s5 + 0.24 * s6;
dl = 2.94 * s1 + 0.31 * s2 + 14.27 * s3 + 9.34 * s4 + 1.12 * s5 + 0.83 * s6;
dls =-6.40 * s1 - 1.89 * s6;
dF = 0.21 * s1 + 0.31 * s2 + 14.27 * s3 - 88.70 * s4 - 15.30 * s5 +
0.24 * s6 - 1.86 * s7;
dD = dL0 - dls;
dgam = -3332e-9 * sine(0.59734-5.37261 * time)
- 539e-9 * sine(0.35498-5.37899 * time)
- 64e-9 * sine(0.39943-5.37511 * time);
// Mittlere Argumente der Mondbahn (inkl. langperiodische Korrekturen)
// L0 mittlere Laenge des Mondes
// l mittlere Anomalie des Mondes l' mittlere Anomalie der Sonne
// F mittlerer Knotenabstand D mittlere Elongation von der Sonne
l0 = MoreMath.PI2 * MoreMath.frac(0.60643382 + 1336.85522467 * time -
0.00000313 * t2) + dL0 / MoreMath.ARCS;
l = MoreMath.PI2 * MoreMath.frac(0.37489701 + 1325.55240982 * time +
0.00002565 * t2) + dl / MoreMath.ARCS;
ls = MoreMath.PI2 * MoreMath.frac(0.99312619 + 99.99735956 * time -
0.00000044 * t2) + dls / MoreMath.ARCS;
f = MoreMath.PI2 * MoreMath.frac(0.25909118 + 1342.22782980 * time -
0.00000892 * t2) + dF / MoreMath.ARCS;
d = MoreMath.PI2 * MoreMath.frac(0.82736186 + 1236.85308708 * time -
0.00000397 * t2) + dD / MoreMath.ARCS;
// Kosinus und Sinus von Vielfachen der mittleren Argumente
// einschliesslich saekularer Korrekturen
for(int i = 0; i <= 3; i++) {
switch(i) {
case 0: arg=l; max=4; fac=1.000002208; break;
case 1: arg=ls; max=3; fac=0.997504612 - 0.002495388 * time; break;
case 2: arg=f; max=4; fac=1.000002708 + 139.978 * dgam; break;
case 3: arg=d; max=6; fac=1.0; break;
default: arg=0.0;max=0; fac=0;
}
mCos[O][i] = 1.0;
mSin[O][i] = 0.0;
mCos[O+1][i] = StrictMath.cos(arg) * fac;
mSin[O+1][i] = StrictMath.sin(arg) * fac;
mCos[O-1][i] = +mCos[O+1][i];
mSin[O-1][i] = -mSin[O+1][i];
for(int j = 2; j <= max; j++) {
sincos = MoreMath.addThe(mCos[O+j-1][i],
mSin[O+j-1][i],
mCos[O+1][i],
mSin[O+1][i]);
mCos[O+j][i] = sincos[0];
mSin[O+j][i] = sincos[1];
mCos[O-j][i] = +mCos[O+j][i];
mSin[O-j][i] = -mSin[O+j][i];
}
}
}
/**
* Calculate the sinus and cosinus.
*
* @param p an int value.
* @param q an int value.
* @param r an int value.
* @param s an int value.
*
* @return a double array with the values:
* double[0] = cos(p*l+q*ls+r*F+s*D).
* double[1] = sin(p*l+q*ls+r*F+s*D).
*/
public double[] term(int p, int q, int r, int s) {
int[] i = new int[4];
i[0] = p;
i[1] = q;
i[2] = r;
i[3] = s;
sincos[0] = 1.0;
sincos[1] = 0.0;
for(int k = 0; k < i.length; k++) {
if(i[k] != 0) {
sincos = MoreMath.addThe(sincos[0],
sincos[1],
mCos[O+i[k]][k],
mSin[O+i[k]][k]);
}
}
return sincos;
}
/**
* Summation of solar interference term.
*
* @param coeffl an double value.
* @param coeffS an double value.
* @param coeffg an double value.
* @param coeffP an double value.
* @param p an int value.
* @param q an int value.
* @param r an int value.
* @param s an int value.
*/
public void addSol(double coeffl, double coeffS, double coeffg, double coeffP,
int p, int q, int r, int s) {
sincos = term(p, q, r, s);
dlam += coeffl * sincos[1];
ds += coeffS * sincos[1];
gam1C += coeffg * sincos[0];
sinPi += coeffP * sincos[0];
}
/**
* Summation of interference in the latitude.
*
* @param coeffN an double value.
* @param p an int value.
* @param q an int value.
* @param r an int value.
* @param s an int value.
*/
public void addN(double coeffN, int p, int q, int r, int s) {
sincos = term(p, q, r, s);
n += coeffN * sincos[1];
}
/**
* Interference in the ecliptical latitude by the venus and jupiter.
*
* @param time time in julianish century.
*/
public void planetary(double time) {
dlam += 0.82 * sine(0.7736 - 62.5512 * time) +
0.31 * sine(0.0466 - 125.1025 * time) +
0.35 * sine(0.5785 - 25.1042 * time) +
0.66 * sine(0.4591 + 1335.8075 * time) +
0.64 * sine(0.3130 - 91.5680 * time) +
1.14 * sine(0.1480 + 1331.2898 * time) +
0.21 * sine(0.5918 + 1056.5859 * time) +
0.44 * sine(0.5784 + 1322.8595 * time) +
0.24 * sine(0.2275 - 5.7374 * time) +
0.28 * sine(0.2965 + 2.6929 * time) +
0.33 * sine(0.3132 + 6.3368 * time);
}
/**
* Give the current lambda angle of the moon positon.
*
* @return the lambda value.
*/
public double lambda() {
return MoreMath.modulo(l0 + dlam / MoreMath.ARCS, MoreMath.PI2);
}
/**
* Give the current beta angle of the moon position.
*
* @return the lambda value.
*/
public double beta() {
double s = f + ds / MoreMath.ARCS;
double fac = 1.000002708 + 139.978 * dgam;
return (fac * (18518.511 + 1.189 + gam1C) * StrictMath.sin(s) -
6.24 * StrictMath.sin(3 * s) + n) / MoreMath.ARCS;
}
/**
* Give the current distance of the moon.
*
* @return the distance value.
*/
public double dist() {
return AstronomicalConstants.R_EARTH * MoreMath.ARCS / (sinPi * 0.999953253);
}
/**
* Calculate the sinus of a modified x.
*
* @return the result of this arithmetic:
* sine = sin(2 * PI * frac(x)).
*/
private double sine(double x) {
return StrictMath.sin(MoreMath.PI2 * MoreMath.frac(x));
}
}