ICON Community Interface 0.4.0
Loading...
Searching...
No Matches
comin_metadata_types.F90
Go to the documentation of this file.
1
3!
4! @authors 08/2024 :: ICON Community Interface <comin@icon-model.org>
5!
6! SPDX-License-Identifier: BSD-3-Clause
7!
8! See LICENSES for license information.
9! Where software is supplied by third parties, it is indicated in the
10! headers of the routines.
11!
13
14 USE iso_c_binding, ONLY: c_int, c_char, c_double, c_bool, &
15 & c_ptr, c_loc, c_null_ptr, c_associated
26
27 PRIVATE
28
30
31#include "comin_global.inc"
32
36 TYPE(c_ptr) :: comin_metadata_iterator_current_c = c_null_ptr
37 TYPE(c_ptr) :: comin_metadata_iterator_end_c = c_null_ptr
38 CONTAINS
39 PROCEDURE :: next => comin_metadata_iterator_next
40 PROCEDURE :: is_end => comin_metadata_iterator_is_end
41 PROCEDURE :: key => comin_metadata_get_key_from_iterator
42 PROCEDURE :: delete => comin_metadata_iterator_delete
44
46 TYPE(c_ptr) :: comin_metadata_c = c_null_ptr
47 CONTAINS
48 PROCEDURE :: create => comin_metadata_create
49 PROCEDURE :: delete => comin_metadata_delete
50 PROCEDURE :: query => comin_metadata_query
51 PROCEDURE :: get_iterator => comin_metadata_get_iterator
52 generic, PUBLIC :: set => set_int, set_double, set_char, set_bool
53 PROCEDURE, PRIVATE :: set_int => comin_metadata_set_int
54 PROCEDURE, PRIVATE :: set_double => comin_metadata_set_double
55 PROCEDURE, PRIVATE :: set_char => comin_metadata_set_char
56 PROCEDURE, PRIVATE :: set_bool => comin_metadata_set_bool
57 generic, PUBLIC :: get => get_int, get_double, get_char, get_bool
58 PROCEDURE, PRIVATE :: get_int => comin_metadata_get_int
59 PROCEDURE, PRIVATE :: get_double => comin_metadata_get_double
60 PROCEDURE, PRIVATE :: get_char => comin_metadata_get_char
61 PROCEDURE, PRIVATE :: get_bool => comin_metadata_get_bool
63
64CONTAINS
65
66 SUBROUTINE comin_metadata_create(this)
67 CLASS(t_comin_var_metadata), INTENT(inout) :: this
68 ! If metadata container is already created, simply ignore this step
69 ! (entries can be still be added/modified via set in that case)
70 IF ( .NOT. c_associated(this%comin_metadata_c) ) THEN
71 CALL comin_keyval_create_c(this%comin_metadata_c)
72 ENDIF
73 END SUBROUTINE comin_metadata_create
74
75 SUBROUTINE comin_metadata_delete(this)
76 CLASS(t_comin_var_metadata), INTENT(inout) :: this
77 CALL comin_keyval_delete_c(this%comin_metadata_c)
78 END SUBROUTINE comin_metadata_delete
79
80 INTEGER FUNCTION comin_metadata_query(this, key)
81 CLASS(t_comin_var_metadata), INTENT(inout) :: this
82 CHARACTER(LEN=*), INTENT(in) :: key
83 INTEGER(KIND=c_int) :: idx
84 CHARACTER(len=1, KIND=c_char), TARGET :: ckey(LEN(TRIM(key))+1)
85
86 CALL convert_f_string(trim(key), ckey)
87 CALL comin_keyval_query_c(c_loc(ckey), idx, this%comin_metadata_c)
88
89 comin_metadata_query = int(idx)
90 END FUNCTION comin_metadata_query
91
92 SUBROUTINE comin_metadata_set_int(this, key, val)
93 CLASS(t_comin_var_metadata), INTENT(inout) :: this
94 CHARACTER(LEN=*), INTENT(in) :: key
95 INTEGER(KIND=c_int), INTENT(in) :: val
96 CHARACTER(len=1, KIND=c_char), TARGET :: ckey(LEN(TRIM(key))+1)
97
98 CALL convert_f_string(trim(key), ckey)
99 CALL comin_keyval_set_int_c(c_loc(ckey), val, this%comin_metadata_c)
100
101 END SUBROUTINE comin_metadata_set_int
102
103 SUBROUTINE comin_metadata_get_int(this, key, val)
104 CLASS(t_comin_var_metadata), INTENT(inout) :: this
105 CHARACTER(LEN=*), INTENT(in) :: key
106 INTEGER(KIND=c_int), INTENT(out) :: val
107 CHARACTER(len=1, KIND=c_char), TARGET :: ckey(LEN(TRIM(key))+1)
108
109 CALL convert_f_string(trim(key), ckey)
110 CALL comin_keyval_get_int_c(c_loc(ckey), val, this%comin_metadata_c)
111 END SUBROUTINE comin_metadata_get_int
112
113 SUBROUTINE comin_metadata_set_double(this, key, val)
114 CLASS(t_comin_var_metadata), INTENT(inout) :: this
115 CHARACTER(LEN=*), INTENT(in) :: key
116 REAL(KIND=c_double), INTENT(in) :: val
117 CHARACTER(len=1, KIND=c_char), TARGET :: ckey(LEN(TRIM(key))+1)
118
119 CALL convert_f_string(trim(key), ckey)
120 CALL comin_keyval_set_double_c(c_loc(ckey), val, this%comin_metadata_c)
121
122 END SUBROUTINE comin_metadata_set_double
123
124 SUBROUTINE comin_metadata_get_double(this, key, val)
125 CLASS(t_comin_var_metadata), INTENT(inout) :: this
126 CHARACTER(LEN=*), INTENT(in) :: key
127 REAL(KIND=c_double), INTENT(out) :: val
128 CHARACTER(len=1, KIND=c_char), TARGET :: ckey(LEN(TRIM(key))+1)
129
130 CALL convert_f_string(trim(key), ckey)
131 CALL comin_keyval_get_double_c(c_loc(ckey), val, this%comin_metadata_c)
132 END SUBROUTINE comin_metadata_get_double
133
134 SUBROUTINE comin_metadata_set_char(this, key, val)
135 CLASS(t_comin_var_metadata), INTENT(inout) :: this
136 CHARACTER(LEN=*), INTENT(in) :: key, val
137 CHARACTER(len=1, KIND=c_char), TARGET :: ckey(LEN(TRIM(key))+1), cval(LEN(TRIM(val))+1)
138
139 CALL convert_f_string(trim(key), ckey)
140 CALL convert_f_string(trim(val), cval)
141 CALL comin_keyval_set_char_c(c_loc(ckey), c_loc(cval), this%comin_metadata_c)
142
143 END SUBROUTINE comin_metadata_set_char
144
145 SUBROUTINE comin_metadata_get_char(this, key, val)
146 CLASS(t_comin_var_metadata), INTENT(inout) :: this
147 CHARACTER(LEN=*), INTENT(in) :: key
148 CHARACTER(LEN=:), ALLOCATABLE, INTENT(out) :: val
149 CHARACTER(len=1, KIND=c_char), TARGET :: ckey(LEN(TRIM(key))+1)
150 TYPE(c_ptr) :: cval
151
152 cval = c_null_ptr
153 CALL convert_f_string(trim(key), ckey)
154 CALL comin_keyval_get_char_c(c_loc(ckey), cval, this%comin_metadata_c)
155 val = convert_c_string(cval)
156 END SUBROUTINE comin_metadata_get_char
157
158 SUBROUTINE comin_metadata_set_bool(this, key, val)
159 CLASS(t_comin_var_metadata), INTENT(inout) :: this
160 CHARACTER(LEN=*), INTENT(in) :: key
161 LOGICAL, INTENT(in) :: val
162 CHARACTER(len=1, KIND=c_char), TARGET :: ckey(LEN(TRIM(key))+1)
163
164 CALL convert_f_string(trim(key), ckey)
165 CALL comin_keyval_set_bool_c(c_loc(ckey), LOGICAL(val,c_bool), this%comin_metadata_c)
166
167 END SUBROUTINE comin_metadata_set_bool
168
169 SUBROUTINE comin_metadata_get_bool(this, key, val)
170 CLASS(t_comin_var_metadata), INTENT(inout) :: this
171 CHARACTER(LEN=*), INTENT(in) :: key
172 LOGICAL, INTENT(out) :: val
173 CHARACTER(len=1, KIND=c_char), TARGET :: ckey(LEN(TRIM(key))+1)
174 LOGICAL(KIND=c_bool) :: cval
175
176 CALL convert_f_string(trim(key), ckey)
177 CALL comin_keyval_get_bool_c(c_loc(ckey), cval, this%comin_metadata_c)
178 val = LOGICAL(cval)
179 END SUBROUTINE comin_metadata_get_bool
180
181 SUBROUTINE comin_metadata_get_iterator(this, iterator)
182 CLASS(t_comin_var_metadata), INTENT(inout) :: this
183 TYPE(t_comin_var_metadata_iterator), INTENT(inout) :: iterator
184
185 IF (c_associated(iterator%comin_metadata_iterator_current_c)) CALL iterator%delete()
186 CALL comin_keyval_iterator_begin_c(this%comin_metadata_c, iterator%comin_metadata_iterator_current_c)
187 CALL comin_keyval_iterator_end_c (this%comin_metadata_c, iterator%comin_metadata_iterator_end_c )
188 END SUBROUTINE comin_metadata_get_iterator
189
190 FUNCTION comin_metadata_get_key_from_iterator(this) RESULT(key)
191 CLASS(t_comin_var_metadata_iterator), INTENT(in) :: this
192 CHARACTER(LEN=:), ALLOCATABLE :: key
193 TYPE(c_ptr) :: ckey
194
195 ckey = comin_keyval_iterator_get_key_c(this%comin_metadata_iterator_current_c)
196 key = convert_c_string(ckey)
197 END FUNCTION comin_metadata_get_key_from_iterator
198
199 SUBROUTINE comin_metadata_iterator_next(this)
200 CLASS(t_comin_var_metadata_iterator), INTENT(in) :: this
201
202 CALL comin_keyval_iterator_next_c(this%comin_metadata_iterator_current_c)
203 END SUBROUTINE comin_metadata_iterator_next
204
205 SUBROUTINE comin_metadata_iterator_delete(this)
206 CLASS(t_comin_var_metadata_iterator), INTENT(inout) :: this
207
208 CALL comin_keyval_iterator_delete_c(this%comin_metadata_iterator_current_c)
209 CALL comin_keyval_iterator_delete_c(this%comin_metadata_iterator_end_c )
210 this%comin_metadata_iterator_current_c = c_null_ptr ! Reset c_ptr such that c_associated can be used
211 this%comin_metadata_iterator_end_c = c_null_ptr ! Reset c_ptr such that c_associated can be used
212 END SUBROUTINE
213
214 LOGICAL FUNCTION comin_metadata_iterator_is_end(this)
215 CLASS(t_comin_var_metadata_iterator), INTENT(inout) :: this
216
217 comin_metadata_iterator_is_end = LOGICAL(comin_keyval_iterator_compare_c( & & this%comin_metadata_iterator_current_c, this%comin_metadata_iterator_end_c) )
218 END FUNCTION comin_metadata_iterator_is_end
219
220END MODULE comin_metadata_types
221
subroutine, public convert_f_string(string, arr)
Convert Fortran string into C-style character array.
subroutine comin_metadata_create(this)