GCC Code Coverage Report


Directory: ./
File: rad/suwavedi_mod.f90
Date: 2022-01-11 19:19:34
Exec Total Coverage
Lines: 0 52 0.0%
Branches: 0 64 0.0%

Line Branch Exec Source
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
174