1 !WRF:MODEL_LAYER:PHYSICS
5 REAL,PRIVATE,SAVE :: CSSCA
9 !------------------------------------------------------------------
10 SUBROUTINE SWRAD(dt,RTHRATEN,GSW,XLAT,XLONG,ALBEDO, &
11 rho_phy,T3D,QV3D,QC3D,QR3D, &
12 QI3D,QS3D,QG3D,P3D,pi3D,dz8w,GMT, &
14 XTIME,DECLIN,SOLCON, &
15 F_QV,F_QC,F_QR,F_QI,F_QS,F_QG, &
16 pm2_5_dry,pm2_5_water,pm2_5_dry_ec, &
17 RADFRQ,ICLOUD,DEGRAD,warm_rain, &
18 ids,ide, jds,jde, kds,kde, &
19 ims,ime, jms,jme, kms,kme, &
20 its,ite, jts,jte, kts,kte, &
21 slope_rad,topo_shading,ht, & ! Optional
22 dx,dy,sina,cosa,shadowmask, & ! Optional
23 cosz_urb2d,omg_urb2d & !Optional urban
25 !------------------------------------------------------------------
27 !------------------------------------------------------------------
28 INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
29 ims,ime, jms,jme, kms,kme, &
30 its,ite, jts,jte, kts,kte
32 LOGICAL, INTENT(IN ) :: warm_rain
33 INTEGER, INTENT(IN ) :: icloud
35 REAL, INTENT(IN ) :: RADFRQ,DEGRAD, &
38 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
44 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), OPTIONAL , &
45 INTENT(IN ) :: pm2_5_dry, &
50 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
51 INTENT(INOUT) :: RTHRATEN
53 REAL, DIMENSION( ims:ime, jms:jme ), &
54 INTENT(IN ) :: XLAT, &
58 REAL, DIMENSION( ims:ime, jms:jme ), &
61 REAL, INTENT(IN ) :: GMT,R,CP,G,dt
63 INTEGER, INTENT(IN ) :: JULDAY
70 REAL, OPTIONAL, INTENT(IN) :: dx,dy
72 REAL, DIMENSION( ims:ime, jms:jme ), &
73 OPTIONAL, INTENT(IN) :: sina,cosa,ht
74 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
84 INTEGER, OPTIONAL, INTENT(IN) :: slope_rad,topo_shading
86 INTEGER, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(IN) :: shadowmask
88 LOGICAL, OPTIONAL, INTENT(IN ) :: F_QV,F_QC,F_QR,F_QI,F_QS,F_QG
90 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme), INTENT(OUT) :: COSZ_URB2D, OMG_URB2D !Optional urban
93 REAL, DIMENSION( kts:kte ) :: &
106 REAL:: XLAT0,XLONG0,ALB0,GSW0
108 REAL :: COSZ, OMG !urban
111 LOGICAL :: predicate , do_topo_shading
112 real :: aer_dry1(kts:kte),aer_water1(kts:kte)
114 real :: sinalpha,cosalpha,hx,hy,slope,slp_azi,pi
117 !------------------------------------------------------------------
140 RHO01D(K)=rho_phy(I,NK,J)
144 IF( PRESENT(pm2_5_dry) .AND. PRESENT(pm2_5_water) )THEN
147 aer_dry1(k) = pm2_5_dry(i,nk,j)
148 aer_water1(k) = pm2_5_water(i,nk,j)
157 IF (PRESENT(F_QV) .AND. PRESENT(QV3D)) THEN
162 QV1D(K)=max(0.,QV1D(K))
167 IF (PRESENT(F_QC) .AND. PRESENT(QC3D)) THEN
172 QC1D(K)=max(0.,QC1D(K))
177 IF (PRESENT(F_QR) .AND. PRESENT(QR3D)) THEN
182 QR1D(K)=max(0.,QR1D(K))
188 IF ( PRESENT( F_QI ) ) THEN
194 IF ( predicate .AND. PRESENT( QI3D ) ) THEN
198 QI1D(K)=max(0.,QI1D(K))
201 IF (.not. warm_rain) THEN
203 IF(T1D(K) .lt. 273.15) THEN
213 IF (PRESENT(F_QS) .AND. PRESENT(QS3D)) THEN
218 QS1D(K)=max(0.,QS1D(K))
223 IF (PRESENT(F_QG) .AND. PRESENT(QG3D)) THEN
228 QG1D(K)=max(0.,QG1D(K))
237 IF (PRESENT(topo_shading)) THEN
238 IF (topo_shading.eq.1) THEN
239 do_topo_shading = .TRUE.
241 do_topo_shading = .FALSE.
244 do_topo_shading = .FALSE.
248 IF (do_topo_shading) THEN
249 IF(PRESENT(slope_rad) .AND. PRESENT(shadowmask))THEN
250 ! Computations for slope-dependent radiation
255 ! Compute slope and slope azimuth of local grid point
257 if ((i.ge.ids+1).and.(i.le.ide-2)) then
258 hx = (ht(i+1,j)-ht(i-1,j))/(2.*dx)
259 else if (i.eq.ids) then
260 hx = (ht(i+1,j)-ht(i,j))/dx
261 else if (i.eq.ide-1) then
262 hx = (ht(i,j)-ht(i-1,j))/dx
264 if ((j.ge.jds+1).and.(j.le.jde-2)) then
265 hy = (ht(i,j+1)-ht(i,j-1))/(2.*dy)
266 else if (j.eq.jds) then
267 hy = (ht(i,j+1)-ht(i,j))/dy
268 else if (j.eq.jde-1) then
269 hy = (ht(i,j)-ht(i,j-1))/dy
272 slope = atan((hx**2+hy**2)**.5)
273 if (slope.lt.1.e-4) then
277 slp_azi = atan2(hx,hy)+pi
278 ! Rotate slope azimuth to lat-lon grid
279 if (cosalpha.ge.0) then
280 slp_azi = slp_azi - asin(sinalpha)
282 slp_azi = slp_azi - (pi - asin(sinalpha))
286 shadow = shadowmask(i,j)
289 CALL SWPARA(TTEN1D,GSW0,XLAT0,XLONG0,ALB0, &
290 T1D,QV1D,QC1D,QR1D,QI1D,QS1D,QG1D,P1D, &
291 XTIME,GMT,RHO01D,DZ, &
292 R,CP,G,DECLIN,SOLCON, &
294 RADFRQ,ICLOUD,DEGRAD,aer_dry1,aer_water1, &
295 kts,kte,slope_rad,shadow,slp_azi,slope )
297 CALL SWPARA(TTEN1D,GSW0,XLAT0,XLONG0,ALB0, &
298 T1D,QV1D,QC1D,QR1D,QI1D,QS1D,QG1D,P1D, &
299 XTIME,GMT,RHO01D,DZ, &
300 R,CP,G,DECLIN,SOLCON, &
302 RADFRQ,ICLOUD,DEGRAD,aer_dry1,aer_water1, &
306 IF (PRESENT(COSZ_URB2D) .AND. PRESENT(OMG_URB2D)) THEN
307 COSZ_URB2D(I,J)=COSZ !urban
308 OMG_URB2D(I,J)=OMG !urban
314 RTHRATEN(I,K,J)=RTHRATEN(I,K,J)+TTEN1D(NK)/pi3D(I,K,J)
322 !------------------------------------------------------------------
323 SUBROUTINE SWPARA(TTEN,GSW,XLAT,XLONG,ALBEDO, &
324 T,QV,QC,QR,QI,QS,QG,P, &
325 XTIME, GMT, RHO0, DZ, &
326 R,CP,G,DECLIN,SOLCON, &
328 RADFRQ,ICLOUD,DEGRAD,aer_dry1,aer_water1, &
329 kts,kte,slope_rad,shadow,slp_azi,slope )
330 !------------------------------------------------------------------
331 ! TO CALCULATE SHORT-WAVE ABSORPTION AND SCATTERING IN CLEAR
332 ! AIR AND REFLECTION AND ABSORPTION IN CLOUD LAYERS (STEPHENS,
335 ! REDUCE EFFECTS OF ICE CLOUDS AND PRECIP ON LIQUID WATER PATH
336 ! ADD EFFECT OF GRAUPEL
337 !------------------------------------------------------------------
341 INTEGER, INTENT(IN ) :: kts,kte
343 REAL, DIMENSION( kts:kte ), INTENT(IN ) :: &
355 REAL, DIMENSION( kts:kte ), INTENT(INOUT):: TTEN
357 REAL, INTENT(IN ) :: XTIME,GMT,R,CP,G,DECLIN, &
358 SOLCON,XLAT,XLONG,ALBEDO, &
361 INTEGER, INTENT(IN) :: icloud
362 REAL, INTENT(INOUT) :: GSW
363 ! For slope-dependent radiation
365 INTEGER, OPTIONAL, INTENT(IN) :: slope_rad,shadow
366 REAL, OPTIONAL, INTENT(IN) :: slp_azi,slope
370 REAL, DIMENSION( kts:kte+1 ) :: SDOWN
372 REAL, DIMENSION( kts:kte ) :: XLWP, &
375 aer_dry1,aer_water1, &
378 REAL, DIMENSION( 4, 5 ) :: ALBTAB, &
381 REAL, DIMENSION( 4 ) :: XMUVAL
383 REAL, INTENT(OUT) :: COSZ !urban
384 REAL, INTENT(OUT) :: OMG !urban
388 !------------------------------------------------------------------
390 DATA ALBTAB/0.,0.,0.,0., &
396 DATA ABSTAB/0.,0.,0.,0., &
402 DATA XMUVAL/0.,0.2,0.5,1.0/
404 REAL :: bext340, absc, alba, alw, csza,dabsa,dsca,dabs
405 REAL :: bexth2o, dscld, hrang,ff,oldalb,oldabs,oldabc
406 REAL :: soltop, totabs, tloctm, ugcm, uv,xabs,xabsa,wv
407 REAL :: wgm, xalb, xi, xsca, xt24,xmu,xabsc,trans0,yj
409 INTEGER :: iil,ii,jjl,ju,k,iu
411 ! For slope-dependent radiation
413 REAL :: diffuse_frac, corr_fac, csza_slp
420 XT24=MOD(XTIME+RADFRQ*0.5,1440.)
421 TLOCTM=GMT+XT24/60.+XLONG/15.
422 HRANG=15.*(TLOCTM-12.)*DEGRAD
424 CSZA=SIN(XXLAT)*SIN(DECLIN)+COS(XXLAT)*COS(DECLIN)*COS(HRANG)
430 IF(CSZA.LE.1.E-9)GOTO 7
434 ! P in the unit of 10mb
436 XWVP(K)=RO(K)*QV(K)*DZ(K)*1000.
442 ! REDUCE WEIGHT OF LIQUID AND ICE IN SHORT-WAVE SCHEME
443 ! ADD GRAUPEL EFFECT (ASSUMED SAME AS RAIN)
451 XLWP(K)=RO(K)*1000.*DZ(K)*(QC(K)+0.1*QI(K)+0.05* &
452 QR(K)+0.02*QS(K)+0.05*QG(K))
458 ! SET WW (G/M**2) LIQUID WATER PATH INTEGRATED DOWN
459 ! SET UV (G/M**2) WATER VAPOR PATH INTEGRATED DOWN
465 ! CONTRIBUTIONS DUE TO CLEAR AIR AND CLOUD
470 ! CONTRIBUTION DUE TO AEROSOLS (FOR CHEMISTRY)
476 ! WGM IS WW/COS(THETA) (G/M**2)
477 ! UGCM IS UV/COS(THETA) (G/CM**2)
482 ! WATER VAPOR ABSORPTION AS IN LACIS AND HANSEN (1974)
483 TOTABS=2.9*UGCM/((1.+141.5*UGCM)**0.635+5.925*UGCM)
484 ! APPROXIMATE RAYLEIGH + AEROSOL SCATTERING
485 ! XSCA=1.E-5*XATP(K)/XMU
486 ! XSCA=(1.E-5*XATP(K)+aer_dry1(K)*bext340+aer_water1(K)*bexth2o)/XMU
487 beta=0.4*(1.0-XMU)+0.1
488 ! CSSCA - CLEAR-SKY SCATTERING SET FROM NAMELIST SWRAD_SCAT
489 XSCA=(cssca*XATP(K)+beta*aer_dry1(K)*bext340*DZ(K) &
490 +beta*aer_water1(K)*bexth2o*DZ(K))/XMU
492 ! LAYER VAPOR ABSORPTION DONE FIRST
493 XABS=(TOTABS-OLDABS)*(SDOWN(1)-DSCLD-DSCA-DABSA)/SDOWN(K)
494 !rs AEROSOL ABSORB (would be elemental carbon). So far XABSA = 0.
496 IF(XABS.LT.0.)XABS=0.
499 IF(ALW.GT.3.999)ALW=3.999
502 IF(XMU.GT.XMUVAL(II))THEN
505 XI=(XMU-XMUVAL(II))/(XMUVAL(II+1)-XMUVAL(II))+FLOAT(IIL)
513 ALBA=(ALBTAB(IU,JU)*(XI-IIL)*(YJ-JJL) &
514 +ALBTAB(IIL,JU)*(IU-XI)*(YJ-JJL) &
515 +ALBTAB(IU,JJL)*(XI-IIL)*(JU-YJ) &
516 +ALBTAB(IIL,JJL)*(IU-XI)*(JU-YJ)) &
519 ABSC=(ABSTAB(IU,JU)*(XI-IIL)*(YJ-JJL) &
520 +ABSTAB(IIL,JU)*(IU-XI)*(YJ-JJL) &
521 +ABSTAB(IU,JJL)*(XI-IIL)*(JU-YJ) &
522 +ABSTAB(IIL,JJL)*(IU-XI)*(JU-YJ)) &
524 ! LAYER ALBEDO AND ABSORPTION
525 XALB=(ALBA-OLDALB)*(SDOWN(1)-DSCA-DABS)/SDOWN(K)
526 XABSC=(ABSC-OLDABC)*(SDOWN(1)-DSCA-DABS)/SDOWN(K)
527 IF(XALB.LT.0.)XALB=0.
528 IF(XABSC.LT.0.)XABSC=0.
529 DSCLD=DSCLD+(XALB+XABSC)*SDOWN(K)*0.01
530 DSCA=DSCA+XSCA*SDOWN(K)
531 DABS=DABS+XABS*SDOWN(K)
532 DABSA=DABSA+XABSA*SDOWN(K)
535 ! LAYER TRANSMISSIVITY
536 TRANS0=100.-XALB-XABSC-XABS*100.-XSCA*100.
538 FF=99./(XALB+XABSC+XABS*100.+XSCA*100.)
545 SDOWN(K+1)=AMAX1(1.E-9,SDOWN(K)*TRANS0*0.01)
546 TTEN(K)=SDOWN(K)*(XABSC+XABS*100.+XABSA*100.)*0.01/( &
550 GSW=(1.-ALBEDO)*SDOWN(kte+1)
552 IF (PRESENT(slope_rad)) THEN
553 ! Slope-dependent solar radiation part
555 if (slope_rad.eq.1) then
557 ! Parameterize diffuse fraction of global solar radiation as a function of the ratio between TOA radiation and surface global radiation
559 diffuse_frac = min(1.,1/(max(0.1,2.1-2.8*log(log(SDOWN(kts)/max(SDOWN(kte+1),1.e-3))))))
560 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
565 ! cosine of zenith angle over sloping topography
567 csza_slp = ((SIN(XXLAT)*COS(HRANG))* &
568 (-cos(slp_azi)*sin(slope))-SIN(HRANG)*(sin(slp_azi)*sin(slope))+ &
569 (COS(XXLAT)*COS(HRANG))*cos(slope))* &
570 COS(DECLIN)+(COS(XXLAT)*(cos(slp_azi)*sin(slope))+ &
571 SIN(XXLAT)*cos(slope))*SIN(DECLIN)
572 IF(csza_slp.LE.1.E-4) csza_slp = 0
574 ! Topographic shading
576 if (shadow.eq.1) csza_slp = 0
578 ! Correction factor for sloping topography; the diffuse fraction of solar radiation is assumed to be unaffected by the slope
579 corr_fac = diffuse_frac + (1-diffuse_frac)*csza_slp/csza
583 GSW=(1.-ALBEDO)*SDOWN(kte+1)*corr_fac
590 END SUBROUTINE SWPARA
592 !====================================================================
593 SUBROUTINE swinit(swrad_scat, &
595 ids, ide, jds, jde, kds, kde, &
596 ims, ime, jms, jme, kms, kme, &
597 its, ite, jts, jte, kts, kte )
598 !--------------------------------------------------------------------
600 !--------------------------------------------------------------------
601 LOGICAL , INTENT(IN) :: allowed_to_read
602 INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
603 ims, ime, jms, jme, kms, kme, &
604 its, ite, jts, jte, kts, kte
606 REAL , INTENT(IN) :: swrad_scat
608 ! CSSCA - CLEAR-SKY SCATTERING SET FROM NAMELIST SWRAD_SCAT
609 cssca = swrad_scat * 1.e-5
611 END SUBROUTINE swinit
613 END MODULE module_ra_sw