Notes on time keeping in gpredict
---------------------------------

The SGP4/SDP4 algorithms require the time since Epoch in minutes (tsince). The
sat_t data structure, on the other hand, keeps the Epoch time and the current
time as Julian dates. They can be obtained using the Julian_Date_of_Epoch and
get_current_daynum functions. To obtain tsince, on can simply multiply the
difference between these two with the number of minutes per day:

tsince = (sat->jul_utc - sat->jul_epoch) * xmnpd

Similarly, when predicting passes, a specific Julian date can be obtained from
tsince by dividing tsince with the number of minutes per day and adding the
Epoch time as Julian date to it:

jul_day(AOS) = tsince(AOS)/xmnpd + sat->jul_epoch


The file sgpsdp/sgp_time.c contains many other functions that can be used to
convert between calendar date/time and Julian date.


Nomenclature
------------

Julian day
The Julian day or Julian day number (JDN) is the number of days that have
elapsed since 12 noon Greenwich Mean Time (UT or TT) on Monday, January 1,
4713 BC in the proleptic Julian calendar.

Julian date
The Julian Date (JD) is the Julian day number plus the decimal fraction of the
day that has elapsed since noon.


The Time Manager
----------------

Each module has its own built-in time manager, which keeps track of
the module time. Besides real-time, gpredict also allows the user to
use simulated real-time and manual time keeping individually for each
module. Each of these are described in following.

Real-time:
The clock of the module is synchronised to the system time in a 1:1 relation.

Simulated real-time:
Also called time-throttling. The clock of the module is synchronised to the
system time in a 1:N relation, where N is an integer. Thus, if N=2, for every
second the module time will be incremented by 2 seconds. If N=-2, the module
time will be decremented with 2 seconds in every second.

Manual:
When using this option, the time of the module is frozen. The user can then
scroll forward and backward in time using various controls. The time
resolution here is 1 second.

By default, each module will use real-time. In order to enter another time
keeping state, the user has to open the Time Manager from the module pop-up
menu.

Fortunately, the implementation of GtkSatModule is very generic where time is
simply a state variable. A module will thus not care about whether the time
is acquires is real-time or simulated time.

Time keeping works by using a throttling state variable that indicates how
the time should be incremented. This state variable is a signed integer with
following values:

 0: Paused; in this state the time is kept constant in every cycle but it is
    adjustable by the user using various controls.

 1: Real time; in every cycle the time manager reads the current system time
    and performs the update according to this time.

Any other value indicated simulated real-time indicating the throttling factor
that is applied to the actual real-time. For example a value of 2 will take
twice as big steps as the real-time clock. Negative values have the same
meaning but in backwards direction.

By default, the module starts up in real-time mode, i.e. throttle = 1. Via the
module pop-up menu, the user can bring up the "Time Controller" window
containing various widgets to control the throttling state.


