14 USE iso_c_binding,
ONLY: c_int, c_int64_t, c_char, c_bool, c_ptr, c_null_ptr, c_f_pointer, c_loc
26#include "comin_global.inc"
36 CHARACTER(LEN=:),
ALLOCATABLE :: name
46 TYPE,
BIND(C) :: t_comin_var_descriptor_c
47 CHARACTER(KIND=c_char) :: name(comin_max_len_var_name+1)
49 INTEGER(kind=c_int) :: id
60 TYPE(t_comin_var_item),
PRIVATE,
POINTER :: var_item
63 generic,
PUBLIC :: get_ptr => get_ptr_dp, get_ptr_sp, get_ptr_i
73 generic,
PUBLIC :: to_3d => to_3d_dp, to_3d_sp, to_3d_i
80 TYPE,
BIND(C) :: t_comin_var_item
86 TYPE(c_ptr) :: cptr = c_null_ptr
89 INTEGER(KIND=C_INT) :: type_id
92 INTEGER(KIND=C_INT) :: array_shape(5)
95 TYPE(c_ptr) :: device_ptr = c_null_ptr
98 INTEGER(KIND=C_INT),
DIMENSION(5) :: dim_semantics
103 INTEGER(KIND=C_INT) :: ncontained = 0
105 LOGICAL(kind=c_bool) :: lcontainer = .false.
108 TYPE(c_ptr) :: metadata
114 TYPE(c_ptr),
VALUE,
INTENT(IN) :: ptr, device_ptr
115 INTEGER(C_INT),
VALUE,
INTENT(IN) :: datatype
116 INTEGER(C_INT),
INTENT(IN) :: array_shape(5)
117 INTEGER(C_INT),
VALUE,
INTENT(IN) :: direction
123 INTEGER(C_INT),
VALUE,
INTENT(IN) :: jg
124 TYPE(c_ptr),
VALUE,
INTENT(IN) :: ptr
125 INTEGER(C_INT),
VALUE,
INTENT(IN) :: datatype
126 INTEGER(C_INT),
INTENT(IN) :: array_shape(5), dim_semantics(5)
134 CHARACTER(len=*),
INTENT(IN) :: name
135 INTEGER,
INTENT(IN) :: id
139 desc%name = trim(adjustl(name))
156 desc%id = desc_ftn%id
157 CALL convert_f_string(trim(desc_ftn%name), desc%name)
165 LOGICAL :: l_name, l_domain
167 l_domain = (var_descriptor1%id == var_descriptor2%id)
170 l_name = (var_descriptor1%name == var_descriptor2%name)
183 REAL(dp),
POINTER,
INTENT(INOUT) :: ptr(:,:,:,:,:)
185 CALL c_f_pointer(this%var_item%cptr, ptr, this%var_item%array_shape)
190 REAL(sp),
POINTER,
INTENT(INOUT) :: ptr(:,:,:,:,:)
192 CALL c_f_pointer(this%var_item%cptr, ptr, this%var_item%array_shape)
197 INTEGER(C_INT),
POINTER,
INTENT(INOUT) :: ptr(:,:,:,:,:)
199 CALL c_f_pointer(this%var_item%cptr, ptr, this%var_item%array_shape)
205 INTEGER :: array_shape(5)
206 array_shape = this%var_item%array_shape
219 LOGICAL :: lcontainer
220 lcontainer = this%var_item%lcontainer
226 INTEGER :: ncontained
227 ncontained = this%var_item%ncontained
231 result(dim_semantics)
233 INTEGER :: dim_semantics(5)
234 dim_semantics = this%var_item%dim_semantics
241 valid =
ASSOCIATED(this%var_item)
250 REAL(dp),
POINTER :: slice(:,:,:)
251 REAL(dp),
POINTER :: tmp_ptr(:,:,:,:,:)
255 IF (var%lcontainer())
THEN
257 &
" ERROR: Attempt to convert container variable into 3D field.")
260 CALL var%get_ptr(tmp_ptr)
262 pos_jn = findloc(var%dim_semantics(), comin_dim_semantics_container, dim=1)
265 slice => tmp_ptr(1, :, :, :, 1)
267 slice => tmp_ptr(:, 1, :, :, 1)
269 slice => tmp_ptr(:, :, 1, :, 1)
271 slice => tmp_ptr(:, :, :, 1, 1)
281 REAL(sp),
POINTER :: slice(:,:,:)
282 REAL(sp),
POINTER :: tmp_ptr(:,:,:,:,:)
286 IF (var%lcontainer())
THEN
288 &
" ERROR: Attempt to convert container variable into 3D field.")
291 CALL var%get_ptr(tmp_ptr)
293 pos_jn = findloc(var%dim_semantics(), comin_dim_semantics_container, dim=1)
296 slice => tmp_ptr(1, :, :, :, 1)
298 slice => tmp_ptr(:, 1, :, :, 1)
300 slice => tmp_ptr(:, :, 1, :, 1)
302 slice => tmp_ptr(:, :, :, 1, 1)
312 INTEGER(C_INT),
POINTER :: slice(:,:,:)
313 INTEGER(C_INT),
POINTER :: tmp_ptr(:,:,:,:,:)
317 IF (var%lcontainer())
THEN
319 &
" ERROR: Attempt to convert container variable into 3D field.")
322 CALL var%get_ptr(tmp_ptr)
324 pos_jn = findloc(var%dim_semantics(), comin_dim_semantics_container, dim=1)
327 slice => tmp_ptr(1, :, :, :, 1)
329 slice => tmp_ptr(:, 1, :, :, 1)
331 slice => tmp_ptr(:, :, 1, :, 1)
333 slice => tmp_ptr(:, :, :, 1, 1)
339 TYPE(c_ptr),
INTENT(IN) :: cptr
341 var%var_item%cptr = cptr
343 var%var_item%device_ptr = acc_deviceptr(cptr)
void comin_plugin_finish(const char *routine, const char *text)
Variable pointer. Fortran interface for accessing variables.
subroutine comin_var_to_3d_sp(var, slice)
Convenience operation for accessing 2D/3D fields.
integer, parameter wp
working precision
subroutine comin_var_to_3d_i(var, slice)
Convenience operation for accessing 2D/3D fields.
subroutine, public comin_plugin_finish(routine, text)
Wrapper function for callback to ICON's "finish" routine.
subroutine comin_var_to_3d_dp(var, slice)
Convenience operation for accessing 2D/3D fields.
@ comin_dim_semantics_container
@ comin_dim_semantics_undef
@ comin_hgrid_unstructured_cell
subroutine, public convert_f_string(string, arr)
Convert Fortran string into C-style character array.
integer function, dimension(5) comin_var_get_dim_semantics(this)
type(t_comin_var_handle) function comin_var_ptr_init(var_item)
integer function, dimension(5) comin_var_get_array_shape(this)
subroutine comin_var_get_ptr_dp(this, ptr)
type(t_comin_var_descriptor) function create_comin_var_descriptor_from_c(desc_c)
Create a variable descriptor from a C structure.
logical function comin_var_get_lcontainer(this)
integer function comin_var_get_ncontained(this)
type(t_comin_var_descriptor_c) function create_comin_var_descriptor_from_ftn(desc_ftn)
Create a variable descriptor (C version) from a Fortran structure.
logical function comin_var_descr_match(var_descriptor1, var_descriptor2)
compare two variable descriptors.
subroutine comin_var_handle_set_cptr(var, cptr)
type(t_comin_var_descriptor) function comin_var_get_descriptor(this)
subroutine comin_var_get_ptr_i(this, ptr)
type(t_comin_var_descriptor) function create_comin_var_descriptor(name, id)
Create a variable descriptor from a variable name and id.
subroutine comin_var_get_ptr_sp(this, ptr)
logical function comin_var_get_valid(this)