1 | MODULE SUMP_TRANS_MOD |
---|
2 | CONTAINS |
---|
3 | SUBROUTINE SUMP_TRANS |
---|
4 | |
---|
5 | ! Set up distributed environment for the transform package (part 2) |
---|
6 | |
---|
7 | USE PARKIND1 ,ONLY : JPIM ,JPRB |
---|
8 | |
---|
9 | USE TPM_GEN |
---|
10 | USE TPM_DIM |
---|
11 | USE TPM_GEOMETRY |
---|
12 | USE TPM_DISTR |
---|
13 | |
---|
14 | USE SUWAVEDI_MOD |
---|
15 | USE PE2SET_MOD |
---|
16 | USE SUMPLATF_MOD |
---|
17 | USE SUMPLAT_MOD |
---|
18 | USE SUSTAONL_MOD |
---|
19 | USE MYSENDSET_MOD |
---|
20 | USE MYRECVSET_MOD |
---|
21 | USE EQ_REGIONS_MOD |
---|
22 | |
---|
23 | IMPLICIT NONE |
---|
24 | |
---|
25 | INTEGER(KIND=JPIM) :: JM,JMLOC |
---|
26 | INTEGER(KIND=JPIM) :: JGL,IGL,IPLAT,ISENDSET,IRECVSET,JML,IPOS,IM |
---|
27 | INTEGER(KIND=JPIM) :: I1,I2,I3,IAUX0,IAUX1,JA1 |
---|
28 | INTEGER(KIND=JPIM) :: IGPTOT,IMEDIAP,IRESTM,JA,JB,IOFF |
---|
29 | INTEGER(KIND=JPIM),ALLOCATABLE :: IGPTOTL(:,:) |
---|
30 | |
---|
31 | LOGICAL :: LLP1,LLP2 |
---|
32 | |
---|
33 | ! ------------------------------------------------------------------ |
---|
34 | |
---|
35 | |
---|
36 | LLP1 = NPRINTLEV>0 |
---|
37 | LLP2 = NPRINTLEV>1 |
---|
38 | IF(LLP1) WRITE(NOUT,*) '=== ENTER ROUTINE SUMP_TRANS ===' |
---|
39 | |
---|
40 | ALLOCATE(D%NULTPP(NPRTRNS)) |
---|
41 | IF(LLP2)WRITE(NOUT,9) 'D%NULTPP ',SIZE(D%NULTPP ),SHAPE(D%NULTPP ) |
---|
42 | ALLOCATE(D%NPTRLS(NPRTRNS)) |
---|
43 | IF(LLP2)WRITE(NOUT,9) 'D%NPTRLS ',SIZE(D%NPTRLS ),SHAPE(D%NPTRLS ) |
---|
44 | ALLOCATE(D%NPROCL(R%NDGL)) |
---|
45 | IF(LLP2)WRITE(NOUT,9) 'D%NPROCL ',SIZE(D%NPROCL ),SHAPE(D%NPROCL ) |
---|
46 | |
---|
47 | CALL SUMPLATF(R%NDGL,NPRTRNS,MYSETW,D%NULTPP,D%NPROCL,D%NPTRLS) |
---|
48 | D%NDGL_FS = D%NULTPP(MYSETW) |
---|
49 | |
---|
50 | ! Help arrays for spectral to fourier space transposition |
---|
51 | ALLOCATE(D%NLTSGTB (NPRTRNS+1)) |
---|
52 | IF(LLP2)WRITE(NOUT,9) 'D%NLTSGTB ',SIZE(D%NLTSGTB),SHAPE(D%NLTSGTB) |
---|
53 | ALLOCATE(D%NLTSFTB (NPRTRNS+1)) |
---|
54 | IF(LLP2)WRITE(NOUT,9) 'D%NLTSFTB ',SIZE(D%NLTSFTB),SHAPE(D%NLTSFTB) |
---|
55 | ALLOCATE(D%NSTAGT0B(NPRTRNS+1)) |
---|
56 | IF(LLP2)WRITE(NOUT,9) 'D%NSTAGT0B ',SIZE(D%NSTAGT0B),SHAPE(D%NSTAGT0B) |
---|
57 | ALLOCATE(D%NSTAGT1B(NPRTRNS+1)) |
---|
58 | IF(LLP2)WRITE(NOUT,9) 'D%NSTAGT1B ',SIZE(D%NSTAGT1B),SHAPE(D%NSTAGT1B) |
---|
59 | ALLOCATE(D%MSTABF (NPRTRNS+1)) |
---|
60 | IF(LLP2)WRITE(NOUT,9) 'D%MSTABF ',SIZE(D%MSTABF),SHAPE(D%MSTABF) |
---|
61 | |
---|
62 | D%NLTSGTB(:) = 0 |
---|
63 | DO JGL=1,D%NDGL_FS |
---|
64 | IGL = D%NPTRLS(MYSETW)+JGL-1 |
---|
65 | DO JM=0,G%NMEN(IGL) |
---|
66 | D%NLTSGTB(D%NPROCM(JM)) = D%NLTSGTB(D%NPROCM(JM))+1 |
---|
67 | ENDDO |
---|
68 | ENDDO |
---|
69 | DO JA=1,NPRTRW |
---|
70 | IPLAT = 0 |
---|
71 | DO JGL=1,D%NULTPP(JA) |
---|
72 | IGL = D%NPTRLS(JA)+JGL-1 |
---|
73 | DO JM=1,D%NUMP |
---|
74 | IF(IGL > R%NDGNH-G%NDGLU(D%MYMS(JM)) .AND. IGL <= R%NDGNH+G%NDGLU(D%MYMS(JM))) THEN |
---|
75 | IPLAT = IPLAT + 1 |
---|
76 | ENDIF |
---|
77 | ENDDO |
---|
78 | ENDDO |
---|
79 | D%NLTSFTB(JA) = IPLAT |
---|
80 | ENDDO |
---|
81 | |
---|
82 | DO JA=1,NPRTRW-1 |
---|
83 | ISENDSET = MYSENDSET(NPRTRW,MYSETW,JA) |
---|
84 | IRECVSET = MYRECVSET(NPRTRW,MYSETW,JA) |
---|
85 | D%MSTABF(IRECVSET) = ISENDSET |
---|
86 | ENDDO |
---|
87 | D%MSTABF(MYSETW) = MYSETW |
---|
88 | |
---|
89 | ALLOCATE(D%NPNTGTB0(0:R%NSMAX,D%NDGL_FS)) |
---|
90 | IF(LLP2)WRITE(NOUT,9) 'D%NPNTGTB0 ',SIZE(D%NPNTGTB0 ),SHAPE(D%NPNTGTB0 ) |
---|
91 | ALLOCATE(D%NPNTGTB1(D%NUMP,R%NDGL)) |
---|
92 | IF(LLP2)WRITE(NOUT,9) 'D%NPNTGTB1 ',SIZE(D%NPNTGTB1 ),SHAPE(D%NPNTGTB1 ) |
---|
93 | |
---|
94 | DO JA=1,NPRTRW |
---|
95 | IPOS = 0 |
---|
96 | DO JGL=1,D%NULTPP(MYSETW) |
---|
97 | IGL = D%NPTRLS(MYSETW) + JGL - 1 |
---|
98 | DO JML=D%NPTRMS(JA),D%NPTRMS(JA)+D%NUMPP(JA)-1 |
---|
99 | IM = D%NALLMS(JML) |
---|
100 | IF (IM <= G%NMEN(IGL)) THEN |
---|
101 | D%NPNTGTB0(IM,JGL) = IPOS |
---|
102 | IPOS = IPOS+1 |
---|
103 | ELSE |
---|
104 | D%NPNTGTB0(IM,JGL) = -99 |
---|
105 | ENDIF |
---|
106 | ENDDO |
---|
107 | ENDDO |
---|
108 | ENDDO |
---|
109 | |
---|
110 | DO JA=1,NPRTRW |
---|
111 | IPOS = 0 |
---|
112 | DO JGL=1,D%NULTPP(JA) |
---|
113 | IGL = D%NPTRLS(JA) + JGL - 1 |
---|
114 | DO JM=1,D%NUMP |
---|
115 | IM = D%MYMS(JM) |
---|
116 | IF (IM <= G%NMEN(IGL)) THEN |
---|
117 | D%NPNTGTB1(JM,IGL) = IPOS |
---|
118 | IPOS = IPOS+1 |
---|
119 | ELSE |
---|
120 | D%NPNTGTB1(JM,IGL) = -99 |
---|
121 | ENDIF |
---|
122 | ENDDO |
---|
123 | ENDDO |
---|
124 | ENDDO |
---|
125 | |
---|
126 | IAUX0 = 0 |
---|
127 | IAUX1 = 0 |
---|
128 | DO JA=1,NPRTRNS-1 |
---|
129 | I1 = MYSENDSET(NPRTRNS,MYSETW,JA) |
---|
130 | I2 = MYRECVSET(NPRTRNS,MYSETW,JA) |
---|
131 | DO JA1=1,NPRTRNS-1 |
---|
132 | IF(MYSENDSET(NPRTRNS,MYSETW,JA1) == I2) I3 =MYRECVSET(NPRTRNS,MYSETW,JA1) |
---|
133 | ENDDO |
---|
134 | IAUX0 = MAX(D%NLTSFTB(I1),D%NLTSGTB(I2),IAUX0) |
---|
135 | IAUX1 = MAX(D%NLTSGTB(I2),D%NLTSFTB(I3),IAUX1) |
---|
136 | ENDDO |
---|
137 | IAUX0 = MAX(D%NLTSGTB(MYSETW),IAUX0) |
---|
138 | IAUX1 = MAX(D%NLTSGTB(MYSETW),IAUX1) |
---|
139 | DO JA=1,NPRTRNS+1 |
---|
140 | D%NSTAGT0B(JA) = (JA-1)*IAUX0 |
---|
141 | D%NSTAGT1B(JA) = (JA-1)*IAUX1 |
---|
142 | ENDDO |
---|
143 | D%NLENGT0B = IAUX0*NPRTRNS |
---|
144 | D%NLENGT1B = IAUX1*NPRTRNS |
---|
145 | |
---|
146 | ! GRIDPOINT SPACE |
---|
147 | |
---|
148 | ALLOCATE(D%NFRSTLAT(N_REGIONS_NS)) |
---|
149 | IF(LLP2)WRITE(NOUT,9) 'D%NFRSTLAT ',SIZE(D%NFRSTLAT ),SHAPE(D%NFRSTLAT ) |
---|
150 | ALLOCATE(D%NLSTLAT(N_REGIONS_NS)) |
---|
151 | IF(LLP2)WRITE(NOUT,9) 'D%NLSTLAT ',SIZE(D%NLSTLAT ),SHAPE(D%NLSTLAT ) |
---|
152 | ALLOCATE(D%NPTRLAT(R%NDGL)) |
---|
153 | IF(LLP2)WRITE(NOUT,9) 'D%NPTRLAT ',SIZE(D%NPTRLAT ),SHAPE(D%NPTRLAT ) |
---|
154 | ALLOCATE(D%NPTRFRSTLAT(N_REGIONS_NS)) |
---|
155 | IF(LLP2)WRITE(NOUT,9) 'D%NPTRFRSTLAT',SIZE(D%NPTRFRSTLAT),SHAPE(D%NPTRFRSTLAT) |
---|
156 | ALLOCATE(D%NPTRLSTLAT(N_REGIONS_NS)) |
---|
157 | IF(LLP2)WRITE(NOUT,9)'D%NPTRLSTLAT',SIZE(D%NPTRLSTLAT),SHAPE(D%NPTRLSTLAT) |
---|
158 | ALLOCATE(D%LSPLITLAT(R%NDGL)) |
---|
159 | IF(LLP2)WRITE(NOUT,9) 'D%LSPLITLAT',SIZE(D%LSPLITLAT),SHAPE(D%LSPLITLAT) |
---|
160 | |
---|
161 | |
---|
162 | CALL SUMPLAT(R%NDGL,NPROC,N_REGIONS_NS,MY_REGION_NS,D%LSPLIT,LEQ_REGIONS,& |
---|
163 | &D%NFRSTLAT,D%NLSTLAT,D%NFRSTLOFF,D%NPTRLAT,& |
---|
164 | &D%NPTRFRSTLAT,D%NPTRLSTLAT,D%NPTRFLOFF,& |
---|
165 | &IMEDIAP,IRESTM,D%LSPLITLAT) |
---|
166 | |
---|
167 | D%NDGL_GP = D%NLSTLAT(MY_REGION_NS)-D%NFRSTLOFF |
---|
168 | |
---|
169 | IF (LLP1) THEN |
---|
170 | WRITE(NOUT,FMT='(/'' OUTPUT FROM ROUTINE SUMPLAT: ''/)') |
---|
171 | WRITE(NOUT,FMT='('' D%NULTPP '')') |
---|
172 | WRITE(NOUT,FMT='(20(1X,I4))') D%NULTPP(1:NPRTRNS) |
---|
173 | WRITE(NOUT,FMT='('' D%NPROCL '')') |
---|
174 | WRITE(NOUT,FMT='(20(1X,I4))') D%NPROCL(1:R%NDGL) |
---|
175 | WRITE(NOUT,FMT='('' D%NFRSTLAT '')') |
---|
176 | WRITE(NOUT,FMT='(20(1X,I4))') D%NFRSTLAT(1:N_REGIONS_NS) |
---|
177 | WRITE(NOUT,FMT='('' D%NLSTLAT '')') |
---|
178 | WRITE(NOUT,FMT='(20(1X,I4))') D%NLSTLAT(1:N_REGIONS_NS) |
---|
179 | WRITE(NOUT,FMT='('' D%NFRSTLOFF D%NPTRFLOFF '')') |
---|
180 | WRITE(NOUT,FMT='(2(1X,I6))') D%NFRSTLOFF, D%NPTRFLOFF |
---|
181 | WRITE(NOUT,FMT='('' D%NPTRLAT '')') |
---|
182 | WRITE(NOUT,FMT='(20(1X,I4))') D%NPTRLAT(1:R%NDGL) |
---|
183 | WRITE(NOUT,FMT='('' D%LSPLITLAT '')') |
---|
184 | WRITE(NOUT,FMT='(50(1X,L1))') D%LSPLITLAT(1:R%NDGL) |
---|
185 | WRITE(NOUT,FMT='('' D%NPTRFRSTLAT '')') |
---|
186 | WRITE(NOUT,FMT='(20(1X,I4))') D%NPTRFRSTLAT(1:N_REGIONS_NS) |
---|
187 | WRITE(NOUT,FMT='('' D%NPTRLSTLAT '')') |
---|
188 | WRITE(NOUT,FMT='(20(1X,I4))') D%NPTRLSTLAT(1:N_REGIONS_NS) |
---|
189 | WRITE(NOUT,FMT='(/)') |
---|
190 | ENDIF |
---|
191 | ALLOCATE(D%NSTA(R%NDGL+N_REGIONS_NS-1,N_REGIONS_EW)) |
---|
192 | IF(LLP2)WRITE(NOUT,9) 'D%NSTA ',SIZE(D%NSTA ),SHAPE(D%NSTA ) |
---|
193 | ALLOCATE(D%NONL(R%NDGL+N_REGIONS_NS-1,N_REGIONS_EW)) |
---|
194 | IF(LLP2)WRITE(NOUT,9) 'D%NONL ',SIZE(D%NONL ),SHAPE(D%NONL ) |
---|
195 | |
---|
196 | CALL SUSTAONL(IMEDIAP,IRESTM) |
---|
197 | |
---|
198 | ! IGPTOTL is the number of grid points in each individual processor |
---|
199 | ALLOCATE(IGPTOTL(N_REGIONS_NS,N_REGIONS_EW)) |
---|
200 | IGPTOTL(:,:)=0 |
---|
201 | |
---|
202 | DO JA=1,N_REGIONS_NS |
---|
203 | DO JB=1,N_REGIONS(JA) |
---|
204 | IGPTOT = 0 |
---|
205 | DO JGL=D%NPTRFRSTLAT(JA),D%NPTRLSTLAT(JA) |
---|
206 | IGPTOT = IGPTOT+D%NONL(JGL,JB) |
---|
207 | ENDDO |
---|
208 | IGPTOTL(JA,JB) = IGPTOT |
---|
209 | ENDDO |
---|
210 | ENDDO |
---|
211 | D%NGPTOT = IGPTOTL(MY_REGION_NS,MY_REGION_EW) |
---|
212 | D%NGPTOTMX = MAXVAL(IGPTOTL) |
---|
213 | D%NGPTOTG = SUM(IGPTOTL) |
---|
214 | ALLOCATE(D%NGPTOTL(N_REGIONS_NS,N_REGIONS_EW)) |
---|
215 | IF(LLP2)WRITE(NOUT,9) 'D%NGPTOTL ',SIZE(D%NGPTOTL ),SHAPE(D%NGPTOTL ) |
---|
216 | D%NGPTOTL(:,:) = IGPTOTL(:,:) |
---|
217 | |
---|
218 | ALLOCATE(D%NSTAGTF(D%NDGL_FS)) |
---|
219 | IF(LLP2)WRITE(NOUT,9) 'D%NSTAGTF ',SIZE(D%NSTAGTF ),SHAPE(D%NSTAGTF ) |
---|
220 | IOFF = 0 |
---|
221 | DO JGL=1,D%NDGL_FS |
---|
222 | D%NSTAGTF(JGL) = IOFF |
---|
223 | IGL = D%NPTRLS(MYSETW) + JGL - 1 |
---|
224 | IOFF = IOFF + G%NLOEN(IGL)+3 |
---|
225 | ENDDO |
---|
226 | D%NLENGTF = IOFF |
---|
227 | |
---|
228 | DEALLOCATE(IGPTOTL) |
---|
229 | |
---|
230 | ! ------------------------------------------------------------------ |
---|
231 | 9 FORMAT(1X,'ARRAY ',A10,' ALLOCATED ',8I8) |
---|
232 | |
---|
233 | END SUBROUTINE SUMP_TRANS |
---|
234 | END MODULE SUMP_TRANS_MOD |
---|
235 | |
---|
236 | |
---|