Ignore:
Timestamp:
12/17/14 11:14:05 (9 years ago)
Author:
rlacroix
Message:

Expose the calendar operations through the Fortran interface.

  • Add arithmetic operations on the xios_duration and xios_date types:
    • xios_duration + xios_duration = xios_duration
    • xios_duration - xios_duration = xios_duration
    • scalar * xios_duration = xios_duration * scalar = xios_duration
    • - xios_duration = xios_duration
    • xios_date + xios_duration = xios_date
    • xios_date - xios_duration = xios_date
    • xios_date - xios_date = xios_duration
  • Add comparison operations on the xios_duration and xios_date types:
    • xios_duration: ==, /=
    • xios_date: ==, /=, <, <=, >, >=
  • Add a new function "xios_date_convert_to_seconds" to convert a date into the number of seconds since the time origin of the calendar
  • Define some constant durations "xios_second", "xios_minute", "xios_hour", "xios_day", "xios_month", "xios_year" et "xios_timestep" to ease the definition of new durations (for example, 10h is just 10 * xios_hour)
  • Add a new function "xios_set_calendar" so that one can manually create the calendar attached to the current context and thus use the calendar operations before calling "xios_close_context_definition". This function can accept optional parameters so that the calendar attributes (calendar_type, start_date, time_origin and timestep) can be easily overwritten. Note that you cannot define a new calendar after one was already created (either because "xios_set_calendar" or "xios_close_context_definition" was used)
  • Readd the function "xios_set_timestep" as a simplified alias of "xios_set_context_attr(context, timestep)" for the current context
File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/interface/fortran/idate.F90

    r537 r545  
    22MODULE IDATE 
    33   USE, INTRINSIC :: ISO_C_BINDING 
     4   USE DATE_INTERFACE 
    45 
    5    ! enum XCalendarType 
    6    INTEGER(kind = C_INT), PARAMETER :: D360 = 0 , ALLLEAP = 1 , NOLEAP = 2 , JULIAN = 3 , GREGORIAN = 4 
     6   INTERFACE OPERATOR(+) 
     7      MODULE PROCEDURE xios(date_add_duration) 
     8   END INTERFACE 
    79 
    8    TYPE, BIND(C) :: txios(date) 
    9       INTEGER(kind = C_INT) :: year, month, day, hour, minute, second 
    10    END TYPE txios(date) 
     10   INTERFACE OPERATOR(-) 
     11      MODULE PROCEDURE xios(date_sub_duration) 
     12      MODULE PROCEDURE xios(date_sub) 
     13   END INTERFACE 
    1114 
    12    TYPE, BIND(C) :: txios(duration) 
    13       REAL(kind = C_DOUBLE) :: year=0, month=0, day=0, hour=0, minute=0, second=0, timestep=0 
    14    END TYPE txios(duration) 
     15   INTERFACE OPERATOR(==) 
     16      MODULE PROCEDURE xios(date_eq) 
     17   END INTERFACE 
    1518 
    16    INTERFACE ! Ne pas appeler directement/Interface FORTRAN 2003 <-> C99 
     19   INTERFACE OPERATOR(/=) 
     20      MODULE PROCEDURE xios(date_neq) 
     21   END INTERFACE 
    1722 
    18       SUBROUTINE cxios_update_calendar(step) BIND(C) 
    19          IMPORT C_INT 
    20          INTEGER (kind = C_INT), VALUE :: step 
    21       END SUBROUTINE cxios_update_calendar 
     23   INTERFACE OPERATOR(<) 
     24      MODULE PROCEDURE xios(date_lt) 
     25   END INTERFACE 
    2226 
     27   INTERFACE OPERATOR(<=) 
     28      MODULE PROCEDURE xios(date_le) 
    2329   END INTERFACE 
    24     
     30 
     31   INTERFACE OPERATOR(>) 
     32      MODULE PROCEDURE xios(date_gt) 
     33   END INTERFACE 
     34 
     35   INTERFACE OPERATOR(>=) 
     36      MODULE PROCEDURE xios(date_ge) 
     37   END INTERFACE 
     38 
    2539   CONTAINS ! Fonctions disponibles pour les utilisateurs. 
    2640 
    27    SUBROUTINE xios(update_calendar)(step) 
    28      IMPLICIT NONE 
    29      INTEGER, INTENT(IN):: step 
    30        
    31       IF (step < 0) THEN 
    32          PRINT *, "L'argument 'step' ne peut être négatif" 
    33          STOP 
    34       END IF 
    35       CALL cxios_update_calendar(step) 
    36    END SUBROUTINE xios(update_calendar) 
     41   FUNCTION xios(date_convert_to_seconds)(date) RESULT(res) 
     42      USE DATE_INTERFACE, only : txios(date) 
     43      IMPLICIT NONE 
     44      TYPE(txios(date)), INTENT(IN) :: date 
     45      INTEGER(kind = C_LONG_LONG) :: res 
     46 
     47      res = cxios_date_convert_to_seconds(date) 
     48   END FUNCTION xios(date_convert_to_seconds) 
     49 
     50   ! Addition: date + duration = date 
     51 
     52   FUNCTION xios(date_add_duration)(date, dur) RESULT(res) 
     53      USE DATE_INTERFACE, only : txios(date) 
     54      USE IDURATION, only : txios(duration) 
     55      IMPLICIT NONE 
     56      TYPE(txios(date)), INTENT(IN) :: date 
     57      TYPE(txios(duration)), INTENT(IN) :: dur 
     58      TYPE(txios(date)) :: res 
     59 
     60      res = cxios_date_add_duration(date, dur) 
     61   END FUNCTION xios(date_add_duration) 
     62 
     63   ! Subtraction: date - duration = date 
     64 
     65   FUNCTION xios(date_sub_duration)(date, dur) RESULT(res) 
     66      USE DATE_INTERFACE, only : txios(date) 
     67      USE IDURATION, only : txios(duration) 
     68      IMPLICIT NONE 
     69      TYPE(txios(date)), INTENT(IN) :: date 
     70      TYPE(txios(duration)), INTENT(IN) :: dur 
     71      TYPE(txios(date)) :: res 
     72 
     73      res = cxios_date_sub_duration(date, dur) 
     74   END FUNCTION xios(date_sub_duration) 
     75 
     76   ! Subtraction: date - date = duration 
     77 
     78   FUNCTION xios(date_sub)(date1, date2) RESULT(res) 
     79      USE DATE_INTERFACE, only : txios(date) 
     80      USE IDURATION, only : txios(duration) 
     81      IMPLICIT NONE 
     82      TYPE(txios(date)), INTENT(IN) :: date1, date2 
     83      TYPE(txios(duration)) :: res 
     84 
     85      res = cxios_date_sub(date1, date2) 
     86   END FUNCTION xios(date_sub) 
     87 
     88   FUNCTION xios(date_eq)(date1, date2) RESULT(res) 
     89      USE DATE_INTERFACE, only : txios(date) 
     90      IMPLICIT NONE 
     91      TYPE(txios(date)), INTENT(IN) :: date1, date2 
     92      LOGICAL :: res 
     93 
     94      res = cxios_date_eq(date1, date2) 
     95   END FUNCTION xios(date_eq) 
     96 
     97   FUNCTION xios(date_neq)(date1, date2) RESULT(res) 
     98      USE DATE_INTERFACE, only : txios(date) 
     99      IMPLICIT NONE 
     100      TYPE(txios(date)), INTENT(IN) :: date1, date2 
     101      LOGICAL :: res 
     102 
     103      res = cxios_date_neq(date1, date2) 
     104   END FUNCTION xios(date_neq) 
     105 
     106   FUNCTION xios(date_lt)(date1, date2) RESULT(res) 
     107      USE DATE_INTERFACE, only : txios(date) 
     108      IMPLICIT NONE 
     109      TYPE(txios(date)), INTENT(IN) :: date1, date2 
     110      LOGICAL :: res 
     111 
     112      res = cxios_date_lt(date1, date2) 
     113   END FUNCTION xios(date_lt) 
     114 
     115   FUNCTION xios(date_le)(date1, date2) RESULT(res) 
     116      USE DATE_INTERFACE, only : txios(date) 
     117      IMPLICIT NONE 
     118      TYPE(txios(date)), INTENT(IN) :: date1, date2 
     119      LOGICAL :: res 
     120 
     121      res = cxios_date_le(date1, date2) 
     122   END FUNCTION xios(date_le) 
     123 
     124   FUNCTION xios(date_gt)(date1, date2) RESULT(res) 
     125      USE DATE_INTERFACE, only : txios(date) 
     126      IMPLICIT NONE 
     127      TYPE(txios(date)), INTENT(IN) :: date1, date2 
     128      LOGICAL :: res 
     129 
     130      res = cxios_date_gt(date1, date2) 
     131   END FUNCTION xios(date_gt) 
     132 
     133   FUNCTION xios(date_ge)(date1, date2) RESULT(res) 
     134      USE DATE_INTERFACE, only : txios(date) 
     135      IMPLICIT NONE 
     136      TYPE(txios(date)), INTENT(IN) :: date1, date2 
     137      LOGICAL :: res 
     138 
     139      res = cxios_date_ge(date1, date2) 
     140   END FUNCTION xios(date_ge) 
    37141 
    38142END MODULE IDATE 
Note: See TracChangeset for help on using the changeset viewer.