source: XIOS/dev/XIOS_DEV_CMIP6/src/interface/fortran/iduration.F90 @ 1524

Last change on this file since 1524 was 801, checked in by rlacroix, 8 years ago

Fortran interface: Add functions to convert a string to a date or a duration.

File size: 6.2 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   ! Conversion function
53
54   SUBROUTINE xios(duration_convert_to_string)(dur, str)
55      USE DURATION_INTERFACE, only : txios(duration)
56      IMPLICIT NONE
57      TYPE(txios(duration)), INTENT(IN) :: dur
58      CHARACTER(len = *), INTENT(OUT) :: str
59
60      CALL cxios_duration_convert_to_string(dur, str, len(str))
61   END SUBROUTINE xios(duration_convert_to_string)
62
63   FUNCTION xios(duration_convert_from_string)(str) RESULT(res)
64      USE DURATION_INTERFACE, only : txios(duration)
65      IMPLICIT NONE
66      CHARACTER(len = *), INTENT(IN) :: str
67      TYPE(txios(duration)) :: res
68
69      res = cxios_duration_convert_from_string(str, len(str))
70   END FUNCTION xios(duration_convert_from_string)
71
72   ! Addition
73
74   FUNCTION xios(duration_add)(dur1, dur2) RESULT(res)
75      USE DURATION_INTERFACE, only : txios(duration)
76      IMPLICIT NONE
77      TYPE(txios(duration)), INTENT(IN) :: dur1, dur2
78      TYPE(txios(duration)) :: res
79
80      res = cxios_duration_add(dur1, dur2)
81   END FUNCTION xios(duration_add)
82
83   ! Subtraction
84
85   FUNCTION xios(duration_sub)(dur1, dur2) RESULT(res)
86      USE DURATION_INTERFACE, only : txios(duration)
87      IMPLICIT NONE
88      TYPE(txios(duration)), INTENT(IN) :: dur1, dur2
89      TYPE(txios(duration)) :: res
90
91      res = cxios_duration_sub(dur1, dur2)
92   END FUNCTION xios(duration_sub)
93
94   ! Multiplication by a scalar
95   
96   FUNCTION xios(real4_duration_mult)(val, dur) RESULT(res)
97      USE ISO_C_BINDING
98      USE DURATION_INTERFACE, only : txios(duration)
99      IMPLICIT NONE
100      REAL(kind = C_FLOAT), INTENT(IN) :: val
101      TYPE(txios(duration)), INTENT(IN) :: dur
102      TYPE(txios(duration)) :: res
103
104      res = cxios_duration_mult(REAL(val, C_DOUBLE), dur)
105   END FUNCTION xios(real4_duration_mult)
106   
107   FUNCTION xios(duration_real4_mult)(dur, val2) RESULT(res)
108      USE ISO_C_BINDING
109      USE DURATION_INTERFACE, only : txios(duration)
110      IMPLICIT NONE
111      TYPE(txios(duration)), INTENT(IN) :: dur
112      REAL(kind = C_FLOAT), INTENT(IN) :: val2
113      TYPE(txios(duration)) :: res
114
115      res = cxios_duration_mult(REAL(val2, C_DOUBLE), dur)
116   END FUNCTION xios(duration_real4_mult)
117   
118   FUNCTION xios(real8_duration_mult)(val, dur) RESULT(res)
119      USE ISO_C_BINDING
120      USE DURATION_INTERFACE, only : txios(duration)
121      IMPLICIT NONE
122      REAL(kind = C_DOUBLE), INTENT(IN) :: val
123      TYPE(txios(duration)), INTENT(IN) :: dur
124      TYPE(txios(duration)) :: res
125
126      res = cxios_duration_mult(val, dur)
127   END FUNCTION xios(real8_duration_mult)
128   
129   FUNCTION xios(duration_real8_mult)(dur, val2) RESULT(res)
130      USE ISO_C_BINDING
131      USE DURATION_INTERFACE, only : txios(duration)
132      IMPLICIT NONE
133      TYPE(txios(duration)), INTENT(IN) :: dur
134      REAL(kind = C_DOUBLE), INTENT(IN) :: val2
135      TYPE(txios(duration)) :: res
136
137      res = cxios_duration_mult(val2, dur)
138   END FUNCTION xios(duration_real8_mult)
139   
140   FUNCTION xios(int_duration_mult)(val, dur) RESULT(res)
141      USE ISO_C_BINDING
142      USE DURATION_INTERFACE, only : txios(duration)
143      IMPLICIT NONE
144      INTEGER, INTENT(IN) :: val
145      TYPE(txios(duration)), INTENT(IN) :: dur
146      TYPE(txios(duration)) :: res
147
148      res = cxios_duration_mult(REAL(val, C_DOUBLE), dur)
149   END FUNCTION xios(int_duration_mult)
150   
151   FUNCTION xios(duration_int_mult)(dur, val2) RESULT(res)
152      USE ISO_C_BINDING
153      USE DURATION_INTERFACE, only : txios(duration)
154      IMPLICIT NONE
155      TYPE(txios(duration)), INTENT(IN) :: dur
156      INTEGER, INTENT(IN) :: val2
157      TYPE(txios(duration)) :: res
158
159      res = cxios_duration_mult(REAL(val2, C_DOUBLE), dur)
160   END FUNCTION xios(duration_int_mult)
161
162   ! Negation
163
164   FUNCTION xios(duration_neg)(dur) RESULT(res)
165      USE DURATION_INTERFACE, only : txios(duration)
166      IMPLICIT NONE
167      TYPE(txios(duration)), INTENT(IN) :: dur
168      TYPE(txios(duration)) :: res
169
170      res = cxios_duration_neg(dur)
171   END FUNCTION xios(duration_neg)
172
173   FUNCTION xios(duration_eq)(dur1, dur2) RESULT(res)
174      USE duration_INTERFACE, only : txios(duration)
175      IMPLICIT NONE
176      TYPE(txios(duration)), INTENT(IN) :: dur1, dur2
177      LOGICAL :: res
178
179      res = cxios_duration_eq(dur1, dur2)
180   END FUNCTION xios(duration_eq)
181
182   FUNCTION xios(duration_neq)(dur1, dur2) RESULT(res)
183      USE duration_INTERFACE, only : txios(duration)
184      IMPLICIT NONE
185      TYPE(txios(duration)), INTENT(IN) :: dur1, dur2
186      LOGICAL :: res
187
188      res = cxios_duration_neq(dur1, dur2)
189   END FUNCTION xios(duration_neq)
190
191END MODULE IDURATION
Note: See TracBrowser for help on using the repository browser.