PageRenderTime 53ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 1ms

/wrfv2_fire/phys/module_ra_sw.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 520 lines | 362 code | 68 blank | 90 comment | 3 complexity | 604442b3bd15ea6f6d1ae7aa670ddb3c MD5 | raw file
Possible License(s): AGPL-1.0
  1. !WRF:MODEL_LAYER:PHYSICS
  2. !
  3. MODULE module_ra_sw
  4. REAL,PRIVATE,SAVE :: CSSCA
  5. CONTAINS
  6. !------------------------------------------------------------------
  7. SUBROUTINE SWRAD(dt,RTHRATEN,GSW,XLAT,XLONG,ALBEDO, &
  8. rho_phy,T3D,QV3D,QC3D,QR3D, &
  9. QI3D,QS3D,QG3D,P3D,pi3D,dz8w,GMT, &
  10. R,CP,G,JULDAY, &
  11. XTIME,DECLIN,SOLCON, &
  12. F_QV,F_QC,F_QR,F_QI,F_QS,F_QG, &
  13. pm2_5_dry,pm2_5_water,pm2_5_dry_ec, &
  14. RADFRQ,ICLOUD,DEGRAD,warm_rain, &
  15. ids,ide, jds,jde, kds,kde, &
  16. ims,ime, jms,jme, kms,kme, &
  17. its,ite, jts,jte, kts,kte &
  18. )
  19. !------------------------------------------------------------------
  20. IMPLICIT NONE
  21. !------------------------------------------------------------------
  22. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  23. ims,ime, jms,jme, kms,kme, &
  24. its,ite, jts,jte, kts,kte
  25. LOGICAL, INTENT(IN ) :: warm_rain
  26. INTEGER, INTENT(IN ) :: icloud
  27. REAL, INTENT(IN ) :: RADFRQ,DEGRAD, &
  28. XTIME,DECLIN,SOLCON
  29. !
  30. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
  31. INTENT(IN ) :: P3D, &
  32. pi3D, &
  33. rho_phy, &
  34. dz8w, &
  35. T3D
  36. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), OPTIONAL , &
  37. INTENT(IN ) :: pm2_5_dry, &
  38. pm2_5_water, &
  39. pm2_5_dry_ec
  40. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
  41. INTENT(INOUT) :: RTHRATEN
  42. !
  43. REAL, DIMENSION( ims:ime, jms:jme ), &
  44. INTENT(IN ) :: XLAT, &
  45. XLONG, &
  46. ALBEDO
  47. !
  48. REAL, DIMENSION( ims:ime, jms:jme ), &
  49. INTENT(INOUT) :: GSW
  50. !
  51. REAL, INTENT(IN ) :: GMT,R,CP,G,dt
  52. !
  53. INTEGER, INTENT(IN ) :: JULDAY
  54. !
  55. ! Optional
  56. !
  57. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
  58. OPTIONAL, &
  59. INTENT(IN ) :: &
  60. QV3D, &
  61. QC3D, &
  62. QR3D, &
  63. QI3D, &
  64. QS3D, &
  65. QG3D
  66. LOGICAL, OPTIONAL, INTENT(IN ) :: F_QV,F_QC,F_QR,F_QI,F_QS,F_QG
  67. ! LOCAL VARS
  68. REAL, DIMENSION( kts:kte ) :: &
  69. TTEN1D, &
  70. RHO01D, &
  71. P1D, &
  72. DZ, &
  73. T1D, &
  74. QV1D, &
  75. QC1D, &
  76. QR1D, &
  77. QI1D, &
  78. QS1D, &
  79. QG1D
  80. !
  81. REAL:: XLAT0,XLONG0,ALB0,GSW0
  82. !
  83. INTEGER :: i,j,K,NK
  84. LOGICAL :: predicate , do_topo_shading
  85. real :: aer_dry1(kts:kte),aer_water1(kts:kte)
  86. !------------------------------------------------------------------
  87. j_loop: DO J=jts,jte
  88. i_loop: DO I=its,ite
  89. ! reverse vars
  90. DO K=kts,kte
  91. QV1D(K)=0.
  92. QC1D(K)=0.
  93. QR1D(K)=0.
  94. QI1D(K)=0.
  95. QS1D(K)=0.
  96. QG1D(K)=0.
  97. ENDDO
  98. DO K=kts,kte
  99. NK=kme-1-K+kms
  100. TTEN1D(K)=0.
  101. T1D(K)=T3D(I,NK,J)
  102. P1D(K)=P3D(I,NK,J)
  103. RHO01D(K)=rho_phy(I,NK,J)
  104. DZ(K)=dz8w(I,NK,J)
  105. ENDDO
  106. IF( PRESENT(pm2_5_dry) .AND. PRESENT(pm2_5_water) )THEN
  107. DO K=kts,kte
  108. NK=kme-1-K+kms
  109. aer_dry1(k) = pm2_5_dry(i,nk,j)
  110. aer_water1(k) = pm2_5_water(i,nk,j)
  111. ENDDO
  112. ELSE
  113. DO K=kts,kte
  114. aer_dry1(k) = 0.
  115. aer_water1(k) = 0.
  116. ENDDO
  117. ENDIF
  118. IF (PRESENT(F_QV) .AND. PRESENT(QV3D)) THEN
  119. IF (F_QV) THEN
  120. DO K=kts,kte
  121. NK=kme-1-K+kms
  122. QV1D(K)=QV3D(I,NK,J)
  123. QV1D(K)=max(0.,QV1D(K))
  124. ENDDO
  125. ENDIF
  126. ENDIF
  127. IF (PRESENT(F_QC) .AND. PRESENT(QC3D)) THEN
  128. IF (F_QC) THEN
  129. DO K=kts,kte
  130. NK=kme-1-K+kms
  131. QC1D(K)=QC3D(I,NK,J)
  132. QC1D(K)=max(0.,QC1D(K))
  133. ENDDO
  134. ENDIF
  135. ENDIF
  136. IF (PRESENT(F_QR) .AND. PRESENT(QR3D)) THEN
  137. IF (F_QR) THEN
  138. DO K=kts,kte
  139. NK=kme-1-K+kms
  140. QR1D(K)=QR3D(I,NK,J)
  141. QR1D(K)=max(0.,QR1D(K))
  142. ENDDO
  143. ENDIF
  144. ENDIF
  145. !
  146. IF ( PRESENT( F_QI ) ) THEN
  147. predicate = F_QI
  148. ELSE
  149. predicate = .FALSE.
  150. ENDIF
  151. IF ( predicate .AND. PRESENT( QI3D ) ) THEN
  152. DO K=kts,kte
  153. NK=kme-1-K+kms
  154. QI1D(K)=QI3D(I,NK,J)
  155. QI1D(K)=max(0.,QI1D(K))
  156. ENDDO
  157. ELSE
  158. IF (.not. warm_rain) THEN
  159. DO K=kts,kte
  160. IF(T1D(K) .lt. 273.15) THEN
  161. QI1D(K)=QC1D(K)
  162. QC1D(K)=0.
  163. QS1D(K)=QR1D(K)
  164. QR1D(K)=0.
  165. ENDIF
  166. ENDDO
  167. ENDIF
  168. ENDIF
  169. IF (PRESENT(F_QS) .AND. PRESENT(QS3D)) THEN
  170. IF (F_QS) THEN
  171. DO K=kts,kte
  172. NK=kme-1-K+kms
  173. QS1D(K)=QS3D(I,NK,J)
  174. QS1D(K)=max(0.,QS1D(K))
  175. ENDDO
  176. ENDIF
  177. ENDIF
  178. IF (PRESENT(F_QG) .AND. PRESENT(QG3D)) THEN
  179. IF (F_QG) THEN
  180. DO K=kts,kte
  181. NK=kme-1-K+kms
  182. QG1D(K)=QG3D(I,NK,J)
  183. QG1D(K)=max(0.,QG1D(K))
  184. ENDDO
  185. ENDIF
  186. ENDIF
  187. XLAT0=XLAT(I,J)
  188. XLONG0=XLONG(I,J)
  189. ALB0=ALBEDO(I,J)
  190. ! slope code removed - factor now done in surface driver
  191. CALL SWPARA(TTEN1D,GSW0,XLAT0,XLONG0,ALB0, &
  192. T1D,QV1D,QC1D,QR1D,QI1D,QS1D,QG1D,P1D, &
  193. XTIME,GMT,RHO01D,DZ, &
  194. R,CP,G,DECLIN,SOLCON, &
  195. RADFRQ,ICLOUD,DEGRAD,aer_dry1,aer_water1, &
  196. kts,kte )
  197. GSW(I,J)=GSW0
  198. DO K=kts,kte
  199. NK=kme-1-K+kms
  200. RTHRATEN(I,K,J)=RTHRATEN(I,K,J)+TTEN1D(NK)/pi3D(I,K,J)
  201. ENDDO
  202. !
  203. ENDDO i_loop
  204. ENDDO j_loop
  205. END SUBROUTINE SWRAD
  206. !------------------------------------------------------------------
  207. SUBROUTINE SWPARA(TTEN,GSW,XLAT,XLONG,ALBEDO, &
  208. T,QV,QC,QR,QI,QS,QG,P, &
  209. XTIME, GMT, RHO0, DZ, &
  210. R,CP,G,DECLIN,SOLCON, &
  211. RADFRQ,ICLOUD,DEGRAD,aer_dry1,aer_water1, &
  212. kts,kte,slope_rad,shadow,slp_azi,slope )
  213. !------------------------------------------------------------------
  214. ! TO CALCULATE SHORT-WAVE ABSORPTION AND SCATTERING IN CLEAR
  215. ! AIR AND REFLECTION AND ABSORPTION IN CLOUD LAYERS (STEPHENS,
  216. ! 1984)
  217. ! CHANGES:
  218. ! REDUCE EFFECTS OF ICE CLOUDS AND PRECIP ON LIQUID WATER PATH
  219. ! ADD EFFECT OF GRAUPEL
  220. !------------------------------------------------------------------
  221. IMPLICIT NONE
  222. INTEGER, INTENT(IN ) :: kts,kte
  223. !
  224. REAL, DIMENSION( kts:kte ), INTENT(IN ) :: &
  225. RHO0, &
  226. T, &
  227. P, &
  228. DZ, &
  229. QV, &
  230. QC, &
  231. QR, &
  232. QI, &
  233. QS, &
  234. QG
  235. REAL, DIMENSION( kts:kte ), INTENT(INOUT):: TTEN
  236. !
  237. REAL, INTENT(IN ) :: XTIME,GMT,R,CP,G,DECLIN, &
  238. SOLCON,XLAT,XLONG,ALBEDO, &
  239. RADFRQ, DEGRAD
  240. !
  241. INTEGER, INTENT(IN) :: icloud
  242. REAL, INTENT(INOUT) :: GSW
  243. ! For slope-dependent radiation
  244. INTEGER, OPTIONAL, INTENT(IN) :: slope_rad,shadow
  245. REAL, OPTIONAL, INTENT(IN) :: slp_azi,slope
  246. ! LOCAL VARS
  247. !
  248. REAL, DIMENSION( kts:kte+1 ) :: SDOWN
  249. REAL, DIMENSION( kts:kte ) :: XLWP, &
  250. XATP, &
  251. XWVP, &
  252. aer_dry1,aer_water1, &
  253. RO
  254. !
  255. REAL, DIMENSION( 4, 5 ) :: ALBTAB, &
  256. ABSTAB
  257. REAL, DIMENSION( 4 ) :: XMUVAL
  258. REAL :: beta
  259. !------------------------------------------------------------------
  260. DATA ALBTAB/0.,0.,0.,0., &
  261. 69.,58.,40.,15., &
  262. 90.,80.,70.,60., &
  263. 94.,90.,82.,78., &
  264. 96.,92.,85.,80./
  265. DATA ABSTAB/0.,0.,0.,0., &
  266. 0.,2.5,4.,5., &
  267. 0.,2.6,7.,10., &
  268. 0.,3.3,10.,14., &
  269. 0.,3.7,10.,15./
  270. DATA XMUVAL/0.,0.2,0.5,1.0/
  271. REAL :: bext340, absc, alba, alw, csza,dabsa,dsca,dabs
  272. REAL :: bexth2o, dscld, hrang,ff,oldalb,oldabs,oldabc
  273. REAL :: soltop, totabs, tloctm, ugcm, uv,xabs,xabsa,wv
  274. REAL :: wgm, xalb, xi, xsca, xt24,xmu,xabsc,trans0,yj
  275. REAL :: xxlat,ww
  276. INTEGER :: iil,ii,jjl,ju,k,iu
  277. ! For slope-dependent radiation
  278. REAL :: diffuse_frac, corr_fac, csza_slp
  279. GSW=0.0
  280. bext340=5.E-6
  281. bexth2o=5.E-6
  282. SOLTOP=SOLCON
  283. XT24=MOD(XTIME+RADFRQ*0.5,1440.)
  284. TLOCTM=GMT+XT24/60.+XLONG/15.
  285. HRANG=15.*(TLOCTM-12.)*DEGRAD
  286. XXLAT=XLAT*DEGRAD
  287. CSZA=SIN(XXLAT)*SIN(DECLIN)+COS(XXLAT)*COS(DECLIN)*COS(HRANG)
  288. ! RETURN IF NIGHT
  289. IF(CSZA.LE.1.E-9)GOTO 7
  290. !
  291. DO K=kts, kte
  292. ! P in the unit of 10mb
  293. RO(K)=P(K)/(R*T(K))
  294. XWVP(K)=RO(K)*QV(K)*DZ(K)*1000.
  295. ! KG/M**2
  296. XATP(K)=RO(K)*DZ(K)
  297. ENDDO
  298. !
  299. ! G/M**2
  300. ! REDUCE WEIGHT OF LIQUID AND ICE IN SHORT-WAVE SCHEME
  301. ! ADD GRAUPEL EFFECT (ASSUMED SAME AS RAIN)
  302. !
  303. IF (ICLOUD.EQ.0)THEN
  304. DO K=kts, kte
  305. XLWP(K)=0.
  306. ENDDO
  307. ELSE
  308. DO K=kts, kte
  309. XLWP(K)=RO(K)*1000.*DZ(K)*(QC(K)+0.1*QI(K)+0.05* &
  310. QR(K)+0.02*QS(K)+0.05*QG(K))
  311. ENDDO
  312. ENDIF
  313. !
  314. XMU=CSZA
  315. SDOWN(1)=SOLTOP*XMU
  316. ! SET WW (G/M**2) LIQUID WATER PATH INTEGRATED DOWN
  317. ! SET UV (G/M**2) WATER VAPOR PATH INTEGRATED DOWN
  318. WW=0.
  319. UV=0.
  320. OLDALB=0.
  321. OLDABC=0.
  322. TOTABS=0.
  323. ! CONTRIBUTIONS DUE TO CLEAR AIR AND CLOUD
  324. DSCA=0.
  325. DABS=0.
  326. DSCLD=0.
  327. !
  328. ! CONTRIBUTION DUE TO AEROSOLS (FOR CHEMISTRY)
  329. DABSA=0.
  330. !
  331. DO 200 K=kts,kte
  332. WW=WW+XLWP(K)
  333. UV=UV+XWVP(K)
  334. ! WGM IS WW/COS(THETA) (G/M**2)
  335. ! UGCM IS UV/COS(THETA) (G/CM**2)
  336. WGM=WW/XMU
  337. UGCM=UV*0.0001/XMU
  338. !
  339. OLDABS=TOTABS
  340. ! WATER VAPOR ABSORPTION AS IN LACIS AND HANSEN (1974)
  341. TOTABS=2.9*UGCM/((1.+141.5*UGCM)**0.635+5.925*UGCM)
  342. ! APPROXIMATE RAYLEIGH + AEROSOL SCATTERING
  343. ! XSCA=1.E-5*XATP(K)/XMU
  344. ! XSCA=(1.E-5*XATP(K)+aer_dry1(K)*bext340+aer_water1(K)*bexth2o)/XMU
  345. beta=0.4*(1.0-XMU)+0.1
  346. ! CSSCA - CLEAR-SKY SCATTERING SET FROM NAMELIST SWRAD_SCAT
  347. XSCA=(cssca*XATP(K)+beta*aer_dry1(K)*bext340*DZ(K) &
  348. +beta*aer_water1(K)*bexth2o*DZ(K))/XMU
  349. ! LAYER VAPOR ABSORPTION DONE FIRST
  350. XABS=(TOTABS-OLDABS)*(SDOWN(1)-DSCLD-DSCA-DABSA)/SDOWN(K)
  351. !rs AEROSOL ABSORB (would be elemental carbon). So far XABSA = 0.
  352. XABSA=0.
  353. IF(XABS.LT.0.)XABS=0.
  354. !
  355. ALW=ALOG10(WGM+1.)
  356. IF(ALW.GT.3.999)ALW=3.999
  357. !
  358. DO II=1,3
  359. IF(XMU.GT.XMUVAL(II))THEN
  360. IIL=II
  361. IU=II+1
  362. XI=(XMU-XMUVAL(II))/(XMUVAL(II+1)-XMUVAL(II))+FLOAT(IIL)
  363. ENDIF
  364. ENDDO
  365. !
  366. JJL=IFIX(ALW)+1
  367. JU=JJL+1
  368. YJ=ALW+1.
  369. ! CLOUD ALBEDO
  370. ALBA=(ALBTAB(IU,JU)*(XI-IIL)*(YJ-JJL) &
  371. +ALBTAB(IIL,JU)*(IU-XI)*(YJ-JJL) &
  372. +ALBTAB(IU,JJL)*(XI-IIL)*(JU-YJ) &
  373. +ALBTAB(IIL,JJL)*(IU-XI)*(JU-YJ)) &
  374. /((IU-IIL)*(JU-JJL))
  375. ! CLOUD ABSORPTION
  376. ABSC=(ABSTAB(IU,JU)*(XI-IIL)*(YJ-JJL) &
  377. +ABSTAB(IIL,JU)*(IU-XI)*(YJ-JJL) &
  378. +ABSTAB(IU,JJL)*(XI-IIL)*(JU-YJ) &
  379. +ABSTAB(IIL,JJL)*(IU-XI)*(JU-YJ)) &
  380. /((IU-IIL)*(JU-JJL))
  381. ! LAYER ALBEDO AND ABSORPTION
  382. XALB=(ALBA-OLDALB)*(SDOWN(1)-DSCA-DABS)/SDOWN(K)
  383. XABSC=(ABSC-OLDABC)*(SDOWN(1)-DSCA-DABS)/SDOWN(K)
  384. IF(XALB.LT.0.)XALB=0.
  385. IF(XABSC.LT.0.)XABSC=0.
  386. DSCLD=DSCLD+(XALB+XABSC)*SDOWN(K)*0.01
  387. DSCA=DSCA+XSCA*SDOWN(K)
  388. DABS=DABS+XABS*SDOWN(K)
  389. DABSA=DABSA+XABSA*SDOWN(K)
  390. OLDALB=ALBA
  391. OLDABC=ABSC
  392. ! LAYER TRANSMISSIVITY
  393. TRANS0=100.-XALB-XABSC-XABS*100.-XSCA*100.
  394. IF(TRANS0.LT.1.)THEN
  395. FF=99./(XALB+XABSC+XABS*100.+XSCA*100.)
  396. XALB=XALB*FF
  397. XABSC=XABSC*FF
  398. XABS=XABS*FF
  399. XSCA=XSCA*FF
  400. TRANS0=1.
  401. ENDIF
  402. SDOWN(K+1)=AMAX1(1.E-9,SDOWN(K)*TRANS0*0.01)
  403. TTEN(K)=SDOWN(K)*(XABSC+XABS*100.+XABSA*100.)*0.01/( &
  404. RO(K)*CP*DZ(K))
  405. 200 CONTINUE
  406. !
  407. GSW=(1.-ALBEDO)*SDOWN(kte+1)
  408. IF (PRESENT(slope_rad)) THEN
  409. ! Slope-dependent solar radiation part
  410. if (slope_rad.eq.1) then
  411. ! Parameterize diffuse fraction of global solar radiation as a function of the ratio between TOA radiation and surface global radiation
  412. diffuse_frac = min(1.,1/(max(0.1,2.1-2.8*log(log(SDOWN(kts)/max(SDOWN(kte+1),1.e-3))))))
  413. if ((slope.eq.0).or.(diffuse_frac.eq.1).or.(csza.lt.1.e-2)) then ! no topographic effects when all radiation is diffuse or the sun is too close to the horizon
  414. corr_fac = 1
  415. goto 140
  416. endif
  417. ! cosine of zenith angle over sloping topography
  418. csza_slp = ((SIN(XXLAT)*COS(HRANG))* &
  419. (-cos(slp_azi)*sin(slope))-SIN(HRANG)*(sin(slp_azi)*sin(slope))+ &
  420. (COS(XXLAT)*COS(HRANG))*cos(slope))* &
  421. COS(DECLIN)+(COS(XXLAT)*(cos(slp_azi)*sin(slope))+ &
  422. SIN(XXLAT)*cos(slope))*SIN(DECLIN)
  423. IF(csza_slp.LE.1.E-4) csza_slp = 0
  424. ! Topographic shading
  425. if (shadow.eq.1) csza_slp = 0
  426. ! Correction factor for sloping topography; the diffuse fraction of solar radiation is assumed to be unaffected by the slope
  427. corr_fac = diffuse_frac + (1-diffuse_frac)*csza_slp/csza
  428. 140 continue
  429. GSW=(1.-ALBEDO)*SDOWN(kte+1)*corr_fac
  430. endif
  431. ENDIF
  432. 7 CONTINUE
  433. !
  434. END SUBROUTINE SWPARA
  435. !====================================================================
  436. SUBROUTINE swinit(swrad_scat, &
  437. allowed_to_read , &
  438. ids, ide, jds, jde, kds, kde, &
  439. ims, ime, jms, jme, kms, kme, &
  440. its, ite, jts, jte, kts, kte )
  441. !--------------------------------------------------------------------
  442. IMPLICIT NONE
  443. !--------------------------------------------------------------------
  444. LOGICAL , INTENT(IN) :: allowed_to_read
  445. INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
  446. ims, ime, jms, jme, kms, kme, &
  447. its, ite, jts, jte, kts, kte
  448. REAL , INTENT(IN) :: swrad_scat
  449. ! CSSCA - CLEAR-SKY SCATTERING SET FROM NAMELIST SWRAD_SCAT
  450. cssca = swrad_scat * 1.e-5
  451. END SUBROUTINE swinit
  452. END MODULE module_ra_sw