var siderealday,earth_rev_pr_siderealday,earth_rev_pr_solar_day,satellite_rev_pr_sidereal_day,satellite_rev_pr_solar_day, earth_deg_pr_siderealday,earth_deg_pr_solar_day,satellite_deg_pr_sidereal_day,satellite_deg_pr_solar_day,d,start_of_current_epoch,Epoch_now,Epoch_start var EpochDay,CurrentTime,toRad,toDeg,JD_now,autoupdate var Earth_equatorial_radius,GeoSyncRadius var getCurrentTimeArray = new Array(); var setCurrentTimeArray = new Array(); var CalcDriftRateOutputArray= new Array(); var EarthSiteGeoCentricPositionArray= new Array(); var LookanglesArray= new Array(); var SatNameCurrentIndex,SetLocation,Calibrate_pulsevalue,Calibrate_pulse_per_ha_degree,calibrate_inc_direction,HA_for_calibrated_position var EarthSiteLongitude,EarthSiteLatitude Earth_equatorial_radius=6378.135; // equatorial radii GeoSyncRadius=42164.57; toRad=2*Math.PI/360; toDeg=360/(2*Math.PI); autoupdate="True"; window.setInterval("do_autoupdate()", 1000); function do_autoupdate(){ /* var Hour,Minute,Second,Month,Day,Year Year= YearNow.value; Hour= HourNow.value ; Minute=MinuteNow.value; Second=SecondNow.value ; Month= MonthNow.value; Day= DayNow.value ; */ //setCurrentTimeArray=setCurrentTime(1*DayNow.value,1*MonthNow.value,1*YearNow.value,1*HourNow.value,1*MinuteNow.value,1*SecondNow.value); if (autoupdate=="True") { getCurrentTimeArray=getCurrentTime(); YearNow.value=getCurrentTimeArray[0]; MonthNow.value=getCurrentTimeArray[1]; DayNow.value=getCurrentTimeArray[2]; HourNow.value=getCurrentTimeArray[3]; MinuteNow.value=getCurrentTimeArray[4]; SecondNow.value=getCurrentTimeArray[5]; JulianDay.value=getCurrentTimeArray[6]; JD_now=getCurrentTimeArray[6]; ModifiedJulianDay.value=getCurrentTimeArray[7]; dJ2000.value=getCurrentTimeArray[8]; Epoch_now=getCurrentTimeArray[9]; // virker onchange_satellite_rev_siderealday(); CalcDriftRateOutputArray=calculatedriftrate(1*DayNow.value,1*MonthNow.value,1*YearNow.value,1*HourNow.value, 1*MinuteNow.value,1*SecondNow.value,Satellite_rev_solar_day.value,Satellite_rev_sidereal_day.value, first_derative_mean_motion.value,Eccentricity.value,Epoch.value,Meananomaly.value,Argument_of_perigee.value,RA_AN.value,Inclination.value,NumberOfOrbitsAtEpoch.value); // update forms Earth_rev_solar_day.value=CalcDriftRateOutputArray[0]; Earth_deg_solar_day.value=CalcDriftRateOutputArray[1]; Earth_rev_sidereal_day.value=CalcDriftRateOutputArray[2]; Earth_deg_sidereal_day.value=CalcDriftRateOutputArray[3]; Satellite_deg_sidereal_day.value=CalcDriftRateOutputArray[4]; Satellite_deg_solar_day.value=CalcDriftRateOutputArray[5]; Driftrate.value=CalcDriftRateOutputArray[6]; Direction.value=CalcDriftRateOutputArray[36]; TC.value=CalcDriftRateOutputArray[7]; GeoTC.value=CalcDriftRateOutputArray[8]; Apogee.value=CalcDriftRateOutputArray[12]; Perigee.value=CalcDriftRateOutputArray[13]; Semimajoraxis.value=CalcDriftRateOutputArray[11]; DateEpoch.value=CalcDriftRateOutputArray[14]; GMST.value=CalcDriftRateOutputArray[15]; TimeOfCalculation.value=CalcDriftRateOutputArray[16]; MeananomalyCalculated.value=CalcDriftRateOutputArray[17]; EccentricanomalyBeforeIterations.value=CalcDriftRateOutputArray[18]; Trueanomaly.value=CalcDriftRateOutputArray[19]; EccentricanomalyErrorAfterIterations.value=CalcDriftRateOutputArray[20]; EccentricanomalyAfterIterations.value=CalcDriftRateOutputArray[21]; Velocity.value=CalcDriftRateOutputArray[22]; X_orbit_plane.value=CalcDriftRateOutputArray[23]; Y_orbit_plane.value=CalcDriftRateOutputArray[24]; r_orbit_plane.value=CalcDriftRateOutputArray[25]; x_geocentric.value=CalcDriftRateOutputArray[26]; y_geocentric.value=CalcDriftRateOutputArray[27]; z_geocentric.value=CalcDriftRateOutputArray[28]; declination.value=CalcDriftRateOutputArray[29];//" ToRad"+toRad; RA.value=CalcDriftRateOutputArray[30]; NumberOfOrbitsNow.value=CalcDriftRateOutputArray[31]; SatelliteGeodeticLatitude.value=CalcDriftRateOutputArray[32]; TimeElepsedSinceEpoch.value=CalcDriftRateOutputArray[33]; SatelliteLongitude.value=CalcDriftRateOutputArray[34]; SatelliteGeocentricLatitude.value=CalcDriftRateOutputArray[35]; Iterations.value=CalcDriftRateOutputArray[37]; EccentricanomalyErrorBeforeIterations.value=CalcDriftRateOutputArray[38]; TimeEpochFormat.value=CalcDriftRateOutputArray[39]; Altitude.value= CalcDriftRateOutputArray[40]; GeoAltitude.value=CalcDriftRateOutputArray[41]; GeoDeticAltitude.value=CalcDriftRateOutputArray[42]; AverageDriftrate.value=CalcDriftRateOutputArray[43]; AverageDriftrateDirection.value=CalcDriftRateOutputArray[44]; AvrGeoAltitude.value=CalcDriftRateOutputArray[45]; EW_oscillation_caused_by_inclination.value=CalcDriftRateOutputArray[46]; EW_oscillation_caused_by_eccentricity.value=CalcDriftRateOutputArray[47]; //calculate_geocentric_ECI_coordinates(SiteLon,SiteLat,Re,altitude,GMST) EarthSiteGeoCentricPositionArray=calculate_geocentric_ECI_coordinates(EarthSiteLongitude,EarthSiteLatitude,Earth_equatorial_radius,0,CalcDriftRateOutputArray[15]); //calculate_lookangles(Re,xs,ys,zs,xo,yo,zo,LST,SiteLat,SiteLon) LookanglesArray=calculate_lookangles(Earth_equatorial_radius,CalcDriftRateOutputArray[26],CalcDriftRateOutputArray[27],CalcDriftRateOutputArray[28],EarthSiteGeoCentricPositionArray[0],EarthSiteGeoCentricPositionArray[1],EarthSiteGeoCentricPositionArray[2],CalcDriftRateOutputArray[15],EarthSiteLatitude,EarthSiteLongitude); SatelliteElevation.value=formatvalue(LookanglesArray[4],8); SatelliteAzimuth.value=formatvalue(LookanglesArray[5],8); SatelliteRange.value=formatvalue(LookanglesArray[3],8); //GMST_2(); } } function calculate_geocentric_ECI_coordinates(SiteLon,SiteLat,Re,altitude,GMST){ var OutputArray=new Array(); var z,y,x,omega,R,Earth_flattening_constant,C,S Earth_flattening_constant=1/298.26; C=1/Math.sqrt(1+Earth_flattening_constant*(Earth_flattening_constant-2)*Math.sin(SiteLat*toRad)*Math.sin(SiteLat*toRad) ); S=(1-Earth_flattening_constant)*(1-Earth_flattening_constant)*C; z=Re*Math.sin(SiteLat*toRad); //alert(z); R=Re*Math.cos(SiteLat*toRad); omega=1*GMST+1*SiteLon; // SiteLon = negative in west, positive = east x=R*Math.cos(omega*toRad); y=R*Math.sin(omega*toRad); //SatelliteAzimuth.value="x="+x+" y="+y+" z="+z+" omega="+omega+" GMST="+GMST+" R="+R+" Re="+Re+" SiteLon="+SiteLon+" SiteLat="+SiteLat; // make ECI coordinates correced for earth flattening x=Earth_equatorial_radius*C*Math.cos(SiteLat*toRad)*Math.cos(omega*toRad); y=Earth_equatorial_radius*C*Math.cos(SiteLat*toRad)*Math.sin(omega*toRad); z=Earth_equatorial_radius*S*Math.sin(SiteLat*toRad); OutputArray[0]=x; OutputArray[1]=y; OutputArray[2]=z; return(OutputArray); } function calculate_lookangles(Re,xs,ys,zs,xo,yo,zo,LST,SiteLat,SiteLon){ var OutputArray=new Array(); var rS,rZ,rE,rx,ry,rz,range,Elevation,Azimuth var fi rx=xs-xo; ry=ys-yo; rz=zs-zo; fi=1*LST+1*SiteLon; rS=Math.sin(SiteLat*toRad)*Math.cos(fi*toRad)*rx+Math.sin(SiteLat*toRad)*Math.sin(fi*toRad)*ry-Math.cos(SiteLat*toRad)*rz; rE=-Math.sin(fi*toRad)*rx+Math.cos(fi*toRad)*ry; rZ=Math.cos(SiteLat*toRad)*Math.cos(fi*toRad)*rx+Math.cos(SiteLat*toRad)*Math.sin(fi*toRad)*ry+Math.sin(SiteLat*toRad)*rz; range=Math.sqrt(rS*rS+rE*rE+rZ*rZ); Elevation=toDeg*Math.asin(rZ/range); Azimuth=toDeg*Math.atan(-rE/rS); if (rS>0) Azimuth=Azimuth+180; if (Azimuth<0) Azimuth=Azimuth+360; //SatelliteAzimuth.value="rx="+rx+" ry="+ry+" rz="+rz+" LST="+LST+" range="+range+" Re="+Re+" SiteLat="+SiteLat; OutputArray[0]=rS; OutputArray[1]=rZ; OutputArray[2]=rE; OutputArray[3]=range; OutputArray[4]=Elevation; OutputArray[5]=Azimuth; return(OutputArray); } function ReadCookie() { var Lat,Lon,LatDir,LonDir,CookieValue,MyCookieVal var ValArray=new Array(); var SubArray=new Array(); SitePosCurrentIndex =1073 ; // Used only if there are not any cookie stored //SatNameCurrentIndex =40 ; MyCookieVal=document.cookie; //alert(MyCookieVal); if (MyCookieVal !== "") // If cookie has value then set users defaults { ValArray=MyCookieVal.split(":"); //' Reads 6 cookie values in to the array Lat=ValArray[0]; LatDir=ValArray[1]; Lon=ValArray[2]; LonDir=ValArray[3]; SitePosCurrentIndex=ValArray[4]; SatNameCurrentIndex=ValArray[5]; SetLocation= ValArray[6]; Calibrate_pulsevalue=ValArray[7]; Calibrate_pulse_per_ha_degree=ValArray[8]; calibrate_inc_direction=ValArray[9]; HA_for_calibrated_position=ValArray[10]; Position.selectedIndex=SitePosCurrentIndex; LatitudeDegrees.value=Lat ; // Set user defaults if cookie already stored on the system LatitudeDirection.value=LatDir; // ' Set user defaults if cookie already stored on the system LongitudeDegrees.value=Lon ; //' Set user defaults if cookie already stored on the system LongitudeDirection.value=LonDir; // ' Set user defaults if cookie already stored on the system } else { Position.selectedIndex=SitePosCurrentIndex; alert("Empty cookie - select a site position"); } } // end function function SetCookie() { var Lat,Lon,LatDir,LonDir,CookieValue var SitePosCurrentIndex //alert(document.Position.selectedIndex); SitePosCurrentIndex=Position.selectedIndex; Lat=1*LatitudeDegrees.value; LatDir=LatitudeDirection.value; Lon=1*LongitudeDegrees.value; LonDir=LongitudeDirection.value; CookieValue=Lat+":"+LatDir+":"+Lon+":"+LonDir+":"+SitePosCurrentIndex+":"+SatNameCurrentIndex+":"+SetLocation+":"+Calibrate_pulsevalue+":"+Calibrate_pulse_per_ha_degree+":"+calibrate_inc_direction+":"+HA_for_calibrated_position+";expires=Tue, 10 Jul 2040 23:59:59 UTC;"; document.cookie =CookieValue ; // Store cookie } function CalculateLat() { var degrees,minutes,seconds,decimaldegrees degrees=1*LatDegrees.value; minutes=1*LatMinutes.value; seconds=1*LatSeconds.value; decimaldegrees= degrees + (minutes/60) + (seconds/(60*60)); LatitudeDegrees.value=formatvalue(decimaldegrees,6); } function CalculateLon() { var degrees,minutes,seconds,decimaldegrees degrees=1*LonDegrees.value; minutes=1*LonMinutes.value; seconds=1*LonSeconds.value; decimaldegrees= degrees + (minutes/60) + (seconds/(60*60)); LongitudeDegrees.value=formatvalue(decimaldegrees,6); } function CalculateCoordinate() { var degrees,minute,seconds,SiteLon,SiteLat SiteLat=1*LatitudeDegrees.value; SiteLon=1*LongitudeDegrees.value; degrees=Math.floor(SiteLat); minutes=Math.floor((SiteLat-degrees)*60); seconds= Math.floor(((SiteLat-degrees)*60- minutes)*60); LatDegrees.value=degrees; LatMinutes.value=minutes; LatSeconds.value=seconds; degrees=Math.floor(SiteLon); minutes=Math.floor((SiteLon-degrees)*60); seconds= Math.floor(((SiteLon-degrees)*60- minutes)*60); LonDegrees.value=degrees; LonMinutes.value=minutes; LonSeconds.value=seconds; if (LongitudeDirection.value=="West") EarthSiteLongitude=-SiteLon else EarthSiteLongitude=SiteLon; if (LatitudeDirection.value=="South") EarthSiteLatitude=-SiteLat else EarthSiteLatitude=SiteLat; } function ReadPosition() // Store the selected position in the cookie { var Lat,Lon,LatDir,LonDir,CookieValue,MyVal var ValArray=new Array(); var SubArray=new Array(); MyVal=Position.value; if (MyVal == null) alert("Cookie damaged - plese run the cookie repair script !"); if (MyVal !== null) { // Check position ValArray=MyVal.split(","); SubArray = ValArray[0].split(":") ; // The first subarray containing Lat:LatDir Lat=SubArray[0]; LatDir=SubArray[1]; SubArray = ValArray[1].split(":"); // The second subarray containing Lon:LonDir Lon=SubArray[0]; LonDir=SubArray[1]; LatitudeDegrees.value=Lat ; // Set user defaults if cookie already stored on the system LatitudeDirection.value=LatDir ; // Set user defaults if cookie already stored on the system LongitudeDegrees.value=Lon ; // Set user defaults if cookie already stored on the system LongitudeDirection.value=LonDir ; // Set user defaults if cookie already stored on the system if (LonDir=="West") EarthSiteLongitude=-Lon else EarthSiteLongitude=Lon; if (LatDir=="South") EarthSiteLatitude=-Lat else EarthSiteLatitude=Lat; } } function ClickAutoupdate(){ autoupdate="True"; } function ClickManualupdate(){ autoupdate="False"; } function ManualTimeUpdate() //setCurrentTime(Day,Month,Year,Hour,Minute,Second) { //setCurrentTimeArray=setCurrentTime(Day,Month,Year,Hour,Minute,Second); CalcDriftRateOutputArray=calculatedriftrate(1*DayNow.value,1*MonthNow.value,1*YearNow.value,1*HourNow.value, 1*MinuteNow.value,1*SecondNow.value,Satellite_rev_solar_day.value,Satellite_rev_sidereal_day.value, first_derative_mean_motion.value,Eccentricity.value,Epoch.value,Meananomaly.value,Argument_of_perigee.value,RA_AN.value,Inclination.value,NumberOfOrbitsAtEpoch.value); YearNow.value=setCurrentTimeArray[0]; MonthNow.value=setCurrentTimeArray[1]; DayNow.value=setCurrentTimeArray[2]; HourNow.value=setCurrentTimeArray[3]; MinuteNow.value=setCurrentTimeArray[4]; SecondNow.value=setCurrentTimeArray[5]; JD_now=setCurrentTimeArray[6]; JulianDay.value=setCurrentTimeArray[6]; ModifiedJulianDay.value=setCurrentTimeArray[7]; dJ2000.value=setCurrentTimeArray[8]; Epoch_now=setCurrentTimeArray[9]; onchange_satellite_rev_siderealday(); //CalcDriftRateOutputArray=calculatedriftrate(1*DayNow.value,1*MonthNow.value,1*YearNow.value,1*HourNow.value,1*MinuteNow.value,1*SecondNow.value); // update forms Earth_rev_solar_day.value=CalcDriftRateOutputArray[0]; Earth_deg_solar_day.value=CalcDriftRateOutputArray[1]; Earth_rev_sidereal_day.value=CalcDriftRateOutputArray[2]; Earth_deg_sidereal_day.value=CalcDriftRateOutputArray[3]; Satellite_deg_sidereal_day.value=CalcDriftRateOutputArray[4]; Satellite_deg_solar_day.value=CalcDriftRateOutputArray[5]; Driftrate.value=CalcDriftRateOutputArray[6]; Direction.value=CalcDriftRateOutputArray[36]; TC.value=CalcDriftRateOutputArray[7]; GeoTC.value=CalcDriftRateOutputArray[8]; Apogee.value=CalcDriftRateOutputArray[12]; Perigee.value=CalcDriftRateOutputArray[13]; Semimajoraxis.value=CalcDriftRateOutputArray[11]; DateEpoch.value=CalcDriftRateOutputArray[14]; GMST.value=CalcDriftRateOutputArray[15]; TimeOfCalculation.value=CalcDriftRateOutputArray[16]; MeananomalyCalculated.value=CalcDriftRateOutputArray[17]; EccentricanomalyBeforeIterations.value=CalcDriftRateOutputArray[18]; Trueanomaly.value=CalcDriftRateOutputArray[19]; EccentricanomalyErrorAfterIterations.value=CalcDriftRateOutputArray[20]; EccentricanomalyAfterIterations.value=CalcDriftRateOutputArray[21]; Velocity.value=CalcDriftRateOutputArray[22]; X_orbit_plane.value=CalcDriftRateOutputArray[23]; Y_orbit_plane.value=CalcDriftRateOutputArray[24]; r_orbit_plane.value=CalcDriftRateOutputArray[25]; x_geocentric.value=CalcDriftRateOutputArray[26]; y_geocentric.value=CalcDriftRateOutputArray[27]; z_geocentric.value=CalcDriftRateOutputArray[28]; declination.value=CalcDriftRateOutputArray[29];//" ToRad"+toRad; RA.value=CalcDriftRateOutputArray[30]; NumberOfOrbitsNow.value=CalcDriftRateOutputArray[31]; SatelliteGeodeticLatitude.value=CalcDriftRateOutputArray[32]; TimeElepsedSinceEpoch.value=CalcDriftRateOutputArray[33]; SatelliteLongitude.value=CalcDriftRateOutputArray[34]; SatelliteGeocentricLatitude.value=CalcDriftRateOutputArray[35]; Iterations.value=CalcDriftRateOutputArray[37]; EccentricanomalyErrorBeforeIterations.value=CalcDriftRateOutputArray[38]; TimeEpochFormat.value=CalcDriftRateOutputArray[39]; Altitude.value= CalcDriftRateOutputArray[40]; GeoAltitude.value=CalcDriftRateOutputArray[41]; GeoDeticAltitude.value=CalcDriftRateOutputArray[42]; AverageDriftrate.value=CalcDriftRateOutputArray[43]; AverageDriftrateDirection.value=CalcDriftRateOutputArray[44]; AvrGeoAltitude.value=CalcDriftRateOutputArray[45]; EW_oscillation_caused_by_inclination.value=CalcDriftRateOutputArray[46]; EW_oscillation_caused_by_eccentricity.value=CalcDriftRateOutputArray[47]; //calculate_geocentric_ECI_coordinates(SiteLon,SiteLat,Re,altitude,GMST) EarthSiteGeoCentricPositionArray=calculate_geocentric_ECI_coordinates(EarthSiteLongitude,EarthSiteLatitude,Earth_equatorial_radius,0,CalcDriftRateOutputArray[15]); //calculate_lookangles(Re,xs,ys,zs,xo,yo,zo,LST,SiteLat,SiteLon) LookanglesArray=calculate_lookangles(Earth_equatorial_radius,CalcDriftRateOutputArray[26],CalcDriftRateOutputArray[27],CalcDriftRateOutputArray[28],EarthSiteGeoCentricPositionArray[0],EarthSiteGeoCentricPositionArray[1],EarthSiteGeoCentricPositionArray[2],CalcDriftRateOutputArray[15],EarthSiteLatitude,EarthSiteLongitude); SatelliteElevation.value=formatvalue(LookanglesArray[4],8); SatelliteAzimuth.value=formatvalue(LookanglesArray[5],8); SatelliteRange.value=formatvalue(LookanglesArray[3],8); GMST_2(); } function TimeUpdateNow(){ getCurrentTimeArray=getCurrentTime(); YearNow.value=getCurrentTimeArray[0]; MonthNow.value=getCurrentTimeArray[1]; DayNow.value=getCurrentTimeArray[2]; HourNow.value=getCurrentTimeArray[3]; MinuteNow.value=getCurrentTimeArray[4]; SecondNow.value=getCurrentTimeArray[5]; JulianDay.value=getCurrentTimeArray[6]; JD_now=setCurrentTimeArray[6]; ModifiedJulianDay.value=getCurrentTimeArray[7]; dJ2000.value=getCurrentTimeArray[8]; Epoch_now=getCurrentTimeArray[9]; // funker onchange_satellite_rev_siderealday(); CalcDriftRateOutputArray=calculatedriftrate(1*DayNow.value,1*MonthNow.value,1*YearNow.value,1*HourNow.value, 1*MinuteNow.value,1*SecondNow.value,Satellite_rev_solar_day.value,Satellite_rev_sidereal_day.value, first_derative_mean_motion.value,Eccentricity.value,Epoch.value,Meananomaly.value,Argument_of_perigee.value,RA_AN.value,Inclination.value,NumberOfOrbitsAtEpoch.value); // update forms Earth_rev_solar_day.value=CalcDriftRateOutputArray[0]; Earth_deg_solar_day.value=CalcDriftRateOutputArray[1]; Earth_rev_sidereal_day.value=CalcDriftRateOutputArray[2]; Earth_deg_sidereal_day.value=CalcDriftRateOutputArray[3]; Satellite_deg_sidereal_day.value=CalcDriftRateOutputArray[4]; Satellite_deg_solar_day.value=CalcDriftRateOutputArray[5]; Driftrate.value=CalcDriftRateOutputArray[6]; Direction.value=CalcDriftRateOutputArray[36]; TC.value=CalcDriftRateOutputArray[7]; GeoTC.value=CalcDriftRateOutputArray[8]; Apogee.value=CalcDriftRateOutputArray[12]; Perigee.value=CalcDriftRateOutputArray[13]; Semimajoraxis.value=CalcDriftRateOutputArray[11]; DateEpoch.value=CalcDriftRateOutputArray[14]; GMST.value=CalcDriftRateOutputArray[15]; TimeOfCalculation.value=CalcDriftRateOutputArray[16]; MeananomalyCalculated.value=CalcDriftRateOutputArray[17]; EccentricanomalyBeforeIterations.value=CalcDriftRateOutputArray[18]; Trueanomaly.value=CalcDriftRateOutputArray[19]; EccentricanomalyErrorAfterIterations.value=CalcDriftRateOutputArray[20]; EccentricanomalyAfterIterations.value=CalcDriftRateOutputArray[21]; Velocity.value=CalcDriftRateOutputArray[22]; X_orbit_plane.value=CalcDriftRateOutputArray[23]; Y_orbit_plane.value=CalcDriftRateOutputArray[24]; r_orbit_plane.value=CalcDriftRateOutputArray[25]; x_geocentric.value=CalcDriftRateOutputArray[26]; y_geocentric.value=CalcDriftRateOutputArray[27]; z_geocentric.value=CalcDriftRateOutputArray[28]; declination.value=CalcDriftRateOutputArray[29];//" ToRad"+toRad; RA.value=CalcDriftRateOutputArray[30]; NumberOfOrbitsNow.value=CalcDriftRateOutputArray[31]; SatelliteGeodeticLatitude.value=CalcDriftRateOutputArray[32]; TimeElepsedSinceEpoch.value=CalcDriftRateOutputArray[33]; SatelliteLongitude.value=CalcDriftRateOutputArray[34]; SatelliteGeocentricLatitude.value=CalcDriftRateOutputArray[35]; Iterations.value=CalcDriftRateOutputArray[37]; EccentricanomalyErrorBeforeIterations.value=CalcDriftRateOutputArray[38]; TimeEpochFormat.value=CalcDriftRateOutputArray[39]; Altitude.value= CalcDriftRateOutputArray[40]; GeoAltitude.value=CalcDriftRateOutputArray[41]; GeoDeticAltitude.value=CalcDriftRateOutputArray[42]; AverageDriftrate.value=CalcDriftRateOutputArray[43]; AverageDriftrateDirection.value=CalcDriftRateOutputArray[44]; AvrGeoAltitude.value=CalcDriftRateOutputArray[45]; EW_oscillation_caused_by_inclination.value=CalcDriftRateOutputArray[46]; EW_oscillation_caused_by_eccentricity.value=CalcDriftRateOutputArray[47]; //calculate_geocentric_ECI_coordinates(SiteLon,SiteLat,Re,altitude,GMST) EarthSiteGeoCentricPositionArray=calculate_geocentric_ECI_coordinates(EarthSiteLongitude,EarthSiteLatitude,Earth_equatorial_radius,0,CalcDriftRateOutputArray[15]); //calculate_lookangles(Re,xs,ys,zs,xo,yo,zo,LST,SiteLat,SiteLon) LookanglesArray=calculate_lookangles(Earth_equatorial_radius,CalcDriftRateOutputArray[26],CalcDriftRateOutputArray[27],CalcDriftRateOutputArray[28],EarthSiteGeoCentricPositionArray[0],EarthSiteGeoCentricPositionArray[1],EarthSiteGeoCentricPositionArray[2],CalcDriftRateOutputArray[15],EarthSiteLatitude,EarthSiteLongitude); SatelliteElevation.value=formatvalue(LookanglesArray[4],8); SatelliteAzimuth.value=formatvalue(LookanglesArray[5],8); SatelliteRange.value=formatvalue(LookanglesArray[3],8); GMST_2(); } function getCurrentTime() { var Hour,Minute,Second,Month,Day,Year,ReturnValue ReturnValue= new Array(); today= new Date(); Hour= today.getUTCHours() ; Minute=today.getUTCMinutes() ; Second=today.getUTCSeconds() ; Month= today.getUTCMonth()+1; Day= today.getUTCDate() ; Year= 1*today.getUTCFullYear(); ReturnValue[0]=Year; //alert(" get "+Year+"/"+Month+"/"+Day+"/"+" "+Hour+":"+Minute+":"+Second); if (Month<10) ReturnValue[1]="0"+Month else ReturnValue[1]=Month; if (Day<10) ReturnValue[2]=("0"+Day) else ReturnValue[2]=Day; if (Hour<10) ReturnValue[3]=("0"+Hour) else ReturnValue[3]=Hour; if (Minute<10) ReturnValue[4]=("0"+Minute) else ReturnValue[4]=Minute; if (Second<10) ReturnValue[5]=("0"+Second) else ReturnValue[5]=Second; ReturnValue[6]=JD_daynumber(Day*1,Month*1,Year*1,Hour*1,Minute*1,Second*1); ReturnValue[7]= 1.00000000000000000000*ReturnValue[6] - 1.000000000000000000000*2400000.5; //ModifiedJulianDay.value= //JulianDay.value=JD_now; //JD_now=JD_daynumber(Day*1,Month*1,Year*1,Hour*1,1*Minute,1*Second); //ModifiedJulianDay.value= JD_now - 2400000.5; //Epoch_now=daynumber(1*Day,1*Month,1*Year,1*Hour,1*Minute,1*Second); //dJ2000.value=Epoch_now; ReturnValue[8]=daynumber(1*Day,1*Month,1*Year,1*Hour,1*Minute,1*Second); //alert("Start="+" now"+Epoch_now+" Year"+Year); //alert("GetTimezone offset "+today.getTimezoneOffset()); //array definition // ReturnValue[0] = Year // ReturnValue[1] = Month // ReturnValue[2] = Day // ReturnValue[3] = Hour // ReturnValue[4] = Minute // ReturnValue[5] = Second // ReturnValue[6] = Julian Day =JulianDay.value=JD_now; // ReturnValue[7] = Modified Julian Day =ModifiedJulianDay.value // ReturnValue[8] = Epoch now (days since 1.1.2000 00:00) // ReturnValue[9] = today // PC time format // YearNow.value=""+Year; // does not work in Mozilla Firefox // dJ2000.value=Epoch_now; ReturnValue[9]=today; //alert(ReturnValue[8]); return(ReturnValue); } function setCurrentTime(Day,Month,Year,Hour,Minute,Second) { var ReturnValue= new Array(); today= new Date(); //Year= YearNow.value; // gir feil Epoch_now today.setUTCFullYear(Year,(1*Month-1),Day); today.setUTCHours(Hour); today.setUTCMinutes(Minute); today.setUTCSeconds(Second); //today.setTimezoneOffset(0); ReturnValue[0]=Year; ReturnValue[1]=Month; ReturnValue[2]=Day; ReturnValue[3]=Hour; ReturnValue[4]=Minute; ReturnValue[5]=Second; ReturnValue[6]=1.00000000000000000000*JD_daynumber(Day*1,Month*1,Year*1,Hour*1,Minute*1,Second*1); ReturnValue[7]= 1.00000000000000000000*ReturnValue[6] - 1.000000000000000000000*2400000.5; ReturnValue[8]=daynumber(Day*1,Month*1,Year*1,Hour*1,Minute*1,Second*1); ReturnValue[9]=today; //alert("TEST "+Year+" "+Month+" "+Day+" "+Hour+" "+Minute+" "+Second); //ok //alert("TEST2 = "+ReturnValue[9]); //ok // ReturnValue[0] = Year // ReturnValue[1] = Month // ReturnValue[2] = Day // ReturnValue[3] = Hour // ReturnValue[4] = Minute // ReturnValue[5] = Second // ReturnValue[6] = Julian Day =JulianDay.value=JD_now; // ReturnValue[7] = Modified Julian Day =ModifiedJulianDay.value // ReturnValue[8] = Epoch now (days since 1.1.2000 00:00) // ReturnValue[9] = today PC time format return(ReturnValue); } function generate_24hour_listings() { var listing,Az,El,S_lon,S_lat,Range,getCurrentTimeArray,start_d,Day,Month,Year,Hour,Minute,Second,LST,GMST,ListingPeriod,i,chr,Drift_rate_dir,Drift_rate var AvrGeoAlt,GeoAlt,Time_since_ep,Avr_driftrate_dir,Avr_driftrate,velocity ListingPeriod=24*60;// hoursxminutes chr=" "; //alert(auto_manual.value); /* var time_format = new Date(); listing="" listing+="
" listing+="" listing+="" listing+=""; listing+="\n"+"hour"+chr+"time"+chr+"time_since_epoch"+chr+"SatLon"+chr+"SatLat"+chr+"Azimuth"+chr+"Elevation"+chr+"Range"+chr+"GeoAlt"+chr+"AvrGeoAlt"+chr+"velocity"+chr+"Drift_rate"+chr+"Drift_rate_dir"+chr+"Avr_driftrate"+chr+"Avr_driftrate_dir"; for (i=1; i" listing+="" listing+="" listing+=" Sun azimuth ~ Satellite Longitude " listing+="" listing+="" listing+="" listing+="****************************SUN************************************ "; listing+="***************************MOON*********************************** " listing+="" */ // bruk tid konfigurert i form som starttid og beregn vinkler for hver time i 170 timer // må gjøre om på funksjonene for å gjøre de brukbare til listing funksjon.... // // for epoch , +1hour step , 170 hour do print SatLon,Satlat,Azimuth,Elevation getCurrentTimeArray=setCurrentTime(1*DayNow.value,1*MonthNow.value,1*YearNow.value,1*HourNow.value, 1*MinuteNow.value,1*SecondNow.value); YearNow.value=getCurrentTimeArray[0]; MonthNow.value=getCurrentTimeArray[1]; DayNow.value=getCurrentTimeArray[2]; HourNow.value=getCurrentTimeArray[3]; MinuteNow.value=getCurrentTimeArray[4]; SecondNow.value=getCurrentTimeArray[5]; JulianDay.value=getCurrentTimeArray[6]; JD_now=getCurrentTimeArray[6]; ModifiedJulianDay.value=getCurrentTimeArray[7]; dJ2000.value=getCurrentTimeArray[8]; Epoch_now=getCurrentTimeArray[9]; // days since 1.1.2000 // virker onchange_satellite_rev_siderealday(); // gjør om Epoch_now til Day,Month,Year osv. eller ? start_d=getCurrentTimeArray[8]; // må gjøre om listing=""; listing+="\n"+"hour"+chr+"time"+chr+"time_since_epoch"+chr+"SatLon"+chr+"SatLat"+chr+"Azimuth"+chr+"Elevation"+chr+"Range"+chr+"GeoAlt"+chr+"AvrGeoAlt"+chr+"velocity"+chr+"Drift_rate"+chr+"Drift_rate_dir"+chr+"Avr_driftrate"+chr+"Avr_driftrate_dir"; for (i=1; i0.0 ) { while( x > 360.0 ) x = x-360.0; } else { while( x< 0.0 ) x =x+ 360.0; } return(x) } function get_epoch_date_and_time() { var TMP,Day,Year,Start TMP=Epoch.value; Day=Epoch.value.substring(2, 8)*1; Year=1*Epoch.value.substring(0, 2); Start=daynumber_tle(Year,Day);// //alert(d_to_date_and_time(Start)); return(d_to_date_and_time(Start)); } function d_to_date_and_time(d) { var today,t var MinMilli = 1000 * 60; var HrMilli = MinMilli * 60; var DyMilli = HrMilli * 24; today = new Date(); // d+10956= Date() format //window.alert('d= '+d ); d=d+10956; d*DyMilli; today.setTime(d*DyMilli); //t=((today.getTime()/DyMilli)-10956); //window.alert('t= '+t ); time_offset=today.getTimezoneOffset() ; Hour= today.getUTCHours() ; Minute=today.getUTCMinutes() ; Second=today.getUTCSeconds() ; Month= today.getUTCMonth()+1; Day= today.getUTCDate() ; Year= today.getUTCFullYear(); return(today) } //104 function daynumber(dd,mm,yyyy,hh,min,sec) // 2000.1.1 00:00 som referanse { d=0; d=367*yyyy - Div( (7*(yyyy+(Div((mm+9),12)))),4 ) + Div((275*mm),9) + dd - 730530 ; d=d+ hh/24 + min/(60*24) + sec/(24*60*60) ; // OK return(d); } function JD_daynumber(dd,mm,yyyy,hh,min,sec) { d=0; d=367*yyyy - Div( (7*(yyyy+(Div((mm+9),12)))),4 ) + Div((275*mm),9) + dd - 730530 +2451543.5; d=d+ hh/24 + min/(60*24) + sec/(24*60*60) ; // OK return(d); } function daynumber_tle(Year,Day) { var d; d=0; d=367*Year- 730530 -14 ; // hvorfor +- 14 ??? d=367*2008 + 1*Day - 734014;//= 2977 ; //alert(d_to_date_and_time(daynumber(24,2,2008,0,0,0))+" daynumber "+daynumber(24,2,2008,0,0,0)); //d=d+Day ; // OK return(d); } function getTLEfromTextAerea() { var tmpString,EpochYear,EpochDay; var rows= new Array(); tmpString=twoline.value; rows=tmpString.split("\n") ; CommonName.value=rows[0]; // check if the two lines start with 1 and 2 if ((rows[1].substring(0, 1)!="1") || (rows[2].substring(0, 1)!="2")) alert("error in parameter") else { //alert("parameter ok") ; // get the values from line 1 ObjectID.value=rows[1].substring((3-1)*1, (7)*1); //alert(ObjectID.value); ElsetClassification.value=rows[1].substring(8-1, 8); InternationalDesignator.value=rows[1].substring(10-1, 17); Epoch.value=rows[1].substring(19-1, 32); EpochYear="20"+rows[1].substring(19-1, 20); EpochDay=1*rows[1].substring(21-1, 32); first_derative_mean_motion.value=1*rows[1].substring(34-1, 43); Inclination.value=1*rows[2].substring(9-1, 16); RA_AN.value=1*rows[2].substring(18-1, 25); Eccentricity.value="0."+rows[2].substring(27-1, 33); // make decimal point Argument_of_perigee.value=1*rows[2].substring(35-1, 42); Meananomaly.value=1*rows[2].substring(44-1, 51); Satellite_rev_sidereal_day.value=1*rows[2].substring(53-1, 63); NumberOfOrbitsAtEpoch.value=1*rows[2].substring(64-1, 68); //alert(EpochYear+"\n"+EpochDay); Epoch_start=daynumber_tle(1*EpochYear,EpochDay*1);// DateEpoch.value=d_to_date_and_time(Epoch_start); } } function Div(a,b) { return((a-a%b)/b) //OK } function ShowCredit() { var credittext credittext="First uploaded 25022008" credittext=credittext+"\nProgrammed by Jens T. Satre" credittext=credittext+"\nScript for calculating satellitte position based on TLE data.\n" credittext=credittext+"\nKNOWN PROBLEMS:" credittext=credittext+"\nDrift rate error" credittext=credittext+"\nAt the current time there are small errors in the angles\nThe errors are high on non-geostatioary orbits with high eccentricity." credittext=credittext+"\nAt the moment the calculator does not use the prediction models like SDP/SGP." credittext=credittext+"\nThere is also a known problem with Mozilla Firefox at the moment.\n" credittext=credittext+"\n2502-2008: First version." credittext=credittext+"\n2602-2008: Corrected bug in angles when UTC time was around midnight" credittext=credittext+"\n2602-2008: Added calculation of geodetic latitude (probably with a bug..)" credittext=credittext+"\n2702-2008: Changes to geodetic latitude calculations" credittext=credittext+"\n2802-2008: Added more information" credittext=credittext+"\n0303-2008: Changes to the javascript code (preparation for listing function)" credittext=credittext+"\n0303-2008: Corrected driftrate error" credittext=credittext+"\n0303-2008: Added average driftrate and average distance from GEO orbit based on semi-major-axis value" credittext=credittext+"\n0303-2008: Added East/West oscillation caused by inclination and eccentricity" credittext=credittext+"\n0403-2008: Added site location select list" credittext=credittext+"\n0403-2008: Added calculation of azimuth,elevation and the range between the site location and the satellite" credittext=credittext+"\n0503-2008: Corrected azimuth&elevation for oblate earth" credittext=credittext+"\n0503-2008: Added 170 hour listing function (1 hour interval)" credittext=credittext+"\n0503-2008: Added 24 hour listing function (1 minute interval)" credittext=credittext+"\n1003-2008: An error in driftrate calculations has been detected (not corrected yet)" alert(credittext); } function getMST( now, lon ) { // from http://home.att.net/~srschmitt/script_clock.html var year = now.getUTCFullYear(); var month = now.getUTCMonth() + 1; var day = now.getUTCDate(); var hour = now.getUTCHours(); var minute = now.getUTCMinutes(); var second = now.getUTCSeconds(); // 1994 June 16th at 18h UT // days since J2000: -2024.75 // GMST: 174.77111347427126 // 11h 39m 5.0672s // year = 1994; // month = 6; // day = 16; // hour = 18; // minute = 0; // second = 0; if( month == 1 || month == 2 ) { year = year - 1; month = month + 12; } var a = Math.floor( year/100 ); var b = 2 - a + Math.floor( a/4 ); var c = Math.floor(365.25 * year); var d = Math.floor(30.6001 * (month + 1)); // days since J2000.0 var jd = b + c + d - 730550.5 + day + (hour + minute/60.0 + second/3600.0)/24.0; var jt = (jd)/36525.0; // julian centuries since J2000.0 var GMST = 280.46061837 + 360.98564736629*jd + 0.000387933*jt*jt - jt*jt*jt/38710000 + lon; if( GMST > 0.0 ) { while( GMST > 360.0 ) GMST -= 360.0; } else { while( GMST < 0.0 ) GMST += 360.0; } return GMST; } function get_time_in_epoch_format(selected_time,timefromepoch){ // must find the daynumber of the year , 0 = 1 januar, 366 days every 4 year var today = new Date(); var first = new Date(today.getFullYear(), 0, 1); var theDay = Math.round(((selected_time - first) / 1000 / 60 / 60 / 24) + .5, 0); var time,timestring,Year,YearStr,timenow,timestring2 timenow= 1.0*(timefromepoch) ; timestring=formatvalue((timenow-Math.floor(timenow)),12); timestring2=timestring.substring(1, 10); Year= selected_time.getUTCFullYear(); YearStr=formatvalue(Year,4); if ((theDay<10)&&(theDay<100)) DayStr="00"+formatvalue(theDay,4) else if ((theDay>10)&&(theDay<100)) DayStr=DayStr="0"+formatvalue(theDay,4) elseDayStr=DayStr="0"+formatvalue(theDay,4) ; return(YearStr.substring(2, 5)+DayStr+timestring2); } function GMST_2() { var Tu,du,gm_st,w,h,m,s du=JD_now-2451545; // 2451545 = 1.1.2000 12 UTC , du bekrefter riktig 25 feb if (du<0) { Tu=(Math.floor(du)+0.5)/36525; } else Tu=(Math.floor(du)-0.5)/36525; //Tu=Math.floor(du)/36525; // må være tidspunkt ved midnatt utc ?, hva når du er negativ ? //alert((du+1)+" / "+Epoch_now); w=( (360/(2*Math.PI))* (7.29211510*((60*60*24)/100000) ) *(Epoch_now-Math.floor(Epoch_now)) ) ; // w regnes ut riktig,bekreftet 25 feb //w=0; // dette er antall radianer. Det er 2pi radianer i 360 grader. 360/2pi grader/radian GMST2.value=Rev(( w+ 15* ( ( 24110.54841+8640184.812866*Tu+0.093104*Tu*Tu- ((6.2/(1000000))*Tu*Tu*Tu)) /(60*60) ) )); // nøkkelen ligger her et sted... GMST er sannsynligvis eneste feilkilde. gm_st=Rev(( w+ 15* ( ( 24110.54841+8640184.812866*Tu+0.093104*Tu*Tu- ((6.2/(1000000))*Tu*Tu*Tu)) /(60*60) ) )); h=Math.floor((Epoch_now-Math.floor(Epoch_now))*24); m= Math.floor(( (Epoch_now-Math.floor(Epoch_now))*24 - h )*60); // rest s=((( (Epoch_now-Math.floor(Epoch_now))*24 - h )*60) -m )*60; //TimeTest.value=h+":"+m+":"+s+" "+w+" floor du "+(Math.floor(du)+0.5)+ " ceil du "+(Math.ceil(du)-0.5)+" du "+du+" "+w; // Epoch now er minst return(gm_st); } function calculatedriftrate(Day,Month,Year,Hour,Minute,Second,Satellite_rev_solar_day,Satellite_rev_sidereal_day,first_derative_mean_motion,Eccentricity,Epoch,Meananomaly,Argument_of_perigee,RA_AN,Inclination,NumberOfOrbitsAtEpoch) { var TCdecimal,hour,minute,seconds,RangeA,e,M,M0,E,X0,Y0,r,Px,Py,Pz,Qx,Qy,Qz, x,y,z,arg_per,RAAN,i,Year,Daynumber,Hour,Minute,Second,TMP,LonString,LatString,alpha_E, meanmotion_now,meanmotion_after_24_hours,average_motion,average_distance_from_geo_sync_radius,average_drift_rate var now = new Date(); var cur_t var OutputArray= new Array(); setCurrentTimeArray=setCurrentTime(Day,Month,Year,Hour,Minute,Second); now=setCurrentTimeArray[9]; Epoch_now=setCurrentTimeArray[8]; // forhold mellom sidereal og solar day 365.242190402/366.242190402 //kilde wikipedia // TLE oppgitt i mean solar time ? earth_deg_pr_solar_day=360+(360/365.24199); // solar eller sidereal? earth_deg_pr_solar_day=360+(360/365.2422); // alt.2 earth_rev_pr_solar_day=earth_deg_pr_solar_day/360; earth_rev_pr_siderealday=1/earth_rev_pr_solar_day; earth_rev_pr_siderealday=365.242190402/366.242190402; earth_deg_pr_siderealday=earth_rev_pr_siderealday*360; OutputArray[0]=earth_rev_pr_solar_day; OutputArray[1]=earth_deg_pr_solar_day; OutputArray[2]=earth_rev_pr_siderealday; OutputArray[3]=earth_deg_pr_siderealday; satellite_deg_pr_sidereal_day=360*Satellite_rev_sidereal_day; satellite_deg_pr_solar_day=360*Satellite_rev_solar_day; //alert(Satellite_rev_sidereal_day+" "+Satellite_rev_solar_day+" "+first_derative_mean_motion); // Sier at Satellite_rev_solar_day er et object OutputArray[4]=satellite_deg_pr_sidereal_day; OutputArray[5]=satellite_deg_pr_solar_day; // AverageMotion = epochMeanMotion + (CurrentTime-EpochDay)*OrbitalDecay/2; // CurrentMotion = 360*(epochMeanMotion + (CurrentTime-EpochDay)*OrbitalDecay); meanmotion_now = 1*Satellite_rev_sidereal_day+(first_derative_mean_motion*(Epoch_now-Epoch_start )); // rev/day meanmotion_after_24_hours=1*Satellite_rev_sidereal_day+(first_derative_mean_motion*(Epoch_now-Epoch_start+1 )); // rev/day average_motion=(meanmotion_now+meanmotion_after_24_hours)/2; // calculate driftrate OutputArray[6]=Rev( ( (1/(1*Satellite_rev_sidereal_day+first_derative_mean_motion*(Epoch_now-Epoch_start ))) +earth_rev_pr_solar_day)*360); // -3 hundredelsgrad // test new driftrate TCdecimal=(1440/(1*Satellite_rev_sidereal_day+(first_derative_mean_motion*(Epoch_now-Epoch_start )*360)))/60; RangeA=Math.pow( (6028.9* (1440/(1*Satellite_rev_sidereal_day+(first_derative_mean_motion*(Epoch_now-Epoch_start )*360)))), (2/3) ); OutputArray[7]=Convert_to_deg_min_sec(TCdecimal); OutputArray[8]=Convert_to_deg_min_sec( ((1440/1.0027379092558308)/60)); OutputArray[9]=RangeA*(1+Eccentricity*1); // apogee OutputArray[10]=RangeA*(1-Eccentricity*1); //perigee OutputArray[11]=(1*OutputArray[9]+1*OutputArray[10])/2; // semimajoraxsis e=Eccentricity; OutputArray[12]=RangeA*(1+e*1)-Earth_equatorial_radius; OutputArray[13]=RangeA*(1-e*1)-Earth_equatorial_radius; OutputArray[39]=get_time_in_epoch_format(now,Epoch_now); OutputArray[14]=d_to_date_and_time(Epoch_start)+" d="+formatvalue(Epoch_start,14)+" ep="+Epoch; OutputArray[15]=getMST(now, 0.0 ); OutputArray[16]=now+" (verifies the time&date used)"; M=Meananomaly*1+(360*(Satellite_rev_sidereal_day*(Epoch_now-Epoch_start )+0.5*first_derative_mean_motion*(Epoch_now-Epoch_start )*(Epoch_now-Epoch_start ))) ; OutputArray[17]=Rev(M); Initial_M=M; E=toDeg*( M*toRad+e*Math.sin(M*toRad)+0.5*e*e*Math.sin(2*M*toRad) ) ;// <-- initlial estimate OutputArray[18]=Rev(E); initial_E=Rev(E); var E0,E1,alpha_E,iterations,NewM,M_offset,NyM,initial_E,New_E,Initial_M,E_Error NewM=Rev(E-e*toDeg*Math.sin(toRad*E)); if (M>NewM) M_old_offset= M- NewM; else M_old_offset= NewM-M; if ((M_old_offset=360.00) || (M_old_offset=-360.00)) { M_old_offset=0; //alert(M_old_offset); } M_old_offset=Rev(M_old_offset); alpha_E=9; // just set to any large value before iterating M_offset=9;// just set to any large value before iterating iterations=0; E0=initial_E; M0=Rev(M); E0=Rev(E); E_Error=9; while (((Math.abs(E_Error))>0.00000001) && (iterations<40)) // itererer korrekt 25 feb 2008, avslutt etter 40 iterations { iterations=1+iterations; E_Error= (E- toRad*e*Math.sin(toRad*E) -M ) ; E = E-E_Error; } // sjekk ny M=E-esinE og gammel M //E=New_E; M=Initial_M; E=Rev(E); var true_anomaly,eccentric_anomaly true_anomaly=toDeg*Math.acos(( Math.cos(toRad*E)-e)/(1-e*Math.cos(toRad*E)) ) ; eccentric_anomaly=toDeg*Math.acos( (( Math.cos(toRad*true_anomaly)+e)/(1+e*Math.cos(toRad*true_anomaly))) ); // funker ikke bra OutputArray[19]=true_anomaly; //alert(eccentric_anomaly); M_offset=E_Error; //alert(E_Error); OutputArray[37]=iterations; // get the eccentric OutputArray[38] anomaly error before iterations if (Rev(E)>1*OutputArray[18]) OutputArray[38]=Rev(Rev(E)-1*OutputArray[18]) else OutputArray[38]=Rev(1*OutputArray[18]-Rev(E)) OutputArray[20]=E_Error; OutputArray[21]=Rev(E); // eccentric anomaly after iteratons // **************Calculate X0,Y0 and r for the perifocal coordinate system***************** // //OutputArray[11]= semimajoraxis X0=1.0*OutputArray[11]*(Math.cos(toRad*E)-e); // = r*Cos(trueanomaly) Y0=1.0*OutputArray[11]*Math.sqrt(1-e*e)*Math.sin(toRad*E); // = r*sin (trueanomaly) r=Math.sqrt(X0*X0+Y0*Y0); // distance // **************************************************************************************** //alert(Argument_of_perigee+" "+RA_AN+" "+Inclination); arg_per=1*Argument_of_perigee; RAAN=1.0*RA_AN; i=1.0*Inclination; perigee_perturbation=(Epoch_now-Epoch_start)*4.97*Math.pow((Earth_equatorial_radius/(1*OutputArray[11])) , 3.5 )* ( 5*Math.cos(toRad*i)*Math.cos(toRad*i) -1)/((1-e*e)*(1-e*e)); // perturbation of ascending node ascending_node_perturbation=(Epoch_now-Epoch_start)*9.95*Math.pow((Earth_equatorial_radius/(1*OutputArray[11])) , 3.5 )* Math.cos(toRad*i)/((1-e*e)*(1-e*e)); // perbutation of perigee true_anomaly=Math.atan2(Y0,X0); // RAAN og long. of ascending node det samme ??? //Long asc.node = RAAN - GMST L_asc_node=RAAN-getMST(now, 0.0 ) ; xeclip = r * ( Math.cos(toRad*L_asc_node) * Math.cos(true_anomaly+toRad*arg_per) - Math.sin(toRad*L_asc_node) * Math.sin(true_anomaly+arg_per) * Math.cos(toRad*i) ); yeclip = r * ( Math.sin(toRad*L_asc_node) * Math.cos(true_anomaly+toRad*arg_per) + Math.cos(toRad*L_asc_node) * Math.sin(true_anomaly+arg_per) * Math.cos(toRad*i) ); zeclip = r * Math.sin(true_anomaly+arg_per) * Math.sin(toRad*i) // // // SatLon= Math.atan2( yeclip,xeclip )-RAAN+Lon_asc_node- w(t-te)= Math.atan2( yeclip,xeclip )-RAAN+(RAAN - GMST)- w(t-te) // // //Velocity.value=Math.sqrt( 398600.5*( (2/r)-(1/(1*Semimajoraxis.value)) )); OutputArray[22]=Math.sqrt( 398600.5/r); OutputArray[23]=X0; OutputArray[24]=Y0; OutputArray[25]=r; OutputArray[40]= formatvalue((r -Earth_equatorial_radius),10); OutputArray[41]=formatvalue((r-GeoSyncRadius),8); // current distance from teoretical GEO orbit hight // get driftrate // use semimajoraxis/2 offset from Geo to get an more average like drift average_distance_from_geo_sync_radius,average_drift_rate average_distance_from_geo_sync_radius=(OutputArray[11])-GeoSyncRadius; average_drift_rate=(((-3/2)*average_distance_from_geo_sync_radius*earth_rev_pr_solar_day/GeoSyncRadius)*360); OutputArray[43]=average_drift_rate; OutputArray[45]=average_distance_from_geo_sync_radius; if ((1*OutputArray[43])>0) { OutputArray[44]="East"; OutputArray[43]=1*OutputArray[43]; } else { OutputArray[43]=-1*OutputArray[43]; OutputArray[44]="West"; } // calculate driftrate as specified in Richharia book OutputArray[6]=(((-3/2)*OutputArray[41]*earth_rev_pr_solar_day/GeoSyncRadius)*360); if ((1*OutputArray[6])>0) { OutputArray[36]="East"; OutputArray[6]=1*OutputArray[6]; } else { OutputArray[6]=-1*OutputArray[6]; OutputArray[36]="West"; } // //Px,Py,Pz,Qx,Qy,Qz, x,y,z,tod //calculate E/W oscillation based on inclination OutputArray[46]=toDeg*Math.asin( Math.tan(i/2)*Math.tan(i/2) ); //calculate E/W oscillation based on eccentricity OutputArray[47]=toDeg*(2*e ); //alert(perigee_perturbation); //alert(ascending_node_perturbation); arg_per=arg_per+perigee_perturbation; RAAN=RAAN-ascending_node_perturbation; // *********Convert to Earth centered********************* //**********inertial coordinate system******************** //**********(geocentric coordinates)********************** Px=Math.cos(toRad*arg_per)*Math.cos(RAAN*toRad) - Math.sin(toRad*arg_per)*Math.sin(toRad*RAAN)*Math.cos(toRad*i); Py=Math.cos(toRad*arg_per)*Math.sin(RAAN*toRad) + Math.sin(toRad*arg_per)*Math.cos(toRad*RAAN)*Math.cos(toRad*i); Pz=Math.sin(toRad*arg_per)*Math.sin(toRad*i); //alert(toDeg*Math.atan2(Py,Math.sqrt(Px*Px+Py*Py))); Qx=-Math.sin(toRad*arg_per)*Math.cos(RAAN*toRad)-Math.cos(toRad*arg_per)*Math.sin(toRad*RAAN)*Math.cos(toRad*i); Qy=-Math.sin(toRad*arg_per)*Math.sin(RAAN*toRad)+Math.cos(toRad*arg_per)*Math.cos(toRad*RAAN)*Math.cos(toRad*i); Qz=Math.cos(toRad*arg_per)*Math.sin(toRad*i); x=Px*X0+Qx*Y0; y=Py*X0+Qy*Y0; z=Pz*X0+Qz*Y0; //******************************************************* OutputArray[26]=x; OutputArray[27]=y; OutputArray[28]=z; //GetSubSatPoint(x,y,z); // RA & Decl , Latitude og longitude er litt feil.... Declination=toDeg*Math.atan2( z,Math.sqrt(x*x+y*y) );//+" time "+(toDeg*Math.atan2( z,Math.sqrt(x*x+y*y) )/15)+":"+ ((toDeg*Math.atan2( z,Math.sqrt(x*x+y*y) )/15)-Math.floor((toDeg*Math.atan2( z,Math.sqrt(x*x+y*y) )/15)))*60; OutputArray[29]=Declination;//" ToRad"+toRad; OutputArray[30]=(Rev(toDeg*Math.atan2( y,x )));//+" time "+Math.floor(Rev(toDeg*Math.atan2( y,x ))/15)+":"+((Rev(toDeg*Math.atan2( y,x ))/15)-Math.floor(Rev(toDeg*Math.atan2( y,x ))/15))*60; OutputArray[31]=formatvalue((NumberOfOrbitsAtEpoch*1+(Epoch_now-Epoch_start)*Satellite_rev_sidereal_day),5); // gjør samme beregninger med jordbanen og x,y,z punkter på jorden // finn lengdegrad for Greenwich akkurat nå // forskjellen mellom lengdegrad GreenWich og satelliten er sat posisjon i forhold til 0. //var now = new Date(); //getMST( now, lon ); //alert(Epoch_now+"\n"+Epoch_start); // Epoch_start = undefined Longitude=Rev( toDeg*Math.atan2( y,x )-getMST(now, 0.0 ) ); // ørlite feil i RA osv. Feil i timeoffet ? feilen er ca. 0.0368 grader //Longitude=Rev( toDeg*Math.atan2( y,x )-GMST_2() ); // ørl //alert(GMST_2() ); Latitude=toDeg*Math.atan2( z,Math.sqrt(x*x+y*y) ); // calculate Geodedic latitude var f,geocentricLat,geodeticLat,recalculated_geodetic_lat,C,Lat_error,loops,R; geocentricLat=Math.atan( z/Math.sqrt(x*x+y*y) ); geodeticLat=geocentricLat; loops=0; Lat_error=9;// just set to any value before looping // kalkulerer klart feil i noen situasjoner R=Math.sqrt(x*x+y*y); // can not calculate correct value... Geodetic should be slightly larger all the time... while (Math.abs(Lat_error)>0.0000001){ loops+=1; C=1*1/(Math.sqrt(1- (e*e*Math.sin(geodeticLat)*Math.sin(geodeticLat)) ) ); //C=1; //Earth_equatorial_radius=6378.14; // equatorial radii //GeoSyncRadius recalculated_geodetic_lat=Math.atan2( (z+1*(Earth_equatorial_radius*C*e*e*Math.sin(geodeticLat))) ,R ); //alert(toDeg*geodeticLat ); //if (Lat_error<0) alert(Lat_error); //if (geodeticLat 0) OutputArray[32]=formatvalue(Math.abs(geodeticLat),10)+" North" else OutputArray[32]=formatvalue(Math.abs(geodeticLat),10)+" South"; var Number,Number2; Number=M_offset; Number2=E-initial_E; //Misc.value="Longitude = "+LonString+" Latitude="+LatString+ " Time elapsed since epoch="+Convert_to_deg_min_sec((Epoch_now-Epoch_start)*24); window.status="Longitude = "+LonString+" Latitude="+OutputArray[32]+ " Time elapsed="+Convert_to_deg_min_sec((Epoch_now-Epoch_start)*24)+" Iter.="+OutputArray[37]+"-"+loops+" E error="+ (M_offset)+" deg. Initial E error= "+(initial_E-E); OutputArray[33]=Convert_to_deg_min_sec((Epoch_now-Epoch_start)*24)+" T="+formatvalue((Epoch_now-Epoch_start),16); OutputArray[34]=LonString; OutputArray[35]=LatString; //SatelliteGeodeticLatitude.value=formatvalue(geodeticLat,10);//+" loops="+loops; //OutputArray[0]=earth_rev_pr_solar_day; Earth_rev_solar_day.value //OutputArray[1]=earth_deg_pr_solar_day; Earth_deg_solar_day.value //OutputArray[2]=earth_rev_pr_siderealday; Earth_rev_sidereal_day.value //OutputArray[3]=earth_deg_pr_siderealday; Earth_deg_sidereal_day.value //OutputArray[4]=satellite_deg_pr_sidereal_day; Satellite_deg_sidereal_day.value //OutputArray[5]=satellite_deg_pr_solar_day; Satellite_deg_solar_day.value //OutputArray[6]=Driftrate.value= //OutputArray[36]=Direction.value="East"; //OutputArray[7]=TC.value= //OutputArray[8]=GeoTC.value= //OutputArray[9]=Apogee.value=RangeA*(1+Eccentricity.value*1); //OutputArray[10]=Perigee.value=RangeA*(1-Eccentricity.value*1); //OutputArray[11]=Semimajoraxis.value=(1*Apogee.value+1*Perigee.value)/2; //OutputArray[12]=Apogee.value=RangeA*(1+Eccentricity.value*1)-Earth_equatorial_radius; //OutputArray[13]=Perigee.value=RangeA*(1-Eccentricity.value*1)-Earth_equatorial_radius; //OutputArray[14]=DateEpoch.value=d_to_date_and_time(Epoch_start)+" d="+formatvalue(Epoch_start,14)+" ep="+Epoch.value; //OutputArray[15]=GMST.value=getMST(now, 0.0 ); //OutputArray[16]=TimeOfCalculation.value=now+" (verifies the time&date used)"; //OutputArray[17]=MeananomalyCalculated.value=Rev(M); //OutputArray[18]=EccentricanomalyBeforeIterations.value=Rev(E); //OutputArray[19]=Trueanomaly.value=true_anomaly; //OutputArray[20]=EccentricanomalyErrorAfterIterations.value=E_Error; //OutputArray[21]=EccentricanomalyAfterIterations.value=Rev(E); //OutputArray[22]=Velocity.value=Math.sqrt( 398600.5/r); //OutputArray[23]=X_orbit_plane.value=X0; //OutputArray[24]=Y_orbit_plane.value=Y0; //OutputArray[25]=r_orbit_plane.value=r; //OutputArray[26]=x_geocentric.value=x; //OutputArray[27]=y_geocentric.value=y; //OutputArray[28]=z_geocentric.value=z; //OutputArray[29]=declination.value=Declination;//" ToRad"+toRad; //OutputArray[30]=RA.value= right ascension; //OutputArray[31]=NumberOfOrbitsNow.value=formatvalue((NumberOfOrbitsAtEpoch.value*1+(Epoch_now-Epoch_start)*Satellite_rev_sidereal_day.value),5); //OutputArray[32]=SatelliteGeodeticLatitude.value=formatvalue(Math.abs(geodeticLat),10) //OutputArray[33]=TimeElepsedSinceEpoch.value=Convert_to_deg_min_sec((Epoch_now-Epoch_start)*24)+" T="+formatvalue((Epoch_now-Epoch_start),16); //OutputArray[34]=SatelliteLongitude.value=LonString; //OutputArray[35]=SatelliteGeocentricLatitude.value=LatString; //OutputArray[37]=Iterations.value=iterations; //OutputArray[38] eccentric anomaly error before iterations //OutputArray[39]=TimeEpochFormat.value=get_time_in_epoch_format(now,Epoch_now); //OutputArray[40]=Altitude.value= formatvalue((r -Earth_equatorial_radius),10); //OutputArray[41]=GeoAltitude.value=formatvalue((r-GeoSyncRadius),8); //OutputArray[42]=GeoDeticAltitude.value=(R / Math.cos(geodeticLat)) - 1*Earth_equatorial_radius*C; //OutputArray[43]=AverageDriftrate.value= //OutputArray[44]=AverageDriftrateDirection.value=OutputArray[44]; //OutputArray[45]=average_distance_from_geo_sync_radius=OutputArray[45];=AvrGeoAltitude.value; //OutputArray[46]=toDeg*Math.asin( Math.tan(i/2)*Math.tan(i/2) );// EW_oscillation_caused_by_inclination.value; //OutputArray[47]=toDeg*(2*e );EW_oscillation_caused_by_eccentricity.value; //window.status=toDeg*(7.29211510/100000)*(Epoch_now-Epoch_start)*60*60*24; return(OutputArray); } function Convert_to_deg_min_sec(Number){ var Hour,Min,Sec,hhmmss Hour=formatvalue( Math.floor(Number),2); Min=Math.floor((Number- Math.floor(Hour))*60); Sec=Math.floor( ((Number- Math.floor(Hour))*60 - Min)*60 ); Sec= ((Number- Math.floor(Hour))*60 - Min)*60 Min=formatvalue(Min ,2); Sec=formatvalue(Sec ,5); if (Hour<10) Hour="0"+Hour; if (Min<10) Min="0"+Min; if (Sec<10) Sec="0"+Sec; hhmmss=Hour+":"+Min+":"+Sec; return(hhmmss); } function formatvalue(input, rsize) // Desimal avrunding { var invalid = "**************************"; var nines = "999999999999999999999999"; var strin = "" + input; var fltin = parseFloat(strin); if (strin.length <= rsize) return strin; if (strin.indexOf("e") != -1 || fltin > parseFloat(nines.substring(0,rsize)+".4")) return invalid.substring(0, rsize); var rounded = "" + (fltin + (fltin - parseFloat(strin.substring(0, rsize)))); return rounded.substring(0, rsize); } function onchange_satellite_rev_solarday(){ satellite_rev_pr_solar_day=Satellite_rev_solar_day.value*1; satellite_rev_pr_sidereal_day=1/satellite_rev_pr_solar_day; Satellite_rev_sidereal_day.value=satellite_rev_pr_sidereal_day; Altitude.value=Math.pow( (6028.9* (1440/satellite_rev_pr_sidereal_day)), (2/3) ) -Earth_equatorial_radius; GeoAltitude.value=Math.pow( (6028.9* (1440/satellite_rev_pr_sidereal_day)), (2/3) )-GeoSyncRadius; } function onchange_satellite_rev_siderealday(){ satellite_rev_pr_sidereal_day=Satellite_rev_sidereal_day.value; satellite_rev_pr_solar_day=1/satellite_rev_pr_sidereal_day; Satellite_rev_solar_day.value=satellite_rev_pr_solar_day; Altitude.value= Math.pow( (6028.9* (1440/satellite_rev_pr_sidereal_day)), (2/3) ) -Earth_equatorial_radius; GeoAltitude.value=Math.pow( (6028.9* (1440/satellite_rev_pr_sidereal_day)), (2/3) )-GeoSyncRadius; } function getdriftrate(){ Driftrate.value=Rev((Satellite_rev_solar_day.value*1+Earth_rev_solar_day.value*1)*360); if ((1*Driftrate.value)<0) Direction.value="East" else Direction.value="West"; // sannsynligvis er korrekt driftrate 1/solarday + sat_siderealday satellite_deg_pr_sidereal_day=360*satellite_rev_pr_sidereal_day; satellite_deg_pr_solar_day=360*satellite_rev_pr_solar_day; Satellite_deg_sidereal_day.value=satellite_deg_pr_sidereal_day; Satellite_deg_solar_day.value=satellite_deg_pr_solar_day; //Misc.value=Rev( (satellite_rev_pr_solar_day+earth_rev_pr_solar_day) * 360); // deg. pr. 24 solar hours // Epoch starttid regnes ut feil !!!! }