21 USE iso_c_binding,
ONLY : c_int, c_ptr, c_f_pointer, c_associated, c_sizeof, c_loc, &
24 & comin_var_get, comin_parallel_get_host_mpi_comm, &
27 & comin_descrdata_get_domain, t_comin_descrdata_domain, &
28 & comin_descrdata_get_global, t_comin_descrdata_global, &
29 & comin_descrdata_get_cell_block_limits, &
30 & comin_descrdata_get_cell_indices, &
31 & comin_descrdata_get_simulation_interval, &
32 & t_comin_descrdata_simulation_interval, &
34 & ep_secondary_constructor, ep_destructor, &
35 & ep_atm_physics_before, ep_atm_write_output_before, &
36 & comin_flag_read, comin_flag_write, comin_zaxis_2d, &
39 & t_comin_plugin_info, comin_current_get_plugin_info, &
46 & comin_dim_semantics_nproma, comin_dim_semantics_level, &
47 & comin_dim_semantics_block, comin_dim_semantics_unused, &
48 & comin_var_datatype_double
52 CHARACTER(LEN=*),
PARAMETER ::
pluginname =
"simple_fortran_plugin"
55 INTEGER,
PARAMETER ::
wp = selected_real_kind(12,307)
56 TYPE(t_comin_setup_version_info) ::
version
65 TYPE(t_comin_var_handle),
ALLOCATABLE ::
qv(:)
70 SUBROUTINE qsort(arr, nmemb, size, pred)
BIND(C)
71 use,
INTRINSIC :: iso_c_binding, only: c_ptr, c_size_t, c_funptr
72 TYPE(c_ptr),
VALUE,
INTENT(IN) :: arr
73 INTEGER(c_size_t),
VALUE,
INTENT(IN) :: nmemb, size
74 TYPE(c_funptr),
VALUE,
INTENT(IN) :: pred
85 TYPE(t_comin_plugin_info) :: this_plugin
87 REAL(wp) :: dtime_1, dtime_2
89 rank = comin_parallel_get_host_mpi_rank()
90 CALL comin_print_info(
"setup")
93 IF (
version%version_no_major > 1)
THEN
98 CALL comin_current_get_plugin_info(this_plugin)
99 WRITE (
text,
'(a,i4)')
" plugin id: ", this_plugin%id
100 CALL comin_print_info(
text)
107 CALL comin_metadata_set(simple_fortran_d,
"tracer", .false.)
108 CALL comin_metadata_set(simple_fortran_d,
"restart", .false.)
113 CALL comin_metadata_set(simple_fortran_tracer_d,
"tracer", .true.)
114 CALL comin_metadata_set(simple_fortran_tracer_d,
"restart", .false.)
122 p_global = comin_descrdata_get_global()
131 WRITE(
text,
"(A,F5.0,F5.0)")
" timesteplength from comin_descrdata_get_timesteplength", dtime_1, dtime_2
132 CALL comin_print_info(
text)
140 INTEGER :: jg, hgrid_id, datatype
141 LOGICAL :: tracer, multi_timelevel
142 REAL(WP),
POINTER :: tracer_slice(:,:,:)
146 INTEGER(c_size_t) :: descrs_len, descrs_size
147 INTEGER(c_size_t) :: i
149 CALL comin_print_info(
"third party callback: secondary constructor.")
150 CALL comin_print_info(
"third party callback: iterate over variable list:")
152 descrs_len = 0_c_size_t
153 descrs_size = 8_c_size_t
154 ALLOCATE(descrs(descrs_size))
157 DO WHILE (c_associated(it))
158 IF (descrs_len == descrs_size)
THEN
159 descrs_size = descrs_size * 2
160 ALLOCATE(temp(descrs_size))
161 temp(1:descrs_len) = descrs(1:descrs_len)
162 CALL move_alloc(temp, descrs)
165 descrs_len = descrs_len + 1
171 CALL qsort(c_loc(descrs(1)), descrs_len, storage_size(descrs, c_size_t) / 8, c_funloc(
compare_descr))
174 WRITE (
text,*)
"Variable found: ", trim(descrs(i)%name), &
175 "(", descrs(i)%id,
")"
176 CALL comin_print_info(
text)
179 WRITE (
text,*)
" ",
pluginname,
" - register some variables in some context"
180 CALL comin_print_info(
text)
182 CALL comin_var_get([ep_atm_write_output_before], &
183 & var_desc, comin_flag_read, pres)
184 IF (.NOT. pres%valid()) &
187 IF (any(pres%dim_semantics() /= [comin_dim_semantics_nproma, &
188 & comin_dim_semantics_level, &
189 & comin_dim_semantics_block, &
190 & comin_dim_semantics_unused, &
191 & comin_dim_semantics_unused ])) &
195 CALL comin_var_get([ep_atm_write_output_before], &
196 & var_desc, comin_flag_read,
vn)
197 IF (.NOT.
vn%valid()) &
201 IF (hgrid_id/=comin_hgrid_unstructured_edge) &
207 CALL comin_var_get([ep_atm_write_output_before], &
209 & comin_flag_read,
qv(jg))
211 &
"datatype", datatype)
212 IF (datatype/=comin_var_datatype_double) &
214 IF (.NOT.
qv(jg)%valid()) &
217 IF (any(
qv(jg)%dim_semantics() /= [ comin_dim_semantics_nproma, &
218 & comin_dim_semantics_level, &
219 & comin_dim_semantics_block, &
220 & comin_dim_semantics_unused, &
221 & comin_dim_semantics_unused ] )) &
225 CALL comin_var_get([ep_atm_write_output_before], &
234 CALL comin_var_get([ep_atm_write_output_before], &
242 tracer_slice(1,9,1) = 1.0
249 INTEGER :: ierr, domain_id, jg, comm, root, &
250 & jb, jbs, jbe, jcs, jce, &
252 REAL(wp) :: block_max, local_max, global_max
253 REAL(wp),
POINTER,
DIMENSION(:,:,:,:,:) :: simple_fortran_ptr, &
256 CALL comin_print_info(
"third party callback: before output.")
259 comm = comin_parallel_get_host_mpi_comm()
262 CALL comin_print_info(
"currently not in domain loop")
264 WRITE(
text,
'(a,i0)')
" currently on domain ", domain_id
265 CALL comin_print_info(
text)
269 CALL pres%get_ptr(pres_ptr)
270 simple_fortran_ptr = pres_ptr + 42
273 rl_start =
p_global%get_grf_bdywidth_c() + 1
274 rl_end =
p_global%get_min_rlcell_int()
277 CALL qv(jg)%get_ptr(qv_ptr)
279 CALL comin_descrdata_get_cell_block_limits(jg, rl_start, rl_end, jbs, jbe)
281 CALL comin_descrdata_get_cell_indices(jg, jb, jbs, jbe, jcs, jce, rl_start, rl_end)
283 block_max = maxval(qv_ptr(jcs:jce,:,jb,1,1))
286 local_max = block_max
288 local_max = max(local_max, block_max)
293 CALL mpi_reduce(local_max, global_max, 1, mpi_double_precision, mpi_max, root, comm, ierr)
294 WRITE(
text,
"(A,I8,A,F8.6)")
"domain ", jg,
": global max = ", global_max
295 CALL comin_print_info(
text)
303 CALL comin_print_info(
"third party callback: destructor.")
307 TYPE(c_ptr),
VALUE,
INTENT(IN) :: a, b
310 CALL c_f_pointer(a, pa)
311 CALL c_f_pointer(b, pb)
313 IF (pa%name /= pb%name)
THEN
const char * comin_callback_get_ep_name(t_comin_entry_point iep)
void comin_plugin_finish(const char *routine, const char *text)
void comin_setup_get_version(unsigned int *major, unsigned int *minor, unsigned int *patch)
int comin_current_get_domain_id()
double comin_descrdata_get_timesteplength(int jg)
void comin_var_request_add(t_comin_var_descriptor var_desc, bool lmodexclusive)
void comin_var_get_descr_list_var_desc(t_comin_var_descr_list_iterator *current, t_comin_var_descriptor *var_desc)
t_comin_var_descr_list_iterator * comin_var_get_descr_list_head()
t_comin_var_descr_list_iterator * comin_var_get_descr_list_next(t_comin_var_descr_list_iterator *current)
integer, parameter, public comin_domain_outside_loop
Return value of comin_current_get_domain_id if there is currently no domain loop.
void comin_callback_register(t_comin_entry_point entry_point, t_comin_callback_function fct_ptr)
Example plugin for the ICON Community Interface (ComIn)
subroutine simple_fortran_destructor()
character(len= *), parameter pluginname
subroutine simple_fortran_diagfct()
type(t_comin_descrdata_simulation_interval) p_simulation_interval
subroutine simple_fortran_constructor()
integer, parameter wp
working precision
integer(c_int) function compare_descr(a, b)
type(t_comin_descrdata_global) p_global
access descriptive data structures
type(t_comin_var_handle) simple_fortran_tracer
type(t_comin_var_handle) vn
type(t_comin_setup_version_info) version
type(t_comin_var_handle) simple_fortran_var
type(t_comin_var_handle), dimension(:), allocatable qv