ICON Community Interface 0.4.0
Loading...
Searching...
No Matches
comin_variable_types.F90
Go to the documentation of this file.
1
3!
4! @authors 08/2021 :: 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_int64_t, c_char, c_bool, c_ptr, c_null_ptr, c_f_pointer
15 USE comin_setup_constants, ONLY: wp, comin_zaxis_3d, &
16 & comin_hgrid_unstructured_cell, dp, sp, comin_dim_semantics_container, &
17 & comin_dim_semantics_undef
20
21 IMPLICIT NONE
22
23 PUBLIC
24
25#include "comin_global.inc"
26
28
29 ! ------------------------------------
30 ! data types for variable definition
31 ! ------------------------------------
32
37 CHARACTER(LEN=:), ALLOCATABLE :: name
38 ! domain id
39 INTEGER :: id
41
45 END INTERFACE
46
47 TYPE, BIND(C) :: t_comin_var_descriptor_c
48 CHARACTER(KIND=c_char) :: name(comin_max_len_var_name+1)
49 ! domain id
50 INTEGER(kind=c_int) :: id
52
57 TYPE(t_comin_var_item), PRIVATE, POINTER :: var_item
58
59 CONTAINS
60 generic, PUBLIC :: get_ptr => get_ptr_dp, get_ptr_sp, get_ptr_i
61 PROCEDURE, PRIVATE :: get_ptr_dp => comin_var_get_ptr_dp
62 PROCEDURE, PRIVATE :: get_ptr_sp => comin_var_get_ptr_sp
63 PROCEDURE, PRIVATE :: get_ptr_i => comin_var_get_ptr_i
64 PROCEDURE, PUBLIC :: array_shape => comin_var_get_array_shape
65 PROCEDURE, PUBLIC :: descriptor => comin_var_get_descriptor
66 PROCEDURE, PUBLIC :: lcontainer => comin_var_get_lcontainer
67 PROCEDURE, PUBLIC :: ncontained => comin_var_get_ncontained
68 PROCEDURE, PUBLIC :: dim_semantics => comin_var_get_dim_semantics
69 PROCEDURE, PUBLIC :: valid => comin_var_get_valid
70 generic, PUBLIC :: to_3d => to_3d_dp, to_3d_sp, to_3d_i
71 PROCEDURE, PRIVATE :: to_3d_dp => comin_var_to_3d_dp
72 PROCEDURE, PRIVATE :: to_3d_sp => comin_var_to_3d_sp
73 PROCEDURE, PRIVATE :: to_3d_i => comin_var_to_3d_i
74 END TYPE t_comin_var_handle
75
79 TYPE(t_comin_var_descriptor) :: descriptor
80
82 ! REAL(wp), POINTER :: ptr(:,:,:,:,:) => NULL()
83 TYPE(c_ptr) :: cptr = c_null_ptr
84
86 INTEGER :: type_id
87
89 INTEGER :: array_shape(5)
90
92 TYPE(c_ptr) :: device_ptr = c_null_ptr
93
94 ! index positions in the 5D array.
95 INTEGER, DIMENSION(5) :: dim_semantics
96
98 ! pointer refers to an array slice pointer
99 ! ptr(:,:,:,:,ncontained)
100 INTEGER :: ncontained = 0
102 LOGICAL(kind=c_bool) :: lcontainer = .false.
103
105 TYPE(t_comin_var_metadata) :: metadata
106 END TYPE t_comin_var_item
107
110 TYPE(t_comin_var_item), POINTER :: var_item
111 INTEGER :: access_flag
113
116 TYPE(t_comin_var_descriptor) :: descriptor
117 TYPE(t_comin_var_metadata) :: metadata
118 INTEGER, ALLOCATABLE :: moduleid(:)
119
122 LOGICAL(kind=c_bool) :: lmodexclusive = .false.
123 END TYPE t_comin_request_item
124
125 INTERFACE
126 SUBROUTINE comin_var_sync_device_mem_fct(var_ptr, direction)
127 IMPORT t_comin_var_handle
128 TYPE(t_comin_var_handle), INTENT(IN) :: var_ptr
129 LOGICAL, INTENT(IN) :: direction
130 END SUBROUTINE comin_var_sync_device_mem_fct
131 END INTERFACE
132 INTERFACE
133 SUBROUTINE comin_var_sync_halo_fct(var_ptr, halo_sync_mode)
134 IMPORT t_comin_var_handle
135 TYPE(t_comin_var_handle), INTENT(IN) :: var_ptr
136 INTEGER, INTENT(IN) :: halo_sync_mode
137 END SUBROUTINE comin_var_sync_halo_fct
138 END INTERFACE
139
140 ! ------------------------------------
141 ! lists of exposed variables
142 ! ------------------------------------
143
145 ! stores the lists of variables registered for the context
146 ! (dimension of array) points to the first element of the variable
147 ! list
148 ! - contains TYPE(t_comin_var_item)
150 TYPE(c_ptr) :: var_list
152
153CONTAINS
154
156 FUNCTION create_comin_var_descriptor(name, id) RESULT(desc)
157 CHARACTER(len=*), INTENT(IN) :: name
158 INTEGER, INTENT(IN) :: id
159
160 TYPE(t_comin_var_descriptor) :: desc
161
162 desc%name = trim(adjustl(name))
163 desc%id = id
164
165 END FUNCTION create_comin_var_descriptor
166
168 FUNCTION create_comin_var_descriptor_from_c(desc_c) RESULT(desc)
169 TYPE(t_comin_var_descriptor_c), INTENT(IN) :: desc_c
170
171 TYPE(t_comin_var_descriptor) :: desc
172
173 desc = create_comin_var_descriptor(convert_c_string(desc_c%name), desc_c%id)
175
177 FUNCTION comin_var_descr_match(var_descriptor1, var_descriptor2)
178 TYPE(t_comin_var_descriptor), INTENT(IN) :: var_descriptor1, var_descriptor2
179 LOGICAL :: comin_var_descr_match
180 ! local
181 LOGICAL :: l_name, l_domain
182
183 l_domain = (var_descriptor1%id == var_descriptor2%id)
184
185 comin_var_descr_match = l_domain
186 IF (.NOT. comin_var_descr_match) RETURN
187
188 l_name = (var_descriptor1%name == var_descriptor2%name)
189
190 comin_var_descr_match = l_name
191 END FUNCTION comin_var_descr_match
192
193 FUNCTION comin_var_ptr_init(var_item) &
194 result(var_ptr)
195 TYPE(t_comin_var_item), POINTER, INTENT(IN) :: var_item
196 TYPE(t_comin_var_handle) :: var_ptr
197 var_ptr = t_comin_var_handle(var_item = var_item)
198 END FUNCTION comin_var_ptr_init
199
200 SUBROUTINE comin_var_get_ptr_dp(this, ptr)
201 CLASS(t_comin_var_handle), INTENT(IN) :: this
202 REAL(dp), POINTER, INTENT(INOUT) :: ptr(:,:,:,:,:)
203
204 CALL c_f_pointer(this%var_item%cptr, ptr, this%var_item%array_shape)
205 END SUBROUTINE comin_var_get_ptr_dp
206
207 SUBROUTINE comin_var_get_ptr_sp(this, ptr)
208 CLASS(t_comin_var_handle), INTENT(IN) :: this
209 REAL(sp), POINTER, INTENT(INOUT) :: ptr(:,:,:,:,:)
210
211 CALL c_f_pointer(this%var_item%cptr, ptr, this%var_item%array_shape)
212 END SUBROUTINE comin_var_get_ptr_sp
213
214 SUBROUTINE comin_var_get_ptr_i(this, ptr)
215 CLASS(t_comin_var_handle), INTENT(IN) :: this
216 INTEGER(C_INT), POINTER, INTENT(INOUT) :: ptr(:,:,:,:,:)
217
218 CALL c_f_pointer(this%var_item%cptr, ptr, this%var_item%array_shape)
219 END SUBROUTINE comin_var_get_ptr_i
220
222 result(array_shape)
223 CLASS(t_comin_var_handle), INTENT(IN) :: this
224 INTEGER :: array_shape(5)
225 array_shape = this%var_item%array_shape
226 END FUNCTION comin_var_get_array_shape
227
229 result(descriptor)
230 CLASS(t_comin_var_handle), INTENT(IN) :: this
231 TYPE(t_comin_var_descriptor) :: descriptor
232 descriptor = this%var_item%descriptor
233 END FUNCTION comin_var_get_descriptor
234
236 result(lcontainer)
237 CLASS(t_comin_var_handle), INTENT(IN) :: this
238 LOGICAL :: lcontainer
239 lcontainer = this%var_item%lcontainer
240 END FUNCTION comin_var_get_lcontainer
241
243 result(ncontained)
244 CLASS(t_comin_var_handle), INTENT(IN) :: this
245 INTEGER :: ncontained
246 ncontained = this%var_item%ncontained
247 END FUNCTION comin_var_get_ncontained
248
250 result(dim_semantics)
251 CLASS(t_comin_var_handle), INTENT(IN) :: this
252 INTEGER :: dim_semantics(5)
253 dim_semantics = this%var_item%dim_semantics
254 END FUNCTION comin_var_get_dim_semantics
255
256 FUNCTION comin_var_get_valid(this) &
257 result(valid)
258 CLASS(t_comin_var_handle), INTENT(IN) :: this
259 LOGICAL :: valid
260 valid = ASSOCIATED(this%var_item)
261 END FUNCTION comin_var_get_valid
262
267 SUBROUTINE comin_var_to_3d_dp(var, slice)
268 CLASS(t_comin_var_handle), INTENT(IN) :: var
269 REAL(dp), POINTER :: slice(:,:,:)
270 REAL(dp), POINTER :: tmp_ptr(:,:,:,:,:)
271 INTEGER :: pos_jn
272
273 ! this operation is invalid if the field is a container
274 IF (var%lcontainer()) THEN
275 CALL comin_plugin_finish_external("comin_var_to_3d", &
276 & " ERROR: Attempt to convert container variable into 3D field.")
277 END IF
278
279 CALL var%get_ptr(tmp_ptr)
280
281 pos_jn = findloc(var%dim_semantics(), comin_dim_semantics_container, dim=1)
282 SELECT CASE (pos_jn)
283 CASE(1)
284 slice => tmp_ptr(1, :, :, :, 1)
285 CASE(2)
286 slice => tmp_ptr(:, 1, :, :, 1)
287 CASE(3)
288 slice => tmp_ptr(:, :, 1, :, 1)
289 CASE DEFAULT
290 slice => tmp_ptr(:, :, :, 1, 1)
291 END SELECT
292 END SUBROUTINE comin_var_to_3d_dp
293
298 SUBROUTINE comin_var_to_3d_sp(var, slice)
299 CLASS(t_comin_var_handle), INTENT(IN) :: var
300 REAL(sp), POINTER :: slice(:,:,:)
301 REAL(sp), POINTER :: tmp_ptr(:,:,:,:,:)
302 INTEGER :: pos_jn
303
304 ! this operation is invalid if the field is a container
305 IF (var%lcontainer()) THEN
306 CALL comin_plugin_finish_external("comin_var_to_3d", &
307 & " ERROR: Attempt to convert container variable into 3D field.")
308 END IF
309
310 CALL var%get_ptr(tmp_ptr)
311
312 pos_jn = findloc(var%dim_semantics(), comin_dim_semantics_container, dim=1)
313 SELECT CASE (pos_jn)
314 CASE(1)
315 slice => tmp_ptr(1, :, :, :, 1)
316 CASE(2)
317 slice => tmp_ptr(:, 1, :, :, 1)
318 CASE(3)
319 slice => tmp_ptr(:, :, 1, :, 1)
320 CASE DEFAULT
321 slice => tmp_ptr(:, :, :, 1, 1)
322 END SELECT
323 END SUBROUTINE comin_var_to_3d_sp
324
329 SUBROUTINE comin_var_to_3d_i(var, slice)
330 CLASS(t_comin_var_handle), INTENT(IN) :: var
331 INTEGER(C_INT), POINTER :: slice(:,:,:)
332 INTEGER(C_INT), POINTER :: tmp_ptr(:,:,:,:,:)
333 INTEGER :: pos_jn
334
335 ! this operation is invalid if the field is a container
336 IF (var%lcontainer()) THEN
337 CALL comin_plugin_finish_external("comin_var_to_3d", &
338 & " ERROR: Attempt to convert container variable into 3D field.")
339 END IF
340
341 CALL var%get_ptr(tmp_ptr)
342
343 pos_jn = findloc(var%dim_semantics(), comin_dim_semantics_container, dim=1)
344 SELECT CASE (pos_jn)
345 CASE(1)
346 slice => tmp_ptr(1, :, :, :, 1)
347 CASE(2)
348 slice => tmp_ptr(:, 1, :, :, 1)
349 CASE(3)
350 slice => tmp_ptr(:, :, 1, :, 1)
351 CASE DEFAULT
352 slice => tmp_ptr(:, :, :, 1, 1)
353 END SELECT
354 END SUBROUTINE comin_var_to_3d_i
355
356 SUBROUTINE comin_var_handle_set_cptr(var, cptr)
357 TYPE(t_comin_var_handle), INTENT(INOUT) :: var
358 TYPE(c_ptr), INTENT(IN) :: cptr
359
360 var%var_item%cptr = cptr
361#if defined(OPENACC)
362 var%var_item%device_ptr = acc_deviceptr(cptr)
363#endif
364
365 END SUBROUTINE
366
367END MODULE comin_variable_types
integer, parameter, public wp
working precision
subroutine comin_var_to_3d_dp(var, slice)
Convenience operation for accessing 2D/3D fields.
subroutine comin_var_to_3d_sp(var, slice)
Convenience operation for accessing 2D/3D fields.
subroutine comin_var_to_3d_i(var, slice)
Convenience operation for accessing 2D/3D fields.
integer, parameter, public dp
integer, parameter, public sp
subroutine comin_var_get_ptr_sp(this, ptr)
type(t_comin_var_handle) function comin_var_ptr_init(var_item)
subroutine comin_var_get_ptr_dp(this, ptr)
type(t_comin_var_descriptor) function create_comin_var_descriptor_from_c(desc_c)
Create a variable descriptor from a C structure.
logical function comin_var_descr_match(var_descriptor1, var_descriptor2)
compare two variable descriptors.
integer function, dimension(5) comin_var_get_dim_semantics(this)
subroutine comin_var_get_ptr_i(this, ptr)
logical function comin_var_get_lcontainer(this)
subroutine comin_var_handle_set_cptr(var, cptr)
integer function, dimension(5) comin_var_get_array_shape(this)
type(t_comin_var_descriptor) function comin_var_get_descriptor(this)
integer function comin_var_get_ncontained(this)
type(t_comin_var_descriptor) function create_comin_var_descriptor(name, id)
Create a variable descriptor from a variable name and id.
logical function comin_var_get_valid(this)
Variable descriptor. identifies (uniquely) a variable. Do not confuse with meta-data.
Variable pointer. Fortran interface for accessing variables.
Array of variable lists (array of pointer lists) each entry.