source: XIOS/trunk/src/interface/fortran/date_interface.F90 @ 549

Last change on this file since 549 was 549, checked in by rlacroix, 9 years ago

Revised calendar functionalities:

  • the calendar is now configured from a specific calendar child node of the context in the XML configuration file. Example: <calendar type="Gregorian" start_date="2012-03-01 15:00:00" time_origin="2012-02-29 15:00:00" timestep="1h" />
  • the calendar type should now be configured when defining the start time and/or the time origin.
  • the start time and the time origin are now optional, 0000-01-01 00:00:00 will be used by default. It is also possible to define them partially. For example, 2015 and 2014-12 are valid dates corresponding respectively to 2015-01-01 00:00:00 and 2014-12-01 00:00:00.
  • an optional duration offset can be added to the start date and time origin. For example, it's possible to define the date 2015-01-12 12:00:00 as 2015-01-11 + 36h or 2015-01-11 12:00:00 + 1d. The duration format is the same as the time step. Being that the date is optional, it is possible to only use a duration (for example + 42s is the same as 0000-01-01 00:00:00 + 42s). An error will be raised if a duration based on the time step is used before the time step was configured. For example, the following would cause an error: <calendar type="Gregorian" start_date="+ 1ts" /> but <calendar type="Gregorian" start_date="+ 1ts" timestep="0.5h" /> would not.
  • new Fortran interface to define the calendar:
    • xios_define_calendar(type[, timestep, start_date, time_origin]) will create a calendar when none had previously been defined. Only the type argument is mandatory, the rest is optional. Calendar operations on dates and durations are possible as soon as the calendar is created (either using this procedure or directly from the XML configuration file).
    • the following getter and setter procedures are available: xios_set_timestep, xios_set_start_date, xios_set_time_origin, xios_get_calendar_type, xios_get_timestep, xios_get_start_date, xios_get_time_origin.
  • new Fortran interface to interact with the calendar: xios_update_calendar, xios_get_current_date, xios_get_year_length_in_seconds, xios_get_day_length_in_seconds.
  • new Fortran interface for date conversion: xios_date_get_second_of_year, xios_date_get_day_of_year, xios_date_get_fraction_of_year, xios_date_get_second_of_day, xios_date_get_fraction_of_day.
  • two new placeholders are available to format the file name when splitting the output (split_freq_format attribute):
    • %S the number of seconds since the time origin
    • %D the integral number of days since the time origin
File size: 3.8 KB
Line 
1#include "../fortran/xios_fortran_prefix.hpp"
2
3MODULE DATE_INTERFACE
4   USE, INTRINSIC :: ISO_C_BINDING
5
6   TYPE, BIND(C) :: txios(date)
7      INTEGER(kind = C_INT) :: year, month, day, hour, minute, second
8   END TYPE txios(date)
9
10   INTERFACE ! Ne pas appeler directement/Interface FORTRAN 2003 <-> C99
11
12      INTEGER(kind = C_LONG_LONG) FUNCTION cxios_date_convert_to_seconds(date) BIND(C)
13         USE ISO_C_BINDING
14         IMPORT :: txios(date)
15         TYPE(txios(date)), VALUE :: date
16      END FUNCTION cxios_date_convert_to_seconds
17
18      TYPE(txios(date)) FUNCTION cxios_date_add_duration(date, dur) BIND(C)
19         USE ISO_C_BINDING
20         USE IDURATION, only : txios(duration)
21         IMPORT :: txios(date)
22         TYPE(txios(date)), VALUE :: date
23         TYPE(txios(duration)), VALUE :: dur
24      END FUNCTION cxios_date_add_duration
25
26      TYPE(txios(date)) FUNCTION cxios_date_sub_duration(date, dur) BIND(C)
27         USE ISO_C_BINDING
28         USE IDURATION, only : txios(duration)
29         IMPORT :: txios(date)
30         TYPE(txios(date)), VALUE :: date
31         TYPE(txios(duration)), VALUE :: dur
32      END FUNCTION cxios_date_sub_duration
33
34      TYPE(txios(duration)) FUNCTION cxios_date_sub(date1, date2) BIND(C)
35         USE ISO_C_BINDING
36         USE IDURATION, only : txios(duration)
37         IMPORT :: txios(date)
38         TYPE(txios(date)), VALUE :: date1, date2
39      END FUNCTION cxios_date_sub
40
41      LOGICAL(kind = C_BOOL) FUNCTION cxios_date_eq(date1, date2) BIND(C)
42         USE ISO_C_BINDING
43         IMPORT :: txios(date)
44         TYPE(txios(date)), VALUE :: date1, date2
45      END FUNCTION cxios_date_eq
46
47      LOGICAL(kind = C_BOOL) FUNCTION cxios_date_neq(date1, date2) BIND(C)
48         USE ISO_C_BINDING
49         IMPORT :: txios(date)
50         TYPE(txios(date)), VALUE :: date1, date2
51      END FUNCTION cxios_date_neq
52
53      LOGICAL(kind = C_BOOL) FUNCTION cxios_date_lt(date1, date2) BIND(C)
54         USE ISO_C_BINDING
55         IMPORT :: txios(date)
56         TYPE(txios(date)), VALUE :: date1, date2
57      END FUNCTION cxios_date_lt
58
59      LOGICAL(kind = C_BOOL) FUNCTION cxios_date_le(date1, date2) BIND(C)
60         USE ISO_C_BINDING
61         IMPORT :: txios(date)
62         TYPE(txios(date)), VALUE :: date1, date2
63      END FUNCTION cxios_date_le
64
65      LOGICAL(kind = C_BOOL) FUNCTION cxios_date_gt(date1, date2) BIND(C)
66         USE ISO_C_BINDING
67         IMPORT :: txios(date)
68         TYPE(txios(date)), VALUE :: date1, date2
69      END FUNCTION cxios_date_gt
70
71      LOGICAL(kind = C_BOOL) FUNCTION cxios_date_ge(date1, date2) BIND(C)
72         USE ISO_C_BINDING
73         IMPORT :: txios(date)
74         TYPE(txios(date)), VALUE :: date1, date2
75      END FUNCTION cxios_date_ge
76
77      INTEGER(kind = C_INT) FUNCTION cxios_date_get_second_of_year(date) BIND(C)
78         USE ISO_C_BINDING
79         IMPORT :: txios(date)
80         TYPE(txios(date)), VALUE :: date
81      END FUNCTION cxios_date_get_second_of_year
82
83      REAL(kind = C_DOUBLE) FUNCTION cxios_date_get_day_of_year(date) BIND(C)
84         USE ISO_C_BINDING
85         IMPORT :: txios(date)
86         TYPE(txios(date)), VALUE :: date
87      END FUNCTION cxios_date_get_day_of_year
88
89      REAL(kind = C_DOUBLE) FUNCTION cxios_date_get_fraction_of_year(date) BIND(C)
90         USE ISO_C_BINDING
91         IMPORT :: txios(date)
92         TYPE(txios(date)), VALUE :: date
93      END FUNCTION cxios_date_get_fraction_of_year
94
95      INTEGER(kind = C_INT) FUNCTION cxios_date_get_second_of_day(date) BIND(C)
96         USE ISO_C_BINDING
97         IMPORT :: txios(date)
98         TYPE(txios(date)), VALUE :: date
99      END FUNCTION cxios_date_get_second_of_day
100
101      REAL(kind = C_DOUBLE) FUNCTION cxios_date_get_fraction_of_day(date) BIND(C)
102         USE ISO_C_BINDING
103         IMPORT :: txios(date)
104         TYPE(txios(date)), VALUE :: date
105      END FUNCTION cxios_date_get_fraction_of_day
106
107   END INTERFACE
108
109END MODULE DATE_INTERFACE
Note: See TracBrowser for help on using the repository browser.