source: XIOS/trunk/src/interface/fortran/iduration.F90 @ 756

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

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 size: 5.5 KB
Line 
1#include "xios_fortran_prefix.hpp"
2
3MODULE IDURATION
4   USE, INTRINSIC :: ISO_C_BINDING
5   USE DURATION_INTERFACE
6
7   TYPE(txios(duration)), PARAMETER :: xios(year) = txios(duration)(1, 0, 0, 0, 0, 0, 0)
8   TYPE(txios(duration)), PARAMETER :: xios(month) = txios(duration)(0, 1, 0, 0, 0, 0, 0)
9   TYPE(txios(duration)), PARAMETER :: xios(day) = txios(duration)(0, 0, 1, 0, 0, 0, 0)
10   TYPE(txios(duration)), PARAMETER :: xios(hour) = txios(duration)(0, 0, 0, 1, 0, 0, 0)
11   TYPE(txios(duration)), PARAMETER :: xios(minute) = txios(duration)(0, 0, 0, 0, 1, 0, 0)
12   TYPE(txios(duration)), PARAMETER :: xios(second) = txios(duration)(0, 0, 0, 0, 0, 1, 0)
13   TYPE(txios(duration)), PARAMETER :: xios(timestep) = txios(duration)(0, 0, 0, 0, 0, 0, 1)
14
15   INTERFACE OPERATOR(+)
16      MODULE PROCEDURE xios(duration_add)
17   END INTERFACE
18
19   INTERFACE OPERATOR(-)
20      MODULE PROCEDURE xios(duration_sub)
21      MODULE PROCEDURE xios(duration_neg)
22   END INTERFACE
23
24   INTERFACE OPERATOR(*)
25      MODULE PROCEDURE xios(real4_duration_mult)
26      MODULE PROCEDURE xios(duration_real4_mult)
27      MODULE PROCEDURE xios(real8_duration_mult)
28      MODULE PROCEDURE xios(duration_real8_mult)
29      MODULE PROCEDURE xios(int_duration_mult)
30      MODULE PROCEDURE xios(duration_int_mult)
31   END INTERFACE
32
33   INTERFACE xios(duration_mult)
34      MODULE PROCEDURE xios(real4_duration_mult)
35      MODULE PROCEDURE xios(duration_real4_mult)
36      MODULE PROCEDURE xios(real8_duration_mult)
37      MODULE PROCEDURE xios(duration_real8_mult)
38      MODULE PROCEDURE xios(int_duration_mult)
39      MODULE PROCEDURE xios(duration_int_mult)
40   END INTERFACE
41
42   INTERFACE OPERATOR(==)
43      MODULE PROCEDURE xios(duration_eq)
44   END INTERFACE
45
46   INTERFACE OPERATOR(/=)
47      MODULE PROCEDURE xios(duration_neq)
48   END INTERFACE
49
50   CONTAINS
51
52   ! Addition
53
54   FUNCTION xios(duration_add)(dur1, dur2) RESULT(res)
55      USE DURATION_INTERFACE, only : txios(duration)
56      IMPLICIT NONE
57      TYPE(txios(duration)), INTENT(IN) :: dur1, dur2
58      TYPE(txios(duration)) :: res
59
60      res = cxios_duration_add(dur1, dur2)
61   END FUNCTION xios(duration_add)
62
63   ! Subtraction
64
65   FUNCTION xios(duration_sub)(dur1, dur2) RESULT(res)
66      USE DURATION_INTERFACE, only : txios(duration)
67      IMPLICIT NONE
68      TYPE(txios(duration)), INTENT(IN) :: dur1, dur2
69      TYPE(txios(duration)) :: res
70
71      res = cxios_duration_sub(dur1, dur2)
72   END FUNCTION xios(duration_sub)
73
74   ! Multiplication by a scalar
75   
76   FUNCTION xios(real4_duration_mult)(val, dur) RESULT(res)
77      USE ISO_C_BINDING
78      USE DURATION_INTERFACE, only : txios(duration)
79      IMPLICIT NONE
80      REAL(kind = C_FLOAT), INTENT(IN) :: val
81      TYPE(txios(duration)), INTENT(IN) :: dur
82      TYPE(txios(duration)) :: res
83
84      res = cxios_duration_mult(REAL(val, C_DOUBLE), dur)
85   END FUNCTION xios(real4_duration_mult)
86   
87   FUNCTION xios(duration_real4_mult)(dur, val2) RESULT(res)
88      USE ISO_C_BINDING
89      USE DURATION_INTERFACE, only : txios(duration)
90      IMPLICIT NONE
91      TYPE(txios(duration)), INTENT(IN) :: dur
92      REAL(kind = C_FLOAT), INTENT(IN) :: val2
93      TYPE(txios(duration)) :: res
94
95      res = cxios_duration_mult(REAL(val2, C_DOUBLE), dur)
96   END FUNCTION xios(duration_real4_mult)
97   
98   FUNCTION xios(real8_duration_mult)(val, dur) RESULT(res)
99      USE ISO_C_BINDING
100      USE DURATION_INTERFACE, only : txios(duration)
101      IMPLICIT NONE
102      REAL(kind = C_DOUBLE), INTENT(IN) :: val
103      TYPE(txios(duration)), INTENT(IN) :: dur
104      TYPE(txios(duration)) :: res
105
106      res = cxios_duration_mult(val, dur)
107   END FUNCTION xios(real8_duration_mult)
108   
109   FUNCTION xios(duration_real8_mult)(dur, val2) RESULT(res)
110      USE ISO_C_BINDING
111      USE DURATION_INTERFACE, only : txios(duration)
112      IMPLICIT NONE
113      TYPE(txios(duration)), INTENT(IN) :: dur
114      REAL(kind = C_DOUBLE), INTENT(IN) :: val2
115      TYPE(txios(duration)) :: res
116
117      res = cxios_duration_mult(val2, dur)
118   END FUNCTION xios(duration_real8_mult)
119   
120   FUNCTION xios(int_duration_mult)(val, dur) RESULT(res)
121      USE ISO_C_BINDING
122      USE DURATION_INTERFACE, only : txios(duration)
123      IMPLICIT NONE
124      INTEGER, INTENT(IN) :: val
125      TYPE(txios(duration)), INTENT(IN) :: dur
126      TYPE(txios(duration)) :: res
127
128      res = cxios_duration_mult(REAL(val, C_DOUBLE), dur)
129   END FUNCTION xios(int_duration_mult)
130   
131   FUNCTION xios(duration_int_mult)(dur, val2) RESULT(res)
132      USE ISO_C_BINDING
133      USE DURATION_INTERFACE, only : txios(duration)
134      IMPLICIT NONE
135      TYPE(txios(duration)), INTENT(IN) :: dur
136      INTEGER, INTENT(IN) :: val2
137      TYPE(txios(duration)) :: res
138
139      res = cxios_duration_mult(REAL(val2, C_DOUBLE), dur)
140   END FUNCTION xios(duration_int_mult)
141
142   ! Negation
143
144   FUNCTION xios(duration_neg)(dur) RESULT(res)
145      USE DURATION_INTERFACE, only : txios(duration)
146      IMPLICIT NONE
147      TYPE(txios(duration)), INTENT(IN) :: dur
148      TYPE(txios(duration)) :: res
149
150      res = cxios_duration_neg(dur)
151   END FUNCTION xios(duration_neg)
152
153   FUNCTION xios(duration_eq)(dur1, dur2) RESULT(res)
154      USE duration_INTERFACE, only : txios(duration)
155      IMPLICIT NONE
156      TYPE(txios(duration)), INTENT(IN) :: dur1, dur2
157      LOGICAL :: res
158
159      res = cxios_duration_eq(dur1, dur2)
160   END FUNCTION xios(duration_eq)
161
162   FUNCTION xios(duration_neq)(dur1, dur2) RESULT(res)
163      USE duration_INTERFACE, only : txios(duration)
164      IMPLICIT NONE
165      TYPE(txios(duration)), INTENT(IN) :: dur1, dur2
166      LOGICAL :: res
167
168      res = cxios_duration_neq(dur1, dur2)
169   END FUNCTION xios(duration_neq)
170
171END MODULE IDURATION
Note: See TracBrowser for help on using the repository browser.