forked from altMITgcm/MITgcm
-
Notifications
You must be signed in to change notification settings - Fork 0
/
scatter_yz.F
93 lines (73 loc) · 2.33 KB
/
scatter_yz.F
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
C $Header: /u/gcmpack/MITgcm/eesupp/src/scatter_yz.F,v 1.3 2009/04/28 18:28:55 jmc Exp $
C $Name: $
#include "CPP_EEOPTIONS.h"
SUBROUTINE SCATTER_YZ( global, local, myThid )
C Scatter elements of a y-z array from mpi process 0 to all processes.
IMPLICIT NONE
#include "SIZE.h"
#include "EEPARAMS.h"
#include "EESUPPORT.h"
C mythid - thread number for this instance of the routine.
C global,local - working arrays used to transfer 2-D fields
INTEGER mythid
Real*8 global(Ny)
_RL local(1-OLy:sNy+OLy,nSx,nSy)
INTEGER jG, j, bi, bj
#ifdef ALLOW_USE_MPI
_RL temp(1-OLy:sNy+OLy,nSx,nSy)
INTEGER istatus(MPI_STATUS_SIZE), ierr
INTEGER isource, itag, npe
INTEGER lbuff
#endif /* ALLOW_USE_MPI */
C-- Make everyone wait except for master thread.
_BARRIER
_BEGIN_MASTER( myThid )
#ifndef ALLOW_USE_MPI
DO bj=1,nSy
DO bi=1,nSx
DO j=1,sNy
jG = myYGlobalLo-1+(bi-1)*sNy+j
local(j,bi,bj) = global(jG)
ENDDO
ENDDO
ENDDO
#else /* ALLOW_USE_MPI */
lbuff=(sNy+2*OLy)*nSx*nSy
isource = 0
itag = 0
IF( mpiMyId .EQ. 0 ) THEN
C-- Process 0 fills-in its local data
npe = 0
DO bj=1,nSy
DO bi=1,nSx
DO j=1,sNy
jG = mpi_myYGlobalLo(npe+1)-1+(bi-1)*sNy+j
local(j,bi,bj) = global(jG)
ENDDO
ENDDO
ENDDO
C-- Process 0 sends local arrays to all other processes
DO npe = 1, numberOfProcs-1
DO bj=1,nSy
DO bi=1,nSx
DO j=1,sNy
jG = mpi_myYGlobalLo(npe+1)-1+(bi-1)*sNy+j
temp(j,bi,bj) = global(jG)
ENDDO
ENDDO
ENDDO
CALL MPI_SEND (temp, lbuff, MPI_DOUBLE_PRECISION,
& npe, itag, MPI_COMM_MODEL, ierr)
ENDDO
ELSE
C-- All proceses except 0 receive local array from process 0
CALL MPI_RECV (local, lbuff, MPI_DOUBLE_PRECISION,
& isource, itag, MPI_COMM_MODEL, istatus, ierr)
ENDIF
#endif /* ALLOW_USE_MPI */
_END_MASTER( myThid )
_BARRIER
C-- Fill in edges.
CMM _EXCH_XY_RL( local, myThid )
RETURN
END