ComIn 0.5.1
ICON Community Interface
Loading...
Searching...
No Matches
comin_metadata.F90
Go to the documentation of this file.
1!> @file comin_metadata.F90
2!! @brief Variable metadata definition.
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_char, c_loc, c_associated
15 USE comin_setup_constants, ONLY: wp, &
33
34 IMPLICIT NONE
35
36 PRIVATE
37
38 PUBLIC :: comin_metadata_set
40 PUBLIC :: comin_metadata_get
41 PUBLIC :: comin_metadata_get_or
46
47#include "comin_global.inc"
48
49 !> Sets metadata for a requested ComIn variable.
50 !> **Note:Plugins use the alias `comin_metadata_set`.**
51 !! @ingroup fortran_interface
53 MODULE PROCEDURE comin_request_set_var_metadata_logical
54 MODULE PROCEDURE comin_request_set_var_metadata_integer
55 MODULE PROCEDURE comin_request_set_var_metadata_real
56 MODULE PROCEDURE comin_request_set_var_metadata_character
57 END INTERFACE comin_metadata_set
58
59 !> Sets metadata for an exposed variable.
60 !> **Note: The host model uses the alias `comin_metadata_set`.**
62 MODULE PROCEDURE comin_metadata_host_set_logical
63 MODULE PROCEDURE comin_metadata_host_set_integer
64 MODULE PROCEDURE comin_metadata_host_set_real
65 MODULE PROCEDURE comin_metadata_host_set_character
66 END INTERFACE comin_metadata_set_host
67
68 !> Read-only access to additional information about a given variable.
69 !! @ingroup fortran_interface
71 MODULE PROCEDURE comin_metadata_get_logical
72 MODULE PROCEDURE comin_metadata_get_integer
73 MODULE PROCEDURE comin_metadata_get_real
74 MODULE PROCEDURE comin_metadata_get_character
75 END INTERFACE comin_metadata_get
76
78 MODULE PROCEDURE comin_metadata_get_or_integer
79 MODULE PROCEDURE comin_metadata_get_or_real
80 MODULE PROCEDURE comin_metadata_get_or_character
81 MODULE PROCEDURE comin_metadata_get_or_logical
82 END INTERFACE comin_metadata_get_or
83
84 INTERFACE
85 SUBROUTINE comin_metadata_host_set_int_c(descriptor, key, val) &
86 & BIND(C, name="comin_metadata_host_set_int")
87 IMPORT t_comin_var_descriptor_c, c_ptr, c_int
88 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: descriptor !< variable descriptor
89 TYPE(C_PTR), VALUE, INTENT(IN) :: key !< metadata key (name)
90 INTEGER(C_INT), VALUE, INTENT(IN) :: val !< metadata value
91 END SUBROUTINE comin_metadata_host_set_int_c
92
93 SUBROUTINE comin_metadata_host_set_bool_c(descriptor, key, val) &
94 & BIND(C, name="comin_metadata_host_set_bool")
95 IMPORT t_comin_var_descriptor_c, c_ptr, c_bool
96 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: descriptor !< variable descriptor
97 TYPE(C_PTR), VALUE, INTENT(IN) :: key !< metadata key (name)
98 LOGICAL(C_BOOL), VALUE, INTENT(IN) :: val !< metadata value
99 END SUBROUTINE comin_metadata_host_set_bool_c
100
101 SUBROUTINE comin_metadata_host_set_double_c(descriptor, key, val) &
102 & BIND(C, name="comin_metadata_host_set_double")
103 IMPORT t_comin_var_descriptor_c, c_ptr, c_double
104 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: descriptor !< variable descriptor
105 TYPE(C_PTR), VALUE, INTENT(IN) :: key !< metadata key (name)
106 REAL(C_DOUBLE), VALUE, INTENT(IN) :: val !< metadata value
107 END SUBROUTINE comin_metadata_host_set_double_c
108
109 SUBROUTINE comin_metadata_host_set_string_c(descriptor, key, val) &
110 & BIND(C, name="comin_metadata_host_set_string")
111 IMPORT t_comin_var_descriptor_c, c_ptr
112 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: descriptor !< variable descriptor
113 TYPE(C_PTR), VALUE, INTENT(IN) :: key !< metadata key (name)
114 TYPE(C_PTR), VALUE, INTENT(IN) :: val !< metadata value
115 END SUBROUTINE comin_metadata_host_set_string_c
116
117 FUNCTION comin_metadata_get_int_c(descriptor, key) RESULT(val) &
118 BIND(C, name="comin_metadata_get_int")
119 IMPORT t_comin_var_descriptor_c, c_ptr, c_int
120 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: descriptor !< variable descriptor
121 TYPE(C_PTR), VALUE, INTENT(IN) :: key !< metadata key (name)
122 INTEGER(C_INT) :: val !< metadata value
123 END FUNCTION comin_metadata_get_int_c
124
125 FUNCTION comin_metadata_get_bool_c(descriptor, key) RESULT(val) &
126 BIND(C, name="comin_metadata_get_bool")
127 IMPORT t_comin_var_descriptor_c, c_ptr, c_int, c_bool
128 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: descriptor !< variable descriptor
129 TYPE(C_PTR), VALUE, INTENT(IN) :: key !< metadata key (name)
130 LOGICAL(C_BOOL) :: val !< metadata value
131 END FUNCTION comin_metadata_get_bool_c
132
133 FUNCTION comin_metadata_get_double_c(descriptor, key) RESULT(val) &
134 BIND(C, name="comin_metadata_get_double")
135 IMPORT t_comin_var_descriptor_c, c_ptr, c_int, c_double
136 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: descriptor !< variable descriptor
137 TYPE(C_PTR), VALUE, INTENT(IN) :: key !< metadata key (name)
138 REAL(C_DOUBLE) :: val !< metadata value
139 END FUNCTION comin_metadata_get_double_c
140
141 FUNCTION comin_metadata_get_string_c(descriptor, key) RESULT(val) &
142 BIND(C, name="comin_metadata_get_string")
143 IMPORT t_comin_var_descriptor_c, c_ptr, c_int
144 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: descriptor !< variable descriptor
145 TYPE(C_PTR), VALUE, INTENT(IN) :: key !< metadata key (name)
146 TYPE(C_PTR) :: val !< metadata value
147 END FUNCTION comin_metadata_get_string_c
148
149 FUNCTION comin_metadata_get_typeid_c(descriptor, key) RESULT(typeid) &
150 BIND(C, name="comin_metadata_get_typeid")
151 IMPORT t_comin_var_descriptor_c, c_ptr, c_int
152 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: descriptor !< variable descriptor
153 TYPE(C_PTR), VALUE, INTENT(IN) :: key !< metadata key (name)
154 INTEGER(C_INT) :: typeid
155 END FUNCTION comin_metadata_get_typeid_c
156
157 FUNCTION comin_metadata_get_iterator_begin(descriptor) RESULT(begin) &
158 & BIND(C)
159 IMPORT t_comin_var_descriptor_c, c_ptr
160 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: descriptor !< variable descriptor
161 TYPE(C_PTR) :: begin
163
164 FUNCTION comin_metadata_get_iterator_end(descriptor) RESULT(end_) &
165 & BIND(C)
166 IMPORT t_comin_var_descriptor_c, c_ptr
167 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: descriptor !< variable descriptor
168 TYPE(C_PTR) :: end_
170 END INTERFACE
171
172CONTAINS
173
174 !> Set metadata for item in variable list.
175 SUBROUTINE comin_metadata_host_set_integer(descriptor, key, val)
176 TYPE(t_comin_var_descriptor), INTENT(IN) :: descriptor !< variable descriptor
177 CHARACTER(LEN=*), INTENT(IN) :: key !< metadata key (name)
178 INTEGER, INTENT(IN) :: val !< metadata value
179 !
180 TYPE(t_comin_var_descriptor_c) :: descriptor_c !< variable descriptor
181 CHARACTER(len=1, kind=c_char), ALLOCATABLE, TARGET :: key_c(:)
182
183 descriptor_c%id = descriptor%id
184 CALL convert_f_string(descriptor%name, descriptor_c%name)
185 ALLOCATE(key_c(len_trim(key)+1))
186 CALL convert_f_string(key, key_c)
187 CALL comin_metadata_host_set_int_c(descriptor_c, c_loc(key_c), val)
188 END SUBROUTINE comin_metadata_host_set_integer
189
190 !> Set metadata for item in variable list.
191 SUBROUTINE comin_metadata_host_set_logical(descriptor, key, val)
192 TYPE(t_comin_var_descriptor), INTENT(IN) :: descriptor !< variable descriptor
193 CHARACTER(LEN=*), INTENT(IN) :: key !< metadata key (name)
194 LOGICAL, INTENT(IN) :: val !< metadata value
195 !
196 TYPE(t_comin_var_descriptor_c) :: descriptor_c !< variable descriptor
197 CHARACTER(len=1, kind=c_char), ALLOCATABLE, TARGET :: key_c(:)
198
199 descriptor_c%id = descriptor%id
200 CALL convert_f_string(descriptor%name, descriptor_c%name)
201 ALLOCATE(key_c(len_trim(key)+1))
202 CALL convert_f_string(key, key_c)
203 CALL comin_metadata_host_set_bool_c(descriptor_c, c_loc(key_c), LOGICAL(val, C_BOOL))
204 END SUBROUTINE comin_metadata_host_set_logical
205
206 !> Set metadata for item in variable list.
207 SUBROUTINE comin_metadata_host_set_real(descriptor, key, val)
208 TYPE(t_comin_var_descriptor), INTENT(IN) :: descriptor !< variable descriptor
209 CHARACTER(LEN=*), INTENT(IN) :: key !< metadata key (name)
210 REAL(wp), INTENT(IN) :: val !< metadata value
211 !
212 TYPE(t_comin_var_descriptor_c) :: descriptor_c !< variable descriptor
213 CHARACTER(len=1, kind=c_char), ALLOCATABLE, TARGET :: key_c(:)
214
215 descriptor_c%id = descriptor%id
216 CALL convert_f_string(descriptor%name, descriptor_c%name)
217 ALLOCATE(key_c(len_trim(key)+1))
218 CALL convert_f_string(key, key_c)
219 CALL comin_metadata_host_set_double_c(descriptor_c, c_loc(key_c), val)
220 END SUBROUTINE comin_metadata_host_set_real
221
222 !> Set metadata for item in variable list.
223 SUBROUTINE comin_metadata_host_set_character(descriptor, key, val)
224 TYPE(t_comin_var_descriptor), INTENT(IN) :: descriptor !< variable descriptor
225 CHARACTER(LEN=*), INTENT(IN) :: key !< metadata key (name)
226 CHARACTER(LEN=*), INTENT(IN) :: val !< metadata value
227 !
228 TYPE(t_comin_var_descriptor_c) :: descriptor_c !< variable descriptor
229 CHARACTER(len=1, kind=c_char), ALLOCATABLE, TARGET :: key_c(:)
230 CHARACTER(len=1, kind=c_char), ALLOCATABLE, TARGET :: val_c(:)
231
232 descriptor_c%id = descriptor%id
233 CALL convert_f_string(descriptor%name, descriptor_c%name)
234 ALLOCATE(key_c(len_trim(key)+1))
235 CALL convert_f_string(key, key_c)
236 ALLOCATE(val_c(len_trim(val)+1))
237 CALL convert_f_string(val, val_c)
238 CALL comin_metadata_host_set_string_c(descriptor_c, c_loc(key_c), c_loc(val_c))
239 END SUBROUTINE comin_metadata_host_set_character
240
241 !> request the metadata to a variable
242 SUBROUTINE comin_metadata_get_integer(var_descriptor, key, val)
243 TYPE(t_comin_var_descriptor), INTENT(IN) :: var_descriptor !< variable descriptor
244 CHARACTER(LEN=*), INTENT(IN) :: key !< metadata key (name)
245 INTEGER, INTENT(OUT) :: val !< metadata value
246 ! local
247 TYPE(t_comin_var_descriptor_c) :: descriptor_c !< variable descriptor
248 CHARACTER(len=1, kind=c_char), ALLOCATABLE, TARGET :: key_c(:)
249
250 descriptor_c%id = var_descriptor%id
251 CALL convert_f_string(var_descriptor%name, descriptor_c%name)
252 ALLOCATE(key_c(len_trim(key)+1))
253 CALL convert_f_string(key, key_c)
254
255 val = comin_metadata_get_int_c(descriptor_c, c_loc(key_c))
256 END SUBROUTINE comin_metadata_get_integer
257
258 !> request the metadata to a variable
259 SUBROUTINE comin_metadata_get_logical(var_descriptor, key, val)
260 TYPE(t_comin_var_descriptor), INTENT(IN) :: var_descriptor !< variable descriptor
261 CHARACTER(LEN=*), INTENT(IN) :: key !< metadata key (name)
262 LOGICAL, INTENT(OUT) :: val !< metadata value
263 ! local
264 TYPE(t_comin_var_descriptor_c) :: descriptor_c !< variable descriptor
265 CHARACTER(len=1, kind=c_char), ALLOCATABLE, TARGET :: key_c(:)
266
267 descriptor_c%id = var_descriptor%id
268 CALL convert_f_string(var_descriptor%name, descriptor_c%name)
269 ALLOCATE(key_c(len_trim(key)+1))
270 CALL convert_f_string(key, key_c)
271
272 val = comin_metadata_get_bool_c(descriptor_c, c_loc(key_c))
273 END SUBROUTINE comin_metadata_get_logical
274
275 !> request the metadata to a variable
276 SUBROUTINE comin_metadata_get_real(var_descriptor, key, val)
277 TYPE(t_comin_var_descriptor), INTENT(IN) :: var_descriptor !< variable descriptor
278 CHARACTER(LEN=*), INTENT(IN) :: key !< metadata key (name)
279 REAL(wp), INTENT(OUT) :: val !< metadata value
280 ! local
281 TYPE(t_comin_var_descriptor_c) :: descriptor_c !< variable descriptor
282 CHARACTER(len=1, kind=c_char), ALLOCATABLE, TARGET :: key_c(:)
283
284 descriptor_c%id = var_descriptor%id
285 CALL convert_f_string(var_descriptor%name, descriptor_c%name)
286 ALLOCATE(key_c(len_trim(key)+1))
287 CALL convert_f_string(key, key_c)
288
289 val = comin_metadata_get_double_c(descriptor_c, c_loc(key_c))
290 END SUBROUTINE comin_metadata_get_real
291
292 !> request the metadata to a variable
293 SUBROUTINE comin_metadata_get_character(var_descriptor, key, val)
294 TYPE(t_comin_var_descriptor), INTENT(IN) :: var_descriptor !< variable descriptor
295 CHARACTER(LEN=*), INTENT(IN) :: key !< metadata key (name)
296 CHARACTER(LEN=:), ALLOCATABLE,INTENT(OUT) :: val !< metadata value
297 ! local
298 TYPE(t_comin_var_descriptor_c) :: descriptor_c !< variable descriptor
299 CHARACTER(len=1, kind=c_char), ALLOCATABLE, TARGET :: key_c(:)
300 TYPE(c_ptr) :: val_c
301
302 descriptor_c%id = var_descriptor%id
303 CALL convert_f_string(var_descriptor%name, descriptor_c%name)
304 ALLOCATE(key_c(len_trim(key)+1))
305 CALL convert_f_string(key, key_c)
306
307 val_c = comin_metadata_get_string_c(descriptor_c, c_loc(key_c))
308 val = convert_c_string(val_c)
309 END SUBROUTINE comin_metadata_get_character
310
311 SUBROUTINE comin_metadata_get_or_integer(metadata, key, val, defaultval)
312 TYPE(t_comin_var_metadata), INTENT(inout) :: metadata
313 CHARACTER(LEN=*), INTENT(in) :: key
314 INTEGER, INTENT(out) :: val
315 INTEGER, INTENT(in) :: defaultval
316
317 SELECT CASE ( metadata%query(key) )
319 CALL metadata%get(key, val)
321 val = defaultval
322 CASE DEFAULT
324 END SELECT
325 END SUBROUTINE comin_metadata_get_or_integer
326
327 SUBROUTINE comin_metadata_get_or_real(metadata, key, val, defaultval)
328 TYPE(t_comin_var_metadata), INTENT(inout) :: metadata
329 CHARACTER(LEN=*), INTENT(in) :: key
330 REAL(wp), INTENT(out) :: val
331 REAL(wp), INTENT(in) :: defaultval
332
333 SELECT CASE ( metadata%query(key) )
335 CALL metadata%get(key, val)
337 val = defaultval
338 CASE DEFAULT
340 END SELECT
341 END SUBROUTINE comin_metadata_get_or_real
342
343 SUBROUTINE comin_metadata_get_or_character(metadata, key, val, defaultval)
344 TYPE(t_comin_var_metadata), INTENT(inout) :: metadata
345 CHARACTER(LEN=*), INTENT(in) :: key
346 CHARACTER(LEN=:), ALLOCATABLE, INTENT(out) :: val
347 CHARACTER(LEN=*), INTENT(in) :: defaultval
348
349 SELECT CASE ( metadata%query(key) )
351 CALL metadata%get(key, val)
353 val = defaultval
354 CASE DEFAULT
356 END SELECT
357 END SUBROUTINE comin_metadata_get_or_character
358
359 SUBROUTINE comin_metadata_get_or_logical(metadata, key, val, defaultval)
360 TYPE(t_comin_var_metadata), INTENT(inout) :: metadata
361 CHARACTER(LEN=*), INTENT(in) :: key
362 LOGICAL, INTENT(out) :: val
363 LOGICAL, INTENT(in) :: defaultval
364
365 SELECT CASE ( metadata%query(key) )
367 CALL metadata%get(key, val)
369 val = defaultval
370 CASE DEFAULT
372 END SELECT
373 END SUBROUTINE comin_metadata_get_or_logical
374
375 SUBROUTINE comin_metadata_set_integer_c(var_descriptor, key, val) &
376 & BIND(C, name="comin_metadata_set_integer")
377 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: var_descriptor !< variable descriptor
378 TYPE(c_ptr), VALUE, INTENT(IN) :: key !< metadata key (name)
379 INTEGER(kind=c_int), VALUE, INTENT(IN) :: val !< metadata value
380 !
381 TYPE (t_comin_var_descriptor) :: var_descriptor_fortran
382
383 var_descriptor_fortran = t_comin_var_descriptor(var_descriptor)
384 CALL comin_request_set_var_metadata_integer(var_descriptor_fortran, &
385 & convert_c_string(key), val)
386 END SUBROUTINE comin_metadata_set_integer_c
387
388 SUBROUTINE comin_metadata_set_logical_c(var_descriptor, key, val) &
389 & BIND(C, name="comin_metadata_set_logical")
390 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: var_descriptor !< variable descriptor
391 TYPE(c_ptr), VALUE, INTENT(IN) :: key !< metadata key (name)
392 LOGICAL(C_BOOL), VALUE, INTENT(IN) :: val !< metadata value
393 !
394 TYPE (t_comin_var_descriptor) :: var_descriptor_fortran
395
396 var_descriptor_fortran = t_comin_var_descriptor(var_descriptor)
397 CALL comin_request_set_var_metadata_logical(var_descriptor_fortran, &
398 & convert_c_string(key), LOGICAL(val))
399 END SUBROUTINE comin_metadata_set_logical_c
400
401 SUBROUTINE comin_metadata_set_real_c(var_descriptor, key, val) &
402 & BIND(C, name="comin_metadata_set_real")
403 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: var_descriptor !< variable descriptor
404 TYPE(c_ptr), VALUE, INTENT(IN) :: key !< metadata key (name)
405 REAL(wp), VALUE, INTENT(IN) :: val !< metadata value
406 !
407 TYPE (t_comin_var_descriptor) :: var_descriptor_fortran
408
409 var_descriptor_fortran = t_comin_var_descriptor(var_descriptor)
410 CALL comin_request_set_var_metadata_real(var_descriptor_fortran, &
411 & convert_c_string(key), real(val, wp))
412 END SUBROUTINE comin_metadata_set_real_c
413
414 SUBROUTINE comin_metadata_set_character_c(var_descriptor, key, val) &
415 & BIND(C, name="comin_metadata_set_character")
416 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: var_descriptor !< variable descriptor
417 TYPE(c_ptr), VALUE, INTENT(IN) :: key !< metadata key (name)
418 TYPE(c_ptr), VALUE, INTENT(IN) :: val !< metadata value
419 !
420 TYPE (t_comin_var_descriptor) :: var_descriptor_fortran
421
422 var_descriptor_fortran = t_comin_var_descriptor(var_descriptor)
423 CALL comin_request_set_var_metadata_character(var_descriptor_fortran, &
425 END SUBROUTINE comin_metadata_set_character_c
426
427 !> Sets a specific metadata item (represented by a key-value pair)
428 ! for a requested variable. Must be called inside the primary
429 ! constructor and the variable must have been previously requested,
430 ! otherwise this subroutine aborts with an error status flag. If
431 ! the metadata key does not exist, then this subroutine aborts with
432 ! an error status flag.
433 !
434 SUBROUTINE comin_request_set_var_metadata_integer(var_descriptor, key, val)
435 TYPE (t_comin_var_descriptor), INTENT(IN) :: var_descriptor !< variable descriptor
436 CHARACTER(LEN=*), INTENT(IN) :: key !< metadata key (name)
437 INTEGER, INTENT(IN) :: val !< metadata value
438 ! local
439 INTEGER :: domain_id, domain_id_start, domain_id_end
440 LOGICAL :: lfound
441 TYPE(t_comin_var_descriptor_c) :: var_descriptor_domain
442 TYPE(c_ptr) :: req
443 TYPE(t_comin_var_metadata) :: metadata
444
445 ! check if called in primary constructor
448 END IF
449
450 IF (var_descriptor%id == -1) THEN
451 domain_id_start = 1
452 domain_id_end = state%comin_descrdata_global_data%n_dom
453 ELSE
454 domain_id_start = var_descriptor%id
455 domain_id_end = var_descriptor%id
456 END IF
457
458 var_descriptor_domain = t_comin_var_descriptor_c(var_descriptor)
459
460 ! loop over request list
461 lfound = .false.
462 DO domain_id = domain_id_start, domain_id_end
463 var_descriptor_domain%id = domain_id
464
465 req = comin_var_request_find_c(var_descriptor_domain)
466
467 IF (c_associated(req)) THEN
468 lfound = .true.
469 metadata = comin_var_request_get_metadata(req)
470
471 IF (all(metadata%query(trim(key)) /= &
474 ENDIF
475 CALL metadata%set(key, val)
476 END IF
477 END DO
478
479 IF (.NOT. lfound) THEN
481 ENDIF
482 END SUBROUTINE comin_request_set_var_metadata_integer
483
484 !> Sets a specific metadata item (represented by a key-value pair)
485 ! for a requested variable. Must be called inside the primary
486 ! constructor and the variable must have been previously requested,
487 ! otherwise this subroutine aborts with an error status flag. If
488 ! the metadata key does not exist, then this subroutine aborts with
489 ! an error status flag.
490 !
491 SUBROUTINE comin_request_set_var_metadata_logical(var_descriptor, key, val)
492 TYPE (t_comin_var_descriptor), INTENT(IN) :: var_descriptor !< variable descriptor
493 CHARACTER(LEN=*), INTENT(IN) :: key !< metadata key (name)
494 LOGICAL, INTENT(IN) :: val !< metadata value
495 ! local
496 INTEGER :: domain_id, domain_id_start, domain_id_end
497 LOGICAL :: lfound
498 TYPE(t_comin_var_descriptor_c) :: var_descriptor_domain
499 TYPE(c_ptr) :: req
500 TYPE(t_comin_var_metadata) :: metadata
501
502 ! check if called in primary constructor
505 END IF
506
507 IF (var_descriptor%id == -1) THEN
508 domain_id_start = 1
509 domain_id_end = state%comin_descrdata_global_data%n_dom
510 ELSE
511 IF ((key == "tracer") .AND. val) THEN
513 END IF
514
515 domain_id_start = var_descriptor%id
516 domain_id_end = var_descriptor%id
517 END IF
518
519 var_descriptor_domain = t_comin_var_descriptor_c(var_descriptor)
520
521 ! loop over request list
522 lfound = .false.
523 DO domain_id = domain_id_start, domain_id_end
524 var_descriptor_domain%id = domain_id
525
526 req = comin_var_request_find_c(var_descriptor_domain)
527
528 IF (c_associated(req)) THEN
529 lfound = .true.
530 metadata = comin_var_request_get_metadata(req)
531
532 IF (all(metadata%query(trim(key)) /= &
535 ENDIF
536 CALL metadata%set(key, val)
537 END IF
538 END DO
539
540 IF (.NOT. lfound) THEN
542 ENDIF
543 END SUBROUTINE comin_request_set_var_metadata_logical
544
545 !> Sets a specific metadata item (represented by a key-value pair)
546 ! for a requested variable. Must be called inside the primary
547 ! constructor and the variable must have been previously requested,
548 ! otherwise this subroutine aborts with an error status flag. If
549 ! the metadata key does not exist, then this subroutine aborts with
550 ! an error status flag.
551 !
552 SUBROUTINE comin_request_set_var_metadata_real(var_descriptor, key, val)
553 TYPE (t_comin_var_descriptor), INTENT(IN) :: var_descriptor !< variable descriptor
554 CHARACTER(LEN=*), INTENT(IN) :: key !< metadata key (name)
555 REAL(wp), INTENT(IN) :: val !< metadata value
556 ! local
557 INTEGER :: domain_id, domain_id_start, domain_id_end
558 LOGICAL :: lfound
559 TYPE(t_comin_var_descriptor_c) :: var_descriptor_domain
560 TYPE(c_ptr) :: req
561 TYPE(t_comin_var_metadata) :: metadata
562
563 ! check if called in primary constructor
566 END IF
567
568 IF (var_descriptor%id == -1) THEN
569 domain_id_start = 1
570 domain_id_end = state%comin_descrdata_global_data%n_dom
571 ELSE
572 domain_id_start = var_descriptor%id
573 domain_id_end = var_descriptor%id
574 END IF
575
576 var_descriptor_domain = t_comin_var_descriptor_c(var_descriptor)
577
578 ! loop over request list
579 lfound = .false.
580 DO domain_id = domain_id_start, domain_id_end
581 var_descriptor_domain%id = domain_id
582
583 req = comin_var_request_find_c(var_descriptor_domain)
584
585 IF (c_associated(req)) THEN
586 lfound = .true.
587 metadata = comin_var_request_get_metadata(req)
588
589 IF (all(metadata%query(trim(key)) /= &
592 ENDIF
593 CALL metadata%set(key, val)
594 END IF
595 END DO
596
597 IF (.NOT. lfound) THEN
599 ENDIF
600 END SUBROUTINE comin_request_set_var_metadata_real
601
602 !> Sets a specific metadata item (represented by a key-value pair)
603 ! for a requested variable. Must be called inside the primary
604 ! constructor and the variable must have been previously requested,
605 ! otherwise this subroutine aborts with an error status flag. If
606 ! the metadata key does not exist, then this subroutine aborts with
607 ! an error status flag.
608 !
609 SUBROUTINE comin_request_set_var_metadata_character(var_descriptor, key, val)
610 TYPE (t_comin_var_descriptor), INTENT(IN) :: var_descriptor !< variable descriptor
611 CHARACTER(LEN=*), INTENT(IN) :: key !< metadata key (name)
612 CHARACTER(LEN=*), INTENT(IN) :: val !< metadata value
613 ! local
614 INTEGER :: domain_id, domain_id_start, domain_id_end
615 LOGICAL :: lfound
616 TYPE(t_comin_var_descriptor_c) :: var_descriptor_domain
617 TYPE(c_ptr) :: req
618 TYPE(t_comin_var_metadata) :: metadata
619
620 ! check if called in primary constructor
623 END IF
624
625 IF (var_descriptor%id == -1) THEN
626 domain_id_start = 1
627 domain_id_end = state%comin_descrdata_global_data%n_dom
628 ELSE
629 domain_id_start = var_descriptor%id
630 domain_id_end = var_descriptor%id
631 END IF
632
633 var_descriptor_domain = t_comin_var_descriptor_c(var_descriptor)
634
635 ! loop over request list
636 lfound = .false.
637 DO domain_id = domain_id_start, domain_id_end
638 var_descriptor_domain%id = domain_id
639
640 req = comin_var_request_find_c(var_descriptor_domain)
641
642 IF (c_associated(req)) THEN
643 lfound = .true.
644 metadata = comin_var_request_get_metadata(req)
645
646 IF (all(metadata%query(trim(key)) /= &
649 ENDIF
650 CALL metadata%set(key, val)
651 END IF
652 END DO
653
654 IF (.NOT. lfound) THEN
656 ENDIF
657 END SUBROUTINE comin_request_set_var_metadata_character
658
659 !> Return a ID (integer) describing the metadata data type of a metadata.
660 !! @ingroup fortran_interface
661 INTEGER FUNCTION comin_metadata_get_typeid(var_descriptor, key) RESULT(typeid)
662 TYPE(t_comin_var_descriptor), INTENT(IN) :: var_descriptor !< variable descriptor
663 CHARACTER(LEN=*), INTENT(IN) :: key !< metadata key (name)
664 ! local
665 TYPE(t_comin_var_descriptor_c) :: descriptor_c !< variable descriptor
666 CHARACTER(len=1, kind=c_char), ALLOCATABLE, TARGET :: key_c(:)
667
668 descriptor_c%id = var_descriptor%id
669 CALL convert_f_string(var_descriptor%name, descriptor_c%name)
670 ALLOCATE(key_c(len_trim(key)+1))
671 CALL convert_f_string(key, key_c)
672
673 typeid = comin_metadata_get_typeid_c(descriptor_c, c_loc(key_c))
674 END FUNCTION comin_metadata_get_typeid
675
676 !> Return a metadata container iterator
677 !! @ingroup fortran_interface
678 SUBROUTINE comin_metadata_get_iterator(var_descriptor, iterator)
679 TYPE(t_comin_var_descriptor), INTENT(IN) :: var_descriptor
680 TYPE(t_comin_var_metadata_iterator), INTENT(OUT) :: iterator
681 ! local
682 TYPE(t_comin_var_descriptor_c) :: descriptor_c !< variable descriptor
683 descriptor_c%id = var_descriptor%id
684 CALL convert_f_string(var_descriptor%name, descriptor_c%name)
685
686 iterator%comin_metadata_iterator_current_c = comin_metadata_get_iterator_begin(descriptor_c)
687 iterator%comin_metadata_iterator_end_c = comin_metadata_get_iterator_end(descriptor_c)
688 END SUBROUTINE comin_metadata_get_iterator
689
690END MODULE comin_metadata
t_comin_metadata_iterator * comin_metadata_get_iterator_end(t_comin_var_descriptor var_descriptor)
t_comin_metadata_typeid comin_metadata_get_typeid(t_comin_var_descriptor var_descriptor, const char *key)
t_comin_metadata_iterator * comin_metadata_get_iterator_begin(t_comin_var_descriptor var_descriptor)
comin::keyval::Map * comin_var_request_get_metadata(t_comin_request_item *req)
Read-only access to additional information about a given variable.
Sets metadata for a requested ComIn variable. Note:Plugins use the alias comin_metadata_set.
integer, parameter wp
working precision
subroutine, public comin_metadata_get_iterator(var_descriptor, iterator)
Return a metadata container iterator.
Sets metadata for an exposed variable. Note: The host model uses the alias comin_metadata_set.
Return the request item for the given C descriptor.
subroutine, public convert_f_string(string, arr)
Convert Fortran string into C-style character array.
subroutine, public comin_metadata_set_real_c(var_descriptor, key, val)
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_integer_c(var_descriptor, key, val)
type(t_comin_state), pointer, public state