[1989] | 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 | |
---|