[1989] | 1 | MODULE SUWAVEDI_MOD |
---|
| 2 | CONTAINS |
---|
| 3 | SUBROUTINE SUWAVEDI(KSMAX,KTMAX,KPRTRW,KMYSETW,KASM0,KSPOLEGL,KPROCM,& |
---|
| 4 | &KUMPP,KSPEC,KSPEC2,KSPEC2MX,KPOSSP,KMYMS,& |
---|
| 5 | &KPTRMS,KALLMS,KDIM0G) |
---|
| 6 | |
---|
| 7 | !**** *SUWAVEDI * - Routine to initialize spectral wave distribution |
---|
| 8 | |
---|
| 9 | ! Purpose. |
---|
| 10 | ! -------- |
---|
| 11 | ! Initialize arrays controlling spectral wave distribution |
---|
| 12 | |
---|
| 13 | !** Interface. |
---|
| 14 | ! ---------- |
---|
| 15 | ! *CALL* *SUWAVEDI * |
---|
| 16 | |
---|
| 17 | ! Explicit arguments : |
---|
| 18 | ! -------------------- |
---|
| 19 | ! KSMAX - Spectral truncation limit (input) |
---|
| 20 | ! KTMAX - Overtruncation for KSMAX (input) |
---|
| 21 | ! KPRTRW - Number of processors in A-direction (input) |
---|
| 22 | ! KMYSETW - A-set for present processor (input) |
---|
| 23 | ! KASM0 - Offsets for spectral waves (output) |
---|
| 24 | ! KSPOLEGL - Local version of NSPOLEG (output) |
---|
| 25 | ! KPROCM - Where a certain spectral wave belongs (output) |
---|
| 26 | ! KUMPP - Number of spectral waves on this PE (output) |
---|
| 27 | ! KSPEC - Local version on NSPEC (output) |
---|
| 28 | ! KSPEC2 - Local version on NSPEC2 (output) |
---|
| 29 | ! KSPEC2MX - Maximum KSPEC2 across PEs (output) |
---|
| 30 | ! KPOSSP - Global spectral fields partitioning (output) |
---|
| 31 | ! KMYMS - This PEs spectral zonal wavenumbers (output) |
---|
| 32 | |
---|
| 33 | ! Implicit arguments : NONE |
---|
| 34 | ! -------------------- |
---|
| 35 | |
---|
| 36 | ! Method. |
---|
| 37 | ! ------- |
---|
| 38 | ! See documentation |
---|
| 39 | |
---|
| 40 | ! Externals. NONE. |
---|
| 41 | ! ---------- |
---|
| 42 | |
---|
| 43 | ! Reference. |
---|
| 44 | ! ---------- |
---|
| 45 | ! ECMWF Research Department documentation of the IFS |
---|
| 46 | |
---|
| 47 | ! Author. |
---|
| 48 | ! ------- |
---|
| 49 | ! MPP Group *ECMWF* |
---|
| 50 | |
---|
| 51 | ! Modifications. |
---|
| 52 | ! -------------- |
---|
| 53 | ! Original : 96-01-10 |
---|
| 54 | ! L.Isaksen: 96-02-02 - Calculation of KSPEC2MX added |
---|
| 55 | ! K.YESSAD : 97-02-18 - Add KTMAX, bug correction for KSPOLEGL. |
---|
| 56 | ! ------------------------------------------------------------------ |
---|
| 57 | |
---|
| 58 | USE PARKIND1 ,ONLY : JPIM ,JPRB |
---|
| 59 | |
---|
| 60 | IMPLICIT NONE |
---|
| 61 | |
---|
| 62 | |
---|
| 63 | ! DUMMY |
---|
| 64 | INTEGER(KIND=JPIM),INTENT(IN) :: KSMAX |
---|
| 65 | INTEGER(KIND=JPIM),INTENT(IN) :: KTMAX |
---|
| 66 | INTEGER(KIND=JPIM),INTENT(IN) :: KPRTRW |
---|
| 67 | INTEGER(KIND=JPIM),INTENT(IN) :: KMYSETW |
---|
| 68 | INTEGER(KIND=JPIM),OPTIONAL,INTENT(OUT) :: KSPEC |
---|
| 69 | INTEGER(KIND=JPIM),OPTIONAL,INTENT(OUT) :: KSPEC2 |
---|
| 70 | INTEGER(KIND=JPIM),OPTIONAL,INTENT(OUT) :: KSPEC2MX |
---|
| 71 | INTEGER(KIND=JPIM),OPTIONAL,INTENT(OUT) :: KSPOLEGL |
---|
| 72 | |
---|
| 73 | INTEGER(KIND=JPIM),OPTIONAL,INTENT(OUT) :: KASM0(0:KSMAX) |
---|
| 74 | INTEGER(KIND=JPIM),OPTIONAL,INTENT(OUT) :: KPROCM(0:KSMAX) |
---|
| 75 | INTEGER(KIND=JPIM),OPTIONAL,INTENT(OUT) :: KUMPP(KPRTRW) |
---|
| 76 | INTEGER(KIND=JPIM),OPTIONAL,INTENT(OUT) :: KMYMS(KSMAX+1) |
---|
| 77 | INTEGER(KIND=JPIM),OPTIONAL,INTENT(OUT) :: KPOSSP(KPRTRW+1) |
---|
| 78 | INTEGER(KIND=JPIM),OPTIONAL,INTENT(OUT) :: KPTRMS(KPRTRW) |
---|
| 79 | INTEGER(KIND=JPIM),OPTIONAL,INTENT(OUT) :: KALLMS(KSMAX+1) |
---|
| 80 | INTEGER(KIND=JPIM),OPTIONAL,INTENT(OUT) :: KDIM0G(0:KSMAX) |
---|
| 81 | |
---|
| 82 | ! LOCAL |
---|
| 83 | INTEGER(KIND=JPIM) :: IK, IL, IND, IPOS, ISPEC2P, JA, JM,JMLOC,IM |
---|
| 84 | INTEGER(KIND=JPIM) :: ISPOLEGL,ISPEC2MX,IASM0(0:KSMAX),IPROCM(0:KSMAX) |
---|
| 85 | INTEGER(KIND=JPIM) :: IUMPP(KPRTRW),IMYMS(KSMAX+1),IPOSSP(KPRTRW+1) |
---|
| 86 | INTEGER(KIND=JPIM) :: IPTRMS(KPRTRW),IALLMS(KSMAX+1),IDIM0G(0:KSMAX) |
---|
| 87 | INTEGER(KIND=JPIM) :: ISPEC(KPRTRW),IC(KPRTRW) |
---|
| 88 | |
---|
| 89 | |
---|
| 90 | ! ----------------------------------------------------------------- |
---|
| 91 | |
---|
| 92 | !* 1. Initialize partitioning of wave numbers to PEs |
---|
| 93 | ! ---------------------------------------------- |
---|
| 94 | |
---|
| 95 | ISPEC(:) = 0 |
---|
| 96 | |
---|
| 97 | IUMPP(:) = 0 |
---|
| 98 | IASM0(:) = -99 |
---|
| 99 | ISPOLEGL = 0 |
---|
| 100 | |
---|
| 101 | IL = 1 |
---|
| 102 | IND = 1 |
---|
| 103 | IK = 0 |
---|
| 104 | IPOS = 1 |
---|
| 105 | DO JM=0,KSMAX |
---|
| 106 | IK = IK + IND |
---|
| 107 | IF (IK > KPRTRW) THEN |
---|
| 108 | IK = KPRTRW |
---|
| 109 | IND = -1 |
---|
| 110 | ELSEIF (IK < 1) THEN |
---|
| 111 | IK = 1 |
---|
| 112 | IND = 1 |
---|
| 113 | ENDIF |
---|
| 114 | IPROCM(JM) = IK |
---|
| 115 | ISPEC(IK) = ISPEC(IK)+KSMAX-JM+1 |
---|
| 116 | IUMPP(IK) = IUMPP(IK)+1 |
---|
| 117 | IF (IK == KMYSETW) THEN |
---|
| 118 | ISPOLEGL = ISPOLEGL +KTMAX+1-JM+1 |
---|
| 119 | IMYMS(IL) = JM |
---|
| 120 | IASM0(JM) = IPOS |
---|
| 121 | IPOS = IPOS+(KSMAX-JM+1)*2 |
---|
| 122 | IL = IL+1 |
---|
| 123 | ENDIF |
---|
| 124 | ENDDO |
---|
| 125 | |
---|
| 126 | IPOSSP(1) = 1 |
---|
| 127 | ISPEC2P = 2*ISPEC(1) |
---|
| 128 | ISPEC2MX = ISPEC2P |
---|
| 129 | IPTRMS(1) = 1 |
---|
| 130 | DO JA=2,KPRTRW |
---|
| 131 | IPOSSP(JA) = IPOSSP(JA-1)+ISPEC2P |
---|
| 132 | ISPEC2P = 2*ISPEC(JA) |
---|
| 133 | ISPEC2MX = MAX(ISPEC2MX,ISPEC2P) |
---|
| 134 | ! pointer to the first wave number of a given wave-set in NALLMS array |
---|
| 135 | IPTRMS(JA) = IPTRMS(JA-1)+IUMPP(JA-1) |
---|
| 136 | ENDDO |
---|
| 137 | IPOSSP(KPRTRW+1) = IPOSSP(KPRTRW)+ISPEC2P |
---|
| 138 | |
---|
| 139 | ! IALLMS : wave numbers for all wave-set concatenated together to give all |
---|
| 140 | ! wave numbers in wave-set order. |
---|
| 141 | IC(:) = 0 |
---|
| 142 | DO JM=0,KSMAX |
---|
| 143 | IALLMS(IC(IPROCM(JM))+IPTRMS(IPROCM(JM))) = JM |
---|
| 144 | IC(IPROCM(JM)) = IC(IPROCM(JM))+1 |
---|
| 145 | ENDDO |
---|
| 146 | |
---|
| 147 | IPOS = 1 |
---|
| 148 | DO JA=1,KPRTRW |
---|
| 149 | DO JMLOC=1,IUMPP(JA) |
---|
| 150 | IM = IALLMS(IPTRMS(JA)+JMLOC-1) |
---|
| 151 | IDIM0G(IM) = IPOS |
---|
| 152 | IPOS = IPOS+(KSMAX+1-IM)*2 |
---|
| 153 | ENDDO |
---|
| 154 | ENDDO |
---|
| 155 | |
---|
| 156 | IF(PRESENT(KSPEC)) KSPEC = ISPEC(KMYSETW) |
---|
| 157 | IF(PRESENT(KSPEC2)) KSPEC2 = 2*ISPEC(KMYSETW) |
---|
| 158 | IF(PRESENT(KSPEC2MX)) KSPEC2MX = ISPEC2MX |
---|
| 159 | IF(PRESENT(KSPOLEGL)) KSPOLEGL = ISPOLEGL |
---|
| 160 | |
---|
| 161 | IF(PRESENT(KASM0)) KASM0(:) = IASM0(:) |
---|
| 162 | IF(PRESENT(KPROCM)) KPROCM(:) = IPROCM(:) |
---|
| 163 | IF(PRESENT(KUMPP)) KUMPP(:) = IUMPP(:) |
---|
| 164 | IF(PRESENT(KMYMS)) KMYMS(:) = IMYMS(:) |
---|
| 165 | IF(PRESENT(KPOSSP)) KPOSSP(:) = IPOSSP(:) |
---|
| 166 | IF(PRESENT(KPTRMS)) KPTRMS(:) = IPTRMS(:) |
---|
| 167 | IF(PRESENT(KALLMS)) KALLMS(:) = IALLMS(:) |
---|
| 168 | IF(PRESENT(KDIM0G)) KDIM0G(:) = IDIM0G(:) |
---|
| 169 | |
---|
| 170 | END SUBROUTINE SUWAVEDI |
---|
| 171 | END MODULE SUWAVEDI_MOD |
---|
| 172 | |
---|
| 173 | |
---|