1 !-----------------------------------------------------------------------
2 SUBROUTINE DSTRB(ARRAYG,ARRAYL,LGS,LGE,LLS,LLE,L1 &
3 &, IDS,IDE,JDS,JDE,KDS,KDE &
4 &, IMS,IME,JMS,JME,KMS,KME &
5 &, ITS,ITE,JTS,JTE,KTS,KTE)
6 !-----------------------------------------------------------------------
7 ! DSTRB DISTRIBUTES THE ELEMENTS OF REAL GLOBAL ARRAY ARRG TO THE
8 ! REAL LOCAL ARRAYS ARRL. LG IS THE VERTICAL DIMENSION OF THE
9 ! GLOBAL ARRAY. LL IS THE VERTICAL DIMENSION OF THE LOCAL ARRAY.
10 ! L1 IS THE SPECIFIC LEVEL OF ARRL THAT IS BEING FILLED DURING
11 ! THIS CALL (PERTINENT WHEN LG=1 AND LL>1).
12 !-----------------------------------------------------------------------
13 USE MODULE_EXT_INTERNAL
14 !-----------------------------------------------------------------------
16 !-----------------------------------------------------------------------
17 #if defined(DM_PARALLEL) && !defined(STUBMPI)
20 !-----------------------------------------------------------------------
22 !*** ARGUMENT VARIABLES
24 INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
25 &, IMS,IME,JMS,JME,KMS,KME &
26 &, ITS,ITE,JTS,JTE,KTS,KTE
27 INTEGER,INTENT(IN) :: L1,LGE,LGS,LLE,LLS
29 REAL,DIMENSION(IDS:IDE,JDS:JDE,LGS:LGE),INTENT(IN) :: ARRAYG
30 REAL,DIMENSION(IMS:IME,JMS:JME,LLS:LLE),INTENT(OUT) :: ARRAYL
31 !-----------------------------------------------------------------------
35 #if defined(DM_PARALLEL) && !defined(STUBMPI)
36 REAL,ALLOCATABLE,DIMENSION(:) :: ARRAYX
38 INTEGER :: I,IEND,IPE,IRECV,IRTN,ISEND,ISTART,J,JEND,JSTART,KNT &
39 &, L,MPI_COMM_COMP,NUMVALS,MYPE,NPES
40 INTEGER,DIMENSION(4) :: LIMITS
41 INTEGER,DIMENSION(MPI_STATUS_SIZE) :: ISTAT
45 !-----------------------------------------------------------------------
46 !***********************************************************************
47 !-----------------------------------------------------------------------
48 #if defined(DM_PARALLEL) && !defined(STUBMPI)
50 !*** GET OUR TASK ID AND THE COMMUNICATOR
52 CALL WRF_GET_MYPROC(MYPE)
53 CALL WRF_GET_DM_COMMUNICATOR(MPI_COMM_COMP)
54 CALL WRF_GET_NPROC(NPES)
56 !*** INITIALIZE THE OUTPUT ARRAY
66 !-----------------------------------------------------------------------
67 !*** TASK 0 FILLS ITS OWN LOCAL DOMAIN THEN PARCELS OUT ALL THE OTHER
68 !*** PIECES TO THE OTHER TASKS.
69 !-----------------------------------------------------------------------
71 tasks : IF(MYPE==0)THEN
76 ARRAYL(I,J,L1)=ARRAYG(I,J,LGS)
85 ARRAYL(I,J,L)=ARRAYG(I,J,L)
91 !*** TASK 0 NEEDS THE LIMITS FROM EACH OF THE OTHER TASKS AND THEN
92 !*** SENDS OUT THE APPROPRIATE PIECE OF THE GLOBAL ARRAY.
96 CALL MPI_RECV(LIMITS,4,MPI_INTEGER,IPE,IPE,MPI_COMM_COMP &
103 NUMVALS=(IEND-ISTART+1)*(JEND-JSTART+1)*(LGE-LGS+1)
104 ALLOCATE(ARRAYX(NUMVALS),STAT=I)
112 ARRAYX(KNT)=ARRAYG(I,J,L)
117 CALL MPI_SEND(ARRAYX,KNT,MPI_REAL,IPE,IPE,MPI_COMM_COMP,ISEND)
123 !-----------------------------------------------------------------------
124 !*** ALL OTHER TASKS TELL TASK 0 WHAT THEIR HORIZONTAL LIMITS ARE AND
125 !*** RECEIVE THEIR PIECE OF THE GLOBAL ARRAY FROM TASK 0.
126 !-----------------------------------------------------------------------
135 CALL MPI_SEND(LIMITS,4,MPI_INTEGER,0,MYPE,MPI_COMM_COMP,ISEND)
137 NUMVALS=(ITE-ITS+1)*(JTE-JTS+1)*(LGE-LGS+1)
138 ALLOCATE(ARRAYX(NUMVALS),STAT=I)
140 CALL MPI_RECV(ARRAYX,NUMVALS,MPI_REAL,0,MYPE,MPI_COMM_COMP &
148 ARRAYL(I,J,L1)=ARRAYX(KNT)
156 ARRAYL(I,J,L)=ARRAYX(KNT)
164 !-----------------------------------------------------------------------
168 !-----------------------------------------------------------------------
169 CALL MPI_BARRIER(MPI_COMM_COMP,IRTN)
170 !-----------------------------------------------------------------------
173 !*** INITIALIZE THE OUTPUT ARRAY
180 ARRAYL(I,J,L)=ARRAYG(I,J,L)
188 !-----------------------------------------------------------------------