Ignore:
Timestamp:
02/10/15 14:23:02 (9 years ago)
Author:
rlacroix
Message:

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:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/interface/fortran_attr/calendar_wrapper_interface_attr.F90

    r549 r550  
    1010     
    1111     
     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     
    12109    SUBROUTINE cxios_set_calendar_wrapper_start_date(calendar_wrapper_hdl, start_date, start_date_size) BIND(C) 
    13110      USE ISO_C_BINDING 
     
    94191     
    95192     
     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     
    96212    END INTERFACE 
    97213   
Note: See TracChangeset for help on using the changeset viewer.