14 USE iso_c_binding,
ONLY: c_int, c_ptr, c_bool, c_double, c_f_pointer
16 & comin_metadata_typeid_undefined, &
17 & comin_metadata_typeid_integer, &
18 & comin_metadata_typeid_real, &
19 & comin_metadata_typeid_character, &
20 & comin_metadata_typeid_logical
59#include "comin_global.inc"
65 MODULE PROCEDURE comin_request_set_var_metadata_logical
66 MODULE PROCEDURE comin_request_set_var_metadata_integer
67 MODULE PROCEDURE comin_request_set_var_metadata_real
68 MODULE PROCEDURE comin_request_set_var_metadata_character
75 MODULE PROCEDURE comin_metadata_host_set_logical
76 MODULE PROCEDURE comin_metadata_host_set_integer
77 MODULE PROCEDURE comin_metadata_host_set_real
78 MODULE PROCEDURE comin_metadata_host_set_character
84 MODULE PROCEDURE comin_metadata_get_logical
85 MODULE PROCEDURE comin_metadata_get_integer
86 MODULE PROCEDURE comin_metadata_get_real
87 MODULE PROCEDURE comin_metadata_get_character
91 MODULE PROCEDURE comin_metadata_get_or_integer
92 MODULE PROCEDURE comin_metadata_get_or_real
93 MODULE PROCEDURE comin_metadata_get_or_character
94 MODULE PROCEDURE comin_metadata_get_or_logical
100 SUBROUTINE comin_metadata_host_set_integer(descriptor, key, val)
102 CHARACTER(LEN=*),
INTENT(IN) :: key
103 INTEGER,
INTENT(IN) :: val
108 IF (.NOT.
ASSOCIATED(var_item))
THEN
111 IF ( all(var_item%metadata%query(trim(key)) /= &
112 (/comin_metadata_typeid_undefined, comin_metadata_typeid_integer/) ) )
THEN
115 CALL var_item%metadata%set(key, val)
117 END SUBROUTINE comin_metadata_host_set_integer
120 SUBROUTINE comin_metadata_host_set_logical(descriptor, key, val)
122 CHARACTER(LEN=*),
INTENT(IN) :: key
123 LOGICAL,
INTENT(IN) :: val
128 IF (.NOT.
ASSOCIATED(var_item))
THEN
131 IF ( all(var_item%metadata%query(trim(key)) /= &
132 (/comin_metadata_typeid_undefined, comin_metadata_typeid_logical/) ) )
THEN
135 CALL var_item%metadata%set(key, val)
137 END SUBROUTINE comin_metadata_host_set_logical
140 SUBROUTINE comin_metadata_host_set_real(descriptor, key, val)
142 CHARACTER(LEN=*),
INTENT(IN) :: key
143 REAL(wp),
INTENT(IN) :: val
148 IF (.NOT.
ASSOCIATED(var_item))
THEN
151 IF ( all(var_item%metadata%query(trim(key)) /= &
152 & (/comin_metadata_typeid_undefined, comin_metadata_typeid_real/) ) )
THEN
155 CALL var_item%metadata%set(key, val)
157 END SUBROUTINE comin_metadata_host_set_real
160 SUBROUTINE comin_metadata_host_set_character(descriptor, key, val)
162 CHARACTER(LEN=*),
INTENT(IN) :: key
163 CHARACTER(LEN=*),
INTENT(IN) :: val
168 IF (.NOT.
ASSOCIATED(var_item))
THEN
172 IF ( all(var_item%metadata%query(trim(key)) /= &
173 (/comin_metadata_typeid_undefined, comin_metadata_typeid_character/) ) )
THEN
176 CALL var_item%metadata%set(key, val)
178 END SUBROUTINE comin_metadata_host_set_character
181 SUBROUTINE comin_metadata_get_integer(var_descriptor, key, val)
183 CHARACTER(LEN=*),
INTENT(IN) :: key
184 INTEGER,
INTENT(OUT) :: val
189 IF (.NOT.
state%l_primary_done)
THEN
194 IF (.NOT.
ASSOCIATED(var_item))
THEN
198 IF ( var_item%metadata%query(trim(key)) /= comin_metadata_typeid_integer)
THEN
203 CALL var_item%metadata%get(key, val)
204 END SUBROUTINE comin_metadata_get_integer
207 SUBROUTINE comin_metadata_get_logical(var_descriptor, key, val)
209 CHARACTER(LEN=*),
INTENT(IN) :: key
210 LOGICAL,
INTENT(OUT) :: val
215 IF (.NOT.
state%l_primary_done)
THEN
220 IF (.NOT.
ASSOCIATED(var_item))
THEN
224 IF ( var_item%metadata%query(trim(key)) /= comin_metadata_typeid_logical)
THEN
229 CALL var_item%metadata%get(key, val)
230 END SUBROUTINE comin_metadata_get_logical
233 SUBROUTINE comin_metadata_get_real(var_descriptor, key, val)
235 CHARACTER(LEN=*),
INTENT(IN) :: key
236 REAL(wp),
INTENT(OUT) :: val
241 IF (.NOT.
state%l_primary_done)
THEN
246 IF (.NOT.
ASSOCIATED(var_item))
THEN
250 IF ( var_item%metadata%query(trim(key)) /= comin_metadata_typeid_real)
THEN
255 CALL var_item%metadata%get(key, val)
256 END SUBROUTINE comin_metadata_get_real
259 SUBROUTINE comin_metadata_get_character(var_descriptor, key, val)
261 CHARACTER(LEN=*),
INTENT(IN) :: key
262 CHARACTER(LEN=:),
ALLOCATABLE,
INTENT(OUT) :: val
267 IF (.NOT.
state%l_primary_done)
THEN
272 IF (.NOT.
ASSOCIATED(var_item))
THEN
276 IF ( var_item%metadata%query(trim(key)) /= comin_metadata_typeid_character)
THEN
281 CALL var_item%metadata%get(key, val)
282 END SUBROUTINE comin_metadata_get_character
286 &
BIND(C, NAME="comin_metadata_get_integer")
288 TYPE(c_ptr),
VALUE,
INTENT(IN) :: key
289 INTEGER(kind=c_int),
INTENT(OUT) :: val
292 INTEGER :: val_fortran
295 CALL comin_metadata_get_integer(var_descriptor_fortran, &
297 val = int(val_fortran, c_int)
302 &
BIND(C, NAME="comin_metadata_get_logical")
304 TYPE(c_ptr),
VALUE,
INTENT(IN) :: key
305 LOGICAL(kind=c_bool),
INTENT(OUT) :: val
308 LOGICAL :: val_fortran
311 CALL comin_metadata_get_logical(var_descriptor_fortran, &
313 val =
LOGICAL(val_fortran, c_bool)
318 &
BIND(C, NAME="comin_metadata_get_real")
320 TYPE(c_ptr),
VALUE,
INTENT(IN) :: key
321 REAL(kind=c_double),
INTENT(OUT) :: val
324 REAL(
wp) :: val_fortran
327 CALL comin_metadata_get_real(var_descriptor_fortran, &
329 val = real(val_fortran, c_double)
334 &
BIND(C, NAME="comin_metadata_get_character")
336 TYPE(c_ptr),
VALUE,
INTENT(IN) :: key
337 TYPE(c_ptr),
INTENT(OUT) :: val
338 INTEGER(kind=c_int),
INTENT(OUT) :: len
344 FUNCTION c_strlen(str_ptr)
BIND ( C, name = "strlen" ) RESULT(len)
345 use,
INTRINSIC :: iso_c_binding
346 TYPE(c_ptr),
VALUE :: str_ptr
347 INTEGER(kind=c_size_t) :: len
348 END FUNCTION c_strlen
352 IF (.NOT.
state%l_primary_done)
THEN
358 IF (.NOT.
ASSOCIATED(var_item))
THEN
362 IF ( var_item%metadata%query(
convert_c_string(key)) /= comin_metadata_typeid_character)
THEN
369 len = int(c_strlen(val),c_int)
372 SUBROUTINE comin_metadata_get_or_integer(metadata, key, val, defaultval)
374 CHARACTER(LEN=*),
INTENT(in) :: key
375 INTEGER,
INTENT(out) :: val
376 INTEGER,
INTENT(in) :: defaultval
378 SELECT CASE ( metadata%query(key) )
379 CASE (comin_metadata_typeid_integer)
380 CALL metadata%get(key, val)
381 CASE (comin_metadata_typeid_undefined)
386 END SUBROUTINE comin_metadata_get_or_integer
388 SUBROUTINE comin_metadata_get_or_real(metadata, key, val, defaultval)
390 CHARACTER(LEN=*),
INTENT(in) :: key
391 REAL(wp),
INTENT(out) :: val
392 REAL(wp),
INTENT(in) :: defaultval
394 SELECT CASE ( metadata%query(key) )
395 CASE (comin_metadata_typeid_real)
396 CALL metadata%get(key, val)
397 CASE (comin_metadata_typeid_undefined)
402 END SUBROUTINE comin_metadata_get_or_real
404 SUBROUTINE comin_metadata_get_or_character(metadata, key, val, defaultval)
406 CHARACTER(LEN=*),
INTENT(in) :: key
407 CHARACTER(LEN=:),
ALLOCATABLE,
INTENT(out) :: val
408 CHARACTER(LEN=*),
INTENT(in) :: defaultval
410 SELECT CASE ( metadata%query(key) )
411 CASE (comin_metadata_typeid_character)
412 CALL metadata%get(key, val)
413 CASE (comin_metadata_typeid_undefined)
418 END SUBROUTINE comin_metadata_get_or_character
420 SUBROUTINE comin_metadata_get_or_logical(metadata, key, val, defaultval)
422 CHARACTER(LEN=*),
INTENT(in) :: key
423 LOGICAL,
INTENT(out) :: val
424 LOGICAL,
INTENT(in) :: defaultval
426 SELECT CASE ( metadata%query(key) )
427 CASE (comin_metadata_typeid_logical)
428 CALL metadata%get(key, val)
429 CASE (comin_metadata_typeid_undefined)
434 END SUBROUTINE comin_metadata_get_or_logical
437 &
BIND(C, name="comin_metadata_set_integer")
439 TYPE(c_ptr),
VALUE,
INTENT(IN) :: key
440 INTEGER(kind=c_int),
VALUE,
INTENT(IN) :: val
445 CALL comin_request_set_var_metadata_integer(var_descriptor_fortran, &
450 &
BIND(C, name="comin_metadata_set_logical")
452 TYPE(c_ptr),
VALUE,
INTENT(IN) :: key
453 LOGICAL(C_BOOL),
VALUE,
INTENT(IN) :: val
458 CALL comin_request_set_var_metadata_logical(var_descriptor_fortran, &
463 &
BIND(C, name="comin_metadata_set_real")
465 TYPE(c_ptr),
VALUE,
INTENT(IN) :: key
466 REAL(
wp),
VALUE,
INTENT(IN) :: val
471 CALL comin_request_set_var_metadata_real(var_descriptor_fortran, &
476 &
BIND(C, name="comin_metadata_set_character")
478 TYPE(c_ptr),
VALUE,
INTENT(IN) :: key
479 TYPE(c_ptr),
VALUE,
INTENT(IN) :: val
484 CALL comin_request_set_var_metadata_character(var_descriptor_fortran, &
495 SUBROUTINE comin_request_set_var_metadata_integer(var_descriptor, key, val)
496 TYPE (t_comin_var_descriptor),
INTENT(IN) :: var_descriptor
497 CHARACTER(LEN=*),
INTENT(IN) :: key
498 INTEGER,
INTENT(IN) :: val
500 INTEGER :: domain_id, domain_id_start, domain_id_end
502 TYPE (t_comin_var_descriptor) :: var_descriptor_domain
504 TYPE(c_ptr) :: it, cptr
508 IF (
state%l_primary_done)
THEN
512 IF (var_descriptor%id == -1)
THEN
514 IF (.NOT.
ASSOCIATED(comin_global))
CALL comin_plugin_finish(
"variable ",
"global data missing")
517 domain_id_end = comin_global%n_dom
519 domain_id_start = var_descriptor%id
520 domain_id_end = var_descriptor%id
525 DO domain_id = domain_id_start, domain_id_end
526 var_descriptor_domain = var_descriptor
527 var_descriptor_domain%id = domain_id
532 CALL c_f_pointer(cptr, item)
536 IF ( all(item%metadata%query(trim(key)) /= &
537 & (/comin_metadata_typeid_undefined, comin_metadata_typeid_integer/) ) )
THEN
540 CALL item%metadata%set(key, val)
546 IF (.NOT. lfound)
THEN
549 END SUBROUTINE comin_request_set_var_metadata_integer
558 SUBROUTINE comin_request_set_var_metadata_logical(var_descriptor, key, val)
559 TYPE (t_comin_var_descriptor),
INTENT(IN) :: var_descriptor
560 CHARACTER(LEN=*),
INTENT(IN) :: key
561 LOGICAL,
INTENT(IN) :: val
563 INTEGER :: domain_id, domain_id_start, domain_id_end
565 TYPE (t_comin_var_descriptor) :: var_descriptor_domain
567 TYPE(c_ptr) :: it, cptr
571 IF (
state%l_primary_done)
THEN
575 IF (var_descriptor%id == -1)
THEN
577 IF (.NOT.
ASSOCIATED(comin_global))
CALL comin_plugin_finish(
"variable ",
"global data missing")
580 domain_id_end = comin_global%n_dom
582 domain_id_start = var_descriptor%id
583 domain_id_end = var_descriptor%id
588 DO domain_id = domain_id_start, domain_id_end
589 var_descriptor_domain = var_descriptor
590 var_descriptor_domain%id = domain_id
595 CALL c_f_pointer(cptr, item)
600 IF ((key ==
"tracer") .AND. val .AND. (var_descriptor%id /= -1))
THEN
603 IF ( all(item%metadata%query(trim(key)) /= &
604 & (/comin_metadata_typeid_undefined, comin_metadata_typeid_logical/) ) )
THEN
607 CALL item%metadata%set(key, val)
613 IF (.NOT. lfound)
THEN
616 END SUBROUTINE comin_request_set_var_metadata_logical
625 SUBROUTINE comin_request_set_var_metadata_real(var_descriptor, key, val)
626 TYPE (t_comin_var_descriptor),
INTENT(IN) :: var_descriptor
627 CHARACTER(LEN=*),
INTENT(IN) :: key
628 REAL(wp),
INTENT(IN) :: val
630 INTEGER :: domain_id, domain_id_start, domain_id_end
632 TYPE (t_comin_var_descriptor) :: var_descriptor_domain
634 TYPE(c_ptr) :: it, cptr
638 IF (
state%l_primary_done)
THEN
642 IF (var_descriptor%id == -1)
THEN
644 IF (.NOT.
ASSOCIATED(comin_global))
CALL comin_plugin_finish(
"variable ",
"global data missing")
647 domain_id_end = comin_global%n_dom
649 domain_id_start = var_descriptor%id
650 domain_id_end = var_descriptor%id
655 DO domain_id = domain_id_start, domain_id_end
656 var_descriptor_domain = var_descriptor
657 var_descriptor_domain%id = domain_id
662 CALL c_f_pointer(cptr, item)
666 IF ( all(item%metadata%query(trim(key)) /= &
667 & (/comin_metadata_typeid_undefined, comin_metadata_typeid_real/) ) )
THEN
670 CALL item%metadata%set(key, val)
676 IF (.NOT. lfound)
THEN
679 END SUBROUTINE comin_request_set_var_metadata_real
688 SUBROUTINE comin_request_set_var_metadata_character(var_descriptor, key, val)
689 TYPE (t_comin_var_descriptor),
INTENT(IN) :: var_descriptor
690 CHARACTER(LEN=*),
INTENT(IN) :: key
691 CHARACTER(LEN=*),
INTENT(IN) :: val
693 INTEGER :: domain_id, domain_id_start, domain_id_end
695 TYPE (t_comin_var_descriptor) :: var_descriptor_domain
697 TYPE(c_ptr) :: it, cptr
701 IF (
state%l_primary_done)
THEN
705 IF (var_descriptor%id == -1)
THEN
707 IF (.NOT.
ASSOCIATED(comin_global))
CALL comin_plugin_finish(
"variable ",
"global data missing")
710 domain_id_end = comin_global%n_dom
712 domain_id_start = var_descriptor%id
713 domain_id_end = var_descriptor%id
718 DO domain_id = domain_id_start, domain_id_end
719 var_descriptor_domain = var_descriptor
720 var_descriptor_domain%id = domain_id
725 CALL c_f_pointer(cptr, item)
729 IF ( all(item%metadata%query(trim(key)) /= &
730 & (/comin_metadata_typeid_undefined, comin_metadata_typeid_character/) ) )
THEN
733 CALL item%metadata%set(key, val)
739 IF (.NOT. lfound)
THEN
742 END SUBROUTINE comin_request_set_var_metadata_character
749 CHARACTER(LEN=*),
INTENT(IN) :: key
755 IF (.NOT.
state%l_primary_done)
THEN
760 IF (.NOT.
ASSOCIATED(var_item))
THEN
763 typeid = var_item%metadata%query(key)
766 INTEGER(KIND=c_int) FUNCTION comin_metadata_get_typeid_c(var_descriptor, key) &
768 &
BIND(C, name="comin_metadata_get_typeid")
770 TYPE(c_ptr),
VALUE,
INTENT(IN) :: key
778 END FUNCTION comin_metadata_get_typeid_c
789 IF (.NOT.
state%l_primary_done)
THEN
794 IF (.NOT.
ASSOCIATED(var_item))
THEN
797 CALL var_item%metadata%get_iterator(iterator)
802 FUNCTION comin_metadata_get_iterator_begin_c(var_descriptor) &
804 &
BIND(C, name="comin_metadata_get_iterator_begin")
806 TYPE(c_ptr) :: iterator
814 IF (.NOT.
ASSOCIATED(var_item))
THEN
819 END FUNCTION comin_metadata_get_iterator_begin_c
823 FUNCTION comin_metadata_get_iterator_end_c(var_descriptor) &
825 &
BIND(C, name="comin_metadata_get_iterator_end")
827 TYPE(c_ptr) :: iterator
835 IF (.NOT.
ASSOCIATED(var_item))
THEN
840 END FUNCTION comin_metadata_get_iterator_end_c
842 FUNCTION comin_metadata_iterator_get_key_c(it)
RESULT(key) &
843 &
BIND(C, NAME="comin_metadata_iterator_get_key")
844 TYPE(c_ptr),
INTENT(IN),
VALUE :: it
847 END FUNCTION comin_metadata_iterator_get_key_c
849 FUNCTION comin_metadata_iterator_compare_c(it1, it2)
RESULT(equal) &
850 &
BIND(C, NAME="comin_metadata_iterator_compare")
851 TYPE(c_ptr),
INTENT(IN),
VALUE :: it1
852 TYPE(c_ptr),
INTENT(IN),
VALUE :: it2
853 LOGICAL(KIND=C_BOOL) :: equal
855 END FUNCTION comin_metadata_iterator_compare_c
857 SUBROUTINE comin_metadata_iterator_next_c(it) &
858 &
BIND(C, NAME="comin_metadata_iterator_next")
859 TYPE(c_ptr),
INTENT(IN),
VALUE :: it
861 END SUBROUTINE comin_metadata_iterator_next_c
863 SUBROUTINE comin_metadata_iterator_delete_c(it) &
864 &
BIND(C, NAME="comin_metadata_iterator_delete")
865 TYPE(c_ptr),
INTENT(IN),
VALUE :: it
867 END SUBROUTINE comin_metadata_iterator_delete_c
subroutine, public comin_metadata_get_iterator(var_descriptor, iterator)
Return a metadata container iterator.
integer function, public comin_metadata_get_typeid(var_descriptor, key)
Return a ID (integer) describing the the metadata for a given key string.
integer, parameter, public wp
working precision
subroutine, public comin_plugin_finish(routine, text)
Wrapper function for callback to ICON's "finish" routine.
type(t_comin_descrdata_global) function, pointer, public comin_descrdata_get_global()
request a pointer to the global data type
@ comin_error_tracer_request_not_for_all_domains
@ comin_error_metadata_set_outside_primaryconstructor
@ comin_error_var_item_not_associated
@ comin_error_var_metadata_inconsistent_type
@ comin_error_var_descriptor_not_found
@ comin_error_metadata_get_inside_primaryconstructor
subroutine, public comin_error_set(errcode)
type(t_comin_state), pointer, public state
logical function comin_var_descr_match(var_descriptor1, var_descriptor2)
compare two variable descriptors.
type(t_comin_var_item) function, pointer, public comin_var_get_from_exposed(var_descriptor)
get pointer to a variable exposed by ICON
Global data is invariant wrt the computational grid and never changed or updated.
Information on requested variables.
Variable descriptor. identifies (uniquely) a variable. Do not confuse with meta-data.