source: XIOS3/trunk/src/interface/fortran/ifield.F90 @ 2620

Last change on this file since 2620 was 2620, checked in by jderouillat, 4 months ago

Modify fortran-C interfaces to manage logical-bool conversion, the optimizations of OneAPI could produce bugs regarding the logical-bool encodings.

  • Property copyright set to
    Software name : XIOS (Xml I/O Server)
    http://forge.ipsl.jussieu.fr/ioserver
    Creation date : January 2009
    Licence : CeCCIL version2
    see license file in root directory : Licence_CeCILL_V2-en.txt
    or http://www.cecill.info/licences/Licence_CeCILL_V2-en.html
    Holder : CEA/LSCE (Laboratoire des Sciences du CLimat et de l'Environnement)
    CNRS/IPSL (Institut Pierre Simon Laplace)
    Project Manager : Yann Meurdesoif
    yann.meurdesoif@cea.fr
File size: 6.0 KB
Line 
1#include "xios_fortran_prefix.hpp"
2
3MODULE IFIELD
4   USE, INTRINSIC :: ISO_C_BINDING
5   USE FIELD_INTERFACE
6   USE FIELDGROUP_INTERFACE
7!   USE IFIELD_ATTR
8!   USE IFIELDGROUP_ATTR
9   USE IDURATION
10   USE IDOMAIN
11   USE IAXIS
12   USE ISCALAR
13   USE LOGICAL_BOOL_CONVERSION
14   
15   TYPE txios(field)
16      INTEGER(kind = C_INTPTR_T) :: daddr
17   END TYPE txios(field)
18   
19   TYPE txios(fieldgroup)
20      INTEGER(kind = C_INTPTR_T) :: daddr
21   END TYPE txios(fieldgroup)
22
23   CONTAINS ! Fonctions disponibles pour les utilisateurs.
24
25   SUBROUTINE xios(get_field_handle)(idt, ret)
26      IMPLICIT NONE
27      CHARACTER(len = *), INTENT(IN)   :: idt     
28      TYPE(txios(field)), INTENT(OUT) :: ret
29      CALL cxios_field_handle_create(ret%daddr, idt, len(idt))           
30   END SUBROUTINE xios(get_field_handle)
31   
32   SUBROUTINE xios(get_fieldgroup_handle)(idt,ret)
33      IMPLICIT NONE
34      CHARACTER(len = *)     , INTENT(IN) :: idt     
35      TYPE(txios(fieldgroup)), INTENT(OUT):: ret
36
37      CALL cxios_fieldgroup_handle_create(ret%daddr, idt, len(idt))           
38
39   END SUBROUTINE xios(get_fieldgroup_handle)
40   
41   SUBROUTINE xios(field_id_get_domain_handle)(field_id, ret, idx)
42      IMPLICIT NONE
43      CHARACTER(len  = *)     , INTENT(IN)  :: field_id
44      INTEGER, OPTIONAL       , INTENT(IN)  :: idx
45      TYPE(txios(domain)), INTENT(OUT) :: ret
46      TYPE(txios(field))      :: field_hdl
47      INTEGER                 :: index
48      index = 0
49      IF (PRESENT(idx)) THEN
50        index = idx
51      ENDIF
52
53      CALL xios(get_field_handle)(field_id,field_hdl)
54      CALL xios(field_get_domain_handle(field_hdl, ret, index))
55   END SUBROUTINE xios(field_id_get_domain_handle)
56
57   SUBROUTINE xios(field_get_domain_handle)(field_hdl, ret, idx)
58      IMPLICIT NONE
59      TYPE(txios(field))      , INTENT(IN)  :: field_hdl
60      INTEGER, OPTIONAL       , INTENT(IN)  :: idx
61      TYPE(txios(domain)), INTENT(OUT) :: ret
62      INTEGER :: index
63      index = 0
64      IF (PRESENT(idx)) THEN
65        index = idx
66      ENDIF
67      CALL cxios_field_get_domain_handle(ret%daddr, field_hdl%daddr, index)
68   END SUBROUTINE xios(field_get_domain_handle)
69
70   SUBROUTINE xios(field_id_get_axis_handle)(field_id, ret, idx)
71      IMPLICIT NONE
72      CHARACTER(len  = *)   , INTENT(IN)  :: field_id
73      INTEGER, OPTIONAL     , INTENT(IN)  :: idx
74      TYPE(txios(axis)), INTENT(OUT) :: ret
75      TYPE(txios(field))     :: field_hdl
76      INTEGER                :: index
77      index = 0
78      IF (PRESENT(idx)) THEN
79        index = idx
80      ENDIF
81      CALL xios(get_field_handle)(field_id,field_hdl)
82      CALL xios(field_get_axis_handle(field_hdl, ret, index))
83   END SUBROUTINE xios(field_id_get_axis_handle)
84
85   SUBROUTINE xios(field_get_axis_handle)(field_hdl, ret, idx)
86      IMPLICIT NONE
87      TYPE(txios(field))    , INTENT(IN)  :: field_hdl
88      INTEGER, OPTIONAL     , INTENT(IN)  :: idx
89      TYPE(txios(axis)), INTENT(OUT) :: ret
90      INTEGER :: index
91      index = 0
92      IF (PRESENT(idx)) THEN
93        index = idx
94      ENDIF
95      CALL cxios_field_get_axis_handle(ret%daddr, field_hdl%daddr, index)
96   END SUBROUTINE xios(field_get_axis_handle)
97
98   SUBROUTINE xios(field_id_get_scalar_handle)(field_id, ret, idx)
99      IMPLICIT NONE
100      CHARACTER(len  = *)     , INTENT(IN)  :: field_id
101      INTEGER, OPTIONAL       , INTENT(IN)  :: idx
102      TYPE(txios(scalar)), INTENT(OUT) :: ret
103      TYPE(txios(field))     :: field_hdl
104      INTEGER                :: index
105      index = 0
106      IF (PRESENT(idx)) THEN
107        index = idx
108      ENDIF
109      CALL xios(get_field_handle)(field_id,field_hdl)
110      CALL xios(field_get_scalar_handle(field_hdl, ret, index))
111   END SUBROUTINE xios(field_id_get_scalar_handle)
112
113   SUBROUTINE xios(field_get_scalar_handle)(field_hdl, ret, idx)
114      IMPLICIT NONE
115      TYPE(txios(field))      , INTENT(IN)  :: field_hdl
116      INTEGER, OPTIONAL       , INTENT(IN)  :: idx
117      TYPE(txios(scalar)), INTENT(OUT) :: ret
118      INTEGER :: index
119      index = 0
120      IF (PRESENT(idx)) THEN
121        index = idx
122      ENDIF
123      CALL cxios_field_get_axis_handle(ret%daddr, field_hdl%daddr, index)
124   END SUBROUTINE xios(field_get_scalar_handle)
125
126   LOGICAL FUNCTION xios(is_valid_field)(idt)
127      IMPLICIT NONE
128      CHARACTER(len  = *)    , INTENT(IN) :: idt
129      LOGICAL  (kind = 1)                 :: val
130     
131      CALL cxios_field_valid_id(val, idt, len(idt));
132      CALL xios_bool_to_logical_0d(val)
133      xios(is_valid_field) = val
134
135   END FUNCTION  xios(is_valid_field)
136
137   LOGICAL FUNCTION xios(is_valid_fieldgroup)(idt)
138      IMPLICIT NONE
139      CHARACTER(len  = *)    , INTENT(IN) :: idt
140      LOGICAL  (kind = 1)                 :: val
141      CALL cxios_fieldgroup_valid_id(val, idt, len(idt));
142      CALL xios_bool_to_logical_0d(val)
143      xios(is_valid_fieldgroup) = val
144
145   END FUNCTION  xios(is_valid_fieldgroup)
146   
147  LOGICAL FUNCTION xios(field_is_active_id)(field_id, at_current_timestep_arg)
148      IMPLICIT NONE
149      CHARACTER(len  = *) , INTENT(IN) :: field_id
150      LOGICAL, OPTIONAL   , INTENT(IN) :: at_current_timestep_arg
151      TYPE(txios(field))               :: field_hdl
152
153      CALL xios(get_field_handle)(field_id,field_hdl)
154      xios(field_is_active_id) = xios(field_is_active_hdl)(field_hdl, at_current_timestep_arg)
155
156   END FUNCTION xios(field_is_active_id)
157
158   LOGICAL FUNCTION xios(field_is_active_hdl)(field_hdl, at_current_timestep_arg)
159      IMPLICIT NONE
160      TYPE(txios(field)) , INTENT(IN) :: field_hdl
161      LOGICAL, OPTIONAL  , INTENT(IN) :: at_current_timestep_arg
162      LOGICAL(kind = C_BOOL)          :: at_current_timestep
163      LOGICAL(kind = C_BOOL)          :: ret
164
165      IF (PRESENT(at_current_timestep_arg)) THEN
166         at_current_timestep = at_current_timestep_arg
167      ELSE
168         at_current_timestep = .FALSE.
169      ENDIF
170
171      CALL xios_logical_to_bool_0d(at_current_timestep)
172      CALL cxios_field_is_active(field_hdl%daddr, at_current_timestep, ret);
173      CALL xios_bool_to_logical_0d(ret)
174      xios(field_is_active_hdl) = ret
175     
176   END FUNCTION xios(field_is_active_hdl)
177 
178END MODULE IFIELD
Note: See TracBrowser for help on using the repository browser.