ComIn 0.5.1
ICON Community Interface
Loading...
Searching...
No Matches
comin_variable.F90
Go to the documentation of this file.
1!> @file comin_variable.F90
2!! @brief Functions to modify and retrieve Variable definition
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_ptr, c_loc, c_null_ptr, c_f_pointer, &
15 & c_bool, c_funptr, c_funloc, c_int64_t, c_char
36
37 IMPLICIT NONE
38
39 PRIVATE
40
41 ! Public procedures, intention: called by host
43 ! Public procedures, intention: called by host and plugin
46 ! Public procedures, intention: called by plugin
47 PUBLIC :: comin_var_get
49 ! Public procedures, intention: for internal use
53 ! PUBLIC procedures only exposed to host model
54 PUBLIC :: comin_var_set_cptr
55 PUBLIC :: comin_var_is_used
56
57 PUBLIC :: comin_varmap_new
58 PUBLIC :: comin_varmap_delete
59 PUBLIC :: comin_varmap_clear
60
61 PUBLIC :: comin_varmap_get
62 PUBLIC :: comin_varmap_put
63
69
70#include "comin_global.inc"
71
72 INTERFACE
73 !> Append variable item to context list (ie. the list of variable accesses for each entry point).
74 SUBROUTINE comin_var_list_context_append(ep, plugin_id, var_item, access_flag) BIND(C)
75 USE iso_c_binding
76 IMPLICIT NONE
77 INTEGER(c_int), VALUE :: ep
78 INTEGER(c_int), VALUE :: plugin_id
79 TYPE(C_PTR), VALUE :: var_item
80 INTEGER(C_INT), VALUE :: access_flag
82
83 !> Check if a variable is actually used by any comin plugin.
84 FUNCTION comin_var_is_used_c(var_descriptor) BIND(C,name="comin_var_is_used")
85 IMPORT c_bool, t_comin_var_descriptor_c
86 TYPE(t_comin_var_descriptor_c), INTENT(IN) :: var_descriptor
87 LOGICAL(C_BOOL) :: comin_var_is_used_c
88 END FUNCTION comin_var_is_used_c
89
90 !> Get first element of variable descriptor list.
91 !! Returns a C-pointer that can be evaluated with
92 !! the auxiliary function `comin_var_get_descr_list_var_desc`.
93 !! @ingroup fortran_interface
94 FUNCTION comin_var_get_descr_list_head() RESULT(ptr_c) BIND(C)
95 IMPORT c_ptr
96 TYPE(c_ptr) :: ptr_c
98
99 !> Get next element of variable descriptor list.
100 !! Returns a C-pointer that can be evaluated with
101 !! the auxiliary function `comin_var_get_descr_list_var_desc`.
102 !! Returns null pointer if end of list has been reached.
103 !! @ingroup fortran_interface
104 FUNCTION comin_var_get_descr_list_next(current) RESULT(ptr_c) BIND(C)
105 IMPORT c_ptr
106 TYPE(c_ptr), INTENT(IN), VALUE :: current
107 TYPE(c_ptr) :: ptr_c
109
110 !> Delete list iterator.
111 !! @ingroup fortran_interface
113 IMPORT c_ptr
114 TYPE(c_ptr), INTENT(INOUT) :: it
116
117 !> Auxiliary function: Evaluates a list iterator of the
118 !! variable descriptor list and returns the corresponding
119 !! variable descriptor.
120 !!
121 !! This is the C-variant of the subroutine.
122 SUBROUTINE comin_var_get_descr_list_var_desc_c(it, var_desc_out) BIND(C, name="comin_var_get_descr_list_var_desc")
123 IMPORT c_ptr, t_comin_var_descriptor_c
124 TYPE(c_ptr), INTENT(IN), VALUE :: it
125 TYPE(t_comin_var_descriptor_c), INTENT(INOUT) :: var_desc_out
126 END SUBROUTINE comin_var_get_descr_list_var_desc_c
127
128 SUBROUTINE comin_state_set_sync_device_fct_c(sync_device_fct) &
129 BIND(C, name="comin_state_set_sync_device_fct")
130 IMPORT c_funptr
131 TYPE(c_funptr), VALUE, INTENT(IN) :: sync_device_fct
132 END SUBROUTINE comin_state_set_sync_device_fct_c
133
134 SUBROUTINE comin_state_set_sync_halo_fct_c(sync_halo_fct) &
135 BIND(C, name="comin_state_set_sync_halo_fct")
136 IMPORT c_funptr
137 TYPE(c_funptr), VALUE, INTENT(IN) :: sync_halo_fct
138 END SUBROUTINE comin_state_set_sync_halo_fct_c
139
140 FUNCTION comin_construct_metadata() RESULT(metadata_ptr) &
141 & BIND(C)
142 IMPORT c_ptr
143 TYPE(c_ptr) :: metadata_ptr
144 END FUNCTION comin_construct_metadata
145
146 SUBROUTINE comin_destruct_metadata(metadata_ptr) &
147 & BIND(C)
148 IMPORT c_ptr
149 TYPE(c_ptr), VALUE, intent(in) :: metadata_ptr
150 END SUBROUTINE comin_destruct_metadata
151 END INTERFACE
152
153 ! Varmap functions
154 INTERFACE
155 SUBROUTINE comin_varmap_new(map) bind(C, name='comin_varmap_new_c')
156 IMPORT c_ptr
157 TYPE(c_ptr), INTENT(OUT) :: map
158 END SUBROUTINE
159 SUBROUTINE comin_varmap_delete(map) bind(C, name='comin_varmap_delete_c')
160 IMPORT c_ptr
161 TYPE(c_ptr), VALUE :: map
162 END SUBROUTINE
163 SUBROUTINE comin_varmap_clear(map) bind(C, name='comin_varmap_clear_c')
164 IMPORT c_ptr
165 TYPE(c_ptr), VALUE :: map
166 END SUBROUTINE
167 TYPE(c_ptr) FUNCTION comin_varmap_get_c (map, name, len, id) BIND(C)
168 IMPORT c_ptr, c_int64_t, c_char, c_int
169 TYPE(c_ptr), VALUE, INTENT(IN) :: map
170 INTEGER(c_int64_t), VALUE, INTENT(IN) :: len
171 CHARACTER(kind=c_char), INTENT(IN) :: name(len)
172 INTEGER(c_int), VALUE, INTENT(IN) :: id
173 END FUNCTION
174 SUBROUTINE comin_varmap_put_c (map, name, len, id, ptr) BIND(C)
175 IMPORT c_ptr, c_int64_t, c_char, c_int, t_comin_var_item
176 TYPE(c_ptr), VALUE :: map
177 INTEGER(c_int64_t), VALUE, INTENT(IN) :: len
178 CHARACTER(kind=c_char), INTENT(IN) :: name(len)
179 INTEGER(c_int), VALUE, INTENT(IN) :: id
180 TYPE(t_comin_var_item), INTENT(IN) :: ptr
181 END SUBROUTINE
182 SUBROUTINE comin_varmap_iterator_begin (map, it) bind(C, name='comin_varmap_iterator_begin_c')
183 IMPORT c_ptr
184 TYPE(c_ptr), VALUE :: map
185 TYPE(c_ptr), INTENT(OUT) :: it
186 END SUBROUTINE
187 SUBROUTINE comin_varmap_iterator_delete (it) bind(C, name='comin_varmap_iterator_delete_c')
188 IMPORT c_ptr
189 TYPE(c_ptr), VALUE :: it
190 END SUBROUTINE
191 SUBROUTINE comin_varmap_iterator_next (it) bind(C, name='comin_varmap_iterator_next_c')
192 IMPORT c_ptr
193 TYPE(c_ptr), VALUE :: it
194 END SUBROUTINE
195 LOGICAL(c_bool) FUNCTION comin_varmap_iterator_is_end (map, it) bind(C, name='comin_varmap_iterator_is_end_c')
196 IMPORT c_ptr, c_bool
197 TYPE(c_ptr), VALUE, INTENT(IN) :: map
198 TYPE(c_ptr), VALUE, INTENT(IN) :: it
199 END FUNCTION
200 SUBROUTINE comin_varmap_iterator_value (it, ptr) bind(C, name='comin_varmap_iterator_value_c')
201 IMPORT c_ptr
202 TYPE(c_ptr), VALUE, INTENT(IN) :: it
203 TYPE(c_ptr), INTENT(OUT) :: ptr
204 END SUBROUTINE
205 END INTERFACE
206
207CONTAINS
208
209 !> Auxiliary function: Evaluates a list iterator of the
210 !! variable descriptor list and returns the corresponding
211 !! variable descriptor.
212 !! @ingroup fortran_interface
213 SUBROUTINE comin_var_get_descr_list_var_desc(it, var_desc_out)
214 TYPE(c_ptr), INTENT(IN), VALUE :: it
215 TYPE(t_comin_var_descriptor), INTENT(INOUT) :: var_desc_out
216 !
217 TYPE(t_comin_var_descriptor_c) :: var_desc_c
218
219 CALL comin_var_get_descr_list_var_desc_c(it, var_desc_c)
220
221 var_desc_out = t_comin_var_descriptor(var_desc_c)
223
224 !> Append item to variable list.
225 SUBROUTINE comin_var_list_append(var_descr, cptr, device_ptr, &
226 & array_shape, type_id, &
227 & dim_semantics, &
228 & lcontainer, ncontained, &
229 & var_handle)
230 TYPE(t_comin_var_descriptor), INTENT(IN) :: var_descr
231 TYPE(c_ptr), INTENT(IN) :: cptr, device_ptr
232 INTEGER, INTENT(IN) :: array_shape(5), type_id
233 INTEGER, INTENT(IN) :: dim_semantics(5)
234 LOGICAL, INTENT(IN) :: lcontainer
235 INTEGER, INTENT(IN) :: ncontained
236 TYPE(t_comin_var_handle), INTENT(OUT) :: var_handle
237 !
238 TYPE(t_comin_var_item) :: var_item
239
240 TYPE(c_ptr) :: var_list
241
242 var_list = comin_state_get_var_list()
243
244 ! add an entry to the other (internal) list of variables
245 ! which contains a pointer to the above descriptor
246 var_item%descriptor = t_comin_var_descriptor_c(var_descr)
247 var_item%cptr = cptr
248 var_item%device_ptr = device_ptr
249 var_item%array_shape = array_shape
250 var_item%type_id = type_id
251 var_item%dim_semantics = dim_semantics
252 var_item%lcontainer = lcontainer
253 var_item%ncontained = ncontained
254 var_item%metadata = comin_construct_metadata()
255 CALL comin_varmap_put(var_list, var_descr%name, var_descr%id, var_item)
256
257 var_handle = comin_var_ptr_init(comin_varmap_get(var_list, var_descr%name, var_descr%id))
258
259 END SUBROUTINE comin_var_list_append
260
261 !> Destruct variable list, deallocate memory.
263 ! local
264 TYPE(c_ptr) :: it, cptr, var_list
265 TYPE(t_comin_var_item), POINTER :: item
266
267 var_list = comin_state_get_var_list()
268
269 CALL comin_varmap_iterator_begin(var_list, it)
270 DO WHILE (.NOT. comin_varmap_iterator_is_end(var_list, it))
271 CALL comin_varmap_iterator_value(it, cptr)
272 CALL c_f_pointer(cptr, item)
273
274 CALL comin_destruct_metadata(item%metadata)
275 item%metadata = c_null_ptr
277 END DO
279 CALL comin_varmap_clear(var_list)
280 END SUBROUTINE comin_var_list_finalize
281
282 FUNCTION comin_var_get_c(context_len, context, var_descriptor, flag) &
283 & result(var_pointer) &
284 & BIND(C, name="comin_var_get")
285 INTEGER(c_int),VALUE, INTENT(IN) :: context_len
286 INTEGER(c_int), INTENT(IN) :: context(context_len)
287 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: var_descriptor
288 INTEGER(c_int), VALUE, INTENT(IN) :: flag
289 TYPE(c_ptr) :: var_pointer
290 TYPE(t_comin_var_item), POINTER :: var_item => null()
291
292 TYPE(t_comin_var_descriptor) :: var_descriptor_fortran
293
294 var_pointer = c_null_ptr
295
296 var_descriptor_fortran = t_comin_var_descriptor(var_descriptor)
297
298 CALL comin_var_get_internal(context, var_descriptor_fortran, flag, var_item)
299 IF(ASSOCIATED(var_item)) var_pointer = c_loc(var_item)
300 END FUNCTION comin_var_get_c
301
302 FUNCTION comin_var_get_ptr(handle) &
303 & result(dataptr) &
304 & BIND(C, NAME="comin_var_get_ptr")
305 TYPE(c_ptr), INTENT(IN), VALUE :: handle
306 TYPE(c_ptr) :: dataptr
307 !
308 TYPE(t_comin_var_item), POINTER :: p => null()
309 CALL c_f_pointer(handle, p)
310 IF (.NOT. ASSOCIATED(p)) THEN
311 dataptr = c_null_ptr
312 ELSE
313 dataptr = p%cptr
314 END IF
315 END FUNCTION comin_var_get_ptr
316
317 FUNCTION comin_var_get_ptr_double(handle) &
318 & result(dataptr) &
319 & BIND(C, NAME="comin_var_get_ptr_double")
320 TYPE(c_ptr), INTENT(IN), VALUE :: handle
321 TYPE(c_ptr) :: dataptr
322 !
323 TYPE(t_comin_var_item), POINTER :: p => null()
324 dataptr = c_null_ptr
325 CALL c_f_pointer(handle, p)
326 IF (ASSOCIATED(p)) THEN
327 IF(p%type_id /= comin_var_datatype_double) THEN
329 ENDIF
330 dataptr = p%cptr
331 END IF
332 END FUNCTION comin_var_get_ptr_double
333
334 FUNCTION comin_var_get_ptr_float(handle) &
335 & result(dataptr) &
336 & BIND(C, NAME="comin_var_get_ptr_float")
337 TYPE(c_ptr), INTENT(IN), VALUE :: handle
338 TYPE(c_ptr) :: dataptr
339 !
340 TYPE(t_comin_var_item), POINTER :: p => null()
341 dataptr = c_null_ptr
342 CALL c_f_pointer(handle, p)
343 IF (ASSOCIATED(p)) THEN
344 IF(p%type_id /= comin_var_datatype_float) THEN
346 ENDIF
347 dataptr = p%cptr
348 END IF
349 END FUNCTION comin_var_get_ptr_float
350
351 FUNCTION comin_var_get_ptr_int(handle) &
352 & result(dataptr) &
353 & BIND(C, NAME="comin_var_get_ptr_int")
354 TYPE(c_ptr), INTENT(IN), VALUE :: handle
355 TYPE(c_ptr) :: dataptr
356 !
357 TYPE(t_comin_var_item), POINTER :: p => null()
358 dataptr = c_null_ptr
359 CALL c_f_pointer(handle, p)
360 IF (ASSOCIATED(p)) THEN
361 IF(p%type_id /= comin_var_datatype_int) THEN
363 ENDIF
364 dataptr = p%cptr
365 END IF
366 END FUNCTION comin_var_get_ptr_int
367
368 FUNCTION comin_var_get_device_ptr(handle) &
369 & result(device_ptr) &
370 & BIND(C, NAME="comin_var_get_device_ptr")
371 TYPE(c_ptr), INTENT(IN), VALUE :: handle
372 TYPE(c_ptr) :: device_ptr
373 !
374 TYPE(t_comin_var_item), POINTER :: p => null()
375 CALL c_f_pointer(handle, p)
376 device_ptr = p%device_ptr
377 END FUNCTION comin_var_get_device_ptr
378
379 FUNCTION comin_var_get_device_ptr_double(handle) &
380 & result(device_ptr) &
381 & BIND(C, NAME="comin_var_get_device_ptr_double")
382 TYPE(c_ptr), INTENT(IN), VALUE :: handle
383 TYPE(c_ptr) :: device_ptr
384 !
385 TYPE(t_comin_var_item), POINTER :: p => null()
386
387 device_ptr = c_null_ptr
388 CALL c_f_pointer(handle, p)
389 IF (ASSOCIATED(p)) THEN
390 IF(p%type_id /= comin_var_datatype_double) THEN
392 ENDIF
393 device_ptr = p%device_ptr
394 ENDIF
395 END FUNCTION comin_var_get_device_ptr_double
396
397 FUNCTION comin_var_get_device_ptr_float(handle) &
398 & result(device_ptr) &
399 & BIND(C, NAME="comin_var_get_device_ptr_float")
400 TYPE(c_ptr), INTENT(IN), VALUE :: handle
401 TYPE(c_ptr) :: device_ptr
402 !
403 TYPE(t_comin_var_item), POINTER :: p => null()
404
405 device_ptr = c_null_ptr
406 CALL c_f_pointer(handle, p)
407 IF (ASSOCIATED(p)) THEN
408 IF(p%type_id /= comin_var_datatype_float) THEN
410 ENDIF
411 device_ptr = p%device_ptr
412 ENDIF
413 END FUNCTION comin_var_get_device_ptr_float
414
415 FUNCTION comin_var_get_device_ptr_int(handle) &
416 & result(device_ptr) &
417 & BIND(C, NAME="comin_var_get_device_ptr_int")
418 TYPE(c_ptr), INTENT(IN), VALUE :: handle
419 TYPE(c_ptr) :: device_ptr
420 !
421 TYPE(t_comin_var_item), POINTER :: p => null()
422
423 device_ptr = c_null_ptr
424 CALL c_f_pointer(handle, p)
425 IF (ASSOCIATED(p)) THEN
426 IF(p%type_id /= comin_var_datatype_int) THEN
428 ENDIF
429 device_ptr = p%device_ptr
430 ENDIF
431 END FUNCTION comin_var_get_device_ptr_int
432
433 SUBROUTINE comin_var_get_shape(handle, data_shape) &
434 & BIND(C, NAME="comin_var_get_shape")
435 TYPE(c_ptr), INTENT(IN), VALUE :: handle
436 INTEGER(C_INT), INTENT(INOUT) :: data_shape(5)
437 !
438 TYPE(t_comin_var_item), POINTER :: p => null()
439 CALL c_f_pointer(handle, p)
440 IF (.NOT. ASSOCIATED(p)) THEN
442 ELSE
443 data_shape = p%array_shape
444 END IF
445 END SUBROUTINE comin_var_get_shape
446
447 SUBROUTINE comin_var_get_dim_semantics(handle, dim_semantics) &
448 & BIND(C, NAME="comin_var_get_dim_semantics")
449 TYPE(c_ptr), INTENT(IN), VALUE :: handle
450 INTEGER(C_INT), INTENT(OUT) :: dim_semantics(5)
451 !
452 TYPE(t_comin_var_item), POINTER :: p => null()
453 CALL c_f_pointer(handle, p)
454 IF (.NOT. ASSOCIATED(p)) THEN
456 ELSE
457 dim_semantics = p%dim_semantics
458 END IF
459 END SUBROUTINE comin_var_get_dim_semantics
460
461 SUBROUTINE comin_var_get_ncontained(handle, ncontained) &
462 & BIND(C, NAME="comin_var_get_ncontained")
463 TYPE(c_ptr), INTENT(IN), VALUE :: handle
464 INTEGER(C_INT), INTENT(OUT) :: ncontained
465 !
466 TYPE(t_comin_var_item), POINTER :: p => null()
467 CALL c_f_pointer(handle, p)
468 IF (.NOT. ASSOCIATED(p)) THEN
470 ELSE
471 ! Convert to C dimension index
472 ncontained = p%ncontained - 1
473 END IF
474 END SUBROUTINE comin_var_get_ncontained
475
476 SUBROUTINE comin_var_get_descriptor(handle, descr) &
477 & BIND(C, NAME="comin_var_get_descriptor")
478 TYPE(c_ptr), INTENT(IN), VALUE :: handle
479 TYPE(t_comin_var_descriptor_c), INTENT(INOUT) :: descr
480
481 TYPE(t_comin_var_item), POINTER :: p => null()
482 CALL c_f_pointer(handle, p)
483 IF (.NOT. ASSOCIATED(p)) THEN
485 ELSE
486 descr = p%descriptor
487 END IF
488 END SUBROUTINE comin_var_get_descriptor
489
490 !> Request a pointer to an ICON variable in context(s).
491 !! @ingroup fortran_interface
492 SUBROUTINE comin_var_get(context, var_descriptor, flag, var_ptr)
493 INTEGER, INTENT(IN) :: context(:)
494 TYPE(t_comin_var_descriptor), INTENT(IN) :: var_descriptor
495 INTEGER, INTENT(IN) :: flag
496 TYPE(t_comin_var_handle), INTENT(OUT) :: var_ptr
497 ! local
498 TYPE(t_comin_var_item), POINTER :: var_item => null()
499
500 CALL comin_var_get_internal(context, var_descriptor, flag, var_item)
501 var_ptr = comin_var_ptr_init(var_item)
502 END SUBROUTINE comin_var_get
503
504 !> get pointer to a variable exposed by ICON
505 FUNCTION comin_var_get_from_exposed(var_descriptor) RESULT(comin_get_var)
506 TYPE(t_comin_var_item), POINTER :: comin_get_var
507 TYPE (t_comin_var_descriptor), INTENT(IN) :: var_descriptor
508 !
509 TYPE(c_ptr) :: var_list
510
511 var_list = comin_state_get_var_list()
512 comin_get_var => comin_varmap_get(var_list, var_descriptor%name, var_descriptor%id)
513 END FUNCTION comin_var_get_from_exposed
514
515 !> C wrapper: should be removed once the variable list moves to C++
516 FUNCTION comin_var_get_from_exposed_c(var_descriptor) &
517 & result(var_item_ptr) &
518 & BIND(C, name="comin_var_get_from_exposed")
519 TYPE (t_comin_var_descriptor_c), VALUE, INTENT(IN) :: var_descriptor
520 TYPE (c_ptr) :: var_item_ptr
521 !
522 TYPE (t_comin_var_descriptor) :: var_descriptor_fortran
523 TYPE(c_ptr) :: var_list
524 TYPE(t_comin_var_item), POINTER :: var_item_ptr_f
525
526 var_list = comin_state_get_var_list()
527 var_descriptor_fortran = t_comin_var_descriptor(var_descriptor)
528 var_item_ptr_f => comin_varmap_get(var_list, var_descriptor_fortran%name, var_descriptor_fortran%id)
529 var_item_ptr = c_loc(var_item_ptr_f)
530 END FUNCTION comin_var_get_from_exposed_c
531
532 SUBROUTINE comin_var_set_sync_device_mem(sync_device_mem)
533 PROCEDURE(comin_var_sync_device_mem_fct) :: sync_device_mem
534 TYPE(c_funptr) :: ptr
535 ptr = c_funloc(sync_device_mem)
536 CALL comin_state_set_sync_device_fct_c(ptr)
537 END SUBROUTINE comin_var_set_sync_device_mem
538
539 SUBROUTINE comin_var_set_sync_halo(sync_halo)
540 PROCEDURE(comin_var_sync_halo_fct) :: sync_halo
541 TYPE(c_funptr) :: ptr
542 ptr = c_funloc(sync_halo)
543 CALL comin_state_set_sync_halo_fct_c(ptr)
544 END SUBROUTINE comin_var_set_sync_halo
545
546 SUBROUTINE comin_var_get_internal(context, var_descriptor, flag, var_item)
547 INTEGER, INTENT(IN) :: context(:)
548 TYPE(t_comin_var_descriptor), INTENT(IN) :: var_descriptor
549 INTEGER, INTENT(IN) :: flag
550 TYPE(t_comin_var_item), POINTER :: var_item
551 ! local
552 INTEGER :: ic
553 INTEGER(C_INT) :: plugin_id
554 plugin_id = comin_current_get_plugin_id()
555
556 ! Routine should only be called during secondary constructor
557 IF ((.NOT. comin_state_is_primary_done()) .OR. &
560 END IF
561
562 ! device pointers can only be accessed if a device is available
563 IF ((.NOT. state%comin_descrdata_global_data%has_device) .AND. &
564 & iand(flag, comin_flag_device) /= 0) THEN
566 ENDIF
567 ! first find the variable in list of all ICON variables and set the pointer
568 var_item => comin_var_get_from_exposed(var_descriptor)
569 IF (.NOT. ASSOCIATED(var_item)) THEN
571 ENDIF
572 ! a container can not halo synchronized
573 IF ((var_item%lcontainer) .AND. &
574 & iand(flag, comin_flag_sync_halo) /= 0) THEN
576 ENDIF
577 ! an irregular var can not be halo synchronized
578 IF ((any(var_item%dim_semantics == comin_dim_semantics_undef)) .AND. &
579 & iand(flag, comin_flag_sync_halo) /= 0) THEN
581 ENDIF
582
583 DO ic = 1, SIZE(context)
584 ! ignore EP_SECONDARY_CONSTRUCTOR for var_list
585 IF (context(ic) == ep_secondary_constructor) cycle
586 CALL comin_var_list_context_append(context(ic), plugin_id, c_loc(var_item), flag)
587 END DO
588 END SUBROUTINE comin_var_get_internal
589
590 SUBROUTINE comin_var_set_cptr(var, cptr)
591 TYPE(t_comin_var_handle), INTENT(INOUT) :: var
592 TYPE(c_ptr), INTENT(IN) :: cptr
593 CALL comin_var_handle_set_cptr(var, cptr)
594 END SUBROUTINE comin_var_set_cptr
595
596 !> Check if a variable is actually used by any comin plugin.
597 LOGICAL FUNCTION comin_var_is_used(var_descriptor)
598 TYPE(t_comin_var_descriptor), INTENT(IN) :: var_descriptor
599 TYPE(t_comin_var_descriptor_c) :: var_descriptor_c
600 var_descriptor_c%id = var_descriptor%id
601 CALL convert_f_string(var_descriptor%name, var_descriptor_c%name)
602 comin_var_is_used = comin_var_is_used_c(var_descriptor_c)
603 END FUNCTION comin_var_is_used
604
605 SUBROUTINE comin_varmap_put (map, name, id, var_item)
606 TYPE(c_ptr), INTENT(INOUT) :: map
607 CHARACTER(kind=c_char, len=*), INTENT(IN) :: name
608 INTEGER(c_int), INTENT(IN) :: id
609 TYPE(t_comin_var_item), INTENT(IN) :: var_item
610
611 CALL comin_varmap_put_c(map, name, len(name, kind=c_int64_t), id, var_item)
612 END SUBROUTINE
613
614 FUNCTION comin_varmap_get (map, name, id)
615 TYPE(t_comin_var_item), POINTER :: comin_varmap_get
616 TYPE(c_ptr), INTENT(IN) :: map
617 CHARACTER(kind=c_char, len=*), INTENT(IN) :: name
618 INTEGER(c_int), INTENT(IN) :: id
619 TYPE(c_ptr) :: tmp_ptr
620
621 tmp_ptr = comin_varmap_get_c(map, name, len(name, kind=c_int64_t), id)
622 CALL c_f_pointer(tmp_ptr, comin_varmap_get)
623 END FUNCTION
624
625END MODULE comin_variable
const t_comin_var_item * comin_varmap_get_c(const t_comin_var_map *map, const char *name, size_t len, int id)
void comin_varmap_put_c(t_comin_var_map *map, const char *name, size_t len, int id, const t_comin_var_item *ptr)
void comin_var_get_descr_list_var_desc(t_comin_var_descr_list_iterator *current, t_comin_var_descriptor *var_desc)
bool comin_var_is_used(const t_comin_var_descriptor *descr)
void comin_destruct_metadata(comin::keyval::Map *metadata)
comin::keyval::Map * comin_construct_metadata()
void comin_var_list_context_append(t_comin_entry_point ep, int plugin_id, t_comin_var_item *var_item, int access_flag)
Variable pointer. Fortran interface for accessing variables.
Get first element of variable descriptor list. Returns a C-pointer that can be evaluated with the aux...
Get next element of variable descriptor list. Returns a C-pointer that can be evaluated with the auxi...
Get current entry point.
subroutine, public comin_var_get(context, var_descriptor, flag, var_ptr)
Request a pointer to an ICON variable in context(s).
subroutine, public convert_f_string(string, arr)
Convert Fortran string into C-style character array.
type(t_comin_state), pointer, public state
type(t_comin_var_handle) function comin_var_ptr_init(var_item)
subroutine comin_var_handle_set_cptr(var, cptr)
subroutine, public comin_var_set_cptr(var, cptr)
subroutine, public comin_var_list_finalize()
Destruct variable list, deallocate memory.
subroutine, public comin_var_set_sync_device_mem(sync_device_mem)
subroutine, public comin_var_set_sync_halo(sync_halo)
subroutine, public comin_var_list_append(var_descr, cptr, device_ptr, array_shape, type_id, dim_semantics, lcontainer, ncontained, var_handle)
Append item to variable list.
type(t_comin_var_item) function, pointer, public comin_var_get_from_exposed(var_descriptor)
get pointer to a variable exposed by ICON
type(t_comin_var_item) function, pointer, public comin_varmap_get(map, name, id)
subroutine, public comin_varmap_put(map, name, id, var_item)