73 USE yaxt,
ONLY: xt_initialize, xt_idxlist, xt_idxlist_delete &
74 , xt_xmap, xt_xmap_delete, xt_idxstripes_new, xt_idxvec_new &
75 , xt_stripe, xt_idxempty_new, xt_xmap_dist_dir_new &
76 , xt_redist_p2p_new, xt_initialized, xi => xt_int_kind
77 USE mpi,
ONLY: mpi_double_precision
79 CHARACTER(LEN=*),
PARAMETER :: substr =
'comin_main (yaxt_nest_fortran_plugin)'
80 TYPE(t_comin_plugin_info) :: this_plugin
81 TYPE(t_comin_var_descriptor) :: temp_d
83 TYPE(xt_idxlist) :: src_idxlist, tgt_idxlist
85 INTEGER :: ii, ic, cid
86 INTEGER,
DIMENSION(:),
ALLOCATABLE :: src_indices, parent_indices, tgt_indices
89 rank = comin_parallel_get_host_mpi_rank()
90 CALL comin_print_info(
"setup")
93 version = comin_setup_get_version()
94 IF (
version%version_no_major > 1)
THEN
95 CALL comin_plugin_finish(substr,
"incompatible ComIn library version!")
99 CALL comin_current_get_plugin_info(this_plugin)
100 WRITE (
text,
'(a,a,a,i4)')
" plugin " &
101 , trim(this_plugin%name),
" has id: ", this_plugin%id
102 CALL comin_print_info(
text)
108 CALL comin_callback_register(ep_secondary_constructor &
110 CALL comin_callback_register(ep_atm_integrate_end &
112 CALL comin_callback_register(ep_destructor &
116 p_global => comin_descrdata_get_global()
120 CALL comin_plugin_finish(substr,
"only applicable for nested domain setups")
124 p_patch(ii)%ptr => comin_descrdata_get_domain(ii)
128 p_all_comm = comin_parallel_get_plugin_mpi_comm()
129 IF (.NOT. xt_initialized())
THEN
130 CALL comin_print_info(
"Initialize yaxt...")
131 CALL xt_initialize(p_all_comm)
135 ALLOCATE (yaxt_redist(
n_dom))
137 DO ic = 1,
p_patch(ii)%ptr%n_childdom
138 cid =
p_patch(ii)%ptr%child_id(ic)
139 ALLOCATE (src_indices(count(
p_patch(ii)%ptr%cells%decomp_domain == 0)))
140 ALLOCATE (parent_indices(
SIZE(
p_patch(cid)%ptr%cells%parent_glb_idx)))
141 ALLOCATE (tgt_indices(count(
p_patch(cid)%ptr%cells%decomp_domain >= 0)))
144 src_indices = merge(
p_patch(ii)%ptr%cells%glb_index, -1_xi &
145 & , reshape(
p_patch(ii)%ptr%cells%child_id &
146 & , (/
SIZE(
p_patch(ii)%ptr%cells%child_id)/)) == cid)
148 parent_indices =
idx_1d(reshape(
p_patch(cid)%ptr%cells%parent_glb_idx &
149 & , (/
SIZE(
p_patch(cid)%ptr%cells%parent_glb_idx)/)) &
150 & , reshape(
p_patch(cid)%ptr%cells%parent_glb_blk &
151 & , (/
SIZE(
p_patch(cid)%ptr%cells%parent_glb_blk)/)))
153 tgt_indices = pack(parent_indices &
154 & , reshape(
p_patch(cid)%ptr%cells%decomp_domain &
155 & , (/
SIZE(
p_patch(cid)%ptr%cells%decomp_domain)/)) >= 0)
157 src_idxlist = xt_idxvec_new(src_indices,
SIZE(src_indices, 1))
158 tgt_idxlist = xt_idxvec_new(tgt_indices,
SIZE(tgt_indices, 1))
161 xmap = xt_xmap_dist_dir_new(src_idxlist, tgt_idxlist, p_all_comm)
164 yaxt_redist(cid) = xt_redist_p2p_new(xmap, mpi_double_precision)
167 CALL xt_xmap_delete(xmap)
168 CALL xt_idxlist_delete(src_idxlist)
169 CALL xt_idxlist_delete(tgt_idxlist)
170 DEALLOCATE (src_indices, parent_indices, tgt_indices)
173 temp_d = t_comin_var_descriptor(id=ii, name=
"temp_yaxt_diag")
174 CALL comin_var_request_add(temp_d, .true.)
175 CALL comin_metadata_set(temp_d,
"zaxis_id", comin_zaxis_2d)
176 CALL comin_metadata_set(temp_d,
"tracer", .false.)
177 CALL comin_metadata_set(temp_d,
"restart", .false.)
178 CALL comin_metadata_set(temp_d,
"units",
"K")
188 USE yaxt,
ONLY: xt_idxlist, xt_idxlist_delete &
189 , xt_xmap, xt_xmap_delete &
194 CALL comin_print_info(
"secondary constructor")
198 CALL comin_print_info(
"request temperature")
199 CALL comin_var_get([ep_atm_integrate_end], &
200 & t_comin_var_descriptor(name=
'temp', id=ii), comin_flag_read,
temp(ii))
201 CALL comin_print_info(
"request diagnostic temperature")
202 pid =
p_patch(ii)%ptr%parent_id
204 CALL comin_var_get([ep_atm_integrate_end], &
205 & t_comin_var_descriptor(name=
'temp_yaxt_diag', id=ii), comin_flag_write,
temp_diag(ii))
214 USE yaxt,
ONLY: xt_redist_s_exchange1
215 USE iso_c_binding,
ONLY: c_loc
217 INTEGER :: domain_id, pid
218 REAL(kind=
wp),
DIMENSION(:,:),
POINTER :: src
219 REAL(kind=
wp),
DIMENSION(:, :, :),
POINTER :: temp3d, tgt
221 CALL comin_print_info(
"callback before output")
223 domain_id = comin_current_get_domain_id()
224 IF (domain_id == comin_domain_outside_loop)
THEN
225 CALL comin_print_debug(
"currently not in domain loop")
228 WRITE (
text,
'(a,a,i0)')
"currently on domain ", domain_id
229 CALL comin_print_debug(
text)
232 pid =
p_patch(domain_id)%ptr%parent_id
238 CALL temp(pid)%to_3d(temp3d)
241 src(:,:) = temp3d(:,
p_patch(pid)%ptr%nlev,:)
244 CALL xt_redist_s_exchange1(yaxt_redist(domain_id), c_loc(src), c_loc(tgt))
246 WRITE(
text,
'(a,2(1x,f7.3))')
': min/max temperature src' &
247 , minval(pack(src, src > 0._wp)), maxval(pack(src, src > 0._wp))
248 CALL comin_print_info(
text)
249 WRITE(
text,
'(a,2(1x,f7.3))')
': min/max temperature tgt' &
250 , minval(pack(tgt, tgt > 0._wp)), maxval(pack(tgt, tgt > 0._wp))
251 CALL comin_print_info(
text)