GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: phylmd/rrtm/suwavedi_mod.F90 Lines: 0 52 0.0 %
Date: 2023-06-30 12:51:15 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