SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
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.
5 !----------------------------------------------------
6 !! MODIFICATIONS
7 !! -------------
8 !! Original
9 !! J.Escobar 10/06/2013: replace DOUBLE PRECISION by REAL to handle problem for promotion of real on IBM SP
10 !----------------------------------------------------
11 !
13 !
15 !
16 SUBROUTINE read_and_send_mpi_n1d(KWORK,KWORK2,KMASK)
17 !
18 INTEGER, DIMENSION(:), INTENT(IN) :: kwork
19 INTEGER, DIMENSION(:), INTENT(OUT) :: kwork2
20 !
21 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: kmask
22 !
23 END SUBROUTINE read_and_send_mpi_n1d
24 !
25 SUBROUTINE read_and_send_mpi_n2d(KWORK,KWORK2,KMASK)
26 !
27 INTEGER, DIMENSION(:,:), INTENT(IN) :: kwork
28 INTEGER, DIMENSION(:,:), INTENT(OUT) :: kwork2
29 !
30 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: kmask
31 !
32 END SUBROUTINE read_and_send_mpi_n2d
33 !
34 SUBROUTINE read_and_send_mpi_x1d(PWORK,PWORK2,KMASK)
35 !
36 REAL, DIMENSION(:), INTENT(IN) :: pwork
37 REAL, DIMENSION(:), INTENT(OUT) :: pwork2
38 !
39 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: kmask
40 !
41 END SUBROUTINE read_and_send_mpi_x1d
42 !
43 SUBROUTINE read_and_send_mpi_x2d(PWORK,PWORK2,KMASK)
44 !
45 REAL, DIMENSION(:,:), INTENT(IN) :: pwork
46 REAL, DIMENSION(:,:), INTENT(OUT) :: pwork2
47 !
48 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: kmask
49 !
50 END SUBROUTINE read_and_send_mpi_x2d
51 !
52 SUBROUTINE read_and_send_mpi_x3d(PWORK,PWORK2,KMASK)
53 !
54 REAL, DIMENSION(:,:,:), INTENT(IN) :: pwork
55 REAL, DIMENSION(:,:,:), INTENT(OUT) :: pwork2
56 !
57 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: kmask
58 !
59 END SUBROUTINE read_and_send_mpi_x3d
60 !
61 END INTERFACE
62 !
63 END MODULE modi_read_and_send_mpi
64 !
65 SUBROUTINE read_and_send_mpi_n1d(KWORK,KWORK2,KMASK)
66 !
67 USE modd_surfex_mpi, ONLY : nindex, nproc, nrank, ncomm, npio, nsize, &
68  xtime_npio_read, xtime_comm_read, idx_r, wlog_mpi
69 USE modd_surfex_omp, ONLY : nindx1sfx, nindx2sfx, nwork, nblock
70 !
72 !
73 USE yomhook ,ONLY : lhook, dr_hook
74 USE parkind1 ,ONLY : jprb
75 !
76 IMPLICIT NONE
77 !
78 #ifdef SFX_MPI
79 include "mpif.h"
80 #endif
81 !
82 INTEGER, DIMENSION(:), INTENT(IN) :: kwork
83 INTEGER, DIMENSION(:), INTENT(OUT) :: kwork2
84 !
85 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: kmask
86 !
87 #ifdef SFX_MPI
88 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: istatus
89 #endif
90 INTEGER :: icpt
91 INTEGER :: i,j
92 INTEGER :: infompi
93 REAL :: xtime0
94 !
95 REAL(KIND=JPRB) :: zhook_handle
96 !
97 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N1D',0,zhook_handle)
98 !
99 !$OMP BARRIER
100 !
101 IF (nrank==npio) THEN
102  !
103 !$OMP SINGLE
104  !
105  idx_r = idx_r + 1
106  !
107  DO i=1,nproc-1
108  !
109 #ifdef SFX_MPI
110  xtime0 = mpi_wtime()
111 #endif
112  !
113  icpt = 0
114  !
115  nwork(:) = 0
116  !
117  DO j=1,SIZE(nindex)
118  !
119  IF ( nindex(j)==mod(i,nproc) ) THEN
120  icpt = icpt + 1
121  nwork(icpt) = kwork(j)
122  ENDIF
123  !
124  ENDDO
125  !
126 #ifdef SFX_MPI
127  xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
128  !
129  IF (i<nproc) THEN
130  xtime0 = mpi_wtime()
131  CALL mpi_send(nwork,SIZE(nwork)*kind(nwork)/4,mpi_integer,i,idx_r,ncomm,infompi)
132  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
133  ENDIF
134 #endif
135  !
136  ENDDO
137  !
138 !$OMP END SINGLE
139  !
140 ELSE
141  !
142 !$OMP SINGLE
143  !
144  idx_r = idx_r + 1
145  !
146 #ifdef SFX_MPI
147  nwork(:) = 0
148  !
149  xtime0 = mpi_wtime()
150  CALL mpi_recv(nwork,SIZE(nwork)*kind(nwork)/4,mpi_integer,npio,idx_r,ncomm,istatus,infompi)
151  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
152 #endif
153  !
154 !$OMP END SINGLE
155  !
156 ENDIF
157 !
158 IF (present(kmask)) THEN
159  CALL pack_same_rank(kmask,nwork(nindx1sfx:nindx2sfx),kwork2)
160 ELSE
161  kwork2(:) = nwork(nindx1sfx:nindx2sfx)
162 ENDIF
163 !
164 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N1D',1,zhook_handle)
165 !
166 !
167 END SUBROUTINE read_and_send_mpi_n1d
168 !
169 !**************************************************************************
170 !
171 SUBROUTINE read_and_send_mpi_n2d(KWORK,KWORK2,KMASK)
172 !
173 USE modd_surfex_mpi, ONLY : nindex, nproc, nrank, ncomm, npio, nsize, &
174  xtime_npio_read, xtime_comm_read, idx_r, wlog_mpi
175 USE modd_surfex_omp, ONLY : nindx1sfx, nindx2sfx, nwork2, nblock
176 !
178 !
179 USE yomhook ,ONLY : lhook, dr_hook
180 USE parkind1 ,ONLY : jprb
181 !
182 IMPLICIT NONE
183 !
184 #ifdef SFX_MPI
185 include "mpif.h"
186 #endif
187 !
188 INTEGER, DIMENSION(:,:), INTENT(IN) :: kwork
189 INTEGER, DIMENSION(:,:), INTENT(OUT) :: kwork2
190 !
191 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: kmask
192 !
193 #ifdef SFX_MPI
194 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: istatus
195 #endif
196 INTEGER :: is2, ip2
197 INTEGER :: icpt
198 INTEGER :: i,j, k
199 INTEGER :: infompi
200 REAL xtime0
201 !
202 REAL(KIND=JPRB) :: zhook_handle
203 !
204 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N2D',0,zhook_handle)
205 !
206 !$OMP BARRIER
207 !
208 ip2 = SIZE(kwork2,2)
209 is2 = SIZE(nwork2,2)
210 !
211 !$OMP SINGLE
212 IF (ip2>is2) THEN
213  DEALLOCATE(nwork2)
214  ALLOCATE(nwork2(nsize,ip2))
215 ENDIF
216 !$OMP END SINGLE
217 !
218 IF (nrank==npio) THEN
219  !
220 !$OMP SINGLE
221  !
222  idx_r = idx_r + 1
223  !
224  DO i=1,nproc-1
225  !
226 #ifdef SFX_MPI
227  xtime0 = mpi_wtime()
228 #endif
229  !
230  icpt = 0
231  !
232  nwork2(:,1:ip2) = 0
233  !
234  DO j=1,SIZE(nindex)
235  !
236  IF ( nindex(j)==mod(i,nproc) ) THEN
237  icpt = icpt + 1
238  nwork2(icpt,1:ip2) = kwork(j,:)
239  ENDIF
240  !
241  ENDDO
242  !
243 #ifdef SFX_MPI
244  xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
245  !
246  IF (i<nproc) THEN
247  xtime0 = mpi_wtime()
248  CALL mpi_send(nwork2(:,1:ip2),nsize*ip2*kind(nwork2)/4,mpi_integer,i,idx_r,ncomm,infompi)
249  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
250  ENDIF
251 #endif
252  !
253  ENDDO
254  !
255 !$OMP END SINGLE
256  !
257 ELSE
258  !
259 !$OMP SINGLE
260  !
261  idx_r = idx_r + 1
262  !
263 #ifdef SFX_MPI
264  nwork2(:,1:ip2) = 0
265  !
266  xtime0 = mpi_wtime()
267  CALL mpi_recv(nwork2(:,1:ip2),nsize*ip2*kind(nwork2)/4,mpi_integer,npio,idx_r,ncomm,istatus,infompi)
268  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
269 #endif
270  !
271 !$OMP END SINGLE
272  !
273 ENDIF
274 !
275 IF (present(kmask)) THEN
276  CALL pack_same_rank(kmask,nwork2(nindx1sfx:nindx2sfx,1:ip2),kwork2)
277 ELSE
278  kwork2(:,:) = nwork2(nindx1sfx:nindx2sfx,1:ip2)
279 ENDIF
280 !
281 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_N2D',1,zhook_handle)
282 !
283 !
284 END SUBROUTINE read_and_send_mpi_n2d
285 !
286 !**************************************************************************
287 !
288 SUBROUTINE read_and_send_mpi_x1d(PWORK,PWORK2,KMASK)
289 !
290 USE modd_surfex_mpi, ONLY : nindex, nproc, nrank, ncomm, npio, nsize, &
291  xtime_npio_read, xtime_comm_read, wlog_mpi, idx_r
292 USE modd_surfex_omp, ONLY : nindx1sfx, nindx2sfx, xwork, nblock
293 !
295 !
296 USE yomhook ,ONLY : lhook, dr_hook
297 USE parkind1 ,ONLY : jprb
298 !
299 IMPLICIT NONE
300 !
301 #ifdef SFX_MPI
302 include "mpif.h"
303 #endif
304 !
305 REAL, DIMENSION(:), INTENT(IN) :: pwork
306 REAL, DIMENSION(:), INTENT(OUT) :: pwork2
307 !
308 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: kmask
309 !
310 #ifdef SFX_MPI
311 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: istatus
312 #endif
313 INTEGER :: icpt
314 INTEGER :: i,j
315 INTEGER :: infompi
316 REAL :: xtime0
317 !
318 REAL(KIND=JPRB) :: zhook_handle
319 !
320 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X1D',0,zhook_handle)
321 !
322 !$OMP BARRIER
323 !
324 IF (nrank==npio) THEN
325  !
326 !$OMP SINGLE
327  !
328  idx_r = idx_r + 1
329  !
330  DO i=1,nproc
331  !
332 #ifdef SFX_MPI
333  xtime0 = mpi_wtime()
334 #endif
335  !
336  icpt = 0
337  !
338  xwork(:) = 0.
339  !
340  DO j=1,SIZE(nindex)
341  !
342  IF ( nindex(j)==mod(i,nproc) ) THEN
343  icpt = icpt + 1
344  xwork(icpt) = pwork(j)
345  ENDIF
346  !
347  ENDDO
348  !
349 #ifdef SFX_MPI
350  xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
351  !
352  IF (i<nproc) THEN
353  xtime0 = mpi_wtime()
354  CALL mpi_send(xwork,SIZE(xwork)*kind(xwork)/4,mpi_real,i,idx_r,ncomm,infompi)
355  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
356  ENDIF
357 #endif
358  !
359  ENDDO
360  !
361 !$OMP END SINGLE
362 !
363 ELSE
364  !
365 !$OMP SINGLE
366  !
367  idx_r = idx_r + 1
368  !
369 #ifdef SFX_MPI
370  xwork(:) = 0.
371  !
372  xtime0 = mpi_wtime()
373  CALL mpi_recv(xwork,SIZE(xwork)*kind(xwork)/4,mpi_real,npio,idx_r,ncomm,istatus,infompi)
374  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
375 #endif
376  !
377 !$OMP END SINGLE
378  !
379 ENDIF
380 !
381 IF (present(kmask)) THEN
382  CALL pack_same_rank(kmask,xwork(nindx1sfx:nindx2sfx),pwork2)
383 ELSE
384  pwork2(:) = xwork(nindx1sfx:nindx2sfx)
385 ENDIF
386 !
387 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X1D',1,zhook_handle)
388 !
389 END SUBROUTINE read_and_send_mpi_x1d
390 !
391 !**************************************************************************
392 !
393 SUBROUTINE read_and_send_mpi_x2d(PWORK,PWORK2,KMASK)
394 !
395 USE modd_surfex_mpi, ONLY : nindex, nproc, nrank, ncomm, npio, nsize, &
396  xtime_npio_read, xtime_comm_read, wlog_mpi, idx_r
397 USE modd_surfex_omp, ONLY : nindx1sfx, nindx2sfx, xwork2, nblock
398 !
400 !
401 USE yomhook ,ONLY : lhook, dr_hook
402 USE parkind1 ,ONLY : jprb
403 !
404 IMPLICIT NONE
405 !
406 #ifdef SFX_MPI
407 include "mpif.h"
408 #endif
409 !
410 REAL, DIMENSION(:,:), INTENT(IN) :: pwork
411 REAL, DIMENSION(:,:), INTENT(OUT) :: pwork2
412 !
413 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: kmask
414 !
415 #ifdef SFX_MPI
416 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: istatus
417 #endif
418 INTEGER :: is2, ip2
419 INTEGER :: icpt
420 INTEGER :: i,j, k
421 INTEGER :: infompi
422 REAL :: xtime0
423 !
424 REAL(KIND=JPRB) :: zhook_handle
425 !
426 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X2D',0,zhook_handle)
427 !
428 !$OMP BARRIER
429 !
430 ip2 = SIZE(pwork2,2)
431 is2 = SIZE(xwork2,2)
432 !
433 !$OMP SINGLE
434 IF (ip2>is2) THEN
435  DEALLOCATE(xwork2)
436  ALLOCATE(xwork2(nsize,ip2))
437 ENDIF
438 !$OMP END SINGLE
439 !
440 IF (nrank==npio) THEN
441  !
442 !$OMP SINGLE
443  !
444  idx_r = idx_r + 1
445  !
446  DO i=1,nproc
447  !
448 #ifdef SFX_MPI
449  xtime0 = mpi_wtime()
450 #endif
451  !
452  icpt = 0
453  !
454  xwork2(:,1:ip2) = 0.
455  !
456  DO j=1,SIZE(nindex)
457  !
458  IF ( nindex(j)==mod(i,nproc) ) THEN
459  icpt = icpt + 1
460  xwork2(icpt,1:ip2) = pwork(j,:)
461  ENDIF
462  !
463  ENDDO
464  !
465 #ifdef SFX_MPI
466  xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
467  !
468  IF (i<nproc) THEN
469  xtime0 = mpi_wtime()
470  CALL mpi_send(xwork2(:,1:ip2),nsize*ip2*kind(xwork2)/4,mpi_real,i,idx_r,ncomm,infompi)
471  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
472  ENDIF
473 #endif
474  !
475  ENDDO
476  !
477 !$OMP END SINGLE
478  !
479 ELSE
480  !
481 !$OMP SINGLE
482  !
483  idx_r = idx_r + 1
484  !
485 #ifdef SFX_MPI
486  xwork2(:,1:ip2) = 0.
487  !
488  xtime0 = mpi_wtime()
489  CALL mpi_recv(xwork2(:,1:ip2),nsize*ip2*kind(xwork2)/4,mpi_real,npio,idx_r,ncomm,istatus,infompi)
490  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
491 #endif
492  !
493 !$OMP END SINGLE
494  !
495 ENDIF
496 !
497 IF (present(kmask)) THEN
498  CALL pack_same_rank(kmask,xwork2(nindx1sfx:nindx2sfx,1:ip2),pwork2)
499 ELSE
500  pwork2(:,:) = xwork2(nindx1sfx:nindx2sfx,1:ip2)
501 ENDIF
502 !
503 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X2D',1,zhook_handle)
504 !
505 END SUBROUTINE read_and_send_mpi_x2d
506 !**************************************************************************
507 !
508 SUBROUTINE read_and_send_mpi_x3d(PWORK,PWORK2,KMASK)
509 !
510 USE modd_surfex_mpi, ONLY : nindex, nproc, nrank, ncomm, npio, nsize, &
511  xtime_npio_read, xtime_comm_read, idx_r, wlog_mpi
512 USE modd_surfex_omp, ONLY : nindx1sfx, nindx2sfx, xwork3, nblock
513 !
515 !
516 USE yomhook ,ONLY : lhook, dr_hook
517 USE parkind1 ,ONLY : jprb
518 !
519 IMPLICIT NONE
520 !
521 #ifdef SFX_MPI
522 include "mpif.h"
523 #endif
524 !
525 REAL, DIMENSION(:,:,:), INTENT(IN) :: pwork
526 REAL, DIMENSION(:,:,:), INTENT(OUT) :: pwork2
527 !
528 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: kmask
529 !
530 #ifdef SFX_MPI
531 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: istatus
532 #endif
533 INTEGER :: ip2, is2, ip3, is3
534 INTEGER :: icpt
535 INTEGER :: i,j
536 INTEGER :: infompi
537 REAL :: xtime0
538 !
539 REAL(KIND=JPRB) :: zhook_handle
540 !
541 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X3D',0,zhook_handle)
542 !
543 !$OMP BARRIER
544 !
545 ip2 = SIZE(pwork2,2)
546 ip3 = SIZE(pwork2,3)
547 is2 = SIZE(xwork3,2)
548 is3 = SIZE(xwork3,3)
549 !
550 !$OMP SINGLE
551 IF (ip2>is2 .OR. ip3>is3) THEN
552  DEALLOCATE(xwork3)
553  ALLOCATE(xwork3(nsize,max(ip2,is2),max(ip3,is3)))
554 ENDIF
555 !$OMP END SINGLE
556 !
557 IF (nrank==npio) THEN
558  !
559 !$OMP SINGLE
560  !
561  idx_r = idx_r + 1
562  !
563  DO i=1,nproc
564  !
565 #ifdef SFX_MPI
566  xtime0 = mpi_wtime()
567 #endif
568  !
569  icpt = 0
570  !
571  xwork3(:,1:ip2,1:ip3) = 0.
572  !
573  DO j=1,SIZE(nindex)
574  !
575  IF ( nindex(j)==mod(i,nproc) ) THEN
576  icpt = icpt + 1
577  xwork3(icpt,1:ip2,1:ip3) = pwork(j,:,:)
578  ENDIF
579  !
580  ENDDO
581  !
582 #ifdef SFX_MPI
583  xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
584  !
585  IF (i<nproc) THEN
586  xtime0 = mpi_wtime()
587  CALL mpi_send(xwork3(:,1:ip2,1:ip3),nsize*ip2*ip3*kind(xwork3)/4,mpi_real,i,idx_r,ncomm,infompi)
588  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
589  ENDIF
590 #endif
591  !
592  ENDDO
593  !
594 !$OMP END SINGLE
595  !
596 ELSE
597  !
598 !$OMP SINGLE
599  !
600  idx_r = idx_r + 1
601  !
602 #ifdef SFX_MPI
603  xwork3(:,1:ip2,1:ip3) = 0.
604  !
605  xtime0 = mpi_wtime()
606  CALL mpi_recv(xwork3(:,1:ip2,1:ip3),nsize*ip2*ip3*kind(xwork3)/4,mpi_real,npio,idx_r,ncomm,istatus,infompi)
607  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
608 #endif
609  !
610 !$OMP END SINGLE
611  !
612 ENDIF
613 !
614 IF (present(kmask)) THEN
615  CALL pack_same_rank(kmask,xwork3(nindx1sfx:nindx2sfx,1:ip2,1:ip3),pwork2)
616 ELSE
617  pwork2(:,:,:) = xwork3(nindx1sfx:nindx2sfx,1:ip2,1:ip3)
618 ENDIF
619 !
620 IF (lhook) CALL dr_hook('READ_AND_SEND_MPI_X3D',1,zhook_handle)
621 !
622 !
623 END SUBROUTINE read_and_send_mpi_x3d
subroutine read_and_send_mpi_x3d(PWORK, PWORK2, KMASK)
subroutine read_and_send_mpi_n1d(KWORK, KWORK2, KMASK)
subroutine read_and_send_mpi_x2d(PWORK, PWORK2, KMASK)
subroutine wlog_mpi(HLOG, PLOG, KLOG, KLOG2, OLOG)
subroutine read_and_send_mpi_n2d(KWORK, KWORK2, KMASK)
subroutine read_and_send_mpi_x1d(PWORK, PWORK2, KMASK)