source: XIOS/trunk/src/interface/fortran_attr/calendar_wrapper_interface_attr.F90 @ 550

Last change on this file since 550 was 550, checked in by rlacroix, 6 years ago

Add a new user defined calendar type.

A new calendar type "user_defined" is now available. This allows the users to create a custom calendar that we can configured to be suitable for planets other than the Earth.

An user defined calendar is always defined by two mandatory attributes:

  • day_length: the duration of a day, in seconds
  • and either:
    • month_length: an array containing the duration of each month, in days (the number of elements in the array is the number of months in a year)
    • or year_length: the duration of a year, in seconds (in that case, the calendar does not have months).

If the calendar has months (i.e. month_length attribute is set) and only in that case, it is possible to define leap years in order to compensate for the duration of an astronomical year not being a multiple of the day length. The leap years are defined by two mandatory attributes:

  • leap_year_month: the month to which the extra day will be added in case of leap year, expressed as an integer number in the range [1, numberOfMonths]
  • and leap_year_drift: the fraction of a day representing the yearly drift between the calendar year and the astronomical year, expressed as a real number in the range [0, 1).

Optionally, one can define the leap_year_drift_offset attribute to set the original drift at the beginning of the time origin's year, again expressed as a real number in the range [0, 1). If leap_year_drift_offset + leap_year_drift is greater or equal to 1, then the first year will be a leap year.

For example, the following configuration creates a Gregorian-like calendar:

<calendar type="user_defined" start_date="2012-03-01 15:00:00" time_origin="2012-02-28 15:00:00 + 1d" day_length="86400" month_lengths="(1, 12) [31 28 31 30 31 30 31 31 30 31 30 31]" leap_year_month="2" leap_year_drift="0.25" leap_year_drift_offset="0.75" />

Note that dates attributes must be written differently in the configuration file when using an user defined calendar without months:

  • if the year length is greater than the day length, the input format is year-day hh:min:sec instead of year-month-day hh:min:sec
  • if the day length is greater or equal to the year length, the input format is year hh:min:sec.

In all cases, it is still possible to use the date + duration notation to build a date (with both the date and duration parts being optional).

The Fortran interface has been updated accordingly so that xios_define_calendar can accept the new attributes necessary to define custom calendars.

File size: 10.4 KB
Line 
1! * ************************************************************************** *
2! *               Interface auto generated - do not modify                     *
3! * ************************************************************************** *
4#include "../fortran/xios_fortran_prefix.hpp"
5
6MODULE calendar_wrapper_interface_attr
7  USE, INTRINSIC :: ISO_C_BINDING
8 
9  INTERFACE ! Do not call directly / interface FORTRAN 2003 <-> C99
10   
11   
12    SUBROUTINE cxios_set_calendar_wrapper_day_length(calendar_wrapper_hdl, day_length) BIND(C)
13      USE ISO_C_BINDING
14      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
15      INTEGER (KIND=C_INT)      , VALUE :: day_length
16    END SUBROUTINE cxios_set_calendar_wrapper_day_length
17   
18    SUBROUTINE cxios_get_calendar_wrapper_day_length(calendar_wrapper_hdl, day_length) BIND(C)
19      USE ISO_C_BINDING
20      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
21      INTEGER (KIND=C_INT)             :: day_length
22    END SUBROUTINE cxios_get_calendar_wrapper_day_length
23   
24    FUNCTION cxios_is_defined_calendar_wrapper_day_length(calendar_wrapper_hdl ) BIND(C)
25      USE ISO_C_BINDING
26      LOGICAL(kind=C_BOOL) :: cxios_is_defined_calendar_wrapper_day_length
27      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
28    END FUNCTION cxios_is_defined_calendar_wrapper_day_length
29   
30   
31    SUBROUTINE cxios_set_calendar_wrapper_leap_year_drift(calendar_wrapper_hdl, leap_year_drift) BIND(C)
32      USE ISO_C_BINDING
33      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
34      REAL (KIND=C_DOUBLE)      , VALUE :: leap_year_drift
35    END SUBROUTINE cxios_set_calendar_wrapper_leap_year_drift
36   
37    SUBROUTINE cxios_get_calendar_wrapper_leap_year_drift(calendar_wrapper_hdl, leap_year_drift) BIND(C)
38      USE ISO_C_BINDING
39      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
40      REAL (KIND=C_DOUBLE)             :: leap_year_drift
41    END SUBROUTINE cxios_get_calendar_wrapper_leap_year_drift
42   
43    FUNCTION cxios_is_defined_calendar_wrapper_leap_year_drift(calendar_wrapper_hdl ) BIND(C)
44      USE ISO_C_BINDING
45      LOGICAL(kind=C_BOOL) :: cxios_is_defined_calendar_wrapper_leap_year_drift
46      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
47    END FUNCTION cxios_is_defined_calendar_wrapper_leap_year_drift
48   
49   
50    SUBROUTINE cxios_set_calendar_wrapper_leap_year_drift_offset(calendar_wrapper_hdl, leap_year_drift_offset) BIND(C)
51      USE ISO_C_BINDING
52      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
53      REAL (KIND=C_DOUBLE)      , VALUE :: leap_year_drift_offset
54    END SUBROUTINE cxios_set_calendar_wrapper_leap_year_drift_offset
55   
56    SUBROUTINE cxios_get_calendar_wrapper_leap_year_drift_offset(calendar_wrapper_hdl, leap_year_drift_offset) BIND(C)
57      USE ISO_C_BINDING
58      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
59      REAL (KIND=C_DOUBLE)             :: leap_year_drift_offset
60    END SUBROUTINE cxios_get_calendar_wrapper_leap_year_drift_offset
61   
62    FUNCTION cxios_is_defined_calendar_wrapper_leap_year_drift_offset(calendar_wrapper_hdl ) BIND(C)
63      USE ISO_C_BINDING
64      LOGICAL(kind=C_BOOL) :: cxios_is_defined_calendar_wrapper_leap_year_drift_offset
65      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
66    END FUNCTION cxios_is_defined_calendar_wrapper_leap_year_drift_offset
67   
68   
69    SUBROUTINE cxios_set_calendar_wrapper_leap_year_month(calendar_wrapper_hdl, leap_year_month) BIND(C)
70      USE ISO_C_BINDING
71      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
72      INTEGER (KIND=C_INT)      , VALUE :: leap_year_month
73    END SUBROUTINE cxios_set_calendar_wrapper_leap_year_month
74   
75    SUBROUTINE cxios_get_calendar_wrapper_leap_year_month(calendar_wrapper_hdl, leap_year_month) BIND(C)
76      USE ISO_C_BINDING
77      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
78      INTEGER (KIND=C_INT)             :: leap_year_month
79    END SUBROUTINE cxios_get_calendar_wrapper_leap_year_month
80   
81    FUNCTION cxios_is_defined_calendar_wrapper_leap_year_month(calendar_wrapper_hdl ) BIND(C)
82      USE ISO_C_BINDING
83      LOGICAL(kind=C_BOOL) :: cxios_is_defined_calendar_wrapper_leap_year_month
84      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
85    END FUNCTION cxios_is_defined_calendar_wrapper_leap_year_month
86   
87   
88    SUBROUTINE cxios_set_calendar_wrapper_month_lengths(calendar_wrapper_hdl, month_lengths, extent1) BIND(C)
89      USE ISO_C_BINDING
90      INTEGER (kind = C_INTPTR_T), VALUE       :: calendar_wrapper_hdl
91      INTEGER (KIND=C_INT)     , DIMENSION(*) :: month_lengths
92      INTEGER (kind = C_INT), VALUE  :: extent1
93    END SUBROUTINE cxios_set_calendar_wrapper_month_lengths
94   
95    SUBROUTINE cxios_get_calendar_wrapper_month_lengths(calendar_wrapper_hdl, month_lengths, extent1) BIND(C)
96      USE ISO_C_BINDING
97      INTEGER (kind = C_INTPTR_T), VALUE       :: calendar_wrapper_hdl
98      INTEGER (KIND=C_INT)     , DIMENSION(*) :: month_lengths
99      INTEGER (kind = C_INT), VALUE  :: extent1
100    END SUBROUTINE cxios_get_calendar_wrapper_month_lengths
101   
102    FUNCTION cxios_is_defined_calendar_wrapper_month_lengths(calendar_wrapper_hdl ) BIND(C)
103      USE ISO_C_BINDING
104      LOGICAL(kind=C_BOOL) :: cxios_is_defined_calendar_wrapper_month_lengths
105      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
106    END FUNCTION cxios_is_defined_calendar_wrapper_month_lengths
107   
108   
109    SUBROUTINE cxios_set_calendar_wrapper_start_date(calendar_wrapper_hdl, start_date, start_date_size) BIND(C)
110      USE ISO_C_BINDING
111      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
112      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: start_date
113      INTEGER  (kind = C_INT)     , VALUE        :: start_date_size
114    END SUBROUTINE cxios_set_calendar_wrapper_start_date
115   
116    SUBROUTINE cxios_get_calendar_wrapper_start_date(calendar_wrapper_hdl, start_date, start_date_size) BIND(C)
117      USE ISO_C_BINDING
118      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
119      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: start_date
120      INTEGER  (kind = C_INT)     , VALUE        :: start_date_size
121    END SUBROUTINE cxios_get_calendar_wrapper_start_date
122   
123    FUNCTION cxios_is_defined_calendar_wrapper_start_date(calendar_wrapper_hdl ) BIND(C)
124      USE ISO_C_BINDING
125      LOGICAL(kind=C_BOOL) :: cxios_is_defined_calendar_wrapper_start_date
126      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
127    END FUNCTION cxios_is_defined_calendar_wrapper_start_date
128   
129   
130    SUBROUTINE cxios_set_calendar_wrapper_time_origin(calendar_wrapper_hdl, time_origin, time_origin_size) BIND(C)
131      USE ISO_C_BINDING
132      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
133      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: time_origin
134      INTEGER  (kind = C_INT)     , VALUE        :: time_origin_size
135    END SUBROUTINE cxios_set_calendar_wrapper_time_origin
136   
137    SUBROUTINE cxios_get_calendar_wrapper_time_origin(calendar_wrapper_hdl, time_origin, time_origin_size) BIND(C)
138      USE ISO_C_BINDING
139      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
140      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: time_origin
141      INTEGER  (kind = C_INT)     , VALUE        :: time_origin_size
142    END SUBROUTINE cxios_get_calendar_wrapper_time_origin
143   
144    FUNCTION cxios_is_defined_calendar_wrapper_time_origin(calendar_wrapper_hdl ) BIND(C)
145      USE ISO_C_BINDING
146      LOGICAL(kind=C_BOOL) :: cxios_is_defined_calendar_wrapper_time_origin
147      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
148    END FUNCTION cxios_is_defined_calendar_wrapper_time_origin
149   
150   
151    SUBROUTINE cxios_set_calendar_wrapper_timestep(calendar_wrapper_hdl, timestep) BIND(C)
152      USE ISO_C_BINDING
153      USE IDURATION
154      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
155      TYPE(txios(duration)), VALUE :: timestep
156    END SUBROUTINE cxios_set_calendar_wrapper_timestep
157   
158    SUBROUTINE cxios_get_calendar_wrapper_timestep(calendar_wrapper_hdl, timestep) BIND(C)
159      USE ISO_C_BINDING
160      USE IDURATION
161      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
162      TYPE(txios(duration)) :: timestep
163    END SUBROUTINE cxios_get_calendar_wrapper_timestep
164   
165    FUNCTION cxios_is_defined_calendar_wrapper_timestep(calendar_wrapper_hdl ) BIND(C)
166      USE ISO_C_BINDING
167      LOGICAL(kind=C_BOOL) :: cxios_is_defined_calendar_wrapper_timestep
168      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
169    END FUNCTION cxios_is_defined_calendar_wrapper_timestep
170   
171   
172    SUBROUTINE cxios_set_calendar_wrapper_type(calendar_wrapper_hdl, type, type_size) BIND(C)
173      USE ISO_C_BINDING
174      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
175      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: type
176      INTEGER  (kind = C_INT)     , VALUE        :: type_size
177    END SUBROUTINE cxios_set_calendar_wrapper_type
178   
179    SUBROUTINE cxios_get_calendar_wrapper_type(calendar_wrapper_hdl, type, type_size) BIND(C)
180      USE ISO_C_BINDING
181      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
182      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: type
183      INTEGER  (kind = C_INT)     , VALUE        :: type_size
184    END SUBROUTINE cxios_get_calendar_wrapper_type
185   
186    FUNCTION cxios_is_defined_calendar_wrapper_type(calendar_wrapper_hdl ) BIND(C)
187      USE ISO_C_BINDING
188      LOGICAL(kind=C_BOOL) :: cxios_is_defined_calendar_wrapper_type
189      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
190    END FUNCTION cxios_is_defined_calendar_wrapper_type
191   
192   
193    SUBROUTINE cxios_set_calendar_wrapper_year_length(calendar_wrapper_hdl, year_length) BIND(C)
194      USE ISO_C_BINDING
195      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
196      INTEGER (KIND=C_INT)      , VALUE :: year_length
197    END SUBROUTINE cxios_set_calendar_wrapper_year_length
198   
199    SUBROUTINE cxios_get_calendar_wrapper_year_length(calendar_wrapper_hdl, year_length) BIND(C)
200      USE ISO_C_BINDING
201      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
202      INTEGER (KIND=C_INT)             :: year_length
203    END SUBROUTINE cxios_get_calendar_wrapper_year_length
204   
205    FUNCTION cxios_is_defined_calendar_wrapper_year_length(calendar_wrapper_hdl ) BIND(C)
206      USE ISO_C_BINDING
207      LOGICAL(kind=C_BOOL) :: cxios_is_defined_calendar_wrapper_year_length
208      INTEGER (kind = C_INTPTR_T), VALUE :: calendar_wrapper_hdl
209    END FUNCTION cxios_is_defined_calendar_wrapper_year_length
210   
211   
212    END INTERFACE
213 
214END MODULE calendar_wrapper_interface_attr
Note: See TracBrowser for help on using the repository browser.