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

Line Branch Exec Source
1
SUBROUTINE SRTM_SETCOEF &
2
 & ( KLEV    , KNMOL ,&
3
 &   PAVEL   , PTAVEL   , PZ      , PTZ     , PTBOUND  ,&
4
 &   PCOLDRY , PWKL     ,&
5
 &   KLAYTROP, KLAYSWTCH, KLAYLOW ,&
6
 &   PCO2MULT, PCOLCH4  , PCOLCO2 , PCOLH2O , PCOLMOL  , PCOLN2O  , PCOLO2 , PCOLO3 ,&
7
 &   PFORFAC , PFORFRAC , KINDFOR , PSELFFAC, PSELFFRAC, KINDSELF ,&
8
 &   PFAC00  , PFAC01   , PFAC10  , PFAC11  ,&
9
 &   KJP     , KJT      , KJT1    &
10
 & )
11
12
!     J. Delamere, AER, Inc. (version 2.5, 02/04/01)
13
14
!     Modifications:
15
!     JJMorcrette 030224   rewritten / adapted to ECMWF F90 system
16
!        M.Hamrud      01-Oct-2003 CY28 Cleaning
17
18
!     Purpose:  For a given atmosphere, calculate the indices and
19
!     fractions related to the pressure and temperature interpolations.
20
21
USE PARKIND1  ,ONLY : JPIM     ,JPRB
22
USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
23
24
USE PARSRTM , ONLY : JPLAY
25
USE YOESRTWN, ONLY :  PREFLOG, TREF
26
!!  USE YOESWN  , ONLY : NDBUG
27
28
IMPLICIT NONE
29
30
!-- Input arguments
31
32
INTEGER(KIND=JPIM),INTENT(IN)    :: KLEV
33
INTEGER(KIND=JPIM)               :: KNMOL ! Argument NOT used
34
REAL(KIND=JPRB)   ,INTENT(IN)    :: PAVEL(JPLAY)
35
REAL(KIND=JPRB)   ,INTENT(IN)    :: PTAVEL(JPLAY)
36
REAL(KIND=JPRB)                  :: PZ(0:JPLAY) ! Argument NOT used
37
REAL(KIND=JPRB)   ,INTENT(IN)    :: PTZ(0:JPLAY)
38
REAL(KIND=JPRB)   ,INTENT(IN)    :: PTBOUND
39
REAL(KIND=JPRB)   ,INTENT(IN)    :: PCOLDRY(JPLAY)
40
REAL(KIND=JPRB)   ,INTENT(IN)    :: PWKL(35,JPLAY)
41
INTEGER(KIND=JPIM),INTENT(OUT)   :: KLAYTROP
42
INTEGER(KIND=JPIM),INTENT(OUT)   :: KLAYSWTCH
43
INTEGER(KIND=JPIM),INTENT(OUT)   :: KLAYLOW
44
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PCO2MULT(JPLAY)
45
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PCOLCH4(JPLAY)
46
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PCOLCO2(JPLAY)
47
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PCOLH2O(JPLAY)
48
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PCOLMOL(JPLAY)
49
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PCOLN2O(JPLAY)
50
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PCOLO2(JPLAY)
51
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PCOLO3(JPLAY)
52
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PFORFAC(JPLAY)
53
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PFORFRAC(JPLAY)
54
INTEGER(KIND=JPIM),INTENT(OUT)   :: KINDFOR(JPLAY)
55
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PSELFFAC(JPLAY)
56
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PSELFFRAC(JPLAY)
57
INTEGER(KIND=JPIM),INTENT(OUT)   :: KINDSELF(JPLAY)
58
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PFAC00(JPLAY)
59
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PFAC01(JPLAY)
60
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PFAC10(JPLAY)
61
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PFAC11(JPLAY)
62
INTEGER(KIND=JPIM),INTENT(OUT)   :: KJP(JPLAY)
63
INTEGER(KIND=JPIM),INTENT(OUT)   :: KJT(JPLAY)
64
INTEGER(KIND=JPIM),INTENT(OUT)   :: KJT1(JPLAY)
65
!-- Output arguments
66
67
!-- local integers
68
69
INTEGER(KIND=JPIM) :: I_NLAYERS, INDBOUND, INDLEV0, JK
70
INTEGER(KIND=JPIM) :: JP1
71
72
!-- local reals
73
74
REAL(KIND=JPRB) :: Z_STPFAC, Z_TBNDFRAC, Z_T0FRAC, Z_PLOG, Z_FP, Z_FT, Z_FT1, Z_WATER, Z_SCALEFAC
75
REAL(KIND=JPRB) :: Z_FACTOR, Z_CO2REG, Z_COMPFP
76
REAL(KIND=JPRB) :: ZHOOK_HANDLE
77
78
79
80
81
IF (LHOOK) CALL DR_HOOK('SRTM_SETCOEF',0,ZHOOK_HANDLE)
82
I_NLAYERS = KLEV
83
84
Z_STPFAC = 296._JPRB/1013._JPRB
85
86
INDBOUND = PTBOUND - 159._JPRB
87
Z_TBNDFRAC = PTBOUND - INT(PTBOUND)
88
INDLEV0  = PTZ(0) - 159._JPRB
89
Z_T0FRAC   = PTZ(0) - INT(PTZ(0))
90
91
KLAYTROP  = 0
92
KLAYSWTCH = 0
93
KLAYLOW   = 0
94
95
!IF (NDBUG.LE.3) THEN
96
!  print *,'-------- Computed in SETCOEF --------'
97
!  print 8990
98
8990 format(18x,'  T     PFAC00,    01,    10,    11  PCO2MULT     MOL   &
99
 & CH4      CO2      H2O      N2O      O2      O3      SFAC  &
100
 & SFRAC    FFAC    FFRAC  ISLF IFOR')
101
!END IF
102
103
DO JK = 1, I_NLAYERS
104
!        Find the two reference pressures on either side of the
105
!        layer pressure.  Store them in JP and JP1.  Store in FP the
106
!        fraction of the difference (in ln(pressure)) between these
107
!        two values that the layer pressure lies.
108
109
  Z_PLOG = LOG(PAVEL(JK))
110
  KJP(JK) = INT(36. - 5*(Z_PLOG+0.04))
111
  IF (KJP(JK) < 1) THEN
112
    KJP(JK) = 1
113
  ELSEIF (KJP(JK) > 58) THEN
114
    KJP(JK) = 58
115
  ENDIF
116
  JP1 = KJP(JK) + 1
117
  Z_FP = 5. * (PREFLOG(KJP(JK)) - Z_PLOG)
118
119
!        Determine, for each reference pressure (JP and JP1), which
120
!        reference temperature (these are different for each
121
!        reference pressure) is nearest the layer temperature but does
122
!        not exceed it.  Store these indices in JT and JT1, resp.
123
!        Store in FT (resp. FT1) the fraction of the way between JT
124
!        (JT1) and the next highest reference temperature that the
125
!        layer temperature falls.
126
127
  KJT(JK) = INT(3. + (PTAVEL(JK)-TREF(KJP(JK)))/15.)
128
  IF (KJT(JK) < 1) THEN
129
    KJT(JK) = 1
130
  ELSEIF (KJT(JK) > 4) THEN
131
    KJT(JK) = 4
132
  ENDIF
133
  Z_FT = ((PTAVEL(JK)-TREF(KJP(JK)))/15.) - REAL(KJT(JK)-3)
134
  KJT1(JK) = INT(3. + (PTAVEL(JK)-TREF(JP1))/15.)
135
  IF (KJT1(JK) < 1) THEN
136
    KJT1(JK) = 1
137
  ELSEIF (KJT1(JK) > 4) THEN
138
    KJT1(JK) = 4
139
  ENDIF
140
  Z_FT1 = ((PTAVEL(JK)-TREF(JP1))/15.) - REAL(KJT1(JK)-3)
141
142
  Z_WATER = PWKL(1,JK)/PCOLDRY(JK)
143
  Z_SCALEFAC = PAVEL(JK) * Z_STPFAC / PTAVEL(JK)
144
145
!        If the pressure is less than ~100mb, perform a different
146
!        set of species interpolations.
147
148
  IF (Z_PLOG <= 4.56) GO TO 5300
149
  KLAYTROP =  KLAYTROP + 1
150
  IF (Z_PLOG >= 6.62) KLAYLOW = KLAYLOW + 1
151
152
!        Set up factors needed to separately include the water vapor
153
!        foreign-continuum in the calculation of absorption coefficient.
154
155
  PFORFAC(JK) = Z_SCALEFAC / (1.+Z_WATER)
156
  Z_FACTOR = (332.0-PTAVEL(JK))/36.0
157
  KINDFOR(JK) = MIN(2, MAX(1, INT(Z_FACTOR)))
158
  PFORFRAC(JK) = Z_FACTOR - REAL(KINDFOR(JK))
159
160
!        Set up factors needed to separately include the water vapor
161
!        self-continuum in the calculation of absorption coefficient.
162
163
  PSELFFAC(JK) = Z_WATER * PFORFAC(JK)
164
  Z_FACTOR = (PTAVEL(JK)-188.0)/7.2
165
  KINDSELF(JK) = MIN(9, MAX(1, INT(Z_FACTOR)-7))
166
  PSELFFRAC(JK) = Z_FACTOR - REAL(KINDSELF(JK) + 7)
167
168
!        Calculate needed column amounts.
169
170
  PCOLH2O(JK) = 1.E-20 * PWKL(1,JK)
171
  PCOLCO2(JK) = 1.E-20 * PWKL(2,JK)
172
  PCOLO3(JK) = 1.E-20 * PWKL(3,JK)
173
!         COLO3(LAY) = 0.
174
!         COLO3(LAY) = colo3(lay)/1.16
175
  PCOLN2O(JK) = 1.E-20 * PWKL(4,JK)
176
  PCOLCH4(JK) = 1.E-20 * PWKL(6,JK)
177
  PCOLO2(JK) = 1.E-20 * PWKL(7,JK)
178
  PCOLMOL(JK) = 1.E-20 * PCOLDRY(JK) + PCOLH2O(JK)
179
!         colco2(lay) = 0.
180
!         colo3(lay) = 0.
181
!         coln2o(lay) = 0.
182
!         colch4(lay) = 0.
183
!         colo2(lay) = 0.
184
!         colmol(lay) = 0.
185
  IF (PCOLCO2(JK) == 0.) PCOLCO2(JK) = 1.E-32 * PCOLDRY(JK)
186
  IF (PCOLN2O(JK) == 0.) PCOLN2O(JK) = 1.E-32 * PCOLDRY(JK)
187
  IF (PCOLCH4(JK) == 0.) PCOLCH4(JK) = 1.E-32 * PCOLDRY(JK)
188
  IF (PCOLO2(JK) == 0.) PCOLO2(JK) = 1.E-32 * PCOLDRY(JK)
189
!        Using E = 1334.2 cm-1.
190
  Z_CO2REG = 3.55E-24 * PCOLDRY(JK)
191
  PCO2MULT(JK)= (PCOLCO2(JK) - Z_CO2REG) * &
192
   & 272.63*EXP(-1919.4/PTAVEL(JK))/(8.7604E-4*PTAVEL(JK))
193
  GO TO 5400
194
195
!        Above LAYTROP.
196
  5300    CONTINUE
197
198
!        Set up factors needed to separately include the water vapor
199
!        foreign-continuum in the calculation of absorption coefficient.
200
201
  PFORFAC(JK) = Z_SCALEFAC / (1.+Z_WATER)
202
  Z_FACTOR = (PTAVEL(JK)-188.0)/36.0
203
  KINDFOR(JK) = 3
204
  PFORFRAC(JK) = Z_FACTOR - 1.0
205
206
!        Calculate needed column amounts.
207
208
  PCOLH2O(JK) = 1.E-20 * PWKL(1,JK)
209
  PCOLCO2(JK) = 1.E-20 * PWKL(2,JK)
210
  PCOLO3(JK)  = 1.E-20 * PWKL(3,JK)
211
  PCOLN2O(JK) = 1.E-20 * PWKL(4,JK)
212
  PCOLCH4(JK) = 1.E-20 * PWKL(6,JK)
213
  PCOLO2(JK)  = 1.E-20 * PWKL(7,JK)
214
  PCOLMOL(JK) = 1.E-20 * PCOLDRY(JK) + PCOLH2O(JK)
215
  IF (PCOLCO2(JK) == 0.) PCOLCO2(JK) = 1.E-32 * PCOLDRY(JK)
216
  IF (PCOLN2O(JK) == 0.) PCOLN2O(JK) = 1.E-32 * PCOLDRY(JK)
217
  IF (PCOLCH4(JK) == 0.) PCOLCH4(JK) = 1.E-32 * PCOLDRY(JK)
218
  IF (PCOLO2(JK) == 0.) PCOLO2(JK)  = 1.E-32 * PCOLDRY(JK)
219
  Z_CO2REG = 3.55E-24 * PCOLDRY(JK)
220
  PCO2MULT(JK)= (PCOLCO2(JK) - Z_CO2REG) * &
221
   & 272.63*EXP(-1919.4/PTAVEL(JK))/(8.7604E-4*PTAVEL(JK))
222
223
  PSELFFAC(JK) =0.0_JPRB
224
  PSELFFRAC(JK)=0.0_JPRB
225
  KINDSELF(JK) = 0
226
227
  5400    CONTINUE
228
229
!        We have now isolated the layer ln pressure and temperature,
230
!        between two reference pressures and two reference temperatures
231
!        (for each reference pressure).  We multiply the pressure
232
!        fraction FP with the appropriate temperature fractions to get
233
!        the factors that will be needed for the interpolation that yields
234
!        the optical depths (performed in routines TAUGBn for band n).
235
236
  Z_COMPFP = 1. - Z_FP
237
  PFAC10(JK) = Z_COMPFP * Z_FT
238
  PFAC00(JK) = Z_COMPFP * (1. - Z_FT)
239
  PFAC11(JK) = Z_FP * Z_FT1
240
  PFAC01(JK) = Z_FP * (1. - Z_FT1)
241
242
!  IF (NDBUG.LE.3) THEN
243
!    print 9000,LAY,LAYTROP,JP(LAY),JT(LAY),JT1(LAY),TAVEL(LAY) &
244
!      &,FAC00(LAY),FAC01(LAY),FAC10(LAY),FAC11(LAY) &
245
!      &,CO2MULT(LAY),COLMOL(LAY),COLCH4(LAY),COLCO2(LAY),COLH2O(LAY) &
246
!      &,COLN2O(LAY),COLO2(LAY),COLO3(LAY),SELFFAC(LAY),SELFFRAC(LAY) &
247
!      &,FORFAC(LAY),FORFRAC(LAY),INDSELF(LAY),INDFOR(LAY)
248
  9000 format(1x,2I3,3I4,F6.1,4F7.2,12E9.2,2I5)
249
!  END IF
250
251
ENDDO
252
253
!-----------------------------------------------------------------------
254
IF (LHOOK) CALL DR_HOOK('SRTM_SETCOEF',1,ZHOOK_HANDLE)
255
END SUBROUTINE SRTM_SETCOEF
256