LMDZ
suwavedi_mod.F90
Go to the documentation of this file.
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 
integer, parameter jprb
Definition: parkind1.F90:31
subroutine suwavedi(KSMAX, KTMAX, KPRTRW, KMYSETW, KASM0, KSPOLEGL, KPROCM, KUMPP, KSPEC, KSPEC2, KSPEC2MX, KPOSSP, KMYMS, KPTRMS, KALLMS, KDIM0G)
Definition: suwavedi_mod.F90:6
integer, parameter jpim
Definition: parkind1.F90:13