GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: phylmd/rrtm/suleg_mod.F90 Lines: 0 74 0.0 %
Date: 2023-06-30 12:51:15 Branches: 0 122 0.0 %

Line Branch Exec Source
1
MODULE SULEG_MOD
2
CONTAINS
3
SUBROUTINE SULEG
4
5
USE PARKIND1  ,ONLY : JPIM     ,JPRB
6
USE PARKIND2  ,ONLY : JPRH
7
8
USE TPM_GEN
9
USE TPM_DIM
10
USE TPM_CONSTANTS
11
USE TPM_DISTR
12
USE TPM_FIELDS
13
14
!USE SUGAW_MOD
15
USE SUPOL_MOD
16
USE SUTRLE_MOD
17
18
#ifdef DOC
19
20
!**** *SULEG * - initialize the Legendre polynomials
21
22
!     Purpose.
23
!     --------
24
!           Initialize COMMON YOMLEG
25
26
!**   Interface.
27
!     ----------
28
!        *CALL* *SULEG*
29
30
!        Explicit arguments :
31
!        --------------------
32
33
!        Implicit arguments :
34
!        --------------------
35
!              COMMON YOMLEG
36
37
!     Method.
38
!     -------
39
!        See documentation
40
41
!     Externals.
42
!     ----------
43
!        SUGAW  (Gaussian latitudes)
44
!        SUPOLM (polynomials)
45
!        LFI routines for external IO's
46
!        Called by SUGEM.
47
48
!     Reference.
49
!     ----------
50
!        ECMWF Research Department documentation of the IFS
51
52
!     Author.
53
!     -------
54
!        Mats Hamrud and Philippe Courtier  *ECMWF*
55
56
!     Modifications.
57
!     --------------
58
!        Original : 87-10-15
59
!        MODIFICATION : 91-04  J.M. Piriou:
60
!                       - Read gaussian latitudes and PNM on LFI
61
!                       - If file missing, computes
62
!                       91-04 M.Hamrud:
63
!                       - IO Scheme introduced
64
!        MODIFICATION : 91-07-03 P.Courtier suppress derivatives
65
!        MODIFICATION : 91-07-03 P.Courtier computes RATATH and RACTHE
66
!        MODIFICATION : 91-07-03 P.Courtier change upper limit (NSMAX+1)
67
!        MODIFICATION : 91-07-03 P.Courtier change ordering
68
!     Order of the PNM in the file, as in the model :
69
!         - increasing wave numbers m
70
!         - for a given m, from n=NSMAX+1 to m
71
!        MODIFICATION : 92-07-02 R. Bubnova: shift RATATH calculation
72
!                                            to SUGEM1
73
!        MODIFICATION : 92-12-17 P.Courtier multitask computations
74
!        Modified by R. EL Khatib : 93-04-02 Set-up defaults controled by LECMWF
75
!        MODIFICATION : 93-03-19 D.Giard : n <= NTMAX
76
!        K. YESSAD    : 93-05-11 : DLMU --> global array DRMU(NDGSA:NDGEN).
77
!                       (not stored currently on LFI files).
78
!        MODIFICATION : 94-02-03 R. El Khatib : subroutine SULEG2 to write out
79
!                       the Leg. polynomials on workfile or LFI file
80
!        Modification : 94-08-31 M. Tolstykh: Setup for CUD interpolation
81
!        Modified by K. YESSAD (MARCH 1995): Extra-latitudes computations
82
!                 according to value of NDGSUR and LRPOLE only.
83
!                 + change fancy loop numbering.
84
!        Modified 98-08-10 by K. YESSAD: removal of LRPOLE option.
85
!          - removal of LRPOLE in YOMCT0.
86
!          - removal of code under LRPOLE.
87
!     ------------------------------------------------------------------
88
89
#endif
90
91
92
IMPLICIT NONE
93
94
95
!     ------------------------------------------------------------------
96
REAL(KIND=JPRB),ALLOCATABLE :: ZPNMG(:,:)
97
98
REAL(KIND=JPRH) :: DLRMU(R%NDGL)
99
REAL(KIND=JPRH) :: DLC(0:R%NTMAX+1,0:R%NTMAX+1)
100
REAL(KIND=JPRH) :: DLD(0:R%NTMAX+1,0:R%NTMAX+1)
101
REAL(KIND=JPRH) :: DLE(0:R%NTMAX+1,0:R%NTMAX+1)
102
REAL(KIND=JPRH) :: DLA(0:R%NTMAX+1),DLB(0:R%NTMAX+1),DLF(0:R%NTMAX+1)
103
REAL(KIND=JPRH) :: DLG(0:R%NTMAX+1),DLH(0:R%NTMAX+1),DLI(0:R%NTMAX+1)
104
REAL(KIND=JPRH) :: DLPOL(0:R%NTMAX+1,0:R%NTMAX+1)
105
!     ------------------------------------------------------------------
106
107
INTEGER(KIND=JPIM), PARAMETER :: JPKS=KIND(ZPNMG)
108
INTEGER(KIND=JPIM), PARAMETER :: JPKD=KIND(DLG)
109
110
!     ------------------------------------------------------------------
111
REAL(KIND=JPRH) :: DA,DC,DD,DE
112
INTEGER(KIND=JPIM) :: KKN, KKM
113
114
!     LOCAL
115
INTEGER(KIND=JPIM) :: IGLLOC, INM, IM , ICOUNT,&
116
             &JGL,  JM, JMLOC, JN, JNM
117
118
119
LOGICAL :: LLP1,LLP2
120
121
122
DC(KKN,KKM)=SQRT( (REAL(2*KKN+1,JPKD)*REAL(KKN+KKM-1,JPKD)&
123
                   &*REAL(KKN+KKM-3,JPKD))&
124
                &/ (REAL(2*KKN-3,JPKD)*REAL(KKN+KKM,JPKD)&
125
                   &*REAL(KKN+KKM-2,JPKD)) )
126
DD(KKN,KKM)=SQRT( (REAL(2*KKN+1,JPKD)*REAL(KKN+KKM-1,JPKD)&
127
                   &*REAL(KKN-KKM+1,JPKD))&
128
                &/ (REAL(2*KKN-1,JPKD)*REAL(KKN+KKM,JPKD)&
129
                  &*REAL(KKN+KKM-2,JPKD)) )
130
DE(KKN,KKM)=SQRT( (REAL(2*KKN+1,JPKD)*REAL(KKN-KKM,JPKD))&
131
                &/ (REAL(2*KKN-1,JPKD)*REAL(KKN+KKM,JPKD)) )
132
DA(KKN,KKM)=SQRT( (REAL(2*KKN+1,JPKD)*REAL(KKN-KKM,JPKD)&
133
                   &*REAL(KKN+KKM,JPKD))&
134
                &/  REAL(2*KKN-1,JPKD) )
135
136
!     ------------------------------------------------------------------
137
ALLOCATE(ZPNMG(R%NSPOLEG,D%NLEI3D))
138
139
!*       0.    Some initializations.
140
!              ---------------------
141
142
LLP1 = NPRINTLEV>0
143
LLP2 = NPRINTLEV>1
144
IF(LLP1) WRITE(NOUT,*) '=== ENTER ROUTINE SULEG ==='
145
146
!CALL GSTATS(140,0)  !MPL 4.12.08
147
ALLOCATE(F%RPNM(R%NLEI3,D%NSPOLEGL))
148
IF (LLP2) WRITE(NOUT,9) 'F%RPNM    ',SIZE(F%RPNM),SHAPE(F%RPNM)
149
ALLOCATE(F%RMU(R%NDGL))
150
IF (LLP2) WRITE(NOUT,9) 'F%RMU     ',SIZE(F%RMU ),SHAPE(F%RMU )
151
ALLOCATE(F%RW(R%NDGL))
152
IF (LLP2) WRITE(NOUT,9) 'F%RW      ',SIZE(F%RW  ),SHAPE(F%RW  )
153
ALLOCATE(F%R1MU2(R%NDGL))
154
IF (LLP2) WRITE(NOUT,9) 'F%R1MU2   ',SIZE(F%R1MU2),SHAPE(F%R1MU2 )
155
ALLOCATE(F%RACTHE(R%NDGL))
156
IF (LLP2) WRITE(NOUT,9) 'F%RACTHE  ',SIZE(F%RACTHE),SHAPE(F%RACTHE )
157
158
!CALL GSTATS(1801,0) ! MPL 4.12.08
159
DO JNM=1,D%NSPOLEGL
160
  F%RPNM(R%NLEI3,JNM) = 0.0_JPRB
161
ENDDO
162
!CALL GSTATS(1801,1)     ! MPL 4.12.08
163
164
!     ------------------------------------------------------------------
165
166
!*       3.1   Gaussian latitudes and weights
167
!CALL SUGAW(R%NDGL,F%RMU,DLRMU,F%RW)
168
169
!*       3.2   Computes related arrays
170
171
DO JGL=1,R%NDGL
172
  F%R1MU2(JGL) = REAL(1.0_JPRB-DLRMU(JGL)*DLRMU(JGL),JPKS)
173
  F%RACTHE(JGL) = REAL(1.0_JPRB/SQRT(1.0_JPRB-DLRMU(JGL)*DLRMU(JGL))/&
174
   &REAL(RA,JPKD),JPKS)
175
ENDDO
176
177
!*       3.3   Working arrays
178
DO JN=3,R%NTMAX+1
179
  DO JM=2,JN-1
180
    DLC(JM,JN) = DC(JN,JM)
181
    DLD(JM,JN) = DD(JN,JM)
182
    DLE(JM,JN) = DE(JN,JM)
183
  ENDDO
184
ENDDO
185
186
DO JN=1,R%NTMAX+1
187
  DLA(JN) = SQRT(REAL(2*JN+1,JPKD))
188
  DLB(JN) = SQRT(REAL(2*JN+1,JPKD)/REAL(JN*(JN+1),JPKD))
189
  DLF(JN) = REAL(2*JN-1,JPKD)/REAL(JN,JPKD)
190
  DLG(JN) = REAL(JN-1,JPKD)/REAL(JN,JPKD)
191
  DLH(JN) = SQRT(REAL(2*JN+1,JPKD)/REAL(2*JN,JPKD))
192
  DLI(JN) = REAL(JN,JPKD)
193
ENDDO
194
195
!CALL GSTATS(1801,0)  ! MPL 4.12.08
196
DO JGL=D%NLATLS(MYSETW),D%NLATLE(MYSETW)
197
  DLPOL(:,:) = 0.0_JPRB
198
  CALL SUPOL(R%NTMAX+1,DLRMU(JGL),DLPOL,DLA,DLB,DLC,DLD,DLE,DLF,DLG,DLH,DLI)
199
  INM = 0
200
  IGLLOC = JGL - D%NLATLS(MYSETW) + 1
201
  DO JM=0,R%NSMAX
202
    DO JN=R%NTMAX+1,JM,-1
203
      INM = INM+1
204
      ZPNMG(INM,IGLLOC) = REAL(DLPOL(JM,JN),JPKS)
205
    ENDDO
206
  ENDDO
207
ENDDO
208
!CALL GSTATS(1801,1) !  MPL 4.12.08
209
!CALL GSTATS(140,1)  ! MPL 4.12.08
210
211
!CALL GSTATS(190,0)  ! MPL 4.12.08
212
CALL SUTRLE(ZPNMG)
213
!CALL GSTATS(190,1)  ! MPL 4.12.08
214
215
ICOUNT = 0
216
DO JMLOC=1,D%NUMP
217
  IM = D%MYMS(JMLOC)
218
  DO JN=IM,R%NTMAX+2
219
    ICOUNT = ICOUNT+1
220
  ENDDO
221
ENDDO
222
223
ALLOCATE(F%REPSNM(ICOUNT))
224
IF (LLP2) WRITE(NOUT,9) 'F%REPSNM  ',SIZE(F%REPSNM ),SHAPE(F%REPSNM )
225
226
ICOUNT = 0
227
DO JMLOC=1,D%NUMP
228
  IM = D%MYMS(JMLOC)
229
  DO JN=IM,R%NTMAX+2
230
    ICOUNT = ICOUNT+1
231
    F%REPSNM(ICOUNT) = REAL(SQRT(REAL(JN*JN-IM*IM,JPKD)/&
232
     &REAL(4*JN*JN-1,JPKD)),JPKS)
233
  ENDDO
234
ENDDO
235
236
ALLOCATE(F%RN(-1:R%NTMAX+3))
237
IF (LLP2) WRITE(NOUT,9) 'F%RN      ',SIZE(F%RN     ),SHAPE(F%RN     )
238
ALLOCATE(F%RLAPIN(-1:R%NSMAX+2))
239
IF (LLP2) WRITE(NOUT,9) 'F%RLAPIN  ',SIZE(F%RLAPIN ),SHAPE(F%RLAPIN )
240
ALLOCATE(F%NLTN(-1:R%NTMAX+3))
241
IF (LLP2) WRITE(NOUT,9) 'F%NLTN    ',SIZE(F%NLTN ),SHAPE(F%NLTN )
242
243
DO JN=-1,R%NTMAX+3
244
  F%RN(JN) = REAL(JN,JPRB)
245
  F%NLTN(JN) = R%NTMAX+2-JN
246
ENDDO
247
F%RLAPIN(:) = 0.0_JPRB
248
F%RLAPIN(0) = 0._JPRB
249
F%RLAPIN(-1) = 0.0_JPRB
250
DO JN=1,R%NSMAX+2
251
  F%RLAPIN(JN)=REAL(-(REAL(RA,JPKD)*REAL(RA,JPKD))/REAL(JN*(JN+1),JPKD),JPKS)
252
ENDDO
253
254
DEALLOCATE(ZPNMG)
255
256
!     ------------------------------------------------------------------
257
9 FORMAT(1X,'ARRAY ',A10,' ALLOCATED ',8I8)
258
259
END SUBROUTINE SULEG
260
END MODULE SULEG_MOD