ICON Community Interface 0.4.0
Loading...
Searching...
No Matches
comin_metadata.F90
Go to the documentation of this file.
1
3!
4! @authors 11/2023 :: 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_bool, c_double, c_f_pointer
15 USE comin_setup_constants, ONLY: wp, &
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
31 USE comin_state, ONLY: state
44 IMPLICIT NONE
45
46 PRIVATE
47
50 PUBLIC :: comin_metadata_get
51 PUBLIC :: comin_metadata_get_or
58
59#include "comin_global.inc"
60
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
69 END INTERFACE comin_metadata_set_request
70
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
79 END INTERFACE comin_metadata_set_host
80
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
88 END INTERFACE comin_metadata_get
89
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
95 END INTERFACE
96
97CONTAINS
98
100 SUBROUTINE comin_metadata_host_set_integer(descriptor, key, val)
101 TYPE(t_comin_var_descriptor), INTENT(IN) :: descriptor
102 CHARACTER(LEN=*), INTENT(IN) :: key
103 INTEGER, INTENT(IN) :: val
104 !
105 TYPE(t_comin_var_item), POINTER :: var_item
106
107 var_item => comin_var_get_from_exposed(descriptor)
108 IF (.NOT. ASSOCIATED(var_item)) THEN
110 ELSE
111 IF ( all(var_item%metadata%query(trim(key)) /= &
112 (/comin_metadata_typeid_undefined, comin_metadata_typeid_integer/) ) ) THEN
114 ENDIF
115 CALL var_item%metadata%set(key, val)
116 END IF
117 END SUBROUTINE comin_metadata_host_set_integer
118
120 SUBROUTINE comin_metadata_host_set_logical(descriptor, key, val)
121 TYPE(t_comin_var_descriptor), INTENT(IN) :: descriptor
122 CHARACTER(LEN=*), INTENT(IN) :: key
123 LOGICAL, INTENT(IN) :: val
124 !
125 TYPE(t_comin_var_item), POINTER :: var_item
126
127 var_item => comin_var_get_from_exposed(descriptor)
128 IF (.NOT. ASSOCIATED(var_item)) THEN
130 ELSE
131 IF ( all(var_item%metadata%query(trim(key)) /= &
132 (/comin_metadata_typeid_undefined, comin_metadata_typeid_logical/) ) ) THEN
134 ENDIF
135 CALL var_item%metadata%set(key, val)
136 END IF
137 END SUBROUTINE comin_metadata_host_set_logical
138
140 SUBROUTINE comin_metadata_host_set_real(descriptor, key, val)
141 TYPE(t_comin_var_descriptor), INTENT(IN) :: descriptor
142 CHARACTER(LEN=*), INTENT(IN) :: key
143 REAL(wp), INTENT(IN) :: val
144 !
145 TYPE(t_comin_var_item), POINTER :: var_item
146
147 var_item => comin_var_get_from_exposed(descriptor)
148 IF (.NOT. ASSOCIATED(var_item)) THEN
150 ELSE
151 IF ( all(var_item%metadata%query(trim(key)) /= &
152 & (/comin_metadata_typeid_undefined, comin_metadata_typeid_real/) ) ) THEN
154 ENDIF
155 CALL var_item%metadata%set(key, val)
156 END IF
157 END SUBROUTINE comin_metadata_host_set_real
158
160 SUBROUTINE comin_metadata_host_set_character(descriptor, key, val)
161 TYPE(t_comin_var_descriptor), INTENT(IN) :: descriptor
162 CHARACTER(LEN=*), INTENT(IN) :: key
163 CHARACTER(LEN=*), INTENT(IN) :: val
164 !
165 TYPE(t_comin_var_item), POINTER :: var_item
166
167 var_item => comin_var_get_from_exposed(descriptor)
168 IF (.NOT. ASSOCIATED(var_item)) THEN
170 RETURN
171 ELSE
172 IF ( all(var_item%metadata%query(trim(key)) /= &
173 (/comin_metadata_typeid_undefined, comin_metadata_typeid_character/) ) ) THEN
175 ENDIF
176 CALL var_item%metadata%set(key, val)
177 END IF
178 END SUBROUTINE comin_metadata_host_set_character
179
181 SUBROUTINE comin_metadata_get_integer(var_descriptor, key, val)
182 TYPE(t_comin_var_descriptor), INTENT(IN) :: var_descriptor
183 CHARACTER(LEN=*), INTENT(IN) :: key
184 INTEGER, INTENT(OUT) :: val
185 ! local
186 TYPE(t_comin_var_item), POINTER :: var_item
187
188 ! check if called after primary constructor
189 IF (.NOT. state%l_primary_done) THEN
191 END IF
192 ! first find the variable in list of all ICON variables and set the pointer
193 var_item => comin_var_get_from_exposed(var_descriptor)
194 IF (.NOT. ASSOCIATED(var_item)) THEN
196 END IF
197
198 IF ( var_item%metadata%query(trim(key)) /= comin_metadata_typeid_integer) THEN
200 RETURN
201 ENDIF
202
203 CALL var_item%metadata%get(key, val)
204 END SUBROUTINE comin_metadata_get_integer
205
207 SUBROUTINE comin_metadata_get_logical(var_descriptor, key, val)
208 TYPE(t_comin_var_descriptor), INTENT(IN) :: var_descriptor
209 CHARACTER(LEN=*), INTENT(IN) :: key
210 LOGICAL, INTENT(OUT) :: val
211 ! local
212 TYPE(t_comin_var_item), POINTER :: var_item
213
214 ! check if called after primary constructor
215 IF (.NOT. state%l_primary_done) THEN
217 END IF
218 ! first find the variable in list of all ICON variables and set the pointer
219 var_item => comin_var_get_from_exposed(var_descriptor)
220 IF (.NOT. ASSOCIATED(var_item)) THEN
222 END IF
223
224 IF ( var_item%metadata%query(trim(key)) /= comin_metadata_typeid_logical) THEN
226 RETURN
227 ENDIF
228
229 CALL var_item%metadata%get(key, val)
230 END SUBROUTINE comin_metadata_get_logical
231
233 SUBROUTINE comin_metadata_get_real(var_descriptor, key, val)
234 TYPE(t_comin_var_descriptor), INTENT(IN) :: var_descriptor
235 CHARACTER(LEN=*), INTENT(IN) :: key
236 REAL(wp), INTENT(OUT) :: val
237 ! local
238 TYPE(t_comin_var_item), POINTER :: var_item
239
240 ! check if called after primary constructor
241 IF (.NOT. state%l_primary_done) THEN
243 END IF
244 ! first find the variable in list of all ICON variables and set the pointer
245 var_item => comin_var_get_from_exposed(var_descriptor)
246 IF (.NOT. ASSOCIATED(var_item)) THEN
248 END IF
249
250 IF ( var_item%metadata%query(trim(key)) /= comin_metadata_typeid_real) THEN
252 RETURN
253 ENDIF
254
255 CALL var_item%metadata%get(key, val)
256 END SUBROUTINE comin_metadata_get_real
257
259 SUBROUTINE comin_metadata_get_character(var_descriptor, key, val)
260 TYPE(t_comin_var_descriptor), INTENT(IN) :: var_descriptor
261 CHARACTER(LEN=*), INTENT(IN) :: key
262 CHARACTER(LEN=:), ALLOCATABLE,INTENT(OUT) :: val
263 ! local
264 TYPE(t_comin_var_item), POINTER :: var_item
265
266 ! check if called after primary constructor
267 IF (.NOT. state%l_primary_done) THEN
269 END IF
270 ! first find the variable in list of all ICON variables and set the pointer
271 var_item => comin_var_get_from_exposed(var_descriptor)
272 IF (.NOT. ASSOCIATED(var_item)) THEN
274 END IF
275
276 IF ( var_item%metadata%query(trim(key)) /= comin_metadata_typeid_character) THEN
278 RETURN
279 ENDIF
280
281 CALL var_item%metadata%get(key, val)
282 END SUBROUTINE comin_metadata_get_character
283
285 SUBROUTINE comin_metadata_get_integer_c(var_descriptor, key, val) &
286 & BIND(C, NAME="comin_metadata_get_integer")
287 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: var_descriptor
288 TYPE(c_ptr), VALUE, INTENT(IN) :: key
289 INTEGER(kind=c_int), INTENT(OUT) :: val
290 ! local
291 TYPE(t_comin_var_descriptor) :: var_descriptor_fortran
292 INTEGER :: val_fortran
293
294 var_descriptor_fortran = t_comin_var_descriptor(var_descriptor)
295 CALL comin_metadata_get_integer(var_descriptor_fortran, &
296 & convert_c_string(key), val_fortran)
297 val = int(val_fortran, c_int)
298 END SUBROUTINE comin_metadata_get_integer_c
299
301 SUBROUTINE comin_metadata_get_logical_c(var_descriptor, key, val) &
302 & BIND(C, NAME="comin_metadata_get_logical")
303 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: var_descriptor
304 TYPE(c_ptr), VALUE, INTENT(IN) :: key
305 LOGICAL(kind=c_bool), INTENT(OUT) :: val
306 ! local
307 TYPE(t_comin_var_descriptor) :: var_descriptor_fortran
308 LOGICAL :: val_fortran
309
310 var_descriptor_fortran = t_comin_var_descriptor(var_descriptor)
311 CALL comin_metadata_get_logical(var_descriptor_fortran, &
312 & convert_c_string(key), val_fortran)
313 val = LOGICAL(val_fortran, c_bool)
314 END SUBROUTINE comin_metadata_get_logical_c
315
317 SUBROUTINE comin_metadata_get_real_c(var_descriptor, key, val) &
318 & BIND(C, NAME="comin_metadata_get_real")
319 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: var_descriptor
320 TYPE(c_ptr), VALUE, INTENT(IN) :: key
321 REAL(kind=c_double), INTENT(OUT) :: val
322 ! local
323 TYPE(t_comin_var_descriptor) :: var_descriptor_fortran
324 REAL(wp) :: val_fortran
325
326 var_descriptor_fortran = t_comin_var_descriptor(var_descriptor)
327 CALL comin_metadata_get_real(var_descriptor_fortran, &
328 & convert_c_string(key), val_fortran)
329 val = real(val_fortran, c_double)
330 END SUBROUTINE comin_metadata_get_real_c
331
333 SUBROUTINE comin_metadata_get_character_c(var_descriptor, key, val, len) &
334 & BIND(C, NAME="comin_metadata_get_character")
335 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: var_descriptor
336 TYPE(c_ptr), VALUE, INTENT(IN) :: key
337 TYPE(c_ptr), INTENT(OUT) :: val
338 INTEGER(kind=c_int), INTENT(OUT) :: len
339 ! local
340 TYPE(t_comin_var_descriptor) :: var_descriptor_fortran
341 TYPE(t_comin_var_item), POINTER :: var_item
342
343 INTERFACE
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
349 END INTERFACE
350
351 ! check if called after primary constructor
352 IF (.NOT. state%l_primary_done) THEN
354 END IF
355 ! Create fortran var descriptor and get var_item
356 var_descriptor_fortran = t_comin_var_descriptor(var_descriptor)
357 var_item => comin_var_get_from_exposed(var_descriptor_fortran)
358 IF (.NOT. ASSOCIATED(var_item)) THEN
360 END IF
361
362 IF ( var_item%metadata%query(convert_c_string(key)) /= comin_metadata_typeid_character) THEN
364 RETURN
365 ENDIF
366
367 ! Not another Fortran detour, get the c_ptr directly
368 CALL comin_keyval_get_char_c(key, val, var_item%metadata%comin_metadata_c)
369 len = int(c_strlen(val),c_int)
370 END SUBROUTINE comin_metadata_get_character_c
371
372 SUBROUTINE comin_metadata_get_or_integer(metadata, key, val, defaultval)
373 TYPE(t_comin_var_metadata), INTENT(inout) :: metadata
374 CHARACTER(LEN=*), INTENT(in) :: key
375 INTEGER, INTENT(out) :: val
376 INTEGER, INTENT(in) :: defaultval
377
378 SELECT CASE ( metadata%query(key) )
379 CASE (comin_metadata_typeid_integer)
380 CALL metadata%get(key, val)
381 CASE (comin_metadata_typeid_undefined)
382 val = defaultval
383 CASE DEFAULT
385 END SELECT
386 END SUBROUTINE comin_metadata_get_or_integer
387
388 SUBROUTINE comin_metadata_get_or_real(metadata, key, val, defaultval)
389 TYPE(t_comin_var_metadata), INTENT(inout) :: metadata
390 CHARACTER(LEN=*), INTENT(in) :: key
391 REAL(wp), INTENT(out) :: val
392 REAL(wp), INTENT(in) :: defaultval
393
394 SELECT CASE ( metadata%query(key) )
395 CASE (comin_metadata_typeid_real)
396 CALL metadata%get(key, val)
397 CASE (comin_metadata_typeid_undefined)
398 val = defaultval
399 CASE DEFAULT
401 END SELECT
402 END SUBROUTINE comin_metadata_get_or_real
403
404 SUBROUTINE comin_metadata_get_or_character(metadata, key, val, defaultval)
405 TYPE(t_comin_var_metadata), INTENT(inout) :: metadata
406 CHARACTER(LEN=*), INTENT(in) :: key
407 CHARACTER(LEN=:), ALLOCATABLE, INTENT(out) :: val
408 CHARACTER(LEN=*), INTENT(in) :: defaultval
409
410 SELECT CASE ( metadata%query(key) )
411 CASE (comin_metadata_typeid_character)
412 CALL metadata%get(key, val)
413 CASE (comin_metadata_typeid_undefined)
414 val = defaultval
415 CASE DEFAULT
417 END SELECT
418 END SUBROUTINE comin_metadata_get_or_character
419
420 SUBROUTINE comin_metadata_get_or_logical(metadata, key, val, defaultval)
421 TYPE(t_comin_var_metadata), INTENT(inout) :: metadata
422 CHARACTER(LEN=*), INTENT(in) :: key
423 LOGICAL, INTENT(out) :: val
424 LOGICAL, INTENT(in) :: defaultval
425
426 SELECT CASE ( metadata%query(key) )
427 CASE (comin_metadata_typeid_logical)
428 CALL metadata%get(key, val)
429 CASE (comin_metadata_typeid_undefined)
430 val = defaultval
431 CASE DEFAULT
433 END SELECT
434 END SUBROUTINE comin_metadata_get_or_logical
435
436 SUBROUTINE comin_metadata_set_integer_c(var_descriptor, key, val) &
437 & BIND(C, name="comin_metadata_set_integer")
438 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: var_descriptor
439 TYPE(c_ptr), VALUE, INTENT(IN) :: key
440 INTEGER(kind=c_int), VALUE, INTENT(IN) :: val
441 !
442 TYPE (t_comin_var_descriptor) :: var_descriptor_fortran
443
444 var_descriptor_fortran = t_comin_var_descriptor(var_descriptor)
445 CALL comin_request_set_var_metadata_integer(var_descriptor_fortran, &
446 & convert_c_string(key), val)
447 END SUBROUTINE comin_metadata_set_integer_c
448
449 SUBROUTINE comin_metadata_set_logical_c(var_descriptor, key, val) &
450 & BIND(C, name="comin_metadata_set_logical")
451 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: var_descriptor
452 TYPE(c_ptr), VALUE, INTENT(IN) :: key
453 LOGICAL(C_BOOL), VALUE, INTENT(IN) :: val
454 !
455 TYPE (t_comin_var_descriptor) :: var_descriptor_fortran
456
457 var_descriptor_fortran = t_comin_var_descriptor(var_descriptor)
458 CALL comin_request_set_var_metadata_logical(var_descriptor_fortran, &
459 & convert_c_string(key), LOGICAL(val))
460 END SUBROUTINE comin_metadata_set_logical_c
461
462 SUBROUTINE comin_metadata_set_real_c(var_descriptor, key, val) &
463 & BIND(C, name="comin_metadata_set_real")
464 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: var_descriptor
465 TYPE(c_ptr), VALUE, INTENT(IN) :: key
466 REAL(wp), VALUE, INTENT(IN) :: val
467 !
468 TYPE (t_comin_var_descriptor) :: var_descriptor_fortran
469
470 var_descriptor_fortran = t_comin_var_descriptor(var_descriptor)
471 CALL comin_request_set_var_metadata_real(var_descriptor_fortran, &
472 & convert_c_string(key), real(val, wp))
473 END SUBROUTINE comin_metadata_set_real_c
474
475 SUBROUTINE comin_metadata_set_character_c(var_descriptor, key, val) &
476 & BIND(C, name="comin_metadata_set_character")
477 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: var_descriptor
478 TYPE(c_ptr), VALUE, INTENT(IN) :: key
479 TYPE(c_ptr), VALUE, INTENT(IN) :: val
480 !
481 TYPE (t_comin_var_descriptor) :: var_descriptor_fortran
482
483 var_descriptor_fortran = t_comin_var_descriptor(var_descriptor)
484 CALL comin_request_set_var_metadata_character(var_descriptor_fortran, &
486 END SUBROUTINE comin_metadata_set_character_c
487
489 ! for a requested variable. Must be called inside the primary
490 ! constructor and the variable must have been previously requested,
491 ! otherwise this subroutine aborts with an error status flag. If
492 ! the metadata key does not exist, then this subroutine aborts with
493 ! an error status flag.
494 !
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
499 ! local
500 INTEGER :: domain_id, domain_id_start, domain_id_end
501 LOGICAL :: lfound
502 TYPE (t_comin_var_descriptor) :: var_descriptor_domain
503 TYPE(t_comin_descrdata_global), POINTER :: comin_global
504 TYPE(c_ptr) :: it, cptr
505 TYPE(t_comin_request_item), POINTER :: item
506
507 ! check if called in primary constructor
508 IF (state%l_primary_done) THEN
510 END IF
511
512 IF (var_descriptor%id == -1) THEN
513 comin_global => comin_descrdata_get_global()
514 IF (.NOT. ASSOCIATED(comin_global)) CALL comin_plugin_finish("variable ", "global data missing")
515
516 domain_id_start = 1
517 domain_id_end = comin_global%n_dom
518 ELSE
519 domain_id_start = var_descriptor%id
520 domain_id_end = var_descriptor%id
521 END IF
522
523 ! loop over request list
524 lfound = .false.
525 DO domain_id = domain_id_start, domain_id_end
526 var_descriptor_domain = var_descriptor
527 var_descriptor_domain%id = domain_id
528
529 CALL comin_ftnlist_iterator_begin(state%comin_var_request_list, it)
530 DO WHILE (.NOT. comin_ftnlist_is_end(state%comin_var_request_list,it))
531 CALL comin_ftnlist_iterator_value(it, cptr)
532 CALL c_f_pointer(cptr, item)
533
534 IF (comin_var_descr_match(item%descriptor, var_descriptor_domain)) THEN
535 lfound = .true.
536 IF ( all(item%metadata%query(trim(key)) /= &
537 & (/comin_metadata_typeid_undefined, comin_metadata_typeid_integer/) ) ) THEN
539 ENDIF
540 CALL item%metadata%set(key, val)
541 END IF
543 END DO
544 END DO
546 IF (.NOT. lfound) THEN
548 ENDIF
549 END SUBROUTINE comin_request_set_var_metadata_integer
550
552 ! for a requested variable. Must be called inside the primary
553 ! constructor and the variable must have been previously requested,
554 ! otherwise this subroutine aborts with an error status flag. If
555 ! the metadata key does not exist, then this subroutine aborts with
556 ! an error status flag.
557 !
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
562 ! local
563 INTEGER :: domain_id, domain_id_start, domain_id_end
564 LOGICAL :: lfound
565 TYPE (t_comin_var_descriptor) :: var_descriptor_domain
566 TYPE(t_comin_descrdata_global), POINTER :: comin_global
567 TYPE(c_ptr) :: it, cptr
568 TYPE(t_comin_request_item), POINTER :: item
569
570 ! check if called in primary constructor
571 IF (state%l_primary_done) THEN
573 END IF
574
575 IF (var_descriptor%id == -1) THEN
576 comin_global => comin_descrdata_get_global()
577 IF (.NOT. ASSOCIATED(comin_global)) CALL comin_plugin_finish("variable ", "global data missing")
578
579 domain_id_start = 1
580 domain_id_end = comin_global%n_dom
581 ELSE
582 domain_id_start = var_descriptor%id
583 domain_id_end = var_descriptor%id
584 END IF
585
586 ! loop over request list
587 lfound = .false.
588 DO domain_id = domain_id_start, domain_id_end
589 var_descriptor_domain = var_descriptor
590 var_descriptor_domain%id = domain_id
591
592 CALL comin_ftnlist_iterator_begin(state%comin_var_request_list, it)
593 DO WHILE (.NOT. comin_ftnlist_is_end(state%comin_var_request_list,it))
594 CALL comin_ftnlist_iterator_value(it, cptr)
595 CALL c_f_pointer(cptr, item)
596
597 IF (comin_var_descr_match(item%descriptor, var_descriptor_domain)) THEN
598 lfound = .true.
599
600 IF ((key == "tracer") .AND. val .AND. (var_descriptor%id /= -1)) THEN
602 END IF
603 IF ( all(item%metadata%query(trim(key)) /= &
604 & (/comin_metadata_typeid_undefined, comin_metadata_typeid_logical/) ) ) THEN
606 ENDIF
607 CALL item%metadata%set(key, val)
608 END IF
610 END DO
611 END DO
613 IF (.NOT. lfound) THEN
615 ENDIF
616 END SUBROUTINE comin_request_set_var_metadata_logical
617
619 ! for a requested variable. Must be called inside the primary
620 ! constructor and the variable must have been previously requested,
621 ! otherwise this subroutine aborts with an error status flag. If
622 ! the metadata key does not exist, then this subroutine aborts with
623 ! an error status flag.
624 !
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
629 ! local
630 INTEGER :: domain_id, domain_id_start, domain_id_end
631 LOGICAL :: lfound
632 TYPE (t_comin_var_descriptor) :: var_descriptor_domain
633 TYPE(t_comin_descrdata_global), POINTER :: comin_global
634 TYPE(c_ptr) :: it, cptr
635 TYPE(t_comin_request_item), POINTER :: item
636
637 ! check if called in primary constructor
638 IF (state%l_primary_done) THEN
640 END IF
641
642 IF (var_descriptor%id == -1) THEN
643 comin_global => comin_descrdata_get_global()
644 IF (.NOT. ASSOCIATED(comin_global)) CALL comin_plugin_finish("variable ", "global data missing")
645
646 domain_id_start = 1
647 domain_id_end = comin_global%n_dom
648 ELSE
649 domain_id_start = var_descriptor%id
650 domain_id_end = var_descriptor%id
651 END IF
652
653 ! loop over request list
654 lfound = .false.
655 DO domain_id = domain_id_start, domain_id_end
656 var_descriptor_domain = var_descriptor
657 var_descriptor_domain%id = domain_id
658
659 CALL comin_ftnlist_iterator_begin(state%comin_var_request_list, it)
660 DO WHILE (.NOT. comin_ftnlist_is_end(state%comin_var_request_list,it))
661 CALL comin_ftnlist_iterator_value(it, cptr)
662 CALL c_f_pointer(cptr, item)
663
664 IF (comin_var_descr_match(item%descriptor, var_descriptor_domain)) THEN
665 lfound = .true.
666 IF ( all(item%metadata%query(trim(key)) /= &
667 & (/comin_metadata_typeid_undefined, comin_metadata_typeid_real/) ) ) THEN
669 ENDIF
670 CALL item%metadata%set(key, val)
671 END IF
673 END DO
674 END DO
676 IF (.NOT. lfound) THEN
678 ENDIF
679 END SUBROUTINE comin_request_set_var_metadata_real
680
682 ! for a requested variable. Must be called inside the primary
683 ! constructor and the variable must have been previously requested,
684 ! otherwise this subroutine aborts with an error status flag. If
685 ! the metadata key does not exist, then this subroutine aborts with
686 ! an error status flag.
687 !
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
692 ! local
693 INTEGER :: domain_id, domain_id_start, domain_id_end
694 LOGICAL :: lfound
695 TYPE (t_comin_var_descriptor) :: var_descriptor_domain
696 TYPE(t_comin_descrdata_global), POINTER :: comin_global
697 TYPE(c_ptr) :: it, cptr
698 TYPE(t_comin_request_item), POINTER :: item
699
700 ! check if called in primary constructor
701 IF (state%l_primary_done) THEN
703 END IF
704
705 IF (var_descriptor%id == -1) THEN
706 comin_global => comin_descrdata_get_global()
707 IF (.NOT. ASSOCIATED(comin_global)) CALL comin_plugin_finish("variable ", "global data missing")
708
709 domain_id_start = 1
710 domain_id_end = comin_global%n_dom
711 ELSE
712 domain_id_start = var_descriptor%id
713 domain_id_end = var_descriptor%id
714 END IF
715
716 ! loop over request list
717 lfound = .false.
718 DO domain_id = domain_id_start, domain_id_end
719 var_descriptor_domain = var_descriptor
720 var_descriptor_domain%id = domain_id
721
722 CALL comin_ftnlist_iterator_begin(state%comin_var_request_list, it)
723 DO WHILE (.NOT. comin_ftnlist_is_end(state%comin_var_request_list,it))
724 CALL comin_ftnlist_iterator_value(it, cptr)
725 CALL c_f_pointer(cptr, item)
726
727 IF (comin_var_descr_match(item%descriptor, var_descriptor_domain)) THEN
728 lfound = .true.
729 IF ( all(item%metadata%query(trim(key)) /= &
730 & (/comin_metadata_typeid_undefined, comin_metadata_typeid_character/) ) ) THEN
732 ENDIF
733 CALL item%metadata%set(key, val)
734 END IF
736 END DO
737 END DO
739 IF (.NOT. lfound) THEN
741 ENDIF
742 END SUBROUTINE comin_request_set_var_metadata_character
743
747 INTEGER FUNCTION comin_metadata_get_typeid(var_descriptor, key) RESULT(typeid)
748 TYPE(t_comin_var_descriptor), INTENT(IN) :: var_descriptor
749 CHARACTER(LEN=*), INTENT(IN) :: key
750 ! local
751 TYPE(t_comin_var_item), POINTER :: var_item
752
753 typeid = 0
754 ! check if called after primary constructor
755 IF (.NOT. state%l_primary_done) THEN
757 END IF
758 ! Find the variable in list of all ICON variables and set the pointer
759 var_item => comin_var_get_from_exposed(var_descriptor)
760 IF (.NOT. ASSOCIATED(var_item)) THEN
762 END IF
763 typeid = var_item%metadata%query(key)
764 END FUNCTION comin_metadata_get_typeid
765
766 INTEGER(KIND=c_int) FUNCTION comin_metadata_get_typeid_c(var_descriptor, key) &
767 & result(typeid) &
768 & BIND(C, name="comin_metadata_get_typeid")
769 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: var_descriptor
770 TYPE(c_ptr), VALUE, INTENT(IN) :: key
771 ! local
772 TYPE(t_comin_var_descriptor) :: var_descriptor_fortran
773
774 var_descriptor_fortran = t_comin_var_descriptor(var_descriptor)
775
776 typeid = int(comin_metadata_get_typeid(var_descriptor_fortran, &
777 & convert_c_string(key)), c_int)
778 END FUNCTION comin_metadata_get_typeid_c
779
782 SUBROUTINE comin_metadata_get_iterator(var_descriptor, iterator)
783 TYPE(t_comin_var_descriptor), INTENT(IN) :: var_descriptor
784 TYPE(t_comin_var_metadata_iterator), INTENT(OUT) :: iterator
785 ! local
786 TYPE(t_comin_var_item), POINTER :: var_item
787
788 ! check if called after primary constructor
789 IF (.NOT. state%l_primary_done) THEN
791 END IF
792 ! Find the variable in list of all ICON variables and set the pointer
793 var_item => comin_var_get_from_exposed(var_descriptor)
794 IF (.NOT. ASSOCIATED(var_item)) THEN
796 END IF
797 CALL var_item%metadata%get_iterator(iterator)
798 END SUBROUTINE comin_metadata_get_iterator
799
802 FUNCTION comin_metadata_get_iterator_begin_c(var_descriptor) &
803 & result(iterator) &
804 & BIND(C, name="comin_metadata_get_iterator_begin")
805 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: var_descriptor
806 TYPE(c_ptr) :: iterator
807 ! local
808 TYPE(t_comin_var_descriptor) :: var_descriptor_fortran
809 TYPE(t_comin_var_item), POINTER :: var_item
810
811 ! Create fortran var descriptor and get var_item
812 var_descriptor_fortran = t_comin_var_descriptor(var_descriptor)
813 var_item => comin_var_get_from_exposed(var_descriptor_fortran)
814 IF (.NOT. ASSOCIATED(var_item)) THEN
816 END IF
817
818 CALL comin_keyval_iterator_begin_c(var_item%metadata%comin_metadata_c, iterator)
819 END FUNCTION comin_metadata_get_iterator_begin_c
820
823 FUNCTION comin_metadata_get_iterator_end_c(var_descriptor) &
824 & result(iterator) &
825 & BIND(C, name="comin_metadata_get_iterator_end")
826 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: var_descriptor
827 TYPE(c_ptr) :: iterator
828 ! local
829 TYPE(t_comin_var_descriptor) :: var_descriptor_fortran
830 TYPE(t_comin_var_item), POINTER :: var_item
831
832 ! Create fortran var descriptor and get var_item
833 var_descriptor_fortran = t_comin_var_descriptor(var_descriptor)
834 var_item => comin_var_get_from_exposed(var_descriptor_fortran)
835 IF (.NOT. ASSOCIATED(var_item)) THEN
837 END IF
838
839 CALL comin_keyval_iterator_end_c(var_item%metadata%comin_metadata_c, iterator)
840 END FUNCTION comin_metadata_get_iterator_end_c
841
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
845 TYPE(c_ptr) :: key
847 END FUNCTION comin_metadata_iterator_get_key_c
848
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
854 equal = comin_keyval_iterator_compare_c(it1, it2)
855 END FUNCTION comin_metadata_iterator_compare_c
856
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
862
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
868
869END MODULE comin_metadata
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
Read-only access to additional information about a given variable.
Sets metadata for an exposed variable. Note: The host model uses the alias comin_metadata_set.
Sets metadata for a requested ComIn variable. Note:Plugins use the alias comin_metadata_set.
subroutine, public comin_error_set(errcode)
subroutine, public comin_metadata_set_character_c(var_descriptor, key, val)
subroutine, public comin_metadata_set_logical_c(var_descriptor, key, val)
subroutine, public comin_metadata_set_real_c(var_descriptor, key, val)
subroutine, public comin_metadata_get_character_c(var_descriptor, key, val, len)
request the metadata to a variable, C interface
subroutine, public comin_metadata_set_integer_c(var_descriptor, key, val)
subroutine, public comin_metadata_get_integer_c(var_descriptor, key, val)
request the metadata to a variable, C interface
subroutine, public comin_metadata_get_logical_c(var_descriptor, key, val)
request the metadata to a variable, C interface
subroutine, public comin_metadata_get_real_c(var_descriptor, key, val)
request the metadata to a variable, C interface
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.
Variable descriptor. identifies (uniquely) a variable. Do not confuse with meta-data.