SURFEX v8.1
General documentation of Surfex
read_and_send_mpi.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
6 !
8 !
9 SUBROUTINE read_and_send_mpi_n1d(KWORK,KWORK2,KMASK,KPIO,KDX)
10 !
11 INTEGER, DIMENSION(:), INTENT(IN) :: KWORK
12 INTEGER, DIMENSION(:), INTENT(OUT) :: KWORK2
13 !
14 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: KMASK
15 INTEGER, INTENT(IN), OPTIONAL :: KPIO
16 INTEGER, INTENT(IN), OPTIONAL :: KDX
17 !
18 END SUBROUTINE read_and_send_mpi_n1d
19 !
20 SUBROUTINE read_and_send_mpi_n2d(KWORK,KWORK2,KMASK)
21 !
22 INTEGER, DIMENSION(:,:), INTENT(IN) :: KWORK
23 INTEGER, DIMENSION(:,:), INTENT(OUT) :: KWORK2
24 !
25 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: KMASK
26 !
27 END SUBROUTINE read_and_send_mpi_n2d
28 !
29 SUBROUTINE read_and_send_mpi_n3d(KWORK,KWORK2,KMASK,KPIO,KDX)
30 !
31 INTEGER, DIMENSION(:,:,:), INTENT(IN) :: KWORK
32 INTEGER, DIMENSION(:,:,:), INTENT(OUT) :: KWORK2
33 !
34 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: KMASK
35 INTEGER, INTENT(IN), OPTIONAL :: KPIO
36 INTEGER, INTENT(IN), OPTIONAL :: KDX
37 !
38 END SUBROUTINE read_and_send_mpi_n3d
39 !
40 SUBROUTINE read_and_send_mpi_x1d(PWORK,PWORK2,KMASK,KPIO,KDX)
41 !
42 REAL, DIMENSION(:), INTENT(IN) :: PWORK
43 REAL, DIMENSION(:), INTENT(OUT) :: PWORK2
44 !
45 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: KMASK
46 INTEGER, INTENT(IN), OPTIONAL :: KPIO
47 INTEGER, INTENT(IN), OPTIONAL :: KDX
48 !
49 END SUBROUTINE read_and_send_mpi_x1d
50 !
51 SUBROUTINE read_and_send_mpi_x2d(PWORK,PWORK2,KMASK,KPIO,KDX)
52 !
53 REAL, DIMENSION(:,:), INTENT(IN) :: PWORK
54 REAL, DIMENSION(:,:), INTENT(OUT) :: PWORK2
55 !
56 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: KMASK
57 INTEGER, INTENT(IN), OPTIONAL :: KPIO
58 INTEGER, INTENT(IN), OPTIONAL :: KDX
59 !
60 END SUBROUTINE read_and_send_mpi_x2d
61 !
62 SUBROUTINE read_and_send_mpi_x3d(PWORK,PWORK2,KMASK,KPIO,KDX)
63 !
64 REAL, DIMENSION(:,:,:), INTENT(IN) :: PWORK
65 REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWORK2
66 !
67 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: KMASK
68 INTEGER, INTENT(IN), OPTIONAL :: KPIO
69 INTEGER, INTENT(IN), OPTIONAL :: KDX
70 !
71 END SUBROUTINE read_and_send_mpi_x3d
72 !
73 END INTERFACE
74 !
75 END MODULE modi_read_and_send_mpi
76 !
77 SUBROUTINE read_and_send_mpi_n1d(KWORK,KWORK2,KMASK,KPIO,KDX)
78 !
79 USE modd_surfex_mpi, ONLY : nindex, nproc, nrank, ncomm, npio, nsize, nreq, &
81 !
83 !
84 USE yomhook ,ONLY : lhook, dr_hook
85 USE parkind1 ,ONLY : jprb
86 !
87 IMPLICIT NONE
88 !
89 #ifdef SFX_MPI
90 include "mpif.h"
91 #endif
92 !
93 INTEGER, DIMENSION(:), INTENT(IN) :: KWORK
94 INTEGER, DIMENSION(:), INTENT(OUT) :: KWORK2
95 !
96 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: KMASK
97 INTEGER, INTENT(IN), OPTIONAL :: KPIO
98 INTEGER, INTENT(IN), OPTIONAL :: KDX
99 !
100 INTEGER, DIMENSION(NSIZE,NPROC) :: IWORKS
101 INTEGER, DIMENSION(NSIZE) :: IWORKR
102 #ifdef SFX_MPI
103 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ISTATUS
104 INTEGER, DIMENSION(MPI_STATUS_SIZE,NPROC-1) :: ISTATUS2
105 #endif
106 INTEGER :: ICPT, IPIO, IDX, IREQ
107 INTEGER :: I,J
108 INTEGER :: INFOMPI
109 DOUBLE PRECISION :: XTIME0
110 !
111 REAL(KIND=JPRB) :: ZHOOK_HANDLE, ZHOOK_HANDLE_OMP
112 !
113 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N1D_1',0,zhook_handle)
114 !
115 IF (PRESENT(kpio)) THEN
116  ipio = kpio
117 ELSE
118  ipio = npio
119 ENDIF
120 !
121 IF (PRESENT(kdx)) THEN
122  idx = kdx
123 ELSE
124  idx = idx_r
125 ENDIF
126 !
127 IF (nrank==ipio) THEN
128  !
129  idx = idx + 1
130  !
131  IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N1D_1',1,zhook_handle)
132 !$OMP PARALLEL DO SCHEDULE(DYNAMIC,1) PRIVATE(I,ICPT,J,IREQ,INFOMPI,ZHOOK_HANDLE_OMP)
133  DO i=0,nproc-1
134  !
135  IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N1D_20',0,zhook_handle_omp)
136  !
137 #ifdef SFX_MPI
138  xtime0 = mpi_wtime()
139 #endif
140  !
141  icpt = 0
142  !
143  iworks(:,i+1) = 0
144  !
145  DO j=1,SIZE(nindex)
146  !
147  IF ( nindex(j)==i ) THEN
148  icpt = icpt + 1
149  iworks(icpt,i+1) = kwork(j)
150  ENDIF
151  !
152  ENDDO
153  !
154  IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N1D_20',1,zhook_handle_omp)
155  IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N1D_30',0,zhook_handle_omp)
156  !
157 #ifdef SFX_MPI
158  xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
159 #endif
160  !
161  IF (i/=ipio) THEN
162 
163 #ifdef SFX_MPI
164  xtime0 = mpi_wtime()
165 
166  IF (PRESENT(kpio) .AND.PRESENT(kdx)) THEN
167  IF (i<ipio) THEN
168  ireq = i+1
169  ELSE
170  ireq = i
171  ENDIF
172 
173  CALL mpi_isend(iworks(:,i+1),SIZE(iworks,1)*kind(iworks)/4,&
174  mpi_integer,i,idx,ncomm,nreq(ireq),infompi)
175  ELSE
176  CALL mpi_send(iworks(:,i+1),SIZE(iworks,1)*kind(iworks)/4,mpi_integer,i,idx,ncomm,infompi)
177  ENDIF
178  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
179 #endif
180 
181  ELSE
182  iworkr(:) = iworks(:,i+1)
183  ENDIF
184  IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N1D_30',1,zhook_handle_omp)
185  !
186  ENDDO
187 !$OMP END PARALLEL DO
188  !
189 ELSE
190  !
191  idx = idx + 1
192  !
193 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N1D_1',1,zhook_handle)
194 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N1D_2',0,zhook_handle)
195 #ifdef SFX_MPI
196  !
197  xtime0 = mpi_wtime()
198  CALL mpi_recv(iworkr,SIZE(iworkr)*kind(iworkr)/4,mpi_integer,ipio,idx,ncomm,istatus,infompi)
199  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
200 #endif
201  !
202  IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N1D_2',1,zhook_handle)
203  !
204 ENDIF
205 !
206  IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N1D_3',0,zhook_handle)
207 IF (PRESENT(kmask)) THEN
208  CALL pack_same_rank(kmask,iworkr(:),kwork2)
209 ELSE
210  kwork2(:) = iworkr(1:SIZE(kwork2))
211 ENDIF
212 !
213 IF (.NOT.PRESENT(kdx)) idx_r = idx_r + 1
214 !
215  IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N1D_3',1,zhook_handle)
216 !
217 END SUBROUTINE read_and_send_mpi_n1d
218 !
219 !**************************************************************************
220 !
221 SUBROUTINE read_and_send_mpi_n2d(KWORK,KWORK2,KMASK)
222 !
223 USE modd_surfex_mpi, ONLY : nindex, nproc, nrank, ncomm, npio, nsize, &
225 !
227 !
228 USE yomhook ,ONLY : lhook, dr_hook
229 USE parkind1 ,ONLY : jprb
230 !
231 IMPLICIT NONE
232 !
233 #ifdef SFX_MPI
234 include "mpif.h"
235 #endif
236 !
237 INTEGER, DIMENSION(:,:), INTENT(IN) :: KWORK
238 INTEGER, DIMENSION(:,:), INTENT(OUT) :: KWORK2
239 !
240 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: KMASK
241 !
242 INTEGER, DIMENSION(NSIZE,SIZE(KWORK2,2)) :: IWORKS
243 INTEGER, DIMENSION(NSIZE,SIZE(KWORK2,2)) :: IWORKR
244 !
245 #ifdef SFX_MPI
246 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ISTATUS
247 #endif
248 INTEGER :: IS2, IP2
249 INTEGER :: ICPT
250 INTEGER :: I,J, K
251 INTEGER :: INFOMPI
252 DOUBLE PRECISION :: XTIME0
253 !
254 REAL(KIND=JPRB) :: ZHOOK_HANDLE
255 !
256 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N2D',0,zhook_handle)
257 !
258 IF (nrank==npio) THEN
259  !
260  idx_r = idx_r + 1
261  !
262  DO i=0,nproc-1
263  !
264 #ifdef SFX_MPI
265  xtime0 = mpi_wtime()
266 #endif
267  !
268  icpt = 0
269  !
270  iworks(:,:) = 0
271  !
272  DO j=1,SIZE(nindex)
273  !
274  IF ( nindex(j)==mod(i,nproc) ) THEN
275  icpt = icpt + 1
276  iworks(icpt,:) = kwork(j,:)
277  ENDIF
278  !
279  ENDDO
280  !
281 #ifdef SFX_MPI
282  xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
283  !
284  IF (i/=npio) THEN
285  xtime0 = mpi_wtime()
286  CALL mpi_send(iworks(:,:),SIZE(iworks)*kind(iworks)/4,mpi_integer,i,idx_r,ncomm,infompi)
287  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
288  ELSE
289  iworkr(:,:) = iworks(:,:)
290  ENDIF
291 #endif
292  !
293  ENDDO
294  !
295 ELSE
296  !
297  idx_r = idx_r + 1
298  !
299 #ifdef SFX_MPI
300  iworks(:,:) = 0
301  !
302  xtime0 = mpi_wtime()
303  CALL mpi_recv(iworkr(:,:),SIZE(iworkr)*kind(iworkr)/4,mpi_integer,npio,idx_r,ncomm,istatus,infompi)
304  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
305 #endif
306  !
307 ENDIF
308 !
309 IF (PRESENT(kmask)) THEN
310  CALL pack_same_rank(kmask,iworkr(:,:),kwork2)
311 ELSE
312  kwork2(:,:) = iworkr(1:SIZE(kwork2,1),:)
313 ENDIF
314 !
315 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N2D',1,zhook_handle)
316 !
317 !
318 END SUBROUTINE read_and_send_mpi_n2d
319 !
320 !**************************************************************************
321 !
322 SUBROUTINE read_and_send_mpi_n3d(KWORK,KWORK2,KMASK,KPIO,KDX)
323 !
324 USE modd_surfex_mpi, ONLY : nindex, nproc, nrank, ncomm, npio, nsize, &
326  nreq
327 !
329 !
330 USE yomhook ,ONLY : lhook, dr_hook
331 USE parkind1 ,ONLY : jprb
332 !
333 IMPLICIT NONE
334 !
335 #ifdef SFX_MPI
336 include "mpif.h"
337 #endif
338 !
339 INTEGER, DIMENSION(:,:,:), INTENT(IN) :: KWORK
340 INTEGER, DIMENSION(:,:,:), INTENT(OUT) :: KWORK2
341 !
342 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: KMASK
343 INTEGER, INTENT(IN), OPTIONAL :: KPIO
344 INTEGER, INTENT(IN), OPTIONAL :: KDX
345 !
346 INTEGER, DIMENSION(NSIZE,SIZE(KWORK2,2),SIZE(KWORK2,3),NPROC) :: IWORK3S
347 INTEGER, DIMENSION(NSIZE,SIZE(KWORK2,2),SIZE(KWORK2,3)) :: IWORK3
348 #ifdef SFX_MPI
349 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ISTATUS
350 #endif
351 INTEGER :: IP2, IS2, IP3, IS3
352 INTEGER :: ICPT, IPIO, IDX
353 INTEGER :: I,J
354 INTEGER :: INFOMPI, IREQ
355 DOUBLE PRECISION :: XTIME0
356 !
357 REAL(KIND=JPRB) :: ZHOOK_HANDLE, ZHOOK_HANDLE_OMP
358 !
359 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N3D_1',0,zhook_handle)
360 !
361 IF (PRESENT(kpio)) THEN
362  ipio = kpio
363 ELSE
364  ipio = npio
365 ENDIF
366 !
367 IF (PRESENT(kdx)) THEN
368  idx = kdx
369 ELSE
370  idx = idx_r
371 ENDIF
372 !
373 IF (nrank==ipio) THEN
374  !
375  idx = idx + 1
376  !
377 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N3D_1',1,zhook_handle)
378 !$OMP PARALLEL DO PRIVATE(I,ICPT,J,INFOMPI,IREQ,ZHOOK_HANDLE_OMP)
379  DO i=0,nproc-1
380 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N3D_2',0,zhook_handle_omp)
381  !
382 #ifdef SFX_MPI
383  xtime0 = mpi_wtime()
384 #endif
385  !
386  icpt = 0
387  !
388  iwork3s(:,:,:,i+1) = 0.
389  !
390  DO j=1,SIZE(nindex)
391  !
392  IF ( nindex(j)==i ) THEN
393  icpt = icpt + 1
394  iwork3s(icpt,:,:,i+1) = kwork(j,:,:)
395  ENDIF
396  !
397  ENDDO
398 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N3D_2',1,zhook_handle_omp)
399 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N3D_3',0,zhook_handle_omp)
400  !
401 #ifdef SFX_MPI
402  xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
403 #endif
404  !
405  IF (i/=ipio) THEN
406 #ifdef SFX_MPI
407  IF (PRESENT(kpio).AND.PRESENT(kdx)) THEN
408  IF (i<ipio) THEN
409  ireq = i+1
410  ELSE
411  ireq = i
412  ENDIF
413  xtime0 = mpi_wtime()
414  CALL mpi_isend(iwork3s(:,:,:,i+1),SIZE(iwork3)*kind(iwork3)/4,&
415  mpi_integer,i,idx,ncomm,nreq(ireq),infompi)
416  ELSE
417  CALL mpi_send(iwork3s(:,:,:,i+1),SIZE(iwork3)*kind(iwork3)/4,&
418  mpi_integer,i,idx,ncomm,infompi)
419  ENDIF
420  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
421 #endif
422  ELSE
423  iwork3(:,:,:) = iwork3s(:,:,:,i+1)
424  ENDIF
425  !
426 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N3D_3',1,zhook_handle_omp)
427  ENDDO
428 !$OMP END PARALLEL DO
429  !
430 ELSE
431  !
432  idx = idx + 1
433  !
434 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N3D_1',1,zhook_handle)
435 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N3D_2',0,zhook_handle)
436 #ifdef SFX_MPI
437  !
438  xtime0 = mpi_wtime()
439  CALL mpi_recv(iwork3,SIZE(iwork3)*kind(iwork3)/4,mpi_integer,ipio,idx,ncomm,istatus,infompi)
440  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
441 #endif
442  !
443 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N3D_2',1,zhook_handle)
444  !
445 ENDIF
446 !
447 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N3D_4',0,zhook_handle)
448 IF (PRESENT(kmask)) THEN
449  CALL pack_same_rank(kmask,iwork3(:,:,:),kwork2)
450 ELSE
451  kwork2(:,:,:) = iwork3(1:SIZE(kwork2,1),:,:)
452 ENDIF
453 !
454 IF (.NOT.PRESENT(kdx)) idx_r = idx_r + 1
455 !
456 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N3D_4',1,zhook_handle)
457 !
458 END SUBROUTINE read_and_send_mpi_n3d
459 !**************************************************************************
460 !
461 SUBROUTINE read_and_send_mpi_x1d(PWORK,PWORK2,KMASK,KPIO,KDX)
462 !
463 USE modd_surfex_mpi, ONLY : nindex, nproc, nrank, ncomm, npio, nsize, nreq, &
465  nsize, xworks
466 !
468 !
469 USE yomhook ,ONLY : lhook, dr_hook
470 USE parkind1 ,ONLY : jprb
471 !
472 IMPLICIT NONE
473 !
474 #ifdef SFX_MPI
475 include "mpif.h"
476 #endif
477 !
478 REAL, DIMENSION(:), INTENT(IN) :: PWORK
479 REAL, DIMENSION(:), INTENT(OUT) :: PWORK2
480 !
481 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: KMASK
482 INTEGER, INTENT(IN), OPTIONAL :: KPIO
483 INTEGER, INTENT(IN), OPTIONAL :: KDX
484 !
485 REAL, DIMENSION(NSIZE,NPROC) :: ZWORKS
486 REAL, DIMENSION(NSIZE) :: ZWORKR
487 #ifdef SFX_MPI
488 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ISTATUS
489 #endif
490 INTEGER :: ICPT, IPIO, IDX
491 INTEGER :: I,J, IREQ
492 INTEGER :: INFOMPI
493 DOUBLE PRECISION :: XTIME0
494 !
495 REAL(KIND=JPRB) :: ZHOOK_HANDLE, ZHOOK_HANDLE_OMP
496 !
497 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X1D_1',0,zhook_handle)
498 !
499 !
500 IF (PRESENT(kpio)) THEN
501  ipio = kpio
502 ELSE
503  ipio = npio
504 ENDIF
505 !
506 IF (nrank==ipio.AND..NOT.ALLOCATED(xworks)) ALLOCATE(xworks(nsize,nproc))
507 !
508 IF (PRESENT(kdx)) THEN
509  idx = kdx
510 ELSE
511  idx = idx_r
512 ENDIF
513 !
514 IF (nrank==ipio) THEN
515  !
516  idx = idx + 1
517  !
518  IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X1D_1',1,zhook_handle)
519 !$OMP PARALLEL DO SCHEDULE(DYNAMIC,1) PRIVATE(I,ICPT,J,IREQ,INFOMPI,ZHOOK_HANDLE_OMP)
520  DO i=0,nproc-1
521 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X1D_2',0,zhook_handle_omp)
522  !
523 #ifdef SFX_MPI
524  xtime0 = mpi_wtime()
525 #endif
526  !
527  icpt = 0
528  !
529  xworks(:,i+1) = 0.
530  !
531  DO j=1,SIZE(nindex)
532  !
533  IF ( nindex(j)==i) THEN
534  icpt = icpt + 1
535  xworks(icpt,i+1) = pwork(j)
536  ENDIF
537  !
538  ENDDO
539  !
540 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X1D_2',1,zhook_handle_omp)
541 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X1D_30',0,zhook_handle_omp)
542  !
543 #ifdef SFX_MPI
544  xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
545 #endif
546  !
547  IF (i/=ipio) THEN
548 #ifdef SFX_MPI
549  xtime0 = mpi_wtime()
550  IF (PRESENT(kpio).AND.PRESENT(kdx)) THEN
551  IF (i<ipio) THEN
552  ireq = i+1
553  ELSE
554  ireq = i
555  ENDIF
556  CALL mpi_isend(xworks(:,i+1),SIZE(xworks(:,i+1))*kind(xworks)/4,mpi_real,i,idx,ncomm,nreq(ireq),infompi)
557  ELSE
558  CALL mpi_send(xworks(:,i+1),SIZE(xworks(:,i+1))*kind(xworks)/4,mpi_real,i,idx,ncomm,infompi)
559  ENDIF
560  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
561 #endif
562  ELSE
563  zworkr(:) = xworks(:,i+1)
564  ENDIF
565 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X1D_30',1,zhook_handle_omp)
566  !
567  ENDDO
568 !$OMP END PARALLEL DO
569  !
570 ELSE
571  !
572  idx = idx + 1
573  !
574 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X1D_1',1,zhook_handle)
575 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X1D_2',0,zhook_handle)
576 #ifdef SFX_MPI
577  zworkr(:) = 0.
578  !
579 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X1D_2',1,zhook_handle)
580 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X1D_3',0,zhook_handle)
581  xtime0 = mpi_wtime()
582  CALL mpi_recv(zworkr(:),SIZE(zworkr(:))*kind(zworkr)/4,mpi_real,ipio,idx,ncomm,istatus,infompi)
583  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
584 #endif
585  !
586 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X1D_3',1,zhook_handle)
587  !
588 ENDIF
589 !
590 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X1D_4',0,zhook_handle)
591 
592 IF (PRESENT(kmask)) THEN
593  CALL pack_same_rank(kmask,zworkr(:),pwork2(:))
594 ELSE
595  pwork2(:) = zworkr(1:SIZE(pwork2))
596 ENDIF
597 
598 IF (.NOT.PRESENT(kdx)) idx_r = idx_r + 1
599 !
600 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X1D_4',1,zhook_handle)
601 !
602 END SUBROUTINE read_and_send_mpi_x1d
603 !
604 !**************************************************************************
605 !
606 SUBROUTINE read_and_send_mpi_x2d(PWORK,PWORK2,KMASK,KPIO,KDX)
607 !
608 USE modd_surfex_mpi, ONLY : nindex, nproc, nrank, ncomm, npio, nsize, &
610  nreq, xwork2s
611 !
613 !
614 USE yomhook ,ONLY : lhook, dr_hook
615 USE parkind1 ,ONLY : jprb
616 !
617 IMPLICIT NONE
618 !
619 #ifdef SFX_MPI
620 include "mpif.h"
621 #endif
622 !
623 REAL, DIMENSION(:,:), INTENT(IN) :: PWORK
624 REAL, DIMENSION(:,:), INTENT(OUT) :: PWORK2
625 !
626 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: KMASK
627 INTEGER, INTENT(IN), OPTIONAL :: KPIO
628 INTEGER, INTENT(IN), OPTIONAL :: KDX
629 !
630 REAL, DIMENSION(NSIZE,SIZE(PWORK2,2),NPROC) :: ZWORK2S
631 REAL, DIMENSION(NSIZE,SIZE(PWORK2,2)) :: ZWORK2
632 #ifdef SFX_MPI
633 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ISTATUS
634 #endif
635 INTEGER :: IS2, IP2
636 INTEGER :: ICPT, IPIO, IDX
637 INTEGER :: I,J, K, IREQ
638 INTEGER :: INFOMPI
639 DOUBLE PRECISION :: XTIME0
640 !
641 REAL(KIND=JPRB) :: ZHOOK_HANDLE, ZHOOK_HANDLE_OMP
642 !
643 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X2D_1',0,zhook_handle)
644 !
645 IF (PRESENT(kpio)) THEN
646  ipio = kpio
647 ELSE
648  ipio = npio
649 ENDIF
650 !
651 IF (nrank==ipio) THEN
652  IF (ALLOCATED(xwork2s)) THEN
653  IF (SIZE(xwork2s,2)/=SIZE(pwork2,2)) DEALLOCATE(xwork2s)
654  ENDIF
655  IF (.NOT.ALLOCATED(xwork2s)) ALLOCATE(xwork2s(nsize,SIZE(pwork2,2),nproc))
656 ENDIF
657 !
658 IF (PRESENT(kdx)) THEN
659  idx = kdx
660 ELSE
661  idx = idx_r
662 ENDIF
663 !
664 IF (nrank==ipio) THEN
665  !
666  idx = idx + 1
667  !
668 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X2D_1',1,zhook_handle)
669 !$OMP PARALLEL DO SCHEDULE(DYNAMIC,1) PRIVATE(I,ICPT,J,IREQ,INFOMPI,ZHOOK_HANDLE_OMP)
670  DO i=0,nproc-1
671 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X2D_2',0,zhook_handle_omp)
672  !
673 #ifdef SFX_MPI
674  xtime0 = mpi_wtime()
675 #endif
676  !
677  icpt = 0
678  !
679  xwork2s(:,:,i+1) = 0.
680  !
681  DO j=1,SIZE(nindex)
682  !
683  IF ( nindex(j)==i ) THEN
684  icpt = icpt + 1
685  xwork2s(icpt,:,i+1) = pwork(j,:)
686  ENDIF
687  !
688  ENDDO
689 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X2D_2',1,zhook_handle_omp)
690 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X2D_3',0,zhook_handle_omp)
691  !
692 #ifdef SFX_MPI
693  xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
694 #endif
695  !
696  IF (i/=ipio) THEN
697 #ifdef SFX_MPI
698  IF (PRESENT(kpio).AND.PRESENT(kdx)) THEN
699  IF (i<ipio) THEN
700  ireq = i+1
701  ELSE
702  ireq = i
703  ENDIF
704  CALL mpi_isend(xwork2s(:,:,i+1),SIZE(xwork2s(:,:,i+1))*kind(xwork2s)/4,&
705  mpi_real,i,idx,ncomm,nreq(ireq),infompi)
706  ELSE
707  CALL mpi_send(xwork2s(:,:,i+1),SIZE(xwork2s(:,:,i+1))*kind(xwork2s)/4,&
708  mpi_real,i,idx,ncomm,infompi)
709  ENDIF
710  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
711 #endif
712  ELSE
713  zwork2(:,:) = xwork2s(:,:,i+1)
714  ENDIF
715  !
716 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X2D_3',1,zhook_handle_omp)
717  ENDDO
718 !$OMP END PARALLEL DO
719  !
720 ELSE
721  !
722  idx = idx + 1
723  !
724 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X2D_1',1,zhook_handle)
725 #ifdef SFX_MPI
726 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X2D_3',0,zhook_handle)
727  !
728  xtime0 = mpi_wtime()
729  CALL mpi_recv(zwork2(:,:),SIZE(zwork2)*kind(zwork2)/4,mpi_real,ipio,idx,ncomm,istatus,infompi)
730  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
731 #endif
732  !
733 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X2D_3',1,zhook_handle)
734  !
735 ENDIF
736 !
737 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X2D_4',0,zhook_handle)
738 !
739 IF (PRESENT(kmask)) THEN
740  CALL pack_same_rank(kmask,zwork2(:,:),pwork2(:,:))
741 ELSE
742  pwork2(:,:) = zwork2(1:SIZE(pwork2,1),:)
743 ENDIF
744 !
745 IF (.NOT.PRESENT(kdx)) idx_r = idx_r + 1
746 !
747 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X2D_4',1,zhook_handle)
748 !
749 END SUBROUTINE read_and_send_mpi_x2d
750 !**************************************************************************
751 !
752 SUBROUTINE read_and_send_mpi_x3d(PWORK,PWORK2,KMASK,KPIO,KDX)
753 !
754 USE modd_surfex_mpi, ONLY : nindex, nproc, nrank, ncomm, npio, nsize, &
756  nreq
757 !
759 !
760 USE yomhook ,ONLY : lhook, dr_hook
761 USE parkind1 ,ONLY : jprb
762 !
763 IMPLICIT NONE
764 !
765 #ifdef SFX_MPI
766 include "mpif.h"
767 #endif
768 !
769 REAL, DIMENSION(:,:,:), INTENT(IN) :: PWORK
770 REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWORK2
771 !
772 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: KMASK
773 INTEGER, INTENT(IN), OPTIONAL :: KPIO
774 INTEGER, INTENT(IN), OPTIONAL :: KDX
775 !
776 REAL, DIMENSION(NSIZE,SIZE(PWORK2,2),SIZE(PWORK2,3),NPROC) :: ZWORK3S
777 REAL, DIMENSION(NSIZE,SIZE(PWORK2,2),SIZE(PWORK2,3)) :: ZWORK3
778 #ifdef SFX_MPI
779 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ISTATUS
780 #endif
781 INTEGER :: IP2, IS2, IP3, IS3
782 INTEGER :: ICPT, IPIO, IDX
783 INTEGER :: I,J
784 INTEGER :: INFOMPI, IREQ
785 DOUBLE PRECISION :: XTIME0
786 !
787 REAL(KIND=JPRB) :: ZHOOK_HANDLE, ZHOOK_HANDLE_OMP
788 !
789 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X3D_1',0,zhook_handle)
790 !
791 IF (PRESENT(kpio)) THEN
792  ipio = kpio
793 ELSE
794  ipio = npio
795 ENDIF
796 !
797 IF (PRESENT(kdx)) THEN
798  idx = kdx
799 ELSE
800  idx = idx_r
801 ENDIF
802 !
803 IF (nrank==ipio) THEN
804  !
805  idx = idx + 1
806  !
807 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X3D_1',1,zhook_handle)
808 !$OMP PARALLEL DO PRIVATE(I,ICPT,J,IREQ,INFOMPI,ZHOOK_HANDLE_OMP)
809  DO i=0,nproc-1
810 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X3D_2',0,zhook_handle_omp)
811  !
812 #ifdef SFX_MPI
813  xtime0 = mpi_wtime()
814 #endif
815  !
816  icpt = 0
817  !
818  zwork3s(:,:,:,i+1) = 0.
819  !
820  DO j=1,SIZE(nindex)
821  !
822  IF ( nindex(j)==i ) THEN
823  icpt = icpt + 1
824  zwork3s(icpt,:,:,i+1) = pwork(j,:,:)
825  ENDIF
826  !
827  ENDDO
828 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X3D_2',1,zhook_handle_omp)
829 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X3D_3',0,zhook_handle_omp)
830  !
831 #ifdef SFX_MPI
832  xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
833 #endif
834  !
835  IF (i/=ipio) THEN
836 #ifdef SFX_MPI
837  IF (PRESENT(kpio).AND.PRESENT(kdx)) THEN
838  IF (i<ipio) THEN
839  ireq = i+1
840  ELSE
841  ireq = i
842  ENDIF
843  xtime0 = mpi_wtime()
844  CALL mpi_isend(zwork3s(:,:,:,i+1),SIZE(zwork3)*kind(zwork3)/4,&
845  mpi_real,i,idx,ncomm,nreq(ireq),infompi)
846  ELSE
847  CALL mpi_send(zwork3s(:,:,:,i+1),SIZE(zwork3)*kind(zwork3)/4,&
848  mpi_real,i,idx,ncomm,infompi)
849  ENDIF
850  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
851 #endif
852  ELSE
853  zwork3(:,:,:) = zwork3s(:,:,:,i+1)
854  ENDIF
855  !
856 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X3D_3',1,zhook_handle_omp)
857  ENDDO
858 !$OMP END PARALLEL DO
859  !
860 ELSE
861  !
862  idx = idx + 1
863  !
864 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X3D_1',1,zhook_handle)
865 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X3D_2',0,zhook_handle)
866 #ifdef SFX_MPI
867  !
868  xtime0 = mpi_wtime()
869  CALL mpi_recv(zwork3,SIZE(zwork3)*kind(zwork3)/4,mpi_real,ipio,idx,ncomm,istatus,infompi)
870  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
871 #endif
872  !
873 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X3D_2',1,zhook_handle)
874  !
875 ENDIF
876 !
877 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X3D_4',0,zhook_handle)
878 !
879 IF (PRESENT(kmask)) THEN
880  CALL pack_same_rank(kmask,zwork3(:,:,:),pwork2)
881 ELSE
882  pwork2(:,:,:) = zwork3(1:SIZE(pwork2,1),:,:)
883 ENDIF
884 !
885 IF (.NOT.PRESENT(kdx)) idx_r = idx_r + 1
886 !
887 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X3D_4',1,zhook_handle)
888 !
889 END SUBROUTINE read_and_send_mpi_x3d
real, dimension(:,:,:), allocatable xwork2s
subroutine read_and_send_mpi_n3d(KWORK, KWORK2, KMASK, KPIO, KDX)
subroutine read_and_send_mpi_x2d(PWORK, PWORK2, KMASK, KPIO, KDX)
integer, dimension(:), allocatable nreq
subroutine read_and_send_mpi_x3d(PWORK, PWORK2, KMASK, KPIO, KDX)
integer, parameter jprb
Definition: parkind1.F90:32
subroutine read_and_send_mpi_n1d(KWORK, KWORK2, KMASK, KPIO, KDX)
logical lhook
Definition: yomhook.F90:15
subroutine read_and_send_mpi_n2d(KWORK, KWORK2, KMASK)
integer, dimension(:), allocatable nindex
subroutine read_and_send_mpi_x1d(PWORK, PWORK2, KMASK, KPIO, KDX)
subroutine wlog_mpi(HLOG, PLOG, KLOG, KLOG2, OLOG)
real, dimension(:,:), allocatable xworks