module_radiation_driver.F

References to this file elsewhere.
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 
8 ! !INTERFACE:
9    SUBROUTINE radiation_driver (                                          &
10                itimestep,dt ,lw_physics,sw_physics ,NPHS                  &
11               ,RTHRATENLW ,RTHRATENSW ,RTHRATEN                           &
12               ,ACSWUPT,ACSWUPTC,ACSWDNT,ACSWDNTC                          & ! Optional
13               ,ACSWUPB,ACSWUPBC,ACSWDNB,ACSWDNBC                          & ! Optional
14               ,ACLWUPT,ACLWUPTC,ACLWDNT,ACLWDNTC                          & ! Optional
15               ,ACLWUPB,ACLWUPBC,ACLWDNB,ACLWDNBC                          & ! Optional
16               ,  SWUPT,  SWUPTC,  SWDNT,  SWDNTC                          & ! Optional
17               ,  SWUPB,  SWUPBC,  SWDNB,  SWDNBC                          & ! Optional
18               ,  LWUPT,  LWUPTC,  LWDNT,  LWDNTC                          & ! Optional
19               ,  LWUPB,  LWUPBC,  LWDNB,  LWDNBC                          & ! Optional
20               ,LWCF,SWCF,OLR                                              & ! Optional
21               ,GLW, GSW, SWDOWN, XLAT, XLONG, ALBEDO                      &
22               ,EMISS, rho, p8w, p , pi , dz8w ,t, t8w, GMT                &
23               ,XLAND, XICE, TSK, HTOP,HBOT,HTOPR,HBOTR, CUPPT, VEGFRA, SNOW     &
24               ,julyr, JULDAY, julian, xtime, RADT, STEPRA, ICLOUD, warm_rain     &
25               ,declin_urb,COSZ_URB2D, omg_urb2d                           & !Optional urban
26               ,ra_call_offset,RSWTOA,RLWTOA, CZMEAN                       &
27               ,CFRACL, CFRACM, CFRACH                                     &
28               ,ACFRST,NCFRST,ACFRCV,NCFRCV,SWDOWNC                        &
29               ,z                                                          &
30               ,levsiz, n_ozmixm, n_aerosolc, paerlev                      &
31               ,cam_abs_dim1, cam_abs_dim2, cam_abs_freq_s                 &
32               ,ozmixm,pin                                                 & ! Optional
33               ,m_ps_1,m_ps_2,aerosolc_1,aerosolc_2,m_hybi0                & ! Optional
34               ,abstot, absnxt, emstot                                     & ! Optional
35               ,taucldi, taucldc                                           & ! Optional
36               ,ids, ide, jds, jde, kds, kde                               &
37               ,ims, ime, jms, jme, kms, kme                               &
38               ,i_start, i_end                                             &
39               ,j_start, j_end                                             &
40               ,kts, kte                                                   &
41               ,num_tiles                                                  &
42               ,qv,qc,qr,qi,qs,qg                                          &
43               ,f_qv,f_qc,f_qr,f_qi,f_qs,f_qg                              &
44               ,CLDFRA ,Pb                                                 &
45               ,f_ice_phy,f_rain_phy                                       &
46               ,pm2_5_dry, pm2_5_water, pm2_5_dry_ec                       &
47               ,tauaer300, tauaer400, tauaer600, tauaer999                 & ! jcb
48               ,gaer300, gaer400, gaer600, gaer999                         & ! jcb
49               ,waer300, waer400, waer600, waer999                         & ! jcb
50               ,qc_adjust ,qi_adjust                                       & ! jm
51               ,cu_rad_feedback                                            & ! jm
52 
53                                                                           )
54 
55 !-------------------------------------------------------------------------
56 
57 ! !USES:
58    USE module_state_description, ONLY : RRTMSCHEME, GFDLLWSCHEME        &
59                                        ,SWRADSCHEME, GSFCSWSCHEME       &
60                                        ,GFDLSWSCHEME, CAMLWSCHEME, CAMSWSCHEME
61    USE module_model_constants
62    USE module_wrf_error
63 
64 ! *** add new modules of schemes here
65 
66    USE module_ra_sw
67    USE module_ra_gsfcsw
68    USE module_ra_rrtm
69    USE module_ra_cam
70    USE module_ra_gfdleta
71 
72    !  This driver calls subroutines for the radiation parameterizations.
73    !
74    !  short wave radiation choices:
75    !  1. swrad (19??)
76    !
77    !  long wave radiation choices:
78    !  1. rrtmlwrad
79    !
80 !----------------------------------------------------------------------
81    IMPLICIT NONE
82 !<DESCRIPTION>
83 !
84 ! Radiation_driver is the WRF mediation layer routine that provides the interface to
85 ! to radiation physics packages in the WRF model layer. The radiation
86 ! physics packages to call are chosen by setting the namelist variable
87 ! (Rconfig entry in Registry) to the integer value assigned to the 
88 ! particular package (package entry in Registry). For example, if the
89 ! namelist variable ra_lw_physics is set to 1, this corresponds to the
90 ! Registry Package entry for swradscheme.  Note that the Package
91 ! names in the Registry are defined constants (frame/module_state_description.F)
92 ! in the CASE statements in this routine.
93 !
94 ! Among the arguments is moist, a four-dimensional scalar array storing
95 ! a variable number of moisture tracers, depending on the physics 
96 ! configuration for the WRF run, as determined in the namelist.  The
97 ! highest numbered index of active moisture tracers the integer argument
98 ! n_moist (note: the number of tracers at run time is the quantity
99 ! <tt>n_moist - PARAM_FIRST_SCALAR + 1</tt> , not n_moist. Individual tracers
100 ! may be indexed from moist by the Registry name of the tracer prepended
101 ! with P_; for example P_QC is the index of cloud water. An index 
102 ! represents a valid, active field only if the index is greater than
103 ! or equal to PARAM_FIRST_SCALAR.  PARAM_FIRST_SCALAR and the individual
104 ! indices for each tracer is defined in module_state_description and
105 ! set in <a href=set_scalar_indices_from_config.html>set_scalar_indices_from_config</a> defined in frame/module_configure.F.
106 !
107 ! Physics drivers in WRF 2.0 and higher, originally model-layer 
108 ! routines, have been promoted to mediation layer routines and they
109 ! contain OpenMP threaded loops over tiles.  Thus, physics drivers
110 ! are called from single-threaded regions in the solver. The physics
111 ! routines that are called from the physics drivers are model-layer
112 ! routines and fully tile-callable and thread-safe.
113 !</DESCRIPTION>
114 ! 
115 !======================================================================
116 ! Grid structure in physics part of WRF
117 !----------------------------------------------------------------------
118 ! The horizontal velocities used in the physics are unstaggered
119 ! relative to temperature/moisture variables. All predicted
120 ! variables are carried at half levels except w, which is at full
121 ! levels. Some arrays with names (*8w) are at w (full) levels.
122 !
123 !----------------------------------------------------------------------
124 ! In WRF, kms (smallest number) is the bottom level and kme (largest
125 ! number) is the top level.  In your scheme, if 1 is at the top level,
126 ! then you have to reverse the order in the k direction.
127 !
128 !         kme      -   half level (no data at this level)
129 !         kme    ----- full level
130 !         kme-1    -   half level
131 !         kme-1  ----- full level
132 !         .
133 !         .
134 !         .
135 !         kms+2    -   half level
136 !         kms+2  ----- full level
137 !         kms+1    -   half level
138 !         kms+1  ----- full level
139 !         kms      -   half level
140 !         kms    ----- full level
141 !
142 !======================================================================
143 ! Grid structure in physics part of WRF
144 ! 
145 !-------------------------------------
146 ! The horizontal velocities used in the physics are unstaggered 
147 ! relative to temperature/moisture variables. All predicted 
148 ! variables are carried at half levels except w, which is at full 
149 ! levels. Some arrays with names (*8w) are at w (full) levels.
150 !
151 !==================================================================
152 ! Definitions
153 !-----------
154 ! Theta      potential temperature (K)
155 ! Qv         water vapor mixing ratio (kg/kg)
156 ! Qc         cloud water mixing ratio (kg/kg)
157 ! Qr         rain water mixing ratio (kg/kg)
158 ! Qi         cloud ice mixing ratio (kg/kg)
159 ! Qs         snow mixing ratio (kg/kg)
160 !-----------------------------------------------------------------
161 !-- PM2_5_DRY     Dry PM2.5 aerosol mass for all species (ug m^-3)
162 !-- PM2_5_WATER   PM2.5 water mass (ug m^-3)
163 !-- PM2_5_DRY_EC  Dry PM2.5 elemental carbon aersol mass (ug m^-3)
164 !-- RTHRATEN      Theta tendency 
165 !                 due to radiation (K/s)
166 !-- RTHRATENLW    Theta tendency 
167 !                 due to long wave radiation (K/s)
168 !-- RTHRATENSW    Theta temperature tendency 
169 !                 due to short wave radiation (K/s)
170 !-- dt            time step (s)
171 !-- itimestep     number of time steps
172 !-- GLW           downward long wave flux at ground surface (W/m^2)
173 !-- GSW           net short wave flux at ground surface (W/m^2)
174 !-- SWDOWN        downward short wave flux at ground surface (W/m^2)
175 !-- SWDOWNC       clear-sky downward short wave flux at ground surface (W/m^2; optional; for AQ)
176 !-- XLAT          latitude, south is negative (degree)
177 !-- XLONG         longitude, west is negative (degree)
178 !-- ALBEDO                albedo (between 0 and 1)
179 !-- CLDFRA        cloud fraction (between 0 and 1)
180 !-- EMISS         surface emissivity (between 0 and 1)
181 !-- rho_phy       density (kg/m^3)
182 !-- rr            dry air density (kg/m^3)
183 !-- moist         moisture array (4D - last index is species) (kg/kg)
184 !-- n_moist       number of moisture species
185 !-- p8w           pressure at full levels (Pa)
186 !-- p_phy         pressure (Pa)
187 !-- Pb            base-state pressure (Pa)
188 !-- pi_phy        exner function (dimensionless)
189 !-- dz8w          dz between full levels (m)
190 !-- t_phy         temperature (K)
191 !-- t8w           temperature at full levels (K)
192 !-- GMT           Greenwich Mean Time Hour of model start (hour)
193 !-- JULDAY        the initial day (Julian day)
194 !-- RADT          time for calling radiation (min)
195 !-- ra_call_offset -1 (old) means usually just before output, 0 after
196 !-- DEGRAD        conversion factor for 
197 !                 degrees to radians (pi/180.) (rad/deg)
198 !-- DPD           degrees per day for earth's 
199 !                 orbital position (deg/day)
200 !-- R_d           gas constant for dry air (J/kg/K)
201 !-- CP            heat capacity at constant pressure for dry air (J/kg/K)
202 !-- G             acceleration due to gravity (m/s^2)
203 !-- rvovrd        R_v divided by R_d (dimensionless)
204 !-- XTIME         time since simulation start (min)
205 !-- DECLIN        solar declination angle (rad)
206 !-- SOLCON        solar constant (W/m^2)
207 !-- ids           start index for i in domain
208 !-- ide           end index for i in domain
209 !-- jds           start index for j in domain
210 !-- jde           end index for j in domain
211 !-- kds           start index for k in domain
212 !-- kde           end index for k in domain
213 !-- ims           start index for i in memory
214 !-- ime           end index for i in memory
215 !-- jms           start index for j in memory
216 !-- jme           end index for j in memory
217 !-- kms           start index for k in memory
218 !-- kme           end index for k in memory
219 !-- i_start       start indices for i in tile
220 !-- i_end         end indices for i in tile
221 !-- j_start       start indices for j in tile
222 !-- j_end         end indices for j in tile
223 !-- kts           start index for k in tile
224 !-- kte           end index for k in tile
225 !-- num_tiles     number of tiles
226 !
227 !==================================================================
228 !
229    INTEGER,      INTENT(IN   )    ::   ids,ide, jds,jde, kds,kde, &
230                                        ims,ime, jms,jme, kms,kme, &
231                                                          kts,kte, &
232                                        num_tiles
233 
234    INTEGER, INTENT(IN)            :: lw_physics, sw_physics
235 
236    INTEGER, DIMENSION(num_tiles), INTENT(IN) ::                       &
237      &           i_start,i_end,j_start,j_end
238 
239    INTEGER,      INTENT(IN   )    ::   STEPRA,ICLOUD,ra_call_offset
240    INTEGER,      INTENT(IN   )    ::   levsiz, n_ozmixm
241    INTEGER,      INTENT(IN   )    ::   paerlev, n_aerosolc, cam_abs_dim1, cam_abs_dim2
242    REAL,      INTENT(IN   )       ::   cam_abs_freq_s
243 
244    LOGICAL,      INTENT(IN   )    ::   warm_rain
245 
246    REAL,      INTENT(IN   )       ::   RADT
247 
248    REAL, DIMENSION( ims:ime, jms:jme ),                           &
249          INTENT(IN   )  ::                                 XLAND, &
250                                                             XICE, &
251                                                              TSK, &
252                                                           VEGFRA, &
253                                                             SNOW 
254    REAL,  DIMENSION( ims:ime, levsiz, jms:jme, n_ozmixm ),  OPTIONAL,    &
255           INTENT(IN   ) ::                                  OZMIXM
256 
257    REAL,  DIMENSION(levsiz), OPTIONAL, INTENT(IN )  ::     PIN
258 
259    REAL,  DIMENSION(ims:ime,jms:jme), OPTIONAL, INTENT(IN )  ::      m_ps_1,m_ps_2
260    REAL,  DIMENSION( ims:ime, paerlev, jms:jme, n_aerosolc ), OPTIONAL, &
261           INTENT(IN   ) ::                       aerosolc_1, aerosolc_2
262    REAL,  DIMENSION(paerlev), OPTIONAL, &
263           INTENT(IN   ) ::                           m_hybi0
264 
265    REAL, DIMENSION( ims:ime, jms:jme ),                           &
266          INTENT(INOUT)  ::                                  HTOP, &
267                                                             HBOT, &
268                                                            HTOPR, &
269                                                            HBOTR, &
270                                                            CUPPT
271 
272    INTEGER, INTENT(IN   )  ::   julyr
273 !
274    REAL, DIMENSION( ims:ime, kms:kme, jms:jme ),                  &
275          INTENT(IN ) ::                                     dz8w, &
276                                                                z, &
277                                                              p8w, &
278                                                                p, &
279                                                               pi, &
280                                                                t, &
281                                                              t8w, &
282                                                              rho
283 !
284    REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), OPTIONAL ,       &
285          INTENT(IN ) ::  tauaer300,tauaer400,tauaer600,tauaer999, & ! jcb
286                                  gaer300,gaer400,gaer600,gaer999, & ! jcb
287                                  waer300,waer400,waer600,waer999, & ! jcb
288                                  qc_adjust, qi_adjust
289 
290    LOGICAL, OPTIONAL :: cu_rad_feedback
291 
292 !
293 ! variables for aerosols (only if running with chemistry)
294 !
295    REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), OPTIONAL ,       &
296          INTENT(IN ) ::                                pm2_5_dry, &
297                                                      pm2_5_water, &
298                                                     pm2_5_dry_ec
299 !
300    REAL, DIMENSION( ims:ime, kms:kme, jms:jme ),                  &
301          INTENT(INOUT)  ::                              RTHRATEN, &
302                                                       RTHRATENLW, &
303                                                       RTHRATENSW
304 
305 !  REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), OPTIONAL ,       &
306 !        INTENT(INOUT)  ::                                  SWUP, &
307 !                                                           SWDN, &
308 !                                                      SWUPCLEAR, &
309 !                                                      SWDNCLEAR, &
310 !                                                           LWUP, &
311 !                                                           LWDN, &
312 !                                                      LWUPCLEAR, &
313 !                                                      LWDNCLEAR
314 
315    REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT) ::&
316                       ACSWUPT,ACSWUPTC,ACSWDNT,ACSWDNTC,          &
317                       ACSWUPB,ACSWUPBC,ACSWDNB,ACSWDNBC,          &
318                       ACLWUPT,ACLWUPTC,ACLWDNT,ACLWDNTC,          &
319                       ACLWUPB,ACLWUPBC,ACLWDNB,ACLWDNBC
320    REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT) ::&
321                         SWUPT,  SWUPTC,  SWDNT,  SWDNTC,          &
322                         SWUPB,  SWUPBC,  SWDNB,  SWDNBC,          &
323                         LWUPT,  LWUPTC,  LWDNT,  LWDNTC,          &
324                         LWUPB,  LWUPBC,  LWDNB,  LWDNBC
325 
326    REAL, DIMENSION( ims:ime, jms:jme ),          OPTIONAL ,       &
327          INTENT(INOUT)  ::                                  SWCF, &
328                                                             LWCF, &
329                                                              OLR
330 
331 
332 !
333    REAL, DIMENSION( ims:ime, jms:jme ),                           &
334          INTENT(IN   )  ::                                  XLAT, &
335                                                            XLONG, &
336                                                           ALBEDO, &
337                                                            EMISS
338 !
339    REAL, DIMENSION( ims:ime, jms:jme ),                           &
340          INTENT(INOUT)  ::                                   GSW, &
341                                                              GLW
342 
343    REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT)  ::   SWDOWN
344 !
345    REAL, INTENT(IN  )   ::                                GMT,dt, &
346                                                    julian, xtime
347 !
348    INTEGER, INTENT(IN  ) ::                    JULDAY, itimestep
349 
350    INTEGER,INTENT(IN)                                       :: NPHS
351    REAL, DIMENSION( ims:ime, jms:jme ),INTENT(OUT)          ::    &
352                                                       CFRACH,     & !Added
353                                                       CFRACL,     & !Added
354                                                       CFRACM,     & !Added
355                                                       CZMEAN        !Added
356    REAL, DIMENSION( ims:ime, jms:jme ),                           &
357          INTENT(INOUT)  ::                                        &
358                                                       RLWTOA,     & !Added
359                                                       RSWTOA,     & !Added
360                                                       ACFRST,     & !Added
361                                                       ACFRCV        !Added
362 
363    INTEGER,DIMENSION( ims:ime, jms:jme ),INTENT(INOUT)        ::  &
364                                                           NCFRST, &  !Added
365                                                           NCFRCV     !Added
366 ! Optional (only used by CAM lw scheme)
367 
368    REAL, DIMENSION( ims:ime, kms:kme, cam_abs_dim2, jms:jme ), OPTIONAL ,&
369          INTENT(INOUT)  ::                                  abstot
370    REAL, DIMENSION( ims:ime, kms:kme, cam_abs_dim1, jms:jme ), OPTIONAL ,&
371          INTENT(INOUT)  ::                                  absnxt
372    REAL, DIMENSION( ims:ime, kms:kme, jms:jme ),               OPTIONAL ,&
373          INTENT(INOUT)  ::                                  emstot
374 
375 !
376 ! Optional 
377 !
378    REAL, DIMENSION( ims:ime, kms:kme, jms:jme ),                  &
379          OPTIONAL,                                                &
380          INTENT(INOUT) ::                                 CLDFRA
381 
382    REAL, DIMENSION( ims:ime, kms:kme, jms:jme ),                     &
383          OPTIONAL,                                                   &
384          INTENT(IN   ) ::                                            &
385                                                           F_ICE_PHY, &
386                                                          F_RAIN_PHY
387 
388    REAL, DIMENSION( ims:ime, jms:jme ),                           &
389          OPTIONAL,                                                &
390          INTENT(OUT) ::                                   SWDOWNC
391 !
392    REAL, DIMENSION( ims:ime, kms:kme, jms:jme ),                  &
393          OPTIONAL,                                                &
394          INTENT(INOUT ) ::                                        &
395                                                                pb &
396                                                ,qv,qc,qr,qi,qs,qg
397 
398    LOGICAL, OPTIONAL ::             f_qv,f_qc,f_qr,f_qi,f_qs,f_qg
399 !
400    REAL, DIMENSION( ims:ime, kms:kme, jms:jme ),                  &
401          OPTIONAL,                                                &
402          INTENT(INOUT)  ::                       taucldi,taucldc
403  
404 ! LOCAL  VAR
405 
406    REAL, DIMENSION( ims:ime, jms:jme ) ::             GLAT,GLON
407    REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) ::    CEMISS
408    REAL, DIMENSION( ims:ime, jms:jme ) ::             coszr
409 
410    REAL    ::    DECLIN,SOLCON 
411    INTEGER ::    i,j,k,its,ite,jts,jte,ij
412    INTEGER ::    STEPABS
413    LOGICAL ::    gfdl_lw,gfdl_sw
414    LOGICAL ::    doabsems
415    LOGICAL, EXTERNAL :: wrf_dm_on_monitor
416 
417    REAL    ::    OBECL,SINOB,SXLONG,ARG,DECDEG,                  &
418                  DJUL,RJUL,ECCFAC
419    REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) :: qi_temp,qc_temp
420    REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) :: qi_save,qc_save
421 
422 !------------------------------------------------------------------
423 ! urban related variables are added to declaration
424 !-------------------------------------------------
425    REAL, OPTIONAL, INTENT(OUT) :: DECLIN_URB  !urban
426    REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme), INTENT(OUT) :: COSZ_URB2D  !urban
427    REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme), INTENT(OUT) :: omg_urb2d   !urban
428 !------------------------------------------------------------------
429 
430    if (lw_physics .eq. 0 .and. sw_physics .eq. 0)         return
431 
432 ! ra_call_offset = -1 gives old method where radiation may be called just before output
433 ! ra_call_offset =  0 gives new method where radiation may be called just after output
434 !                     and is also consistent with removal of offset in new XTIME
435    Radiation_step: IF (itimestep .eq. 1 .or. mod(itimestep,STEPRA) .eq. 1 + ra_call_offset) THEN
436 
437 ! CAM-specific additional radiation frequency - cam_abs_freq_s (=21600s by default)
438      STEPABS = nint(cam_abs_freq_s/(dt*STEPRA))*STEPRA
439      IF (itimestep .eq. 1 .or. mod(itimestep,STEPABS) .eq. 1 + ra_call_offset) THEN
440        doabsems = .true.
441      ELSE
442        doabsems = .false.
443      ENDIF
444 
445    gfdl_lw = .false.
446    gfdl_sw = .false.
447 
448 !---------------
449    !$OMP PARALLEL DO   &
450    !$OMP PRIVATE ( ij ,i,j,k,its,ite,jts,jte)
451 
452    DO ij = 1 , num_tiles
453      its = i_start(ij)
454      ite = i_end(ij)
455      jts = j_start(ij)
456      jte = j_end(ij)
457 
458 ! initialize data
459 
460      DO j=jts,jte
461      DO i=its,ite
462         GSW(I,J)=0.
463         GLW(I,J)=0.
464         SWDOWN(I,J)=0.
465         GLAT(I,J)=XLAT(I,J)*DEGRAD
466         GLON(I,J)=XLONG(I,J)*DEGRAD
467      ENDDO
468      ENDDO
469 
470      DO j=jts,jte
471      DO k=kts,kte+1
472      DO i=its,ite
473         RTHRATEN(I,K,J)=0.
474 !        SWUP(I,K,J) = 0.0
475 !        SWDN(I,K,J) = 0.0
476 !        SWUPCLEAR(I,K,J) = 0.0
477 !        SWDNCLEAR(I,K,J) = 0.0
478 !        LWUP(I,K,J) = 0.0
479 !        LWDN(I,K,J) = 0.0
480 !        LWUPCLEAR(I,K,J) = 0.0
481 !        LWDNCLEAR(I,K,J) = 0.0
482         CEMISS(I,K,J)=0.0
483      ENDDO
484      ENDDO
485      ENDDO
486 
487 ! temporarily modify hydrometeors (currently only done for GD scheme and WRF-Chem)
488 !
489      IF ( PRESENT( cu_rad_feedback ) ) THEN
490        IF ( PRESENT( qc ) .AND. PRESENT( qc_adjust ) .AND. cu_rad_feedback ) THEN
491           DO j=jts,jte
492           DO k=kts,kte
493           DO i=its,ite
494             qc_save(i,k,j) = qc(i,k,j)
495             qc(i,k,j) = qc(i,k,j) + qc_adjust(i,k,j)
496           ENDDO
497           ENDDO
498           ENDDO
499        ENDIF
500        IF ( PRESENT( qi ) .AND. PRESENT( qi_adjust ) .AND. cu_rad_feedback ) THEN
501           DO j=jts,jte
502           DO k=kts,kte
503           DO i=its,ite
504             qi_save(i,k,j) = qi(i,k,j)
505             qi(i,k,j) = qi(i,k,j) + qi_adjust(i,k,j)
506           ENDDO
507           ENDDO
508           ENDDO
509        ENDIF
510      ENDIF
511 
512 
513 ! Fill temporary water variable depending on micro package (tgs 25 Apr 2006)
514      if(PRESENT(qc) .and. PRESENT(F_QC)) then
515         DO j=jts,jte
516         DO k=kts,kte
517         DO i=its,ite
518            qc_temp(I,K,J)=qc(I,K,J)
519         ENDDO
520         ENDDO
521         ENDDO
522      else
523         DO j=jts,jte
524         DO k=kts,kte
525         DO i=its,ite
526            qc_temp(I,K,J)=0.
527         ENDDO
528         ENDDO
529         ENDDO
530      endif
531      if(PRESENT(qr) .and. PRESENT(F_QR)) then
532         DO j=jts,jte
533         DO k=kts,kte
534         DO i=its,ite
535            qc_temp(I,K,J) = qc_temp(I,K,J) + qr(I,K,J)
536         ENDDO
537         ENDDO
538         ENDDO
539      endif
540 
541 !---------------
542 ! Calculate constant for short wave radiation
543 
544      CALL radconst(XTIME,DECLIN,SOLCON,JULIAN,               &
545                    DEGRAD,DPD                                )
546 
547      if(present(DECLIN_URB))DECLIN_URB=DECLIN  ! urban
548 
549      lwrad_cldfra_select: SELECT CASE(lw_physics)
550 
551         CASE (GFDLLWSCHEME)
552 
553 !-- Do nothing, since cloud fractions (with partial cloudiness effects) 
554 !-- are defined in GFDL LW/SW schemes and do not need to be initialized.
555 
556         CASE (CAMLWSCHEME)
557 
558      IF ( PRESENT ( CLDFRA ) .AND.                           &
559           PRESENT(F_QC) .AND. PRESENT ( F_QI ) ) THEN
560 ! Call to cloud fraction routine based on Randall 1994 (Hong Pan 1998)
561 
562    CALL cal_cldfra2(CLDFRA,qv,qc,qi,qs,                     &
563                    F_QV,F_QC,F_QI,F_QS,t,p,                &
564                    F_ICE_PHY,F_RAIN_PHY,                   &
565                    ids,ide, jds,jde, kds,kde,              &
566                    ims,ime, jms,jme, kms,kme,              &
567                    its,ite, jts,jte, kts,kte               )
568      ENDIF
569  
570         CASE DEFAULT
571 
572      IF ( PRESENT ( CLDFRA ) .AND.                           &
573           PRESENT(F_QC) .AND. PRESENT ( F_QI ) ) THEN
574        CALL cal_cldfra(CLDFRA,qc,qi,F_QC,F_QI,               &
575                        ids,ide, jds,jde, kds,kde,            &
576                        ims,ime, jms,jme, kms,kme,            &
577                        its,ite, jts,jte, kts,kte             )
578      ENDIF
579 
580      END SELECT lwrad_cldfra_select    
581 
582 !pjj/cray  Cray X1 cannot print from threaded region
583 #ifndef crayx1
584      WRITE(wrf_err_message,*)'SOLCON=',SOLCON,DECLIN,XTIME
585      CALL wrf_debug(50,wrf_err_message)
586 #endif
587 
588      lwrad_select: SELECT CASE(lw_physics)
589 
590         CASE (RRTMSCHEME)
591              CALL wrf_debug (100, 'CALL rrtm')
592 
593              CALL RRTMLWRAD(                                        &
594                   RTHRATEN=RTHRATEN,GLW=GLW,EMISS=EMISS             &
595                  ,QV3D=QV                                           &
596                  ,QC3D=QC                                           &
597                  ,QR3D=QR                                           &
598                  ,QI3D=QI                                           &
599                  ,QS3D=QS                                           &
600                  ,QG3D=QG                                           &
601                  ,P8W=p8w,P3D=p,PI3D=pi,DZ8W=dz8w,T3D=t             &
602                  ,T8W=t8w,RHO3D=rho, CLDFRA3D=CLDFRA,R=R_d,G=G      &
603                  ,F_QV=F_QV,F_QC=F_QC,F_QR=F_QR                     &
604                  ,F_QI=F_QI,F_QS=F_QS,F_QG=F_QG                     &
605                  ,ICLOUD=icloud,WARM_RAIN=warm_rain                 &
606                  ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &     
607                  ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
608                  ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
609                                                                     )
610 
611         CASE (GFDLLWSCHEME)
612 
613              CALL wrf_debug (100, 'CALL gfdllw')
614 
615              IF ( PRESENT(F_QV) .AND. PRESENT(F_QC) .AND.                     &
616                   PRESENT(F_QS) .AND. PRESENT(qs)   .AND.                     &
617                   PRESENT(qv)   .AND. PRESENT(qc)   ) THEN
618                IF ( F_QV .AND. F_QC .AND. F_QS) THEN
619                  gfdl_lw  = .true.
620                  CALL ETARA(                                        &
621                   DT=dt,XLAND=xland                                 &
622                  ,P8W=p8w,DZ8W=dz8w,RHO_PHY=rho,P_PHY=p,T=t         &
623                  ,QV=qv,QW=qc_temp,QI=qi,QS=qs                      &
624                  ,TSK2D=tsk,GLW=GLW,RSWIN=SWDOWN,GSW=GSW            &
625                  ,RSWINC=SWDOWNC,CLDFRA=CLDFRA,PI3D=pi              &
626                  ,GLAT=glat,GLON=glon,HTOP=htop,HBOT=hbot           &
627                  ,HBOTR=hbotr, HTOPR=htopr                          &
628                  ,ALBEDO=albedo,CUPPT=cuppt                         &
629                  ,VEGFRA=vegfra,SNOW=snow,G=g,GMT=gmt               &
630                  ,NSTEPRA=stepra,NPHS=nphs,ITIMESTEP=itimestep      &
631                  ,XTIME=xtime,JULIAN=julian                         &
632                  ,COSZ_URB2D=COSZ_URB2D  ,OMG_URB2D=omg_urb2d       &
633                  ,JULYR=julyr,JULDAY=julday                         &
634                  ,GFDL_LW=gfdl_lw,GFDL_SW=gfdl_sw                   &
635                  ,CFRACL=cfracl,CFRACM=cfracm,CFRACH=cfrach         &
636                  ,ACFRST=acfrst,NCFRST=ncfrst                       &
637                  ,ACFRCV=acfrcv,NCFRCV=ncfrcv                       &
638                  ,RSWTOA=rswtoa,RLWTOA=rlwtoa,CZMEAN=czmean         &
639                  ,THRATEN=rthraten,THRATENLW=rthratenlw             &
640                  ,THRATENSW=rthratensw                              &
641                  ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &     
642                  ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
643                  ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
644                                                                     )
645                ELSE
646                  CALL wrf_error_fatal('Can not call ETARA (1a). Missing moisture fields.')
647                ENDIF
648              ELSE
649                CALL wrf_error_fatal('Can not call ETARA (1b). Missing moisture fields.')
650              ENDIF
651         CASE (CAMLWSCHEME)
652              CALL wrf_debug(100, 'CALL camrad lw')
653              IF(cam_abs_dim1 .ne. 4 .or. cam_abs_dim2 .ne. kde .or.  &
654                 paerlev .ne. 29 .or. levsiz .ne. 59 )THEN
655                WRITE( wrf_err_message , * ) &
656 'set paerlev=29, levsiz=59, cam_abs_dim1=4, and cam_abs_dim2=number of levels (e_vert) in physics namelist for CAM radiation'
657                CALL wrf_error_fatal ( wrf_err_message )
658              ENDIF
659              IF ( PRESENT( OZMIXM ) .AND. PRESENT( PIN ) .AND. &
660                   PRESENT(M_PS_1) .AND. PRESENT(M_PS_2) .AND.  &
661                   PRESENT(M_HYBI0) .AND. PRESENT(AEROSOLC_1)    &
662                   .AND. PRESENT(AEROSOLC_2) ) THEN
663              CALL CAMRAD(RTHRATENLW=RTHRATEN,RTHRATENSW=RTHRATENSW,    &
664                      SWUPT=SWUPT,SWUPTC=SWUPTC,                        &
665                      SWDNT=SWDNT,SWDNTC=SWDNTC,                        &
666                      LWUPT=LWUPT,LWUPTC=LWUPTC,                        &
667                      LWDNT=LWDNT,LWDNTC=LWDNTC,                        &
668                      SWUPB=SWUPB,SWUPBC=SWUPBC,                        &
669                      SWDNB=SWDNB,SWDNBC=SWDNBC,                        &
670                      LWUPB=LWUPB,LWUPBC=LWUPBC,                        &
671                      LWDNB=LWDNB,LWDNBC=LWDNBC,                        &
672                      SWCF=SWCF,LWCF=LWCF,OLR=OLR,CEMISS=CEMISS,        &
673                      TAUCLDC=TAUCLDC,TAUCLDI=TAUCLDI,COSZR=COSZR,      &
674                      GSW=GSW,GLW=GLW,XLAT=XLAT,XLONG=XLONG,            &
675                      ALBEDO=ALBEDO,t_phy=t,TSK=TSK,EMISS=EMISS         &
676                     ,QV3D=qv                                           &
677                     ,QC3D=qc                                           &
678                     ,QR3D=qr                                           &
679                     ,QI3D=qi                                           &
680                     ,QS3D=qs                                           &
681                     ,QG3D=qg                                           &
682                     ,F_QV=f_qv,F_QC=f_qc,F_QR=f_qr                     &
683                     ,F_QI=f_qi,F_QS=f_qs,F_QG=f_qg                     &
684                     ,f_ice_phy=f_ice_phy,f_rain_phy=f_rain_phy         &
685                     ,p_phy=p,p8w=p8w,z=z,pi_phy=pi,rho_phy=rho,        &
686                      dz8w=dz8w,                                        &
687                      CLDFRA=CLDFRA,XLAND=XLAND,XICE=XICE,SNOW=SNOW,    &
688                      ozmixm=ozmixm,pin0=pin,levsiz=levsiz,             &
689                      num_months=n_ozmixm,                              &
690                      m_psp=m_ps_1,m_psn=m_ps_2,aerosolcp=aerosolc_1,   &
691                      aerosolcn=aerosolc_2,m_hybi0=m_hybi0,             &
692                      paerlev=paerlev, naer_c=n_aerosolc,               &
693                      cam_abs_dim1=cam_abs_dim1, cam_abs_dim2=cam_abs_dim2, &
694                      GMT=GMT,JULDAY=JULDAY,JULIAN=JULIAN,DT=DT,XTIME=XTIME,DECLIN=DECLIN,  &
695                      SOLCON=SOLCON,RADT=RADT,DEGRAD=DEGRAD,n_cldadv=3  &
696                    ,abstot_3d=abstot,absnxt_3d=absnxt,emstot_3d=emstot &
697                    ,doabsems=doabsems                               &
698                  ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &     
699                  ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
700                  ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
701                                                                     )
702              ELSE
703                 CALL wrf_error_fatal ( 'arguments not present for calling cam radiation' )
704              ENDIF
705         CASE DEFAULT
706   
707              WRITE( wrf_err_message , * ) 'The longwave option does not exist: lw_physics = ', lw_physics
708              CALL wrf_error_fatal ( wrf_err_message )
709            
710      END SELECT lwrad_select    
711 
712      IF (lw_physics .gt. 0 .and. .not.gfdl_lw) THEN
713         DO j=jts,jte
714         DO k=kts,kte
715         DO i=its,ite
716            RTHRATENLW(I,K,J)=RTHRATEN(I,K,J)
717         ENDDO
718         ENDDO
719         ENDDO
720      ENDIF
721 !
722 
723      swrad_select: SELECT CASE(sw_physics)
724 
725         CASE (SWRADSCHEME)
726              CALL wrf_debug(100, 'CALL swrad')
727              CALL SWRAD(                                               &
728                      DT=dt,RTHRATEN=rthraten,GSW=gsw                   &
729                     ,XLAT=xlat,XLONG=xlong,ALBEDO=albedo               &
730 #ifdef WRF_CHEM
731                     ,PM2_5_DRY=pm2_5_dry,PM2_5_WATER=pm2_5_water       &
732                     ,PM2_5_DRY_EC=pm2_5_dry_ec                         &
733 #endif
734                     ,RHO_PHY=rho,T3D=t                                 &
735                     ,P3D=p,PI3D=pi,DZ8W=dz8w,GMT=gmt                   &
736                     ,R=r_d,CP=cp,G=g,JULDAY=julday                     &
737                     ,XTIME=xtime,DECLIN=declin,SOLCON=solcon           &
738 !                    ,COSZ_URB2D=COSZ_URB2D ,OMG_URB2D=omg_urb2d            & !urban
739                     ,RADFRQ=radt,ICLOUD=icloud,DEGRAD=degrad           &
740                     ,warm_rain=warm_rain                               &
741                     ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &     
742                     ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
743                     ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
744                     ,COSZ_URB2D=COSZ_URB2D ,OMG_URB2D=omg_urb2d        & !urban
745                     ,QV3D=qv                                           &
746                     ,QC3D=qc                                           &
747                     ,QR3D=qr                                           &
748                     ,QI3D=qi                                           &
749                     ,QS3D=qs                                           &
750                     ,QG3D=qg                                           &
751                     ,F_QV=f_qv,F_QC=f_qc,F_QR=f_qr                     &
752                     ,F_QI=f_qi,F_QS=f_qs,F_QG=f_qg                     &
753                                                                        )
754 
755         CASE (GSFCSWSCHEME)
756              CALL wrf_debug(100, 'CALL gsfcswrad')
757              CALL GSFCSWRAD(                                           &
758                      RTHRATEN=rthraten,GSW=gsw,XLAT=xlat,XLONG=xlong   &
759                     ,ALB=albedo,T3D=t,P3D=p,P8W3D=p8w,pi3D=pi          &
760                     ,DZ8W=dz8w,RHO_PHY=rho                             &
761                     ,CLDFRA3D=cldfra                                   &
762                     ,GMT=gmt,CP=cp,G=g                                 &
763 !                    ,COSZ_URB2D=COSZ_URB2D ,OMG_URB2D=omg_urb2d            & !urban
764                     ,JULDAY=julday,XTIME=xtime                         &
765                     ,DECLIN=declin,SOLCON=solcon                       &
766                     ,RADFRQ=radt,DEGRAD=degrad                         &
767                     ,TAUCLDI=taucldi,TAUCLDC=taucldc                   &
768                     ,WARM_RAIN=warm_rain                               &
769 #ifdef WRF_CHEM
770                     ,TAUAER300=tauaer300,TAUAER400=tauaer400           & ! jcb
771                     ,TAUAER600=tauaer600,TAUAER999=tauaer999           & ! jcb
772                     ,GAER300=gaer300,GAER400=gaer400                   & ! jcb
773                     ,GAER600=gaer600,GAER999=gaer999                   & ! jcb
774                     ,WAER300=waer300,WAER400=waer400                   & ! jcb
775                     ,WAER600=waer600,WAER999=waer999                   & ! jcb
776 #endif
777                     ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &     
778                     ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
779                     ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
780                     ,COSZ_URB2D=COSZ_URB2D ,OMG_URB2D=omg_urb2d        & !urban
781                     ,QV3D=qv                                           &
782                     ,QC3D=qc                                           &
783                     ,QR3D=qr                                           &
784                     ,QI3D=qi                                           &
785                     ,QS3D=qs                                           &
786                     ,QG3D=qg                                           &
787                     ,F_QV=f_qv,F_QC=f_qc,F_QR=f_qr                     &
788                     ,F_QI=f_qi,F_QS=f_qs,F_QG=f_qg                     &
789                                                                        )
790         CASE (CAMSWSCHEME)
791 ! Temporarily lw switch already calculates sw CAM tendency, so inactive here
792 
793       DO j=jts,jte
794       DO k=kts,kte
795       DO i=its,ite
796          RTHRATEN(I,K,J)=RTHRATEN(I,K,J)+RTHRATENSW(I,K,J)
797       ENDDO
798       ENDDO
799       ENDDO
800 
801         CASE (GFDLSWSCHEME)
802 
803              CALL wrf_debug (100, 'CALL gfdlsw')
804 
805              IF ( PRESENT(F_QV) .AND. PRESENT(F_QC) .AND.                     &
806                   PRESENT(F_QS) .AND. PRESENT(qs)   .AND.                     &
807                   PRESENT(qv)   .AND. PRESENT(qc) ) THEN
808                IF ( F_QV .AND. F_QC .AND. F_QS ) THEN
809                  gfdl_sw = .true.
810                  CALL ETARA(                                        &
811                   DT=dt,XLAND=xland                                 &
812                  ,P8W=p8w,DZ8W=dz8w,RHO_PHY=rho,P_PHY=p,T=t         &
813                  ,QV=qv,QW=qc_temp,QI=qi,QS=qs                      &
814                  ,TSK2D=tsk,GLW=GLW,RSWIN=SWDOWN,GSW=GSW            &
815                  ,RSWINC=SWDOWNC,CLDFRA=CLDFRA,PI3D=pi              &
816                  ,GLAT=glat,GLON=glon,HTOP=htop,HBOT=hbot           &
817                  ,HBOTR=hbotr, HTOPR=htopr                          &
818                  ,ALBEDO=albedo,CUPPT=cuppt                         &
819                  ,VEGFRA=vegfra,SNOW=snow,G=g,GMT=gmt               &
820                  ,NSTEPRA=stepra,NPHS=nphs,ITIMESTEP=itimestep      &
821                  ,XTIME=xtime,JULIAN=julian                         &
822                  ,COSZ_URB2D=COSZ_URB2D ,OMG_URB2D=omg_urb2d        &
823                  ,JULYR=julyr,JULDAY=julday                         &
824                  ,GFDL_LW=gfdl_lw,GFDL_SW=gfdl_sw                   &
825                  ,CFRACL=cfracl,CFRACM=cfracm,CFRACH=cfrach         &
826                  ,ACFRST=acfrst,NCFRST=ncfrst                       &
827                  ,ACFRCV=acfrcv,NCFRCV=ncfrcv                       &
828                  ,RSWTOA=rswtoa,RLWTOA=rlwtoa,CZMEAN=czmean         &
829                  ,THRATEN=rthraten,THRATENLW=rthratenlw             &
830                  ,THRATENSW=rthratensw                              &
831                  ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &     
832                  ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
833                  ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
834                                                                     )
835                ELSE
836                  CALL wrf_error_fatal('Can not call ETARA (2a). Missing moisture fields.')
837                ENDIF
838              ELSE
839                CALL wrf_error_fatal('Can not call ETARA (2b). Missing moisture fields.')
840              ENDIF
841 
842         CASE DEFAULT
843 
844              WRITE( wrf_err_message , * ) 'The shortwave option does not exist: sw_physics = ', sw_physics
845              CALL wrf_error_fatal ( wrf_err_message )
846 
847      END SELECT swrad_select    
848 
849      IF (sw_physics .gt. 0 .and. .not.gfdl_sw) THEN
850         DO j=jts,jte
851         DO k=kts,kte
852         DO i=its,ite
853            RTHRATENSW(I,K,J)=RTHRATEN(I,K,J)-RTHRATENLW(I,K,J)
854         ENDDO
855         ENDDO
856         ENDDO
857 
858         DO j=jts,jte
859         DO i=its,ite
860            SWDOWN(I,J)=GSW(I,J)/(1.-ALBEDO(I,J))
861         ENDDO
862         ENDDO
863 
864      ENDIF
865 
866    ENDDO
867    !$OMP END PARALLEL DO
868 
869    ENDIF Radiation_step
870 
871      accumulate_lw_select: SELECT CASE(lw_physics)
872 
873      CASE (CAMLWSCHEME)
874    IF(PRESENT(LWUPTC))THEN
875    !$OMP PARALLEL DO   &
876    !$OMP PRIVATE ( ij ,i,j,k,its,ite,jts,jte)
877 
878    DO ij = 1 , num_tiles
879      its = i_start(ij)
880      ite = i_end(ij)
881      jts = j_start(ij)
882      jte = j_end(ij)
883 
884         DO j=jts,jte
885         DO i=its,ite
886            ACLWUPT(I,J) = ACLWUPT(I,J) + LWUPT(I,J)*DT
887            ACLWUPTC(I,J) = ACLWUPTC(I,J) + LWUPTC(I,J)*DT
888            ACLWDNT(I,J) = ACLWDNT(I,J) + LWDNT(I,J)*DT
889            ACLWDNTC(I,J) = ACLWDNTC(I,J) + LWDNTC(I,J)*DT
890            ACLWUPB(I,J) = ACLWUPB(I,J) + LWUPB(I,J)*DT
891            ACLWUPBC(I,J) = ACLWUPBC(I,J) + LWUPBC(I,J)*DT
892            ACLWDNB(I,J) = ACLWDNB(I,J) + LWDNB(I,J)*DT
893            ACLWDNBC(I,J) = ACLWDNBC(I,J) + LWDNBC(I,J)*DT
894         ENDDO
895         ENDDO
896    ENDDO
897    !$OMP END PARALLEL DO
898    ENDIF
899      CASE DEFAULT
900      END SELECT accumulate_lw_select
901 
902      accumulate_sw_select: SELECT CASE(sw_physics)
903 
904      CASE (CAMSWSCHEME)
905    IF(PRESENT(SWUPTC))THEN
906    !$OMP PARALLEL DO   &
907    !$OMP PRIVATE ( ij ,i,j,k,its,ite,jts,jte)
908 
909    DO ij = 1 , num_tiles
910      its = i_start(ij)
911      ite = i_end(ij)
912      jts = j_start(ij)
913      jte = j_end(ij)
914 
915         DO j=jts,jte
916         DO i=its,ite
917            ACSWUPT(I,J) = ACSWUPT(I,J) + SWUPT(I,J)*DT
918            ACSWUPTC(I,J) = ACSWUPTC(I,J) + SWUPTC(I,J)*DT
919            ACSWDNT(I,J) = ACSWDNT(I,J) + SWDNT(I,J)*DT
920            ACSWDNTC(I,J) = ACSWDNTC(I,J) + SWDNTC(I,J)*DT
921            ACSWUPB(I,J) = ACSWUPB(I,J) + SWUPB(I,J)*DT
922            ACSWUPBC(I,J) = ACSWUPBC(I,J) + SWUPBC(I,J)*DT
923            ACSWDNB(I,J) = ACSWDNB(I,J) + SWDNB(I,J)*DT
924            ACSWDNBC(I,J) = ACSWDNBC(I,J) + SWDNBC(I,J)*DT
925         ENDDO
926         ENDDO
927    ENDDO
928    !$OMP END PARALLEL DO
929    ENDIF
930      CASE DEFAULT
931      END SELECT accumulate_sw_select
932 !
933 !*** Restore the saved values of the input Q arrays before exiting
934 
935      IF ( PRESENT( cu_rad_feedback ) ) THEN
936        IF ( PRESENT( qc  ) .AND. PRESENT( qc_adjust ) .AND. cu_rad_feedback ) THEN
937           DO j=jts,jte
938           DO k=kts,kte
939           DO i=its,ite
940             qc(i,k,j) = qc_save(i,k,j)
941           ENDDO
942           ENDDO
943           ENDDO
944        ENDIF
945        IF ( PRESENT( qi  ) .AND. PRESENT( qi_adjust ) .AND. cu_rad_feedback ) THEN
946           DO j=jts,jte
947           DO k=kts,kte
948           DO i=its,ite
949             qi(i,k,j) = qi_save(i,k,j)
950           ENDDO
951           ENDDO
952           ENDDO
953        ENDIF
954      ENDIF
955 
956    END SUBROUTINE radiation_driver
957 
958 !---------------------------------------------------------------------
959 !BOP
960 ! !IROUTINE: radconst - compute radiation terms
961 ! !INTERFAC:
962    SUBROUTINE radconst(XTIME,DECLIN,SOLCON,JULIAN,                   &
963                        DEGRAD,DPD                                    )
964 !---------------------------------------------------------------------
965    USE module_wrf_error
966    IMPLICIT NONE
967 !---------------------------------------------------------------------
968 
969 ! !ARGUMENTS:
970    REAL, INTENT(IN   )      ::       DEGRAD,DPD,XTIME,JULIAN
971    REAL, INTENT(OUT  )      ::       DECLIN,SOLCON
972    REAL                     ::       OBECL,SINOB,SXLONG,ARG,  &
973                                      DECDEG,DJUL,RJUL,ECCFAC
974 !
975 ! !DESCRIPTION:
976 ! Compute terms used in radiation physics 
977 !EOP
978 
979 ! for short wave radiation
980 
981    DECLIN=0.
982    SOLCON=0.
983 
984 !-----OBECL : OBLIQUITY = 23.5 DEGREE.
985         
986    OBECL=23.5*DEGRAD
987    SINOB=SIN(OBECL)
988         
989 !-----CALCULATE LONGITUDE OF THE SUN FROM VERNAL EQUINOX:
990         
991    IF(JULIAN.GE.80.)SXLONG=DPD*(JULIAN-80.)
992    IF(JULIAN.LT.80.)SXLONG=DPD*(JULIAN+285.)
993    SXLONG=SXLONG*DEGRAD
994    ARG=SINOB*SIN(SXLONG)
995    DECLIN=ASIN(ARG)
996    DECDEG=DECLIN/DEGRAD
997 !----SOLAR CONSTANT ECCENTRICITY FACTOR (PALTRIDGE AND PLATT 1976)
998    DJUL=JULIAN*360./365.
999    RJUL=DJUL*DEGRAD
1000    ECCFAC=1.000110+0.034221*COS(RJUL)+0.001280*SIN(RJUL)+0.000719*  &
1001           COS(2*RJUL)+0.000077*SIN(2*RJUL)
1002    SOLCON=1370.*ECCFAC
1003    
1004 !pjj/cray  Cray X1 cannot print from threaded region
1005 #ifndef crayx1
1006    write(wrf_err_message,10)DECDEG,SOLCON
1007 10 FORMAT(1X,'*** SOLAR DECLINATION ANGLE = ',F6.2,' DEGREES.',     &
1008         ' SOLAR CONSTANT = ',F8.2,' W/M**2 ***')
1009    CALL wrf_debug (50, wrf_err_message)
1010 #endif
1011 
1012    END SUBROUTINE radconst
1013 
1014 !---------------------------------------------------------------------
1015 !BOP
1016 ! !IROUTINE: cal_cldfra - Compute cloud fraction
1017 ! !INTERFACE:
1018    SUBROUTINE cal_cldfra(CLDFRA,QC,QI,F_QC,F_QI,                     &
1019           ids,ide, jds,jde, kds,kde,                                 &
1020           ims,ime, jms,jme, kms,kme,                                 &
1021           its,ite, jts,jte, kts,kte                                  )
1022 !---------------------------------------------------------------------
1023    IMPLICIT NONE
1024 !---------------------------------------------------------------------
1025    INTEGER,  INTENT(IN   )   ::           ids,ide, jds,jde, kds,kde, &
1026                                           ims,ime, jms,jme, kms,kme, &
1027                                           its,ite, jts,jte, kts,kte
1028 
1029 !
1030    REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(OUT  ) ::    &
1031                                                              CLDFRA
1032 
1033    REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN   ) ::    &
1034                                                                  QI, &
1035                                                                  QC
1036 
1037    LOGICAL,INTENT(IN) :: F_QC,F_QI
1038 
1039    REAL thresh
1040    INTEGER:: i,j,k
1041 ! !DESCRIPTION:
1042 ! Compute cloud fraction from input ice and cloud water fields
1043 ! if provided.
1044 !
1045 ! Whether QI or QC is active or not is determined from the indices of
1046 ! the fields into the 4D scalar arrays in WRF. These indices are
1047 ! P_QI and P_QC, respectively, and they are passed in to the routine
1048 ! to enable testing to see if QI and QC represent active fields in
1049 ! the moisture 4D scalar array carried by WRF.
1050 !
1051 ! If a field is active its index will have a value greater than or
1052 ! equal to PARAM_FIRST_SCALAR, which is also an input argument to
1053 ! this routine.
1054 !EOP
1055 !---------------------------------------------------------------------
1056      thresh=1.0e-6
1057 
1058      IF ( f_qi .AND. f_qc ) THEN
1059         DO j = jts,jte
1060         DO k = kts,kte
1061         DO i = its,ite
1062            IF ( QC(i,k,j)+QI(I,k,j) .gt. thresh) THEN
1063               CLDFRA(i,k,j)=1.
1064            ELSE
1065               CLDFRA(i,k,j)=0.
1066            ENDIF
1067         ENDDO
1068         ENDDO
1069         ENDDO
1070      ELSE IF ( f_qc ) THEN
1071         DO j = jts,jte
1072         DO k = kts,kte
1073         DO i = its,ite
1074            IF ( QC(i,k,j) .gt. thresh) THEN
1075               CLDFRA(i,k,j)=1.
1076            ELSE
1077               CLDFRA(i,k,j)=0.
1078            ENDIF
1079         ENDDO
1080         ENDDO
1081         ENDDO
1082      ELSE
1083         DO j = jts,jte
1084         DO k = kts,kte
1085         DO i = its,ite
1086            CLDFRA(i,k,j)=0.
1087         ENDDO
1088         ENDDO
1089         ENDDO
1090      ENDIF
1091 
1092    END SUBROUTINE cal_cldfra
1093 
1094 !BOP
1095 ! !IROUTINE: cal_cldfra2 - Compute cloud fraction
1096 ! !INTERFACE:
1097 ! cal_cldfra_xr - Compute cloud fraction.
1098 ! Code adapted from that in module_ra_gfdleta.F in WRF_v2.0.3 by James Done
1099 !!
1100 !!---  Cloud fraction parameterization follows Randall, 1994
1101 !!     (see Hong et al., 1998)
1102 !!     (modified by Ferrier, Feb '02)
1103 !
1104    SUBROUTINE cal_cldfra2(CLDFRA, QV, QC, QI, QS,                     &
1105                          F_QV, F_QC, F_QI, F_QS, t_phy, p_phy,       &
1106                          F_ICE_PHY,F_RAIN_PHY,                       &
1107           ids,ide, jds,jde, kds,kde,                                 &
1108           ims,ime, jms,jme, kms,kme,                                 &
1109           its,ite, jts,jte, kts,kte                                  )
1110 !---------------------------------------------------------------------
1111    IMPLICIT NONE
1112 !---------------------------------------------------------------------
1113    INTEGER,  INTENT(IN   )   ::           ids,ide, jds,jde, kds,kde, &
1114                                           ims,ime, jms,jme, kms,kme, &
1115                                           its,ite, jts,jte, kts,kte
1116 
1117 !
1118    REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(OUT  ) ::    &
1119                                                              CLDFRA
1120 
1121    REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN   ) ::    &
1122                                                                  QV, &
1123                                                                  QI, &
1124                                                                  QC, &
1125                                                                  QS, &
1126                                                               t_phy, &
1127                                                               p_phy, &
1128                                                           F_ICE_PHY, &
1129                                                          F_RAIN_PHY
1130 
1131    LOGICAL,INTENT(IN) :: F_QC,F_QI,F_QV,F_QS
1132 
1133 !  REAL thresh
1134    INTEGER:: i,j,k
1135    REAL    :: RHUM, tc, esw, esi, weight, qvsw, qvsi, qvs_weight, QIMID, QWMID, QCLD, DENOM, ARG, SUBSAT
1136 
1137    REAL    ,PARAMETER :: ALPHA0=100., GAMMA=0.49, QCLDMIN=1.E-12,    &
1138                                         PEXP=0.25, RHGRID=1.0
1139    REAL    , PARAMETER ::  SVP1=0.61078
1140    REAL    , PARAMETER ::  SVP2=17.2693882
1141    REAL    , PARAMETER ::  SVPI2=21.8745584
1142    REAL    , PARAMETER ::  SVP3=35.86
1143    REAL    , PARAMETER ::  SVPI3=7.66
1144    REAL    , PARAMETER ::  SVPT0=273.15
1145    REAL    , PARAMETER ::  r_d = 287.
1146    REAL    , PARAMETER ::  r_v = 461.6
1147    REAL    , PARAMETER ::  ep_2=r_d/r_v
1148 ! !DESCRIPTION:
1149 ! Compute cloud fraction from input ice and cloud water fields
1150 ! if provided.
1151 !
1152 ! Whether QI or QC is active or not is determined from the indices of
1153 ! the fields into the 4D scalar arrays in WRF. These indices are 
1154 ! P_QI and P_QC, respectively, and they are passed in to the routine
1155 ! to enable testing to see if QI and QC represent active fields in
1156 ! the moisture 4D scalar array carried by WRF.
1157 ! 
1158 ! If a field is active its index will have a value greater than or
1159 ! equal to PARAM_FIRST_SCALAR, which is also an input argument to 
1160 ! this routine.
1161 !EOP
1162 
1163 
1164 !-----------------------------------------------------------------------
1165 !---  COMPUTE GRID-SCALE CLOUD COVER FOR RADIATION
1166 !     (modified by Ferrier, Feb '02)
1167 !
1168 !---  Cloud fraction parameterization follows Randall, 1994
1169 !     (see Hong et al., 1998)
1170 !-----------------------------------------------------------------------
1171 ! Note: ep_2=287./461.6 Rd/Rv
1172 ! Note: R_D=287.
1173 
1174 ! Alternative calculation for critical RH for grid saturation
1175 !     RHGRID=0.90+.08*((100.-DX)/95.)**.5
1176 
1177 ! Calculate saturation mixing ratio weighted according to the fractions of
1178 ! water and ice.
1179 ! Following:
1180 ! Murray, F.W. 1966. ``On the computation of Saturation Vapor Pressure''  J. Appl. Meteor.  6 p.204
1181 !    es (in mb) = 6.1078 . exp[ a . (T-273.16)/ (T-b) ]
1182 !
1183 !       over ice        over water
1184 ! a =   21.8745584      17.2693882
1185 ! b =   7.66            35.86
1186 
1187 !---------------------------------------------------------------------
1188 
1189     DO j = jts,jte
1190     DO k = kts,kte
1191     DO i = its,ite
1192       tc         = t_phy(i,k,j) - SVPT0
1193       esw     = 1000.0 * SVP1 * EXP( SVP2  * tc / ( t_phy(i,k,j) - SVP3  ) )
1194       esi     = 1000.0 * SVP1 * EXP( SVPI2 * tc / ( t_phy(i,k,j) - SVPI3 ) )
1195       QVSW = EP_2 * esw / ( p_phy(i,k,j) - esw )
1196       QVSI = EP_2 * esi / ( p_phy(i,k,j) - esi )
1197 
1198       IF ( F_QI .and. F_QC .and. F_QS) THEN
1199         QCLD=QI(i,k,j)+QC(i,k,j)+QS(I,k,j)
1200         IF (QCLD .LT. QCLDMIN) THEN
1201           weight = 0.
1202         ELSE
1203           weight = (QI(i,k,j)+QS(I,k,j)) / QCLD
1204         ENDIF
1205       ELSE IF ( F_QC ) THEN
1206 
1207 ! Mixing ratios of cloud water & total ice (cloud ice + snow).
1208 ! Mixing ratios of rain are not considered in this scheme.
1209 ! F_ICE is fraction of ice
1210 ! F_RAIN is fraction of rain
1211 
1212       QIMID=QC(i,k,j)*F_ICE_PHY(i,k,j)
1213       QWMID=(QC(i,k,j)-QIMID)*(1.-F_RAIN_PHY(i,k,j))
1214 
1215 
1216 !
1217 !--- Total "cloud" mixing ratio, QCLD.  Rain is not part of cloud,
1218 !    only cloud water + cloud ice + snow
1219 !
1220       QCLD=QWMID+QIMID
1221         IF (QCLD .LT. QCLDMIN) THEN
1222           weight = 0.
1223         ELSE
1224           weight = F_ICE_PHY(i,k,j)
1225         ENDIF
1226 
1227       ELSE
1228         CLDFRA(i,k,j)=0.
1229       ENDIF !  IF ( F_QI .and. F_QC )
1230 
1231 
1232       QVS_WEIGHT = (1-weight)*QVSW + weight*QVSI
1233       RHUM=QV(i,k,j)/QVS_WEIGHT   !--- Relative humidity
1234 !
1235 !--- Determine cloud fraction (modified from original algorithm)
1236 !
1237       IF (QCLD .LT. QCLDMIN) THEN
1238 !
1239 !--- Assume zero cloud fraction if there is no cloud mixing ratio
1240 !
1241         CLDFRA(i,k,j)=0.
1242       ELSEIF(RHUM.GE.RHGRID)THEN
1243 !
1244 !--- Assume cloud fraction of unity if near saturation and the cloud
1245 !    mixing ratio is at or above the minimum threshold
1246 !
1247         CLDFRA(i,k,j)=1.
1248       ELSE
1249 !
1250 !--- Adaptation of original algorithm (Randall, 1994; Zhao, 1995)
1251 !    modified based on assumed grid-scale saturation at RH=RHgrid.
1252 !
1253         SUBSAT=MAX(1.E-10,RHGRID*QVS_WEIGHT-QV(i,k,j))
1254         DENOM=(SUBSAT)**GAMMA
1255         ARG=MAX(-6.9, -ALPHA0*QCLD/DENOM)    ! <-- EXP(-6.9)=.001
1256 ! prevent negative values  (new)
1257         RHUM=MAX(1.E-10, RHUM)
1258         CLDFRA(i,k,j)=(RHUM/RHGRID)**PEXP*(1.-EXP(ARG))
1259 !!              ARG=-1000*QCLD/(RHUM-RHGRID)
1260 !!              ARG=MAX(ARG, ARGMIN)
1261 !!              CLDFRA(i,k,j)=(RHUM/RHGRID)*(1.-EXP(ARG))
1262         IF (CLDFRA(i,k,j) .LT. .01) CLDFRA(i,k,j)=0.
1263       ENDIF          !--- End IF (QCLD .LT. QCLDMIN) ...
1264     ENDDO          !--- End DO i
1265     ENDDO          !--- End DO k
1266     ENDDO          !--- End DO j
1267 
1268    END SUBROUTINE cal_cldfra2
1269 
1270 END MODULE module_radiation_driver