LMDZ
rrtm_setcoef_140gp.F90
Go to the documentation of this file.
1 SUBROUTINE rrtm_setcoef_140gp (KLEV,P_COLDRY,P_WKL,&
2  & p_fac00,p_fac01,p_fac10,p_fac11,p_forfac,k_jp,k_jt,k_jt1,&
3  & p_colh2o,p_colco2,p_colo3,p_coln2o,p_colch4,p_colo2,p_co2mult,&
4  & k_laytrop,k_layswtch,k_laylow,pavel,p_tavel,p_selffac,p_selffrac,k_indself)
5 
6 ! Reformatted for F90 by JJMorcrette, ECMWF, 980714
7 
8 ! Purpose: For a given atmosphere, calculate the indices and
9 ! fractions related to the pressure and temperature interpolations.
10 ! Also calculate the values of the integrated Planck functions
11 ! for each band at the level and layer temperatures.
12 
13 USE parkind1 ,ONLY : jpim ,jprb
14 USE yomhook ,ONLY : lhook, dr_hook
15 
16 USE parrrtm , ONLY : jplay ,jpinpx
17 USE yoerrtrf , ONLY : preflog ,tref
18 
19 IMPLICIT NONE
20 
21 INTEGER(KIND=JPIM),INTENT(IN) :: KLEV
22 REAL(KIND=JPRB) ,INTENT(IN) :: P_COLDRY(jplay)
23 REAL(KIND=JPRB) ,INTENT(IN) :: P_WKL(jpinpx,jplay)
24 REAL(KIND=JPRB) ,INTENT(OUT) :: P_FAC00(jplay)
25 REAL(KIND=JPRB) ,INTENT(OUT) :: P_FAC01(jplay)
26 REAL(KIND=JPRB) ,INTENT(OUT) :: P_FAC10(jplay)
27 REAL(KIND=JPRB) ,INTENT(OUT) :: P_FAC11(jplay)
28 REAL(KIND=JPRB) ,INTENT(OUT) :: P_FORFAC(jplay)
29 INTEGER(KIND=JPIM),INTENT(OUT) :: K_JP(jplay)
30 INTEGER(KIND=JPIM),INTENT(OUT) :: K_JT(jplay)
31 INTEGER(KIND=JPIM),INTENT(OUT) :: K_JT1(jplay)
32 REAL(KIND=JPRB) ,INTENT(OUT) :: P_COLH2O(jplay)
33 REAL(KIND=JPRB) ,INTENT(OUT) :: P_COLCO2(jplay)
34 REAL(KIND=JPRB) ,INTENT(OUT) :: P_COLO3(jplay)
35 REAL(KIND=JPRB) ,INTENT(OUT) :: P_COLN2O(jplay)
36 REAL(KIND=JPRB) ,INTENT(OUT) :: P_COLCH4(jplay)
37 REAL(KIND=JPRB) ,INTENT(OUT) :: P_COLO2(jplay)
38 REAL(KIND=JPRB) ,INTENT(OUT) :: P_CO2MULT(jplay)
39 INTEGER(KIND=JPIM),INTENT(OUT) :: K_LAYTROP
40 INTEGER(KIND=JPIM),INTENT(OUT) :: K_LAYSWTCH
41 INTEGER(KIND=JPIM),INTENT(OUT) :: K_LAYLOW
42 REAL(KIND=JPRB) ,INTENT(IN) :: PAVEL(jplay)
43 REAL(KIND=JPRB) ,INTENT(IN) :: P_TAVEL(jplay)
44 REAL(KIND=JPRB) ,INTENT(OUT) :: P_SELFFAC(jplay)
45 REAL(KIND=JPRB) ,INTENT(OUT) :: P_SELFFRAC(jplay)
46 INTEGER(KIND=JPIM),INTENT(OUT) :: K_INDSELF(jplay)
47 !- from INTFAC
48 !- from INTIND
49 !- from PROFDATA
50 !- from PROFILE
51 !- from SELF
52 INTEGER(KIND=JPIM) :: JP1, I_LAY
53 
54 REAL(KIND=JPRB) :: Z_CO2REG, Z_COMPFP, Z_FACTOR, Z_FP, Z_FT, Z_FT1, Z_PLOG, Z_SCALEFAC, Z_STPFAC, Z_WATER
55 REAL(KIND=JPRB) :: ZHOOK_HANDLE
56 
57 !#include "yoeratm.h"
58 
59 IF (lhook) CALL dr_hook('RRTM_SETCOEF_140GP',0,zhook_handle)
60 z_stpfac = 296._jprb/1013._jprb
61 
62 k_laytrop = 0
63 k_layswtch = 0
64 k_laylow = 0
65 DO i_lay = 1, klev
66 ! Find the two reference pressures on either side of the
67 ! layer pressure. Store them in JP and JP1. Store in FP the
68 ! fraction of the difference (in ln(pressure)) between these
69 ! two values that the layer pressure lies.
70  z_plog = log(pavel(i_lay))
71  k_jp(i_lay) = int(36._jprb - 5*(z_plog+0.04_jprb))
72  IF (k_jp(i_lay) < 1) THEN
73  k_jp(i_lay) = 1
74  ELSEIF (k_jp(i_lay) > 58) THEN
75  k_jp(i_lay) = 58
76  ENDIF
77  jp1 = k_jp(i_lay) + 1
78  z_fp = 5._jprb * (preflog(k_jp(i_lay)) - z_plog)
79 
80 ! Determine, for each reference pressure (JP and JP1), which
81 ! reference temperature (these are different for each
82 ! reference pressure) is nearest the layer temperature but does
83 ! not exceed it. Store these indices in JT and JT1, resp.
84 ! Store in FT (resp. FT1) the fraction of the way between JT
85 ! (JT1) and the next highest reference temperature that the
86 ! layer temperature falls.
87 
88  k_jt(i_lay) = int(3._jprb + (p_tavel(i_lay)-tref(k_jp(i_lay)))/15._jprb)
89  IF (k_jt(i_lay) < 1) THEN
90  k_jt(i_lay) = 1
91  ELSEIF (k_jt(i_lay) > 4) THEN
92  k_jt(i_lay) = 4
93  ENDIF
94  z_ft = ((p_tavel(i_lay)-tref(k_jp(i_lay)))/15._jprb) - REAL(k_jt(i_lay)-3)
95  k_jt1(i_lay) = int(3._jprb + (p_tavel(i_lay)-tref(jp1))/15._jprb)
96  IF (k_jt1(i_lay) < 1) THEN
97  k_jt1(i_lay) = 1
98  ELSEIF (k_jt1(i_lay) > 4) THEN
99  k_jt1(i_lay) = 4
100  ENDIF
101  z_ft1 = ((p_tavel(i_lay)-tref(jp1))/15._jprb) - REAL(k_jt1(i_lay)-3)
102 
103  z_water = p_wkl(1,i_lay)/p_coldry(i_lay)
104  z_scalefac = pavel(i_lay) * z_stpfac / p_tavel(i_lay)
105 
106 ! If the pressure is less than ~100mb, perform a different
107 ! set of species interpolations.
108 ! IF (PLOG .LE. 4.56) GO TO 5300
109 !--------------------------------------
110  IF (z_plog > 4.56_jprb) THEN
111  k_laytrop = k_laytrop + 1
112 ! For one band, the "switch" occurs at ~300 mb.
113  IF (z_plog >= 5.76_jprb) k_layswtch = k_layswtch + 1
114  IF (z_plog >= 6.62_jprb) k_laylow = k_laylow + 1
115 
116  p_forfac(i_lay) = z_scalefac / (1.0_jprb+z_water)
117 
118 ! Set up factors needed to separately include the water vapor
119 ! self-continuum in the calculation of absorption coefficient.
120 !C SELFFAC(LAY) = WATER * SCALEFAC / (1.+WATER)
121  p_selffac(i_lay) = z_water * p_forfac(i_lay)
122  z_factor = (p_tavel(i_lay)-188.0_jprb)/7.2_jprb
123  k_indself(i_lay) = min(9, max(1, int(z_factor)-7))
124  p_selffrac(i_lay) = z_factor - REAL(K_INDSELF(I_LAY) + 7)
125 
126 ! Calculate needed column amounts.
127  p_colh2o(i_lay) = 1.e-20_jprb * p_wkl(1,i_lay)
128  p_colco2(i_lay) = 1.e-20_jprb * p_wkl(2,i_lay)
129  p_colo3(i_lay) = 1.e-20_jprb * p_wkl(3,i_lay)
130  p_coln2o(i_lay) = 1.e-20_jprb * p_wkl(4,i_lay)
131  p_colch4(i_lay) = 1.e-20_jprb * p_wkl(6,i_lay)
132  p_colo2(i_lay) = 1.e-20_jprb * p_wkl(7,i_lay)
133  IF (p_colco2(i_lay) == 0.0_jprb) p_colco2(i_lay) = 1.e-32_jprb * p_coldry(i_lay)
134  IF (p_coln2o(i_lay) == 0.0_jprb) p_coln2o(i_lay) = 1.e-32_jprb * p_coldry(i_lay)
135  IF (p_colch4(i_lay) == 0.0_jprb) p_colch4(i_lay) = 1.e-32_jprb * p_coldry(i_lay)
136 ! Using E = 1334.2 cm-1.
137  z_co2reg = 3.55e-24_jprb * p_coldry(i_lay)
138  p_co2mult(i_lay)= (p_colco2(i_lay) - z_co2reg) *&
139  & 272.63_jprb*exp(-1919.4_jprb/p_tavel(i_lay))/(8.7604e-4_jprb*p_tavel(i_lay))
140 ! GO TO 5400
141 !------------------
142  ELSE
143 ! Above LAYTROP.
144 ! 5300 CONTINUE
145 
146 ! Calculate needed column amounts.
147  p_forfac(i_lay) = z_scalefac / (1.0_jprb+z_water)
148 
149  p_colh2o(i_lay) = 1.e-20_jprb * p_wkl(1,i_lay)
150  p_colco2(i_lay) = 1.e-20_jprb * p_wkl(2,i_lay)
151  p_colo3(i_lay) = 1.e-20_jprb * p_wkl(3,i_lay)
152  p_coln2o(i_lay) = 1.e-20_jprb * p_wkl(4,i_lay)
153  p_colch4(i_lay) = 1.e-20_jprb * p_wkl(6,i_lay)
154  p_colo2(i_lay) = 1.e-20_jprb * p_wkl(7,i_lay)
155  IF (p_colco2(i_lay) == 0.0_jprb) p_colco2(i_lay) = 1.e-32_jprb * p_coldry(i_lay)
156  IF (p_coln2o(i_lay) == 0.0_jprb) p_coln2o(i_lay) = 1.e-32_jprb * p_coldry(i_lay)
157  IF (p_colch4(i_lay) == 0.0_jprb) p_colch4(i_lay) = 1.e-32_jprb * p_coldry(i_lay)
158  z_co2reg = 3.55e-24_jprb * p_coldry(i_lay)
159  p_co2mult(i_lay)= (p_colco2(i_lay) - z_co2reg) *&
160  & 272.63_jprb*exp(-1919.4_jprb/p_tavel(i_lay))/(8.7604e-4_jprb*p_tavel(i_lay))
161 !----------------
162  ENDIF
163 ! 5400 CONTINUE
164 
165 ! We have now isolated the layer ln pressure and temperature,
166 ! between two reference pressures and two reference temperatures
167 ! (for each reference pressure). We multiply the pressure
168 ! fraction FP with the appropriate temperature fractions to get
169 ! the factors that will be needed for the interpolation that yields
170 ! the optical depths (performed in routines TAUGBn for band n).
171 
172  z_compfp = 1.0_jprb - z_fp
173  p_fac10(i_lay) = z_compfp * z_ft
174  p_fac00(i_lay) = z_compfp * (1.0_jprb - z_ft)
175  p_fac11(i_lay) = z_fp * z_ft1
176  p_fac01(i_lay) = z_fp * (1.0_jprb - z_ft1)
177 
178 ENDDO
179 
180 ! MT 981104
181 !-- Set LAYLOW for profiles with surface pressure less than 750 hPa.
182 IF (k_laylow == 0) k_laylow=1
183 
184 IF (lhook) CALL dr_hook('RRTM_SETCOEF_140GP',1,zhook_handle)
185 END SUBROUTINE rrtm_setcoef_140gp
subroutine rrtm_setcoef_140gp(KLEV, P_COLDRY, P_WKL, P_FAC00, P_FAC01, P_FAC10, P_FAC11, P_FORFAC, K_JP, K_JT, K_JT1, P_COLH2O, P_COLCO2, P_COLO3, P_COLN2O, P_COLCH4, P_COLO2, P_CO2MULT, K_LAYTROP, K_LAYSWTCH, K_LAYLOW, PAVEL, P_TAVEL, P_SELFFAC, P_SELFFRAC, K_INDSELF)
real(kind=jprb), dimension(59) tref
Definition: yoerrtrf.F90:15
integer(kind=jpim), parameter jpinpx
Definition: parrrtm.F90:20
integer, parameter jprb
Definition: parkind1.F90:31
logical lhook
Definition: yomhook.F90:12
real(kind=jprb), dimension(59) preflog
Definition: yoerrtrf.F90:14
integer(kind=jpim), parameter jplay
Definition: parrrtm.F90:15
subroutine dr_hook(CDNAME, KSWITCH, PKEY)
Definition: yomhook.F90:17
integer, parameter jpim
Definition: parkind1.F90:13