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 &
22 !------------------------------------------------------------------
24 !------------------------------------------------------------------
25 INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
26 ims,ime, jms,jme, kms,kme, &
27 its,ite, jts,jte, kts,kte
29 LOGICAL, INTENT(IN ) :: warm_rain
30 INTEGER, INTENT(IN ) :: icloud
32 REAL, INTENT(IN ) :: RADFRQ,DEGRAD, &
35 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
41 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), OPTIONAL , &
42 INTENT(IN ) :: pm2_5_dry, &
47 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
48 INTENT(INOUT) :: RTHRATEN
50 REAL, DIMENSION( ims:ime, jms:jme ), &
51 INTENT(IN ) :: XLAT, &
55 REAL, DIMENSION( ims:ime, jms:jme ), &
58 REAL, INTENT(IN ) :: GMT,R,CP,G,dt
60 INTEGER, INTENT(IN ) :: JULDAY
67 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
77 LOGICAL, OPTIONAL, INTENT(IN ) :: F_QV,F_QC,F_QR,F_QI,F_QS,F_QG
81 REAL, DIMENSION( kts:kte ) :: &
94 REAL:: XLAT0,XLONG0,ALB0,GSW0
98 LOGICAL :: predicate , do_topo_shading
99 real :: aer_dry1(kts:kte),aer_water1(kts:kte)
101 !------------------------------------------------------------------
122 RHO01D(K)=rho_phy(I,NK,J)
126 IF( PRESENT(pm2_5_dry) .AND. PRESENT(pm2_5_water) )THEN
129 aer_dry1(k) = pm2_5_dry(i,nk,j)
130 aer_water1(k) = pm2_5_water(i,nk,j)
139 IF (PRESENT(F_QV) .AND. PRESENT(QV3D)) THEN
144 QV1D(K)=max(0.,QV1D(K))
149 IF (PRESENT(F_QC) .AND. PRESENT(QC3D)) THEN
154 QC1D(K)=max(0.,QC1D(K))
159 IF (PRESENT(F_QR) .AND. PRESENT(QR3D)) THEN
164 QR1D(K)=max(0.,QR1D(K))
170 IF ( PRESENT( F_QI ) ) THEN
176 IF ( predicate .AND. PRESENT( QI3D ) ) THEN
180 QI1D(K)=max(0.,QI1D(K))
183 IF (.not. warm_rain) THEN
185 IF(T1D(K) .lt. 273.15) THEN
195 IF (PRESENT(F_QS) .AND. PRESENT(QS3D)) THEN
200 QS1D(K)=max(0.,QS1D(K))
205 IF (PRESENT(F_QG) .AND. PRESENT(QG3D)) THEN
210 QG1D(K)=max(0.,QG1D(K))
218 ! slope code removed - factor now done in surface driver
219 CALL SWPARA(TTEN1D,GSW0,XLAT0,XLONG0,ALB0, &
220 T1D,QV1D,QC1D,QR1D,QI1D,QS1D,QG1D,P1D, &
221 XTIME,GMT,RHO01D,DZ, &
222 R,CP,G,DECLIN,SOLCON, &
223 RADFRQ,ICLOUD,DEGRAD,aer_dry1,aer_water1, &
228 RTHRATEN(I,K,J)=RTHRATEN(I,K,J)+TTEN1D(NK)/pi3D(I,K,J)
236 !------------------------------------------------------------------
237 SUBROUTINE SWPARA(TTEN,GSW,XLAT,XLONG,ALBEDO, &
238 T,QV,QC,QR,QI,QS,QG,P, &
239 XTIME, GMT, RHO0, DZ, &
240 R,CP,G,DECLIN,SOLCON, &
241 RADFRQ,ICLOUD,DEGRAD,aer_dry1,aer_water1, &
242 kts,kte,slope_rad,shadow,slp_azi,slope )
243 !------------------------------------------------------------------
244 ! TO CALCULATE SHORT-WAVE ABSORPTION AND SCATTERING IN CLEAR
245 ! AIR AND REFLECTION AND ABSORPTION IN CLOUD LAYERS (STEPHENS,
248 ! REDUCE EFFECTS OF ICE CLOUDS AND PRECIP ON LIQUID WATER PATH
249 ! ADD EFFECT OF GRAUPEL
250 !------------------------------------------------------------------
254 INTEGER, INTENT(IN ) :: kts,kte
256 REAL, DIMENSION( kts:kte ), INTENT(IN ) :: &
268 REAL, DIMENSION( kts:kte ), INTENT(INOUT):: TTEN
270 REAL, INTENT(IN ) :: XTIME,GMT,R,CP,G,DECLIN, &
271 SOLCON,XLAT,XLONG,ALBEDO, &
274 INTEGER, INTENT(IN) :: icloud
275 REAL, INTENT(INOUT) :: GSW
276 ! For slope-dependent radiation
278 INTEGER, OPTIONAL, INTENT(IN) :: slope_rad,shadow
279 REAL, OPTIONAL, INTENT(IN) :: slp_azi,slope
283 REAL, DIMENSION( kts:kte+1 ) :: SDOWN
285 REAL, DIMENSION( kts:kte ) :: XLWP, &
288 aer_dry1,aer_water1, &
291 REAL, DIMENSION( 4, 5 ) :: ALBTAB, &
294 REAL, DIMENSION( 4 ) :: XMUVAL
298 !------------------------------------------------------------------
300 DATA ALBTAB/0.,0.,0.,0., &
306 DATA ABSTAB/0.,0.,0.,0., &
312 DATA XMUVAL/0.,0.2,0.5,1.0/
314 REAL :: bext340, absc, alba, alw, csza,dabsa,dsca,dabs
315 REAL :: bexth2o, dscld, hrang,ff,oldalb,oldabs,oldabc
316 REAL :: soltop, totabs, tloctm, ugcm, uv,xabs,xabsa,wv
317 REAL :: wgm, xalb, xi, xsca, xt24,xmu,xabsc,trans0,yj
319 INTEGER :: iil,ii,jjl,ju,k,iu
321 ! For slope-dependent radiation
323 REAL :: diffuse_frac, corr_fac, csza_slp
330 XT24=MOD(XTIME+RADFRQ*0.5,1440.)
331 TLOCTM=GMT+XT24/60.+XLONG/15.
332 HRANG=15.*(TLOCTM-12.)*DEGRAD
334 CSZA=SIN(XXLAT)*SIN(DECLIN)+COS(XXLAT)*COS(DECLIN)*COS(HRANG)
337 IF(CSZA.LE.1.E-9)GOTO 7
341 ! P in the unit of 10mb
343 XWVP(K)=RO(K)*QV(K)*DZ(K)*1000.
349 ! REDUCE WEIGHT OF LIQUID AND ICE IN SHORT-WAVE SCHEME
350 ! ADD GRAUPEL EFFECT (ASSUMED SAME AS RAIN)
358 XLWP(K)=RO(K)*1000.*DZ(K)*(QC(K)+0.1*QI(K)+0.05* &
359 QR(K)+0.02*QS(K)+0.05*QG(K))
365 ! SET WW (G/M**2) LIQUID WATER PATH INTEGRATED DOWN
366 ! SET UV (G/M**2) WATER VAPOR PATH INTEGRATED DOWN
372 ! CONTRIBUTIONS DUE TO CLEAR AIR AND CLOUD
377 ! CONTRIBUTION DUE TO AEROSOLS (FOR CHEMISTRY)
383 ! WGM IS WW/COS(THETA) (G/M**2)
384 ! UGCM IS UV/COS(THETA) (G/CM**2)
389 ! WATER VAPOR ABSORPTION AS IN LACIS AND HANSEN (1974)
390 TOTABS=2.9*UGCM/((1.+141.5*UGCM)**0.635+5.925*UGCM)
391 ! APPROXIMATE RAYLEIGH + AEROSOL SCATTERING
392 ! XSCA=1.E-5*XATP(K)/XMU
393 ! XSCA=(1.E-5*XATP(K)+aer_dry1(K)*bext340+aer_water1(K)*bexth2o)/XMU
394 beta=0.4*(1.0-XMU)+0.1
395 ! CSSCA - CLEAR-SKY SCATTERING SET FROM NAMELIST SWRAD_SCAT
396 XSCA=(cssca*XATP(K)+beta*aer_dry1(K)*bext340*DZ(K) &
397 +beta*aer_water1(K)*bexth2o*DZ(K))/XMU
399 ! LAYER VAPOR ABSORPTION DONE FIRST
400 XABS=(TOTABS-OLDABS)*(SDOWN(1)-DSCLD-DSCA-DABSA)/SDOWN(K)
401 !rs AEROSOL ABSORB (would be elemental carbon). So far XABSA = 0.
403 IF(XABS.LT.0.)XABS=0.
406 IF(ALW.GT.3.999)ALW=3.999
409 IF(XMU.GT.XMUVAL(II))THEN
412 XI=(XMU-XMUVAL(II))/(XMUVAL(II+1)-XMUVAL(II))+FLOAT(IIL)
420 ALBA=(ALBTAB(IU,JU)*(XI-IIL)*(YJ-JJL) &
421 +ALBTAB(IIL,JU)*(IU-XI)*(YJ-JJL) &
422 +ALBTAB(IU,JJL)*(XI-IIL)*(JU-YJ) &
423 +ALBTAB(IIL,JJL)*(IU-XI)*(JU-YJ)) &
426 ABSC=(ABSTAB(IU,JU)*(XI-IIL)*(YJ-JJL) &
427 +ABSTAB(IIL,JU)*(IU-XI)*(YJ-JJL) &
428 +ABSTAB(IU,JJL)*(XI-IIL)*(JU-YJ) &
429 +ABSTAB(IIL,JJL)*(IU-XI)*(JU-YJ)) &
431 ! LAYER ALBEDO AND ABSORPTION
432 XALB=(ALBA-OLDALB)*(SDOWN(1)-DSCA-DABS)/SDOWN(K)
433 XABSC=(ABSC-OLDABC)*(SDOWN(1)-DSCA-DABS)/SDOWN(K)
434 IF(XALB.LT.0.)XALB=0.
435 IF(XABSC.LT.0.)XABSC=0.
436 DSCLD=DSCLD+(XALB+XABSC)*SDOWN(K)*0.01
437 DSCA=DSCA+XSCA*SDOWN(K)
438 DABS=DABS+XABS*SDOWN(K)
439 DABSA=DABSA+XABSA*SDOWN(K)
442 ! LAYER TRANSMISSIVITY
443 TRANS0=100.-XALB-XABSC-XABS*100.-XSCA*100.
445 FF=99./(XALB+XABSC+XABS*100.+XSCA*100.)
452 SDOWN(K+1)=AMAX1(1.E-9,SDOWN(K)*TRANS0*0.01)
453 TTEN(K)=SDOWN(K)*(XABSC+XABS*100.+XABSA*100.)*0.01/( &
457 GSW=(1.-ALBEDO)*SDOWN(kte+1)
459 IF (PRESENT(slope_rad)) THEN
460 ! Slope-dependent solar radiation part
462 if (slope_rad.eq.1) then
464 ! Parameterize diffuse fraction of global solar radiation as a function of the ratio between TOA radiation and surface global radiation
466 diffuse_frac = min(1.,1/(max(0.1,2.1-2.8*log(log(SDOWN(kts)/max(SDOWN(kte+1),1.e-3))))))
467 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
472 ! cosine of zenith angle over sloping topography
474 csza_slp = ((SIN(XXLAT)*COS(HRANG))* &
475 (-cos(slp_azi)*sin(slope))-SIN(HRANG)*(sin(slp_azi)*sin(slope))+ &
476 (COS(XXLAT)*COS(HRANG))*cos(slope))* &
477 COS(DECLIN)+(COS(XXLAT)*(cos(slp_azi)*sin(slope))+ &
478 SIN(XXLAT)*cos(slope))*SIN(DECLIN)
479 IF(csza_slp.LE.1.E-4) csza_slp = 0
481 ! Topographic shading
483 if (shadow.eq.1) csza_slp = 0
485 ! Correction factor for sloping topography; the diffuse fraction of solar radiation is assumed to be unaffected by the slope
486 corr_fac = diffuse_frac + (1-diffuse_frac)*csza_slp/csza
490 GSW=(1.-ALBEDO)*SDOWN(kte+1)*corr_fac
497 END SUBROUTINE SWPARA
499 !====================================================================
500 SUBROUTINE swinit(swrad_scat, &
502 ids, ide, jds, jde, kds, kde, &
503 ims, ime, jms, jme, kms, kme, &
504 its, ite, jts, jte, kts, kte )
505 !--------------------------------------------------------------------
507 !--------------------------------------------------------------------
508 LOGICAL , INTENT(IN) :: allowed_to_read
509 INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
510 ims, ime, jms, jme, kms, kme, &
511 its, ite, jts, jte, kts, kte
513 REAL , INTENT(IN) :: swrad_scat
515 ! CSSCA - CLEAR-SKY SCATTERING SET FROM NAMELIST SWRAD_SCAT
516 cssca = swrad_scat * 1.e-5
518 END SUBROUTINE swinit
520 END MODULE module_ra_sw