SURFEX v8.1
General documentation of Surfex
gather_and_write_mpi_k4.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 !----------------------------------------------------
7 !! MODIFICATIONS
8 !! -------------
9 !! Original
10 !! J.Escobar 10/06/2013: replace DOUBLE PRECISION by REAL to handle problem for promotion of real on IBM SP
11 !----------------------------------------------------
12 !
14 !
15 SUBROUTINE gather_and_write_mpi_x1d0(PWORK,PWORK2,KMASK)
16 !
17 REAL, DIMENSION(:), INTENT(IN) :: PWORK
18 REAL, DIMENSION(:), INTENT(OUT) :: PWORK2
19 !
20 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: KMASK
21 !
22 END SUBROUTINE gather_and_write_mpi_x1d0
23 !
24 SUBROUTINE gather_and_write_mpi_x2d0(PWORK,PWORK2,KMASK)
25 !
26 REAL, DIMENSION(:,:), INTENT(IN) :: PWORK
27 REAL, DIMENSION(:,:), INTENT(OUT) :: PWORK2
28 !
29 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: KMASK
30 !
31 END SUBROUTINE gather_and_write_mpi_x2d0
32 !
33 SUBROUTINE gather_and_write_mpi_x3d0(PWORK,PWORK2,KMASK)
34 !
35 REAL, DIMENSION(:,:,:), INTENT(IN) :: PWORK
36 REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWORK2
37 !
38 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: KMASK
39 !
40 END SUBROUTINE gather_and_write_mpi_x3d0
41 !
42 END INTERFACE
43 !
45 !
46 !**************************************************************************
47 !
48 SUBROUTINE gather_and_write_mpi_x1d0(PWORK,PWORK2,KMASK)
49 !
50 USE modd_surfex_mpi, ONLY : nindex, nproc, nrank, ncomm, npio, nsize, &
53 !
54 USE modd_surf_par, ONLY : xundef
55 !
57 !
58 USE yomhook ,ONLY : lhook, dr_hook
59 USE parkind1 ,ONLY : jprb
60 !
61 IMPLICIT NONE
62 !
63 #ifdef SFX_MPI
64 include "mpif.h"
65 #endif
66 !
67 REAL, DIMENSION(:), INTENT(IN) :: PWORK
68 REAL, DIMENSION(:), INTENT(OUT) :: PWORK2
69 !
70 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: KMASK
71 !
72 REAL, DIMENSION(NSIZE) :: ZINTER
73 REAL, DIMENSION(NSIZE) :: ZWORK
74 REAL :: XTIME0
75 !
76 #ifdef SFX_MPI
77 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ISTATUS
78 #endif
79 INTEGER :: ICPT
80 INTEGER :: I,J, IP1, IS1
81 INTEGER :: INFOMPI
82 !
83 REAL(KIND=JPRB) :: ZHOOK_HANDLE, ZHOOK_HANDLE_OMP
84 !
85 !
86 IF (lhook) CALL dr_hook('GATHER_AND_WRITE_MPI_X1D0',0,zhook_handle)
87 !
88 zwork(:) = xundef
89 !
90 #ifdef SFX_MPI
91 xtime0 = mpi_wtime()
92 #endif
93 !
94 IF (SIZE(pwork)>0) THEN
95  IF (PRESENT(kmask)) THEN
96  CALL unpack_same_rank(kmask,pwork,zwork(:))
97  ELSE
98  zwork(1:SIZE(pwork)) = pwork(:)
99  ENDIF
100 ENDIF
101 !
102 #ifdef SFX_MPI
103 xtime_calc_write = xtime_calc_write + (mpi_wtime() - xtime0)
104 !
105 xtime0 = mpi_wtime()
106 #endif
107 !
108 IF (nrank/=npio) THEN
109  !
110  idx_w = idx_w + 1
111  !
112 #ifdef SFX_MPI
113  xtime0 = mpi_wtime()
114  CALL mpi_send(zwork,SIZE(zwork)*kind(zwork)/4,mpi_real,npio,idx_w,ncomm,infompi)
115  xtime_comm_write = xtime_comm_write + (mpi_wtime() - xtime0)
116 #endif
117  !
118 ELSE
119  !
120  pwork2(:) = 0.
121  !
122  idx_w = idx_w + 1
123  !
124  DO i=0,nproc-1
125  !
126 #ifdef SFX_MPI
127  xtime0 = mpi_wtime()
128 #endif
129  !
130  IF (i/=npio) THEN
131 #ifdef SFX_MPI
132  CALL mpi_recv(zinter,SIZE(zinter)*kind(zinter)/4,mpi_real,i,idx_w,ncomm,istatus,infompi)
133 #endif
134  ELSE
135  zinter(:) = zwork(:)
136  ENDIF
137  !
138 #ifdef SFX_MPI
139  xtime_comm_write = xtime_comm_write + (mpi_wtime() - xtime0)
140  !
141  xtime0 = mpi_wtime()
142 #endif
143  !
144  icpt = 0
145  !
146  DO j=1,SIZE(nindex)
147  !
148  IF ( nindex(j)==i ) THEN
149  icpt = icpt + 1
150  pwork2(j) = zinter(icpt)
151  ENDIF
152  !
153  ENDDO
154  !
155 #ifdef SFX_MPI
156  xtime_calc_write = xtime_calc_write + (mpi_wtime() - xtime0)
157 #endif
158  !
159  ENDDO
160  !
161 ENDIF
162 !
163 
164 IF (lhook) CALL dr_hook('GATHER_AND_WRITE_MPI_X1D0',1,zhook_handle)
165 !
166 END SUBROUTINE gather_and_write_mpi_x1d0
167 !
168 !**************************************************************************
169 !
170 SUBROUTINE gather_and_write_mpi_x2d0(PWORK,PWORK2,KMASK)
171 !
172 USE modd_surf_par, ONLY : xundef
173 !
174 USE modd_surfex_mpi, ONLY : nindex, nproc, nrank, ncomm, npio, nsize, &
177 !
179 !
180 USE yomhook ,ONLY : lhook, dr_hook
181 USE parkind1 ,ONLY : jprb
182 !
183 IMPLICIT NONE
184 !
185 #ifdef SFX_MPI
186 include "mpif.h"
187 #endif
188 !
189 REAL, DIMENSION(:,:), INTENT(IN) :: PWORK
190 REAL, DIMENSION(:,:), INTENT(OUT) :: PWORK2
191 !
192 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: KMASK
193 !
194 REAL, DIMENSION(NSIZE,SIZE(PWORK2,2)) :: ZINTER
195 REAL, DIMENSION(NSIZE,SIZE(PWORK,2)) :: ZWORK
196 REAL:: XTIME0
197 !
198 #ifdef SFX_MPI
199 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ISTATUS
200 #endif
201 INTEGER :: ICPT, IX2, IS1, IS2, IP1, IP2
202 INTEGER :: I,J
203 INTEGER :: INFOMPI
204 !
205 REAL(KIND=JPRB) :: ZHOOK_HANDLE, ZHOOK_HANDLE_OMP
206 !
207 !
208 IF (lhook) CALL dr_hook('GATHER_AND_WRITE_MPI_X2D0',0,zhook_handle)
209 !
210 zwork(:,:) = xundef
211 !
212 #ifdef SFX_MPI
213 xtime0 = mpi_wtime()
214 #endif
215 !
216 IF (SIZE(pwork,1)>0) THEN
217  IF (PRESENT(kmask)) THEN
218  CALL unpack_same_rank(kmask,pwork,zwork(:,:))
219  ELSE
220  zwork(1:SIZE(pwork,1),:) = pwork(:,:)
221  ENDIF
222 ENDIF
223 !
224 #ifdef SFX_MPI
225 xtime_calc_write = xtime_calc_write + (mpi_wtime() - xtime0)
226 !
227 xtime0 = mpi_wtime()
228 #endif
229 !
230 IF (nrank/=npio) THEN
231  !
232  idx_w = idx_w + 1
233  !
234 #ifdef SFX_MPI
235  xtime0 = mpi_wtime()
236  CALL mpi_send(zwork(:,:),SIZE(zwork)*kind(zwork)/4,mpi_real,npio,idx_w,ncomm,infompi)
237  xtime_comm_write = xtime_comm_write + (mpi_wtime() - xtime0)
238 #endif
239  !
240 ELSEIF (nproc>1) THEN
241  !
242  pwork2(:,:) = 0.
243  !
244  idx_w = idx_w + 1
245  !
246 !!$OMP PARALLEL DO PRIVATE(I,ZINTER,ICPT,J,ISTATUS,INFOMPI,ZHOOK_HANDLE_OMP)
247  DO i=0,nproc-1
248  !
249 #ifdef SFX_MPI
250  xtime0 = mpi_wtime()
251 #endif
252  !
253  IF (i/=npio) THEN
254 #ifdef SFX_MPI
255  CALL mpi_recv(zinter,SIZE(zinter)*kind(zinter)/4,mpi_real,i,idx_w,ncomm,istatus,infompi)
256 #endif
257  ELSE
258  zinter(:,:) = zwork(:,:)
259  ENDIF
260 ! !
261 #ifdef SFX_MPI
262  xtime_comm_write = xtime_comm_write + (mpi_wtime() - xtime0)
263  !
264  xtime0 = mpi_wtime()
265 #endif
266  !
267  icpt = 0
268  !
269  DO j=1,SIZE(nindex)
270  !
271  IF ( nindex(j)==i ) THEN
272  icpt = icpt + 1
273  pwork2(j,:) = zinter(icpt,:)
274  ENDIF
275  !
276  ENDDO
277  !
278 #ifdef SFX_MPI
279  xtime_calc_write = xtime_calc_write + (mpi_wtime() - xtime0)
280 #endif
281  !
282  ENDDO
283 !!$OMP END PARALLEL DO
284  !
285 ELSE
286  !
287  pwork2(:,:) = zwork(:,:)
288  !
289 ENDIF
290 !
291 IF (lhook) CALL dr_hook('GATHER_AND_WRITE_MPI_X2D0',1,zhook_handle)
292 !
293 !
294 END SUBROUTINE gather_and_write_mpi_x2d0
295 !
296 !**************************************************************************
297 !
298 SUBROUTINE gather_and_write_mpi_x3d0(PWORK,PWORK2,KMASK)
299 !
300 USE modd_surf_par, ONLY : xundef
301 !
302 USE modd_surfex_mpi, ONLY : nindex, nproc, nrank, ncomm, npio, nsize, &
305 !
307 !
308 USE yomhook ,ONLY : lhook, dr_hook
309 USE parkind1 ,ONLY : jprb
310 !
311 IMPLICIT NONE
312 !
313 #ifdef SFX_MPI
314 include "mpif.h"
315 #endif
316 !
317 REAL, DIMENSION(:,:,:), INTENT(IN) :: PWORK
318 REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWORK2
319 !
320 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: KMASK
321 !
322 REAL, DIMENSION(NSIZE,SIZE(PWORK2,2),SIZE(PWORK2,3)) :: ZINTER
323 REAL, DIMENSION(NSIZE,SIZE(PWORK,2),SIZE(PWORK,3)) :: ZWORK
324 DOUBLE PRECISION :: XTIME0
325 !
326 #ifdef SFX_MPI
327 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ISTATUS
328 #endif
329 INTEGER :: ICPT, IX2, IS1, IS2, IP1, IP2
330 INTEGER :: I,J
331 INTEGER :: INFOMPI
332 !
333 REAL(KIND=JPRB) :: ZHOOK_HANDLE, ZHOOK_HANDLE_OMP
334 !
335 !
336 IF (lhook) CALL dr_hook('GATHER_AND_WRITE_MPI_X3D0_1',0,zhook_handle)
337 !
338 zwork(:,:,:) = xundef
339 !
340 #ifdef SFX_MPI
341 xtime0 = mpi_wtime()
342 #endif
343 !
344 IF (SIZE(pwork,1)>0) THEN
345  IF (PRESENT(kmask)) THEN
346  CALL unpack_same_rank(kmask,pwork(:,:,:),zwork(:,:,:))
347  ELSE
348  zwork(1:SIZE(pwork,1),:,:) = pwork(:,:,:)
349  ENDIF
350 ENDIF
351 !
352 #ifdef SFX_MPI
353 xtime_calc_write = xtime_calc_write + (mpi_wtime() - xtime0)
354 !
355 xtime0 = mpi_wtime()
356 #endif
357 !
358 IF (lhook) CALL dr_hook('GATHER_AND_WRITE_MPI_X3D0_1',1,zhook_handle)
359 IF (lhook) CALL dr_hook('GATHER_AND_WRITE_MPI_X3D0_2',0,zhook_handle)
360 
361 IF (nrank/=npio) THEN
362  !
363  !
364  idx_w = idx_w + 1
365  !
366 #ifdef SFX_MPI
367  xtime0 = mpi_wtime()
368  CALL mpi_send(zwork(:,:,:),SIZE(zwork)*kind(zwork)/4,mpi_real,npio,idx_w,ncomm,infompi)
369  xtime_comm_write = xtime_comm_write + (mpi_wtime() - xtime0)
370 #endif
371  !
372 IF (lhook) CALL dr_hook('GATHER_AND_WRITE_MPI_X3D0_2',1,zhook_handle)
373 IF (lhook) CALL dr_hook('GATHER_AND_WRITE_MPI_X3D0_5',0,zhook_handle)
374  !
375 ELSEIF (nproc>1) THEN
376  !
377  pwork2(:,:,:) = 0.
378  !
379  idx_w = idx_w + 1
380  !
381 IF (lhook) CALL dr_hook('GATHER_AND_WRITE_MPI_X3D0_2',1,zhook_handle)
382 
383 !!$OMP PARALLEL DO PRIVATE(I,ZINTER,ICPT,J,INFOMPI,ISTATUS,ZHOOK_HANDLE_OMP)
384  DO i=0,nproc-1
385 IF (lhook) CALL dr_hook('GATHER_AND_WRITE_MPI_X3D0_3',0,zhook_handle_omp)
386  !
387 #ifdef SFX_MPI
388  xtime0 = mpi_wtime()
389 #endif
390  !
391  IF (i/=npio) THEN
392 #ifdef SFX_MPI
393  CALL mpi_recv(zinter,SIZE(zinter)*kind(zinter)/4,mpi_real,i,idx_w,ncomm,istatus,infompi)
394 #endif
395  ELSE
396  zinter(:,:,:) = zwork(:,:,:)
397  ENDIF
398 ! !
399 #ifdef SFX_MPI
400  xtime_comm_write = xtime_comm_write + (mpi_wtime() - xtime0)
401  !
402  xtime0 = mpi_wtime()
403 #endif
404  !
405 IF (lhook) CALL dr_hook('GATHER_AND_WRITE_MPI_X3D0_3',1,zhook_handle_omp)
406 IF (lhook) CALL dr_hook('GATHER_AND_WRITE_MPI_X3D0_4',0,zhook_handle_omp)
407 
408  icpt = 0
409  !
410  DO j=1,SIZE(nindex)
411  !
412  IF ( nindex(j)==i ) THEN
413  icpt = icpt + 1
414  pwork2(j,:,:) = zinter(icpt,:,:)
415  ENDIF
416  !
417  ENDDO
418  !
419 #ifdef SFX_MPI
420  xtime_calc_write = xtime_calc_write + (mpi_wtime() - xtime0)
421 #endif
422  !
423 IF (lhook) CALL dr_hook('GATHER_AND_WRITE_MPI_X3D0_4',1,zhook_handle_omp)
424  ENDDO
425 !!$OMP END PARALLEL DO
426  !
427 IF (lhook) CALL dr_hook('GATHER_AND_WRITE_MPI_X3D0_5',0,zhook_handle)
428  !
429 ELSE
430  pwork2(:,:,:) = zwork(:,:,:)
431 IF (lhook) CALL dr_hook('GATHER_AND_WRITE_MPI_X3D0_2',1,zhook_handle)
432 IF (lhook) CALL dr_hook('GATHER_AND_WRITE_MPI_X3D0_5',0,zhook_handle)
433 
434 ENDIF
435 !
436 IF (lhook) CALL dr_hook('GATHER_AND_WRITE_MPI_X3D0_5',1,zhook_handle)
437 !
438 !
439 END SUBROUTINE gather_and_write_mpi_x3d0
440 !
441 !**************************************************************************
subroutine gather_and_write_mpi_x3d0(PWORK, PWORK2, KMASK)
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
subroutine gather_and_write_mpi_x2d0(PWORK, PWORK2, KMASK)
logical lhook
Definition: yomhook.F90:15
subroutine gather_and_write_mpi_x1d0(PWORK, PWORK2, KMASK)
integer, dimension(:), allocatable nindex
subroutine wlog_mpi(HLOG, PLOG, KLOG, KLOG2, OLOG)