14 use,
INTRINSIC :: iso_c_binding, only: c_int, c_ptr, c_loc, c_null_char, c_loc, c_signed_char
46#include "comin_global.inc"
48 INTERFACE is_in_bounds
49 MODULE PROCEDURE is_in_bounds_int
50 MODULE PROCEDURE is_in_bounds_ddd
51 END INTERFACE is_in_bounds
54 MODULE PROCEDURE comin_descrdata_to_c_signed_char_1
55 MODULE PROCEDURE comin_descrdata_to_c_string
56 MODULE PROCEDURE comin_descrdata_to_c_int_1
57 MODULE PROCEDURE comin_descrdata_to_c_int_2
58 MODULE PROCEDURE comin_descrdata_to_c_int_3
59 MODULE PROCEDURE comin_descrdata_to_c_real_1
60 MODULE PROCEDURE comin_descrdata_to_c_real_2
61 MODULE PROCEDURE comin_descrdata_to_c_real_3
62 MODULE PROCEDURE comin_descrdata_to_c_real_4
66 SUBROUTINE comin_current_set_datetime_c(datetime_c)
BIND(C, NAME="comin_current_set_datetime")
67 USE iso_c_binding,
ONLY: c_char
68 CHARACTER(kind=c_char),
DIMENSION(*),
INTENT(IN) :: datetime_c
69 END SUBROUTINE comin_current_set_datetime_c
71 FUNCTION comin_current_get_datetime_c() &
73 &
BIND(C, NAME="comin_current_get_datetime")
74 USE iso_c_binding,
ONLY: c_ptr
75 TYPE(C_PTR) :: datetime
76 END FUNCTION comin_current_get_datetime_c
83 INTEGER(kind=C_INT),
INTENT(IN),
VALUE :: jg
84 INTEGER(kind=C_INT),
INTENT(IN),
VALUE :: global_idx
92 INTEGER(kind=C_INT),
INTENT(IN),
VALUE :: jg
93 INTEGER(kind=C_INT),
INTENT(IN),
VALUE :: global_idx
101 INTEGER(kind=C_INT),
INTENT(IN),
VALUE :: jg
102 INTEGER(kind=C_INT),
INTENT(IN),
VALUE :: global_idx
106 & RESULT(exp_start) &
108 use,
INTRINSIC :: iso_c_binding, only: c_ptr
114 use,
INTRINSIC :: iso_c_binding, only: c_ptr
118 & RESULT(run_start) &
120 use,
INTRINSIC :: iso_c_binding, only: c_ptr
126 use,
INTRINSIC :: iso_c_binding, only: c_ptr
132 use,
INTRINSIC :: iso_c_binding, only: c_double, c_int
134 INTEGER(C_INT),
INTENT(IN),
VALUE :: jg
139 use,
INTRINSIC :: iso_c_binding, only: c_int, c_double
140 INTEGER(C_INT),
INTENT(IN),
VALUE :: jg
141 REAL(C_DOUBLE),
INTENT(IN),
VALUE :: dt_current
146 use,
INTRINSIC :: iso_c_binding, only: c_char
147 CHARACTER(KIND=C_CHAR, LEN=1),
DIMENSION(*),
INTENT(IN) :: exp_start, exp_stop, run_start, run_stop
156 TYPE(t_comin_descrdata_global_data),
INTENT(IN) :: comin_global_info
157 state%comin_descrdata_global_data = comin_global_info
162 TYPE(t_comin_descrdata_domain_data),
INTENT(IN) :: comin_domain_info(:)
163 ALLOCATE(state%comin_descrdata_domain_data, source=comin_domain_info)
168 CHARACTER(LEN=*),
INTENT(IN) :: exp_start, exp_stop, run_start, run_stop
171 trim(exp_start) // c_null_char, &
172 trim(exp_stop) // c_null_char, &
173 trim(run_start) // c_null_char, &
174 trim(run_stop) // c_null_char)
180 CHARACTER(LEN=:),
ALLOCATABLE,
INTENT(OUT) :: sim_time_current
182 TYPE(c_ptr) :: datetime_c
183 datetime_c = comin_current_get_datetime_c()
184 sim_time_current = convert_c_string(datetime_c)
189 CHARACTER(LEN=*),
INTENT(IN) :: sim_time_current
190 CALL comin_current_set_datetime_c(trim(sim_time_current)//c_null_char)
248 INTEGER(c_int),
INTENT(IN),
VALUE :: idx1d
256 INTEGER(c_int),
INTENT(IN),
VALUE :: idx1d
268 &
BIND(C, NAME="comin_descrdata_get_cell_block_limits")
270 INTEGER(c_int),
INTENT(IN),
VALUE :: jg
271 INTEGER(c_int),
INTENT(IN),
VALUE :: irl_start
272 INTEGER(c_int),
INTENT(IN),
VALUE :: irl_end
274 INTEGER(c_int),
INTENT(OUT) :: i_startblk
275 INTEGER(c_int),
INTENT(OUT) :: i_endblk
277 IF (is_in_bounds(jg, state%comin_descrdata_domain_data))
THEN
279 & is_in_bounds(irl_start, state%comin_descrdata_domain_data(jg)%cells%start_block) .AND. &
280 & is_in_bounds(irl_end, state%comin_descrdata_domain_data(jg)%cells%end_block))
THEN
282 i_startblk = state%comin_descrdata_domain_data(jg)%cells%start_block(irl_start)
283 i_endblk = state%comin_descrdata_domain_data(jg)%cells%end_block(irl_end)
304 i_endidx, irl_start, irl_end) &
305 &
BIND(C, NAME="comin_descrdata_get_cell_indices")
307 INTEGER(c_int),
INTENT(IN),
VALUE :: jg
308 INTEGER(c_int),
INTENT(IN),
VALUE :: i_blk
309 INTEGER(c_int),
INTENT(IN),
VALUE :: i_startblk
310 INTEGER(c_int),
INTENT(IN),
VALUE :: i_endblk
311 INTEGER(c_int),
INTENT(IN),
VALUE :: irl_start
312 INTEGER(c_int),
INTENT(IN),
VALUE :: irl_end
314 INTEGER(c_int),
INTENT(OUT) :: i_startidx, i_endidx
316 IF (i_blk == i_startblk)
THEN
317 IF (is_in_bounds(jg, state%comin_descrdata_domain_data))
THEN
318 IF (is_in_bounds(irl_start, state%comin_descrdata_domain_data(jg)%cells%start_block))
THEN
319 i_startidx = max(1,state%comin_descrdata_domain_data(jg)%cells%start_index(irl_start))
320 i_endidx = state%comin_descrdata_global_data%nproma
327 IF (i_blk == i_endblk)
THEN
328 IF (is_in_bounds(irl_end, state%comin_descrdata_domain_data(jg)%cells%end_block))
THEN
329 i_endidx = state%comin_descrdata_domain_data(jg)%cells%end_index(irl_end)
341 ELSE IF (i_blk == i_endblk)
THEN
342 IF (is_in_bounds(jg, state%comin_descrdata_domain_data))
THEN
343 IF (is_in_bounds(irl_end, state%comin_descrdata_domain_data(jg)%cells%end_block))
THEN
345 i_endidx = state%comin_descrdata_domain_data(jg)%cells%end_index(irl_end)
358 i_endidx = state%comin_descrdata_global_data%nproma
367 &
BIND(C, NAME="comin_descrdata_get_edge_block_limits")
369 INTEGER(c_int),
INTENT(IN),
VALUE :: jg
370 INTEGER(c_int),
INTENT(IN),
VALUE :: irl_start
371 INTEGER(c_int),
INTENT(IN),
VALUE :: irl_end
373 INTEGER(c_int),
INTENT(OUT) :: i_startblk
374 INTEGER(c_int),
INTENT(OUT) :: i_endblk
376 IF (is_in_bounds(jg, state%comin_descrdata_domain_data))
THEN
378 & is_in_bounds(irl_start, state%comin_descrdata_domain_data(jg)%edges%start_block) .AND. &
379 & is_in_bounds(irl_end, state%comin_descrdata_domain_data(jg)%edges%end_block))
THEN
381 i_startblk = state%comin_descrdata_domain_data(jg)%edges%start_block(irl_start)
382 i_endblk = state%comin_descrdata_domain_data(jg)%edges%end_block(irl_end)
403 i_endidx, irl_start, irl_end) &
404 &
BIND(C, NAME="comin_descrdata_get_edge_indices")
406 INTEGER(c_int),
INTENT(IN),
VALUE :: jg
407 INTEGER(c_int),
INTENT(IN),
VALUE :: i_blk
408 INTEGER(c_int),
INTENT(IN),
VALUE :: i_startblk
409 INTEGER(c_int),
INTENT(IN),
VALUE :: i_endblk
410 INTEGER(c_int),
INTENT(IN),
VALUE :: irl_start
411 INTEGER(c_int),
INTENT(IN),
VALUE :: irl_end
413 INTEGER(c_int),
INTENT(OUT) :: i_startidx, i_endidx
415 IF (i_blk == i_startblk)
THEN
416 IF (is_in_bounds(jg, state%comin_descrdata_domain_data))
THEN
417 IF (is_in_bounds(irl_start, state%comin_descrdata_domain_data(jg)%edges%start_block))
THEN
418 i_startidx = max(1,state%comin_descrdata_domain_data(jg)%edges%start_index(irl_start))
419 i_endidx = state%comin_descrdata_global_data%nproma
426 IF (i_blk == i_endblk)
THEN
427 IF (is_in_bounds(irl_end, state%comin_descrdata_domain_data(jg)%edges%end_block))
THEN
428 i_endidx = state%comin_descrdata_domain_data(jg)%edges%end_index(irl_end)
440 ELSE IF (i_blk == i_endblk)
THEN
441 IF (is_in_bounds(jg, state%comin_descrdata_domain_data))
THEN
442 IF (is_in_bounds(irl_end, state%comin_descrdata_domain_data(jg)%edges%end_block))
THEN
444 i_endidx = state%comin_descrdata_domain_data(jg)%edges%end_index(irl_end)
457 i_endidx = state%comin_descrdata_global_data%nproma
466 &
BIND(C, NAME="comin_descrdata_get_vert_block_limits")
468 INTEGER(c_int),
INTENT(IN),
VALUE :: jg
469 INTEGER(c_int),
INTENT(IN),
VALUE :: irl_start
470 INTEGER(c_int),
INTENT(IN),
VALUE :: irl_end
472 INTEGER(c_int),
INTENT(OUT) :: i_startblk
473 INTEGER(c_int),
INTENT(OUT) :: i_endblk
475 IF (is_in_bounds(jg, state%comin_descrdata_domain_data))
THEN
477 & is_in_bounds(irl_start, state%comin_descrdata_domain_data(jg)%verts%start_block) .AND. &
478 & is_in_bounds(irl_end, state%comin_descrdata_domain_data(jg)%verts%end_block))
THEN
480 i_startblk = state%comin_descrdata_domain_data(jg)%verts%start_block(irl_start)
481 i_endblk = state%comin_descrdata_domain_data(jg)%verts%end_block(irl_end)
502 i_endidx, irl_start, irl_end) &
503 &
BIND(C, NAME="comin_descrdata_get_vert_indices")
505 INTEGER(c_int),
INTENT(IN),
VALUE :: jg
506 INTEGER(c_int),
INTENT(IN),
VALUE :: i_blk
507 INTEGER(c_int),
INTENT(IN),
VALUE :: i_startblk
508 INTEGER(c_int),
INTENT(IN),
VALUE :: i_endblk
509 INTEGER(c_int),
INTENT(IN),
VALUE :: irl_start
510 INTEGER(c_int),
INTENT(IN),
VALUE :: irl_end
512 INTEGER(c_int),
INTENT(OUT) :: i_startidx, i_endidx
514 IF (i_blk == i_startblk)
THEN
515 IF (is_in_bounds(jg, state%comin_descrdata_domain_data))
THEN
516 IF (is_in_bounds(irl_start, state%comin_descrdata_domain_data(jg)%verts%start_block))
THEN
517 i_startidx = max(1,state%comin_descrdata_domain_data(jg)%verts%start_index(irl_start))
518 i_endidx = state%comin_descrdata_global_data%nproma
525 IF (i_blk == i_endblk)
THEN
526 IF (is_in_bounds(irl_end, state%comin_descrdata_domain_data(jg)%verts%end_block))
THEN
527 i_endidx = state%comin_descrdata_domain_data(jg)%verts%end_index(irl_end)
539 ELSE IF (i_blk == i_endblk)
THEN
540 IF (is_in_bounds(jg, state%comin_descrdata_domain_data))
THEN
541 IF (is_in_bounds(irl_end, state%comin_descrdata_domain_data(jg)%verts%end_block))
THEN
543 i_endidx = state%comin_descrdata_domain_data(jg)%verts%end_index(irl_end)
556 i_endidx = state%comin_descrdata_global_data%nproma
570 INTEGER(c_int),
INTENT(IN),
VALUE :: jg
573 & (state%comin_descrdata_domain_data(jg)%cells%nblks-1)*state%comin_descrdata_global_data%nproma
585 INTEGER(c_int),
INTENT(IN),
VALUE :: jg
588 & (state%comin_descrdata_domain_data(jg)%edges%nblks-1)*state%comin_descrdata_global_data%nproma
600 INTEGER(c_int),
INTENT(IN),
VALUE :: jg
603 & (state%comin_descrdata_domain_data(jg)%verts%nblks-1)*state%comin_descrdata_global_data%nproma
608 LOGICAL FUNCTION is_in_bounds_int(idx, arr)
RESULT(is_in_bounds)
609 INTEGER,
INTENT(IN) :: idx
610 INTEGER,
POINTER,
INTENT(IN) :: arr(:)
612 is_in_bounds = lbound(arr, dim=1) <= idx .AND. idx <= ubound(arr, dim=1)
613 END FUNCTION is_in_bounds_int
617 LOGICAL FUNCTION is_in_bounds_ddd(idx, arr)
RESULT(is_in_bounds)
618 INTEGER,
INTENT(IN) :: idx
619 TYPE(t_comin_descrdata_domain_data),
ALLOCATABLE,
INTENT(IN) :: arr(:)
622 is_in_bounds = lbound(arr, dim=1) <= idx .AND. idx <= ubound(arr, dim=1)
623 END FUNCTION is_in_bounds_ddd
625 SUBROUTINE comin_descrdata_to_c_signed_char_1(arr, ptr, arr_size)
626 INTEGER(c_signed_char),
POINTER,
INTENT(IN) :: arr(:)
627 TYPE(c_ptr),
INTENT(OUT) :: ptr
628 INTEGER(C_INT),
INTENT(OUT) :: arr_size(1)
631 arr_size = shape(arr)
632 END SUBROUTINE comin_descrdata_to_c_signed_char_1
634 SUBROUTINE comin_descrdata_to_c_string(arr, ptr, arr_size)
635 CHARACTER(LEN=:),
POINTER,
INTENT(IN) :: arr
636 TYPE(c_ptr),
INTENT(OUT) :: ptr
637 INTEGER(C_INT),
INTENT(OUT) :: arr_size(1)
640 arr_size = len_trim(arr)
641 END SUBROUTINE comin_descrdata_to_c_string
643 SUBROUTINE comin_descrdata_to_c_int_1(arr, ptr, arr_size)
644 INTEGER(C_INT),
POINTER,
INTENT(IN) :: arr(:)
645 TYPE(c_ptr),
INTENT(OUT) :: ptr
646 INTEGER(C_INT),
INTENT(OUT) :: arr_size(1)
649 arr_size = shape(arr)
650 END SUBROUTINE comin_descrdata_to_c_int_1
652 SUBROUTINE comin_descrdata_to_c_int_2(arr, ptr, arr_size)
653 INTEGER(C_INT),
POINTER,
INTENT(IN) :: arr(:,:)
654 TYPE(c_ptr),
INTENT(OUT) :: ptr
655 INTEGER(C_INT),
INTENT(OUT) :: arr_size(2)
658 arr_size = shape(arr)
659 END SUBROUTINE comin_descrdata_to_c_int_2
661 SUBROUTINE comin_descrdata_to_c_int_3(arr, ptr, arr_size)
662 INTEGER(C_INT),
POINTER,
INTENT(IN) :: arr(:,:,:)
663 TYPE(c_ptr),
INTENT(OUT) :: ptr
664 INTEGER(C_INT),
INTENT(OUT) :: arr_size(3)
667 arr_size = shape(arr)
668 END SUBROUTINE comin_descrdata_to_c_int_3
670 SUBROUTINE comin_descrdata_to_c_real_1(arr, ptr, arr_size)
671 REAL(wp),
POINTER,
INTENT(IN) :: arr(:)
672 TYPE(c_ptr),
INTENT(OUT) :: ptr
673 INTEGER(C_INT),
INTENT(OUT) :: arr_size(1)
676 arr_size = shape(arr)
677 END SUBROUTINE comin_descrdata_to_c_real_1
679 SUBROUTINE comin_descrdata_to_c_real_2(arr, ptr, arr_size)
680 REAL(wp),
POINTER,
INTENT(IN) :: arr(:,:)
681 TYPE(c_ptr),
INTENT(OUT) :: ptr
682 INTEGER(C_INT),
INTENT(OUT) :: arr_size(2)
685 arr_size = shape(arr)
686 END SUBROUTINE comin_descrdata_to_c_real_2
688 SUBROUTINE comin_descrdata_to_c_real_3(arr, ptr, arr_size)
689 REAL(wp),
POINTER,
INTENT(IN) :: arr(:,:,:)
690 TYPE(c_ptr),
INTENT(OUT) :: ptr
691 INTEGER(C_INT),
INTENT(OUT) :: arr_size(3)
694 arr_size = shape(arr)
695 END SUBROUTINE comin_descrdata_to_c_real_3
697 SUBROUTINE comin_descrdata_to_c_real_4(arr, ptr, arr_size)
698 REAL(wp),
POINTER,
INTENT(IN) :: arr(:,:,:,:)
699 TYPE(c_ptr),
INTENT(OUT) :: ptr
700 INTEGER(C_INT),
INTENT(OUT) :: arr_size(4)
703 arr_size = shape(arr)
704 END SUBROUTINE comin_descrdata_to_c_real_4
void comin_error_set(t_comin_error_code error_code)
void comin_state_set_simulation_interval(const char *exp_start, const char *exp_stop, const char *run_start, const char *run_stop)
const char * comin_descrdata_get_simulation_interval_exp_start()
const char * comin_descrdata_get_simulation_interval_exp_stop()
const char * comin_descrdata_get_simulation_interval_run_start()
const char * comin_descrdata_get_simulation_interval_run_stop()
Global data is invariant wrt the computational grid and never changed or updated.
Conversion of global edge index to MPI-process local index.
Patch grid data structure, gathering information on grids.
Simulation status information, sim_current contains current time step.
Conversion of global vert index to MPI-process local index.
Conversion of global cell index to MPI-process local index.
Receive pointer on array storing timestep information for all domains.
subroutine, public comin_descrdata_get_vert_block_limits(jg, irl_start, irl_end, i_startblk, i_endblk)
Computes the start and end block indices for loops over vertex-based variables.
integer(c_int) function, public comin_descrdata_get_vert_npromz(jg)
Calculate npromz value for the blocking, needed for patch allocation. ... for the vertices.
subroutine, public comin_descrdata_get_vert_indices(jg, i_blk, i_startblk, i_endblk, i_startidx, i_endidx, irl_start, irl_end)
Computes the start and end indices of do loops for vertex-based variables.
subroutine, public comin_descrdata_get_cell_indices(jg, i_blk, i_startblk, i_endblk, i_startidx, i_endidx, irl_start, irl_end)
Computes the start and end indices of do loops for cell-based variables.
subroutine, public comin_descrdata_get_edge_indices(jg, i_blk, i_startblk, i_endblk, i_startidx, i_endidx, irl_start, irl_end)
Computes the start and end indices of do loops for edge-based variables.
integer(c_int) function, public comin_descrdata_get_cell_npromz(jg)
Calculate npromz value for the blocking, needed for patch allocation. ... for the cells.
integer, parameter wp
working precision
integer(c_int) function, public comin_descrdata_get_index(idx1d)
Auxiliary function: conversion of 1D to 2D indices.
subroutine, public comin_descrdata_get_edge_block_limits(jg, irl_start, irl_end, i_startblk, i_endblk)
Computes the start and end block indices for loops over edge-based variables.
integer(c_int) function, public comin_descrdata_get_edge_npromz(jg)
Calculate npromz value for the blocking, needed for patch allocation. ... for the edges.
subroutine, public comin_descrdata_get_cell_block_limits(jg, irl_start, irl_end, i_startblk, i_endblk)
Computes the start and end block indices for loops over cell-based variables.
type(t_comin_descrdata_simulation_interval) function, public comin_descrdata_get_simulation_interval()
request a pointer to simulation status
integer(c_int) function, public comin_descrdata_get_block(idx1d)
auxiliary functions taken from ICON, version 2.6.5
subroutine, public comin_current_get_datetime(sim_time_current)
Retrieve time stamp info, current time information.
Fill array with timestep.
subroutine, public comin_descrdata_set_simulation_interval(exp_start, exp_stop, run_start, run_stop)
Fill time stamp info.
subroutine, public comin_descrdata_finalize()
Clean descriptive data structure in ComIn currently no content but keep for future use.
subroutine, public comin_descrdata_set_domain(comin_domain_info)
Set up data type for grid data.
subroutine, public comin_current_set_datetime(sim_time_current)
Update time stamp info, current time information.
subroutine, public comin_descrdata_set_global(comin_global_info)
Fill global data.
@ comin_error_index_out_of_bounds
type(t_comin_state), pointer, public state