17 REAL,
DIMENSION(:),
INTENT(IN) :: pwork
18 REAL,
DIMENSION(:),
INTENT(OUT) :: pwork2
20 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: kmask
26 REAL,
DIMENSION(:,:),
INTENT(IN) :: pwork
27 REAL,
DIMENSION(:,:),
INTENT(OUT) :: pwork2
29 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: kmask
42 xtime_comm_write, xtime_calc_write, &
50 USE yomhook
,ONLY : lhook, dr_hook
51 USE parkind1
,ONLY : jprb
59 REAL,
DIMENSION(:),
INTENT(IN) :: pwork
60 REAL,
DIMENSION(:),
INTENT(OUT) :: pwork2
62 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: kmask
64 REAL,
DIMENSION(NSIZE) :: zinter
68 INTEGER,
DIMENSION(MPI_STATUS_SIZE) :: istatus
71 INTEGER :: i,j, ip1, is1
74 REAL(KIND=JPRB) :: zhook_handle
77 IF (lhook) CALL dr_hook(
'GATHER_AND_WRITE_MPI_X1D0',0,zhook_handle)
79 xwork(nindx1sfx:nindx2sfx) = xundef
85 IF (
SIZE(pwork)>0)
THEN
86 IF (present(kmask))
THEN
89 xwork(nindx1sfx:nindx2sfx) = pwork(:)
94 xtime_calc_write = xtime_calc_write + (mpi_wtime() - xtime0)
102 xtime_omp_barr = xtime_omp_barr + (mpi_wtime() - xtime0)
105 IF (nrank/=npio)
THEN
113 CALL mpi_send(xwork,
SIZE(xwork)*kind(xwork)/4,mpi_real,npio,idx_w,ncomm,infompi)
114 xtime_comm_write = xtime_comm_write + (mpi_wtime() - xtime0)
125 is1 =
SIZE(xwork_full)
128 DEALLOCATE(xwork_full)
129 ALLOCATE(xwork_full(ip1))
144 CALL mpi_recv(zinter,
SIZE(zinter)*kind(zinter)/4,mpi_real,i,idx_w,ncomm,istatus,infompi)
147 zinter(1:
SIZE(xwork)) = xwork(:)
151 xtime_comm_write = xtime_comm_write + (mpi_wtime() - xtime0)
160 IF ( nindex(j)==mod(i,nproc) )
THEN
162 xwork_full(j) = zinter(icpt)
168 xtime_calc_write = xtime_calc_write + (mpi_wtime() - xtime0)
175 pwork2 = xwork_full(1:ip1)
180 IF (lhook) CALL dr_hook(
'GATHER_AND_WRITE_MPI_X1D0',1,zhook_handle)
190 USE modd_surfex_mpi, ONLY : nindex, nproc, nrank, ncomm, npio, nsize, &
191 xtime_comm_write, xtime_omp_barr, &
193 USE modd_surfex_omp, ONLY : nindx1sfx, nindx2sfx, xwork2, xwork2_full, nblock
197 USE yomhook
,ONLY : lhook, dr_hook
198 USE parkind1
,ONLY : jprb
206 REAL,
DIMENSION(:,:),
INTENT(IN) :: pwork
207 REAL,
DIMENSION(:,:),
INTENT(OUT) :: pwork2
209 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: kmask
211 REAL,
DIMENSION(NSIZE,SIZE(PWORK2,2)) :: zinter
215 INTEGER,
DIMENSION(MPI_STATUS_SIZE) :: istatus
217 INTEGER :: icpt, ix2, is1, is2, ip1, ip2
221 REAL(KIND=JPRB) :: zhook_handle
224 IF (lhook) CALL dr_hook(
'GATHER_AND_WRITE_MPI_X2D0',0,zhook_handle)
233 ALLOCATE(xwork2(nsize,ip2))
238 xwork2(nindx1sfx:nindx2sfx,1:ip2) = xundef
244 IF (
SIZE(pwork,1)>0)
THEN
245 IF (present(kmask))
THEN
248 xwork2(nindx1sfx:nindx2sfx,1:ip2) = pwork(:,:)
253 xtime_calc_write = xtime_calc_write + (mpi_wtime() - xtime0)
261 xtime_omp_barr = xtime_omp_barr + (mpi_wtime() - xtime0)
264 IF (nrank/=npio)
THEN
272 CALL mpi_send(xwork2(:,1:ip2),nsize*ip2*kind(xwork2)/4,mpi_real,npio,idx_w,ncomm,infompi)
273 xtime_comm_write = xtime_comm_write + (mpi_wtime() - xtime0)
284 is1 =
SIZE(xwork2_full,1)
285 is2 =
SIZE(xwork2_full,2)
287 IF (ip1>is1 .OR. ip2>is2)
THEN
288 DEALLOCATE(xwork2_full)
289 ALLOCATE(xwork2_full(max(ip1,is1),max(ip2,is2)))
292 xwork2_full(1:ip1,1:ip2) = 0.
304 CALL mpi_recv(zinter,
SIZE(zinter)*kind(zinter)/4,mpi_real,i,idx_w,ncomm,istatus,infompi)
307 zinter(:,:) = xwork2(:,1:ip2)
311 xtime_comm_write = xtime_comm_write + (mpi_wtime() - xtime0)
320 IF ( nindex(j)==mod(i,nproc) )
THEN
322 xwork2_full(j,1:ip2) = zinter(icpt,:)
328 xtime_calc_write = xtime_calc_write + (mpi_wtime() - xtime0)
335 pwork2(:,:) = xwork2_full(1:ip1,1:ip2)
339 IF (lhook) CALL dr_hook(
'GATHER_AND_WRITE_MPI_X2D0',1,zhook_handle)
subroutine gather_and_write_mpi_x2d0(PWORK, PWORK2, KMASK)
subroutine wlog_mpi(HLOG, PLOG, KLOG, KLOG2, OLOG)
subroutine gather_and_write_mpi_x1d0(PWORK, PWORK2, KMASK)