merge standard release WRF/WPS V3.0.1.1 into wrffire
[wrffire.git] / wrfv2_fire / dyn_nmm / DSTRB.F
blob0f0251b258724bc02b1bbfab8ce9138962595a07
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 !-----------------------------------------------------------------------
15       IMPLICIT NONE
16 !-----------------------------------------------------------------------
17 #if defined(DM_PARALLEL) && !defined(STUBMPI)
18       INCLUDE "mpif.h"
19 #endif
20 !-----------------------------------------------------------------------
21 !***
22 !***  ARGUMENT VARIABLES
23 !***
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 !-----------------------------------------------------------------------
32 !***
33 !***  LOCAL VARIABLES
34 !***
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
42 #else
43       INTEGER :: I,L,J
44 #endif
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
58       DO L=LLS,LLE
59       DO J=JMS,JME
60       DO I=IMS,IME
61         ARRAYL(I,J,L)=0.
62       ENDDO
63       ENDDO
64       ENDDO
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
73         IF(LGE==LGS)THEN
74           DO J=JTS,JTE
75           DO I=ITS,ITE
76             ARRAYL(I,J,L1)=ARRAYG(I,J,LGS)
77           ENDDO
78           ENDDO
80         ELSE
82           DO L=LGS,LGE
83             DO J=JTS,JTE
84             DO I=ITS,ITE
85               ARRAYL(I,J,L)=ARRAYG(I,J,L)
86             ENDDO
87             ENDDO
88           ENDDO
89         ENDIF
91 !***  TASK 0 NEEDS THE LIMITS FROM EACH OF THE OTHER TASKS AND THEN
92 !***  SENDS OUT THE APPROPRIATE PIECE OF THE GLOBAL ARRAY.
94         DO IPE=1,NPES-1
96           CALL MPI_RECV(LIMITS,4,MPI_INTEGER,IPE,IPE,MPI_COMM_COMP      &
97      &,                 ISTAT,IRECV)
98           ISTART=LIMITS(1)
99           IEND=LIMITS(2)
100           JSTART=LIMITS(3)
101           JEND=LIMITS(4)
103           NUMVALS=(IEND-ISTART+1)*(JEND-JSTART+1)*(LGE-LGS+1)
104           ALLOCATE(ARRAYX(NUMVALS),STAT=I)
105           
106           KNT=0
108           DO L=LGS,LGE
109             DO J=JSTART,JEND
110             DO I=ISTART,IEND
111               KNT=KNT+1
112               ARRAYX(KNT)=ARRAYG(I,J,L)
113             ENDDO
114             ENDDO
115           ENDDO
117           CALL MPI_SEND(ARRAYX,KNT,MPI_REAL,IPE,IPE,MPI_COMM_COMP,ISEND)
119           DEALLOCATE(ARRAYX)
121         ENDDO
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 !-----------------------------------------------------------------------
128       ELSE
130         LIMITS(1)=ITS
131         LIMITS(2)=ITE
132         LIMITS(3)=JTS
133         LIMITS(4)=JTE
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      &
141      &,               ISTAT,IRECV)
143         KNT=0
144         IF(LGE==LGS)THEN
145           DO J=JTS,JTE
146           DO I=ITS,ITE
147             KNT=KNT+1
148             ARRAYL(I,J,L1)=ARRAYX(KNT)
149           ENDDO
150           ENDDO
151         ELSE
152           DO L=LGS,LGE
153             DO J=JTS,JTE
154             DO I=ITS,ITE
155               KNT=KNT+1
156               ARRAYL(I,J,L)=ARRAYX(KNT)
157             ENDDO
158             ENDDO
159           ENDDO
160         ENDIF
162         DEALLOCATE(ARRAYX)
164 !-----------------------------------------------------------------------
166       ENDIF tasks
168 !-----------------------------------------------------------------------
169       CALL MPI_BARRIER(MPI_COMM_COMP,IRTN)
170 !-----------------------------------------------------------------------
173 !***  INITIALIZE THE OUTPUT ARRAY
175       ARRAYL=0.0
177       DO L=LGS,LGE
178       DO J=JDS,JDE
179       DO I=IDS,IDE
180         ARRAYL(I,J,L)=ARRAYG(I,J,L)
181       ENDDO
182       ENDDO
183       ENDDO
185 #endif
186       END SUBROUTINE DSTRB
188 !-----------------------------------------------------------------------