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