LMDZ
rrtm_taumol3.F90
Go to the documentation of this file.
1 !----------------------------------------------------------------------------
2 SUBROUTINE rrtm_taumol3 (KLEV,P_TAU,&
3  & p_tauaerl,p_fac00,p_fac01,p_fac10,p_fac11,p_forfac,k_jp,k_jt,k_jt1,p_oneminus,&
4  & p_colh2o,p_colco2,p_coln2o,k_laytrop,p_selffac,p_selffrac,k_indself,pfrac)
5 
6 ! BAND 3: 500-630 cm-1 (low - H2O,CO2; high - H2O,CO2)
7 
8 ! Modifications
9 ! M.Hamrud 01-Oct-2003 CY28 Cleaning
10 
11 ! D Salmond 2000-05-15 speed-up
12 
13 USE parkind1 ,ONLY : jpim ,jprb
14 USE yomhook ,ONLY : lhook, dr_hook
15 
16 USE parrrtm , ONLY : jplay ,jpband ,jpgpt ,ng3 ,ngs2
17 USE yoerrtwn , ONLY : nspa ,nspb
18 USE yoerrta3 , ONLY : absa ,absb ,fracrefa, fracrefb,&
19  & forref ,selfref , absn2oa ,&
21  & strrat
22 
23 ! Input
24 !#include "yoeratm.h"
25 
26 ! REAL TAUAER(JPLAY)
27 
28 IMPLICIT NONE
29 
30 ! Output
31 INTEGER(KIND=JPIM),INTENT(IN) :: KLEV
32 REAL(KIND=JPRB) ,INTENT(OUT) :: P_TAU(jpgpt,jplay)
33 REAL(KIND=JPRB) ,INTENT(IN) :: P_TAUAERL(jplay,jpband)
34 REAL(KIND=JPRB) ,INTENT(IN) :: P_FAC00(jplay)
35 REAL(KIND=JPRB) ,INTENT(IN) :: P_FAC01(jplay)
36 REAL(KIND=JPRB) ,INTENT(IN) :: P_FAC10(jplay)
37 REAL(KIND=JPRB) ,INTENT(IN) :: P_FAC11(jplay)
38 REAL(KIND=JPRB) ,INTENT(IN) :: P_FORFAC(jplay)
39 INTEGER(KIND=JPIM),INTENT(IN) :: K_JP(jplay)
40 INTEGER(KIND=JPIM),INTENT(IN) :: K_JT(jplay)
41 INTEGER(KIND=JPIM),INTENT(IN) :: K_JT1(jplay)
42 REAL(KIND=JPRB) ,INTENT(IN) :: P_ONEMINUS
43 REAL(KIND=JPRB) ,INTENT(IN) :: P_COLH2O(jplay)
44 REAL(KIND=JPRB) ,INTENT(IN) :: P_COLCO2(jplay)
45 REAL(KIND=JPRB) ,INTENT(IN) :: P_COLN2O(jplay)
46 INTEGER(KIND=JPIM),INTENT(IN) :: K_LAYTROP
47 REAL(KIND=JPRB) ,INTENT(IN) :: P_SELFFAC(jplay)
48 REAL(KIND=JPRB) ,INTENT(IN) :: P_SELFFRAC(jplay)
49 INTEGER(KIND=JPIM),INTENT(IN) :: K_INDSELF(jplay)
50 REAL(KIND=JPRB) ,INTENT(OUT) :: PFRAC(jpgpt,jplay)
51 !- from AER
52 !- from INTFAC
53 !- from INTIND
54 !- from PRECISE
55 !- from PROFDATA
56 !- from SELF
57 !- from SP
58 INTEGER(KIND=JPIM) :: IJS(jplay)
59 REAL(KIND=JPRB) :: ZFS(jplay),Z_SPECCOMB(jplay)
60 INTEGER(KIND=JPIM) :: IND0(jplay),IND1(jplay),INDS(jplay)
61 REAL(KIND=JPRB) :: Z_N2OMULT(jplay)
62 
63 INTEGER(KIND=JPIM) :: IG, JS, I_LAY, I_NS
64 
65 REAL(KIND=JPRB) :: Z_COLREF1, Z_COLREF2, Z_CURRN2O, Z_FAC000, Z_FAC001,&
66  & Z_FAC010, Z_FAC011, Z_FAC100, Z_FAC101, Z_FAC110, Z_FAC111, &
67  & Z_FP, Z_FS, Z_RATIO, Z_SPECMULT, Z_SPECPARM, Z_WCOMB1, &
68  & Z_WCOMB2
69 REAL(KIND=JPRB) :: ZHOOK_HANDLE
70 
71 ! EQUIVALENCE (TAUAERL(1,3),TAUAER)
72 
73 ! Compute the optical depth by interpolating in ln(pressure),
74 ! temperature, and appropriate species. Below LAYTROP, the water
75 ! vapor self-continuum is interpolated (in temperature) separately.
76 
77 IF (lhook) CALL dr_hook('RRTM_TAUMOL3',0,zhook_handle)
78 DO i_lay = 1, k_laytrop
79  z_speccomb(i_lay) = p_colh2o(i_lay) + strrat*p_colco2(i_lay)
80  z_specparm = p_colh2o(i_lay)/z_speccomb(i_lay)
81  z_specparm=min(p_oneminus,z_specparm)
82  z_specmult = 8._jprb*(z_specparm)
83  js = 1 + int(z_specmult)
84  z_fs = mod(z_specmult,1.0_jprb)
85  IF (js == 8) THEN
86  IF (z_fs >= 0.9_jprb) THEN
87  js = 9
88  z_fs = 10._jprb * (z_fs - 0.9_jprb)
89  ELSE
90  z_fs = z_fs/0.9_jprb
91  ENDIF
92  ENDIF
93 
94  i_ns = js + int(z_fs + 0.5_jprb)
95  z_fp = p_fac01(i_lay) + p_fac11(i_lay)
96  ind0(i_lay) = ((k_jp(i_lay)-1)*5+(k_jt(i_lay)-1))*nspa(3) + js
97  ind1(i_lay) = (k_jp(i_lay)*5+(k_jt1(i_lay)-1))*nspa(3) + js
98  inds(i_lay) = k_indself(i_lay)
99  z_colref1 = n2oref(k_jp(i_lay))
100  z_colref2 = n2oref(k_jp(i_lay)+1)
101  IF (i_ns == 10) THEN
102  z_wcomb1 = 1.0_jprb/h2oref(k_jp(i_lay))
103  z_wcomb2 = 1.0_jprb/h2oref(k_jp(i_lay)+1)
104  ELSE
105  z_wcomb1 = (1.0_jprb-etaref(i_ns))/(strrat * co2ref(k_jp(i_lay)))
106  z_wcomb2 = (1.0_jprb-etaref(i_ns))/(strrat * co2ref(k_jp(i_lay)+1))
107  ENDIF
108  z_ratio = (z_colref1*z_wcomb1)+z_fp*((z_colref2*z_wcomb2)-(z_colref1*z_wcomb1))
109  z_currn2o = z_speccomb(i_lay) * z_ratio
110  z_n2omult(i_lay) = p_coln2o(i_lay) - z_currn2o
111 
112  zfs(i_lay)=z_fs
113  ijs(i_lay)=js
114 
115 ENDDO
116 
117 !-- DS_000515
118 DO ig = 1, ng3
119  DO i_lay = 1, k_laytrop
120 !-- DS_000515
121 
122  z_fs=zfs(i_lay)
123  js=ijs(i_lay)
124 
125 !---jjm
126 ! FAC000 = (_ONE_ - FS) * FAC00(LAY)
127 ! FAC010 = (_ONE_ - FS) * FAC10(LAY)
128 ! FAC100 = FS * FAC00(LAY)
129 ! FAC110 = FS * FAC10(LAY)
130 ! FAC001 = (_ONE_ - FS) * FAC01(LAY)
131 ! FAC011 = (_ONE_ - FS) * FAC11(LAY)
132 ! FAC101 = FS * FAC01(LAY)
133 ! FAC111 = FS * FAC11(LAY)
134 !------
135 
136  p_tau(ngs2+ig,i_lay) = z_speccomb(i_lay) * &
137  !-- DS_000515
138  & ( (1. - z_fs) *(p_fac00(i_lay) * absa(ind0(i_lay) ,ig) + &
139  & p_fac10(i_lay) * absa(ind0(i_lay)+10,ig) + &
140  & p_fac01(i_lay) * absa(ind1(i_lay) ,ig) + &
141  & p_fac11(i_lay) * absa(ind1(i_lay)+10,ig))+ &
142  & z_fs *(p_fac00(i_lay) * absa(ind0(i_lay)+ 1,ig) + &
143  & p_fac10(i_lay) * absa(ind0(i_lay)+11,ig) + &
144  & p_fac01(i_lay) * absa(ind1(i_lay)+ 1,ig) + &
145  & p_fac11(i_lay) * absa(ind1(i_lay)+11,ig))) + &
146  ! &(Z_FAC000 * ABSA(IND0(I_LAY) ,IG) +&
147  ! & Z_FAC100 * ABSA(IND0(I_LAY)+ 1,IG) +&
148  ! & Z_FAC010 * ABSA(IND0(I_LAY)+10,IG) +&
149  ! & Z_FAC110 * ABSA(IND0(I_LAY)+11,IG) +&
150  ! & Z_FAC001 * ABSA(IND1(I_LAY), IG) +&
151  ! & Z_FAC101 * ABSA(IND1(I_LAY)+ 1,IG) +&
152  ! & Z_FAC011 * ABSA(IND1(I_LAY)+10,IG) +&
153  ! & Z_FAC111 * ABSA(IND1(I_LAY)+11,IG))+&
154  !-- DS_000515
155  & p_colh2o(i_lay) * &
156  & p_selffac(i_lay) * (selfref(inds(i_lay),ig) + &
157  & p_selffrac(i_lay) *&
158  & (selfref(inds(i_lay)+1,ig) - selfref(inds(i_lay),ig))&
159  & + p_forfac(i_lay) * forref(ig) ) &
160  & + z_n2omult(i_lay) * absn2oa(ig) &
161  & + p_tauaerl(i_lay,3)
162  pfrac(ngs2+ig,i_lay) = fracrefa(ig,js) + z_fs *&
163  & (fracrefa(ig,js+1) - fracrefa(ig,js))
164  ENDDO
165 ENDDO
166 
167 DO i_lay = k_laytrop+1, klev
168  z_speccomb(i_lay) = p_colh2o(i_lay) + strrat*p_colco2(i_lay)
169  z_specparm = p_colh2o(i_lay)/z_speccomb(i_lay)
170  z_specparm=min(p_oneminus,z_specparm)
171  z_specmult = 4._jprb*(z_specparm)
172  js = 1 + int(z_specmult)
173  z_fs = mod(z_specmult,1.0_jprb)
174  i_ns = js + int(z_fs + 0.5_jprb)
175  z_fp = p_fac01(i_lay) + p_fac11(i_lay)
176  ind0(i_lay) = ((k_jp(i_lay)-13)*5+(k_jt(i_lay)-1))*nspb(3) + js
177  ind1(i_lay) = ((k_jp(i_lay)-12)*5+(k_jt1(i_lay)-1))*nspb(3) + js
178  z_colref1 = n2oref(k_jp(i_lay))
179  z_colref2 = n2oref(k_jp(i_lay)+1)
180  IF (i_ns == 5) THEN
181  z_wcomb1 = 1.0_jprb/h2oref(k_jp(i_lay))
182  z_wcomb2 = 1.0_jprb/h2oref(k_jp(i_lay)+1)
183  ELSE
184  z_wcomb1 = (1.0_jprb-etaref(i_ns))/(strrat * co2ref(k_jp(i_lay)))
185  z_wcomb2 = (1.0_jprb-etaref(i_ns))/(strrat * co2ref(k_jp(i_lay)+1))
186  ENDIF
187  z_ratio = (z_colref1*z_wcomb1)+z_fp*((z_colref2*z_wcomb2)-(z_colref1*z_wcomb1))
188  z_currn2o = z_speccomb(i_lay) * z_ratio
189  z_n2omult(i_lay) = p_coln2o(i_lay) - z_currn2o
190 
191  zfs(i_lay)=z_fs
192  ijs(i_lay)=js
193 
194 ENDDO
195 
196 DO i_lay = k_laytrop+1, klev
197 
198  z_fs=zfs(i_lay)
199  js=ijs(i_lay)
200 !---jjm
201 ! FAC000 = (_ONE_ - FS) * FAC00(LAY)
202 ! FAC010 = (_ONE_ - FS) * FAC10(LAY)
203 ! FAC100 = FS * FAC00(LAY)
204 ! FAC110 = FS * FAC10(LAY)
205 ! FAC001 = (_ONE_ - FS) * FAC01(LAY)
206 ! FAC011 = (_ONE_ - FS) * FAC11(LAY)
207 ! FAC101 = FS * FAC01(LAY)
208 ! FAC111 = FS * FAC11(LAY)
209 !---
210 
211  DO ig = 1, ng3
212  p_tau(ngs2+ig,i_lay) = z_speccomb(i_lay) * &
213  !-- DS_000515
214  & ( (1. - z_fs) *(p_fac00(i_lay) * absb(ind0(i_lay) ,ig) + &
215  & p_fac10(i_lay) * absb(ind0(i_lay)+5,ig) + &
216  & p_fac01(i_lay) * absb(ind1(i_lay) ,ig) + &
217  & p_fac11(i_lay) * absb(ind1(i_lay)+5,ig))+ &
218  & z_fs *(p_fac00(i_lay) * absb(ind0(i_lay)+1,ig) + &
219  & p_fac10(i_lay) * absb(ind0(i_lay)+6,ig) + &
220  & p_fac01(i_lay) * absb(ind1(i_lay)+1,ig) + &
221  & p_fac11(i_lay) * absb(ind1(i_lay)+6,ig))) &
222  ! &(Z_FAC000 * ABSB(IND0(I_LAY) ,IG) +&
223  ! & Z_FAC100 * ABSB(IND0(I_LAY)+1,IG) +&
224  ! & Z_FAC010 * ABSB(IND0(I_LAY)+5,IG) +&
225  ! & Z_FAC110 * ABSB(IND0(I_LAY)+6,IG) +&
226  ! & Z_FAC001 * ABSB(IND1(I_LAY) ,IG) +&
227  ! & Z_FAC101 * ABSB(IND1(I_LAY)+1,IG) +&
228  ! & Z_FAC011 * ABSB(IND1(I_LAY)+5,IG) +&
229  ! & Z_FAC111 * ABSB(IND1(I_LAY)+6,IG))&
230  !-- DS_000515
231  & + p_colh2o(i_lay)*p_forfac(i_lay)*forref(ig) &
232  & + z_n2omult(i_lay) * absn2ob(ig)&
233  & + p_tauaerl(i_lay,3)
234  pfrac(ngs2+ig,i_lay) = fracrefb(ig,js) + z_fs *&
235  & (fracrefb(ig,js+1) - fracrefb(ig,js))
236  ENDDO
237 ENDDO
238 
239 IF (lhook) CALL dr_hook('RRTM_TAUMOL3',1,zhook_handle)
240 END SUBROUTINE rrtm_taumol3
real(kind=jprb), dimension(ng3, 10) fracrefa
Definition: yoerrta3.F90:16
real(kind=jprb), dimension(ng3, 5) fracrefb
Definition: yoerrta3.F90:16
real(kind=jprb), dimension(1175, ng3) absb
Definition: yoerrta3.F90:27
integer(kind=jpim), parameter ng3
Definition: parrrtm.F90:25
real(kind=jprb), dimension(16) absn2ob
Definition: yoerrta3.F90:20
integer(kind=jpim), parameter jpgpt
Definition: parrrtm.F90:21
real(kind=jprb), dimension(16) forref
Definition: yoerrta3.F90:18
real(kind=jprb), dimension(650, ng3) absa
Definition: yoerrta3.F90:26
subroutine rrtm_taumol3(KLEV, P_TAU, P_TAUAERL, P_FAC00, P_FAC01, P_FAC10, P_FAC11, P_FORFAC, K_JP, K_JT, K_JT1, P_ONEMINUS, P_COLH2O, P_COLCO2, P_COLN2O, K_LAYTROP, P_SELFFAC, P_SELFFRAC, K_INDSELF, PFRAC)
Definition: rrtm_taumol3.F90:5
integer(kind=jpim), parameter jpband
Definition: parrrtm.F90:18
real(kind=jprb), dimension(59) h2oref
Definition: yoerrta3.F90:22
real(kind=jprb), dimension(59) co2ref
Definition: yoerrta3.F90:24
integer, parameter jprb
Definition: parkind1.F90:31
real(kind=jprb), dimension(59) n2oref
Definition: yoerrta3.F90:23
real(kind=jprb), dimension(16) absn2oa
Definition: yoerrta3.F90:19
integer(kind=jpim), dimension(16) nspb
Definition: yoerrtwn.F90:13
integer(kind=jpim), dimension(16) nspa
Definition: yoerrtwn.F90:12
real(kind=jprb), dimension(10) etaref
Definition: yoerrta3.F90:21
logical lhook
Definition: yomhook.F90:12
real(kind=jprb) strrat
Definition: yoerrta3.F90:29
integer(kind=jpim), parameter ngs2
Definition: parrrtm.F90:41
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
real(kind=jprb), dimension(10, ng3) selfref
Definition: yoerrta3.F90:28