LMDZ
srtm_cldprop.F90
Go to the documentation of this file.
1 SUBROUTINE srtm_cldprop &
2  & ( klev, k_icldatm, k_inflag, k_iceflag, k_liqflag, k_nstr,&
3  & p_cldfrac, p_clddat1, p_clddat2, p_clddat3, p_clddat4, p_clddatmom,&
4  & p_taucldorig, p_taucloud, p_ssacloud, p_xmom &
5  & )
6 
7 ! path: $Source: /storm/rc1/cvsroot/rc/rrtm_sw/src/cldprop_sw.f,v $
8 ! author: $Author: jdelamer $
9 ! revision: $Revision: 2.6 $
10 ! created: $Date: 2002/04/04 18:29:47 $
11 
12 ! PURPOSE: COMPUTE THE CLOUD OPTICAL DEPTH(S) FOR EACH CLOUDY
13 ! LAYER. NOTE: ONLY INFLAG = 0 AND INFLAG=2/LIQFLAG=1,
14 ! ICEFLAG=3
15 ! (HU & STAMNES, Q. FU) ARE IMPLEMENTED.
16 
17 USE parkind1 ,ONLY : jpim ,jprb
18 USE yomhook ,ONLY : lhook, dr_hook
19 
20 USE parsrtm , ONLY : jplay, jpband, jpb1, jpb2
21 USE yoesrtop, ONLY : extliq1, ssaliq1, asyliq1 &
25 
26 ! ------------------------------------------------------------------
27 
28 IMPLICIT NONE
29 
30 !-- real arguments
31 
32 INTEGER(KIND=JPIM),INTENT(IN) :: KLEV
33 INTEGER(KIND=JPIM),INTENT(OUT) :: K_ICLDATM
34 INTEGER(KIND=JPIM),INTENT(IN) :: K_INFLAG
35 INTEGER(KIND=JPIM),INTENT(IN) :: K_ICEFLAG
36 INTEGER(KIND=JPIM),INTENT(IN) :: K_LIQFLAG
37 INTEGER(KIND=JPIM),INTENT(IN) :: K_NSTR
38 REAL(KIND=JPRB) ,INTENT(IN) :: P_CLDFRAC(jplay)
39 REAL(KIND=JPRB) ,INTENT(IN) :: P_CLDDAT1(jplay)
40 REAL(KIND=JPRB) ,INTENT(IN) :: P_CLDDAT2(jplay)
41 REAL(KIND=JPRB) ,INTENT(IN) :: P_CLDDAT3(jplay)
42 REAL(KIND=JPRB) ,INTENT(IN) :: P_CLDDAT4(jplay)
43 REAL(KIND=JPRB) ,INTENT(IN) :: P_CLDDATMOM(0:16,jplay)
44 REAL(KIND=JPRB) ,INTENT(INOUT) :: P_TAUCLDORIG(jplay,jpband)
45 REAL(KIND=JPRB) ,INTENT(INOUT) :: P_TAUCLOUD(jplay,jpband)
46 REAL(KIND=JPRB) ,INTENT(OUT) :: P_SSACLOUD(jplay,jpband)
47 REAL(KIND=JPRB) ,INTENT(OUT) :: P_XMOM(0:16,jplay,jpband)
48 !-- integer arguments
49 
50 !-- real locals
51 REAL(KIND=JPRB) :: Z_EPS
52 REAL(KIND=JPRB) :: Z_TAUCLDORIG_A, Z_FFP, Z_FFP1, Z_FFPSSA, Z_SSACLOUD_A, Z_TAUCLOUD_A
53 REAL(KIND=JPRB) :: Z_CWP, Z_FICE, Z_RADICE, Z_FACTOR, Z_FINT, Z_FLIQ, Z_RADLIQ
54 REAL(KIND=JPRB) :: Z_TAUICEORIG, Z_SCATICE, Z_SSAICE, Z_TAUICE &
55  & , Z_TAULIQORIG, Z_SCATLIQ, Z_SSALIQ, Z_TAULIQ
56 
57 !-- integer locals
58 INTEGER(KIND=JPIM) :: I_NCBANDS, I_NLAYERS
59 INTEGER(KIND=JPIM) :: IB, IB1, IB2, I_LAY, ISTR , INDEX
60 INTEGER(KIND=JPIM) :: I_NDBUG
61 REAL(KIND=JPRB) :: ZHOOK_HANDLE
62 
63 ! INCLUDE 'param.f'
64 
65 ! COMMON /CONTROL/ IAER, NSTR, IOUT, ISTART, IEND, ICLD
66 
67 ! COMMON /PROFILE/ NLAYERS,PAVEL(MXLAY),TAVEL(MXLAY),
68 ! & PZ(0:MXLAY),TZ(0:MXLAY)
69 
70 ! COMMON /CLOUDIN/ INFLAG,CLDDAT1(MXLAY),CLDDAT2(MXLAY),
71 ! & ICEFLAG,LIQFLAG,CLDDAT3(MXLAY),CLDDAT4(MXLAY),
72 ! & CLDDATMOM(0:16,MXLAY)
73 
74 ! COMMON /CLOUDDAT/ NCBANDS,CLDFRAC(MXLAY),
75 ! & TAUCLOUD(MXLAY,NBANDS),SSACLOUD(MXLAY,NBANDS),
76 ! & XMOM(0:16,MXLAY,NBANDS),TAUCLDORIG(MXLAY,NBANDS)
77 
78 ! COMMON /HVERSN/ HVRRTM,HVRRTR,HVRATM,HVRSET,HVRTAU,
79 ! * HVDUM1(4),HVRUTL,HVREXT,
80 ! * HVRD1M,HVRR1M,HVREPK,HVRLPK,HVRAER,HVRBKA,
81 ! * HVRBKB,HVRCLD,HVRDIS,HVRLAM,HVRPAR
82 
83 ! CHARACTER*15 HVRRTM,HVRRTR,HVRATM,HVRSET,HVRTAU,
84 ! * HVDUM1,HVRUTL,HVREXT,
85 ! * HVRD1M,HVRR1M,HVREPK,HVRLPK,HVRAER,HVRBKA,
86 ! * HVRBKB,HVRCLD,HVRDIS,HVRLAM,HVRPAR
87 
88 ! DIMENSION ABSICE0(2), ABSICE1(2,5), ABSICE2(40,16)
89 ! DIMENSION ABSLIQ1(58,16)
90 
91 ! DIMENSION ABSCOICE(NBANDS), ABSCOLIQ(NBANDS)
92 ! DIMENSION EXTCOLIQ(NBANDS),SSACOLIQ(NBANDS),GLIQ(NBANDS)
93 ! DIMENSION EXTCOICE(NBANDS),SSACOICE(NBANDS),GICE(NBANDS)
94 ! DIMENSION FORWLIQ(NBANDS),FORWICE(NBANDS)
95 
96 ! Added for SW
97 ! DIMENSION EXTLIQ1(58,NBANDS), SSALIQ1(58,NBANDS),
98 ! & ASYLIQ1(58,NBANDS)
99 ! DIMENSION EXTICE3(27,NBANDS), SSAICE3(27,NBANDS),
100 ! & ASYICE3(27,NBANDS),FDLICE3(28,NBANDS)
101 ! DIMENSION FDELTA(NBANDS)
102 
103 !DATA EPS /1.E-6/
104 
105 ! HVRCLD = '$Revision: 2.6 $'
106 
107 IF (lhook) CALL dr_hook('SRTM_CLDPROP',0,zhook_handle)
108 z_eps = 1.e-06_jprb
109 i_ndbug = 3
110 
111 k_icldatm = 0
112 i_ncbands = 29
113 i_nlayers = klev
114 ib1 = jpb1
115 ib2 = jpb2
116 
117 IF (i_ndbug <= 2) THEN
118  print *,'cldprop before loop K_INFLAG, K_ICEFLAG, K_LIQFLAG:',k_inflag,k_iceflag,k_liqflag,ib1,ib2
119 ENDIF
120 
121 DO i_lay = 1, i_nlayers
122 
123  IF (p_cldfrac(i_lay) >= z_eps) THEN
124  k_icldatm = 1
125 
126  IF (i_ndbug <= 2) THEN
127  print 9101,i_lay,k_icldatm,p_cldfrac(i_lay),p_clddat1(i_lay),p_clddat2(i_lay),p_clddat3(i_lay)&
128  & ,p_clddat4(i_lay),(p_clddatmom(istr,i_lay),istr=0,k_nstr)
129  9101 format(1x,'Cld :',2i3,f7.4,7e12.5)
130  ENDIF
131 
132 ! Ice clouds and water clouds combined.
133  IF (k_inflag == 0) THEN
134  z_taucldorig_a = p_clddat1(i_lay)
135  z_ffp = p_clddatmom(k_nstr,i_lay)
136  z_ffp1 = 1.0 - z_ffp
137  z_ffpssa = 1.0 - z_ffp * p_clddat2(i_lay)
138  z_ssacloud_a = z_ffp1*p_clddat2(i_lay)/z_ffpssa
139  z_taucloud_a = z_ffpssa*z_taucldorig_a
140 
141 ! DO IB = 16,NBANDS
142  DO ib = ib1 , ib2
143  p_taucldorig(i_lay,ib) = z_taucldorig_a
144  p_ssacloud(i_lay,ib) = z_ssacloud_a
145  p_taucloud(i_lay,ib) = z_taucloud_a
146 
147  DO istr = 0,k_nstr
148  p_xmom(istr,i_lay,ib) = (p_clddatmom(istr,i_lay) - z_ffp)/ &
149  & (z_ffp1)
150  ENDDO
151  ENDDO
152 
153 ! Separate treatement of ice clouds and water clouds.
154  ELSEIF(k_inflag == 2) THEN
155  z_cwp = p_clddat1(i_lay)
156  z_fice = p_clddat2(i_lay)
157  z_radice = p_clddat3(i_lay)
158 
159  IF (i_ndbug <= 1) THEN
160  print 9102,i_lay,z_cwp,z_fice,z_radice
161  9102 format(1x,'A',i3,3e13.6)
162  ENDIF
163 
164 ! Calculation of absorption coefficients due to ice clouds.
165  IF (z_fice == 0.0) THEN
166 ! NCBANDS = 29
167 ! DO IB = 16, NCBANDS
168  DO ib = ib1 , ib2
169  extcoice(ib) = 0.0_jprb
170  ssacoice(ib) = 1.0_jprb
171  gice(ib) = 1.0_jprb
172  forwice(ib) = 0.0_jprb
173 
174  IF (i_ndbug <= 1) THEN
175  print 9103,i_lay,z_fice,z_cwp,z_radice,ib,extcoice(ib),ssacoice(ib),gice(ib),forwice(ib)
176  9103 format(1x,'B',i3,f6.3,2e13.6,i3,4e12.5)
177  ENDIF
178 
179  ENDDO
180 
181  ELSEIF (k_iceflag == 3) THEN
182  IF (z_radice < 10.0 .OR. z_radice > 140.0) stop 'ICE EFFECTIVE SIZE OUT OF BOUNDS'
183 ! NCBANDS = 29
184  z_factor = (z_radice - 5._jprb)/5._jprb
185  index = int(z_factor)
186  IF (index == 27) index = 26
187  z_fint = z_factor - REAL(index)
188 
189 ! DO IB=16,NCBANDS
190  DO ib = ib1 , ib2
191  extcoice(ib) = z_fice * (extice3(index,ib) + z_fint * &
192  & (extice3(index+1,ib) - extice3(index,ib)))
193  ssacoice(ib) = ssaice3(index,ib) + z_fint * &
194  & (ssaice3(index+1,ib) - ssaice3(index,ib))
195  gice(ib) = asyice3(index,ib) + z_fint * &
196  & (asyice3(index+1,ib) - asyice3(index,ib))
197  fdelta(ib) = fdlice3(index,ib) + z_fint * &
198  & (fdlice3(index+1,ib) - fdlice3(index,ib))
199  if (fdelta(ib) < 0.0) stop 'FDELTA LESS THAN 0.0'
200  if (fdelta(ib) > 1.0) stop 'FDELTA GT THAN 1.0'
201  forwice(ib) = fdelta(ib) + 0.5 / ssacoice(ib)
202 ! See Fu 1996 p. 2067
203  IF (forwice(ib) > gice(ib)) forwice(ib) = gice(ib)
204 ! Check to ensure all calculated quantities are within physical limits.
205  if (extcoice(ib) < 0.0_jprb) stop 'ICE EXTINCTION LESS THAN 0.0'
206  if (ssacoice(ib) > 1.0_jprb) stop 'ICE SSA GRTR THAN 1.0'
207  if (ssacoice(ib) < 0.0_jprb) stop 'ICE SSA LESS THAN 0.0'
208  if (gice(ib) > 1.0_jprb) stop 'ICE ASYM GRTR THAN 1.0'
209  if (gice(ib) < 0.0_jprb) stop 'ICE ASYM LESS THAN 0.0'
210 
211  IF (i_ndbug <= 1) THEN
212  print 9104,i_lay,z_fice,z_cwp,z_radice,ib,extcoice(ib),ssacoice(ib),gice(ib),forwice(ib),fdelta(ib)
213  9104 format(1x,'C',i3,f5.3,2e13.6,i3,5e12.5)
214  ENDIF
215 
216  ENDDO
217  ENDIF
218  print *,'end of ice computations for I_LAY=',i_lay
219 
220 ! Calculation of absorption coefficients due to water clouds.
221  z_fliq = 1. - z_fice
222  IF (z_fliq == 0.0) THEN
223 ! NCBANDS = 29
224 ! DO IB = 16, NCBANDS
225  DO ib = ib1 , ib2
226  extcoliq(ib) = 0.0
227  ssacoliq(ib) = 1.0
228  gliq(ib) = 1.0
229  forwliq(ib) = 0.0
230 
231  IF (i_ndbug <= 1) THEN
232  print 9105,i_lay,z_fliq,z_cwp,ib,extcoliq(ib),ssacoliq(ib),gliq(ib),forwliq(ib)
233  9105 format(1x,'D',i3,f5.3,1e13.6,i3,4e12.5)
234  ENDIF
235 
236  ENDDO
237 
238  ELSEIF (k_liqflag == 1) THEN
239  z_radliq = p_clddat4(i_lay)
240  IF (z_radliq < 1.5 .OR. z_radliq > 60.) stop 'LIQUID EFFECTIVE RADIUS OUT OF BOUNDS'
241  index = int(z_radliq - 1.5)
242  IF (index == 0) index = 1
243  IF (index == 58) index = 57
244  z_fint = z_radliq - 1.5 - REAL(index)
245 ! NCBANDS = 29
246 
247 ! DO IB = 16, NCBANDS
248  DO ib = ib1 , ib2
249  extcoliq(ib) = z_fliq * (extliq1(index,ib) + z_fint * &
250  & (extliq1(index+1,ib) - (extliq1(index,ib))))
251  ssacoliq(ib) = ssaliq1(index,ib) + z_fint * &
252  & (ssaliq1(index+1,ib) - ssaliq1(index,ib))
253  gliq(ib) = asyliq1(index,ib) + z_fint * &
254  & (asyliq1(index+1,ib) - asyliq1(index,ib))
255  forwliq(ib) = gliq(ib)**k_nstr
256 ! Check to ensure all calculated quantities are within physical limits.
257  if (extcoliq(ib) < 0.0_jprb) stop 'LIQUID EXTINCTION LESS THAN 0.0'
258  if (ssacoliq(ib) > 1.0_jprb) stop 'LIQUID SSA GRTR THAN 1.0'
259  if (ssacoliq(ib) < 0.0_jprb) stop 'LIQUID SSA LESS THAN 0.0'
260  if (gliq(ib) > 1.0_jprb) stop 'LIQUID ASYM GRTR THAN 1.0'
261  if (gliq(ib) < 0.0_jprb) stop 'LIQUID ASYM LESS THAN 0.0'
262 
263  IF (i_ndbug <= 1) THEN
264  print 9106,i_lay,z_fliq,z_cwp,z_radliq,ib,extcoliq(ib),ssacoliq(ib),gliq(ib),forwliq(ib)
265  9106 format(1x,'E',i3,f5.3,2e13.6,i3,5e12.5)
266  ENDIF
267 
268  ENDDO
269  ENDIF
270 
271  IF (i_ndbug <= 1) THEN
272  print *,'end of liquid water computations for I_LAY=',i_lay
273  ENDIF
274 
275 ! DO IB = 16, NCBANDS
276  DO ib = ib1 , ib2
277  z_tauliqorig = z_cwp * extcoliq(ib)
278  z_tauiceorig = z_cwp * extcoice(ib)
279  p_taucldorig(i_lay,ib) = z_tauliqorig + z_tauiceorig
280 
281  IF (i_ndbug <= 1) THEN
282  print 9107,ib,z_tauliqorig,z_tauiceorig,p_taucldorig(i_lay,ib),z_cwp &
283  & ,extcoliq(ib),extcoice(ib),ssacoliq(ib),ssacoice(ib) &
284  & ,forwliq(ib),forwice(ib)
285  9107 format(1x,'F',i3,10e12.5)
286  ENDIF
287 
288  z_ssaliq = ssacoliq(ib) * (1. - forwliq(ib)) / &
289  & (1. - forwliq(ib) * ssacoliq(ib))
290  z_tauliq = (1. - forwliq(ib) * ssacoliq(ib)) * &
291  & z_tauliqorig
292  z_ssaice = ssacoice(ib) * (1. - forwice(ib)) / &
293  & (1. - forwice(ib) * ssacoice(ib))
294  z_tauice = (1. - forwice(ib) * ssacoice(ib)) * &
295  & z_tauiceorig
296  z_scatliq = z_ssaliq * z_tauliq
297  z_scatice = z_ssaice * z_tauice
298  p_taucloud(i_lay,ib) = z_tauliq + z_tauice
299  p_ssacloud(i_lay,ib) = (z_scatliq + z_scatice) / &
300  & p_taucloud(i_lay,ib)
301  p_xmom(0,i_lay,ib) = 1.0
302 
303  IF (i_ndbug <= 1) THEN
304  print 9108,ib,z_tauliqorig,z_tauiceorig,z_ssaliq,z_tauliq,z_scatliq,z_ssaice,z_tauice,z_scatice
305  9108 format(1x,'G',i3,8e13.6)
306  ENDIF
307 
308  DO istr = 1, k_nstr
309 !This commented code is the standard method for delta-m scaling. In accordance
310 ! with the 1996 Fu paper, equation A.3, the moments for ice were calculated
311 ! as in the uncommented code.
312 ! XMOM(ISTR,LAY,IB) = (SCATLIQ * &
313 ! & (GLIQ(IB)**ISTR - FORWLIQ(IB)) / &
314 ! & (1. - FORWLIQ(IB)) &
315 ! & + SCATICE * &
316 ! & (GICE(IB)**ISTR - FORWICE(IB)) / &
317 ! & (1. - FORWICE(IB)))/(SCATLIQ + SCATICE)
318 
319  p_xmom(istr,i_lay,ib) = (1.0/(z_scatliq+z_scatice))* &
320  & (z_scatliq*(gliq(ib)**istr - forwliq(ib)) / &
321  & (1. - forwliq(ib)) &
322  & + z_scatice * &
323  & ((gice(ib)-forwice(ib))/(1.0-forwice(ib)))**istr)
324  ENDDO
325  ENDDO
326 
327  ENDIF
328 
329  ENDIF
330 
331 ENDDO
332 
333 IF (i_ndbug <= 1) THEN
334  print *,'about to leave SRTM_CLDPROP'
335 ENDIF
336 
337 !-----------------------------------------------------------------------
338 IF (lhook) CALL dr_hook('SRTM_CLDPROP',1,zhook_handle)
339 END SUBROUTINE srtm_cldprop
340 
integer(kind=jpim), parameter jpb2
Definition: parsrtm.F90:25
real(kind=jprb), dimension(46, 16:29) asyice3
Definition: yoesrtop.F90:16
real(kind=jprb), dimension(16:29) ssacoliq
Definition: yoesrtop.F90:21
integer(kind=jpim), parameter jplay
Definition: parsrtm.F90:19
real(kind=jprb), dimension(46, 16:29) extice3
Definition: yoesrtop.F90:16
integer, save klev
Definition: dimphy.F90:7
real(kind=jprb), dimension(58, 16:29) ssaliq1
Definition: yoesrtop.F90:14
real(kind=jprb), dimension(16:29) forwliq
Definition: yoesrtop.F90:21
real(kind=jprb), dimension(46, 16:29) ssaice3
Definition: yoesrtop.F90:16
real(kind=jprb), dimension(16:29) extcoliq
Definition: yoesrtop.F90:21
real(kind=jprb), dimension(46, 16:29) fdlice3
Definition: yoesrtop.F90:17
integer, parameter jprb
Definition: parkind1.F90:31
real(kind=jprb), dimension(16:29) fdelta
Definition: yoesrtop.F90:17
real(kind=jprb), dimension(58, 16:29) asyliq1
Definition: yoesrtop.F90:14
!$Header!c c INCLUDE fxyprim h c c c Fonctions in line c c REAL fyprim REAL rj c c il faut la calculer avant d appeler ces fonctions c c c Fonctions a changer selon x(x) et y(y) choisis.c-----------------------------------------------------------------c c.....ici
real(kind=jprb), dimension(16:29) ssacoice
Definition: yoesrtop.F90:20
logical lhook
Definition: yomhook.F90:12
subroutine srtm_cldprop(KLEV, K_ICLDATM, K_INFLAG, K_ICEFLAG, K_LIQFLAG, K_NSTR, P_CLDFRAC, P_CLDDAT1, P_CLDDAT2, P_CLDDAT3, P_CLDDAT4, P_CLDDATMOM, P_TAUCLDORIG, P_TAUCLOUD, P_SSACLOUD, P_XMOM)
Definition: srtm_cldprop.F90:6
integer(kind=jpim), parameter jpband
Definition: parsrtm.F90:22
real(kind=jprb), dimension(16:29) gliq
Definition: yoesrtop.F90:21
subroutine dr_hook(CDNAME, KSWITCH, PKEY)
Definition: yomhook.F90:17
real(kind=jprb), dimension(16:29) gice
Definition: yoesrtop.F90:20
integer, parameter jpim
Definition: parkind1.F90:13
real(kind=jprb), dimension(16:29) forwice
Definition: yoesrtop.F90:20
real(kind=jprb), dimension(58, 16:29) extliq1
Definition: yoesrtop.F90:14
integer(kind=jpim), parameter jpb1
Definition: parsrtm.F90:24
real(kind=jprb), dimension(16:29) extcoice
Definition: yoesrtop.F90:20