17 INTEGER,
DIMENSION(:),
INTENT(IN) :: kwork
18 INTEGER,
DIMENSION(:),
INTENT(OUT) :: kwork2
20 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: kmask
26 INTEGER,
DIMENSION(:,:),
INTENT(IN) :: kwork
27 INTEGER,
DIMENSION(:,:),
INTENT(OUT) :: kwork2
29 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: kmask
35 REAL,
DIMENSION(:),
INTENT(IN) :: pwork
36 REAL(KIND=8),
DIMENSION(:),
INTENT(OUT) :: pwork2
38 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: kmask
44 REAL,
DIMENSION(:,:),
INTENT(IN) :: pwork
45 REAL(KIND=8),
DIMENSION(:,:),
INTENT(OUT) :: pwork2
47 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: kmask
53 REAL,
DIMENSION(:),
INTENT(IN) :: pwork
54 REAL(KIND=4),
DIMENSION(:),
INTENT(OUT) :: pwork2
56 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: kmask
62 REAL,
DIMENSION(:,:),
INTENT(IN) :: pwork
63 REAL(KIND=4),
DIMENSION(:,:),
INTENT(OUT) :: pwork2
65 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: kmask
76 xtime_calc_write, xtime_comm_write, &
82 USE yomhook
,ONLY : lhook, dr_hook
83 USE parkind1
,ONLY : jprb
91 INTEGER,
DIMENSION(:),
INTENT(IN) :: kwork
92 INTEGER,
DIMENSION(:),
INTENT(OUT) :: kwork2
94 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: kmask
96 INTEGER,
DIMENSION(NSIZE) :: iinter
100 INTEGER,
DIMENSION(MPI_STATUS_SIZE) :: istatus
103 INTEGER :: i,j, ip1, is1
106 REAL(KIND=JPRB) :: zhook_handle
108 IF (lhook) CALL dr_hook(
'GATHER_AND_WRITE_MPI_N1D',0,zhook_handle)
112 nwork(nindx1sfx:nindx2sfx) = 0
118 IF (present(kmask))
THEN
121 nwork(nindx1sfx:nindx2sfx) = kwork(:)
125 xtime_calc_write = xtime_calc_write + (mpi_wtime() - xtime0)
133 xtime_omp_barr = xtime_omp_barr + (mpi_wtime() - xtime0)
136 IF (nrank/=npio)
THEN
144 CALL mpi_send(nwork,
SIZE(nwork)*kind(nwork)/4,mpi_integer,npio,idx_w,ncomm,infompi)
145 xtime_comm_write = xtime_comm_write + (mpi_wtime() - xtime0)
156 is1 =
SIZE(nwork_full)
159 DEALLOCATE(nwork_full)
160 ALLOCATE(nwork_full(ip1))
175 CALL mpi_recv(iinter,
SIZE(iinter)*kind(iinter)/4,mpi_integer,i,idx_w,ncomm,istatus,infompi)
178 iinter(1:
SIZE(nwork)) = nwork(:)
182 xtime_comm_write = xtime_comm_write + (mpi_wtime() - xtime0)
191 IF ( nindex(j)==mod(i,nproc) )
THEN
193 nwork_full(j) = iinter(icpt)
199 xtime_calc_write = xtime_calc_write + (mpi_wtime() - xtime0)
206 kwork2(:) = nwork_full(1:ip1)
210 IF (lhook) CALL dr_hook(
'GATHER_AND_WRITE_MPI_N1D',1,zhook_handle)
219 USE modd_surfex_mpi, ONLY : nindex, nproc, nrank, ncomm, npio, nsize, &
220 xtime_calc_write, xtime_comm_write, &
226 USE yomhook
,ONLY : lhook, dr_hook
227 USE parkind1
,ONLY : jprb
235 INTEGER,
DIMENSION(:,:),
INTENT(IN) :: kwork
236 INTEGER,
DIMENSION(:,:),
INTENT(OUT) :: kwork2
238 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: kmask
240 INTEGER,
DIMENSION(NSIZE,SIZE(KWORK2,2)) :: iinter
244 INTEGER,
DIMENSION(MPI_STATUS_SIZE) :: istatus
246 INTEGER :: icpt, ix2, is1, is2, ip1, ip2
250 REAL(KIND=JPRB) :: zhook_handle
252 IF (lhook) CALL dr_hook(
'GATHER_AND_WRITE_MPI_N2D',0,zhook_handle)
261 ALLOCATE(nwork2(nsize,ip2))
266 nwork2(nindx1sfx:nindx2sfx,1:ip2) = 0
272 IF (
SIZE(kwork,1)>0)
THEN
273 IF (present(kmask))
THEN
276 nwork2(nindx1sfx:nindx2sfx,1:ip2) = kwork(:,:)
281 xtime_calc_write = xtime_calc_write + (mpi_wtime() - xtime0)
289 xtime_omp_barr = xtime_omp_barr + (mpi_wtime() - xtime0)
292 IF (nrank/=npio)
THEN
300 CALL mpi_send(nwork2(:,1:ip2),nsize*ip2*kind(nwork2)/4,mpi_integer,npio,idx_w,ncomm,infompi)
301 xtime_comm_write = xtime_comm_write + (mpi_wtime() - xtime0)
312 is1 =
SIZE(nwork2_full,1)
313 is2 =
SIZE(nwork2_full,2)
315 IF (ip1>is1 .OR. ip2>is2)
THEN
316 DEALLOCATE(nwork2_full)
317 ALLOCATE(nwork2_full(max(ip1,is1),max(ip2,is2)))
332 CALL mpi_recv(iinter,
SIZE(iinter)*kind(iinter)/4,mpi_integer,i,idx_w,ncomm,istatus,infompi)
335 iinter(:,:) = nwork2(:,1:ip2)
339 xtime_comm_write = xtime_comm_write + (mpi_wtime() - xtime0)
348 IF ( nindex(j)==mod(i,nproc) )
THEN
350 nwork2_full(j,1:ip2) = iinter(icpt,:)
356 xtime_calc_write = xtime_calc_write + (mpi_wtime() - xtime0)
363 kwork2(:,:) = nwork2_full(1:ip1,1:ip2)
367 IF (lhook) CALL dr_hook(
'GATHER_AND_WRITE_MPI_N2D',1,zhook_handle)
380 USE yomhook
,ONLY : lhook, dr_hook
381 USE parkind1
,ONLY : jprb
385 REAL,
DIMENSION(:),
INTENT(IN) :: pwork
386 REAL(KIND=8),
DIMENSION(:),
INTENT(OUT) :: pwork2
387 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: kmask
389 REAL,
DIMENSION(SIZE(PWORK2)) :: zinter
390 REAL(KIND=JPRB) :: zhook_handle
392 IF (lhook) CALL dr_hook(
'GATHER_AND_WRITE_MPI_X1D',0,zhook_handle)
394 IF (present(kmask))
THEN
400 IF (nrank==npio)
THEN
401 pwork2(:) = zinter(:)
404 IF (lhook) CALL dr_hook(
'GATHER_AND_WRITE_MPI_X1D',1,zhook_handle)
416 USE yomhook
,ONLY : lhook, dr_hook
417 USE parkind1
,ONLY : jprb
421 REAL,
DIMENSION(:,:),
INTENT(IN) :: pwork
422 REAL(KIND=8),
DIMENSION(:,:),
INTENT(OUT) :: pwork2
423 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: kmask
425 REAL,
DIMENSION(SIZE(PWORK2,1),SIZE(PWORK2,2)) :: zinter
426 REAL(KIND=JPRB) :: zhook_handle
428 IF (lhook) CALL dr_hook(
'GATHER_AND_WRITE_MPI_X2D',0,zhook_handle)
430 IF (present(kmask))
THEN
436 IF (nrank==npio)
THEN
437 pwork2(:,:) = zinter(:,:)
440 IF (lhook) CALL dr_hook(
'GATHER_AND_WRITE_MPI_X2D',1,zhook_handle)
452 USE yomhook
,ONLY : lhook, dr_hook
453 USE parkind1
,ONLY : jprb
457 REAL,
DIMENSION(:),
INTENT(IN) :: pwork
458 REAL(KIND=4),
DIMENSION(:),
INTENT(OUT) :: pwork2
459 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: kmask
461 REAL,
DIMENSION(SIZE(PWORK2)) :: zinter
462 REAL(KIND=JPRB) :: zhook_handle
464 IF (lhook) CALL dr_hook(
'GATHER_AND_WRITE_MPI_X1DK4',0,zhook_handle)
466 IF (present(kmask))
THEN
472 IF (nrank==npio)
THEN
473 pwork2(:) = zinter(:)
476 IF (lhook) CALL dr_hook(
'GATHER_AND_WRITE_MPI_X1DK4',1,zhook_handle)
488 USE yomhook
,ONLY : lhook, dr_hook
489 USE parkind1
,ONLY : jprb
493 REAL,
DIMENSION(:,:),
INTENT(IN) :: pwork
494 REAL(KIND=4),
DIMENSION(:,:),
INTENT(OUT) :: pwork2
495 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: kmask
497 REAL,
DIMENSION(SIZE(PWORK2,1),SIZE(PWORK2,2)) :: zinter
498 REAL(KIND=JPRB) :: zhook_handle
500 IF (lhook) CALL dr_hook(
'GATHER_AND_WRITE_MPI_X2DK4',0,zhook_handle)
502 IF (present(kmask))
THEN
508 IF (nrank==npio)
THEN
509 pwork2(:,:) = zinter(:,:)
512 IF (lhook) CALL dr_hook(
'GATHER_AND_WRITE_MPI_X2DK4',1,zhook_handle)
subroutine gather_and_write_mpi_x2d(PWORK, PWORK2, KMASK)
subroutine gather_and_write_mpi_n1d(KWORK, KWORK2, KMASK)
subroutine gather_and_write_mpi_n2d(KWORK, KWORK2, KMASK)
subroutine gather_and_write_mpi_x1dk4(PWORK, PWORK2, KMASK)
subroutine wlog_mpi(HLOG, PLOG, KLOG, KLOG2, OLOG)
subroutine gather_and_write_mpi_x2dk4(PWORK, PWORK2, KMASK)
subroutine gather_and_write_mpi_x1d(PWORK, PWORK2, KMASK)