14 USE iso_c_binding,
ONLY : c_int
17 , t_comin_var_descriptor &
18 , t_comin_var_handle &
19 , comin_descrdata_get_domain &
20 , t_comin_descrdata_domain &
21 , comin_descrdata_get_global &
22 , t_comin_descrdata_global &
23 , t_comin_setup_version_info &
24 , comin_setup_get_version &
25 , ep_secondary_constructor &
27 , ep_atm_write_output_before &
29 , comin_parallel_get_host_mpi_rank &
30 , comin_current_get_domain_id &
31 , comin_parallel_get_plugin_mpi_comm &
32 , comin_domain_outside_loop &
33 , t_comin_plugin_info &
34 , comin_current_get_plugin_info &
35 , comin_plugin_finish &
36 , comin_metadata_get &
37 , comin_error_check, comin_print_info &
39 USE yaxt,
ONLY: xt_redist, xi => xt_int_kind
43 CHARACTER(LEN=*),
PARAMETER ::
pluginname =
"yaxt_fortran_plugin"
46 INTEGER,
PARAMETER ::
wp = selected_real_kind(12,307)
47 TYPE(t_comin_setup_version_info) ::
version
49 TYPE(t_comin_var_handle) ::
temp
51 CHARACTER(LEN=:),
ALLOCATABLE ::
units
54 TYPE(t_comin_descrdata_domain),
POINTER ::
p_patch
55 TYPE(t_comin_descrdata_global),
POINTER ::
p_global
58 TYPE(xt_redist) :: yaxt_redist
69 USE yaxt,
ONLY: xt_initialize, xt_idxlist, xt_idxlist_delete &
70 , xt_xmap, xt_xmap_delete, xt_idxstripes_new, xt_idxvec_new &
71 , xt_stripe, xt_idxempty_new, xt_xmap_all2all_new &
72 , xt_redist_p2p_new, xt_initialized
73 USE mpi,
ONLY: mpi_double_precision
75 CHARACTER(LEN=*),
PARAMETER :: substr =
'comin_main (yaxt_fortran_plugin)'
76 TYPE(t_comin_plugin_info) :: this_plugin
78 TYPE(xt_idxlist) :: src_idxlist, tgt_idxlist
80 INTEGER(kind=xi),
DIMENSION(:),
ALLOCATABLE :: idxvec, idxmap
84 rank = comin_parallel_get_host_mpi_rank()
85 CALL comin_print_info(
"setup")
88 version = comin_setup_get_version()
89 IF (
version%version_no_major > 1)
THEN
90 CALL comin_plugin_finish(substr,
"incompatible ComIn library version!")
94 CALL comin_current_get_plugin_info(this_plugin)
95 WRITE (
text,
'(a,a,a,i4)')
" plugin " &
96 , trim(this_plugin%name),
" has id: ", this_plugin%id
97 CALL comin_print_info(
text)
103 CALL comin_callback_register(ep_secondary_constructor &
105 CALL comin_callback_register(ep_atm_write_output_before &
107 CALL comin_callback_register(ep_destructor &
111 p_patch => comin_descrdata_get_domain(1)
112 p_global => comin_descrdata_get_global()
115 p_all_comm = comin_parallel_get_plugin_mpi_comm()
116 IF (.NOT. xt_initialized())
THEN
117 CALL comin_print_info(
"Initialize yaxt...")
118 CALL xt_initialize(p_all_comm)
124 idxmap = reshape(
p_patch%cells%decomp_domain &
125 , (/
SIZE(
p_patch%cells%decomp_domain) /))
127 idxvec = int(pack( [(k,k=1,
p_patch%cells%ncells)], idxmap == 0 ), xi)
129 idxvec =
p_patch%cells%glb_index(idxvec)
131 src_idxlist = xt_idxvec_new(idxvec)
134 tgt_idxlist = xt_idxstripes_new( &
135 (/ xt_stripe(1, 1,
p_patch%cells%ncells_global) /))
138 tgt_idxlist = xt_idxempty_new()
142 xmap = xt_xmap_all2all_new(src_idxlist, tgt_idxlist, p_all_comm)
145 yaxt_redist = xt_redist_p2p_new(xmap, mpi_double_precision)
148 CALL xt_xmap_delete(xmap)
149 CALL xt_idxlist_delete(src_idxlist)
150 CALL xt_idxlist_delete(tgt_idxlist)
161 USE yaxt,
ONLY: xt_idxlist, xt_idxlist_delete &
162 , xt_xmap, xt_xmap_delete &
165 CHARACTER(LEN=*),
PARAMETER :: substr =
'yaxt_fortran_constructor (yaxt_fortran_plugin)'
166 TYPE(t_comin_var_descriptor) :: var_desc
168 CALL comin_print_info(
"secondary constructor")
170 CALL comin_print_info(
"request temperature")
171 var_desc = t_comin_var_descriptor(
'temp', 1)
172 CALL comin_var_get([ep_atm_write_output_before], &
173 var_desc, comin_flag_read,
temp)
175 CALL comin_metadata_get(var_desc,
'units',
units)
184 USE yaxt,
ONLY: xt_redist_s_exchange1
185 USE iso_c_binding,
ONLY: c_loc
187 CHARACTER(LEN=*),
PARAMETER :: substr =
'yaxt_fortran_gather (yaxt_fortran_plugin)'
188 TYPE(t_comin_plugin_info) :: this_plugin
190 REAL(kind=
wp),
DIMENSION(:,:),
POINTER :: src
191 REAL(kind=
wp),
DIMENSION(:,:,:),
POINTER :: src3d
192 REAL(kind=
wp),
DIMENSION(:),
POINTER :: tgt, area
194 CALL comin_print_info(
"callback before output")
197 CALL comin_current_get_plugin_info(this_plugin)
199 domain_id = comin_current_get_domain_id()
200 IF (domain_id == comin_domain_outside_loop)
THEN
201 CALL comin_print_debug(
"currently not in domain loop")
203 WRITE(
text,
'(a,a,i0)')
"currently on domain ", domain_id
204 CALL comin_print_debug(
text)
208 NULLIFY(src, src3d, tgt, area)
210 CALL temp%to_3d(src3d)
214 src(:,:) = src3d(:,
p_patch%nlev,:)
217 ALLOCATE(tgt(
p_patch%cells%ncells_global))
218 ALLOCATE(area(
p_patch%cells%ncells_global))
221 CALL xt_redist_s_exchange1(yaxt_redist, c_loc(src), c_loc(tgt))
222 CALL xt_redist_s_exchange1(yaxt_redist, c_loc(
p_patch%cells%area) &
226 WRITE(0,*) substr,
': global average temperature is ' &
227 , sum(tgt*area)/sum(area), trim(
units)
241 USE yaxt,
ONLY: xt_finalize, xt_redist_delete
243 CALL comin_print_info(
"destructor")
246 CALL xt_redist_delete(yaxt_redist)
Example plugin for the ICON Community Interface (ComIn)
integer, parameter wp
working precision (will be compared to ComIn's and ICON's)
subroutine yaxt_fortran_constructor()
type(t_comin_descrdata_global), pointer p_global
type(t_comin_setup_version_info) version
type(t_comin_var_handle) temp
subroutine yaxt_fortran_destructor()
character(len=:), allocatable units
subroutine yaxt_fortran_gather()
character(len= *), parameter pluginname
type(t_comin_descrdata_domain), pointer p_patch
access descriptive data structures