Ignore:
Timestamp:
12/17/14 11:14:05 (10 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
Location:
XIOS/trunk/src/interface/fortran
Files:
5 added
6 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/interface/fortran/context_interface.f90

    r501 r545  
    11MODULE CONTEXT_INTERFACE 
    22   USE, INTRINSIC :: ISO_C_BINDING 
    3       
     3 
    44   INTERFACE ! Ne pas appeler directement/Interface FORTRAN 2003 <-> C99 
    5       
     5 
    66      SUBROUTINE cxios_context_handle_create(ret, idt, idt_size) BIND(C) 
    77         import C_CHAR, C_INTPTR_T, C_INT 
     
    1010         INTEGER  (kind = C_INT)     , VALUE        :: idt_size 
    1111      END SUBROUTINE cxios_context_handle_create 
    12        
     12 
     13      SUBROUTINE cxios_context_get_current(context) BIND(C) 
     14         import C_INTPTR_T 
     15         INTEGER (kind = C_INTPTR_T) :: context 
     16      END SUBROUTINE cxios_context_get_current 
     17 
    1318      SUBROUTINE cxios_context_set_current(context, withswap) BIND(C) 
    1419         import C_BOOL, C_INT, C_INTPTR_T 
     
    2530 
    2631   END INTERFACE 
    27       
     32 
    2833END MODULE CONTEXT_INTERFACE 
  • XIOS/trunk/src/interface/fortran/icontext.F90

    r501 r545  
    44   USE, INTRINSIC :: ISO_C_BINDING 
    55   USE CONTEXT_INTERFACE 
     6   USE IDATE 
     7   USE IDURATION 
    68!   USE icontext_attr 
    7    USE IDATE 
    89 
    9      
     10 
    1011   TYPE txios(context) 
    1112      INTEGER(kind = C_INTPTR_T) :: daddr 
    1213   END TYPE txios(context) 
    13        
    14     
     14 
     15 
    1516   CONTAINS ! Fonctions disponibles pour les utilisateurs. 
    16     
     17 
    1718   SUBROUTINE xios(get_context_handle)(idt,ret) 
    1819      IMPLICIT NONE 
    19       CHARACTER(len = *)  , INTENT(IN)  :: idt       
     20      CHARACTER(len = *)  , INTENT(IN)  :: idt 
    2021      TYPE(txios(context)), INTENT(OUT):: ret 
    2122 
    22       CALL cxios_context_handle_create(ret%daddr, idt, len(idt))             
     23      CALL cxios_context_handle_create(ret%daddr, idt, len(idt)) 
    2324   END SUBROUTINE xios(get_context_handle) 
    24     
     25 
     26   SUBROUTINE xios(get_current_context)(context) 
     27      IMPLICIT NONE 
     28 
     29      TYPE(txios(context)), INTENT(IN) :: context 
     30 
     31      CALL cxios_context_get_current(context%daddr) 
     32 
     33   END SUBROUTINE xios(get_current_context) 
     34 
    2535   SUBROUTINE xios(set_current_context)(context, withswap) 
    2636      IMPLICIT NONE 
     
    2838      TYPE(txios(context))          , INTENT(IN) :: context 
    2939      LOGICAL             , OPTIONAL, INTENT(IN) :: withswap 
    30       LOGICAL (kind = 1)                       :: wswap 
     40      LOGICAL (kind = 1)                         :: wswap 
    3141 
    3242      IF (PRESENT(withswap)) THEN 
     
    3848 
    3949   END SUBROUTINE xios(set_current_context) 
    40   
     50 
    4151   LOGICAL FUNCTION xios(is_valid_context)(idt) 
    4252      IMPLICIT NONE 
     
    4959   END FUNCTION  xios(is_valid_context) 
    5060 
    51     
     61 
    5262END MODULE ICONTEXT 
  • 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 
  • XIOS/trunk/src/interface/fortran/ifield.F90

    r538 r545  
    77!   USE IFIELD_ATTR 
    88!   USE IFIELDGROUP_ATTR 
    9    USE IDATE 
     9   USE IDURATION 
    1010    
    1111   TYPE txios(field) 
  • XIOS/trunk/src/interface/fortran/ifile.F90

    r538 r545  
    77!   USE IFILE_ATTR 
    88!   USE IFILEGROUP_ATTR 
    9    USE IDATE 
     9   USE IDURATION 
    1010    
    1111   TYPE txios(file) 
  • XIOS/trunk/src/interface/fortran/ixios.F90

    r537 r545  
    33MODULE XIOS 
    44 
     5USE icalendar, ONLY : xios(set_calendar), xios(set_timestep), xios(update_calendar) 
    56 
    67USE icontext, ONLY : txios(context), xios(get_context_handle), xios(set_current_context),    & 
     
    1920                  xios(setVar_logic), xios(setVar_char) 
    2021 
    21 USE idate, ONLY : txios(date), txios(duration), xios(update_calendar) 
     22USE idate, ONLY : txios(date), & 
     23                  xios(date_convert_to_seconds), & 
     24                  xios(date_add_duration), xios(date_sub_duration), xios(date_sub), & 
     25                  xios(date_eq), xios(date_neq), xios(date_lt), xios(date_le), xios(date_gt), xios(date_ge), & 
     26                  OPERATOR(+), OPERATOR(-), & 
     27                  OPERATOR(==), OPERATOR(/=), OPERATOR(<), OPERATOR(<=), OPERATOR(>), OPERATOR(>=) 
    2228 
    2329USE idomain, ONLY : txios(domain), txios(domaingroup), xios(get_domain_handle),  & 
     
    3238                              xios(get_domaingroup_attr), xios(get_domaingroup_attr_hdl), & 
    3339                              xios(is_defined_domaingroup_attr), xios(is_defined_domaingroup_attr_hdl) 
     40 
     41USE iduration, ONLY: txios(duration), & 
     42                     xios(year), xios(month), xios(day), xios(hour), xios(minute), xios(second), xios(timestep), & 
     43                     xios(duration_add), xios(duration_sub), xios(duration_mult), xios(duration_neg), & 
     44                     xios(duration_eq), xios(duration_neq), & 
     45                     OPERATOR(+), OPERATOR(-), OPERATOR(*) 
    3446 
    3547USE ifield, ONLY : txios(field), txios(fieldgroup), xios(get_field_handle),  & 
     
    184196 
    185197 PUBLIC :: xios(set_current_context) 
    186  PUBLIC :: xios(update_calendar) 
    187198 PUBLIC :: xios(initialize), xios(init_server), xios(finalize), xios(context_initialize),xios(context_is_initialized), & 
    188199           xios(solve_inheritance), xios(close_context_definition), xios(context_finalize), xios(send_field),          & 
    189200           xios(field_is_active) 
    190201 
     202 PUBLIC :: xios(set_calendar), xios(set_timestep), xios(update_calendar) 
     203 
     204 PUBLIC :: xios(year), xios(month), xios(day), xios(hour), xios(minute), xios(second), xios(timestep), & 
     205           xios(duration_add), xios(duration_sub), xios(duration_mult), xios(duration_neg), & 
     206           xios(duration_eq), xios(duration_neq) 
     207 
     208 PUBLIC :: xios(date_convert_to_seconds), & 
     209           xios(date_add_duration), xios(date_sub_duration), xios(date_sub), & 
     210           xios(date_eq), xios(date_neq), xios(date_lt), xios(date_le), xios(date_gt), xios(date_ge) 
     211 
     212 PUBLIC :: OPERATOR(+), OPERATOR(-), OPERATOR(*), & 
     213           OPERATOR(==), OPERATOR(/=), OPERATOR(<), OPERATOR(<=), OPERATOR(>), OPERATOR(>=) 
     214 
    191215 PUBLIC :: xios(getVar) 
    192216 PUBLIC :: xios(setVar) 
Note: See TracChangeset for help on using the changeset viewer.