001 /*
002 * This file is part of McIDAS-V
003 *
004 * Copyright 2007-2013
005 * Space Science and Engineering Center (SSEC)
006 * University of Wisconsin - Madison
007 * 1225 W. Dayton Street, Madison, WI 53706, USA
008 * https://www.ssec.wisc.edu/mcidas
009 *
010 * All Rights Reserved
011 *
012 * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and
013 * some McIDAS-V source code is based on IDV and VisAD source code.
014 *
015 * McIDAS-V is free software; you can redistribute it and/or modify
016 * it under the terms of the GNU Lesser Public License as published by
017 * the Free Software Foundation; either version 3 of the License, or
018 * (at your option) any later version.
019 *
020 * McIDAS-V is distributed in the hope that it will be useful,
021 * but WITHOUT ANY WARRANTY; without even the implied warranty of
022 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
023 * GNU Lesser Public License for more details.
024 *
025 * You should have received a copy of the GNU Lesser Public License
026 * along with this program. If not, see http://www.gnu.org/licenses.
027 */
028
029 package edu.wisc.ssec.mcidasv.data.adde.sgp4;
030
031 /**
032 *
033 * @author Shawn
034 */
035 public class Sidereal
036 {
037
038 /**
039 * Calculates the Greenwich mean sidereal time (GMST) on julDate (doesn't have to be 0h).
040 * Used calculations from Meesus 2nd ed.
041 * @param mjd Modified Julian Date
042 * @return Greenwich mean sidereal time in degrees (0-360)
043 */
044 public static double Greenwich_Mean_Sidereal_Deg(double mjd)
045 {
046 // calculate T
047 double T = (mjd-51544.5)/36525.0;
048
049 // do calculation
050 double gmst = ( (280.46061837 + 360.98564736629*(mjd-51544.5)) + 0.000387933*T*T - T*T*T/38710000.0) % 360.0;
051
052 // make positive
053 if(gmst < 0)
054 {
055 gmst += 360.0;
056 }
057
058 return gmst;
059 } //Greenwich_Mean_Sidereal_Deg
060
061 /**
062 * Calculates the mean sidereal time (MST) on julDate (doesn't have to be 0h) for a given longitiude.
063 * @param mjd Modified Julian Date
064 * @param longitude longitude in degrees
065 * @return mean sidereal time in degrees (0-360)
066 */
067 public static double Mean_Sidereal_Deg(double mjd, double longitudeDeg)
068 {
069 return (Greenwich_Mean_Sidereal_Deg(mjd) + longitudeDeg) % 360.0;
070 } // Mean_Sidereal_Deg
071
072
073 // main testing function
074 public static void main(String[] args)
075 {
076 double mjd = 2449991.875 - AstroConst.JDminusMJD;
077 double longitude = -75; // degrees
078 double latitude = 40;
079
080 double mst = Sidereal.Mean_Sidereal_Deg(mjd, longitude);
081
082 System.out.println("For Phily MST: " + mst);
083
084 // assuming a spherical Earth - calculate ECI vector
085 double [] eciVec = new double[3];
086 eciVec[2] = AstroConst.R_Earth * Math.sin( latitude*Math.PI/180.0 );
087 double r = AstroConst.R_Earth * Math.cos( latitude*Math.PI/180.0 );
088 eciVec[0] = r * Math.cos(mst*Math.PI/180.0);
089 eciVec[1] = r * Math.sin(mst*Math.PI/180.0);
090
091 System.out.println("ECI: " + eciVec[0] + ", " + eciVec[1] + ", " + eciVec[2]);
092 }
093
094 }