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

/wrfv2_fire/phys/module_radiation_driver.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 2514 lines | 1658 code | 313 blank | 543 comment | 69 complexity | 9d966cb238d9a0fd94321cfd8e985733 MD5 | raw file
Possible License(s): AGPL-1.0
  1. !WRF:MEDIATION_LAYER:PHYSICS
  2. !
  3. MODULE module_radiation_driver
  4. CONTAINS
  5. !BOP
  6. ! !IROUTINE: radiation_driver - interface to radiation physics options
  7. ! !INTERFACE:
  8. SUBROUTINE radiation_driver ( &
  9. ACFRCV ,ACFRST ,ALBEDO &
  10. ,CFRACH ,CFRACL ,CFRACM &
  11. ,CUPPT ,CZMEAN ,DT &
  12. ,DZ8W ,EMISS ,GLW &
  13. ,GMT ,GSW ,HBOT &
  14. ,HTOP ,HBOTR ,HTOPR &
  15. ,ICLOUD &
  16. ,ITIMESTEP,JULDAY, JULIAN &
  17. ,JULYR ,LW_PHYSICS &
  18. ,NCFRCV ,NCFRST ,NPHS &
  19. ,P8W ,P ,PI &
  20. ,RADT ,RA_CALL_OFFSET &
  21. ,RHO ,RLWTOA &
  22. ,RSWTOA ,RTHRATEN &
  23. ,RTHRATENLW ,RTHRATENSW &
  24. ,SNOW ,STEPRA ,SWDOWN &
  25. ,SWDOWNC ,SW_PHYSICS &
  26. ,T8W ,T ,TAUCLDC &
  27. ,TAUCLDI ,TSK ,VEGFRA &
  28. ,WARM_RAIN ,XICE ,XLAND &
  29. ,XLAT ,XLONG ,YR &
  30. !Optional solar variables
  31. ,DECLINX ,SOLCONX ,COSZEN ,HRANG &
  32. , CEN_LAT &
  33. ,Z &
  34. ,LEVSIZ, N_OZMIXM &
  35. ,N_AEROSOLC &
  36. ,PAERLEV &
  37. ,CAM_ABS_DIM1, CAM_ABS_DIM2 &
  38. ,CAM_ABS_FREQ_S &
  39. ,XTIME &
  40. ,CURR_SECS, ADAPT_STEP_FLAG &
  41. ! indexes
  42. ,IDS,IDE, JDS,JDE, KDS,KDE &
  43. ,IMS,IME, JMS,JME, KMS,KME &
  44. ,i_start,i_end &
  45. ,j_start,j_end &
  46. ,kts, kte &
  47. ,num_tiles &
  48. ! Optional
  49. , TLWDN, TLWUP & ! goddard schemes
  50. , SLWDN, SLWUP & ! goddard schemes
  51. , TSWDN, TSWUP & ! goddard schemes
  52. , SSWDN, SSWUP & ! goddard schemes
  53. , CLDFRA &
  54. , PB &
  55. , F_ICE_PHY,F_RAIN_PHY &
  56. , QV, F_QV &
  57. , QC, F_QC &
  58. , QR, F_QR &
  59. , QI, F_QI &
  60. , QS, F_QS &
  61. , QG, F_QG &
  62. , QNDROP, F_QNDROP &
  63. ,ACSWUPT ,ACSWUPTC &
  64. ,ACSWDNT ,ACSWDNTC &
  65. ,ACSWUPB ,ACSWUPBC &
  66. ,ACSWDNB ,ACSWDNBC &
  67. ,ACLWUPT ,ACLWUPTC &
  68. ,ACLWDNT ,ACLWDNTC &
  69. ,ACLWUPB ,ACLWUPBC &
  70. ,ACLWDNB ,ACLWDNBC &
  71. ,SWUPT ,SWUPTC &
  72. ,SWDNT ,SWDNTC &
  73. ,SWUPB ,SWUPBC &
  74. ,SWDNB ,SWDNBC &
  75. ,LWUPT ,LWUPTC &
  76. ,LWDNT ,LWDNTC &
  77. ,LWUPB ,LWUPBC &
  78. ,LWDNB ,LWDNBC &
  79. ,LWCF &
  80. ,SWCF &
  81. ,OLR &
  82. ,OZMIXM, PIN &
  83. ,M_PS_1, M_PS_2, AEROSOLC_1 &
  84. ,AEROSOLC_2, M_HYBI0 &
  85. ,ABSTOT, ABSNXT, EMSTOT &
  86. ,CU_RAD_FEEDBACK &
  87. ,AER_RA_FEEDBACK &
  88. ,QC_ADJUST , QI_ADJUST &
  89. ,PM2_5_DRY, PM2_5_WATER &
  90. ,PM2_5_DRY_EC &
  91. ,TAUAER300, TAUAER400 & ! jcb
  92. ,TAUAER600, TAUAER999 & ! jcb
  93. ,GAER300, GAER400, GAER600, GAER999 & ! jcb
  94. ,WAER300, WAER400, WAER600, WAER999 & ! jcb
  95. ,TAUAERlw1, TAUAERlw2 &
  96. ,TAUAERlw3, TAUAERlw4 &
  97. ,TAUAERlw5, TAUAERlw6 &
  98. ,TAUAERlw7, TAUAERlw8 &
  99. ,TAUAERlw9, TAUAERlw10 &
  100. ,TAUAERlw11, TAUAERlw12 &
  101. ,TAUAERlw13, TAUAERlw14 &
  102. ,TAUAERlw15, TAUAERlw16 &
  103. ,progn &
  104. ,slope_rad,topo_shading &
  105. ,shadowmask,ht,dx,dy &
  106. ,SWUPFLX,SWUPFLXC,SWDNFLX,SWDNFLXC & ! Optional
  107. ,LWUPFLX,LWUPFLXC,LWDNFLX,LWDNFLXC & ! Optional
  108. ,radtacttime &
  109. ,ALSWVISDIR, ALSWVISDIF, ALSWNIRDIR, ALSWNIRDIF & !fds ssib alb comp (06/2010)
  110. ,SWVISDIR, SWVISDIF, SWNIRDIR, SWNIRDIF & !fds ssib swr comp (06/2010)
  111. ,SF_SURFACE_PHYSICS & !fds
  112. )
  113. !-------------------------------------------------------------------------
  114. ! !USES:
  115. USE module_state_description, ONLY : RRTMSCHEME, GFDLLWSCHEME &
  116. ,RRTMG_LWSCHEME, RRTMG_SWSCHEME &
  117. ,SWRADSCHEME, GSFCSWSCHEME &
  118. ,GFDLSWSCHEME, CAMLWSCHEME, CAMSWSCHEME &
  119. ,HELDSUAREZ &
  120. #ifdef HWRF
  121. ,HWRFSWSCHEME, HWRFLWSCHEME &
  122. #endif
  123. ,goddardlwscheme &
  124. ,goddardswscheme &
  125. ,FLGLWSCHEME, FLGSWSCHEME
  126. USE module_model_constants
  127. #ifndef HWRF
  128. USE module_wrf_error , ONLY : wrf_err_message
  129. #endif
  130. ! *** add new modules of schemes here
  131. USE module_ra_sw , ONLY : swrad
  132. USE module_ra_gsfcsw , ONLY : gsfcswrad
  133. USE module_ra_rrtm , ONLY : rrtmlwrad
  134. USE module_ra_rrtmg_lw , ONLY : rrtmg_lwrad
  135. USE module_ra_rrtmg_sw , ONLY : rrtmg_swrad
  136. USE module_ra_cam , ONLY : camrad
  137. USE module_ra_gfdleta , ONLY : etara
  138. #ifdef HWRF
  139. USE module_ra_hwrf
  140. #endif
  141. USE module_ra_hs , ONLY : hsrad
  142. USE module_ra_goddard , ONLY : goddardrad
  143. USE module_ra_flg , ONLY : RAD_FLG
  144. ! This driver calls subroutines for the radiation parameterizations.
  145. !
  146. ! short wave radiation choices:
  147. ! 1. swrad (19??)
  148. ! 4. rrtmg_sw - Added November 2008, MJIacono, AER, Inc.
  149. !
  150. ! long wave radiation choices:
  151. ! 1. rrtmlwrad
  152. ! 4. rrtmg_lw - Added November 2008, MJIacono, AER, Inc.
  153. !
  154. !----------------------------------------------------------------------
  155. IMPLICIT NONE
  156. !<DESCRIPTION>
  157. !
  158. ! Radiation_driver is the WRF mediation layer routine that provides the interface to
  159. ! to radiation physics packages in the WRF model layer. The radiation
  160. ! physics packages to call are chosen by setting the namelist variable
  161. ! (Rconfig entry in Registry) to the integer value assigned to the
  162. ! particular package (package entry in Registry). For example, if the
  163. ! namelist variable ra_lw_physics is set to 1, this corresponds to the
  164. ! Registry Package entry for swradscheme. Note that the Package
  165. ! names in the Registry are defined constants (frame/module_state_description.F)
  166. ! in the CASE statements in this routine.
  167. !
  168. ! Among the arguments is moist, a four-dimensional scalar array storing
  169. ! a variable number of moisture tracers, depending on the physics
  170. ! configuration for the WRF run, as determined in the namelist. The
  171. ! highest numbered index of active moisture tracers the integer argument
  172. ! n_moist (note: the number of tracers at run time is the quantity
  173. ! <tt>n_moist - PARAM_FIRST_SCALAR + 1</tt> , not n_moist. Individual tracers
  174. ! may be indexed from moist by the Registry name of the tracer prepended
  175. ! with P_; for example P_QC is the index of cloud water. An index
  176. ! represents a valid, active field only if the index is greater than
  177. ! or equal to PARAM_FIRST_SCALAR. PARAM_FIRST_SCALAR and the individual
  178. ! indices for each tracer is defined in module_state_description and
  179. ! set in <a href=set_scalar_indices_from_config.html>set_scalar_indices_from_config</a> defined in frame/module_configure.F.
  180. !
  181. ! Physics drivers in WRF 2.0 and higher, originally model-layer
  182. ! routines, have been promoted to mediation layer routines and they
  183. ! contain OpenMP threaded loops over tiles. Thus, physics drivers
  184. ! are called from single-threaded regions in the solver. The physics
  185. ! routines that are called from the physics drivers are model-layer
  186. ! routines and fully tile-callable and thread-safe.
  187. !</DESCRIPTION>
  188. !
  189. !======================================================================
  190. ! Grid structure in physics part of WRF
  191. !----------------------------------------------------------------------
  192. ! The horizontal velocities used in the physics are unstaggered
  193. ! relative to temperature/moisture variables. All predicted
  194. ! variables are carried at half levels except w, which is at full
  195. ! levels. Some arrays with names (*8w) are at w (full) levels.
  196. !
  197. !----------------------------------------------------------------------
  198. ! In WRF, kms (smallest number) is the bottom level and kme (largest
  199. ! number) is the top level. In your scheme, if 1 is at the top level,
  200. ! then you have to reverse the order in the k direction.
  201. !
  202. ! kme - half level (no data at this level)
  203. ! kme ----- full level
  204. ! kme-1 - half level
  205. ! kme-1 ----- full level
  206. ! .
  207. ! .
  208. ! .
  209. ! kms+2 - half level
  210. ! kms+2 ----- full level
  211. ! kms+1 - half level
  212. ! kms+1 ----- full level
  213. ! kms - half level
  214. ! kms ----- full level
  215. !
  216. !======================================================================
  217. ! Grid structure in physics part of WRF
  218. !
  219. !-------------------------------------
  220. ! The horizontal velocities used in the physics are unstaggered
  221. ! relative to temperature/moisture variables. All predicted
  222. ! variables are carried at half levels except w, which is at full
  223. ! levels. Some arrays with names (*8w) are at w (full) levels.
  224. !
  225. !==================================================================
  226. ! Definitions
  227. !-----------
  228. ! Theta potential temperature (K)
  229. ! Qv water vapor mixing ratio (kg/kg)
  230. ! Qc cloud water mixing ratio (kg/kg)
  231. ! Qr rain water mixing ratio (kg/kg)
  232. ! Qi cloud ice mixing ratio (kg/kg)
  233. ! Qs snow mixing ratio (kg/kg)
  234. !-----------------------------------------------------------------
  235. !-- PM2_5_DRY Dry PM2.5 aerosol mass for all species (ug m^-3)
  236. !-- PM2_5_WATER PM2.5 water mass (ug m^-3)
  237. !-- PM2_5_DRY_EC Dry PM2.5 elemental carbon aersol mass (ug m^-3)
  238. !-- RTHRATEN Theta tendency
  239. ! due to radiation (K/s)
  240. !-- RTHRATENLW Theta tendency
  241. ! due to long wave radiation (K/s)
  242. !-- RTHRATENSW Theta temperature tendency
  243. ! due to short wave radiation (K/s)
  244. !-- dt time step (s)
  245. !-- itimestep number of time steps
  246. !-- GLW downward long wave flux at ground surface (W/m^2)
  247. !-- GSW net short wave flux at ground surface (W/m^2)
  248. !-- SWDOWN downward short wave flux at ground surface (W/m^2)
  249. !-- SWDOWNC clear-sky downward short wave flux at ground surface (W/m^2; optional; for AQ)
  250. !-- RLWTOA upward long wave at top of atmosphere (w/m2)
  251. !-- RSWTOA upward short wave at top of atmosphere (w/m2)
  252. !-- XLAT latitude, south is negative (degree)
  253. !-- XLONG longitude, west is negative (degree)
  254. !-- ALBEDO albedo (between 0 and 1)
  255. !-- CLDFRA cloud fraction (between 0 and 1)
  256. !-- EMISS surface emissivity (between 0 and 1)
  257. !-- rho_phy density (kg/m^3)
  258. !-- rr dry air density (kg/m^3)
  259. !-- moist moisture array (4D - last index is species) (kg/kg)
  260. !-- n_moist number of moisture species
  261. !-- qndrop Cloud droplet number (#/kg)
  262. !-- p8w pressure at full levels (Pa)
  263. !-- p_phy pressure (Pa)
  264. !-- Pb base-state pressure (Pa)
  265. !-- pi_phy exner function (dimensionless)
  266. !-- dz8w dz between full levels (m)
  267. !-- t_phy temperature (K)
  268. !-- t8w temperature at full levels (K)
  269. !-- GMT Greenwich Mean Time Hour of model start (hour)
  270. !-- JULDAY the initial day (Julian day)
  271. !-- RADT time for calling radiation (min)
  272. !-- ra_call_offset -1 (old) means usually just before output, 0 after
  273. !-- DEGRAD conversion factor for
  274. ! degrees to radians (pi/180.) (rad/deg)
  275. !-- DPD degrees per day for earth's
  276. ! orbital position (deg/day)
  277. !-- R_d gas constant for dry air (J/kg/K)
  278. !-- CP heat capacity at constant pressure for dry air (J/kg/K)
  279. !-- G acceleration due to gravity (m/s^2)
  280. !-- rvovrd R_v divided by R_d (dimensionless)
  281. !-- XTIME time since simulation start (min)
  282. !-- DECLIN solar declination angle (rad)
  283. !-- SOLCON solar constant (W/m^2)
  284. !-- ids start index for i in domain
  285. !-- ide end index for i in domain
  286. !-- jds start index for j in domain
  287. !-- jde end index for j in domain
  288. !-- kds start index for k in domain
  289. !-- kde end index for k in domain
  290. !-- ims start index for i in memory
  291. !-- ime end index for i in memory
  292. !-- jms start index for j in memory
  293. !-- jme end index for j in memory
  294. !-- kms start index for k in memory
  295. !-- kme end index for k in memory
  296. !-- i_start start indices for i in tile
  297. !-- i_end end indices for i in tile
  298. !-- j_start start indices for j in tile
  299. !-- j_end end indices for j in tile
  300. !-- kts start index for k in tile
  301. !-- kte end index for k in tile
  302. !-- num_tiles number of tiles
  303. !
  304. !==================================================================
  305. !
  306. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  307. ims,ime, jms,jme, kms,kme, &
  308. kts,kte, &
  309. num_tiles
  310. INTEGER, INTENT(IN) :: lw_physics, sw_physics
  311. INTEGER, DIMENSION(num_tiles), INTENT(IN) :: &
  312. i_start,i_end,j_start,j_end
  313. INTEGER, INTENT(IN ) :: STEPRA,ICLOUD,ra_call_offset
  314. INTEGER, INTENT(IN ) :: levsiz, n_ozmixm
  315. INTEGER, INTENT(IN ) :: paerlev, n_aerosolc, cam_abs_dim1, cam_abs_dim2
  316. REAL, INTENT(IN ) :: cam_abs_freq_s
  317. LOGICAL, INTENT(IN ) :: warm_rain
  318. REAL, INTENT(IN ) :: RADT
  319. REAL, DIMENSION( ims:ime, jms:jme ), &
  320. INTENT(IN ) :: XLAND, &
  321. XICE, &
  322. TSK, &
  323. VEGFRA, &
  324. SNOW
  325. REAL, DIMENSION( ims:ime, levsiz, jms:jme, n_ozmixm ), OPTIONAL, &
  326. INTENT(IN ) :: OZMIXM
  327. REAL, DIMENSION( ims:ime, levsiz, jms:jme, n_ozmixm ) :: OZFLG
  328. REAL, DIMENSION(levsiz), OPTIONAL, INTENT(IN ) :: PIN
  329. REAL, DIMENSION(ims:ime,jms:jme), OPTIONAL, INTENT(IN ) :: m_ps_1,m_ps_2
  330. REAL, DIMENSION( ims:ime, paerlev, jms:jme, n_aerosolc ), OPTIONAL, &
  331. INTENT(IN ) :: aerosolc_1, aerosolc_2
  332. REAL, DIMENSION(paerlev), OPTIONAL, &
  333. INTENT(IN ) :: m_hybi0
  334. REAL, DIMENSION( ims:ime, jms:jme ), &
  335. INTENT(INOUT) :: HTOP, &
  336. HBOT, &
  337. HTOPR, &
  338. HBOTR, &
  339. CUPPT
  340. INTEGER, INTENT(IN ) :: julyr
  341. !
  342. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
  343. INTENT(IN ) :: dz8w, &
  344. z, &
  345. p8w, &
  346. p, &
  347. pi, &
  348. t, &
  349. t8w, &
  350. rho
  351. !
  352. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), OPTIONAL , &
  353. INTENT(IN ) :: tauaer300,tauaer400,tauaer600,tauaer999, & ! jcb
  354. gaer300,gaer400,gaer600,gaer999, & ! jcb
  355. waer300,waer400,waer600,waer999, & ! jcb
  356. qc_adjust, qi_adjust
  357. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), OPTIONAL , &
  358. INTENT(IN ) :: tauaerlw1,tauaerlw2,tauaerlw3,tauaerlw4, & ! czhao
  359. tauaerlw5,tauaerlw6,tauaerlw7,tauaerlw8, & ! czhao
  360. tauaerlw9,tauaerlw10,tauaerlw11,tauaerlw12, & ! czhao
  361. tauaerlw13,tauaerlw14,tauaerlw15,tauaerlw16
  362. LOGICAL, INTENT(IN) :: cu_rad_feedback
  363. INTEGER, INTENT(IN ), OPTIONAL :: aer_ra_feedback
  364. !jdfcz INTEGER, OPTIONAL, INTENT(IN ) :: progn,prescribe
  365. INTEGER, OPTIONAL, INTENT(IN ) :: progn
  366. !
  367. ! variables for aerosols (only if running with chemistry)
  368. !
  369. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), OPTIONAL , &
  370. INTENT(IN ) :: pm2_5_dry, &
  371. pm2_5_water, &
  372. pm2_5_dry_ec
  373. !
  374. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
  375. INTENT(INOUT) :: RTHRATEN, &
  376. RTHRATENLW, &
  377. RTHRATENSW
  378. ! REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), OPTIONAL , &
  379. ! INTENT(INOUT) :: SWUP, &
  380. ! SWDN, &
  381. ! SWUPCLEAR, &
  382. ! SWDNCLEAR, &
  383. ! LWUP, &
  384. ! LWDN, &
  385. ! LWUPCLEAR, &
  386. ! LWDNCLEAR
  387. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT) ::&
  388. ACSWUPT,ACSWUPTC,ACSWDNT,ACSWDNTC, &
  389. ACSWUPB,ACSWUPBC,ACSWDNB,ACSWDNBC, &
  390. ACLWUPT,ACLWUPTC,ACLWDNT,ACLWDNTC, &
  391. ACLWUPB,ACLWUPBC,ACLWDNB,ACLWDNBC
  392. ! TOA and surface, upward and downward, total and clear fluxes
  393. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT) ::&
  394. SWUPT, SWUPTC, SWDNT, SWDNTC, &
  395. SWUPB, SWUPBC, SWDNB, SWDNBC, &
  396. LWUPT, LWUPTC, LWDNT, LWDNTC, &
  397. LWUPB, LWUPBC, LWDNB, LWDNBC
  398. ! Upward and downward, total and clear sky layer fluxes (W m-2)
  399. REAL, DIMENSION( ims:ime, kms:kme+2, jms:jme ), &
  400. OPTIONAL, INTENT(INOUT) :: &
  401. SWUPFLX,SWUPFLXC,SWDNFLX,SWDNFLXC, &
  402. LWUPFLX,LWUPFLXC,LWDNFLX,LWDNFLXC
  403. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL , &
  404. INTENT(INOUT) :: SWCF, &
  405. LWCF, &
  406. OLR
  407. ! ---- fds (06/2010) ssib alb components ------------
  408. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL , &
  409. INTENT(IN ) :: ALSWVISDIR, &
  410. ALSWVISDIF, &
  411. ALSWNIRDIR, &
  412. ALSWNIRDIF
  413. ! ---- fds (06/2010) ssib swr components ------------
  414. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL , &
  415. INTENT(OUT ) :: SWVISDIR, &
  416. SWVISDIF, &
  417. SWNIRDIR, &
  418. SWNIRDIF
  419. INTEGER, OPTIONAL, INTENT(IN ) :: sf_surface_physics
  420. !
  421. REAL, DIMENSION( ims:ime, jms:jme ), &
  422. INTENT(IN ) :: XLAT, &
  423. XLONG, &
  424. ALBEDO, &
  425. EMISS
  426. !
  427. REAL, DIMENSION( ims:ime, jms:jme ), &
  428. INTENT(INOUT) :: GSW, &
  429. GLW
  430. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: SWDOWN
  431. !
  432. REAL, INTENT(IN ) :: GMT,dt, &
  433. julian, xtime
  434. INTEGER, INTENT(IN ),OPTIONAL :: YR
  435. !
  436. INTEGER, INTENT(IN ) :: JULDAY, itimestep
  437. REAL, INTENT(IN ),OPTIONAL :: CURR_SECS
  438. LOGICAL, INTENT(IN ),OPTIONAL :: ADAPT_STEP_FLAG
  439. INTEGER,INTENT(IN) :: NPHS
  440. REAL, DIMENSION( ims:ime, jms:jme ),INTENT(OUT) :: &
  441. CFRACH, & !Added
  442. CFRACL, & !Added
  443. CFRACM, & !Added
  444. CZMEAN !Added
  445. REAL, DIMENSION( ims:ime, jms:jme ), &
  446. INTENT(INOUT) :: &
  447. RLWTOA, & !Added
  448. RSWTOA, & !Added
  449. ACFRST, & !Added
  450. ACFRCV !Added
  451. INTEGER,DIMENSION( ims:ime, jms:jme ),INTENT(INOUT) :: &
  452. NCFRST, & !Added
  453. NCFRCV !Added
  454. ! Optional, only for Goddard LW and SW
  455. REAL, DIMENSION(IMS:IME, JMS:JME, 1:8) :: ERBE_out !extra output for SDSU
  456. REAL, DIMENSION(IMS:IME, JMS:JME), OPTIONAL, INTENT(OUT) :: &
  457. TLWDN, TLWUP, &
  458. SLWDN, SLWUP, &
  459. TSWDN, TSWUP, &
  460. SSWDN, SSWUP ! for Goddard schemes
  461. ! Optional (only used by CAM lw scheme)
  462. REAL, DIMENSION( ims:ime, kms:kme, cam_abs_dim2, jms:jme ), OPTIONAL ,&
  463. INTENT(INOUT) :: abstot
  464. REAL, DIMENSION( ims:ime, kms:kme, cam_abs_dim1, jms:jme ), OPTIONAL ,&
  465. INTENT(INOUT) :: absnxt
  466. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), OPTIONAL ,&
  467. INTENT(INOUT) :: emstot
  468. !
  469. ! Optional
  470. !
  471. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
  472. OPTIONAL, &
  473. INTENT(INOUT) :: CLDFRA
  474. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
  475. OPTIONAL, &
  476. INTENT(IN ) :: &
  477. F_ICE_PHY, &
  478. F_RAIN_PHY
  479. REAL, DIMENSION( ims:ime, jms:jme ), &
  480. OPTIONAL, &
  481. INTENT(OUT) :: SWDOWNC
  482. !
  483. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
  484. OPTIONAL, &
  485. INTENT(INOUT ) :: &
  486. pb &
  487. ,qv,qc,qr,qi,qs,qg,qndrop
  488. LOGICAL, OPTIONAL :: f_qv,f_qc,f_qr,f_qi,f_qs,f_qg,f_qndrop
  489. !
  490. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
  491. OPTIONAL, &
  492. INTENT(INOUT) :: taucldi,taucldc
  493. ! Variables for slope-dependent radiation
  494. REAL, OPTIONAL, INTENT(IN) :: dx,dy
  495. INTEGER, OPTIONAL, INTENT(IN) :: slope_rad,topo_shading
  496. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(IN) :: ht
  497. INTEGER, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(IN) :: shadowmask
  498. REAL , OPTIONAL, INTENT(INOUT) :: radtacttime ! Storing the time in s when radiation is called next
  499. ! LOCAL VAR
  500. REAL, DIMENSION( ims:ime, jms:jme ) :: GLAT,GLON
  501. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) :: CEMISS
  502. REAL, DIMENSION( ims:ime, jms:jme ) :: coszr
  503. REAL :: DECLIN,SOLCON,XXLAT,TLOCTM,XT24, CEN_LAT
  504. INTEGER :: i,j,k,its,ite,jts,jte,ij
  505. INTEGER :: STEPABS
  506. LOGICAL :: gfdl_lw,gfdl_sw
  507. LOGICAL :: doabsems
  508. LOGICAL, EXTERNAL :: wrf_dm_on_monitor
  509. REAL :: OBECL,SINOB,SXLONG,ARG,DECDEG, &
  510. DJUL,RJUL,ECCFAC
  511. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) :: qi_temp,qc_temp
  512. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) :: qi_save,qc_save
  513. REAL :: next_rad_time
  514. LOGICAL :: run_param , doing_adapt_dt , decided
  515. LOGICAL :: flg_lw, flg_sw
  516. !------------------------------------------------------------------
  517. ! solar related variables are added to declaration
  518. !-------------------------------------------------
  519. REAL, OPTIONAL, INTENT(OUT) :: DECLINX,SOLCONX
  520. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme), INTENT(OUT) :: COSZEN
  521. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme), INTENT(OUT) :: HRANG
  522. !------------------------------------------------------------------
  523. #ifdef HWRF
  524. CHARACTER(len=265) :: wrf_err_message
  525. #endif
  526. CALL wrf_debug (1, 'Top of Radiation Driver')
  527. ! WRITE ( wrf_err_message , * ) 'itimestep = ',itimestep,', dt = ',dt,', lw and sw options = ',lw_physics,sw_physics
  528. ! CALL wrf_debug (1, wrf_err_message )
  529. if (lw_physics .eq. 0 .and. sw_physics .eq. 0) return
  530. ! ra_call_offset = -1 gives old method where radiation may be called just before output
  531. ! ra_call_offset = 0 gives new method where radiation may be called just after output
  532. ! and is also consistent with removal of offset in new XTIME
  533. ! also need to account for stepra=1 which always has zero modulo output
  534. doing_adapt_dt = .FALSE.
  535. IF ( PRESENT(adapt_step_flag) ) THEN
  536. IF ( adapt_step_flag ) THEN
  537. doing_adapt_dt = .TRUE.
  538. IF ( radtacttime .eq. 0. ) THEN
  539. radtacttime = CURR_SECS + radt*60.
  540. END IF
  541. END IF
  542. END IF
  543. ! Do we run through this scheme or not?
  544. ! Test 1: If this is the initial model time, then yes.
  545. ! ITIMESTEP=1
  546. ! Test 2: If the user asked for the radiation to be run every time step, then yes.
  547. ! RADT=0 or STEPRA=1
  548. ! Test 3: If not adaptive dt, and this is on the requested radiation frequency, then yes.
  549. ! MOD(ITIMESTEP,STEPRA)=0 (or 1, depending on the offset setting)
  550. ! Test 4: If using adaptive dt and the current time is past the last requested activate radiation time, then yes.
  551. ! CURR_SECS >= RADTACTTIME
  552. ! If we do run through the scheme, we set the flag run_param to TRUE and we set the decided flag
  553. ! to TRUE. The decided flag says that one of these tests was able to say "yes", run the scheme.
  554. ! We only proceed to other tests if the previous tests all have left decided as FALSE.
  555. ! If we set run_param to TRUE and this is adaptive time stepping, we set the time to the next
  556. ! radiation run.
  557. run_param = .FALSE.
  558. decided = .FALSE.
  559. IF ( ( .NOT. decided ) .AND. &
  560. ( itimestep .EQ. 1 ) ) THEN
  561. run_param = .TRUE.
  562. decided = .TRUE.
  563. END IF
  564. IF ( ( .NOT. decided ) .AND. &
  565. ( ( radt .EQ. 0. ) .OR. ( stepra .EQ. 1 ) ) ) THEN
  566. run_param = .TRUE.
  567. decided = .TRUE.
  568. END IF
  569. IF ( ( .NOT. decided ) .AND. &
  570. ( .NOT. doing_adapt_dt ) .AND. &
  571. ( MOD(itimestep,stepra) .EQ. 1+ra_call_offset ) ) THEN
  572. run_param = .TRUE.
  573. decided = .TRUE.
  574. END IF
  575. IF ( ( .NOT. decided ) .AND. &
  576. ( doing_adapt_dt ) .AND. &
  577. ( curr_secs .GE. radtacttime ) ) THEN
  578. run_param = .TRUE.
  579. decided = .TRUE.
  580. radtacttime = curr_secs + radt*60
  581. END IF
  582. Radiation_step: IF ( run_param ) then
  583. ! CAM-specific additional radiation frequency - cam_abs_freq_s (=21600s by default)
  584. STEPABS = nint(cam_abs_freq_s/(dt*STEPRA))*STEPRA
  585. IF (itimestep .eq. 1 .or. mod(itimestep,STEPABS) .eq. 1 + ra_call_offset &
  586. .or. STEPABS .eq. 1 ) THEN
  587. doabsems = .true.
  588. ELSE
  589. doabsems = .false.
  590. ENDIF
  591. IF (PRESENT(adapt_step_flag)) THEN
  592. IF ((adapt_step_flag)) THEN
  593. IF ( (itimestep .EQ. 1) .OR. (cam_abs_freq_s .EQ. 0) .OR. &
  594. ( CURR_SECS + dt >= ( INT( CURR_SECS / ( cam_abs_freq_s ) + 1 ) * cam_abs_freq_s) ) ) THEN
  595. doabsems = .true.
  596. ELSE
  597. doabsems = .false.
  598. ENDIF
  599. ENDIF
  600. ENDIF
  601. gfdl_lw = .false.
  602. gfdl_sw = .false.
  603. ! moved up and out of OMP loop because it only needs to be computed once
  604. ! and because it is not entirely thread-safe (XT24, TOLOCTM and XXLAT need
  605. ! their thread-privacy) JM 20100217
  606. DO ij = 1 , num_tiles
  607. its = i_start(ij)
  608. ite = i_end(ij)
  609. jts = j_start(ij)
  610. jte = j_end(ij)
  611. CALL radconst(XTIME,DECLIN,SOLCON,JULIAN, &
  612. DEGRAD,DPD )
  613. IF(PRESENT(declinx).AND.PRESENT(solconx))THEN
  614. ! saved to state arrays used in surface driver
  615. declinx=declin
  616. solconx=solcon
  617. ENDIF
  618. IF(PRESENT(coszen).AND.PRESENT(hrang))THEN
  619. ! state arrays of hrang and coszen used in surface driver
  620. XT24=MOD(XTIME+RADT*0.5,1440.)
  621. DO j=jts,jte
  622. DO i=its,ite
  623. TLOCTM=GMT+XT24/60.+XLONG(I,J)/15.
  624. HRANG(I,J)=15.*(TLOCTM-12.)*DEGRAD
  625. XXLAT=XLAT(I,J)*DEGRAD
  626. COSZEN(I,J)=SIN(XXLAT)*SIN(DECLIN)+COS(XXLAT)*COS(DECLIN)*COS(HRANG(I,J))
  627. ENDDO
  628. ENDDO
  629. ENDIF
  630. ENDDO
  631. !---------------
  632. !$OMP PARALLEL DO &
  633. !$OMP PRIVATE ( ij ,i,j,k,its,ite,jts,jte)
  634. DO ij = 1 , num_tiles
  635. its = i_start(ij)
  636. ite = i_end(ij)
  637. jts = j_start(ij)
  638. jte = j_end(ij)
  639. ! initialize data
  640. DO j=jts,jte
  641. DO i=its,ite
  642. GSW(I,J)=0.
  643. GLW(I,J)=0.
  644. SWDOWN(I,J)=0.
  645. GLAT(I,J)=XLAT(I,J)*DEGRAD
  646. GLON(I,J)=XLONG(I,J)*DEGRAD
  647. ENDDO
  648. ENDDO
  649. DO j=jts,jte
  650. DO k=kts,kte+1
  651. DO i=its,ite
  652. RTHRATEN(I,K,J)=0.
  653. RTHRATENLW(I,K,J)=0.
  654. RTHRATENSW(I,K,J)=0.
  655. ! SWUP(I,K,J) = 0.0
  656. ! SWDN(I,K,J) = 0.0
  657. ! SWUPCLEAR(I,K,J) = 0.0
  658. ! SWDNCLEAR(I,K,J) = 0.0
  659. ! LWUP(I,K,J) = 0.0
  660. ! LWDN(I,K,J) = 0.0
  661. ! LWUPCLEAR(I,K,J) = 0.0
  662. ! LWDNCLEAR(I,K,J) = 0.0
  663. CEMISS(I,K,J)=0.0
  664. ENDDO
  665. ENDDO
  666. ENDDO
  667. IF ( PRESENT( SWUPFLX ) ) THEN
  668. DO j=jts,jte
  669. DO k=kts,kte+2
  670. DO i=its,ite
  671. SWUPFLX(I,K,J) = 0.0
  672. SWDNFLX(I,K,J) = 0.0
  673. SWUPFLXC(I,K,J) = 0.0
  674. SWDNFLXC(I,K,J) = 0.0
  675. LWUPFLX(I,K,J) = 0.0
  676. LWDNFLX(I,K,J) = 0.0
  677. LWUPFLXC(I,K,J) = 0.0
  678. LWDNFLXC(I,K,J) = 0.0
  679. ENDDO
  680. ENDDO
  681. ENDDO
  682. ENDIF
  683. ! temporarily modify hydrometeors (currently only done for GD scheme and WRF-Chem)
  684. !
  685. IF ( PRESENT( qc ) .AND. PRESENT( qc_adjust ) .AND. cu_rad_feedback ) THEN
  686. DO j=jts,jte
  687. DO k=kts,kte
  688. DO i=its,ite
  689. qc_save(i,k,j) = qc(i,k,j)
  690. qc(i,k,j) = qc(i,k,j) + qc_adjust(i,k,j)
  691. ENDDO
  692. ENDDO
  693. ENDDO
  694. ENDIF
  695. IF ( PRESENT( qi ) .AND. PRESENT( qi_adjust ) .AND. cu_rad_feedback ) THEN
  696. DO j=jts,jte
  697. DO k=kts,kte
  698. DO i=its,ite
  699. qi_save(i,k,j) = qi(i,k,j)
  700. qi(i,k,j) = qi(i,k,j) + qi_adjust(i,k,j)
  701. ENDDO
  702. ENDDO
  703. ENDDO
  704. ENDIF
  705. ! Fill temporary water variable depending on micro package (tgs 25 Apr 2006)
  706. if(PRESENT(qc) .and. PRESENT(F_QC)) then
  707. DO j=jts,jte
  708. DO k=kts,kte
  709. DO i=its,ite
  710. qc_temp(I,K,J)=qc(I,K,J)
  711. ENDDO
  712. ENDDO
  713. ENDDO
  714. else
  715. DO j=jts,jte
  716. DO k=kts,kte
  717. DO i=its,ite
  718. qc_temp(I,K,J)=0.
  719. ENDDO
  720. ENDDO
  721. ENDDO
  722. endif
  723. if(PRESENT(qr) .and. PRESENT(F_QR)) then
  724. DO j=jts,jte
  725. DO k=kts,kte
  726. DO i=its,ite
  727. qc_temp(I,K,J) = qc_temp(I,K,J) + qr(I,K,J)
  728. ENDDO
  729. ENDDO
  730. ENDDO
  731. endif
  732. !---------------
  733. ! Calculate constant for short wave radiation
  734. lwrad_cldfra_select: SELECT CASE(lw_physics)
  735. CASE (GFDLLWSCHEME)
  736. !-- Do nothing, since cloud fractions (with partial cloudiness effects)
  737. !-- are defined in GFDL LW/SW schemes and do not need to be initialized.
  738. CASE (CAMLWSCHEME)
  739. IF ( PRESENT ( CLDFRA ) .AND. &
  740. PRESENT(F_QC) .AND. PRESENT ( F_QI ) ) THEN
  741. ! Call to cloud fraction routine based on Randall 1994 (Hong Pan 1998)
  742. CALL cal_cldfra2(CLDFRA,qv,qc,qi,qs, &
  743. F_QV,F_QC,F_QI,F_QS,t,p, &
  744. F_ICE_PHY,F_RAIN_PHY, &
  745. ids,ide, jds,jde, kds,kde, &
  746. ims,ime, jms,jme, kms,kme, &
  747. its,ite, jts,jte, kts,kte )
  748. ENDIF
  749. CASE (RRTMG_LWSCHEME)
  750. IF ( PRESENT ( CLDFRA ) .AND. &
  751. PRESENT(F_QC) .AND. PRESENT ( F_QI ) ) THEN
  752. ! Call to cloud fraction routine based on Randall 1994 (Hong Pan 1998)
  753. CALL cal_cldfra2(CLDFRA,qv,qc,qi,qs, &
  754. F_QV,F_QC,F_QI,F_QS,t,p, &
  755. F_ICE_PHY,F_RAIN_PHY, &
  756. ids,ide, jds,jde, kds,kde, &
  757. ims,ime, jms,jme, kms,kme, &
  758. its,ite, jts,jte, kts,kte )
  759. ENDIF
  760. CASE DEFAULT
  761. IF ( PRESENT ( CLDFRA ) .AND. &
  762. PRESENT(F_QC) .AND. PRESENT ( F_QI ) ) THEN
  763. CALL cal_cldfra(CLDFRA,qc,qi,F_QC,F_QI, &
  764. ids,ide, jds,jde, kds,kde, &
  765. ims,ime, jms,jme, kms,kme, &
  766. its,ite, jts,jte, kts,kte )
  767. ENDIF
  768. END SELECT lwrad_cldfra_select
  769. lwrad_select: SELECT CASE(lw_physics)
  770. CASE (RRTMSCHEME)
  771. CALL wrf_debug (100, 'CALL rrtm')
  772. CALL RRTMLWRAD( &
  773. RTHRATEN=RTHRATEN,GLW=GLW,OLR=RLWTOA,EMISS=EMISS &
  774. ,QV3D=QV &
  775. ,QC3D=QC &
  776. ,QR3D=QR &
  777. ,QI3D=QI &
  778. ,QS3D=QS &
  779. ,QG3D=QG &
  780. ,P8W=p8w,P3D=p,PI3D=pi,DZ8W=dz8w,TSK=tsk,T3D=t &
  781. ,T8W=t8w,RHO3D=rho, CLDFRA3D=CLDFRA,R=R_d,G=G &
  782. ,F_QV=F_QV,F_QC=F_QC,F_QR=F_QR &
  783. ,F_QI=F_QI,F_QS=F_QS,F_QG=F_QG &
  784. ,ICLOUD=icloud,WARM_RAIN=warm_rain &
  785. ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
  786. ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
  787. ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
  788. )
  789. CASE (goddardlwscheme)
  790. CALL wrf_debug (100, 'CALL goddard longwave radiation scheme ')
  791. IF (itimestep.eq.1) then
  792. call wrf_message('running goddard lw radiation')
  793. ENDIF
  794. CALL goddardrad(sw_or_lw='lw' &
  795. ,rthraten=rthraten,gsf=glw,xlat=xlat,xlong=xlong &
  796. ,alb=albedo,t3d=t,p3d=p,p8w3d=p8w,pi3d=pi &
  797. ,dz8w=dz8w,rho_phy=rho,emiss=emiss &
  798. ,cldfra3d=cldfra &
  799. ,gmt=gmt,cp=cp,g=g,t8w=t8w &
  800. ,julday=julday,xtime=xtime &
  801. ,declin=declin,solcon=solcon &
  802. , center_lat = cen_lat &
  803. ,radfrq=radt,degrad=degrad &
  804. ,taucldi=taucldi,taucldc=taucldc &
  805. ,warm_rain=warm_rain &
  806. ,ids=ids,ide=ide, jds=jds,jde=jde, kds=kds,kde=kde &
  807. ,ims=ims,ime=ime, jms=jms,jme=jme, kms=kms,kme=kme &
  808. ,its=its,ite=ite, jts=jts,jte=jte, kts=kts,kte=kte &
  809. ! ,cosz_urb2d=cosz_urb2d ,omg_urb2d=omg_urb2d & !urban
  810. ,qv3d=qv &
  811. ,qc3d=qc &
  812. ,qr3d=qr &
  813. ,qi3d=qi &
  814. ,qs3d=qs &
  815. ,qg3d=qg &
  816. ,f_qv=f_qv,f_qc=f_qc,f_qr=f_qr &
  817. ,f_qi=f_qi,f_qs=f_qs,f_qg=f_qg &
  818. ,erbe_out=erbe_out & !optional
  819. )
  820. CASE (GFDLLWSCHEME)
  821. CALL wrf_debug (100, 'CALL gfdllw')
  822. IF ( PRESENT(F_QV) .AND. PRESENT(F_QC) .AND. &
  823. PRESENT(F_QS) .AND. PRESENT(qs) .AND. &
  824. PRESENT(qv) .AND. PRESENT(qc) ) THEN
  825. IF ( F_QV .AND. F_QC .AND. F_QS) THEN
  826. gfdl_lw = .true.
  827. CALL ETARA( &
  828. DT=dt,XLAND=xland &
  829. ,P8W=p8w,DZ8W=dz8w,RHO_PHY=rho,P_PHY=p,T=t &
  830. ,QV=qv,QW=qc_temp,QI=qi,QS=qs &
  831. ,TSK2D=tsk,GLW=GLW,RSWIN=SWDOWN,GSW=GSW &
  832. ,RSWINC=SWDOWNC,CLDFRA=CLDFRA,PI3D=pi &
  833. ,GLAT=glat,GLON=glon,HTOP=htop,HBOT=hbot &
  834. ,HBOTR=hbotr, HTOPR=htopr &
  835. ,ALBEDO=albedo,CUPPT=cuppt &
  836. ,VEGFRA=vegfra,SNOW=snow,G=g,GMT=gmt &
  837. ,NSTEPRA=stepra,NPHS=nphs,ITIMESTEP=itimestep &
  838. ,XTIME=xtime,JULIAN=julian &
  839. ,JULYR=julyr,JULDAY=julday &
  840. ,GFDL_LW=gfdl_lw,GFDL_SW=gfdl_sw &
  841. ,CFRACL=cfracl,CFRACM=cfracm,CFRACH=cfrach &
  842. ,ACFRST=acfrst,NCFRST=ncfrst &
  843. ,ACFRCV=acfrcv,NCFRCV=ncfrcv &
  844. ,RSWTOA=rswtoa,RLWTOA=rlwtoa,CZMEAN=czmean &
  845. ,THRATEN=rthraten,THRATENLW=rthratenlw &
  846. ,THRATENSW=rthratensw &
  847. ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
  848. ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
  849. ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
  850. )
  851. ELSE
  852. CALL wrf_error_fatal('Can not call ETARA (1a). Missing moisture fields.')
  853. ENDIF
  854. ELSE
  855. CALL wrf_error_fatal('Can not call ETARA (1b). Missing moisture fields.')
  856. ENDIF
  857. #ifdef HWRF
  858. CASE (HWRFLWSCHEME)
  859. CALL wrf_debug (100, 'CALL hwrflw')
  860. gfdl_lw = .true.
  861. CALL HWRFRA(DT=dt,thraten=RTHRATEN,thratenlw=RTHRATENLW,thratensw=RTHRATENSW,pi3d=pi, &
  862. XLAND=xland,P8w=p8w,DZ8w=dz8w,RHO_PHY=rho,P_PHY=p,T=t, &
  863. QV=qv,QW=qc_temp,QI=Qi, &
  864. TSK2D=tsk,GLW=GLW,GSW=GSW, &
  865. TOTSWDN=swdown,TOTLWDN=glw,RSWTOA=rswtoa,RLWTOA=rlwtoa,CZMEAN=czmean, & !Added
  866. GLAT=glat,GLON=glon,HTOP=htop,HBOT=hbot,htopr=htopr,hbotr=hbotr,ALBEDO=albedo,CUPPT=cuppt,&
  867. VEGFRA=vegfra,SNOW=snow,G=g,GMT=gmt, & !Modified
  868. NSTEPRA=stepra,NPHS=nphs,itimestep=itimestep, & !Modified
  869. julyr=julyr,julday=julday,gfdl_lw=gfdl_lw,gfdl_sw=gfdl_sw, &
  870. CFRACL=cfracl,CFRACM=cfracm,CFRACH=cfrach, & !Added
  871. ACFRST=acfrst,NCFRST=ncfrst,ACFRCV=acfrcv,NCFRCV=ncfrcv, & !Added
  872. ids=ids,ide=ide, jds=jds,jde=jde, kds=kds,kde=kde, &
  873. ims=ims,ime=ime, jms=jms,jme=jme, kms=kms,kme=kme, &
  874. its=its,ite=ite, jts=jts,jte=jte, kts=kts,kte=kte )
  875. #endif
  876. CASE (CAMLWSCHEME)
  877. CALL wrf_debug(100, 'CALL camrad lw')
  878. IF ( PRESENT( OZMIXM ) .AND. PRESENT( PIN ) .AND. &
  879. PRESENT(M_PS_1) .AND. PRESENT(M_PS_2) .AND. &
  880. PRESENT(M_HYBI0) .AND. PRESENT(AEROSOLC_1) &
  881. .AND. PRESENT(AEROSOLC_2).AND. PRESENT(ALSWVISDIR) ) THEN
  882. CALL CAMRAD(RTHRATENLW=RTHRATEN,RTHRATENSW=RTHRATENSW, &
  883. dolw=.true.,dosw=.false., &
  884. SWUPT=SWUPT,SWUPTC=SWUPTC, &
  885. SWDNT=SWDNT,SWDNTC=SWDNTC, &
  886. LWUPT=LWUPT,LWUPTC=LWUPTC, &
  887. LWDNT=LWDNT,LWDNTC=LWDNTC, &
  888. SWUPB=SWUPB,SWUPBC=SWUPBC, &
  889. SWDNB=SWDNB,SWDNBC=SWDNBC, &
  890. LWUPB=LWUPB,LWUPBC=LWUPBC, &
  891. LWDNB=LWDNB,LWDNBC=LWDNBC, &
  892. SWCF=SWCF,LWCF=LWCF,OLR=RLWTOA,CEMISS=CEMISS, &
  893. TAUCLDC=TAUCLDC,TAUCLDI=TAUCLDI,COSZR=COSZR, &
  894. GSW=GSW,GLW=GLW,XLAT=XLAT,XLONG=XLONG, &
  895. ALBEDO=ALBEDO,t_phy=t,TSK=TSK,EMISS=EMISS &
  896. ,QV3D=qv &
  897. ,QC3D=qc &
  898. ,QR3D=qr &
  899. ,QI3D=qi &
  900. ,QS3D=qs &
  901. ,QG3D=qg &
  902. ,ALSWVISDIR=alswvisdir ,ALSWVISDIF=alswvisdif & !fds ssib alb comp (06/2010)
  903. ,ALSWNIRDIR=alswnirdir ,ALSWNIRDIF=alswnirdif & !fds ssib alb comp (06/2010)
  904. ,SWVISDIR=swvisdir ,SWVISDIF=swvisdif & !fds ssib swr comp (06/2010)
  905. ,SWNIRDIR=swnirdir ,SWNIRDIF=swnirdif & !fds ssib swr comp (06/2010)
  906. ,SF_SURFACE_PHYSICS=sf_surface_physics & !fds
  907. ,F_QV=f_qv,F_QC=f_qc,F_QR=f_qr &
  908. ,F_QI=f_qi,F_QS=f_qs,F_QG=f_qg &
  909. ,f_ice_phy=f_ice_phy,f_rain_phy=f_rain_phy &
  910. ,p_phy=p,p8w=p8w,z=z,pi_phy=pi,rho_phy=rho, &
  911. dz8w=dz8w, &
  912. CLDFRA=CLDFRA,XLAND=XLAND,XICE=XICE,SNOW=SNOW, &
  913. ozmixm=ozmixm,pin0=pin,levsiz=levsiz, &
  914. num_months=n_ozmixm, &
  915. m_psp=m_ps_1,m_psn=m_ps_2,aerosolcp=aerosolc_1, &
  916. aerosolcn=aerosolc_2,m_hybi0=m_hybi0, &
  917. paerlev=paerlev, naer_c=n_aerosolc, &
  918. cam_abs_dim1=cam_abs_dim1, cam_abs_dim2=cam_abs_dim2, &
  919. GMT=GMT,JULDAY=JULDAY,JULIAN=JULIAN,YR=YR,DT=DT,XTIME=XTIME,DECLIN=DECLIN, &
  920. SOLCON=SOLCON,RADT=RADT,DEGRAD=DEGRAD,n_cldadv=3 &
  921. ,abstot_3d=abstot,absnxt_3d=absnxt,emstot_3d=emstot &
  922. ,doabsems=doabsems &
  923. ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
  924. ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
  925. ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
  926. )
  927. ELSE
  928. CALL wrf_error_fatal ( 'arguments not present for calling cam radiation' )
  929. ENDIF
  930. CASE (RRTMG_LWSCHEME)
  931. CALL wrf_debug (100, 'CALL rrtmg_lw')
  932. CALL RRTMG_LWRAD( &
  933. RTHRATENLW=RTHRATEN, &
  934. LWUPT=LWUPT,LWUPTC=LWUPTC, &
  935. LWDNT=LWDNT,LWDNTC=LWDNTC, &
  936. LWUPB=LWUPB,LWUPBC=LWUPBC, &
  937. LWDNB=LWDNB,LWDNBC=LWDNBC, &
  938. GLW=GLW,OLR=RLWTOA,LWCF=LWCF, &
  939. EMISS=EMISS, &
  940. P8W=p8w,P3D=p,PI3D=pi,DZ8W=dz8w,TSK=tsk,T3D=t, &
  941. T8W=t8w,RHO3D=rho,R=R_d,G=G, &
  942. ICLOUD=icloud,WARM_RAIN=warm_rain,CLDFRA3D=CLDFRA,&
  943. F_ICE_PHY=F_ICE_PHY,F_RAIN_PHY=F_RAIN_PHY, &
  944. XLAND=XLAND,XICE=XICE,SNOW=SNOW, &
  945. QV3D=QV,QC3D=QC,QR3D=QR, &
  946. QI3D=QI,QS3D=QS,QG3D=QG, &
  947. F_QV=F_QV,F_QC=F_QC,F_QR=F_QR, &
  948. F_QI=F_QI,F_QS=F_QS,F_QG=F_QG, &
  949. #ifdef WRF_CHEM
  950. TAUAERLW1=tauaerlw1,TAUAERLW2=tauaerlw2, & ! jcb
  951. TAUAERLW3=tauaerlw3,TAUAERLW4=tauaerlw4, & ! jcb
  952. TAUAERLW5=tauaerlw5,TAUAERLW6=tauaerlw6, & ! jcb
  953. TAUAERLW7=tauaerlw7,TAUAERLW8=tauaerlw8, & ! jcb
  954. TAUAERLW9=tauaerlw9,TAUAERLW10=tauaerlw10, & ! jcb
  955. TAUAERLW11=tauaerlw11,TAUAERLW12=tauaerlw12, & ! jcb
  956. TAUAERLW13=tauaerlw13,TAUAERLW14=tauaerlw14, & ! jcb
  957. TAUAERLW15=tauaerlw15,TAUAERLW16=tauaerlw16, & ! jcb
  958. aer_ra_feedback=aer_ra_feedback, &
  959. !jdfcz progn=progn,prescribe=prescribe, &
  960. progn=progn, &
  961. #endif
  962. QNDROP3D=qndrop,F_QNDROP=f_qndrop, &
  963. IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde,&
  964. IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme,&
  965. ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte,&
  966. LWUPFLX=LWUPFLX,LWUPFLXC=LWUPFLXC, &
  967. LWDNFLX=LWDNFLX,LWDNFLXC=LWDNFLXC &
  968. )
  969. CASE (HELDSUAREZ)
  970. CALL wrf_debug (100, 'CALL heldsuarez')
  971. CALL HSRAD(RTHRATEN,p8w,p,pi,dz8w,t, &
  972. t8w, rho, R_d,G,CP, dt, xlat, degrad, &
  973. ids,ide, jds,jde, kds,kde, &
  974. ims,ime, jms,jme, kms,kme, &
  975. its,ite, jts,jte, kts,kte )
  976. ! -- add by Jin Kong 10/2011
  977. CASE (FLGLWSCHEME)
  978. CALL wrf_debug (100, 'CALL Fu-Liou-Gu')
  979. flg_lw = .true.
  980. !test Jin Kong 11/01/2011 for ozone
  981. ozflg = 0.
  982. !test over
  983. CALL RAD_FLG( &
  984. peven=p8w,podd=p,t8w=t8w,degrees=t &
  985. ,pi3d=pi,o3=ozflg &
  986. ,G=G,CP=CP &
  987. ,albedo=ALBEDO,tskin=tsk &
  988. ,h2o=QV,cld_iccld=QI,cld_wlcld=QC &
  989. ,cld_prwc=QR,cld_pgwc=QG,cld_snow=QS &
  990. ,F_QV=F_QV,F_QC=F_QC,F_QR=F_QR &
  991. ,F_QI=F_QI,F_QS=F_QS,F_QG=F_QG &
  992. ,warm_rain=warm_rain &
  993. ,cloudstrf=CLDFRA &
  994. ,emiss=EMISS &
  995. ,air_den=rho &
  996. ,dz3d=dz8w &
  997. ,SOLCON=SOLCON &
  998. ,declin=DECLIN &
  999. ,xtime=xtime, xlong=xlong, xlat=xlat &
  1000. ,JULDAY=JULDAY &
  1001. ,gmt=gmt, radt=radt, degrad=degrad &
  1002. ,dtcolumn=dt &
  1003. ,ids=ids,ide=ide,jds=jds,jde=jde &
  1004. ,kds=kds,kde=kde &
  1005. ,ims=ims,idim=ime,jms=jms,jdim=jme &
  1006. ,kms=kms,kmax=kme &
  1007. ,its=its,ite=ite,jts=jts,jte=jte &
  1008. ,kts=kts,kte=kte &
  1009. ,uswtop=RSWTOA,ulwtop=RLWTOA &
  1010. ,NETSWBOT=GSW,DLWBOT=GLW &
  1011. ,DSWBOT=SWDOWN,deltat=RTHRATEN &
  1012. ,dtshort=RTHRATENSW,dtlongwv=RTHRATENLW &
  1013. )
  1014. CALL wrf_debug(100, 'a4 Fu_Liou-Gu')
  1015. ! -- end
  1016. CASE DEFAULT
  1017. WRITE( wrf_err_message , * ) 'The longwave option does not exist: lw_physics = ', lw_physics
  1018. CALL wrf_error_fatal ( wrf_err_message )
  1019. END SELECT lwrad_select
  1020. IF (lw_physics .gt. 0 .and. .not.gfdl_lw) THEN
  1021. DO j=jts,jte
  1022. DO k=kts,kte
  1023. DO i=its,ite
  1024. RTHRATENLW(I,K,J)=RTHRATEN(I,K,J)
  1025. ! OLR ALSO WILL CONTAIN OUTGOING LONGWAVE FOR RRTM (NMM HAS NO OLR ARRAY)
  1026. IF(PRESENT(OLR) .AND. K .EQ. 1)OLR(I,J)=RLWTOA(I,J)
  1027. ENDDO
  1028. ENDDO
  1029. ENDDO
  1030. ENDIF
  1031. IF (lw_physics .eq. goddardlwscheme) THEN
  1032. IF ( PRESENT (tlwdn) ) THEN
  1033. DO j=jts,jte
  1034. DO i=its,ite
  1035. tlwdn(i,j) = erbe_out(i,j,1) ! TOA LW downwelling flux [W/m2]
  1036. tlwup(i,j) = erbe_out(i,j,2) ! TOA LW upwelling flux [W/m2]
  1037. slwdn(i,j) = erbe_out(i,j,3) ! surface LW downwelling flux [W/m2]
  1038. slwup(i,j) = erbe_out(i,j,4) ! surface LW upwelling flux [W/m2]
  1039. ENDDO
  1040. ENDDO
  1041. ENDIF
  1042. ENDIF
  1043. !
  1044. swrad_cldfra_select: SELECT CASE(sw_physics)
  1045. CASE (CAMSWSCHEME)
  1046. IF ( PRESENT ( CLDFRA ) .AND. &
  1047. PRESENT(F_QC) .AND. PRESENT ( F_QI ) ) THEN
  1048. ! Call to cloud fraction routine based on Randall 1994 (Hong Pan 1998)
  1049. CALL cal_cldfra2(CLDFRA,qv,qc,qi,qs, &
  1050. F_QV,F_QC,F_QI,F_QS,t,p, &
  1051. F_ICE_PHY,F_RAIN_PHY, &
  1052. ids,ide, jds,jde, kds,kde, &
  1053. ims,ime, jms,jme, kms,kme, &
  1054. its,ite, jts,jte, kts,kte )
  1055. ENDIF
  1056. CASE (RRTMG_SWSCHEME)
  1057. IF ( PRESENT ( CLDFRA ) .AND. &
  1058. PRESENT(F_QC) .AND. PRESENT ( F_QI ) ) THEN
  1059. ! Call to cloud fraction routine based on Randall 1994 (Hong Pan 1998)
  1060. CALL cal_cldfra2(CLDFRA,qv,qc,qi,qs, &
  1061. F_QV,F_QC,F_QI,F_QS,t,p, &
  1062. F_ICE_PHY,F_RAIN_PHY, &
  1063. ids,ide, jds,jde, kds,kde, &
  1064. ims,ime, jms,jme, kms,kme, &
  1065. its,ite, jts,jte, kts,kte )
  1066. ENDIF
  1067. CASE DEFAULT
  1068. END SELECT swrad_cldfra_select
  1069. swrad_select: SELECT CASE(sw_physics)
  1070. CASE (SWRADSCHEME)
  1071. CALL wrf_debug(100, 'CALL swrad')
  1072. CALL SWRAD( &
  1073. DT=dt,RTHRATEN=rthraten,GSW=gsw &
  1074. ,XLAT=xlat,XLONG=xlong,ALBEDO=albedo &
  1075. #ifdef WRF_CHEM
  1076. ,PM2_5_DRY=pm2_5_dry,PM2_5_WATER=pm2_5_water &
  1077. ,PM2_5_DRY_EC=pm2_5_dry_ec &
  1078. #endif
  1079. ,RHO_PHY=rho,T3D=t &
  1080. ,P3D=p,PI3D=pi,DZ8W=dz8w,GMT=gmt &
  1081. ,R=r_d,CP=cp,G=g,JULDAY=julday &
  1082. ,XTIME=xtime,DECLIN=declin,SOLCON=solcon &
  1083. ,RADFRQ=radt,ICLOUD=icloud,DEGRAD=degrad &
  1084. ,warm_rain=warm_rain &
  1085. ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
  1086. ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
  1087. ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
  1088. ,QV3D=qv &
  1089. ,QC3D=qc &
  1090. ,QR3D=qr &
  1091. ,QI3D=qi &
  1092. ,QS3D=qs &
  1093. ,QG3D=qg &
  1094. ,F_QV=f_qv,F_QC=f_qc,F_QR=f_qr &
  1095. ,F_QI=f_qi,F_QS=f_qs,F_QG=f_qg )
  1096. CASE (GSFCSWSCHEME)
  1097. CALL wrf_debug(100, 'CALL gsfcswrad')
  1098. CALL GSFCSWRAD( &
  1099. RTHRATEN=rthraten,GSW=gsw,XLAT=xlat,XLONG=xlong &
  1100. ,ALB=albedo,T3D=t,P3D=p,P8W3D=p8w,pi3D=pi &
  1101. ,DZ8W=dz8w,RHO_PHY=rho &
  1102. ,CLDFRA3D=cldfra,RSWTOA=rswtoa &
  1103. ,GMT=gmt,CP=cp,G=g &
  1104. ,JULDAY=julday,XTIME=xtime &
  1105. ,DECLIN=declin,SOLCON=solcon &
  1106. ,RADFRQ=radt,DEGRAD=degrad &
  1107. ,TAUCLDI=taucldi,TAUCLDC=taucldc &
  1108. ,WARM_RAIN=warm_rain &
  1109. #ifdef WRF_CHEM
  1110. ,TAUAER300=tauaer300,TAUAER400=tauaer400 & ! jcb
  1111. ,TAUAER600=tauaer600,TAUAER999=tauaer999 & ! jcb
  1112. ,GAER300=gaer300,GAER400=gaer400 & ! jcb
  1113. ,GAER600=gaer600,GAER999=gaer999 & ! jcb
  1114. ,WAER300=waer300,WAER400=waer400 & ! jcb
  1115. ,WAER600=waer600,WAER999=waer999 & ! jcb
  1116. ,aer_ra_feedback=aer_ra_feedback &
  1117. #endif
  1118. ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
  1119. ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
  1120. ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
  1121. ,QV3D=qv &
  1122. ,QC3D=qc &
  1123. ,QR3D=qr &
  1124. ,QI3D=qi &
  1125. ,QS3D=qs &
  1126. ,QG3D=qg &
  1127. ,QNDROP3D=qndrop &
  1128. ,F_QV=f_qv,F_QC=f_qc,F_QR=f_qr &
  1129. ,F_QI=f_qi,F_QS=f_qs,F_QG=f_qg &
  1130. ,F_QNDROP=f_qndrop &
  1131. )
  1132. CASE (goddardswscheme)
  1133. CALL wrf_debug(100, 'CALL goddard shortwave radiation scheme ')
  1134. IF (itimestep.eq.1) then
  1135. call wrf_message('running goddard sw radiation')
  1136. ENDIF
  1137. CALL goddardrad(sw_or_lw='sw' &
  1138. ,rthraten=rthraten,gsf=gsw,xlat=xlat,xlong=xlong &
  1139. ,alb=albedo,t3d=t,p3d=p,p8w3d=p8w,pi3d=pi &
  1140. ,dz8w=dz8w,rho_phy=rho,emiss=emiss &
  1141. ,cldfra3d=cldfra &
  1142. ,gmt=gmt,cp=cp,g=g,t8w=t8w &
  1143. ,julday=julday,xtime=xtime &
  1144. ,declin=declin,solcon=solcon &
  1145. , center_lat = cen_lat &
  1146. ,radfrq=radt,degrad=degrad &
  1147. ,taucldi=taucldi,taucldc=taucldc &
  1148. ,warm_rain=warm_rain &
  1149. ,ids=ids,ide=ide, jds=jds,jde=jde, kds=kds,kde=kde &
  1150. ,ims=ims,ime=ime, jms=jms,jme=jme, kms=kms,kme=kme &
  1151. ,its=its,ite=ite, jts=jts,jte=jte, kts=kts,kte=kte &
  1152. ! ,cosz_urb2d=cosz_urb2d ,omg_urb2d=omg_urb2d & !urban
  1153. ,qv3d=qv &
  1154. ,qc3d=qc &
  1155. ,qr3d=qr &
  1156. ,qi3d=qi &
  1157. ,qs3d=qs &
  1158. ,qg3d=qg &
  1159. ,f_qv=f_qv,f_qc=f_qc,f_qr=f_qr &
  1160. ,f_qi=f_qi,f_qs=f_qs,f_qg=f_qg &
  1161. ,erbe_out=erbe_out & !optional
  1162. )
  1163. CASE (CAMSWSCHEME)
  1164. CALL wrf_debug(100, 'CALL camrad sw')
  1165. IF ( PRESENT( OZMIXM ) .AND. PRESENT( PIN ) .AND. &
  1166. PRESENT(M_PS_1) .AND. PRESENT(M_PS_2) .AND. &
  1167. PRESENT(M_HYBI0) .AND. PRESENT(AEROSOLC_1) &
  1168. .AND. PRESENT(AEROSOLC_2) .AND. PRESENT(ALSWVISDIR)) THEN
  1169. CALL CAMRAD(RTHRATENLW=RTHRATEN,RTHRATENSW=RTHRATENSW, &
  1170. dolw=.false.,dosw=.true., &
  1171. SWUPT=SWUPT,SWUPTC=SWUPTC, &
  1172. SWDNT=SWDNT,SWDNTC=SWDNTC, &
  1173. LWUPT=LWUPT,LWUPTC=LWUPTC, &
  1174. LWDNT=LWDNT,LWDNTC=LWDNTC, &
  1175. SWUPB=SWUPB,SWUPBC=SWUPBC, &
  1176. SWDNB=SWDNB,SWDNBC=SWDNBC, &
  1177. LWUPB=LWUPB,LWUPBC=LWUPBC, &
  1178. LWDNB=LWDNB,LWDNBC=LWDNBC, &
  1179. SWCF=SWCF,LWCF=LWCF,OLR=RLWTOA,CEMISS=CEMISS, &
  1180. TAUCLDC=TAUCLDC,TAUCLDI=TAUCLDI,COSZR=COSZR, &
  1181. GSW=GSW,GLW=GLW,XLAT=XLAT,XLONG=XLONG, &
  1182. ALBEDO=ALBEDO,t_phy=t,TSK=TSK,EMISS=EMISS &
  1183. ,QV3D=qv &
  1184. ,QC3D=qc &
  1185. ,QR3D=qr &
  1186. ,QI3D=qi &
  1187. ,QS3D=qs &
  1188. ,QG3D=qg &
  1189. ,ALSWVISDIR=alswvisdir ,ALSWVISDIF=alswvisdif & !fds ssib alb comp (06/2010)
  1190. ,ALSWNIRDIR=alswnirdir ,ALSWNIRDIF=alswnirdif & !fds ssib alb comp (06/2010)
  1191. ,SWVISDIR=swvisdir ,SWVISDIF=swvisdif & !fds ssib swr comp (06/2010)
  1192. ,SWNIRDIR=swnirdir ,SWNIRDIF=swnirdif & !fds ssib swr comp (06/2010)
  1193. ,SF_SURFACE_PHYSICS=sf_surface_physics & !fds
  1194. ,F_QV=f_qv,F_QC=f_qc,F_QR=f_qr &
  1195. ,F_QI=f_qi,F_QS=f_qs,F_QG=f_qg &
  1196. ,f_ice_phy=f_ice_phy,f_rain_phy=f_rain_phy &
  1197. ,p_phy=p,p8w=p8w,z=z,pi_phy=pi,rho_phy=rho, &
  1198. dz8w=dz8w, &
  1199. CLDFRA=CLDFRA,XLAND=XLAND,XICE=XICE,SNOW=SNOW, &
  1200. ozmixm=ozmixm,pin0=pin,levsiz=levsiz, &
  1201. num_months=n_ozmixm, &
  1202. m_psp=m_ps_1,m_psn=m_ps_2,aerosolcp=aerosolc_1, &
  1203. aerosolcn=aerosolc_2,m_hybi0=m_hybi0, &
  1204. paerlev=paerlev, naer_c=n_aerosolc, &
  1205. cam_abs_dim1=cam_abs_dim1, cam_abs_dim2=cam_abs_dim2, &
  1206. GMT=GMT,JULDAY=JULDAY,JULIAN=JULIAN,YR=YR,DT=DT,XTIME=XTIME,DECLIN=DECLIN, &
  1207. SOLCON=SOLCON,RADT=RADT,DEGRAD=DEGRAD,n_cldadv=3 &
  1208. ,abstot_3d=abstot,absnxt_3d=absnxt,emstot_3d=emstot &
  1209. ,doabsems=doabsems &
  1210. ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
  1211. ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
  1212. ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
  1213. )
  1214. ELSE
  1215. CALL wrf_error_fatal ( 'arguments not present for calling cam radiation' )
  1216. ENDIF
  1217. DO j=jts,jte
  1218. DO k=kts,kte
  1219. DO i=its,ite
  1220. RTHRATEN(I,K,J)=RTHRATEN(I,K,J)+RTHRATENSW(I,K,J)
  1221. ENDDO
  1222. ENDDO
  1223. ENDDO
  1224. CASE (RRTMG_SWSCHEME)
  1225. CALL wrf_debug(100, 'CALL rrtmg_sw')
  1226. CALL RRTMG_SWRAD( &
  1227. RTHRATENSW=RTHRATENSW, &
  1228. SWUPT=SWUPT,SWUPTC=SWUPTC, &
  1229. SWDNT=SWDNT,SWDNTC=SWDNTC, &
  1230. SWUPB=SWUPB,SWUPBC=SWUPBC, &
  1231. SWDNB=SWDNB,SWDNBC=SWDNBC, &
  1232. SWCF=SWCF,GSW=GSW, &
  1233. XTIME=XTIME,GMT=GMT,XLAT=XLAT,XLONG=XLONG, &
  1234. RADT=RADT,DEGRAD=DEGRAD,DECLIN=DECLIN, &
  1235. COSZR=COSZR,JULDAY=JULDAY,SOLCON=SOLCON, &
  1236. ALBEDO=ALBEDO,t3d=t,t8w=t8w,TSK=TSK, &
  1237. p3d=p,p8w=p8w,pi3d=pi,rho3d=rho, &
  1238. dz8w=dz8w,CLDFRA3D=CLDFRA,R=R_D,G=G, &
  1239. ICLOUD=icloud,WARM_RAIN=warm_rain, &
  1240. F_ICE_PHY=F_ICE_PHY,F_RAIN_PHY=F_RAIN_PHY, &
  1241. XLAND=XLAND,XICE=XICE,SNOW=SNOW, &
  1242. QV3D=qv,QC3D=qc,QR3D=qr, &
  1243. QI3D=qi,QS3D=qs,QG3D=qg, &
  1244. ALSWVISDIR=alswvisdir ,ALSWVISDIF=alswvisdif, & !Zhenxin ssib alb comp (06/2010)
  1245. ALSWNIRDIR=alswnirdir ,ALSWNIRDIF=alswnirdif, & !Zhenxin ssib alb comp (06/2010)
  1246. SWVISDIR=swvisdir ,SWVISDIF=swvisdif, & !Zhenxin ssib swr comp (06/2010)
  1247. SWNIRDIR=swnirdir ,SWNIRDIF=swnirdif, & !Zhenxin ssib swr comp (06/2010)
  1248. SF_SURFACE_PHYSICS=sf_surface_physics, & !Zhenxin ssib sw_phy (06/2010)
  1249. F_QV=f_qv,F_QC=f_qc,F_QR=f_qr, &
  1250. F_QI=f_qi,F_QS=f_qs,F_QG=f_qg, &
  1251. #ifdef WRF_CHEM
  1252. TAUAER300=tauaer300,TAUAER400=tauaer400, & ! jcb
  1253. TAUAER600=tauaer600,TAUAER999=tauaer999, & ! jcb
  1254. GAER300=gaer300,GAER400=gaer400, & ! jcb
  1255. GAER600=gaer600,GAER999=gaer999, & ! jcb
  1256. WAER300=waer300,WAER400=waer400, & ! jcb
  1257. WAER600=waer600,WAER999=waer999, & ! jcb
  1258. aer_ra_feedback=aer_ra_feedback, &
  1259. !jdfcz progn=progn,prescribe=prescribe, &
  1260. progn=progn, &
  1261. #endif
  1262. QNDROP3D=qndrop,F_QNDROP=f_qndrop, &
  1263. IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde,&
  1264. IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme,&
  1265. ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte,&
  1266. SWUPFLX=SWUPFLX,SWUPFLXC=SWUPFLXC, &
  1267. SWDNFLX=SWDNFLX,SWDNFLXC=SWDNFLXC &
  1268. )
  1269. DO j=jts,jte
  1270. DO k=kts,kte
  1271. DO i=its,ite
  1272. RTHRATEN(I,K,J)=RTHRATEN(I,K,J)+RTHRATENSW(I,K,J)
  1273. ENDDO
  1274. ENDDO
  1275. ENDDO
  1276. CASE (GFDLSWSCHEME)
  1277. CALL wrf_debug (100, 'CALL gfdlsw')
  1278. IF ( PRESENT(F_QV) .AND. PRESENT(F_QC) .AND. &
  1279. PRESENT(F_QS) .AND. PRESENT(qs) .AND. &
  1280. PRESENT(qv) .AND. PRESENT(qc) ) THEN
  1281. IF ( F_QV .AND. F_QC .AND. F_QS ) THEN
  1282. gfdl_sw = .true.
  1283. CALL ETARA( &
  1284. DT=dt,XLAND=xland &
  1285. ,P8W=p8w,DZ8W=dz8w,RHO_PHY=rho,P_PHY=p,T=t &
  1286. ,QV=qv,QW=qc_temp,QI=qi,QS=qs &
  1287. ,TSK2D=tsk,GLW=GLW,RSWIN=SWDOWN,GSW=GSW &
  1288. ,RSWINC=SWDOWNC,CLDFRA=CLDFRA,PI3D=pi &
  1289. ,GLAT=glat,GLON=glon,HTOP=htop,HBOT=hbot &
  1290. ,HBOTR=hbotr, HTOPR=htopr &
  1291. ,ALBEDO=albedo,CUPPT=cuppt &
  1292. ,VEGFRA=vegfra,SNOW=snow,G=g,GMT=gmt &
  1293. ,NSTEPRA=stepra,NPHS=nphs,ITIMESTEP=itimestep &
  1294. ,XTIME=xtime,JULIAN=julian &
  1295. ,JULYR=julyr,JULDAY=julday &
  1296. ,GFDL_LW=gfdl_lw,GFDL_SW=gfdl_sw &
  1297. ,CFRACL=cfracl,CFRACM=cfracm,CFRACH=cfrach &
  1298. ,ACFRST=acfrst,NCFRST=ncfrst &
  1299. ,ACFRCV=acfrcv,NCFRCV=ncfrcv &
  1300. ,RSWTOA=rswtoa,RLWTOA=rlwtoa,CZMEAN=czmean &
  1301. ,THRATEN=rthraten,THRATENLW=rthratenlw &
  1302. ,THRATENSW=rthratensw &
  1303. ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
  1304. ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
  1305. ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
  1306. )
  1307. ELSE
  1308. CALL wrf_error_fatal('Can not call ETARA (2a). Missing moisture fields.')
  1309. ENDIF
  1310. ELSE
  1311. CALL wrf_error_fatal('Can not call ETARA (2b). Missing moisture fields.')
  1312. ENDIF
  1313. #ifdef HWRF
  1314. CASE (HWRFSWSCHEME)
  1315. CALL wrf_debug (100, 'CALL hwrfsw')
  1316. gfdl_sw = .true.
  1317. CALL HWRFRA(DT=dt,thraten=RTHRATEN,thratenlw=RTHRATENLW,thratensw=RTHRATENSW,pi3d=pi, &
  1318. XLAND=xland,P8w=p8w,DZ8w=dz8w,RHO_PHY=rho,P_PHY=p,T=t, &
  1319. QV=qv,QW=qc_temp,QI=Qi, &
  1320. TSK2D=tsk,GLW=GLW,GSW=GSW, &
  1321. TOTSWDN=swdown,TOTLWDN=glw,RSWTOA=rswtoa,RLWTOA=rlwtoa,CZMEAN=czmean, & !Added
  1322. GLAT=glat,GLON=glon,HTOP=htop,HBOT=hbot,htopr=htopr,hbotr=hbotr,ALBEDO=albedo,CUPPT=cuppt, &
  1323. VEGFRA=vegfra,SNOW=snow,G=g,GMT=gmt, & !Modified
  1324. NSTEPRA=stepra,NPHS=nphs,itimestep=itimestep, & !Modified
  1325. julyr=julyr,julday=julday,gfdl_lw=gfdl_lw,gfdl_sw=gfdl_sw, &
  1326. CFRACL=cfracl,CFRACM=cfracm,CFRACH=cfrach, & !Added
  1327. ACFRST=acfrst,NCFRST=ncfrst,ACFRCV=acfrcv,NCFRCV=ncfrcv, & !Added
  1328. ids=ids,ide=ide, jds=jds,jde=jde, kds=kds,kde=kde, &
  1329. ims=ims,ime=ime, jms=jms,jme=jme, kms=kms,kme=kme, &
  1330. its=its,ite=ite, jts=jts,jte=jte, kts=kts,kte=kte )
  1331. #endif
  1332. CASE (0)
  1333. ! Here in case we don't want to call a sw radiation scheme
  1334. ! For example, the Held-Suarez idealized test case
  1335. IF (lw_physics /= HELDSUAREZ) THEN
  1336. WRITE( wrf_err_message , * ) &
  1337. 'You have selected a longwave radiation option, but not a shortwave option (sw_physics = 0, lw_physics = ',lw_physics,')'
  1338. CALL wrf_error_fatal ( wrf_err_message )
  1339. END IF
  1340. ! -- add by Jin Kong 10/2011
  1341. !--- the following FLGSWSCHEME is for testing only
  1342. CASE (FLGSWSCHEME)
  1343. flg_sw = .true.
  1344. !--- No need to do anything since the short and long wave is calculted in one program
  1345. ! -- end
  1346. CASE DEFAULT
  1347. WRITE( wrf_err_message , * ) 'The shortwave option does not exist: sw_physics = ', sw_physics
  1348. CALL wrf_error_fatal ( wrf_err_message )
  1349. END SELECT swrad_select
  1350. IF (sw_physics .eq. goddardswscheme) THEN
  1351. IF ( PRESENT (tswdn) ) THEN
  1352. DO j=jts,jte
  1353. DO i=its,ite
  1354. tswdn(i,j) = erbe_out(i,j,5) ! TOA SW downwelling flux [W/m2]
  1355. tswup(i,j) = erbe_out(i,j,6) ! TOA SW upwelling flux [W/m2]
  1356. sswdn(i,j) = erbe_out(i,j,7) ! surface SW downwelling flux [W/m2]
  1357. sswup(i,j) = erbe_out(i,j,8) ! surface SW upwelling flux [W/m2]
  1358. ENDDO
  1359. ENDDO
  1360. ENDIF
  1361. ENDIF
  1362. IF (sw_physics .gt. 0 .and. .not.gfdl_sw) THEN
  1363. DO j=jts,jte
  1364. DO k=kts,kte
  1365. DO i=its,ite
  1366. RTHRATENSW(I,K,J)=RTHRATEN(I,K,J)-RTHRATENLW(I,K,J)
  1367. ENDDO
  1368. ENDDO
  1369. ENDDO
  1370. DO j=jts,jte
  1371. DO i=its,ite
  1372. SWDOWN(I,J)=GSW(I,J)/(1.-ALBEDO(I,J))
  1373. ENDDO
  1374. ENDDO
  1375. ENDIF
  1376. IF ( PRESENT( qc ) .AND. PRESENT( qc_adjust ) .AND. cu_rad_feedback ) THEN
  1377. DO j=jts,jte
  1378. DO k=kts,kte
  1379. DO i=its,ite
  1380. qc(i,k,j) = qc_save(i,k,j)
  1381. ENDDO
  1382. ENDDO
  1383. ENDDO
  1384. ENDIF
  1385. IF ( PRESENT( qi ) .AND. PRESENT( qi_adjust ) .AND. cu_rad_feedback ) THEN
  1386. DO j=jts,jte
  1387. DO k=kts,kte
  1388. DO i=its,ite
  1389. qi(i,k,j) = qi_save(i,k,j)
  1390. ENDDO
  1391. ENDDO
  1392. ENDDO
  1393. ENDIF
  1394. ENDDO
  1395. !$OMP END PARALLEL DO
  1396. ENDIF Radiation_step
  1397. accumulate_lw_select: SELECT CASE(lw_physics)
  1398. CASE (CAMLWSCHEME,RRTMG_LWSCHEME)
  1399. IF(PRESENT(LWUPTC))THEN
  1400. !$OMP PARALLEL DO &
  1401. !$OMP PRIVATE ( ij ,i,j,k,its,ite,jts,jte)
  1402. DO ij = 1 , num_tiles
  1403. its = i_start(ij)
  1404. ite = i_end(ij)
  1405. jts = j_start(ij)
  1406. jte = j_end(ij)
  1407. DO j=jts,jte
  1408. DO i=its,ite
  1409. ACLWUPT(I,J) = ACLWUPT(I,J) + LWUPT(I,J)*DT
  1410. ACLWUPTC(I,J) = ACLWUPTC(I,J) + LWUPTC(I,J)*DT
  1411. ACLWDNT(I,J) = ACLWDNT(I,J) + LWDNT(I,J)*DT
  1412. ACLWDNTC(I,J) = ACLWDNTC(I,J) + LWDNTC(I,J)*DT
  1413. ACLWUPB(I,J) = ACLWUPB(I,J) + LWUPB(I,J)*DT
  1414. ACLWUPBC(I,J) = ACLWUPBC(I,J) + LWUPBC(I,J)*DT
  1415. ACLWDNB(I,J) = ACLWDNB(I,J) + LWDNB(I,J)*DT
  1416. ACLWDNBC(I,J) = ACLWDNBC(I,J) + LWDNBC(I,J)*DT
  1417. ENDDO
  1418. ENDDO
  1419. ENDDO
  1420. !$OMP END PARALLEL DO
  1421. ENDIF
  1422. CASE DEFAULT
  1423. END SELECT accumulate_lw_select
  1424. accumulate_sw_select: SELECT CASE(sw_physics)
  1425. CASE (CAMSWSCHEME,RRTMG_SWSCHEME)
  1426. IF(PRESENT(SWUPTC))THEN
  1427. !$OMP PARALLEL DO &
  1428. !$OMP PRIVATE ( ij ,i,j,k,its,ite,jts,jte)
  1429. DO ij = 1 , num_tiles
  1430. its = i_start(ij)
  1431. ite = i_end(ij)
  1432. jts = j_start(ij)
  1433. jte = j_end(ij)
  1434. DO j=jts,jte
  1435. DO i=its,ite
  1436. ACSWUPT(I,J) = ACSWUPT(I,J) + SWUPT(I,J)*DT
  1437. ACSWUPTC(I,J) = ACSWUPTC(I,J) + SWUPTC(I,J)*DT
  1438. ACSWDNT(I,J) = ACSWDNT(I,J) + SWDNT(I,J)*DT
  1439. ACSWDNTC(I,J) = ACSWDNTC(I,J) + SWDNTC(I,J)*DT
  1440. ACSWUPB(I,J) = ACSWUPB(I,J) + SWUPB(I,J)*DT
  1441. ACSWUPBC(I,J) = ACSWUPBC(I,J) + SWUPBC(I,J)*DT
  1442. ACSWDNB(I,J) = ACSWDNB(I,J) + SWDNB(I,J)*DT
  1443. ACSWDNBC(I,J) = ACSWDNBC(I,J) + SWDNBC(I,J)*DT
  1444. ENDDO
  1445. ENDDO
  1446. ENDDO
  1447. !$OMP END PARALLEL DO
  1448. ENDIF
  1449. CASE DEFAULT
  1450. END SELECT accumulate_sw_select
  1451. END SUBROUTINE radiation_driver
  1452. SUBROUTINE pre_radiation_driver ( grid, config_flags &
  1453. ,itimestep, ra_call_offset &
  1454. ,XLAT, XLONG, GMT, julian, xtime, RADT, STEPRA &
  1455. ,ht,dx,dy,sina,cosa,shadowmask,slope_rad ,topo_shading &
  1456. ,shadlen,ht_shad,ht_loc &
  1457. ,ht_shad_bxs, ht_shad_bxe &
  1458. ,ht_shad_bys, ht_shad_bye &
  1459. ,nested, min_ptchsz &
  1460. ,spec_bdy_width &
  1461. ,ids, ide, jds, jde, kds, kde &
  1462. ,ims, ime, jms, jme, kms, kme &
  1463. ,ips, ipe, jps, jpe, kps, kpe &
  1464. ,i_start, i_end &
  1465. ,j_start, j_end &
  1466. ,kts, kte &
  1467. ,num_tiles )
  1468. USE module_domain , ONLY : domain
  1469. #ifdef DM_PARALLEL
  1470. USE module_dm , ONLY : ntasks_x,ntasks_y,local_communicator,mytask,ntasks,wrf_dm_minval_integer
  1471. # if (EM_CORE == 1)
  1472. USE module_comm_dm , ONLY : halo_toposhad_sub
  1473. # endif
  1474. #endif
  1475. USE module_bc
  1476. USE module_model_constants
  1477. IMPLICIT NONE
  1478. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  1479. ims,ime, jms,jme, kms,kme, &
  1480. ips,ipe, jps,jpe, kps,kpe, &
  1481. kts,kte, &
  1482. num_tiles
  1483. TYPE(domain) , INTENT(INOUT) :: grid
  1484. TYPE(grid_config_rec_type ) , INTENT(IN ) :: config_flags
  1485. INTEGER, INTENT(IN ) :: itimestep, ra_call_offset, stepra, &
  1486. slope_rad, topo_shading, &
  1487. spec_bdy_width
  1488. INTEGER, INTENT(INOUT) :: min_ptchsz
  1489. INTEGER, DIMENSION(num_tiles), INTENT(IN) :: &
  1490. i_start,i_end,j_start,j_end
  1491. REAL, INTENT(IN ) :: GMT, radt, julian, xtime, dx, dy, shadlen
  1492. REAL, DIMENSION( ims:ime, jms:jme ), &
  1493. INTENT(IN ) :: XLAT, &
  1494. XLONG, &
  1495. HT, &
  1496. SINA, &
  1497. COSA
  1498. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ht_shad,ht_loc
  1499. REAL, DIMENSION( jms:jme , kds:kde , spec_bdy_width ), &
  1500. INTENT(IN ) :: ht_shad_bxs, ht_shad_bxe
  1501. REAL, DIMENSION( ims:ime , kds:kde , spec_bdy_width ), &
  1502. INTENT(IN ) :: ht_shad_bys, ht_shad_bye
  1503. INTEGER, DIMENSION( ims:ime, jms:jme ), &
  1504. INTENT(INOUT) :: shadowmask
  1505. LOGICAL, INTENT(IN ) :: nested
  1506. !Local
  1507. ! For orographic shading
  1508. INTEGER :: niter,ni,psx,psy,idum,jdum,i,j,ij
  1509. REAL :: DECLIN,SOLCON
  1510. ! Determine minimum patch size for slope-dependent radiation
  1511. if (itimestep .eq. 1) then
  1512. psx = ipe-ips+1
  1513. psy = jpe-jps+1
  1514. min_ptchsz = min(psx,psy)
  1515. idum = 0
  1516. jdum = 0
  1517. endif
  1518. # ifdef DM_PARALLEL
  1519. if (itimestep .eq. 1) then
  1520. call wrf_dm_minval_integer (psx,idum,jdum)
  1521. call wrf_dm_minval_integer (psy,idum,jdum)
  1522. min_ptchsz = min(psx,psy)
  1523. endif
  1524. # endif
  1525. ! Topographic shading
  1526. if ((topo_shading.eq.1).and.(itimestep .eq. 1 .or. &
  1527. mod(itimestep,STEPRA) .eq. 1 + ra_call_offset)) then
  1528. !---------------
  1529. ! Calculate constants for short wave radiation
  1530. CALL radconst(XTIME,DECLIN,SOLCON,JULIAN,DEGRAD,DPD)
  1531. ! Make a local copy of terrain height field
  1532. do j=jms,jme
  1533. do i=ims,ime
  1534. ht_loc(i,j) = ht(i,j)
  1535. enddo
  1536. enddo
  1537. ! Determine if iterations are necessary for shadows to propagate from one patch to another
  1538. if ((ids.eq.ips).and.(ide.eq.ipe).and.(jds.eq.jps).and.(jde.eq.jpe)) then
  1539. niter = 1
  1540. else
  1541. niter = int(shadlen/(dx*min_ptchsz)+3)
  1542. endif
  1543. IF( nested ) THEN
  1544. !$OMP PARALLEL DO &
  1545. !$OMP PRIVATE ( ij )
  1546. DO ij = 1 , num_tiles
  1547. CALL spec_bdyfield(ht_shad, &
  1548. ht_shad_bxs, ht_shad_bxe, &
  1549. ht_shad_bys, ht_shad_bye, &
  1550. 'm', config_flags, spec_bdy_width, 2,&
  1551. ids,ide, jds,jde, 1 ,1 , & ! domain dims
  1552. ims,ime, jms,jme, 1 ,1 , & ! memory dims
  1553. ips,ipe, jps,jpe, 1 ,1 , & ! patch dims
  1554. i_start(ij), i_end(ij), &
  1555. j_start(ij), j_end(ij), &
  1556. 1 , 1 )
  1557. ENDDO
  1558. ENDIF
  1559. do ni = 1, niter
  1560. !$OMP PARALLEL DO &
  1561. !$OMP PRIVATE ( ij,i,j )
  1562. do ij = 1 , num_tiles
  1563. call toposhad_init (ht_shad,ht_loc, &
  1564. shadowmask,nested,ni, &
  1565. ids,ide, jds,jde, kds,kde, &
  1566. ims,ime, jms,jme, kms,kme, &
  1567. ips,min(ipe,ide-1), jps,min(jpe,jde-1), kps,kpe, &
  1568. i_start(ij),min(i_end(ij), ide-1),j_start(ij),&
  1569. min(j_end(ij), jde-1), kts, kte )
  1570. enddo
  1571. !$OMP END PARALLEL DO
  1572. !$OMP PARALLEL DO &
  1573. !$OMP PRIVATE ( ij,i,j )
  1574. do ij = 1 , num_tiles
  1575. call toposhad (xlat,xlong,sina,cosa,xtime,gmt,radt,declin, &
  1576. dx,dy,ht_shad,ht_loc,ni, &
  1577. shadowmask,shadlen, &
  1578. ids,ide, jds,jde, kds,kde, &
  1579. ims,ime, jms,jme, kms,kme, &
  1580. ips,min(ipe,ide-1), jps,min(jpe,jde-1), kps,kpe, &
  1581. i_start(ij),min(i_end(ij), ide-1),j_start(ij),&
  1582. min(j_end(ij), jde-1), kts, kte )
  1583. enddo
  1584. !$OMP END PARALLEL DO
  1585. #if defined( DM_PARALLEL ) && (EM_CORE == 1)
  1586. # include "HALO_TOPOSHAD.inc"
  1587. #endif
  1588. enddo
  1589. endif
  1590. END SUBROUTINE pre_radiation_driver
  1591. !---------------------------------------------------------------------
  1592. !BOP
  1593. ! !IROUTINE: radconst - compute radiation terms
  1594. ! !INTERFAC:
  1595. SUBROUTINE radconst(XTIME,DECLIN,SOLCON,JULIAN, &
  1596. DEGRAD,DPD )
  1597. !---------------------------------------------------------------------
  1598. USE module_wrf_error
  1599. IMPLICIT NONE
  1600. !---------------------------------------------------------------------
  1601. ! !ARGUMENTS:
  1602. REAL, INTENT(IN ) :: DEGRAD,DPD,XTIME,JULIAN
  1603. REAL, INTENT(OUT ) :: DECLIN,SOLCON
  1604. REAL :: OBECL,SINOB,SXLONG,ARG, &
  1605. DECDEG,DJUL,RJUL,ECCFAC
  1606. !
  1607. ! !DESCRIPTION:
  1608. ! Compute terms used in radiation physics
  1609. !EOP
  1610. ! for short wave radiation
  1611. DECLIN=0.
  1612. SOLCON=0.
  1613. !-----OBECL : OBLIQUITY = 23.5 DEGREE.
  1614. OBECL=23.5*DEGRAD
  1615. SINOB=SIN(OBECL)
  1616. !-----CALCULATE LONGITUDE OF THE SUN FROM VERNAL EQUINOX:
  1617. IF(JULIAN.GE.80.)SXLONG=DPD*(JULIAN-80.)
  1618. IF(JULIAN.LT.80.)SXLONG=DPD*(JULIAN+285.)
  1619. SXLONG=SXLONG*DEGRAD
  1620. ARG=SINOB*SIN(SXLONG)
  1621. DECLIN=ASIN(ARG)
  1622. DECDEG=DECLIN/DEGRAD
  1623. !----SOLAR CONSTANT ECCENTRICITY FACTOR (PALTRIDGE AND PLATT 1976)
  1624. DJUL=JULIAN*360./365.
  1625. RJUL=DJUL*DEGRAD
  1626. ECCFAC=1.000110+0.034221*COS(RJUL)+0.001280*SIN(RJUL)+0.000719* &
  1627. COS(2*RJUL)+0.000077*SIN(2*RJUL)
  1628. SOLCON=1370.*ECCFAC
  1629. END SUBROUTINE radconst
  1630. !---------------------------------------------------------------------
  1631. !BOP
  1632. ! !IROUTINE: cal_cldfra - Compute cloud fraction
  1633. ! !INTERFACE:
  1634. SUBROUTINE cal_cldfra(CLDFRA,QC,QI,F_QC,F_QI, &
  1635. ids,ide, jds,jde, kds,kde, &
  1636. ims,ime, jms,jme, kms,kme, &
  1637. its,ite, jts,jte, kts,kte )
  1638. !---------------------------------------------------------------------
  1639. IMPLICIT NONE
  1640. !---------------------------------------------------------------------
  1641. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  1642. ims,ime, jms,jme, kms,kme, &
  1643. its,ite, jts,jte, kts,kte
  1644. !
  1645. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(OUT ) :: &
  1646. CLDFRA
  1647. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: &
  1648. QI, &
  1649. QC
  1650. LOGICAL,INTENT(IN) :: F_QC,F_QI
  1651. REAL thresh
  1652. INTEGER:: i,j,k
  1653. ! !DESCRIPTION:
  1654. ! Compute cloud fraction from input ice and cloud water fields
  1655. ! if provided.
  1656. !
  1657. ! Whether QI or QC is active or not is determined from the indices of
  1658. ! the fields into the 4D scalar arrays in WRF. These indices are
  1659. ! P_QI and P_QC, respectively, and they are passed in to the routine
  1660. ! to enable testing to see if QI and QC represent active fields in
  1661. ! the moisture 4D scalar array carried by WRF.
  1662. !
  1663. ! If a field is active its index will have a value greater than or
  1664. ! equal to PARAM_FIRST_SCALAR, which is also an input argument to
  1665. ! this routine.
  1666. !EOP
  1667. !---------------------------------------------------------------------
  1668. thresh=1.0e-6
  1669. IF ( f_qi .AND. f_qc ) THEN
  1670. DO j = jts,jte
  1671. DO k = kts,kte
  1672. DO i = its,ite
  1673. IF ( QC(i,k,j)+QI(I,k,j) .gt. thresh) THEN
  1674. CLDFRA(i,k,j)=1.
  1675. ELSE
  1676. CLDFRA(i,k,j)=0.
  1677. ENDIF
  1678. ENDDO
  1679. ENDDO
  1680. ENDDO
  1681. ELSE IF ( f_qc ) THEN
  1682. DO j = jts,jte
  1683. DO k = kts,kte
  1684. DO i = its,ite
  1685. IF ( QC(i,k,j) .gt. thresh) THEN
  1686. CLDFRA(i,k,j)=1.
  1687. ELSE
  1688. CLDFRA(i,k,j)=0.
  1689. ENDIF
  1690. ENDDO
  1691. ENDDO
  1692. ENDDO
  1693. ELSE
  1694. DO j = jts,jte
  1695. DO k = kts,kte
  1696. DO i = its,ite
  1697. CLDFRA(i,k,j)=0.
  1698. ENDDO
  1699. ENDDO
  1700. ENDDO
  1701. ENDIF
  1702. END SUBROUTINE cal_cldfra
  1703. !BOP
  1704. ! !IROUTINE: cal_cldfra2 - Compute cloud fraction
  1705. ! !INTERFACE:
  1706. ! cal_cldfra_xr - Compute cloud fraction.
  1707. ! Code adapted from that in module_ra_gfdleta.F in WRF_v2.0.3 by James Done
  1708. !!
  1709. !!--- Cloud fraction parameterization follows Randall, 1994
  1710. !! (see Hong et al., 1998)
  1711. !! (modified by Ferrier, Feb '02)
  1712. !
  1713. SUBROUTINE cal_cldfra2(CLDFRA, QV, QC, QI, QS, &
  1714. F_QV, F_QC, F_QI, F_QS, t_phy, p_phy, &
  1715. F_ICE_PHY,F_RAIN_PHY, &
  1716. ids,ide, jds,jde, kds,kde, &
  1717. ims,ime, jms,jme, kms,kme, &
  1718. its,ite, jts,jte, kts,kte )
  1719. !---------------------------------------------------------------------
  1720. IMPLICIT NONE
  1721. !---------------------------------------------------------------------
  1722. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  1723. ims,ime, jms,jme, kms,kme, &
  1724. its,ite, jts,jte, kts,kte
  1725. !
  1726. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(OUT ) :: &
  1727. CLDFRA
  1728. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: &
  1729. QV, &
  1730. QI, &
  1731. QC, &
  1732. QS, &
  1733. t_phy, &
  1734. p_phy
  1735. ! p_phy, &
  1736. ! F_ICE_PHY, &
  1737. ! F_RAIN_PHY
  1738. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
  1739. OPTIONAL, &
  1740. INTENT(IN ) :: &
  1741. F_ICE_PHY, &
  1742. F_RAIN_PHY
  1743. LOGICAL,OPTIONAL,INTENT(IN) :: F_QC,F_QI,F_QV,F_QS
  1744. ! REAL thresh
  1745. INTEGER:: i,j,k
  1746. REAL :: RHUM, tc, esw, esi, weight, qvsw, qvsi, qvs_weight, QIMID, QWMID, QCLD, DENOM, ARG, SUBSAT
  1747. REAL ,PARAMETER :: ALPHA0=100., GAMMA=0.49, QCLDMIN=1.E-12, &
  1748. PEXP=0.25, RHGRID=1.0
  1749. REAL , PARAMETER :: SVP1=0.61078
  1750. REAL , PARAMETER :: SVP2=17.2693882
  1751. REAL , PARAMETER :: SVPI2=21.8745584
  1752. REAL , PARAMETER :: SVP3=35.86
  1753. REAL , PARAMETER :: SVPI3=7.66
  1754. REAL , PARAMETER :: SVPT0=273.15
  1755. REAL , PARAMETER :: r_d = 287.
  1756. REAL , PARAMETER :: r_v = 461.6
  1757. REAL , PARAMETER :: ep_2=r_d/r_v
  1758. ! !DESCRIPTION:
  1759. ! Compute cloud fraction from input ice and cloud water fields
  1760. ! if provided.
  1761. !
  1762. ! Whether QI or QC is active or not is determined from the indices of
  1763. ! the fields into the 4D scalar arrays in WRF. These indices are
  1764. ! P_QI and P_QC, respectively, and they are passed in to the routine
  1765. ! to enable testing to see if QI and QC represent active fields in
  1766. ! the moisture 4D scalar array carried by WRF.
  1767. !
  1768. ! If a field is active its index will have a value greater than or
  1769. ! equal to PARAM_FIRST_SCALAR, which is also an input argument to
  1770. ! this routine.
  1771. !EOP
  1772. !-----------------------------------------------------------------------
  1773. !--- COMPUTE GRID-SCALE CLOUD COVER FOR RADIATION
  1774. ! (modified by Ferrier, Feb '02)
  1775. !
  1776. !--- Cloud fraction parameterization follows Randall, 1994
  1777. ! (see Hong et al., 1998)
  1778. !-----------------------------------------------------------------------
  1779. ! Note: ep_2=287./461.6 Rd/Rv
  1780. ! Note: R_D=287.
  1781. ! Alternative calculation for critical RH for grid saturation
  1782. ! RHGRID=0.90+.08*((100.-DX)/95.)**.5
  1783. ! Calculate saturation mixing ratio weighted according to the fractions of
  1784. ! water and ice.
  1785. ! Following:
  1786. ! Murray, F.W. 1966. ``On the computation of Saturation Vapor Pressure'' J. Appl. Meteor. 6 p.204
  1787. ! es (in mb) = 6.1078 . exp[ a . (T-273.16)/ (T-b) ]
  1788. !
  1789. ! over ice over water
  1790. ! a = 21.8745584 17.2693882
  1791. ! b = 7.66 35.86
  1792. !---------------------------------------------------------------------
  1793. DO j = jts,jte
  1794. DO k = kts,kte
  1795. DO i = its,ite
  1796. tc = t_phy(i,k,j) - SVPT0
  1797. esw = 1000.0 * SVP1 * EXP( SVP2 * tc / ( t_phy(i,k,j) - SVP3 ) )
  1798. esi = 1000.0 * SVP1 * EXP( SVPI2 * tc / ( t_phy(i,k,j) - SVPI3 ) )
  1799. QVSW = EP_2 * esw / ( p_phy(i,k,j) - esw )
  1800. QVSI = EP_2 * esi / ( p_phy(i,k,j) - esi )
  1801. IF ( PRESENT(F_QI) .and. PRESENT(F_QC) .and. PRESENT(F_QS) ) THEN
  1802. ! mji - For MP options 2, 4, 6, 7, 8, etc. (qc = liquid, qi = ice, qs = snow)
  1803. IF ( F_QI .and. F_QC .and. F_QS) THEN
  1804. QCLD = QI(i,k,j)+QC(i,k,j)+QS(i,k,j)
  1805. IF (QCLD .LT. QCLDMIN) THEN
  1806. weight = 0.
  1807. ELSE
  1808. weight = (QI(i,k,j)+QS(i,k,j)) / QCLD
  1809. ENDIF
  1810. ENDIF
  1811. ! mji - For MP options 1 and 3, (qc only)
  1812. ! For MP=1, qc = liquid, for MP=3, qc = liquid or ice depending on temperature
  1813. IF ( F_QC .and. .not. F_QI .and. .not. F_QS ) THEN
  1814. QCLD = QC(i,k,j)
  1815. IF (QCLD .LT. QCLDMIN) THEN
  1816. weight = 0.
  1817. ELSE
  1818. if (t_phy(i,k,j) .gt. 273.15) weight = 0.
  1819. if (t_phy(i,k,j) .le. 273.15) weight = 1.
  1820. ENDIF
  1821. ENDIF
  1822. ! mji - For MP option 5; (qc = liquid, qs = ice)
  1823. IF ( F_QC .and. .not. F_QI .and. F_QS .and. PRESENT(F_ICE_PHY) ) THEN
  1824. ! Mixing ratios of cloud water & total ice (cloud ice + snow).
  1825. ! Mixing ratios of rain are not considered in this scheme.
  1826. ! F_ICE is fraction of ice
  1827. ! F_RAIN is fraction of rain
  1828. QIMID = QS(i,k,j)
  1829. QWMID = QC(i,k,j)
  1830. ! old method
  1831. ! QIMID = QC(i,k,j)*F_ICE_PHY(i,k,j)
  1832. ! QWMID = (QC(i,k,j)-QIMID)*(1.-F_RAIN_PHY(i,k,j))
  1833. !
  1834. !--- Total "cloud" mixing ratio, QCLD. Rain is not part of cloud,
  1835. ! only cloud water + cloud ice + snow
  1836. !
  1837. QCLD=QWMID+QIMID
  1838. IF (QCLD .LT. QCLDMIN) THEN
  1839. weight = 0.
  1840. ELSE
  1841. weight = F_ICE_PHY(i,k,j)
  1842. ENDIF
  1843. ENDIF
  1844. ELSE
  1845. CLDFRA(i,k,j)=0.
  1846. ENDIF ! IF ( F_QI .and. F_QC .and. F_QS)
  1847. QVS_WEIGHT = (1-weight)*QVSW + weight*QVSI
  1848. RHUM=QV(i,k,j)/QVS_WEIGHT !--- Relative humidity
  1849. !
  1850. !--- Determine cloud fraction (modified from original algorithm)
  1851. !
  1852. IF (QCLD .LT. QCLDMIN) THEN
  1853. !
  1854. !--- Assume zero cloud fraction if there is no cloud mixing ratio
  1855. !
  1856. CLDFRA(i,k,j)=0.
  1857. ELSEIF(RHUM.GE.RHGRID)THEN
  1858. !
  1859. !--- Assume cloud fraction of unity if near saturation and the cloud
  1860. ! mixing ratio is at or above the minimum threshold
  1861. !
  1862. CLDFRA(i,k,j)=1.
  1863. ELSE
  1864. !
  1865. !--- Adaptation of original algorithm (Randall, 1994; Zhao, 1995)
  1866. ! modified based on assumed grid-scale saturation at RH=RHgrid.
  1867. !
  1868. SUBSAT=MAX(1.E-10,RHGRID*QVS_WEIGHT-QV(i,k,j))
  1869. DENOM=(SUBSAT)**GAMMA
  1870. ARG=MAX(-6.9, -ALPHA0*QCLD/DENOM) ! <-- EXP(-6.9)=.001
  1871. ! prevent negative values (new)
  1872. RHUM=MAX(1.E-10, RHUM)
  1873. CLDFRA(i,k,j)=(RHUM/RHGRID)**PEXP*(1.-EXP(ARG))
  1874. !! ARG=-1000*QCLD/(RHUM-RHGRID)
  1875. !! ARG=MAX(ARG, ARGMIN)
  1876. !! CLDFRA(i,k,j)=(RHUM/RHGRID)*(1.-EXP(ARG))
  1877. IF (CLDFRA(i,k,j) .LT. .01) CLDFRA(i,k,j)=0.
  1878. ENDIF !--- End IF (QCLD .LT. QCLDMIN) ...
  1879. ENDDO !--- End DO i
  1880. ENDDO !--- End DO k
  1881. ENDDO !--- End DO j
  1882. END SUBROUTINE cal_cldfra2
  1883. SUBROUTINE toposhad_init(ht_shad,ht_loc,shadowmask,nested,iter, &
  1884. ids,ide, jds,jde, kds,kde, &
  1885. ims,ime, jms,jme, kms,kme, &
  1886. ips,ipe, jps,jpe, kps,kpe, &
  1887. its,ite, jts,jte, kts,kte )
  1888. USE module_model_constants
  1889. implicit none
  1890. INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde, &
  1891. ims,ime, jms,jme, kms,kme, &
  1892. ips,ipe, jps,jpe, kps,kpe, &
  1893. its,ite, jts,jte, kts,kte
  1894. LOGICAL, INTENT(IN) :: nested
  1895. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ht_shad, ht_loc
  1896. INTEGER, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: shadowmask
  1897. INTEGER, INTENT(IN) :: iter
  1898. ! Local variables
  1899. INTEGER :: i, j
  1900. if (iter.eq.1) then
  1901. ! Initialize shadow mask
  1902. do j=jts,jte
  1903. do i=its,ite
  1904. shadowmask(i,j) = 0
  1905. ENDDO
  1906. ENDDO
  1907. ! Initialize shading height
  1908. IF ( nested ) THEN ! Do not overwrite input from parent domain
  1909. do j=max(jts,jds+2),min(jte,jde-3)
  1910. do i=max(its,ids+2),min(ite,ide-3)
  1911. ht_shad(i,j) = ht_loc(i,j)-0.001
  1912. ENDDO
  1913. ENDDO
  1914. ELSE
  1915. do j=jts,jte
  1916. do i=its,ite
  1917. ht_shad(i,j) = ht_loc(i,j)-0.001
  1918. ENDDO
  1919. ENDDO
  1920. ENDIF
  1921. IF ( nested ) THEN ! Check if a shadow exceeding the topography height is available at the lateral domain edge from nesting
  1922. if (its.eq.ids) then
  1923. do j=jts,jte
  1924. if (ht_shad(its,j) .gt. ht_loc(its,j)) then
  1925. shadowmask(its,j) = 1
  1926. ht_loc(its,j) = ht_shad(its,j)
  1927. endif
  1928. if (ht_shad(its+1,j) .gt. ht_loc(its+1,j)) then
  1929. shadowmask(its+1,j) = 1
  1930. ht_loc(its+1,j) = ht_shad(its+1,j)
  1931. endif
  1932. enddo
  1933. endif
  1934. if (ite.eq.ide-1) then
  1935. do j=jts,jte
  1936. if (ht_shad(ite,j) .gt. ht_loc(ite,j)) then
  1937. shadowmask(ite,j) = 1
  1938. ht_loc(ite,j) = ht_shad(ite,j)
  1939. endif
  1940. if (ht_shad(ite-1,j) .gt. ht_loc(ite-1,j)) then
  1941. shadowmask(ite-1,j) = 1
  1942. ht_loc(ite-1,j) = ht_shad(ite-1,j)
  1943. endif
  1944. enddo
  1945. endif
  1946. if (jts.eq.jds) then
  1947. do i=its,ite
  1948. if (ht_shad(i,jts) .gt. ht_loc(i,jts)) then
  1949. shadowmask(i,jts) = 1
  1950. ht_loc(i,jts) = ht_shad(i,jts)
  1951. endif
  1952. if (ht_shad(i,jts+1) .gt. ht_loc(i,jts+1)) then
  1953. shadowmask(i,jts+1) = 1
  1954. ht_loc(i,jts+1) = ht_shad(i,jts+1)
  1955. endif
  1956. enddo
  1957. endif
  1958. if (jte.eq.jde-1) then
  1959. do i=its,ite
  1960. if (ht_shad(i,jte) .gt. ht_loc(i,jte)) then
  1961. shadowmask(i,jte) = 1
  1962. ht_loc(i,jte) = ht_shad(i,jte)
  1963. endif
  1964. if (ht_shad(i,jte-1) .gt. ht_loc(i,jte-1)) then
  1965. shadowmask(i,jte-1) = 1
  1966. ht_loc(i,jte-1) = ht_shad(i,jte-1)
  1967. endif
  1968. enddo
  1969. endif
  1970. ENDIF
  1971. else
  1972. ! Fill the local topography field at the points next to internal tile boundaries with ht_shad values
  1973. ! A 2-pt halo has been applied to the ht_shad before the repeated call of this subroutine
  1974. if ((its.ne.ids).and.(its.eq.ips)) then
  1975. do j=jts-2,jte+2
  1976. ht_loc(its-1,j) = max(ht_loc(its-1,j),ht_shad(its-1,j))
  1977. ht_loc(its-2,j) = max(ht_loc(its-2,j),ht_shad(its-2,j))
  1978. enddo
  1979. endif
  1980. if ((ite.ne.ide-1).and.(ite.eq.ipe)) then
  1981. do j=jts-2,jte+2
  1982. ht_loc(ite+1,j) = max(ht_loc(ite+1,j),ht_shad(ite+1,j))
  1983. ht_loc(ite+2,j) = max(ht_loc(ite+2,j),ht_shad(ite+2,j))
  1984. enddo
  1985. endif
  1986. if ((jts.ne.jds).and.(jts.eq.jps)) then
  1987. do i=its-2,ite+2
  1988. ht_loc(i,jts-1) = max(ht_loc(i,jts-1),ht_shad(i,jts-1))
  1989. ht_loc(i,jts-2) = max(ht_loc(i,jts-2),ht_shad(i,jts-2))
  1990. enddo
  1991. endif
  1992. if ((jte.ne.jde-1).and.(jte.eq.jpe)) then
  1993. do i=its-2,ite+2
  1994. ht_loc(i,jte+1) = max(ht_loc(i,jte+1),ht_shad(i,jte+1))
  1995. ht_loc(i,jte+2) = max(ht_loc(i,jte+2),ht_shad(i,jte+2))
  1996. enddo
  1997. endif
  1998. endif
  1999. END SUBROUTINE toposhad_init
  2000. SUBROUTINE toposhad(xlat,xlong,sina,cosa,xtime,gmt,radfrq,declin, &
  2001. dx,dy,ht_shad,ht_loc,iter, &
  2002. shadowmask,shadlen, &
  2003. ids,ide, jds,jde, kds,kde, &
  2004. ims,ime, jms,jme, kms,kme, &
  2005. ips,ipe, jps,jpe, kps,kpe, &
  2006. its,ite, jts,jte, kts,kte )
  2007. USE module_model_constants
  2008. implicit none
  2009. INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde, &
  2010. ims,ime, jms,jme, kms,kme, &
  2011. ips,ipe, jps,jpe, kps,kpe, &
  2012. its,ite, jts,jte, kts,kte
  2013. INTEGER, INTENT(IN) :: iter
  2014. REAL, INTENT(IN) :: RADFRQ,XTIME,DECLIN,dx,dy,gmt,shadlen
  2015. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: XLAT, XLONG, sina, cosa
  2016. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ht_shad,ht_loc
  2017. INTEGER, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: shadowmask
  2018. ! Local variables
  2019. REAL :: pi, xt24, wgt, ri, rj, argu, sol_azi, topoelev, dxabs, tloctm, hrang, xxlat, csza
  2020. INTEGER :: gpshad, ii, jj, i1, i2, j1, j2, i, j
  2021. XT24=MOD(XTIME+RADFRQ*0.5,1440.)
  2022. pi = 4.*atan(1.)
  2023. gpshad = int(shadlen/dx+1.)
  2024. if (iter.eq.1) then
  2025. j_loop1: DO J=jts,jte
  2026. i_loop1: DO I=its,ite
  2027. TLOCTM=GMT+XT24/60.+XLONG(i,j)/15.
  2028. HRANG=15.*(TLOCTM-12.)*DEGRAD
  2029. XXLAT=XLAT(i,j)*DEGRAD
  2030. CSZA=SIN(XXLAT)*SIN(DECLIN)+COS(XXLAT)*COS(DECLIN)*COS(HRANG)
  2031. if (csza.lt.1.e-2) then ! shadow mask does not need to be computed
  2032. shadowmask(i,j) = 0
  2033. ht_shad(i,j) = ht_loc(i,j)-0.001
  2034. goto 120
  2035. endif
  2036. ! Solar azimuth angle
  2037. argu=(csza*sin(XXLAT)-sin(DECLIN))/(sin(acos(csza))*cos(XXLAT))
  2038. if (argu.gt.1) argu = 1
  2039. if (argu.lt.-1) argu = -1
  2040. sol_azi = sign(acos(argu),sin(HRANG))+pi ! azimuth angle of the sun
  2041. if (cosa(i,j).ge.0) then
  2042. sol_azi = sol_azi + asin(sina(i,j)) ! rotation towards WRF grid
  2043. else
  2044. sol_azi = sol_azi + pi - asin(sina(i,j))
  2045. endif
  2046. ! Scan for higher surrounding topography
  2047. if ((sol_azi.gt.1.75*pi).or.(sol_azi.lt.0.25*pi)) then ! sun is in the northern quarter
  2048. do jj = j+1,j+gpshad
  2049. ri = i + (jj-j)*tan(sol_azi)
  2050. i1 = int(ri)
  2051. i2 = i1+1
  2052. wgt = ri-i1
  2053. dxabs = sqrt((dy*(jj-j))**2+(dx*(ri-i))**2)
  2054. if ((jj.ge.jpe+1).or.(i1.le.ips-1).or.(i2.ge.ipe+1)) then
  2055. if (shadowmask(i,j).eq.0) shadowmask(i,j) = -1
  2056. goto 120
  2057. endif
  2058. topoelev=atan((wgt*ht_loc(i2,jj)+(1.-wgt)*ht_loc(i1,jj)-ht_loc(i,j))/dxabs)
  2059. if (sin(topoelev).ge.csza) then
  2060. shadowmask(i,j) = 1
  2061. ht_shad(i,j) = max(ht_shad(i,j),ht_loc(i,j)+dxabs*(tan(topoelev)-tan(asin(csza))))
  2062. endif
  2063. enddo
  2064. else if (sol_azi.lt.0.75*pi) then ! sun is in the eastern quarter
  2065. do ii = i+1,i+gpshad
  2066. rj = j - (ii-i)*tan(pi/2.+sol_azi)
  2067. j1 = int(rj)
  2068. j2 = j1+1
  2069. wgt = rj-j1
  2070. dxabs = sqrt((dx*(ii-i))**2+(dy*(rj-j))**2)
  2071. if ((ii.ge.ipe+1).or.(j1.le.jps-1).or.(j2.ge.jpe+1)) then
  2072. if (shadowmask(i,j).eq.0) shadowmask(i,j) = -1
  2073. goto 120
  2074. endif
  2075. topoelev=atan((wgt*ht_loc(ii,j2)+(1.-wgt)*ht_loc(ii,j1)-ht_loc(i,j))/dxabs)
  2076. if (sin(topoelev).ge.csza) then
  2077. shadowmask(i,j) = 1
  2078. ht_shad(i,j) = max(ht_shad(i,j),ht_loc(i,j)+dxabs*(tan(topoelev)-tan(asin(csza))))
  2079. endif
  2080. enddo
  2081. else if (sol_azi.lt.1.25*pi) then ! sun is in the southern quarter
  2082. do jj = j-1,j-gpshad,-1
  2083. ri = i + (jj-j)*tan(sol_azi)
  2084. i1 = int(ri)
  2085. i2 = i1+1
  2086. wgt = ri-i1
  2087. dxabs = sqrt((dy*(jj-j))**2+(dx*(ri-i))**2)
  2088. if ((jj.le.jps-1).or.(i1.le.ips-1).or.(i2.ge.ipe+1)) then
  2089. if (shadowmask(i,j).eq.0) shadowmask(i,j) = -1
  2090. goto 120
  2091. endif
  2092. topoelev=atan((wgt*ht_loc(i2,jj)+(1.-wgt)*ht_loc(i1,jj)-ht_loc(i,j))/dxabs)
  2093. if (sin(topoelev).ge.csza) then
  2094. shadowmask(i,j) = 1
  2095. ht_shad(i,j) = max(ht_shad(i,j),ht_loc(i,j)+dxabs*(tan(topoelev)-tan(asin(csza))))
  2096. endif
  2097. enddo
  2098. else ! sun is in the western quarter
  2099. do ii = i-1,i-gpshad,-1
  2100. rj = j - (ii-i)*tan(pi/2.+sol_azi)
  2101. j1 = int(rj)
  2102. j2 = j1+1
  2103. wgt = rj-j1
  2104. dxabs = sqrt((dx*(ii-i))**2+(dy*(rj-j))**2)
  2105. if ((ii.le.ips-1).or.(j1.le.jps-1).or.(j2.ge.jpe+1)) then
  2106. if (shadowmask(i,j).eq.0) shadowmask(i,j) = -1
  2107. goto 120
  2108. endif
  2109. topoelev=atan((wgt*ht_loc(ii,j2)+(1.-wgt)*ht_loc(ii,j1)-ht_loc(i,j))/dxabs)
  2110. if (sin(topoelev).ge.csza) then
  2111. shadowmask(i,j) = 1
  2112. ht_shad(i,j) = max(ht_shad(i,j),ht_loc(i,j)+dxabs*(tan(topoelev)-tan(asin(csza))))
  2113. endif
  2114. enddo
  2115. endif
  2116. 120 continue
  2117. ENDDO i_loop1
  2118. ENDDO j_loop1
  2119. else ! iteration > 1
  2120. j_loop2: DO J=jts,jte
  2121. i_loop2: DO I=its,ite
  2122. ! if (shadowmask(i,j).eq.-1) then ! this indicates that the search ended at a lateral boundary during iteration 1
  2123. TLOCTM=GMT+XT24/60.+XLONG(i,j)/15.
  2124. HRANG=15.*(TLOCTM-12.)*DEGRAD
  2125. XXLAT=XLAT(i,j)*DEGRAD
  2126. CSZA=SIN(XXLAT)*SIN(DECLIN)+COS(XXLAT)*COS(DECLIN)*COS(HRANG)
  2127. ! Solar azimuth angle
  2128. argu=(csza*sin(XXLAT)-sin(DECLIN))/(sin(acos(csza))*cos(XXLAT))
  2129. if (argu.gt.1) argu = 1
  2130. if (argu.lt.-1) argu = -1
  2131. sol_azi = sign(acos(argu),sin(HRANG))+pi ! azimuth angle of the sun
  2132. if (cosa(i,j).ge.0) then
  2133. sol_azi = sol_azi + asin(sina(i,j)) ! rotation towards WRF grid
  2134. else
  2135. sol_azi = sol_azi + pi - asin(sina(i,j))
  2136. endif
  2137. ! Scan for higher surrounding topography
  2138. if ((sol_azi.gt.1.75*pi).or.(sol_azi.lt.0.25*pi)) then ! sun is in the northern quarter
  2139. do jj = j+1,j+gpshad
  2140. ri = i + (jj-j)*tan(sol_azi)
  2141. i1 = int(ri)
  2142. i2 = i1+1
  2143. wgt = ri-i1
  2144. dxabs = sqrt((dy*(jj-j))**2+(dx*(ri-i))**2)
  2145. if ((jj.ge.min(jde,jpe+3)).or.(i1.le.max(ids-1,ips-3)).or.(i2.ge.min(ide,ipe+3))) goto 220
  2146. topoelev=atan((wgt*ht_loc(i2,jj)+(1.-wgt)*ht_loc(i1,jj)-ht_loc(i,j))/dxabs)
  2147. if (sin(topoelev).ge.csza) then
  2148. shadowmask(i,j) = 1
  2149. ht_shad(i,j) = max(ht_shad(i,j),ht_loc(i,j)+dxabs*(tan(topoelev)-tan(asin(csza))))
  2150. endif
  2151. enddo
  2152. else if (sol_azi.lt.0.75*pi) then ! sun is in the eastern quarter
  2153. do ii = i+1,i+gpshad
  2154. rj = j - (ii-i)*tan(pi/2.+sol_azi)
  2155. j1 = int(rj)
  2156. j2 = j1+1
  2157. wgt = rj-j1
  2158. dxabs = sqrt((dx*(ii-i))**2+(dy*(rj-j))**2)
  2159. if ((ii.ge.min(ide,ipe+3)).or.(j1.le.max(jds-1,jps-3)).or.(j2.ge.min(jde,jpe+3))) goto 220
  2160. topoelev=atan((wgt*ht_loc(ii,j2)+(1.-wgt)*ht_loc(ii,j1)-ht_loc(i,j))/dxabs)
  2161. if (sin(topoelev).ge.csza) then
  2162. shadowmask(i,j) = 1
  2163. ht_shad(i,j) = max(ht_shad(i,j),ht_loc(i,j)+dxabs*(tan(topoelev)-tan(asin(csza))))
  2164. endif
  2165. enddo
  2166. else if (sol_azi.lt.1.25*pi) then ! sun is in the southern quarter
  2167. do jj = j-1,j-gpshad,-1
  2168. ri = i + (jj-j)*tan(sol_azi)
  2169. i1 = int(ri)
  2170. i2 = i1+1
  2171. wgt = ri-i1
  2172. dxabs = sqrt((dy*(jj-j))**2+(dx*(ri-i))**2)
  2173. if ((jj.le.max(jds-1,jps-3)).or.(i1.le.max(ids-1,ips-3)).or.(i2.ge.min(ide,ipe+3))) goto 220
  2174. topoelev=atan((wgt*ht_loc(i2,jj)+(1.-wgt)*ht_loc(i1,jj)-ht_loc(i,j))/dxabs)
  2175. if (sin(topoelev).ge.csza) then
  2176. shadowmask(i,j) = 1
  2177. ht_shad(i,j) = max(ht_shad(i,j),ht_loc(i,j)+dxabs*(tan(topoelev)-tan(asin(csza))))
  2178. endif
  2179. enddo
  2180. else ! sun is in the western quarter
  2181. do ii = i-1,i-gpshad,-1
  2182. rj = j - (ii-i)*tan(pi/2.+sol_azi)
  2183. j1 = int(rj)
  2184. j2 = j1+1
  2185. wgt = rj-j1
  2186. dxabs = sqrt((dx*(ii-i))**2+(dy*(rj-j))**2)
  2187. if ((ii.le.max(ids-1,ips-3)).or.(j1.le.max(jds-1,jps-3)).or.(j2.ge.min(jde,jpe+3))) goto 220
  2188. topoelev=atan((wgt*ht_loc(ii,j2)+(1.-wgt)*ht_loc(ii,j1)-ht_loc(i,j))/dxabs)
  2189. if (sin(topoelev).ge.csza) then
  2190. shadowmask(i,j) = 1
  2191. ht_shad(i,j) = max(ht_shad(i,j),ht_loc(i,j)+dxabs*(tan(topoelev)-tan(asin(csza))))
  2192. endif
  2193. enddo
  2194. endif
  2195. 220 continue
  2196. ! endif
  2197. ENDDO i_loop2
  2198. ENDDO j_loop2
  2199. endif ! iteration
  2200. END SUBROUTINE toposhad
  2201. END MODULE module_radiation_driver