| 1 | SUBROUTINE SETUP_TRANS(KSMAX,KDGL,KLOEN,LDLINEAR_GRID,LDSPLIT,& |
|---|
| 2 | &KAPSETS,KTMAX,KRESOL) |
|---|
| 3 | |
|---|
| 4 | !**** *SETUP_TRANS* - Setup transform package for specific resolution |
|---|
| 5 | |
|---|
| 6 | ! Purpose. |
|---|
| 7 | ! -------- |
|---|
| 8 | ! To setup for making spectral transforms. Each call to this routine |
|---|
| 9 | ! creates a new resolution up to a maximum of NMAX_RESOL set up in |
|---|
| 10 | ! SETUP_TRANS0. You need to call SETUP_TRANS0 before this routine can |
|---|
| 11 | ! be called. |
|---|
| 12 | |
|---|
| 13 | !** Interface. |
|---|
| 14 | ! ---------- |
|---|
| 15 | ! CALL SETUP_TRANS(...) |
|---|
| 16 | |
|---|
| 17 | ! Explicit arguments : KLOEN,LDLINEAR_GRID,LDSPLIT,KAPSETS are optional arguments |
|---|
| 18 | ! -------------------- |
|---|
| 19 | ! KSMAX - spectral truncation required |
|---|
| 20 | ! KDGL - number of Gaussian latitudes |
|---|
| 21 | ! KLOEN(:) - number of points on each Gaussian latitude [2*KDGL] |
|---|
| 22 | ! LDSPLIT - true if split latitudes in grid-point space [false] |
|---|
| 23 | ! LDLINEAR_GRID - true if linear grid |
|---|
| 24 | ! KAPSETS - Number of apple sets in the distribution [0] |
|---|
| 25 | ! KTMAX - truncation order for tendencies? |
|---|
| 26 | ! KRESOL - the resolution identifier |
|---|
| 27 | |
|---|
| 28 | ! KSMAX,KDGL,KTMAX and KLOEN are GLOBAL variables desribing the resolution |
|---|
| 29 | ! in spectral and grid-point space |
|---|
| 30 | |
|---|
| 31 | ! LDSPLIT and KAPSETS describe the distribution among processors of |
|---|
| 32 | ! grid-point data and has no relevance if you are using a single processor |
|---|
| 33 | |
|---|
| 34 | ! Method. |
|---|
| 35 | ! ------- |
|---|
| 36 | |
|---|
| 37 | ! Externals. SET_RESOL - set resolution |
|---|
| 38 | ! ---------- SETUP_DIMS - setup distribution independent dimensions |
|---|
| 39 | ! SUMP_TRANS_PRELEG - first part of setup of distr. environment |
|---|
| 40 | ! SULEG - Compute Legandre polonomial and Gaussian |
|---|
| 41 | ! Latitudes and Weights |
|---|
| 42 | ! SETUP_GEOM - Compute arrays related to grid-point geometry |
|---|
| 43 | ! SUMP_TRANS - Second part of setup of distributed environment |
|---|
| 44 | ! SUFFT - setup for FFT |
|---|
| 45 | |
|---|
| 46 | ! Author. |
|---|
| 47 | ! ------- |
|---|
| 48 | ! Mats Hamrud *ECMWF* |
|---|
| 49 | |
|---|
| 50 | ! Modifications. |
|---|
| 51 | ! -------------- |
|---|
| 52 | ! Original : 00-03-03 |
|---|
| 53 | |
|---|
| 54 | ! ------------------------------------------------------------------ |
|---|
| 55 | |
|---|
| 56 | USE PARKIND1 ,ONLY : JPIM ,JPRB |
|---|
| 57 | |
|---|
| 58 | !ifndef INTERFACE |
|---|
| 59 | |
|---|
| 60 | USE TPM_GEN |
|---|
| 61 | USE TPM_DIM |
|---|
| 62 | USE TPM_DISTR |
|---|
| 63 | USE TPM_GEOMETRY |
|---|
| 64 | USE TPM_FIELDS |
|---|
| 65 | USE TPM_FFT |
|---|
| 66 | |
|---|
| 67 | USE SET_RESOL_MOD |
|---|
| 68 | USE SETUP_DIMS_MOD |
|---|
| 69 | USE SUMP_TRANS_MOD |
|---|
| 70 | USE SUMP_TRANS_PRELEG_MOD |
|---|
| 71 | USE SULEG_MOD |
|---|
| 72 | USE SETUP_GEOM_MOD |
|---|
| 73 | USE SUFFT_MOD |
|---|
| 74 | USE ABORT_TRANS_MOD |
|---|
| 75 | USE YOMHOOK ,ONLY : LHOOK, DR_HOOK |
|---|
| 76 | |
|---|
| 77 | !endif INTERFACE |
|---|
| 78 | |
|---|
| 79 | IMPLICIT NONE |
|---|
| 80 | |
|---|
| 81 | ! Dummy arguments |
|---|
| 82 | |
|---|
| 83 | INTEGER(KIND=JPIM) ,INTENT(IN) :: KSMAX,KDGL |
|---|
| 84 | INTEGER(KIND=JPIM) ,OPTIONAL,INTENT(IN) :: KLOEN(:) |
|---|
| 85 | LOGICAL ,OPTIONAL,INTENT(IN) :: LDLINEAR_GRID |
|---|
| 86 | LOGICAL ,OPTIONAL,INTENT(IN) :: LDSPLIT |
|---|
| 87 | INTEGER(KIND=JPIM) ,OPTIONAL,INTENT(IN) :: KAPSETS |
|---|
| 88 | INTEGER(KIND=JPIM) ,OPTIONAL,INTENT(IN) :: KTMAX |
|---|
| 89 | INTEGER(KIND=JPIM) ,OPTIONAL,INTENT(OUT):: KRESOL |
|---|
| 90 | |
|---|
| 91 | !ifndef INTERFACE |
|---|
| 92 | |
|---|
| 93 | ! Local variables |
|---|
| 94 | INTEGER(KIND=JPIM) :: JGL |
|---|
| 95 | |
|---|
| 96 | LOGICAL :: LLP1,LLP2 |
|---|
| 97 | REAL(KIND=JPRB) :: ZHOOK_HANDLE |
|---|
| 98 | |
|---|
| 99 | ! ------------------------------------------------------------------ |
|---|
| 100 | |
|---|
| 101 | IF (LHOOK) CALL DR_HOOK('SETUP_TRANS',0,ZHOOK_HANDLE) |
|---|
| 102 | |
|---|
| 103 | IF(MSETUP0 /= 1) THEN |
|---|
| 104 | CALL ABORT_TRANS('SETUP_TRANS: SETUP_TRANS0 HAS TO BE CALLED BEFORE SETUP_TRANS') |
|---|
| 105 | ENDIF |
|---|
| 106 | LLP1 = NPRINTLEV>0 |
|---|
| 107 | LLP2 = NPRINTLEV>1 |
|---|
| 108 | IF(LLP1) WRITE(NOUT,*) '=== ENTER ROUTINE SETUP_TRANS ===' |
|---|
| 109 | |
|---|
| 110 | ! Allocate resolution dependent structures |
|---|
| 111 | IF(.NOT. ALLOCATED(DIM_RESOL)) THEN |
|---|
| 112 | NDEF_RESOL = 1 |
|---|
| 113 | ALLOCATE(DIM_RESOL(NMAX_RESOL)) |
|---|
| 114 | ALLOCATE(FIELDS_RESOL(NMAX_RESOL)) |
|---|
| 115 | ALLOCATE(GEOM_RESOL(NMAX_RESOL)) |
|---|
| 116 | ALLOCATE(DISTR_RESOL(NMAX_RESOL)) |
|---|
| 117 | ALLOCATE(FFT_RESOL(NMAX_RESOL)) |
|---|
| 118 | ELSE |
|---|
| 119 | NDEF_RESOL = NDEF_RESOL+1 |
|---|
| 120 | IF(NDEF_RESOL > NMAX_RESOL) THEN |
|---|
| 121 | CALL ABORT_TRANS('SETUP_TRANS:NDEF_RESOL > NMAX_RESOL') |
|---|
| 122 | ENDIF |
|---|
| 123 | ENDIF |
|---|
| 124 | |
|---|
| 125 | IF (PRESENT(KRESOL)) THEN |
|---|
| 126 | KRESOL=NDEF_RESOL |
|---|
| 127 | ENDIF |
|---|
| 128 | |
|---|
| 129 | ! Point at structures due to be initialized |
|---|
| 130 | CALL SET_RESOL(NDEF_RESOL) |
|---|
| 131 | |
|---|
| 132 | IF(LLP1) WRITE(NOUT,*) '=== DEFINING RESOLUTION ',NCUR_RESOL |
|---|
| 133 | |
|---|
| 134 | |
|---|
| 135 | |
|---|
| 136 | ! Defaults for optional arguments |
|---|
| 137 | |
|---|
| 138 | |
|---|
| 139 | G%LREDUCED_GRID = .FALSE. |
|---|
| 140 | G%LINEAR_GRID = .FALSE. |
|---|
| 141 | D%LSPLIT = .FALSE. |
|---|
| 142 | D%NAPSETS = 0 |
|---|
| 143 | |
|---|
| 144 | ! NON-OPTIONAL ARGUMENTS |
|---|
| 145 | R%NSMAX = KSMAX |
|---|
| 146 | R%NDGL = KDGL |
|---|
| 147 | R%NDLON = 2*KDGL |
|---|
| 148 | |
|---|
| 149 | IF (KDGL <= 0 .OR. MOD(KDGL,2) /= 0) THEN |
|---|
| 150 | CALL ABORT_TRANS ('SETUP_TRANS: KDGL IS NOT A POSITIVE, EVEN NUMBER') |
|---|
| 151 | ENDIF |
|---|
| 152 | |
|---|
| 153 | ! Optional arguments |
|---|
| 154 | |
|---|
| 155 | ALLOCATE(G%NLOEN(R%NDGL)) |
|---|
| 156 | IF(LLP2)WRITE(NOUT,9) 'NLOEN ',SIZE(G%NLOEN ),SHAPE(G%NLOEN ) |
|---|
| 157 | IF(PRESENT(KLOEN)) THEN |
|---|
| 158 | DO JGL=1,R%NDGL |
|---|
| 159 | IF(KLOEN(JGL) /= R%NDLON) THEN |
|---|
| 160 | G%LREDUCED_GRID = .TRUE. |
|---|
| 161 | EXIT |
|---|
| 162 | ENDIF |
|---|
| 163 | ENDDO |
|---|
| 164 | ENDIF |
|---|
| 165 | |
|---|
| 166 | IF (G%LREDUCED_GRID) THEN |
|---|
| 167 | G%NLOEN(:) = KLOEN(1:R%NDGL) |
|---|
| 168 | ELSE |
|---|
| 169 | G%NLOEN(:) = R%NDLON |
|---|
| 170 | ENDIF |
|---|
| 171 | |
|---|
| 172 | IF(PRESENT(LDSPLIT)) THEN |
|---|
| 173 | D%LSPLIT = LDSPLIT |
|---|
| 174 | ENDIF |
|---|
| 175 | |
|---|
| 176 | IF(PRESENT(KAPSETS)) THEN |
|---|
| 177 | D%NAPSETS = KAPSETS |
|---|
| 178 | ENDIF |
|---|
| 179 | |
|---|
| 180 | IF(PRESENT(KTMAX)) THEN |
|---|
| 181 | R%NTMAX = KTMAX |
|---|
| 182 | ELSE |
|---|
| 183 | R%NTMAX = R%NSMAX |
|---|
| 184 | ENDIF |
|---|
| 185 | IF(R%NTMAX /= R%NSMAX) THEN |
|---|
| 186 | !This SHOULD work but I don't know how to test it /MH |
|---|
| 187 | CALL ABORT_TRANS('SETUP_TRANS:R%NTMAX /= R%NSMAX HAS NOT BEEN VALIDATED') |
|---|
| 188 | ENDIF |
|---|
| 189 | !Temporary? |
|---|
| 190 | IF(PRESENT(LDLINEAR_GRID)) THEN |
|---|
| 191 | G%LINEAR_GRID = LDLINEAR_GRID |
|---|
| 192 | ELSEIF(R%NSMAX > (R%NDLON+3)/3) THEN |
|---|
| 193 | G%LINEAR_GRID = .TRUE. |
|---|
| 194 | ENDIF |
|---|
| 195 | |
|---|
| 196 | ! Setup resolution dependent structures |
|---|
| 197 | ! ------------------------------------- |
|---|
| 198 | |
|---|
| 199 | ! Setup distribution independent dimensions |
|---|
| 200 | CALL SETUP_DIMS |
|---|
| 201 | |
|---|
| 202 | ! First part of setup of distributed environment |
|---|
| 203 | CALL SUMP_TRANS_PRELEG |
|---|
| 204 | |
|---|
| 205 | ! Compute Legandre polonomial and Gaussian Latitudes and Weights |
|---|
| 206 | CALL SULEG |
|---|
| 207 | |
|---|
| 208 | !CALL GSTATS(1802,0) MPL 2.12.08 |
|---|
| 209 | ! Compute arrays related to grid-point geometry |
|---|
| 210 | CALL SETUP_GEOM |
|---|
| 211 | |
|---|
| 212 | ! Second part of setup of distributed environment |
|---|
| 213 | CALL SUMP_TRANS |
|---|
| 214 | |
|---|
| 215 | ! Initialize Fast Fourier Transform package |
|---|
| 216 | CALL SUFFT |
|---|
| 217 | !CALL GSTATS(1802,1) MPL 2.12.08 |
|---|
| 218 | |
|---|
| 219 | |
|---|
| 220 | IF (LHOOK) CALL DR_HOOK('SETUP_TRANS',1,ZHOOK_HANDLE) |
|---|
| 221 | ! ------------------------------------------------------------------ |
|---|
| 222 | 9 FORMAT(1X,'ARRAY ',A10,' ALLOCATED ',8I8) |
|---|
| 223 | |
|---|
| 224 | !endif INTERFACE |
|---|
| 225 | |
|---|
| 226 | END SUBROUTINE SETUP_TRANS |
|---|
| 227 | |
|---|
| 228 | |
|---|