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