A software package that provides a set of simple interfaces for modelers to perform computations related to time and dates.
fms_mod
use time_manager_mod [, only: set_time,
get_time,
increment_time,
decrement_time,
time_gt,
time_ge,
time_lt,
time_le,
time_eq,
time_ne,
time_plus,
time_minus,
time_scalar_mult,
scalar_time_mult,
time_divide,
time_real_divide,
time_scalar_divide,
interval_alarm,
repeat_alarm,
set_calendar_type,
get_calendar_type,
get_date,
set_date,
increment_date,
decrement_date,
days_in_month,
leap_year,
length_of_year,
days_in_year,
month_name,
time_manager_init,
print_time,
print_date ]
| Name | Type | Value | Units | Description |
|---|---|---|---|---|
| time_type | derived type | --- | --- | Derived-type data variable used to store time and date quantities. It contains two PRIVATE variables: seconds and days. |
<B> set_time </B>(seconds, days)
| seconds | A number of seconds (can be greater than 86400), must be positive. [integer, dimension(scalar)] |
| days | A number of days, must be positive. [integer, dimension(scalar)] |
| A time interval corresponding to this number of days and seconds. [, dimension] |
call get_time </B>(time, seconds, days)
| time | A time interval. [time_type] |
| seconds | A number of seconds (< 86400). [integer, dimension(scalar)] |
| days | A number of days, must be positive. [integer, dimension(scalar)] |
increment_time (time, seconds, days)
| time | A time interval. [time_type, dimension] |
| seconds | Increment of seconds (can be greater than 86400); must be positive. [integer, dimension(scalar)] |
| days | Increment of days; must be positive. [integer, dimension(scalar)] |
| A time that adds this increment to the input time. [, dimension] |
decrement_time (time, seconds, days)
| time | A time interval. [time_type, dimension] |
| seconds | Decrement of seconds (can be greater than 86400); must be positive. [integer, dimension(scalar)] |
| days | Decrement of days; must be positive. [integer, dimension(scalar)] |
| A time that subtracts this decrement from an input time. If
the result is negative, it is considered a fatal error. [, dimension] |
<B> time_gt </B>(time1, time2)
| time1 | A time interval. [time_type, dimension] |
| time2 | A time interval. [time_type, dimension] |
| Returns true if time1 > time2 [logical, dimension] |
<B> time_ge </B>(time1, time2)
| time1 | A time interval. [time_type, dimension] |
| time2 | A time interval. [time_type, dimension] |
| Returns true if time1 >= time2 [logical, dimension] |
<B> time_lt </B>(time1, time2)
| time1 | A time interval. [time_type, dimension] |
| time2 | A time interval. [time_type, dimension] |
| Returns true if time1 < time2 [logical, dimension] |
<B> time_le </B>(time1, time2)
| time1 | A time interval. [time_type, dimension] |
| time2 | A time interval. [time_type, dimension] |
| Returns true if time1 <= time2 [logical, dimension] |
<B> time_eq </B>(time1, time2)
| time1 | A time interval. [time_type, dimension] |
| time2 | A time interval. [time_type, dimension] |
| Returns true if time1 == time2 [logical, dimension] |
<B> time_ne </B>(time1, time2)
| time1 | A time interval. [time_type, dimension] |
| time2 | A time interval. [time_type, dimension] |
| Returns true if time1 /= time2 [logical, dimension] |
<B> time_plus </B>(time1, time2)
| time1 | A time interval. [time_type, dimension] |
| time2 | A time interval. [time_type, dimension] |
| Returns sum of two time_types. [time_type, dimension] |
<B> time_minus </B>(time1, time2)
| time1 | A time interval. [time_type, dimension] |
| time2 | A time interval. [time_type, dimension] |
| Returns difference of two time_types. [time_type, dimension] |
<B> time_scalar_mult </B>(time, n)
| time | A time interval. [time_type, dimension] |
| n | A time interval. [integer, dimension] |
| Returns time multiplied by integer factor n. [time_type, dimension] |
<B> scalar_time_mult </B>(n, time)
| time | A time interval. [time_type, dimension] |
| n | An integer. [integer, dimension] |
| Returns time multiplied by integer factor n. [time_type, dimension] |
<B> time_divide </B>(time1, time2)
| time1 | A time interval. [time_type, dimension] |
| time2 | A time interval. [time_type, dimension] |
| Returns the largest integer, n, for which time1 >= time2 * n. [integer, dimension] |
<B> time_real_divide </B>(time1, time2)
| time1 | A time interval. [time_type, dimension] |
| time2 | A time interval. [time_type, dimension] |
| Returns the double precision quotient of two times [integer, dimensiondouble precision] |
<B> time_scalar_divide </B>(time, n)
| time | A time interval. [time_type, dimension] |
| n | An integer factor. [integer, dimension] |
| Returns the largest time, t, for which n * t <= time. [integer, dimensiondouble precision] |
interval_alarm (time, time_interval, alarm, alarm_interval)
| time | Current time. [time_type] |
| time_interval | A time interval. [time_type] |
| alarm_interval | A time interval. [time_type] |
| alarm | An alarm time, which is incremented by the alarm_interval
if the function is true. [time_type] |
| interval_alarm | Returns either True or false. [logical] |
repeat_alarm
| time | Current time. [time_type] |
| alarm_frequency | A time interval for alarm_frequency. [time_type] |
| alarm_length | A time interval for alarm_length. [time_type] |
| repeat_alarm | Returns either True or false. [logical] |
call set_calendar_type (type)
| type | A constant number for setting the calendar type. [integer, dimension] |
| calendar_type | A constant number for default calendar type. [integer] |
get_calendar_type ()
call get_date (time, year, month, day, hour, minute, second)
| time | A time interval. [time_type] |
| day |
[integer] |
| month |
[integer] |
| year |
[integer] |
| second |
[integer] |
| minute |
[integer] |
| hour |
[integer] |
set_date (year, month, day, hours, minutes, seconds)
| time | A time interval. [time_type] |
| day |
[integer] |
| month |
[integer] |
| year |
[integer] |
| second |
[integer] |
| minute |
[integer] |
| hour |
[integer] |
| set_date | A time interval. [time_type] |
increment_date (time, years, months, days, hours, minutes, seconds)
| time | A time interval. [time_type] |
| day | An increment of days. [integer] |
| month | An increment of months. [integer] |
| year | An increment of years. [integer] |
| second | An increment of seconds. [integer] |
| minute | An increment of minutes. [integer] |
| hour | An increment of hours. [integer] |
| increment_date | A new time based on the input
time interval and the default calendar type. [time_type] |
decrement_date (time, years, months, days, hours, minutes, seconds)
| time | A time interval. [time_type] |
| day | A decrement of days. [integer] |
| month | A deincrement of months. [integer] |
| year | A deincrement of years. [integer] |
| second | A deincrement of seconds. [integer] |
| minute | A deincrement of minutes. [integer] |
| hour | A deincrement of hours. [integer] |
| decrement_date | A new time based on the input
time interval and the default calendar type. [time_type] |
<B> days_in_month (time)
| time | A time interval. [time_type, dimension] |
| days_in_month | The number of days in the month given the selected time
mapping algorithm. [integer, dimension] |
leap_year (time)
| time | A time interval. [time_type, dimension] |
| leap_year | True if the year corresponding to the date for the default
calendar is a leap year. False for THIRTY_DAY_MONTHS and
NO_LEAP and otherwise. [calendar_type, dimension] |
length_of_year ()
days_in_year ()
| time | A time interval. [time_type] |
| The number of days in this year for the default calendar type. |
month_name (n)
| n | Month number. [integer] |
| month_name | The character string associated with a month. For now all
calendars have 12 months and will return standard names. [character] |
time_manager_init ()
print_time (time,str,unit)
| time | Time that will be printed. [time_type] |
| str | Character string that precedes the printed time or date. [character (len=*)] |
| unit | Unit number for printed output. The default unit is stdout. [integer] |
print_date (time,str,unit)
| time | Time that will be printed. [time_type] |
| str | Character string that precedes the printed time or date. [character (len=*)] |
| unit | Unit number for printed output. The default unit is stdout. [integer] |
use time_manager_mod
implicit none
type(time_type) :: dt, init_date, astro_base_date, time, final_date
type(time_type) :: next_rad_time, mid_date
type(time_type) :: repeat_alarm_freq, repeat_alarm_length
integer :: num_steps, i, days, months, years, seconds, minutes, hours
integer :: months2, length
real :: astro_days
Set calendar type
call set_calendar_type(THIRTY_DAY_MONTHS)
call set_calendar_type(JULIAN)
call set_calendar_type(NO_LEAP)
Set timestep
dt = set_time(1100, 0)
Set initial date
init_date = set_date(1992, 1, 1)
Set date for astronomy delta calculation
astro_base_date = set_date(1970, 1, 1, 12, 0, 0)
Copy initial time to model current time
time = init_date
Determine how many steps to do to run one year
final_date = increment_date(init_date, years = 1)
num_steps = (final_date - init_date) / dt
write(*, *) 'Number of steps is' , num_steps
Want to compute radiation at initial step, then every two hours
next_rad_time = time + set_time(7200, 0)
Test repeat alarm
repeat_alarm_freq = set_time(0, 1)
repeat_alarm_length = set_time(7200, 0)
Loop through a year
do i = 1, num_steps
Increment time
time = time + dt
Test repeat alarm
if(repeat_alarm(time, repeat_alarm_freq, repeat_alarm_length)) &
write(*, *) 'REPEAT ALARM IS TRUE'
Should radiation be computed? Three possible tests.
First test assumes exact interval; just ask if times are equal
if(time == next_rad_time) then
Second test computes rad on last time step that is <= radiation time
if((next_rad_time - time) < dt .and. time < next_rad) then
Third test computes rad on time step closest to radiation time
if(interval_alarm(time, dt, next_rad_time, set_time(7200, 0))) then
call get_date(time, years, months, days, hours, minutes, seconds)
write(*, *) days, month_name(months), years, hours, minutes, seconds
Need to compute real number of days between current time and astro_base
call get_time(time - astro_base_date, seconds, days)
astro_days = days + seconds / 86400.
write(*, *) 'astro offset ', astro_days
end if
Can compute daily, monthly, yearly, hourly, etc. diagnostics as for rad
Example: do diagnostics on last time step of this month
call get_date(time + dt, years, months2, days, hours, minutes, seconds)
call get_date(time, years, months, days, hours, minutes, seconds)
if(months /= months2) then
write(*, *) 'last timestep of month'
write(*, *) days, months, years, hours, minutes, seconds
endif
Example: mid-month diagnostics; inefficient to make things clear
length = days_in_month(time)
call get_date(time, years, months, days, hours, minutes, seconds)
mid_date = set_date(years, months, 1) + set_time(0, length) / 2
if(time < mid_date .and. (mid_date - time) < dt) then
write(*, *) 'mid-month time'
write(*, *) days, months, years, hours, minutes, seconds
endif
end do end program time_main2