ICON Community Interface 0.4.0
Loading...
Searching...
No Matches
comin_variable.F90
Go to the documentation of this file.
1
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, c_bool
36 USE comin_setup_constants, ONLY: wp, ep_secondary_constructor, &
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
40 USE comin_state, ONLY: state
49
50 IMPLICIT NONE
51
52 PRIVATE
53
54 ! Public procedures, intention: called by host
58 ! Public procedures, intention: called by host and plugin
61 ! Public procedures, intention: called by plugin
62 PUBLIC :: comin_var_request_add
63 PUBLIC :: comin_var_get
65 ! Public procedures, intention: for internal use
66 PUBLIC :: comin_var_complete
70 ! PUBLIC procedures only exposed to host model
71 PUBLIC :: comin_var_set_cptr
72 PUBLIC :: comin_var_is_used
73
74#include "comin_global.inc"
75
76CONTAINS
77
81 FUNCTION comin_var_get_descr_list_head() RESULT(ptr_c) BIND(C)
82 TYPE(c_ptr) :: ptr_c
83 CALL comin_ftnlist_iterator_begin(state%comin_var_descr_list, ptr_c)
84 IF (comin_ftnlist_is_end(state%comin_var_descr_list, ptr_c)) THEN
85 ptr_c = c_null_ptr
86 END IF
88
93 FUNCTION comin_var_get_descr_list_next(current) RESULT(ptr_c) BIND(C)
94 TYPE(c_ptr), INTENT(IN), VALUE :: current
95 TYPE(c_ptr) :: ptr_c, tmp
96 tmp = current
98 IF (comin_ftnlist_is_end(state%comin_var_descr_list, tmp)) THEN
100 tmp = c_null_ptr
101 END IF
102 ptr_c = tmp
104
107 FUNCTION comin_request_get_list() RESULT(ptr) BIND(C, name="comin_request_get_list")
108 TYPE(c_ptr) :: ptr
109 ptr = state%comin_var_request_list
110 END FUNCTION comin_request_get_list
111
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
119 TYPE(t_comin_var_descriptor_c), INTENT(INOUT) :: var_desc_out
120 !
121 TYPE(t_comin_var_descriptor) :: var_desc_ftn
122
123 CALL comin_var_get_descr_list_var_desc(it, var_desc_ftn)
124 var_desc_out%id = var_desc_ftn%id
125 CALL convert_f_string(var_desc_ftn%name, var_desc_out%name)
126 END SUBROUTINE comin_var_get_descr_list_var_desc_c
127
131 SUBROUTINE comin_var_get_descr_list_var_desc(it, var_desc_out)
132 TYPE(c_ptr), INTENT(IN), VALUE :: it
133 TYPE(t_comin_var_descriptor), INTENT(INOUT) :: var_desc_out
134 !
135 TYPE(c_ptr) :: cptr
136 TYPE(t_comin_var_descriptor), POINTER :: item => null()
137
138 CALL comin_ftnlist_iterator_value(it, cptr)
139 CALL c_f_pointer(cptr, item)
140 IF (.NOT. ASSOCIATED(item)) THEN
142 END IF
143 var_desc_out = item
145
148 TYPE(c_ptr), INTENT(INOUT) :: it
151
152 ! destructor.
153 SUBROUTINE comin_request_item_finalize(this)
154 TYPE(t_comin_request_item), INTENT(INOUT) :: this
155 CALL this%metadata%delete()
156 END SUBROUTINE comin_request_item_finalize
157
160 SUBROUTINE comin_var_list_append(var_descr, cptr, device_ptr, &
161 & array_shape, type_id, &
162 & dim_semantics, &
163 & lcontainer, ncontained, &
164 & var_handle)
165 TYPE(t_comin_var_descriptor), INTENT(IN) :: var_descr
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
171 TYPE(t_comin_var_handle), INTENT(OUT) :: var_handle
172 !
173 TYPE(t_comin_var_item), POINTER :: var_item
174 TYPE(t_comin_var_descriptor), POINTER :: var_descr_item
175
176 ! first, add the descriptor to a separate list
177 ! (the one that is also exposed to the plugins):
178 ALLOCATE(var_descr_item)
179 var_descr_item = var_descr
180 CALL comin_ftnlist_push_back(state%comin_var_descr_list, c_loc(var_descr_item))
181
182 ! add an entry to the other (internal) list of variables
183 ! which contains a pointer to the above descriptor
184 ALLOCATE(var_item)
185 var_item%descriptor = var_descr
186 var_item%cptr = cptr
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
193
194 CALL var_item%metadata%create()
195 CALL comin_varmap_put(state%comin_var_list, var_descr%name, var_descr%id, c_loc(var_item))
196
197 var_handle = comin_var_ptr_init(var_item)
198
199 END SUBROUTINE comin_var_list_append
200
203 ! local
204 TYPE(c_ptr) :: it, cptr
205 TYPE(t_comin_var_descriptor), POINTER :: item
206
207 CALL comin_ftnlist_iterator_begin(state%comin_var_descr_list, it)
208 DO WHILE (.NOT. comin_ftnlist_is_end(state%comin_var_descr_list,it))
209 CALL comin_ftnlist_iterator_value(it, cptr)
210 CALL c_f_pointer(cptr, item)
211 DEALLOCATE(item)
213 END DO
215 CALL comin_ftnlist_delete(state%comin_var_descr_list)
216 END SUBROUTINE comin_var_descr_list_finalize
217
221 ! local
222 TYPE(c_ptr) :: it, cptr
223 TYPE(t_comin_var_item), POINTER :: item
224
225 CALL comin_varmap_iterator_begin(state%comin_var_list, it)
226 DO WHILE (.NOT. comin_varmap_iterator_is_end(state%comin_var_list, it))
227 CALL comin_varmap_iterator_value(it, cptr)
228 CALL c_f_pointer(cptr, item)
229 CALL item%metadata%delete()
230 DEALLOCATE(item)
232 END DO
234 CALL comin_varmap_delete(state%comin_var_list)
235 END SUBROUTINE comin_var_list_finalize
236
240 ! local
241 TYPE(c_ptr) :: it, cptr
242 TYPE(t_comin_request_item), POINTER :: item
243
244 CALL comin_ftnlist_iterator_begin(state%comin_var_request_list, it)
245 DO WHILE (.NOT. comin_ftnlist_is_end(state%comin_var_request_list,it))
246 CALL comin_ftnlist_iterator_value(it, cptr)
247 CALL c_f_pointer(cptr, item)
248 CALL comin_request_item_finalize(item)
250 END DO
252 CALL comin_ftnlist_delete(state%comin_var_request_list)
254
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)
260 TYPE(t_comin_var_descriptor_c), VALUE, INTENT(IN) :: var_descriptor
261 INTEGER(c_int), VALUE, INTENT(IN) :: flag
262 TYPE(c_ptr) :: var_pointer
263 TYPE(t_comin_var_item), POINTER :: var_item => null()
264
265 TYPE(t_comin_var_descriptor) :: var_descriptor_fortran
266
267 var_pointer = c_null_ptr
268
269 var_descriptor_fortran = t_comin_var_descriptor(var_descriptor)
270
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
274
275 FUNCTION comin_var_get_ptr(handle) &
276 & result(dataptr) &
277 & BIND(C, NAME="comin_var_get_ptr")
278 TYPE(c_ptr), INTENT(IN), VALUE :: handle
279 TYPE(c_ptr) :: dataptr
280 !
281 TYPE(t_comin_var_item), POINTER :: p => null()
282 CALL c_f_pointer(handle, p)
283 IF (.NOT. ASSOCIATED(p)) THEN
284 dataptr = c_null_ptr
285 ELSE
286 dataptr = p%cptr
287 END IF
288 END FUNCTION comin_var_get_ptr
289
290 FUNCTION comin_var_get_ptr_double(handle) &
291 & result(dataptr) &
292 & BIND(C, NAME="comin_var_get_ptr_double")
293 TYPE(c_ptr), INTENT(IN), VALUE :: handle
294 TYPE(c_ptr) :: dataptr
295 !
296 TYPE(t_comin_var_item), POINTER :: p => null()
297 dataptr = c_null_ptr
298 CALL c_f_pointer(handle, p)
299 IF (ASSOCIATED(p)) THEN
300 IF(p%type_id /= comin_var_datatype_double) THEN
302 ENDIF
303 dataptr = p%cptr
304 END IF
305 END FUNCTION comin_var_get_ptr_double
306
307 FUNCTION comin_var_get_ptr_float(handle) &
308 & result(dataptr) &
309 & BIND(C, NAME="comin_var_get_ptr_float")
310 TYPE(c_ptr), INTENT(IN), VALUE :: handle
311 TYPE(c_ptr) :: dataptr
312 !
313 TYPE(t_comin_var_item), POINTER :: p => null()
314 dataptr = c_null_ptr
315 CALL c_f_pointer(handle, p)
316 IF (ASSOCIATED(p)) THEN
317 IF(p%type_id /= comin_var_datatype_float) THEN
319 ENDIF
320 dataptr = p%cptr
321 END IF
322 END FUNCTION comin_var_get_ptr_float
323
324 FUNCTION comin_var_get_ptr_int(handle) &
325 & result(dataptr) &
326 & BIND(C, NAME="comin_var_get_ptr_int")
327 TYPE(c_ptr), INTENT(IN), VALUE :: handle
328 TYPE(c_ptr) :: dataptr
329 !
330 TYPE(t_comin_var_item), POINTER :: p => null()
331 dataptr = c_null_ptr
332 CALL c_f_pointer(handle, p)
333 IF (ASSOCIATED(p)) THEN
334 IF(p%type_id /= comin_var_datatype_int) THEN
336 ENDIF
337 dataptr = p%cptr
338 END IF
339 END FUNCTION comin_var_get_ptr_int
340
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
346 !
347 TYPE(t_comin_var_item), POINTER :: p => null()
348 CALL c_f_pointer(handle, p)
349 device_ptr = p%device_ptr
350 END FUNCTION comin_var_get_device_ptr
351
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
357 !
358 TYPE(t_comin_var_item), POINTER :: p => null()
359
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
365 ENDIF
366 device_ptr = p%device_ptr
367 ENDIF
368 END FUNCTION comin_var_get_device_ptr_double
369
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
375 !
376 TYPE(t_comin_var_item), POINTER :: p => null()
377
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
383 ENDIF
384 device_ptr = p%device_ptr
385 ENDIF
386 END FUNCTION comin_var_get_device_ptr_float
387
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
393 !
394 TYPE(t_comin_var_item), POINTER :: p => null()
395
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
401 ENDIF
402 device_ptr = p%device_ptr
403 ENDIF
404 END FUNCTION comin_var_get_device_ptr_int
405
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)
410 !
411 TYPE(t_comin_var_item), POINTER :: p => null()
412 CALL c_f_pointer(handle, p)
413 IF (.NOT. ASSOCIATED(p)) THEN
415 ELSE
416 data_shape = p%array_shape
417 END IF
418 END SUBROUTINE comin_var_get_shape
419
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)
424 !
425 TYPE(t_comin_var_item), POINTER :: p => null()
426 CALL c_f_pointer(handle, p)
427 IF (.NOT. ASSOCIATED(p)) THEN
429 ELSE
430 dim_semantics = p%dim_semantics
431 END IF
432 END SUBROUTINE comin_var_get_dim_semantics
433
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
438 !
439 TYPE(t_comin_var_item), POINTER :: p => null()
440 CALL c_f_pointer(handle, p)
441 IF (.NOT. ASSOCIATED(p)) THEN
443 ELSE
444 ! Convert to C dimension index
445 ncontained = p%ncontained - 1
446 END IF
447 END SUBROUTINE comin_var_get_ncontained
448
449 SUBROUTINE comin_var_get_descriptor(handle, descr) &
450 & BIND(C, NAME="comin_var_get_descriptor")
451 TYPE(c_ptr), INTENT(IN), VALUE :: handle
452 TYPE(t_comin_var_descriptor_c), INTENT(INOUT) :: descr
453
454 TYPE(t_comin_var_item), POINTER :: p => null()
455 CALL c_f_pointer(handle, p)
456 IF (.NOT. ASSOCIATED(p)) THEN
458 ELSE
459 CALL convert_f_string(p%descriptor%name, descr%name)
460 descr%id = p%descriptor%id
461 END IF
462 END SUBROUTINE comin_var_get_descriptor
463
466 SUBROUTINE comin_var_get(context, var_descriptor, flag, var_ptr)
467 INTEGER, INTENT(IN) :: context(:)
468 TYPE(t_comin_var_descriptor), INTENT(IN) :: var_descriptor
469 INTEGER, INTENT(IN) :: flag
470 TYPE(t_comin_var_handle), INTENT(OUT) :: var_ptr
471 ! local
472 TYPE(t_comin_var_item), POINTER :: var_item => null()
473
474 CALL comin_var_get_internal(context, var_descriptor, flag, var_item)
475 var_ptr = comin_var_ptr_init(var_item)
476 END SUBROUTINE comin_var_get
477
479 FUNCTION comin_var_get_from_exposed(var_descriptor) RESULT(comin_get_var)
480 TYPE(t_comin_var_item), POINTER :: comin_get_var
481 TYPE (t_comin_var_descriptor), INTENT(IN) :: var_descriptor
482 !
483
484 CALL c_f_pointer(comin_varmap_get(state%comin_var_list, var_descriptor%name, var_descriptor%id), comin_get_var)
485 END FUNCTION comin_var_get_from_exposed
486
488 FUNCTION comin_var_get_by_context(context, plugin_id, var_descriptor) RESULT(comin_get_var)
489 TYPE(t_comin_var_context_item), POINTER :: comin_get_var
490 INTEGER, INTENT(IN) :: context, plugin_id
491 TYPE (t_comin_var_descriptor), INTENT(IN) :: var_descriptor
492 ! local
493 TYPE(c_ptr) :: it, cptr
494 TYPE(t_comin_var_context_item), POINTER :: item
495
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)
499 CALL comin_ftnlist_iterator_begin(var_list, it)
500 DO WHILE (.not. comin_ftnlist_is_end(var_list,it))
501 ! test if already registered for context
502 CALL comin_ftnlist_iterator_value(it, cptr)
503 CALL c_f_pointer(cptr, item)
504 IF (comin_var_descr_match(item%var_item%descriptor, var_descriptor)) THEN
505 comin_get_var => item
506 EXIT
507 END IF
509 END DO
511 END associate
512 END FUNCTION comin_var_get_by_context
513
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
518 !
519 TYPE (t_comin_var_descriptor) :: var_descriptor_fortran
520
521 var_descriptor_fortran = t_comin_var_descriptor(var_descriptor)
522 CALL comin_var_request_add(var_descriptor_fortran, LOGICAL(lmodexclusive))
523 END SUBROUTINE comin_var_request_add_c
524
539 SUBROUTINE comin_var_request_add(var_descriptor, lmodexclusive)
540 TYPE (t_comin_var_descriptor), INTENT(IN) :: var_descriptor
541 LOGICAL, INTENT(IN) :: lmodexclusive
542 ! local
543 TYPE(t_comin_descrdata_global), POINTER :: comin_global
544 TYPE (t_comin_var_descriptor) :: var_descriptor_domain
545 INTEGER :: domain_id
546
547 comin_global => comin_descrdata_get_global()
548
549 IF (state%l_primary_done) THEN
550 CALL comin_error_set(comin_error_var_request_after_primaryconstructor); RETURN
551 ENDIF
552
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")
556
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)
561 ENDDO
562 ELSE
563 CALL comin_var_request_add_element(var_descriptor, lmodexclusive)
564 ENDIF
565
566 CONTAINS
567
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
571 !
572 TYPE(c_ptr) :: it, cptr
573 TYPE(t_comin_request_item), POINTER :: var_list_request_element, comin_request_item
574
575 ! check if requested variable already requested or if modexlusive conflicts exist
576 ! first find the variable in list of all ICON variables and set the pointer
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
589 ELSE
590 IF (.NOT. ALLOCATED(var_list_request_element%moduleID)) THEN
591 ! if not allocated something went wrong before (should not happen)
592 CALL comin_error_set(comin_error_field_not_allocated); RETURN
593 ELSE
594 var_list_request_element%moduleID = [var_list_request_element%moduleID(:), &
595 & state%current_plugin%id]
596 END IF
597 RETURN
598 END IF
599 END IF
600 CALL comin_ftnlist_iterator_next(it)
601 END DO
602 CALL comin_ftnlist_iterator_delete(it)
603
604 ! register new variable request
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))
612 END associate
613 END SUBROUTINE comin_var_request_add_element
614
615 END SUBROUTINE comin_var_request_add
616
617 ! Internal subroutine. Consistency checks and similar operations,
618 ! done after primary constructors.
620 INTEGER :: i,j
621
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)
626 END DO
627 END DO
628
629 END SUBROUTINE comin_var_complete
630
631 SUBROUTINE comin_var_set_sync_device_mem(sync_device_mem)
632 PROCEDURE(comin_var_sync_device_mem_fct) :: sync_device_mem
633
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
637 END IF
638 END SUBROUTINE comin_var_set_sync_device_mem
639
640 SUBROUTINE comin_var_set_sync_halo(sync_halo)
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
645 END IF
646 END SUBROUTINE comin_var_set_sync_halo
647
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
653 ! local
654 TYPE(t_comin_var_context_item), POINTER :: item
655 INTEGER :: ic
656
657 ! Routine should only be called during secondary constructor
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
661 END IF
662
663 ! device pointers can only be accessed if a device is available
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
667 ENDIF
668 ! first find the variable in list of all ICON variables and set the pointer
669 var_item => comin_var_get_from_exposed(var_descriptor)
670 IF (.NOT. ASSOCIATED(var_item)) THEN
671 CALL comin_error_set(comin_error_var_get_variable_not_found); RETURN
672 ENDIF
673 ! a container can not halo synchronized
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
677 ENDIF
678 ! an irregular var can not be halo synchronized
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
682 ENDIF
683
684 DO ic = 1, SIZE(context)
685 ! ignore EP_SECONDARY_CONSTRUCTOR for var_list
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
689 ! not in context list: register variable, set access flag
690 associate(var_list => state%comin_var_list_context(context(ic) , state%current_plugin%id)%var_list)
691 ALLOCATE(item)
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))
695 END associate
696 END IF
697 END DO
698 END SUBROUTINE comin_var_get_internal
699
700 SUBROUTINE comin_var_set_cptr(var, cptr)
701 TYPE(t_comin_var_handle), INTENT(INOUT) :: var
702 TYPE(c_ptr), INTENT(IN) :: cptr
703 !
704
705 CALL comin_var_handle_set_cptr(var, cptr)
706
707 END SUBROUTINE comin_var_set_cptr
708
710 LOGICAL FUNCTION comin_var_is_used(var_descriptor)
711 TYPE(t_comin_var_descriptor), INTENT(IN) :: var_descriptor
712
713 TYPE(t_comin_var_context_item), POINTER :: item
714 TYPE(c_ptr) :: list, it, p
715 INTEGER :: ep, id
716
717 comin_var_is_used = .false.
718
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)
726
727 IF (comin_var_descr_match(item%var_item%descriptor, var_descriptor)) THEN
728 comin_var_is_used = .true.
729 CALL comin_ftnlist_iterator_delete(it)
730 RETURN
731 END IF
732
733 CALL comin_ftnlist_iterator_next(it)
734 END DO
735 CALL comin_ftnlist_iterator_delete(it)
736 END DO
737 END DO
738 END FUNCTION
739
740END MODULE comin_variable
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.
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.
Variable descriptor. identifies (uniquely) a variable. Do not confuse with meta-data.
Variable pointer. Fortran interface for accessing variables.