14 USE iso_c_binding,
ONLY: c_int, c_ptr, c_loc, c_null_ptr, c_f_pointer, c_bool
37 & ep_destructor, comin_flag_device, comin_flag_sync_halo, &
38 & comin_var_datatype_double, comin_var_datatype_float, &
39 & comin_var_datatype_int, comin_dim_semantics_undef
74#include "comin_global.inc"
94 TYPE(c_ptr),
INTENT(IN),
VALUE :: current
95 TYPE(c_ptr) :: ptr_c, tmp
109 ptr =
state%comin_var_request_list
117 SUBROUTINE comin_var_get_descr_list_var_desc_c(it, var_desc_out)
BIND(C, name="comin_var_get_descr_list_var_desc")
118 TYPE(c_ptr),
INTENT(IN),
VALUE :: it
124 var_desc_out%id = var_desc_ftn%id
126 END SUBROUTINE comin_var_get_descr_list_var_desc_c
132 TYPE(c_ptr),
INTENT(IN),
VALUE :: it
139 CALL c_f_pointer(cptr, item)
140 IF (.NOT.
ASSOCIATED(item))
THEN
148 TYPE(c_ptr),
INTENT(INOUT) :: it
153 SUBROUTINE comin_request_item_finalize(this)
155 CALL this%metadata%delete()
156 END SUBROUTINE comin_request_item_finalize
161 & array_shape, type_id, &
163 & lcontainer, ncontained, &
166 TYPE(c_ptr),
INTENT(IN) :: cptr, device_ptr
167 INTEGER,
INTENT(IN) :: array_shape(5), type_id
168 INTEGER,
INTENT(IN) :: dim_semantics(5)
169 LOGICAL,
INTENT(IN) :: lcontainer
170 INTEGER,
INTENT(IN) :: ncontained
178 ALLOCATE(var_descr_item)
179 var_descr_item = var_descr
185 var_item%descriptor = var_descr
187 var_item%device_ptr = device_ptr
188 var_item%array_shape = array_shape
189 var_item%type_id = type_id
190 var_item%dim_semantics = dim_semantics
191 var_item%lcontainer = lcontainer
192 var_item%ncontained = ncontained
194 CALL var_item%metadata%create()
204 TYPE(c_ptr) :: it, cptr
210 CALL c_f_pointer(cptr, item)
222 TYPE(c_ptr) :: it, cptr
228 CALL c_f_pointer(cptr, item)
229 CALL item%metadata%delete()
241 TYPE(c_ptr) :: it, cptr
247 CALL c_f_pointer(cptr, item)
248 CALL comin_request_item_finalize(item)
255 FUNCTION comin_var_get_c(context_len, context, var_descriptor, flag) &
256 & result(var_pointer) &
257 &
BIND(C, name="comin_var_get")
258 INTEGER(c_int),
VALUE,
INTENT(IN) :: context_len
259 INTEGER(c_int),
INTENT(IN) :: context(context_len)
261 INTEGER(c_int),
VALUE,
INTENT(IN) :: flag
262 TYPE(c_ptr) :: var_pointer
267 var_pointer = c_null_ptr
271 CALL comin_var_get_internal(context, var_descriptor_fortran, flag, var_item)
272 IF(
ASSOCIATED(var_item)) var_pointer = c_loc(var_item)
273 END FUNCTION comin_var_get_c
275 FUNCTION comin_var_get_ptr(handle) &
277 &
BIND(C, NAME="comin_var_get_ptr")
278 TYPE(c_ptr),
INTENT(IN),
VALUE :: handle
279 TYPE(c_ptr) :: dataptr
282 CALL c_f_pointer(handle, p)
283 IF (.NOT.
ASSOCIATED(p))
THEN
288 END FUNCTION comin_var_get_ptr
290 FUNCTION comin_var_get_ptr_double(handle) &
292 &
BIND(C, NAME="comin_var_get_ptr_double")
293 TYPE(c_ptr),
INTENT(IN),
VALUE :: handle
294 TYPE(c_ptr) :: dataptr
298 CALL c_f_pointer(handle, p)
299 IF (
ASSOCIATED(p))
THEN
300 IF(p%type_id /= comin_var_datatype_double)
THEN
305 END FUNCTION comin_var_get_ptr_double
307 FUNCTION comin_var_get_ptr_float(handle) &
309 &
BIND(C, NAME="comin_var_get_ptr_float")
310 TYPE(c_ptr),
INTENT(IN),
VALUE :: handle
311 TYPE(c_ptr) :: dataptr
315 CALL c_f_pointer(handle, p)
316 IF (
ASSOCIATED(p))
THEN
317 IF(p%type_id /= comin_var_datatype_float)
THEN
322 END FUNCTION comin_var_get_ptr_float
324 FUNCTION comin_var_get_ptr_int(handle) &
326 &
BIND(C, NAME="comin_var_get_ptr_int")
327 TYPE(c_ptr),
INTENT(IN),
VALUE :: handle
328 TYPE(c_ptr) :: dataptr
332 CALL c_f_pointer(handle, p)
333 IF (
ASSOCIATED(p))
THEN
334 IF(p%type_id /= comin_var_datatype_int)
THEN
339 END FUNCTION comin_var_get_ptr_int
341 FUNCTION comin_var_get_device_ptr(handle) &
342 & result(device_ptr) &
343 &
BIND(C, NAME="comin_var_get_device_ptr")
344 TYPE(c_ptr),
INTENT(IN),
VALUE :: handle
345 TYPE(c_ptr) :: device_ptr
348 CALL c_f_pointer(handle, p)
349 device_ptr = p%device_ptr
350 END FUNCTION comin_var_get_device_ptr
352 FUNCTION comin_var_get_device_ptr_double(handle) &
353 & result(device_ptr) &
354 &
BIND(C, NAME="comin_var_get_device_ptr_double")
355 TYPE(c_ptr),
INTENT(IN),
VALUE :: handle
356 TYPE(c_ptr) :: device_ptr
360 device_ptr = c_null_ptr
361 CALL c_f_pointer(handle, p)
362 IF (
ASSOCIATED(p))
THEN
363 IF(p%type_id /= comin_var_datatype_double)
THEN
366 device_ptr = p%device_ptr
368 END FUNCTION comin_var_get_device_ptr_double
370 FUNCTION comin_var_get_device_ptr_float(handle) &
371 & result(device_ptr) &
372 &
BIND(C, NAME="comin_var_get_device_ptr_float")
373 TYPE(c_ptr),
INTENT(IN),
VALUE :: handle
374 TYPE(c_ptr) :: device_ptr
378 device_ptr = c_null_ptr
379 CALL c_f_pointer(handle, p)
380 IF (
ASSOCIATED(p))
THEN
381 IF(p%type_id /= comin_var_datatype_float)
THEN
384 device_ptr = p%device_ptr
386 END FUNCTION comin_var_get_device_ptr_float
388 FUNCTION comin_var_get_device_ptr_int(handle) &
389 & result(device_ptr) &
390 &
BIND(C, NAME="comin_var_get_device_ptr_int")
391 TYPE(c_ptr),
INTENT(IN),
VALUE :: handle
392 TYPE(c_ptr) :: device_ptr
396 device_ptr = c_null_ptr
397 CALL c_f_pointer(handle, p)
398 IF (
ASSOCIATED(p))
THEN
399 IF(p%type_id /= comin_var_datatype_int)
THEN
402 device_ptr = p%device_ptr
404 END FUNCTION comin_var_get_device_ptr_int
406 SUBROUTINE comin_var_get_shape(handle, data_shape) &
407 &
BIND(C, NAME="comin_var_get_shape")
408 TYPE(c_ptr),
INTENT(IN),
VALUE :: handle
409 INTEGER(C_INT),
INTENT(INOUT) :: data_shape(5)
412 CALL c_f_pointer(handle, p)
413 IF (.NOT.
ASSOCIATED(p))
THEN
416 data_shape = p%array_shape
418 END SUBROUTINE comin_var_get_shape
420 SUBROUTINE comin_var_get_dim_semantics(handle, dim_semantics) &
421 &
BIND(C, NAME="comin_var_get_dim_semantics")
422 TYPE(c_ptr),
INTENT(IN),
VALUE :: handle
423 INTEGER(C_INT),
INTENT(OUT) :: dim_semantics(5)
426 CALL c_f_pointer(handle, p)
427 IF (.NOT.
ASSOCIATED(p))
THEN
430 dim_semantics = p%dim_semantics
432 END SUBROUTINE comin_var_get_dim_semantics
434 SUBROUTINE comin_var_get_ncontained(handle, ncontained) &
435 &
BIND(C, NAME="comin_var_get_ncontained")
436 TYPE(c_ptr),
INTENT(IN),
VALUE :: handle
437 INTEGER(C_INT),
INTENT(OUT) :: ncontained
440 CALL c_f_pointer(handle, p)
441 IF (.NOT.
ASSOCIATED(p))
THEN
445 ncontained = p%ncontained - 1
447 END SUBROUTINE comin_var_get_ncontained
449 SUBROUTINE comin_var_get_descriptor(handle, descr) &
450 &
BIND(C, NAME="comin_var_get_descriptor")
451 TYPE(c_ptr),
INTENT(IN),
VALUE :: handle
455 CALL c_f_pointer(handle, p)
456 IF (.NOT.
ASSOCIATED(p))
THEN
460 descr%id = p%descriptor%id
462 END SUBROUTINE comin_var_get_descriptor
467 INTEGER,
INTENT(IN) :: context(:)
469 INTEGER,
INTENT(IN) :: flag
474 CALL comin_var_get_internal(context, var_descriptor, flag, var_item)
484 CALL c_f_pointer(
comin_varmap_get(
state%comin_var_list, var_descriptor%name, var_descriptor%id), comin_get_var)
488 FUNCTION comin_var_get_by_context(context, plugin_id, var_descriptor)
RESULT(comin_get_var)
490 INTEGER,
INTENT(IN) :: context, plugin_id
493 TYPE(c_ptr) :: it, cptr
496 comin_get_var => null()
497 IF (.NOT.
ALLOCATED(
state%comin_var_list_context))
RETURN
498 associate(var_list =>
state%comin_var_list_context(context, plugin_id)%var_list)
503 CALL c_f_pointer(cptr, item)
505 comin_get_var => item
512 END FUNCTION comin_var_get_by_context
514 SUBROUTINE comin_var_request_add_c(var_descriptor, lmodexclusive) &
515 &
BIND(C, name="comin_var_request_add")
516 TYPE (t_comin_var_descriptor_c),
VALUE,
INTENT(IN) :: var_descriptor
517 LOGICAL(C_BOOL),
VALUE,
INTENT(IN) :: lmodexclusive
519 TYPE (t_comin_var_descriptor) :: var_descriptor_fortran
521 var_descriptor_fortran = t_comin_var_descriptor(var_descriptor)
523 END SUBROUTINE comin_var_request_add_c
540 TYPE (t_comin_var_descriptor),
INTENT(IN) :: var_descriptor
541 LOGICAL,
INTENT(IN) :: lmodexclusive
543 TYPE(t_comin_descrdata_global),
POINTER :: comin_global
544 TYPE (t_comin_var_descriptor) :: var_descriptor_domain
547 comin_global => comin_descrdata_get_global()
549 IF (state%l_primary_done)
THEN
550 CALL comin_error_set(comin_error_var_request_after_primaryconstructor);
RETURN
553 IF (var_descriptor%id == -1)
THEN
554 comin_global => comin_descrdata_get_global()
555 IF (.NOT.
ASSOCIATED(comin_global))
CALL comin_plugin_finish(
"variable ",
"global data missing")
557 DO domain_id = 1, comin_global%n_dom
558 var_descriptor_domain = var_descriptor
559 var_descriptor_domain%id = domain_id
560 CALL comin_var_request_add_element(var_descriptor_domain, lmodexclusive)
563 CALL comin_var_request_add_element(var_descriptor, lmodexclusive)
568 SUBROUTINE comin_var_request_add_element(var_descriptor, lmodexclusive)
569 TYPE (t_comin_var_descriptor),
INTENT(IN) :: var_descriptor
570 LOGICAL,
INTENT(IN) :: lmodexclusive
572 TYPE(c_ptr) :: it, cptr
573 TYPE(t_comin_request_item),
POINTER :: var_list_request_element, comin_request_item
577 CALL comin_ftnlist_iterator_begin(state%comin_var_request_list, it)
578 DO WHILE (.NOT. comin_ftnlist_is_end(state%comin_var_request_list,it))
579 CALL comin_ftnlist_iterator_value(it, cptr)
580 CALL c_f_pointer(cptr, var_list_request_element)
581 IF (comin_var_descr_match(var_list_request_element%descriptor, var_descriptor))
THEN
583 IF (var_list_request_element%lmodexclusive)
THEN
584 CALL comin_error_set(comin_error_var_request_exists_is_lmodexclusive);
RETURN
586 ELSEIF (lmodexclusive)
THEN
587 CALL comin_error_set(comin_error_var_request_exists_request_lmodexclusive);
RETURN
590 IF (.NOT.
ALLOCATED(var_list_request_element%moduleID))
THEN
592 CALL comin_error_set(comin_error_field_not_allocated);
RETURN
594 var_list_request_element%moduleID = [var_list_request_element%moduleID(:), &
595 & state%current_plugin%id]
600 CALL comin_ftnlist_iterator_next(it)
602 CALL comin_ftnlist_iterator_delete(it)
605 associate( var_list => state%comin_var_request_list)
606 ALLOCATE(comin_request_item)
607 comin_request_item%descriptor = var_descriptor
608 comin_request_item%lmodexclusive = lmodexclusive
609 comin_request_item%moduleID = [state%current_plugin%id]
610 CALL comin_request_item%metadata%create()
611 CALL comin_ftnlist_push_back(var_list, c_loc(comin_request_item))
613 END SUBROUTINE comin_var_request_add_element
622 ALLOCATE(state%comin_var_list_context(ep_destructor, state%num_plugins))
623 DO i=1,
size(state%comin_var_list_context,1)
624 DO j=1,
size(state%comin_var_list_context,2)
625 CALL comin_ftnlist_new(state%comin_var_list_context(i,j)%var_list)
632 PROCEDURE(comin_var_sync_device_mem_fct) :: sync_device_mem
634 state%sync_device_mem => sync_device_mem
635 IF (.NOT.
ASSOCIATED(state%sync_device_mem))
THEN
636 CALL comin_error_set(comin_error_var_sync_device_mem_not_associated);
RETURN
641 PROCEDURE(comin_var_sync_halo_fct) :: sync_halo
642 state%sync_halo => sync_halo
643 IF (.NOT.
ASSOCIATED(state%sync_halo))
THEN
644 CALL comin_error_set(comin_error_var_sync_halo_not_associated);
RETURN
648 SUBROUTINE comin_var_get_internal(context, var_descriptor, flag, var_item)
649 INTEGER,
INTENT(IN) :: context(:)
650 TYPE(t_comin_var_descriptor),
INTENT(IN) :: var_descriptor
651 INTEGER,
INTENT(IN) :: flag
652 TYPE(t_comin_var_item),
POINTER :: var_item
654 TYPE(t_comin_var_context_item),
POINTER :: item
658 IF ((.NOT. state%l_primary_done) .OR. &
659 & state%current_ep > ep_secondary_constructor)
THEN
660 CALL comin_error_set(comin_error_var_get_outside_secondary_constructor);
RETURN
664 IF ((.NOT. state%comin_descrdata_global%has_device) .AND. &
665 & iand(flag, comin_flag_device) /= 0)
THEN
666 CALL comin_error_set(comin_error_var_get_no_device);
RETURN
670 IF (.NOT.
ASSOCIATED(var_item))
THEN
671 CALL comin_error_set(comin_error_var_get_variable_not_found);
RETURN
674 IF ((var_item%lcontainer) .AND. &
675 & iand(flag, comin_flag_sync_halo) /= 0)
THEN
676 CALL comin_error_set(comin_error_var_get_container_can_not_halo_synchronized);
RETURN
679 IF ((any(var_item%dim_semantics == comin_dim_semantics_undef)) .AND. &
680 & iand(flag, comin_flag_sync_halo) /= 0)
THEN
681 CALL comin_error_set(comin_error_var_get_irregular_var_can_not_halo_synchronized);
RETURN
684 DO ic = 1,
SIZE(context)
686 IF (context(ic) == ep_secondary_constructor) cycle
687 item => comin_var_get_by_context(context(ic), state%current_plugin%id, var_item%descriptor)
688 IF (.NOT.
ASSOCIATED(item))
THEN
690 associate(var_list => state%comin_var_list_context(context(ic) , state%current_plugin%id)%var_list)
692 item = t_comin_var_context_item( var_item = var_item, &
693 & access_flag = flag)
694 CALL comin_ftnlist_push_back(var_list, c_loc(item))
698 END SUBROUTINE comin_var_get_internal
701 TYPE(t_comin_var_handle),
INTENT(INOUT) :: var
702 TYPE(c_ptr),
INTENT(IN) :: cptr
705 CALL comin_var_handle_set_cptr(var, cptr)
711 TYPE(t_comin_var_descriptor),
INTENT(IN) :: var_descriptor
713 TYPE(t_comin_var_context_item),
POINTER :: item
714 TYPE(c_ptr) :: list, it, p
719 DO ep = 1,
SIZE(state%comin_var_list_context, 1)
720 DO id = 1,
SIZE(state%comin_var_list_context, 2)
721 list = state%comin_var_list_context(ep, id)%var_list
722 CALL comin_ftnlist_iterator_begin(list, it)
723 DO WHILE(.NOT. comin_ftnlist_is_end(list, it))
724 CALL comin_ftnlist_iterator_value(it, p)
725 CALL c_f_pointer(p, item)
727 IF (comin_var_descr_match(item%var_item%descriptor, var_descriptor))
THEN
729 CALL comin_ftnlist_iterator_delete(it)
733 CALL comin_ftnlist_iterator_next(it)
735 CALL comin_ftnlist_iterator_delete(it)
integer, parameter, public wp
working precision
type(c_ptr) function, public comin_request_get_list()
subroutine, public comin_var_request_list_finalize()
Destruct variable request list, deallocate memory.
subroutine, public comin_var_list_finalize()
Destruct variable list, deallocate memory.
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.
subroutine, public comin_plugin_finish(routine, text)
Wrapper function for callback to ICON's "finish" routine.
subroutine, public comin_var_request_add(var_descriptor, lmodexclusive)
By calling this subroutine inside the primary constructor, 3rd party plugins may request the creation...
type(t_comin_descrdata_global) function, pointer, public comin_descrdata_get_global()
request a pointer to the global data type
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.
@ comin_error_field_not_allocated
@ comin_error_var_get_container_can_not_halo_synchronized
@ comin_error_var_get_variable_wrong_type
@ comin_error_var_sync_device_mem_not_associated
@ comin_error_var_get_outside_secondary_constructor
@ comin_error_var_sync_halo_not_associated
@ comin_error_var_request_exists_request_lmodexclusive
@ comin_error_var_request_after_primaryconstructor
@ comin_error_var_request_exists_is_lmodexclusive
@ comin_error_var_get_irregular_var_can_not_halo_synchronized
@ comin_error_var_get_variable_not_found
@ comin_error_var_get_no_device
@ comin_error_pointer_not_associated
subroutine, public comin_error_set(errcode)
subroutine, public comin_varmap_put(map, name, id, ptr)
type(c_ptr) function, public comin_varmap_get(map, name, id)
type(t_comin_state), pointer, public state
type(t_comin_var_handle) function comin_var_ptr_init(var_item)
logical function comin_var_descr_match(var_descriptor1, var_descriptor2)
compare two variable descriptors.
subroutine comin_var_handle_set_cptr(var, cptr)
subroutine, public comin_var_descr_list_iterator_delete(it)
Delete list iterator.
logical function, public comin_var_is_used(var_descriptor)
Check if a variable is actually used by any comin plugin.
subroutine, public comin_var_complete()
subroutine, public comin_var_descr_list_finalize()
Destruct variable descriptor list, deallocate memory.
type(c_ptr) function, public comin_var_get_descr_list_next(current)
Get next element of variable descriptor list. Returns a C-pointer that can be evaluated with the auxi...
type(c_ptr) function, public comin_var_get_descr_list_head()
Get first element of variable descriptor list. Returns a C-pointer that can be evaluated with the aux...
subroutine, public comin_var_set_sync_device_mem(sync_device_mem)
subroutine, public comin_var_set_sync_halo(sync_halo)
subroutine, public comin_var_set_cptr(var, cptr)
type(t_comin_var_item) function, pointer, public comin_var_get_from_exposed(var_descriptor)
get pointer to a variable exposed by ICON
subroutine, public comin_var_get_descr_list_var_desc(it, var_desc_out)
Auxiliary function: Evaluates a list iterator of the variable descriptor list and returns the corresp...
Global data is invariant wrt the computational grid and never changed or updated.
Information on requested variables.
Variable list for context access.
Variable descriptor. identifies (uniquely) a variable. Do not confuse with meta-data.
Variable pointer. Fortran interface for accessing variables.