Line data Source code
1 :
2 : module radsw
3 : !-----------------------------------------------------------------------
4 : !
5 : ! Purpose: Solar radiation calculations.
6 : !
7 : !-----------------------------------------------------------------------
8 : use shr_kind_mod, only: r8 => shr_kind_r8
9 : use ppgrid, only: pcols, pver, pverp
10 : use cam_abortutils, only: endrun
11 : use cam_history, only: outfld
12 : use scamMod, only: single_column,scm_crm_mode,have_asdir, &
13 : asdirobs, have_asdif, asdifobs, have_aldir, &
14 : aldirobs, have_aldif, aldifobs
15 : use cam_logfile, only: iulog
16 : use radconstants, only: nswbands, get_sw_spectral_boundaries, &
17 : idx_sw_diag, indxsl
18 :
19 : implicit none
20 :
21 : private
22 : save
23 :
24 : ! Public methods
25 :
26 : public ::&
27 : radsw_init, &! initialize constants
28 : radcswmx ! driver for solar radiation code
29 :
30 : ! Private module data
31 :
32 : real(r8) :: gravit ! Acceleration of gravity
33 : real(r8) :: rga ! 1./gravit
34 : real(r8) :: sslp ! Standard sea-level pressure
35 :
36 : !===============================================================================
37 : CONTAINS
38 : !===============================================================================
39 :
40 749232 : subroutine radcswmx(lchnk ,ncol , &
41 : E_pint ,E_pmid ,E_h2ommr ,E_o3mmr , &
42 : E_o2mmr ,E_cld ,E_cicewp ,E_cliqwp ,E_rel , &
43 : E_rei ,eccf ,E_coszrs ,solin , &
44 : E_asdir ,E_asdif ,E_aldir ,E_aldif ,nmxrgn , &
45 : pmxrgn ,qrs,qrsc,fsnt ,fsntc ,fsdtoa, fsntoa, &
46 : fsutoa ,fsntoac, fsnirtoa,fsnrtoac,fsnrtoaq,fsns , &
47 : fsnsc ,fsdsc ,fsds ,sols ,soll , &
48 : solsd ,solld , fns ,fcns , &
49 : Nday ,Nnite ,IdxDay ,IdxNite, E_co2mmr, &
50 : E_aer_tau, E_aer_tau_w, E_aer_tau_w_g, E_aer_tau_w_f, tauxcl_out, tauxci_out)
51 : !-----------------------------------------------------------------------
52 : !
53 :
54 : ! Purpose:
55 : ! Solar radiation code
56 : !
57 : ! Method:
58 : ! Basic method is Delta-Eddington as described in:
59 : !
60 : ! Briegleb, Bruce P., 1992: Delta-Eddington
61 : ! Approximation for Solar Radiation in the NCAR Community Climate Model,
62 : ! Journal of Geophysical Research, Vol 97, D7, pp7603-7612).
63 : !
64 : ! Five changes to the basic method described above are:
65 : ! (1) addition of sulfate aerosols (Kiehl and Briegleb, 1993)
66 : ! (2) the distinction between liquid and ice particle clouds
67 : ! (Kiehl et al, 1996);
68 : ! (3) provision for calculating TOA fluxes with spectral response to
69 : ! match Nimbus-7 visible/near-IR radiometers (Collins, 1998);
70 : ! (4) max-random overlap (Collins, 2001)
71 : ! (5) The near-IR absorption by H2O was updated in 2003 by Collins,
72 : ! Lee-Taylor, and Edwards for consistency with the new line data in
73 : ! Hitran 2000 and the H2O continuum version CKD 2.4. Modifications
74 : ! were optimized by reducing RMS errors in heating rates relative
75 : ! to a series of benchmark calculations for the 5 standard AFGL
76 : ! atmospheres. The benchmarks were performed using DISORT2 combined
77 : ! with GENLN3. The near-IR scattering optical depths for Rayleigh
78 : ! scattering were also adjusted, as well as the correction for
79 : ! stratospheric heating by H2O.
80 : !
81 : ! The treatment of maximum-random overlap is described in the
82 : ! comment block "INDEX CALCULATIONS FOR MAX OVERLAP".
83 : !
84 : ! Divides solar spectrum into 19 intervals from 0.2-5.0 micro-meters.
85 : ! solar flux fractions specified for each interval. allows for
86 : ! seasonally and diurnally varying solar input. Includes molecular,
87 : ! cloud, aerosol, and surface scattering, along with h2o,o3,co2,o2,cloud,
88 : ! and surface absorption. Computes delta-eddington reflections and
89 : ! transmissions assuming homogeneously mixed layers. Adds the layers
90 : ! assuming scattering between layers to be isotropic, and distinguishes
91 : ! direct solar beam from scattered radiation.
92 : !
93 : ! Longitude loops are broken into 1 or 2 sections, so that only daylight
94 : ! (i.e. coszrs > 0) computations are done.
95 : !
96 : ! Note that an extra layer above the model top layer is added.
97 : !
98 : ! cgs units are used.
99 : !
100 : ! Special diagnostic calculation of the clear sky surface and total column
101 : ! absorbed flux is also done for cloud forcing diagnostics.
102 : !
103 : !-----------------------------------------------------------------------
104 : !
105 : ! D. Parks (NEC) 09/11/03
106 : ! Restructuring of routine to support SX vector architecture.
107 : !
108 : ! Possible improvements:
109 : !
110 : ! 1. Look at vectorizing index calculations for maximum overlap.
111 : !
112 : ! 2. Consider making innermost loop in flux computations the number
113 : ! of spectral intervals. Given that NS is fixed at 19, the trade-off
114 : ! will be stride one memory accesses of length 19 versus indirect
115 : ! addressing (list vector - gather/scatter) with potential vector
116 : ! lenghts of the number of day light points. Vectorizing on the number
117 : ! of spectral intervals seems worthwhile for low resolution models (T42),
118 : ! but might be inefficient with higher resolutions.
119 : !
120 : ! 3. Move the linearization of daylight points (compression/expansion) out
121 : ! of radcswmx and into d_p_coupling. This would eliminate the cost of
122 : ! routines CmpDayNite and ExpDayNite.
123 : !
124 : ! 4. Look at expliciting computing all streams in upward propagation of
125 : ! radiation. There would be additional floating point operations in
126 : ! exchange for the elimination of indirect addressing.
127 : !
128 : !-----------------------------------------------------------------------
129 :
130 : use rad_solar_var, only: get_variability
131 : use cmparray_mod, only: CmpDayNite, ExpDayNite
132 : use quicksort, only: quick_sort
133 : use phys_control, only: phys_getopts
134 : use solar_irrad_data, only: sol_tsi, do_spctrl_scaling, ref_tsi
135 : use radconstants, only: frcsol, ph2o, pco2, po2
136 :
137 : !-----------------------Constants for new band (640-700 nm)-------------
138 : real(r8) v_raytau_35
139 : real(r8) v_raytau_64
140 : real(r8) v_abo3_35
141 : real(r8) v_abo3_64
142 : parameter( &
143 : v_raytau_35 = 0.155208_r8, &
144 : v_raytau_64 = 0.0392_r8, &
145 : v_abo3_35 = 2.4058030e+01_r8, &
146 : v_abo3_64 = 2.210e+01_r8 &
147 : )
148 :
149 :
150 : !-------------Parameters for accelerating max-random solution-------------
151 : !
152 : ! The solution time scales like prod(j:1->N) (1 + n_j) where
153 : ! N = number of max-overlap regions (nmxrgn)
154 : ! n_j = number of unique cloud amounts in region j
155 : !
156 : ! Therefore the solution cost can be reduced by decreasing n_j.
157 : ! cldmin reduces n_j by treating cloud amounts < cldmin as clear sky.
158 : ! cldeps reduces n_j by treating cloud amounts identical to log(1/cldeps)
159 : ! decimal places as identical
160 : !
161 : ! areamin reduces the cost by dropping configurations that occupy
162 : ! a surface area < areamin of the model grid box. The surface area
163 : ! for a configuration C(j,k_j), where j is the region number and k_j is the
164 : ! index for a unique cloud amount (in descending order from biggest to
165 : ! smallest clouds) in region j, is
166 : !
167 : ! A = prod(j:1->N) [C(j,k_j) - C(j,k_j+1)]
168 : !
169 : ! where C(j,0) = 1.0 and C(j,n_j+1) = 0.0.
170 : !
171 : ! nconfgmax reduces the cost and improves load balancing by setting an upper
172 : ! bound on the number of cloud configurations in the solution. If the number
173 : ! of configurations exceeds nconfgmax, the nconfgmax configurations with the
174 : ! largest area are retained, and the fluxes are normalized by the total area
175 : ! of these nconfgmax configurations. For the current max/random overlap
176 : ! assumption (see subroutine cldovrlap), 30 levels, and cloud-amount
177 : ! parameterization, the mean and RMS number of configurations are
178 : ! both roughly 5. nconfgmax has been set to the mean+2*RMS number, or 15.
179 : !
180 : ! Minimum cloud amount (as a fraction of the grid-box area) to
181 : ! distinguish from clear sky
182 : !
183 : real(r8) cldmin
184 : parameter (cldmin = 1.0e-80_r8)
185 : !
186 : ! Minimimum horizontal area (as a fraction of the grid-box area) to retain
187 : ! for a unique cloud configuration in the max-random solution
188 : !
189 : real(r8) areamin
190 : parameter (areamin = 0.01_r8)
191 : !
192 : ! Decimal precision of cloud amount (0 -> preserve full resolution;
193 : ! 10^-n -> preserve n digits of cloud amount)
194 : !
195 : real(r8) cldeps
196 : parameter (cldeps = 0.0_r8)
197 : !
198 : ! Maximum number of configurations to include in solution
199 : !
200 : integer nconfgmax
201 : parameter (nconfgmax = 15)
202 : !------------------------------Commons----------------------------------
203 : !
204 : ! Input arguments
205 : !
206 : integer, intent(in) :: lchnk ! chunk identifier
207 : integer, intent(in) :: ncol ! number of atmospheric columns
208 :
209 : integer,intent(in) :: Nday ! Number of daylight columns
210 : integer,intent(in) :: Nnite ! Number of night columns
211 : integer,intent(in), dimension(pcols) :: IdxDay ! Indicies of daylight coumns
212 : integer,intent(in), dimension(pcols) :: IdxNite ! Indicies of night coumns
213 :
214 :
215 : real(r8), intent(in) :: E_pmid(pcols,pver) ! Level pressure
216 : real(r8), intent(in) :: E_pint(pcols,pverp) ! Interface pressure
217 : real(r8), intent(in) :: E_h2ommr(pcols,pver) ! Specific humidity (h2o mass mix ratio)
218 : real(r8), intent(in) :: E_o3mmr(pcols,pver) ! Ozone mass mixing ratio
219 : real(r8), intent(in) :: E_o2mmr(pcols) ! oxygen mass mixing ratio
220 : !
221 : real(r8), intent(in) :: E_cld(pcols,pver) ! Fractional cloud cover
222 : real(r8), intent(in) :: E_cicewp(pcols,pver) ! in-cloud cloud ice water path
223 : real(r8), intent(in) :: E_cliqwp(pcols,pver) ! in-cloud cloud liquid water path
224 : real(r8), intent(in) :: E_rel(pcols,pver) ! Liquid effective drop size (microns)
225 : real(r8), intent(in) :: E_rei(pcols,pver) ! Ice effective drop size (microns)
226 : !
227 : real(r8), intent(in) :: eccf ! Eccentricity factor (1./earth-sun dist^2)
228 : real(r8), intent(in) :: E_coszrs(pcols) ! Cosine solar zenith angle
229 : real(r8), intent(in) :: E_asdir(pcols) ! 0.2-0.7 micro-meter srfc alb: direct rad
230 : real(r8), intent(in) :: E_aldir(pcols) ! 0.7-5.0 micro-meter srfc alb: direct rad
231 : real(r8), intent(in) :: E_asdif(pcols) ! 0.2-0.7 micro-meter srfc alb: diffuse rad
232 : real(r8), intent(in) :: E_aldif(pcols) ! 0.7-5.0 micro-meter srfc alb: diffuse rad
233 : real(r8), intent(in) :: E_co2mmr(pcols) ! co2 column mean mmr
234 :
235 : !
236 : ! Aerosol radiative property arrays
237 : !
238 : real(r8),intent(in) :: E_aer_tau (pcols,0:pver,nswbands) ! aerosol extinction optical depth
239 : real(r8),intent(in) :: E_aer_tau_w (pcols,0:pver,nswbands) ! aerosol single scattering albedo * tau
240 : real(r8),intent(in) :: E_aer_tau_w_g(pcols,0:pver,nswbands) ! aerosol asymmetry parameter * w * tau
241 : real(r8),intent(in) :: E_aer_tau_w_f(pcols,0:pver,nswbands) ! aerosol forward scattered fraction * w * tau
242 :
243 : !
244 : ! IN/OUT arguments
245 : !
246 : real(r8), intent(inout) :: pmxrgn(pcols,pverp) ! Maximum values of pressure for each
247 : ! ! maximally overlapped region.
248 : ! ! 0->pmxrgn(i,1) is range of pressure for
249 : ! ! 1st region,pmxrgn(i,1)->pmxrgn(i,2) for
250 : ! ! 2nd region, etc
251 : integer, intent(inout) :: nmxrgn(pcols) ! Number of maximally overlapped regions
252 : !
253 : ! Output arguments
254 : !
255 :
256 : real(r8), intent(out) :: solin(pcols) ! Incident solar flux
257 : real(r8), intent(out) :: qrs (pcols,pver) ! Solar heating rate
258 : real(r8), intent(out) :: qrsc(pcols,pver) ! Clearsky solar heating rate
259 : real(r8), intent(out) :: fsns(pcols) ! Surface absorbed solar flux
260 : real(r8), intent(out) :: fsnt(pcols) ! Total column absorbed solar flux
261 : real(r8), intent(out) :: fsntoa(pcols) ! Net solar flux at TOA
262 : real(r8), intent(out) :: fsutoa(pcols) ! Upward solar flux at TOA
263 : real(r8), intent(out) :: fsds(pcols) ! Flux shortwave downwelling surface
264 : !
265 : real(r8), intent(out) :: fsnsc(pcols) ! Clear sky surface absorbed solar flux
266 : real(r8), intent(out) :: fsdsc(pcols) ! Clear sky surface downwelling solar flux
267 : real(r8), intent(out) :: fsntc(pcols) ! Clear sky total column absorbed solar flx
268 : real(r8), intent(out) :: fsdtoa(pcols) ! Downwelling solar flux at TOA
269 : real(r8), intent(out) :: fsntoac(pcols) ! Clear sky net solar flx at TOA
270 : real(r8), intent(out) :: sols(pcols) ! Direct solar rad on surface (< 0.7)
271 : real(r8), intent(out) :: soll(pcols) ! Direct solar rad on surface (>= 0.7)
272 : real(r8), intent(out) :: solsd(pcols) ! Diffuse solar rad on surface (< 0.7)
273 : real(r8), intent(out) :: solld(pcols) ! Diffuse solar rad on surface (>= 0.7)
274 : real(r8), intent(out) :: fsnirtoa(pcols) ! Near-IR flux absorbed at toa
275 : real(r8), intent(out) :: fsnrtoac(pcols) ! Clear sky near-IR flux absorbed at toa
276 : real(r8), intent(out) :: fsnrtoaq(pcols) ! Net near-IR flux at toa >= 0.7 microns
277 :
278 : real(r8), intent(out) :: fns(pcols,pverp) ! net flux at interfaces
279 : real(r8), intent(out) :: fcns(pcols,pverp) ! net clear-sky flux at interfaces
280 :
281 : real(r8), intent(out) :: tauxcl_out(pcols,pver) ! liquid cloud visible sw optical depth
282 : real(r8), intent(out) :: tauxci_out(pcols,pver) ! ice cloud visible sw optical depth
283 :
284 : !
285 : !---------------------------Local variables-----------------------------
286 : !
287 : ! Local and reordered copies of the intent(in) variables
288 : !
289 : real(r8):: aer_tau (pcols,0:pver,nswbands) ! aerosol extinction optical depth
290 : real(r8):: aer_tau_w (pcols,0:pver,nswbands) ! aerosol single scattering albedo * tau
291 : real(r8):: aer_tau_w_g(pcols,0:pver,nswbands) ! aerosol asymmetry parameter * w * tau
292 : real(r8):: aer_tau_w_f(pcols,0:pver,nswbands) ! aerosol forward scattered fraction * w * tau
293 : real(r8) :: pmid(pcols,pver) ! Level pressure
294 : real(r8) :: pint(pcols,pverp) ! Interface pressure
295 : real(r8) :: h2ommr(pcols,pver) ! Specific humidity (h2o mass mix ratio)
296 : real(r8) :: o3mmr(pcols,pver) ! Ozone mass mixing ratio
297 : !
298 : real(r8) :: cld(pcols,pver) ! Fractional cloud cover
299 : real(r8) :: cicewp(pcols,pver) ! in-cloud cloud ice water path
300 : real(r8) :: cliqwp(pcols,pver) ! in-cloud cloud liquid water path
301 : real(r8) :: rel(pcols,pver) ! Liquid effective drop size (microns)
302 : real(r8) :: rei(pcols,pver) ! Ice effective drop size (microns)
303 : !
304 : real(r8) :: coszrs(pcols) ! Cosine solar zenith angle
305 : real(r8) :: asdir(pcols) ! 0.2-0.7 micro-meter srfc alb: direct rad
306 : real(r8) :: aldir(pcols) ! 0.7-5.0 micro-meter srfc alb: direct rad
307 : real(r8) :: asdif(pcols) ! 0.2-0.7 micro-meter srfc alb: diffuse rad
308 : real(r8) :: aldif(pcols) ! 0.7-5.0 micro-meter srfc alb: diffuse rad
309 : real(r8) :: co2mmr(pcols) ! co2 column mean mmr
310 : real(r8) :: o2mmr(pcols) ! o2 column mean mmr
311 :
312 : real(r8) :: tot_irrad
313 : !
314 : ! Max/random overlap variables
315 : !
316 : real(r8) asort(pverp) ! 1 - cloud amounts to be sorted for max ovrlp.
317 : real(r8) atmp ! Temporary storage for sort when nxs = 2
318 : real(r8) cld0 ! 1 - (cld amt) used to make wstr, cstr, nstr
319 : real(r8) totwgt(pcols) ! Total of xwgts = total fractional area of
320 : ! grid-box covered by cloud configurations
321 : ! included in solution to fluxes
322 :
323 : real(r8) wgtv(nconfgmax) ! Weights for fluxes
324 : ! 1st index is configuration number
325 : real(r8) wstr(pverp,pverp) ! area weighting factors for streams
326 : ! 1st index is for stream #,
327 : ! 2nd index is for region #
328 :
329 : real(r8) xexpt ! solar direct beam trans. for layer above
330 : real(r8) xrdnd ! diffuse reflectivity for layer above
331 : real(r8) xrupd ! diffuse reflectivity for layer below
332 : real(r8) xrups ! direct-beam reflectivity for layer below
333 : real(r8) xtdnt ! total trans for layers above
334 :
335 : real(r8) xwgt ! product of cloud amounts
336 :
337 : real(r8) yexpt ! solar direct beam trans. for layer above
338 : real(r8) yrdnd ! diffuse reflectivity for layer above
339 : real(r8) yrupd ! diffuse reflectivity for layer below
340 : real(r8) ytdnd ! dif-beam transmission for layers above
341 : real(r8) ytupd ! dif-beam transmission for layers below
342 :
343 : real(r8) zexpt ! solar direct beam trans. for layer above
344 : real(r8) zrdnd ! diffuse reflectivity for layer above
345 : real(r8) zrupd ! diffuse reflectivity for layer below
346 : real(r8) zrups ! direct-beam reflectivity for layer below
347 : real(r8) ztdnt ! total trans for layers above
348 :
349 : logical new_term ! Flag for configurations to include in fluxes
350 : logical region_found ! flag for identifying regions
351 :
352 : integer ccon(nconfgmax,0:pverp,pcols)
353 : ! flags for presence of clouds
354 : ! 1st index is for level # (including
355 : ! layer above top of model and at surface)
356 : ! 2nd index is for configuration #
357 : integer cstr(0:pverp,pverp)
358 : ! flags for presence of clouds
359 : ! 1st index is for level # (including
360 : ! layer above top of model and at surface)
361 : ! 2nd index is for stream #
362 : integer icond(nconfgmax,0:pverp,pcols)
363 : ! Indices for copying rad. properties from
364 : ! one identical downward cld config.
365 : ! to another in adding method (step 2)
366 : ! 1st index is for interface # (including
367 : ! layer above top of model and at surface)
368 : ! 2nd index is for configuration # range
369 : integer iconu(nconfgmax,0:pverp,pcols)
370 : ! Indices for copying rad. properties from
371 : ! one identical upward configuration
372 : ! to another in adding method (step 2)
373 : ! 1st index is for interface # (including
374 : ! layer above top of model and at surface)
375 : ! 2nd index is for configuration # range
376 : integer iconfig ! Counter for random-ovrlap configurations
377 : integer irgn ! Index for max-overlap regions
378 : integer is0 ! Lower end of stream index range
379 : integer is1 ! Upper end of stream index range
380 : integer isn ! Stream index
381 : integer istr(pverp+1) ! index for stream #s during flux calculation
382 : integer istrtd(0:nconfgmax+1,0:pverp,pcols)
383 : ! indices into icond
384 : ! 1st index is for interface # (including
385 : ! layer above top of model and at surface)
386 : ! 2nd index is for configuration # range
387 : integer istrtu(0:nconfgmax+1,0:pverp,pcols)
388 : ! indices into iconu
389 : ! 1st index is for interface # (including
390 : ! layer above top of model and at surface)
391 : ! 2nd index is for configuration # range
392 : integer j ! Configuration index
393 : integer jj ! Configuration index
394 : integer k1 ! Level index
395 : integer k2 ! Level index
396 : integer ksort(pverp) ! Level indices of cloud amounts to be sorted
397 : integer ktmp ! Temporary storage for sort when nxs = 2
398 : integer kx1(0:pverp) ! Level index for top of max-overlap region
399 : integer kx2(0:pverp) ! Level index for bottom of max-overlap region
400 : integer l ! Index
401 : integer l0 ! Index
402 : integer mrgn ! Counter for nrgn
403 : integer mstr ! Counter for nstr
404 : integer n0 ! Number of configurations with ccon(:,k,:)==0
405 : integer n1 ! Number of configurations with ccon(:,k,:)==1
406 : integer nconfig(pcols) ! Number of random-ovrlap configurations
407 : integer nconfigm ! Value of config before testing for areamin,
408 : ! nconfgmax
409 : integer npasses ! number of passes over the indexing loop
410 : integer nrgn ! Number of max overlap regions at current
411 : ! longitude
412 : integer nstr(pverp) ! Number of unique cloud configurations
413 : ! ("streams") in a max-overlapped region
414 : ! 1st index is for region #
415 : integer nuniq ! # of unique cloud configurations
416 : integer nuniqd(0:pverp,pcols) ! # of unique cloud configurations: TOA
417 : ! to level k
418 : integer nuniqu(0:pverp,pcols) ! # of unique cloud configurations: surface
419 : ! to level k
420 : integer nxs ! Number of cloudy layers between k1 and k2
421 : integer ptr0(nconfgmax) ! Indices of configurations with ccon(:,k,:)==0
422 : integer ptr1(nconfgmax) ! Indices of configurations with ccon(:,k,:)==1
423 : integer ptrc(nconfgmax) ! Pointer for configurations sorted by wgtv
424 : integer, dimension(1) :: min_idx ! required for return val of func minloc
425 :
426 : !
427 : ! Other
428 : !
429 : integer ns ! Spectral loop index
430 : integer i ! Longitude loop index
431 : integer k ! Level loop index
432 : integer km1 ! k - 1
433 : integer kp1 ! k + 1
434 : integer n ! Loop index for daylight
435 : integer ksz ! dust size bin index
436 : integer kaer ! aerosol group index
437 : !
438 : ! A. Slingo's data for cloud particle radiative properties (from 'A GCM
439 : ! Parameterization for the Shortwave Properties of Water Clouds' JAS
440 : ! vol. 46 may 1989 pp 1419-1427)
441 : !
442 :
443 : real(r8), parameter :: abarl(4) = (/ 2.817e-02_r8, 2.682e-02_r8,2.264e-02_r8,1.281e-02_r8/)
444 : real(r8), parameter :: bbarl(4) = (/ 1.305_r8 , 1.346_r8 ,1.454_r8 ,1.641_r8 /)
445 : real(r8), parameter :: cbarl(4) = (/-5.62e-08_r8 ,-6.94e-06_r8 ,4.64e-04_r8 ,0.201_r8 /)
446 : real(r8), parameter :: dbarl(4) = (/ 1.63e-07_r8 , 2.35e-05_r8 ,1.24e-03_r8 ,7.56e-03_r8 /)
447 : real(r8), parameter :: ebarl(4) = (/ 0.829_r8 , 0.794_r8 ,0.754_r8 ,0.826_r8 /)
448 : real(r8), parameter :: fbarl(4) = (/ 2.482e-03_r8, 4.226e-03_r8,6.560e-03_r8,4.353e-03_r8/)
449 :
450 : real(r8) :: abarli ! A coefficient for current spectral band
451 : real(r8) :: bbarli ! B coefficient for current spectral band
452 : real(r8) :: cbarli ! C coefficient for current spectral band
453 : real(r8) :: dbarli ! D coefficient for current spectral band
454 : real(r8) :: ebarli ! E coefficient for current spectral band
455 : real(r8) :: fbarli ! F coefficient for current spectral band
456 : !
457 : ! Caution... A. Slingo recommends no less than 4.0 micro-meters nor
458 : ! greater than 20 micro-meters
459 : !
460 : ! ice water coefficients (Ebert and Curry,1992, JGR, 97, 3831-3836)
461 : !
462 : real(r8), parameter :: abari(4) = (/ 3.448e-03_r8, 3.448e-03_r8,3.448e-03_r8,3.448e-03_r8/)
463 : real(r8), parameter :: bbari(4) = (/ 2.431_r8 , 2.431_r8 ,2.431_r8 ,2.431_r8 /)
464 : real(r8), parameter :: cbari(4) = (/ 1.00e-05_r8 , 1.10e-04_r8 ,1.861e-02_r8,.46658_r8 /)
465 : real(r8), parameter :: dbari(4) = (/ 0.0_r8 , 1.405e-05_r8,8.328e-04_r8,2.05e-05_r8 /)
466 : real(r8), parameter :: ebari(4) = (/ 0.7661_r8 , 0.7730_r8 ,0.794_r8 ,0.9595_r8 /)
467 : real(r8), parameter :: fbari(4) = (/ 5.851e-04_r8, 5.665e-04_r8,7.267e-04_r8,1.076e-04_r8/)
468 :
469 : real(r8) :: abarii ! A coefficient for current spectral band
470 : real(r8) :: bbarii ! B coefficient for current spectral band
471 : real(r8) :: cbarii ! C coefficient for current spectral band
472 : real(r8) :: dbarii ! D coefficient for current spectral band
473 : real(r8) :: ebarii ! E coefficient for current spectral band
474 : real(r8) :: fbarii ! F coefficient for current spectral band
475 :
476 : !
477 : ! UPDATE TO H2O NEAR-IR: Delta optimized for Hitran 2K and CKD 2.4
478 : !
479 : real(r8), parameter :: delta = 0.0014257179260883_r8
480 : !
481 : ! END UPDATE
482 : !
483 : real(r8) :: albdir(pcols,nswbands) ! Current spc intrvl srf alb to direct rad
484 : real(r8) :: albdif(pcols,nswbands) ! Current spc intrvl srf alb to diffuse rad
485 : !
486 : ! Next series depends on spectral interval
487 : !
488 : real(r8) :: wgtint ! Weight for specific spectral interval
489 :
490 : !
491 : ! weight for 0.64 - 0.7 microns appropriate to clear skies over oceans
492 : !
493 : real(r8), parameter :: nirwgt(nswbands) = &
494 : (/ 0.0_r8, 0.0_r8, 0.0_r8, 0.0_r8, 0.0_r8, &
495 : 0.0_r8, 0.0_r8, 0.0_r8, 0.320518_r8, 1.0_r8, 1.0_r8, &
496 : 1.0_r8, 1.0_r8, 1.0_r8, 1.0_r8, 1.0_r8, &
497 : 1.0_r8, 1.0_r8, 1.0_r8 /)
498 :
499 : !
500 : ! UPDATE TO H2O NEAR-IR: Rayleigh scattering optimized for Hitran 2K & CKD 2.4
501 : !
502 : real(r8), parameter :: raytau(nswbands) = &
503 : (/ 4.020_r8, 2.180_r8, 1.700_r8, 1.450_r8, 1.250_r8, &
504 : 1.085_r8, 0.730_r8, v_raytau_35, v_raytau_64, &
505 : 0.02899756_r8, 0.01356763_r8, 0.00537341_r8, &
506 : 0.00228515_r8, 0.00105028_r8, 0.00046631_r8, &
507 : 0.00025734_r8, &
508 : .0001_r8, .0001_r8, .0001_r8/)
509 : !
510 : ! END UPDATE
511 : !
512 :
513 : !
514 : ! Absorption coefficients
515 : !
516 : !
517 : ! UPDATE TO H2O NEAR-IR: abh2o optimized for Hitran 2K and CKD 2.4
518 : !
519 : real(r8), parameter :: abh2o(nswbands) = &
520 : (/ .000_r8, .000_r8, .000_r8, .000_r8, .000_r8, &
521 : .000_r8, .000_r8, .000_r8, .000_r8, &
522 : 0.00256608_r8, 0.06310504_r8, 0.42287445_r8, 2.45397941_r8, &
523 : 11.20070807_r8, 47.66091389_r8, 240.19010243_r8, &
524 : .000_r8, .000_r8, .000_r8/)
525 : !
526 : ! END UPDATE
527 : !
528 :
529 : real(r8), parameter :: abo3(nswbands) = &
530 : (/5.370e+04_r8, 13.080e+04_r8, 9.292e+04_r8, 4.530e+04_r8, 1.616e+04_r8, &
531 : 4.441e+03_r8, 1.775e+02_r8, v_abo3_35, v_abo3_64, .000_r8, &
532 : .000_r8, .000_r8 , .000_r8 , .000_r8 , .000_r8, &
533 : .000_r8, .000_r8 , .000_r8 , .000_r8 /)
534 :
535 : real(r8), parameter :: abco2(nswbands) = &
536 : (/ .000_r8, .000_r8, .000_r8, .000_r8, .000_r8, &
537 : .000_r8, .000_r8, .000_r8, .000_r8, .000_r8, &
538 : .000_r8, .000_r8, .000_r8, .000_r8, .000_r8, &
539 : .000_r8, .094_r8, .196_r8, 1.963_r8/)
540 :
541 : real(r8), parameter :: abo2(nswbands) = &
542 : (/ .000_r8, .000_r8, .000_r8, .000_r8, .000_r8, &
543 : .000_r8, .000_r8, .000_r8,1.11e-05_r8,6.69e-05_r8, &
544 : .000_r8, .000_r8, .000_r8, .000_r8, .000_r8, &
545 : .000_r8, .000_r8, .000_r8, .000_r8/)
546 : !
547 : ! Diagnostic and accumulation arrays; note that fswup, and
548 : ! fswdn are not used in the computation,but are retained for future use.
549 : !
550 : real(r8) solflx(pcols) ! Solar flux in current interval
551 : real(r8) totfld (pcols,0:pver) ! Spectrally summed flux divergence
552 : real(r8) totfldc(pcols,0:pver) ! Spectrally summed flux divergence (clearsky)
553 : real(r8) fswup(pcols,0:pverp) ! Spectrally summed up flux
554 : real(r8) fswdn(pcols,0:pverp) ! Spectrally summed down flux
555 : !
556 : ! Cloud radiative property arrays
557 : !
558 : real(r8) tauxcl(pcols,0:pver) ! water cloud extinction optical depth
559 : real(r8) tauxci(pcols,0:pver) ! ice cloud extinction optical depth
560 : real(r8) wcl(pcols,0:pver) ! liquid cloud single scattering albedo
561 : real(r8) gcl(pcols,0:pver) ! liquid cloud asymmetry parameter
562 : real(r8) fcl(pcols,0:pver) ! liquid cloud forward scattered fraction
563 : real(r8) wci(pcols,0:pver) ! ice cloud single scattering albedo
564 : real(r8) gci(pcols,0:pver) ! ice cloud asymmetry parameter
565 : real(r8) fci(pcols,0:pver) ! ice cloud forward scattered fraction
566 :
567 : !
568 : ! Various arrays and other constants:
569 : !
570 : real(r8) pflx(pcols,0:pverp) ! Interface press, including extra layer
571 : real(r8) zenfac(pcols) ! Square root of cos solar zenith angle
572 : real(r8) sqrco2(pcols) ! Square root of the co2 mass mixg ratio
573 : real(r8) tmp1 ! Temporary constant array
574 : real(r8) tmp2 ! Temporary constant array
575 : real(r8) pdel ! Pressure difference across layer
576 : real(r8) path ! Mass path of layer
577 : real(r8) ptop ! Lower interface pressure of extra layer
578 : real(r8) ptho2 ! Used to compute mass path of o2
579 : real(r8) ptho3 ! Used to compute mass path of o3
580 : real(r8) pthco2 ! Used to compute mass path of co2
581 : real(r8) pthh2o ! Used to compute mass path of h2o
582 : real(r8) h2ostr ! Inverse sq. root h2o mass mixing ratio
583 :
584 : real(r8) wavmin(nswbands) ! Spectral interval minimum wavelength
585 : real(r8) wavmax(nswbands) ! Spectral interval maximum wavelength
586 : real(r8) wavmid(nswbands) ! Spectral interval middle wavelength
587 : real(r8) trayoslp ! Rayleigh optical depth/standard pressure
588 : real(r8) tmp1l ! Temporary constant array
589 : real(r8) tmp2l ! Temporary constant array
590 : real(r8) tmp3l ! Temporary constant array
591 : real(r8) tmp1i ! Temporary constant array
592 : real(r8) tmp2i ! Temporary constant array
593 : real(r8) tmp3i ! Temporary constant array
594 : real(r8) rdenom ! Multiple scattering term
595 : real(r8) rdirexp ! layer direct ref times exp transmission
596 : real(r8) tdnmexp ! total transmission - exp transmission
597 : real(r8) psf(nswbands) ! Frac of solar flux in spect interval
598 : !
599 : ! Layer absorber amounts; note that 0 refers to the extra layer added
600 : ! above the top model layer
601 : !
602 : real(r8) uh2o(pcols,0:pver) ! Layer absorber amount of h2o
603 : real(r8) uo3(pcols,0:pver) ! Layer absorber amount of o3
604 : real(r8) uco2(pcols,0:pver) ! Layer absorber amount of co2
605 : real(r8) uo2(pcols,0:pver) ! Layer absorber amount of o2
606 : !
607 : ! Total column absorber amounts:
608 : !
609 : real(r8) uth2o(pcols) ! Total column absorber amount of h2o
610 : real(r8) uto3(pcols) ! Total column absorber amount of o3
611 : real(r8) utco2(pcols) ! Total column absorber amount of co2
612 : real(r8) uto2(pcols) ! Total column absorber amount of o2
613 : !
614 : ! These arrays are defined for pver model layers; 0 refers to the extra
615 : ! layer on top:
616 : !
617 : real(r8) rdir(nswbands,pcols,0:pver) ! Layer reflectivity to direct rad
618 : real(r8) rdif(nswbands,pcols,0:pver) ! Layer reflectivity to diffuse rad
619 : real(r8) tdir(nswbands,pcols,0:pver) ! Layer transmission to direct rad
620 : real(r8) tdif(nswbands,pcols,0:pver) ! Layer transmission to diffuse rad
621 : real(r8) explay(nswbands,pcols,0:pver) ! Solar beam exp trans. for layer
622 :
623 : real(r8) rdirc(nswbands,pcols,0:pver) ! Clear Layer reflec. to direct rad
624 : real(r8) rdifc(nswbands,pcols,0:pver) ! Clear Layer reflec. to diffuse rad
625 : real(r8) tdirc(nswbands,pcols,0:pver) ! Clear Layer trans. to direct rad
626 : real(r8) tdifc(nswbands,pcols,0:pver) ! Clear Layer trans. to diffuse rad
627 : real(r8) explayc(nswbands,pcols,0:pver) ! Solar beam exp trans. clear layer
628 :
629 : real(r8) fus(pcols,pverp) ! Upward flux (added for CRM)
630 : real(r8) fds(pcols,pverp) ! Downward flux (added for CRM)
631 : real(r8) fusc(pcols,pverp) ! Upward clear-sky flux (added for CRM)
632 : real(r8) fdsc(pcols,pverp) ! Downward clear-sky flux (added for CRM)
633 :
634 : real(r8) flxdiv ! Flux divergence for layer
635 :
636 : !
637 : ! Temporary arrays for either clear or cloudy values.
638 : !
639 : real(r8), dimension(nswbands) :: Trdir
640 : real(r8), dimension(nswbands) :: Trdif
641 : real(r8), dimension(nswbands) :: Ttdir
642 : real(r8), dimension(nswbands) :: Ttdif
643 : real(r8), dimension(nswbands) :: Texplay
644 : !
645 : !
646 : ! Radiative Properties:
647 : !
648 : ! There are 1 classes of properties:
649 : ! (1. All-sky bulk properties
650 : ! (2. Clear-sky properties
651 : !
652 : ! The first set of properties are generated during step 2 of the solution.
653 : !
654 : ! These arrays are defined at model interfaces; in 1st index (for level #),
655 : ! 0 is the top of the extra layer above the model top, and
656 : ! pverp is the earth surface. 2nd index is for cloud configuration
657 : ! defined over a whole column.
658 : !
659 : real(r8) exptdn(nswbands,0:pverp,nconfgmax,pcols) ! Sol. beam trans from layers above
660 : real(r8) rdndif(nswbands,0:pverp,nconfgmax,pcols) ! Ref to dif rad for layers above
661 : real(r8) rupdif(nswbands,0:pverp,nconfgmax,pcols) ! Ref to dif rad for layers below
662 : real(r8) rupdir(nswbands,0:pverp,nconfgmax,pcols) ! Ref to dir rad for layers below
663 : real(r8) tdntot(nswbands,0:pverp,nconfgmax,pcols) ! Total trans for layers above
664 : !
665 : ! Bulk properties used during the clear-sky calculation.
666 : !
667 : real(r8) exptdnc(pcols,0:pverp) ! clr: Sol. beam trans from layers above
668 : real(r8) rdndifc(pcols,0:pverp) ! clr: Ref to dif rad for layers above
669 : real(r8) rupdifc(pcols,0:pverp) ! clr: Ref to dif rad for layers below
670 : real(r8) rupdirc(pcols,0:pverp) ! clr: Ref to dir rad for layers below
671 : real(r8) tdntotc(pcols,0:pverp) ! clr: Total trans for layers above
672 :
673 : real(r8) fluxup(nswbands,0:pverp,pcols) ! Up flux at model interface
674 : real(r8) fluxdn(nswbands,0:pverp,pcols) ! Down flux at model interface
675 : real(r8) wexptdn(nswbands,pcols) ! Direct solar beam trans. to surface
676 : !
677 : ! Scalars used in vectorization
678 : !
679 : integer :: kk
680 : !
681 : ! Arrays used in vectorization
682 : !
683 : real(r8) v_wgtv(nconfgmax,pcols) ! Weights for fluxes
684 :
685 : real(r8) :: rdiff, ro, rn
686 : rdiff(ro,rn) = abs((ro-rn)/merge(ro,1.0_r8,ro /= 0.0_r8))
687 :
688 : ! solar variability factor
689 : real(r8) :: sfac(nswbands)
690 :
691 : character(len=16) :: microp_scheme ! microphysics scheme
692 :
693 : !-----------------------------------------------------------------------
694 : ! START OF CALCULATION
695 : !-----------------------------------------------------------------------
696 :
697 749232 : call phys_getopts(microp_scheme_out=microp_scheme)
698 :
699 : !
700 : ! Initialize output fields:
701 : !
702 12510432 : fsds(1:ncol) = 0.0_r8
703 :
704 12510432 : fsnirtoa(1:ncol) = 0.0_r8
705 12510432 : fsnrtoac(1:ncol) = 0.0_r8
706 12510432 : fsnrtoaq(1:ncol) = 0.0_r8
707 :
708 12510432 : fsns(1:ncol) = 0.0_r8
709 12510432 : fsnsc(1:ncol) = 0.0_r8
710 12510432 : fsdsc(1:ncol) = 0.0_r8
711 :
712 12510432 : fsnt(1:ncol) = 0.0_r8
713 12510432 : fsntc(1:ncol) = 0.0_r8
714 12510432 : fsntoa(1:ncol) = 0.0_r8
715 12510432 : fsdtoa(1:ncol) = 0.0_r8
716 12510432 : fsutoa(1:ncol) = 0.0_r8
717 12510432 : fsntoac(1:ncol) = 0.0_r8
718 :
719 12510432 : solin(1:ncol) = 0.0_r8
720 :
721 12510432 : sols(1:ncol) = 0.0_r8
722 12510432 : soll(1:ncol) = 0.0_r8
723 12510432 : solsd(1:ncol) = 0.0_r8
724 12510432 : solld(1:ncol) = 0.0_r8
725 :
726 326020464 : qrs (1:ncol,1:pver) = 0.0_r8
727 326020464 : qrsc(1:ncol,1:pver) = 0.0_r8
728 338530896 : fns(1:ncol,1:pverp) = 0.0_r8
729 338530896 : fcns(1:ncol,1:pverp) = 0.0_r8
730 749232 : if (single_column.and.scm_crm_mode) then
731 0 : fus(1:ncol,1:pverp) = 0.0_r8
732 0 : fds(1:ncol,1:pverp) = 0.0_r8
733 0 : fusc(:ncol,:pverp) = 0.0_r8
734 0 : fdsc(:ncol,:pverp) = 0.0_r8
735 : endif
736 :
737 749232 : tauxcl_out(1:pcols,1:pver) = 0.0_r8
738 749232 : tauxci_out(1:pcols,1:pver) = 0.0_r8
739 :
740 : !
741 : ! If night everywhere, return:
742 : !
743 749232 : if ( Nday == 0 ) then
744 : return
745 : endif
746 :
747 : !
748 : ! Rearrange input arrays
749 : !
750 :
751 391783 : call CmpDayNite(E_pmid, pmid, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 1, pver)
752 391783 : call CmpDayNite(E_pint, pint, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 1, pverp)
753 391783 : call CmpDayNite(E_h2ommr, h2ommr, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 1, pver)
754 391783 : call CmpDayNite(E_o3mmr, o3mmr, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 1, pver)
755 391783 : call CmpDayNite(E_cld, cld, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 1, pver)
756 391783 : call CmpDayNite(E_cicewp, cicewp, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 1, pver)
757 391783 : call CmpDayNite(E_cliqwp, cliqwp, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 1, pver)
758 391783 : call CmpDayNite(E_rel, rel, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 1, pver)
759 391783 : call CmpDayNite(E_rei, rei, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 1, pver)
760 391783 : call CmpDayNite(E_coszrs, coszrs, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
761 391783 : call CmpDayNite(E_asdir, asdir, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
762 391783 : call CmpDayNite(E_aldir, aldir, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
763 391783 : call CmpDayNite(E_asdif, asdif, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
764 391783 : call CmpDayNite(E_aldif, aldif, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
765 391783 : call CmpDayNite(E_co2mmr, co2mmr, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
766 391783 : call CmpDayNite(E_o2mmr, o2mmr, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
767 :
768 391783 : call CmpDayNite(pmxrgn, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 1, pverp)
769 391783 : call CmpDayNite(nmxrgn, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
770 391783 : call CmpDayNite(E_aer_tau, aer_tau, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 0, pver, 1,nswbands)
771 391783 : call CmpDayNite(E_aer_tau_w, aer_tau_w, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 0, pver, 1,nswbands)
772 391783 : call CmpDayNite(E_aer_tau_w_g, aer_tau_w_g, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 0, pver, 1,nswbands)
773 391783 : call CmpDayNite(E_aer_tau_w_f, aer_tau_w_f, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 0, pver, 1,nswbands)
774 :
775 391783 : if (scm_crm_mode) then
776 : ! overwrite albedos for CRM
777 0 : if(have_asdir) asdir = asdirobs(1)
778 0 : if(have_asdif) asdif = asdifobs(1)
779 0 : if(have_aldir) aldir = aldirobs(1)
780 0 : if(have_aldif) aldif = aldifobs(1)
781 : endif
782 : !
783 : ! Perform other initializations
784 : !
785 391783 : tmp1 = 0.5_r8/(gravit*sslp)
786 391783 : tmp2 = delta/gravit
787 :
788 6272383 : do i = 1, Nday
789 6272383 : sqrco2(i) = sqrt(co2mmr(i))
790 : end do
791 :
792 391783 : if ( do_spctrl_scaling ) then
793 0 : call get_variability(sfac)
794 0 : tot_irrad = ref_tsi
795 : else
796 391783 : tot_irrad = sol_tsi
797 : endif
798 :
799 10969924 : do k=1,pverp
800 169746124 : do i=1,Nday
801 169354341 : pflx(i,k) = pint(i,k)
802 : end do
803 : end do
804 :
805 6272383 : do i=1,Nday
806 : !
807 : ! Define solar incident radiation and interface pressures:
808 : !
809 :
810 5880600 : solin(i) = tot_irrad*1.e3_r8*eccf*coszrs(i)
811 :
812 5880600 : pflx(i,0) = 0._r8
813 : !
814 : ! Compute optical paths:
815 : !
816 5880600 : ptop = pflx(i,1)
817 5880600 : ptho2 = o2mmr(i) * ptop / gravit
818 5880600 : ptho3 = o3mmr(i,1) * ptop / gravit
819 5880600 : pthco2 = sqrco2(i) * (ptop / gravit)
820 5880600 : h2ostr = sqrt( 1._r8 / h2ommr(i,1) )
821 5880600 : zenfac(i) = sqrt(coszrs(i))
822 : pthh2o = ptop**2*tmp1 + (ptop*rga)* &
823 5880600 : (h2ostr*zenfac(i)*delta)
824 5880600 : uh2o(i,0) = h2ommr(i,1)*pthh2o
825 5880600 : uco2(i,0) = zenfac(i)*pthco2
826 5880600 : uo2 (i,0) = zenfac(i)*ptho2
827 6272383 : uo3 (i,0) = ptho3
828 : !
829 : ! End do i=1,Nday
830 : !
831 : end do
832 :
833 10578141 : do k=1,pver
834 :
835 163473741 : do i=1,Nday
836 :
837 152895600 : pdel = pflx(i,k+1) - pflx(i,k)
838 152895600 : path = pdel / gravit
839 152895600 : ptho2 = o2mmr(i) * path
840 152895600 : ptho3 = o3mmr(i,k) * path
841 152895600 : pthco2 = sqrco2(i) * path
842 152895600 : h2ostr = sqrt(1.0_r8/h2ommr(i,k))
843 152895600 : pthh2o = (pflx(i,k+1)**2 - pflx(i,k)**2)*tmp1 + pdel*h2ostr*zenfac(i)*tmp2
844 152895600 : uh2o(i,k) = h2ommr(i,k)*pthh2o
845 152895600 : uco2(i,k) = zenfac(i)*pthco2
846 152895600 : uo2 (i,k) = zenfac(i)*ptho2
847 163081958 : uo3 (i,k) = ptho3
848 :
849 : !
850 : ! End do i=1,Nday
851 : !
852 : end do
853 : !
854 : ! End k=1,pver
855 : !
856 : end do
857 : !
858 : ! Compute column absorber amounts for the clear sky computation:
859 : !
860 6272383 : do i=1,Nday
861 :
862 5880600 : uth2o(i) = 0.0_r8
863 5880600 : uto3(i) = 0.0_r8
864 5880600 : utco2(i) = 0.0_r8
865 5880600 : uto2(i) = 0.0_r8
866 :
867 159167983 : do k=1,pver
868 152895600 : uth2o(i) = uth2o(i) + uh2o(i,k)
869 152895600 : uto3(i) = uto3(i) + uo3(i,k)
870 152895600 : utco2(i) = utco2(i) + uco2(i,k)
871 158776200 : uto2(i) = uto2(i) + uo2(i,k)
872 : !
873 : ! End k=1,pver
874 : !
875 : end do
876 : !
877 : ! End do i=1,Nday
878 : !
879 : end do
880 : !
881 : ! Set cloud properties for top (0) layer; so long as tauxcl is zero,
882 : ! there is no cloud above top of model; the other cloud properties
883 : ! are arbitrary:
884 : !
885 6272383 : do i=1,Nday
886 :
887 5880600 : tauxcl(i,0) = 0._r8
888 5880600 : wcl(i,0) = 0.999999_r8
889 5880600 : gcl(i,0) = 0.85_r8
890 5880600 : fcl(i,0) = 0.725_r8
891 5880600 : tauxci(i,0) = 0._r8
892 5880600 : wci(i,0) = 0.999999_r8
893 5880600 : gci(i,0) = 0.85_r8
894 6272383 : fci(i,0) = 0.725_r8
895 : !
896 : ! End do i=1,Nday
897 : !
898 : end do
899 : !
900 : ! Begin spectral loop
901 : !
902 7835660 : do ns=1,nswbands
903 : !
904 : ! Set cloud extinction optical depth, single scatter albedo,
905 : ! asymmetry parameter, and forward scattered fraction:
906 : !
907 7443877 : abarli = abarl(indxsl(ns))
908 7443877 : bbarli = bbarl(indxsl(ns))
909 7443877 : cbarli = cbarl(indxsl(ns))
910 7443877 : dbarli = dbarl(indxsl(ns))
911 7443877 : ebarli = ebarl(indxsl(ns))
912 7443877 : fbarli = fbarl(indxsl(ns))
913 : !
914 7443877 : abarii = abari(indxsl(ns))
915 7443877 : bbarii = bbari(indxsl(ns))
916 7443877 : cbarii = cbari(indxsl(ns))
917 7443877 : dbarii = dbari(indxsl(ns))
918 7443877 : ebarii = ebari(indxsl(ns))
919 7443877 : fbarii = fbari(indxsl(ns))
920 : !
921 : ! adjustfraction within spectral interval to allow for the possibility of
922 : ! sub-divisions within a particular interval:
923 : !
924 7443877 : psf(ns) = 1.0_r8
925 7443877 : if(ph2o(ns)/=0._r8) psf(ns) = psf(ns)*ph2o(ns)
926 7443877 : if(pco2(ns)/=0._r8) psf(ns) = psf(ns)*pco2(ns)
927 7443877 : if(po2 (ns)/=0._r8) psf(ns) = psf(ns)*po2 (ns)
928 :
929 200984679 : do k=1,pver
930 :
931 3106001079 : do i=1,Nday
932 :
933 : ! liquid
934 : ! note that optical properties for liquid valid only
935 : ! in range of 4.2 > rel > 16 micron (Slingo 89)
936 2905016400 : if ( microp_scheme == 'MG' ) then
937 0 : tmp2l = 1._r8 - cbarli - dbarli*min(max(4.2_r8,rel(i,k)),16._r8)
938 0 : tmp3l = fbarli*min(max(4.2_r8,rel(i,k)),16._r8)
939 : else
940 2905016400 : tmp2l = 1._r8 - cbarli - dbarli*rel(i,k)
941 2905016400 : tmp3l = fbarli*rel(i,k)
942 : endif
943 :
944 : ! ice
945 : ! note that optical properties for ice valid only
946 : ! in range of 13 > rei > 130 micron (Ebert and Curry 92)
947 2905016400 : if ( microp_scheme == 'MG' ) then
948 0 : tmp2i = 1._r8 - cbarii - dbarii*min(max(13._r8,rei(i,k)),130._r8)
949 0 : tmp3i = fbarii*min(max(13._r8,rei(i,k)),130._r8)
950 : else
951 2905016400 : tmp2i = 1._r8 - cbarii - dbarii*rei(i,k)
952 2905016400 : tmp3i = fbarii*rei(i,k)
953 : endif
954 :
955 2905016400 : if (cld(i,k) >= cldmin .and. cld(i,k) >= cldeps) then
956 :
957 : ! liquid
958 735757748 : if ( microp_scheme == 'MG' ) then
959 0 : tmp1l = abarli + bbarli/min(max(4.2_r8,rel(i,k)),16._r8)
960 : else
961 735757748 : tmp1l = abarli + bbarli/rel(i,k)
962 : endif
963 :
964 : ! ice
965 735757748 : if ( microp_scheme == 'MG' ) then
966 0 : tmp1i = abarii + bbarii/max(13._r8,min(rei(i,k),130._r8))
967 : else
968 735757748 : tmp1i = abarii + bbarii/rei(i,k)
969 : endif
970 :
971 735757748 : tauxcl(i,k) = cliqwp(i,k)*tmp1l
972 735757748 : tauxci(i,k) = cicewp(i,k)*tmp1i
973 :
974 735757748 : if (ns .eq. idx_sw_diag) then
975 38724092 : tauxcl_out(i,k) = cliqwp(i,k)*tmp1l
976 38724092 : tauxci_out(i,k) = cicewp(i,k)*tmp1i
977 : endif
978 : else
979 2169258652 : tauxcl(i,k) = 0.0_r8
980 2169258652 : tauxci(i,k) = 0.0_r8
981 : endif
982 :
983 : ! Do not let single scatter albedo be 1. Delta-eddington solution
984 : ! for non-conservative case has different analytic form from solution
985 : ! for conservative case, and raddedmx is written for non-conservative case.
986 2905016400 : wcl(i,k) = min(tmp2l,.999999_r8)
987 2905016400 : gcl(i,k) = ebarli + tmp3l
988 2905016400 : fcl(i,k) = gcl(i,k)*gcl(i,k)
989 :
990 2905016400 : wci(i,k) = min(tmp2i,.999999_r8)
991 2905016400 : gci(i,k) = ebarii + tmp3i
992 3098557202 : fci(i,k) = gci(i,k)*gci(i,k)
993 :
994 : end do ! End do i=1,Nday
995 : end do ! End do k=1,pver
996 :
997 :
998 : !
999 : ! Set reflectivities for surface based on mid-point wavelength
1000 : !
1001 7443877 : call get_sw_spectral_boundaries(wavmin, wavmax, 'micrometer')
1002 7443877 : wavmid(ns) = 0.5_r8*(wavmin(ns) + wavmax(ns))
1003 : !
1004 : ! Wavelength less than 0.7 micro-meter
1005 : !
1006 7443877 : if (wavmid(ns) < 0.7_r8 ) then
1007 56451447 : do i=1,Nday
1008 52925400 : albdir(i,ns) = asdir(i)
1009 56451447 : albdif(i,ns) = asdif(i)
1010 : end do
1011 : !
1012 : ! Wavelength greater than 0.7 micro-meter
1013 : !
1014 : else
1015 62723830 : do i=1,Nday
1016 58806000 : albdir(i,ns) = aldir(i)
1017 62723830 : albdif(i,ns) = aldif(i)
1018 : end do
1019 : end if
1020 7443877 : trayoslp = raytau(ns)/sslp
1021 : !
1022 : ! Layer input properties now completely specified; compute the
1023 : ! delta-Eddington solution reflectivities and transmissivities
1024 : ! for each layer
1025 : !
1026 : call raddedmx(coszrs ,Nday , &
1027 : abh2o(ns),abo3(ns) ,abco2(ns),abo2(ns) , &
1028 : uh2o ,uo3 ,uco2 ,uo2 , &
1029 : trayoslp ,pflx ,ns , &
1030 : tauxcl ,wcl ,gcl ,fcl , &
1031 : tauxci ,wci ,gci ,fci , &
1032 : aer_tau(:,:,ns) ,aer_tau_w(:,:,ns) ,aer_tau_w_g(:,:,ns) ,aer_tau_w_f(:,:,ns) , &
1033 : rdir ,rdif ,tdir ,tdif ,explay , &
1034 7835660 : rdirc ,rdifc ,tdirc ,tdifc ,explayc )
1035 : !
1036 : ! End spectral loop
1037 : !
1038 : end do
1039 : !
1040 : !----------------------------------------------------------------------
1041 : !
1042 : ! Solution for max/random cloud overlap.
1043 : !
1044 : ! Steps:
1045 : ! (1. delta-Eddington solution for each layer (called above)
1046 : !
1047 : ! (2. The adding method is used to
1048 : ! compute the reflectivity and transmissivity to direct and diffuse
1049 : ! radiation from the top and bottom of the atmosphere for each
1050 : ! cloud configuration. This calculation is based upon the
1051 : ! max-random overlap assumption.
1052 : !
1053 : ! (3. to solve for the fluxes, combine the
1054 : ! bulk properties of the atmosphere above/below the region.
1055 : !
1056 : ! Index calculations for steps 2-3 are performed outside spectral
1057 : ! loop to avoid redundant calculations. Index calculations (with
1058 : ! application of areamin & nconfgmax conditions) are performed
1059 : ! first to identify the minimum subset of terms for the configurations
1060 : ! satisfying the areamin & nconfgmax conditions. This minimum set is
1061 : ! used to identify the corresponding minimum subset of terms in
1062 : ! steps 2 and 3.
1063 : !
1064 6268528 : do iconfig = 1, nconfgmax
1065 94085745 : ccon(iconfig,0,1:Nday) = 0
1066 94085745 : ccon(iconfig,pverp,1:Nday) = 0
1067 :
1068 94085745 : icond(iconfig,0,1:Nday) = iconfig
1069 94477528 : iconu(iconfig,pverp,1:Nday) = iconfig
1070 : end do
1071 : !
1072 : ! Construction of nuniqu/d, istrtu/d, iconu/d using binary tree
1073 : !
1074 6272383 : nuniqd(0,1:Nday) = 1
1075 6272383 : nuniqu(pverp,1:Nday) = 1
1076 :
1077 6272383 : istrtd(1,0,1:Nday) = 1
1078 6272383 : istrtu(1,pverp,1:Nday) = 1
1079 :
1080 :
1081 : !CSD$ PARALLEL DO PRIVATE( npasses, kx2, mrgn, region_found, k1, k2, kx1, nxs, ksort, asort ) &
1082 : !CSD$ PRIVATE ( ktmp, atmp, cstr, mstr, nstr, cld0, wstr, nrgn, nconfigm, istr, new_term, xwgt ) &
1083 : !CSD$ PRIVATE ( j, ptrc, wgtv, km1, nuniq, is0, is1, n0, n1, ptr0, ptr1, kp1, i, irgn ) &
1084 : !CSD$ PRIVATE ( k, l, iconfig, l0, isn )
1085 6272383 : do i=1,Nday
1086 :
1087 : !----------------------------------------------------------------------
1088 : ! INDEX CALCULATIONS FOR MAX OVERLAP
1089 : !
1090 : ! The column is divided into sets of adjacent layers, called regions,
1091 : ! in which the clouds are maximally overlapped. The clouds are
1092 : ! randomly overlapped between different regions. The number of
1093 : ! regions in a column is set by nmxrgn, and the range of pressures
1094 : ! included in each region is set by pmxrgn.
1095 : !
1096 : ! The following calculations determine the number of unique cloud
1097 : ! configurations (assuming maximum overlap), called "streams",
1098 : ! within each region. Each stream consists of a vector of binary
1099 : ! clouds (either 0 or 100% cloud cover). Over the depth of the region,
1100 : ! each stream requires a separate calculation of radiative properties. These
1101 : ! properties are generated using the adding method from
1102 : ! the radiative properties for each layer calculated by raddedmx.
1103 : !
1104 : ! The upward and downward-propagating streams are treated
1105 : ! separately.
1106 : !
1107 : ! We will refer to a particular configuration of binary clouds
1108 : ! within a single max-overlapped region as a "stream". We will
1109 : ! refer to a particular arrangement of binary clouds over the entire column
1110 : ! as a "configuration".
1111 : !
1112 : ! This section of the code generates the following information:
1113 : ! (1. nrgn : the true number of max-overlap regions (need not = nmxrgn)
1114 : ! (2. nstr : the number of streams in a region (>=1)
1115 : ! (3. cstr : flags for presence of clouds at each layer in each stream
1116 : ! (4. wstr : the fractional horizontal area of a grid box covered
1117 : ! by each stream
1118 : ! (5. kx1,2 : level indices for top/bottom of each region
1119 : !
1120 : ! The max-overlap calculation proceeds in 3 stages:
1121 : ! (1. compute layer radiative properties in raddedmx.
1122 : ! (2. combine these properties between layers
1123 : ! (3. combine properties to compute fluxes at each interface.
1124 : !
1125 : ! Most of the indexing information calculated here is used in steps 2-3
1126 : ! after the call to raddedmx.
1127 : !
1128 : ! Initialize indices for layers to be max-overlapped
1129 : !
1130 : ! Loop to handle fix in totwgt=0. For original overlap config
1131 : ! from npasses = 0.
1132 : !
1133 : npasses = 0
1134 0 : do
1135 20810214 : do irgn = 0, nmxrgn(i)
1136 20810214 : kx2(irgn) = 0
1137 : end do
1138 : mrgn = 0
1139 : !
1140 : ! Outermost loop over regions (sets of adjacent layers) to be max overlapped
1141 : !
1142 14929614 : do irgn = 1, nmxrgn(i)
1143 : !
1144 : ! Calculate min/max layer indices inside region.
1145 : !
1146 9049014 : region_found = .false.
1147 9049014 : if (kx2(irgn-1) < pver) then
1148 9049014 : k1 = kx2(irgn-1)+1
1149 9049014 : kx1(irgn) = k1
1150 9049014 : kx2(irgn) = k1-1
1151 44578071 : do k2 = pver, k1, -1
1152 44578071 : if (pmid(i,k2) <= pmxrgn(i,irgn)) then
1153 9049014 : kx2(irgn) = k2
1154 9049014 : mrgn = mrgn+1
1155 : region_found = .true.
1156 : exit
1157 : end if
1158 : end do
1159 : else
1160 : exit
1161 : endif
1162 :
1163 5880600 : if (region_found) then
1164 : !
1165 : ! Sort cloud areas and corresponding level indices.
1166 : !
1167 9049014 : nxs = 0
1168 : if (cldeps > 0) then
1169 : do k = k1,k2
1170 : if (cld(i,k) >= cldmin .and. cld(i,k) >= cldeps) then
1171 : nxs = nxs+1
1172 : ksort(nxs) = k
1173 : !
1174 : ! We need indices for clouds in order of largest to smallest, so
1175 : ! sort 1-cld in ascending order
1176 : !
1177 : asort(nxs) = 1.0_r8-(floor(cld(i,k)/cldeps)*cldeps)
1178 : end if
1179 : end do
1180 : else
1181 161944614 : do k = k1,k2
1182 161944614 : if (cld(i,k) >= cldmin) then
1183 38724092 : nxs = nxs+1
1184 38724092 : ksort(nxs) = k
1185 : !
1186 : ! We need indices for clouds in order of largest to smallest, so
1187 : ! sort 1-cld in ascending order
1188 : !
1189 38724092 : asort(nxs) = 1.0_r8-cld(i,k)
1190 : end if
1191 : end do
1192 : endif
1193 : !
1194 : ! If nxs eq 1, no need to sort.
1195 : ! If nxs eq 2, sort by swapping if necessary
1196 : ! If nxs ge 3, sort using local sort routine
1197 : !
1198 9049014 : if (nxs == 2) then
1199 2052291 : if (asort(2) < asort(1)) then
1200 1550125 : ktmp = ksort(1)
1201 1550125 : ksort(1) = ksort(2)
1202 1550125 : ksort(2) = ktmp
1203 :
1204 1550125 : atmp = asort(1)
1205 1550125 : asort(1) = asort(2)
1206 1550125 : asort(2) = atmp
1207 : endif
1208 6996723 : else if (nxs >= 3) then
1209 5534586 : call quick_sort(asort(1:nxs),ksort(1:nxs))
1210 : endif
1211 : !
1212 : ! Construct wstr, cstr, nstr for this region
1213 : !
1214 953873116 : cstr(k1:k2,1:nxs+1) = 0
1215 : mstr = 1
1216 : cld0 = 0.0_r8
1217 47773106 : do l = 1, nxs
1218 38724092 : if (asort(l) /= cld0) then
1219 37598493 : wstr(mstr,mrgn) = asort(l) - cld0
1220 37598493 : cld0 = asort(l)
1221 37598493 : mstr = mstr + 1
1222 : endif
1223 207609127 : cstr(ksort(l),mstr:nxs+1) = 1
1224 : end do
1225 9049014 : nstr(mrgn) = mstr
1226 9049014 : wstr(mstr,mrgn) = 1.0_r8 - cld0
1227 : !
1228 : ! End test of region_found = true
1229 : !
1230 : endif
1231 : !
1232 : ! End loop over regions irgn for max-overlap
1233 : !
1234 : end do
1235 5880600 : nrgn = mrgn
1236 : !
1237 : ! Finish construction of cstr for additional top layer
1238 : !
1239 37613302 : cstr(0,1:nstr(1)) = 0
1240 : !
1241 : ! INDEX COMPUTATIONS FOR STEP 2-3
1242 : ! This section of the code generates the following information:
1243 : ! (1. totwgt step 3 total frac. area of configurations satisfying
1244 : ! areamin & nconfgmax criteria
1245 : ! (2. wgtv step 3 frac. area of configurations
1246 : ! (3. ccon step 2 binary flag for clouds in each configuration
1247 : ! (4. nconfig steps 2-3 number of configurations
1248 : ! (5. nuniqu/d step 2 Number of unique cloud configurations for
1249 : ! up/downwelling rad. between surface/TOA
1250 : ! and level k
1251 : ! (6. istrtu/d step 2 Indices into iconu/d
1252 : ! (7. iconu/d step 2 Cloud configurations which are identical
1253 : ! for up/downwelling rad. between surface/TOA
1254 : ! and level k
1255 : !
1256 : ! Number of configurations (all permutations of streams in each region)
1257 : !
1258 14929614 : nconfigm = product(nstr(1: nrgn))
1259 : !
1260 : ! Construction of totwgt, wgtv, ccon, nconfig
1261 : !
1262 14929614 : istr(1: nrgn) = 1
1263 5880600 : nconfig(i) = 0
1264 5880600 : totwgt(i) = 0.0_r8
1265 5880600 : new_term = .true.
1266 96641319 : do iconfig = 1, nconfigm
1267 : xwgt = 1.0_r8
1268 281580814 : do mrgn = 1, nrgn
1269 281580814 : xwgt = xwgt * wstr(istr(mrgn),mrgn)
1270 : end do
1271 90760719 : if (xwgt >= areamin) then
1272 38641753 : nconfig(i) = nconfig(i) + 1
1273 38641753 : if (nconfig(i) <= nconfgmax) then
1274 37842590 : j = nconfig(i)
1275 37842590 : ptrc(nconfig(i)) = nconfig(i)
1276 : else
1277 799163 : nconfig(i) = nconfgmax
1278 799163 : if (new_term) then
1279 666497 : min_idx = minloc(wgtv)
1280 666497 : j = min_idx(1)
1281 : endif
1282 799163 : if (wgtv(j) < xwgt) then
1283 593723 : totwgt(i) = totwgt(i) - wgtv(j)
1284 : new_term = .true.
1285 : else
1286 : new_term = .false.
1287 : endif
1288 : endif
1289 37842590 : if (new_term) then
1290 38436313 : wgtv(j) = xwgt
1291 38436313 : totwgt(i) = totwgt(i) + xwgt
1292 104373107 : do mrgn = 1, nrgn
1293 1103717245 : ccon(j,kx1(mrgn):kx2(mrgn),i) = cstr(kx1(mrgn):kx2(mrgn),istr(mrgn))
1294 : end do
1295 : endif
1296 : endif
1297 :
1298 90760719 : mrgn = nrgn
1299 90760719 : istr(mrgn) = istr(mrgn) + 1
1300 113795766 : do while (istr(mrgn) > nstr(mrgn) .and. mrgn > 1)
1301 17154447 : istr(mrgn) = 1
1302 17154447 : mrgn = mrgn - 1
1303 17154447 : istr(mrgn) = istr(mrgn) + 1
1304 : end do
1305 : !
1306 : ! End do iconfig = 1, nconfigm
1307 : !
1308 : end do
1309 : !
1310 : ! If totwgt(i) = 0 implement maximum overlap and make another pass
1311 : ! if totwgt(i) = 0 on this second pass then terminate.
1312 : !
1313 5880600 : if (totwgt(i) > 0._r8) then
1314 : exit
1315 : else
1316 0 : npasses = npasses + 1
1317 0 : if (npasses >= 2 ) then
1318 0 : write(iulog,*)'RADCSWMX: Maximum overlap of column ','failed'
1319 0 : call endrun('RADCSWMX')
1320 : endif
1321 0 : nmxrgn(i)=1
1322 0 : pmxrgn(i,1)=1.0e30_r8
1323 : end if
1324 : !
1325 : ! End npasses = 0, do
1326 : !
1327 : end do
1328 : !
1329 : ! Finish construction of ccon
1330 : !
1331 :
1332 5880600 : istrtd(2,0,i) = nconfig(i)+1
1333 5880600 : istrtu(2,pverp,i) = nconfig(i)+1
1334 :
1335 164656800 : do k = 1, pverp
1336 158776200 : km1 = k-1
1337 158776200 : nuniq = 0
1338 158776200 : istrtd(1,k,i) = 1
1339 541164606 : do l0 = 1, nuniqd(km1,i)
1340 382388406 : is0 = istrtd(l0,km1,i)
1341 382388406 : is1 = istrtd(l0+1,km1,i)-1
1342 382388406 : n0 = 0
1343 382388406 : n1 = 0
1344 1404138336 : do isn = is0, is1
1345 1021749930 : j = icond(isn,km1,i)
1346 1404138336 : if (ccon(j,k,i) == 0) then
1347 887016785 : n0 = n0 + 1
1348 887016785 : ptr0(n0) = j
1349 : else ! if (ccon(j,k,i) == 1) then
1350 134733145 : n1 = n1 + 1
1351 134733145 : ptr1(n1) = j
1352 : endif
1353 : end do
1354 382388406 : if (n0 > 0) then
1355 328633987 : nuniq = nuniq + 1
1356 328633987 : istrtd(nuniq+1,k,i) = istrtd(nuniq,k,i)+n0
1357 1215650772 : icond(istrtd(nuniq,k,i):istrtd(nuniq+1,k,i)-1,k,i) = ptr0(1:n0)
1358 : endif
1359 541164606 : if (n1 > 0) then
1360 85716409 : nuniq = nuniq + 1
1361 85716409 : istrtd(nuniq+1,k,i) = istrtd(nuniq,k,i)+n1
1362 220449554 : icond(istrtd(nuniq,k,i):istrtd(nuniq+1,k,i)-1,k,i) = ptr1(1:n1)
1363 : endif
1364 : end do
1365 164656800 : nuniqd(k,i) = nuniq
1366 : end do
1367 : !
1368 : ! Find 'transition point' in downward configurations where the number
1369 : ! of 'configurations' changes from 1. This is used to optimize the
1370 : ! construction of the upward configurations.
1371 : ! Note: k1 == transition point
1372 : !
1373 :
1374 69526800 : do k = pverp,0,-1
1375 69526800 : if ( nuniqd(k,i) == 1) then
1376 : k1 = k
1377 : exit
1378 : end if
1379 : end do
1380 :
1381 63880230 : do k = pver, k1+1,-1
1382 57999630 : kp1 = k+1
1383 57999630 : nuniq = 0
1384 57999630 : istrtu(1,k,i) = 1
1385 253767407 : do l0 = 1, nuniqu(kp1,i)
1386 195767777 : is0 = istrtu(l0,kp1,i)
1387 195767777 : is1 = istrtu(l0+1,kp1,i)-1
1388 195767777 : n0 = 0
1389 195767777 : n1 = 0
1390 643879007 : do isn = is0, is1
1391 448111230 : j = iconu(isn,kp1,i)
1392 643879007 : if (ccon(j,k,i) == 0) then
1393 314719835 : n0 = n0 + 1
1394 314719835 : ptr0(n0) = j
1395 : else ! if (ccon(j,k,i) == 1) then
1396 133391395 : n1 = n1 + 1
1397 133391395 : ptr1(n1) = j
1398 : endif
1399 : end do
1400 195767777 : if (n0 > 0) then
1401 145872508 : nuniq = nuniq + 1
1402 145872508 : istrtu(nuniq+1,k,i) = istrtu(nuniq,k,i)+n0
1403 460592343 : iconu(istrtu(nuniq,k,i):istrtu(nuniq+1,k,i)-1,k,i) = ptr0(1:n0)
1404 : endif
1405 253767407 : if (n1 > 0) then
1406 81857259 : nuniq = nuniq + 1
1407 81857259 : istrtu(nuniq+1,k,i) = istrtu(nuniq,k,i)+n1
1408 215248654 : iconu(istrtu(nuniq,k,i):istrtu(nuniq+1,k,i)-1,k,i) = ptr1(1:n1)
1409 : endif
1410 : end do
1411 63880230 : nuniqu(k,i) = nuniq
1412 : end do
1413 : !
1414 : ! Copy identical configurations from 'transition point' to surface.
1415 : !
1416 5880600 : k1 = min(pverp-1,k1)
1417 5880600 : nuniq = nuniqu(k1+1,i)
1418 106657170 : do k = k1,0,-1
1419 100776570 : nuniqu(k,i) = nuniq
1420 674415270 : iconu(1:nuniq,k,i) = iconu(1:nuniq,k1+1,i)
1421 781072440 : istrtu(1:nuniq+1,k,i) = istrtu(1:nuniq+1,k1+1,i)
1422 : end do
1423 :
1424 44114973 : v_wgtv(1:nconfig(i),i) = wgtv(1:nconfig(i))
1425 :
1426 : !
1427 : !----------------------------------------------------------------------
1428 : ! End of index calculations
1429 : !----------------------------------------------------------------------
1430 : !
1431 : ! End do i=1,Nday
1432 : !
1433 : end do
1434 : !CSD$ END PARALLEL
1435 :
1436 : !----------------------------------------------------------------------
1437 : ! Start of flux calculations
1438 : !----------------------------------------------------------------------
1439 : !
1440 : ! Initialize spectrally integrated totals:
1441 : !
1442 169746124 : totfld (1:Nday,0:pver) = 0.0_r8
1443 169746124 : totfldc(1:Nday,0:pver) = 0.0_r8
1444 169746124 : fswup (1:Nday,0:pver) = 0.0_r8
1445 169746124 : fswdn (1:Nday,0:pver) = 0.0_r8
1446 :
1447 6272383 : fswup (1:Nday,pverp) = 0.0_r8
1448 6272383 : fswdn (1:Nday,pverp) = 0.0_r8
1449 : !
1450 : ! Start spectral interval
1451 : !
1452 : !old do ns = 1,nswbands
1453 : !old wgtint = nirwgt(ns)
1454 :
1455 6272383 : do i=1,Nday
1456 :
1457 : !----------------------------------------------------------------------
1458 : ! STEP 2
1459 : !
1460 : !
1461 : ! Apply adding method to solve for radiative properties
1462 : !
1463 : ! first initialize the bulk properties at toa
1464 : !
1465 :
1466 : ! nswbands, 0:pverp, nconfgmax, pcols
1467 :
1468 762732400 : rdndif(:,0,1:nconfig(i),i) = 0.0_r8
1469 762732400 : exptdn(:,0,1:nconfig(i),i) = 1.0_r8
1470 763124183 : tdntot(:,0,1:nconfig(i),i) = 1.0_r8
1471 : !
1472 : ! End do i=1,Nday
1473 : !
1474 : end do
1475 : !
1476 : ! solve for properties involving downward propagation of radiation.
1477 : ! the bulk properties are:
1478 : !
1479 : ! (1. exptdn sol. beam dwn. trans from layers above
1480 : ! (2. rdndif ref to dif rad for layers above
1481 : ! (3. tdntot total trans for layers above
1482 : !
1483 :
1484 : !CSD$ PARALLEL DO PRIVATE( km1, is0, is1, j, jj, Ttdif, Trdif, Trdir, Ttdir, Texplay ) &
1485 : !CSD$ PRIVATE( xexpt, xrdnd, tdnmexp, ytdnd, yrdnd, rdenom, rdirexp, zexpt, zrdnd, ztdnt ) &
1486 : !CSD$ PRIVATE( i, k, l0, ns, isn )
1487 6272383 : do i = 1, Nday
1488 165048583 : do k = 1, pverp
1489 158776200 : km1 = k - 1
1490 547045206 : do l0 = 1, nuniqd(km1,i)
1491 382388406 : is0 = istrtd(l0,km1,i)
1492 382388406 : is1 = istrtd(l0+1,km1,i)-1
1493 :
1494 382388406 : j = icond(is0,km1,i)
1495 :
1496 : !
1497 : ! If cloud in layer, use cloudy layer radiative properties (ccon == 1)
1498 : ! If clear layer, use clear-sky layer radiative properties (ccon /= 1)
1499 : !
1500 382388406 : if ( ccon(j,km1,i) == 1 ) then
1501 1714328180 : Ttdif(:) = tdif(:,i,km1)
1502 1714328180 : Trdif(:) = rdif(:,i,km1)
1503 1714328180 : Trdir(:) = rdir(:,i,km1)
1504 1714328180 : Ttdir(:) = tdir(:,i,km1)
1505 1714328180 : Texplay(:) = explay(:,i,km1)
1506 : else
1507 5933439940 : Ttdif(:) = tdifc(:,i,km1)
1508 5933439940 : Trdif(:) = rdifc(:,i,km1)
1509 5933439940 : Trdir(:) = rdirc(:,i,km1)
1510 5933439940 : Ttdir(:) = tdirc(:,i,km1)
1511 5933439940 : Texplay(:) = explayc(:,i,km1)
1512 : end if
1513 :
1514 7647768120 : do ns = 1, nswbands
1515 7265379714 : xexpt = exptdn(ns,km1,j,i)
1516 7265379714 : xrdnd = rdndif(ns,km1,j,i)
1517 7265379714 : tdnmexp = tdntot(ns,km1,j,i) - xexpt
1518 :
1519 7265379714 : ytdnd = Ttdif(ns)
1520 7265379714 : yrdnd = Trdif(ns)
1521 :
1522 7265379714 : rdenom = 1._r8/(1._r8-yrdnd*xrdnd)
1523 7265379714 : rdirexp = Trdir(ns)*xexpt
1524 :
1525 7265379714 : zexpt = xexpt * Texplay(ns)
1526 7265379714 : zrdnd = yrdnd + xrdnd*(ytdnd**2)*rdenom
1527 : ztdnt = xexpt*Ttdir(ns) + ytdnd* &
1528 7265379714 : (tdnmexp + xrdnd*rdirexp)*rdenom
1529 :
1530 7265379714 : exptdn(ns,k,j,i) = zexpt
1531 7265379714 : rdndif(ns,k,j,i) = zrdnd
1532 7647768120 : tdntot(ns,k,j,i) = ztdnt
1533 : end do ! ns = 1, nswbands
1534 : !
1535 : ! If 2 or more configurations share identical properties at a given level k,
1536 : ! the properties (at level k) are computed once and copied to
1537 : ! all the configurations for efficiency.
1538 : !
1539 1180526130 : do isn = is0+1, is1
1540 639361524 : jj = icond(isn,km1,i)
1541 12787230480 : exptdn(:,k,jj,i) = exptdn(:,k,j,i)
1542 12787230480 : rdndif(:,k,jj,i) = rdndif(:,k,j,i)
1543 13169618886 : tdntot(:,k,jj,i) = tdntot(:,k,j,i)
1544 : end do
1545 :
1546 : !
1547 : ! end do l0 = 1, nuniqd(k,i)
1548 : !
1549 : end do
1550 : !
1551 : ! end do k = 1, pverp
1552 : !
1553 : end do
1554 : !
1555 : ! end do i = 1, Nday
1556 : !
1557 : end do
1558 : !CSD$ END PARALLEL
1559 : !
1560 : ! Solve for properties involving upward propagation of radiation.
1561 : ! The bulk properties are:
1562 : !
1563 : ! (1. rupdif Ref to dif rad for layers below
1564 : ! (2. rupdir Ref to dir rad for layers below
1565 : !
1566 : ! Specify surface boundary conditions (surface albedos)
1567 : !
1568 :
1569 : ! nswbands, 0:pverp, nconfgmax, pcols
1570 391783 : rupdir = 0._r8
1571 391783 : rupdif = 0._r8
1572 6272383 : do i = 1, Nday
1573 118003783 : do ns = 1, nswbands
1574 830740610 : rupdir(ns,pverp,1:nconfig(i),i) = albdir(i,ns)
1575 836621210 : rupdif(ns,pverp,1:nconfig(i),i) = albdif(i,ns)
1576 : end do
1577 : end do
1578 :
1579 6272383 : do i = 1, Nday
1580 165048583 : do k = pver, 0, -1
1581 966025267 : do l0 = 1, nuniqu(k,i)
1582 801368467 : is0 = istrtu(l0,k,i)
1583 801368467 : is1 = istrtu(l0+1,k,i)-1
1584 :
1585 801368467 : j = iconu(is0,k,i)
1586 :
1587 : !
1588 : ! If cloud in layer, use cloudy layer radiative properties (ccon == 1)
1589 : ! If clear layer, use clear-sky layer radiative properties (ccon /= 1)
1590 : !
1591 801368467 : if ( ccon(j,k,i) == 1 ) then
1592 1663980180 : Ttdif(:) = tdif(:,i,k)
1593 1663980180 : Trdif(:) = rdif(:,i,k)
1594 1663980180 : Trdir(:) = rdir(:,i,k)
1595 1663980180 : Ttdir(:) = tdir(:,i,k)
1596 1663980180 : Texplay(:) = explay(:,i,k)
1597 : else
1598 14363389160 : Ttdif(:) = tdifc(:,i,k)
1599 14363389160 : Trdif(:) = rdifc(:,i,k)
1600 14363389160 : Trdir(:) = rdirc(:,i,k)
1601 14363389160 : Ttdir(:) = tdirc(:,i,k)
1602 14363389160 : Texplay(:) = explayc(:,i,k)
1603 : end if
1604 :
1605 16027369340 : do ns = 1, nswbands
1606 15226000873 : xrupd = rupdif(ns,k+1,j,i)
1607 15226000873 : xrups = rupdir(ns,k+1,j,i)
1608 :
1609 : !
1610 : ! If cloud in layer, use cloudy layer radiative properties (ccon == 1)
1611 : ! If clear layer, use clear-sky layer radiative properties (ccon /= 1)
1612 : !
1613 15226000873 : yexpt = Texplay(ns)
1614 15226000873 : yrupd = Trdif(ns)
1615 15226000873 : ytupd = Ttdif(ns)
1616 :
1617 15226000873 : rdenom = 1._r8/( 1._r8 - yrupd*xrupd)
1618 15226000873 : tdnmexp = (Ttdir(ns)-yexpt)
1619 15226000873 : rdirexp = xrups*yexpt
1620 :
1621 15226000873 : zrupd = yrupd + xrupd*(ytupd**2)*rdenom
1622 15226000873 : zrups = Trdir(ns) + ytupd*(rdirexp + xrupd*tdnmexp)*rdenom
1623 :
1624 15226000873 : rupdif(ns,k,j,i) = zrupd
1625 16027369340 : rupdir(ns,k,j,i) = zrups
1626 : end do ! ns = 1, nswbands
1627 : !
1628 : ! If 2 or more configurations share identical properties at a given level k,
1629 : ! the properties (at level k) are computed once and copied to
1630 : ! all the configurations for efficiency.
1631 : !
1632 1180526130 : do isn = is0+1, is1
1633 220381463 : jj = iconu(isn,k,i)
1634 4407629260 : rupdif(:,k,jj,i) = rupdif(:,k,j,i)
1635 5208997727 : rupdir(:,k,jj,i) = rupdir(:,k,j,i)
1636 : end do
1637 :
1638 : !
1639 : ! end do l0 = 1, nuniqu(k,i)
1640 : !
1641 : end do
1642 : !
1643 : ! end do k = pver,0,-1
1644 : !
1645 : end do
1646 : !
1647 : ! end do i = 1, Nday
1648 : !
1649 : end do
1650 : !
1651 : !----------------------------------------------------------------------
1652 : !
1653 : ! STEP 3
1654 : !
1655 : ! Compute up and down fluxes for each interface k. This requires
1656 : ! adding up the contributions from all possible permutations
1657 : ! of streams in all max-overlap regions, weighted by the
1658 : ! product of the fractional areas of the streams in each region
1659 : ! (the random overlap assumption). The adding principle has been
1660 : ! used in step 2 to combine the bulk radiative properties
1661 : ! above and below the interface.
1662 : !
1663 :
1664 : !
1665 : ! Initialize the fluxes
1666 : !
1667 391783 : fluxup = 0.0_r8
1668 391783 : fluxdn = 0.0_r8
1669 :
1670 6272383 : do i = 1, Nday
1671 44114973 : do iconfig = 1, nconfig(i)
1672 37842590 : xwgt = v_wgtv(iconfig,i)
1673 :
1674 1103315710 : do k = 0, pverp
1675 21229692990 : do ns = 1, nswbands
1676 20132257880 : xexpt = exptdn(ns,k,iconfig,i)
1677 20132257880 : xtdnt = tdntot(ns,k,iconfig,i)
1678 20132257880 : xrdnd = rdndif(ns,k,iconfig,i)
1679 20132257880 : xrupd = rupdif(ns,k,iconfig,i)
1680 20132257880 : xrups = rupdir(ns,k,iconfig,i)
1681 : !
1682 : ! Flux computation
1683 : !
1684 20132257880 : rdenom = 1._r8/(1._r8 - xrdnd * xrupd)
1685 :
1686 : fluxup(ns,k,i) = fluxup(ns,k,i) + xwgt * &
1687 20132257880 : ((xexpt * xrups + (xtdnt - xexpt) * xrupd) * rdenom)
1688 : fluxdn(ns,k,i) = fluxdn(ns,k,i) + xwgt * &
1689 21191850400 : (xexpt + (xtdnt - xexpt + xexpt * xrups * xrdnd) * rdenom)
1690 : end do ! do ns = 1, nswbands
1691 : end do
1692 : !
1693 : ! End do iconfig = 1, nconfig(i)
1694 : !
1695 : end do
1696 : !
1697 : ! End do iconfig = 1, Nday
1698 : !
1699 : end do
1700 : !
1701 : ! Normalize by total area covered by cloud configurations included
1702 : ! in solution
1703 : !
1704 6272383 : do i = 1, Nday
1705 170929183 : do k = 0, pverp
1706 3299016600 : do ns = 1, nswbands
1707 3128479200 : fluxup(ns,k,i)=fluxup(ns,k,i) / totwgt(i)
1708 3293136000 : fluxdn(ns,k,i)=fluxdn(ns,k,i) / totwgt(i)
1709 : end do ! do i = 1, nday
1710 : end do ! do k = 0, pverp
1711 : end do ! do i = 1, nday
1712 :
1713 :
1714 : !
1715 : ! Initialize the direct-beam flux at surface
1716 : !
1717 118003783 : wexptdn(:,1:Nday) = 0.0_r8
1718 :
1719 7835660 : do ns = 1,nswbands
1720 7443877 : wgtint = nirwgt(ns)
1721 :
1722 :
1723 119175277 : do i=1,Nday
1724 838184487 : do iconfig = 1, nconfig(i)
1725 : !
1726 : ! Note: exptdn can be directly indexed by iconfig at k=pverp.
1727 : !
1728 830740610 : wexptdn(ns,i) = wexptdn(ns,i) + v_wgtv(iconfig,i) * exptdn(ns,pverp,iconfig,i)
1729 : end do
1730 : end do
1731 :
1732 119175277 : do i=1,Nday
1733 111731400 : wexptdn(ns,i) = wexptdn(ns,i) / totwgt(i)
1734 : !
1735 : ! Monochromatic computation completed; accumulate in totals
1736 : !
1737 111731400 : if ( do_spctrl_scaling ) then
1738 0 : solflx(i) = solin(i)*frcsol(ns)*psf(ns)*sfac(ns)
1739 : else
1740 111731400 : solflx(i) = solin(i)*frcsol(ns)*psf(ns)
1741 : endif
1742 111731400 : fsnt(i) = fsnt(i) + solflx(i)*(fluxdn(ns,1,i) - fluxup(ns,1,i))
1743 111731400 : fsntoa(i)= fsntoa(i) + solflx(i)*(fluxdn(ns,0,i) - fluxup(ns,0,i))
1744 111731400 : fsutoa(i)= fsutoa(i) + solflx(i)*(fluxup(ns,0,i))
1745 111731400 : fsns(i) = fsns(i) + solflx(i)*(fluxdn(ns,pverp,i)-fluxup(ns,pverp,i))
1746 111731400 : fsdtoa(i) = fsdtoa(i) + solflx(i)
1747 111731400 : fswup(i,0) = fswup(i,0) + solflx(i)*fluxup(ns,0,i)
1748 111731400 : fswdn(i,0) = fswdn(i,0) + solflx(i)*fluxdn(ns,0,i)
1749 : !
1750 : ! Down spectral fluxes need to be in mks; thus the .001 conversion factors
1751 : !
1752 111731400 : if (wavmid(ns) < 0.7_r8) then
1753 52925400 : sols(i) = sols(i) + wexptdn(ns,i)*solflx(i)*0.001_r8
1754 52925400 : solsd(i) = solsd(i)+(fluxdn(ns,pverp,i)-wexptdn(ns,i))*solflx(i)*0.001_r8
1755 : else
1756 58806000 : soll(i) = soll(i) + wexptdn(ns,i)*solflx(i)*0.001_r8
1757 58806000 : solld(i) = solld(i)+(fluxdn(ns,pverp,i)-wexptdn(ns,i))*solflx(i)*0.001_r8
1758 58806000 : fsnrtoaq(i) = fsnrtoaq(i) + solflx(i)*(fluxdn(ns,0,i) - fluxup(ns,0,i))
1759 : end if
1760 119175277 : fsnirtoa(i) = fsnirtoa(i) + wgtint*solflx(i)*(fluxdn(ns,0,i) - fluxup(ns,0,i))
1761 :
1762 : !
1763 : ! End do i=1,Nday
1764 : !
1765 : end do
1766 :
1767 :
1768 208428556 : do k=0,pver
1769 3225176356 : do i=1,Nday
1770 : !
1771 : ! Compute flux divergence in each layer using the interface up and down
1772 : ! fluxes:
1773 : !
1774 3016747800 : kp1 = k+1
1775 3016747800 : flxdiv = (fluxdn(ns,k,i) - fluxdn(ns,kp1,i)) + (fluxup(ns,kp1,i) - fluxup(ns,k,i))
1776 3016747800 : totfld(i,k) = totfld(i,k) + solflx(i)*flxdiv
1777 3016747800 : fswdn(i,kp1) = fswdn(i,kp1) + solflx(i)*fluxdn(ns,kp1,i)
1778 3016747800 : fswup(i,kp1) = fswup(i,kp1) + solflx(i)*fluxup(ns,kp1,i)
1779 3016747800 : fns(i,kp1) = fswdn(i,kp1) - fswup(i,kp1)
1780 3217732479 : if (single_column.and.scm_crm_mode) then
1781 0 : fus(i,kp1)=fswup(i,kp1)
1782 0 : fds(i,kp1)=fswdn(i,kp1)
1783 : endif
1784 : end do
1785 : end do
1786 : !
1787 : ! Perform clear-sky calculation
1788 : !
1789 :
1790 119175277 : exptdnc(1:Nday,0) = 1.0_r8
1791 119175277 : rdndifc(1:Nday,0) = 0.0_r8
1792 119175277 : tdntotc(1:Nday,0) = 1.0_r8
1793 119175277 : rupdirc(1:Nday,pverp) = albdir(1:Nday,ns)
1794 119175277 : rupdifc(1:Nday,pverp) = albdif(1:Nday,ns)
1795 :
1796 :
1797 208428556 : do k = 1, pverp
1798 3225176356 : do i=1,Nday
1799 3016747800 : km1 = k - 1
1800 3016747800 : xexpt = exptdnc(i,km1)
1801 3016747800 : xrdnd = rdndifc(i,km1)
1802 3016747800 : yrdnd = rdifc(ns,i,km1)
1803 3016747800 : ytdnd = tdifc(ns,i,km1)
1804 :
1805 3016747800 : exptdnc(i,k) = xexpt*explayc(ns,i,km1)
1806 :
1807 3016747800 : rdenom = 1._r8/(1._r8 - yrdnd*xrdnd)
1808 3016747800 : rdirexp = rdirc(ns,i,km1)*xexpt
1809 3016747800 : tdnmexp = tdntotc(i,km1) - xexpt
1810 :
1811 : tdntotc(i,k) = xexpt*tdirc(ns,i,km1) + ytdnd*(tdnmexp + xrdnd*rdirexp)* &
1812 3016747800 : rdenom
1813 3217732479 : rdndifc(i,k) = yrdnd + xrdnd*(ytdnd**2)*rdenom
1814 : !
1815 : ! End do i=1,Nday
1816 : !
1817 : end do
1818 : end do
1819 :
1820 208428556 : do k=pver,0,-1
1821 3225176356 : do i=1,Nday
1822 3016747800 : xrupd = rupdifc(i,k+1)
1823 3016747800 : yexpt = explayc(ns,i,k)
1824 3016747800 : yrupd = rdifc(ns,i,k)
1825 3016747800 : ytupd = tdifc(ns,i,k)
1826 :
1827 3016747800 : rdenom = 1._r8/( 1._r8 - yrupd*xrupd)
1828 :
1829 3016747800 : rupdirc(i,k) = rdirc(ns,i,k) + ytupd*(rupdirc(i,k+1)*yexpt + &
1830 3016747800 : xrupd*(tdirc(ns,i,k)-yexpt))*rdenom
1831 3217732479 : rupdifc(i,k) = yrupd + xrupd*ytupd**2*rdenom
1832 : !
1833 : ! End do i=1,Nday
1834 : !
1835 : end do
1836 : end do
1837 :
1838 215872433 : do k=0,pverp
1839 3344351633 : do i=1,Nday
1840 3128479200 : rdenom = 1._r8/(1._r8 - rdndifc(i,k)*rupdifc(i,k))
1841 : fluxup(ns,k,i) = (exptdnc(i,k)*rupdirc(i,k) + (tdntotc(i,k)-exptdnc(i,k))*rupdifc(i,k))* &
1842 3128479200 : rdenom
1843 : fluxdn(ns,k,i) = exptdnc(i,k) + &
1844 : (tdntotc(i,k) - exptdnc(i,k) + exptdnc(i,k)*rupdirc(i,k)*rdndifc(i,k))* &
1845 3336907756 : rdenom
1846 : !
1847 : ! End do i=1,Nday
1848 : !
1849 : end do
1850 : end do
1851 :
1852 208428556 : do k=0,pver
1853 3225176356 : do i=1,Nday
1854 : !
1855 : ! Compute flux divergence in each layer using the interface up and down
1856 : ! fluxes:
1857 : !
1858 3016747800 : kp1 = k+1
1859 3016747800 : flxdiv = (fluxdn(ns,k,i) - fluxdn(ns,kp1,i)) + (fluxup(ns,kp1,i) - fluxup(ns,k,i))
1860 3217732479 : totfldc(i,k) = totfldc(i,k) + solflx(i)*flxdiv
1861 : end do
1862 : end do
1863 :
1864 119175277 : do i=1,Nday
1865 111731400 : fsntc(i) = fsntc(i)+solflx(i)*(fluxdn(ns,1,i)-fluxup(ns,1,i))
1866 111731400 : fsntoac(i) = fsntoac(i)+solflx(i)*(fluxdn(ns,0,i)-fluxup(ns,0,i))
1867 111731400 : fsnsc(i) = fsnsc(i)+solflx(i)*(fluxdn(ns,pverp,i)-fluxup(ns,pverp,i))
1868 111731400 : fsdsc(i) = fsdsc(i)+solflx(i)*(fluxdn(ns,pverp,i))
1869 111731400 : fsnrtoac(i) = fsnrtoac(i)+wgtint*solflx(i)*(fluxdn(ns,0,i)-fluxup(ns,0,i))
1870 119175277 : if (single_column.and.scm_crm_mode) then
1871 0 : do k = 1,pverp
1872 0 : fusc(i,k)=fusc(i,k) + solflx(i) * fluxup(ns,k,i)
1873 0 : fdsc(i,k)=fdsc(i,k) + solflx(i) * fluxdn(ns,k,i)
1874 : enddo
1875 : endif
1876 : !
1877 : ! End do i=1,Nday
1878 : !
1879 : end do
1880 :
1881 208820339 : do k = 1,pverp
1882 3225176356 : do i=1,Nday
1883 3217732479 : fcns(i,k)=fcns(i,k) + solflx(i)*(fluxdn(ns,k,i)-fluxup(ns,k,i))
1884 : enddo
1885 : enddo
1886 : !
1887 : ! End of clear sky calculation
1888 : !
1889 :
1890 : !
1891 : ! End of spectral interval loop
1892 : !
1893 : end do
1894 :
1895 6272383 : do i=1,Nday
1896 :
1897 : !
1898 : ! Compute solar heating rate (J/kg/s)
1899 : !
1900 158776200 : do k=1,pver
1901 152895600 : qrs(i,k) = -1.E-4_r8*gravit*totfld(i,k)/(pint(i,k) - pint(i,k+1))
1902 158776200 : qrsc(i,k) = -1.E-4_r8*gravit*totfldc(i,k)/(pint(i,k) - pint(i,k+1))
1903 : end do
1904 : !
1905 : ! Set the downwelling flux at the surface
1906 : !
1907 6272383 : fsds(i) = fswdn(i,pverp)
1908 : !
1909 : ! End do i=1,Nday
1910 : !
1911 : end do
1912 : !
1913 : ! Rearrange output arrays.
1914 : !
1915 : ! intent(inout)
1916 : !
1917 391783 : call ExpDayNite(pmxrgn, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 1, pverp)
1918 391783 : call ExpDayNite(nmxrgn, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
1919 : !
1920 : ! intent(out)
1921 : !
1922 391783 : call ExpDayNite(solin, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
1923 391783 : call ExpDayNite(qrs, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 1, pver)
1924 391783 : call ExpDayNite(qrsc, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 1, pver)
1925 391783 : call ExpDayNite(fns, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 1, pverp)
1926 391783 : call ExpDayNite(fcns, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 1, pverp)
1927 391783 : call ExpDayNite(fsns, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
1928 391783 : call ExpDayNite(fsnt, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
1929 391783 : call ExpDayNite(fsntoa, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
1930 391783 : call ExpDayNite(fsutoa, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
1931 391783 : call ExpDayNite(fsds, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
1932 391783 : call ExpDayNite(fsnsc, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
1933 391783 : call ExpDayNite(fsdsc, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
1934 391783 : call ExpDayNite(fsntc, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
1935 391783 : call ExpDayNite(fsdtoa, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
1936 391783 : call ExpDayNite(fsntoac, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
1937 391783 : call ExpDayNite(sols, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
1938 391783 : call ExpDayNite(soll, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
1939 391783 : call ExpDayNite(solsd, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
1940 391783 : call ExpDayNite(solld, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
1941 391783 : call ExpDayNite(fsnirtoa, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
1942 391783 : call ExpDayNite(fsnrtoac, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
1943 391783 : call ExpDayNite(fsnrtoaq, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
1944 391783 : call ExpDayNite(tauxcl_out, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 1, pver)
1945 391783 : call ExpDayNite(tauxci_out, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 1, pver)
1946 :
1947 : ! these outfld calls don't work for spmd only outfield in scm mode (nonspmd)
1948 391783 : if (single_column.and.scm_crm_mode) then
1949 : ! Following outputs added for CRM
1950 0 : call ExpDayNite(fus, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 1, pverp)
1951 0 : call ExpDayNite(fds, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 1, pverp)
1952 0 : call ExpDayNite(fusc, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 1, pverp)
1953 0 : call ExpDayNite(fdsc, Nday, IdxDay, Nnite, IdxNite, 1, pcols, 1, pverp)
1954 0 : call outfld('FUS ', fus*1.e-3_r8, pcols, lchnk)
1955 0 : call outfld('FDS ', fds*1.e-3_r8, pcols, lchnk)
1956 0 : call outfld('FUSC ', fusc*1.e-3_r8, pcols, lchnk)
1957 0 : call outfld('FDSC ', fdsc*1.e-3_r8, pcols, lchnk)
1958 : endif
1959 : ! write(iulog, '(a, x, i3)') 'radcswmx : exiting, chunk identifier', lchnk
1960 :
1961 : return
1962 749232 : end subroutine radcswmx
1963 :
1964 : !-------------------------------------------------------------------------------
1965 :
1966 7443877 : subroutine raddedmx(coszrs ,ndayc ,abh2o , &
1967 : abo3 ,abco2 ,abo2 ,uh2o ,uo3 , &
1968 : uco2 ,uo2 ,trayoslp,pflx ,ns , &
1969 : tauxcl ,wcl ,gcl ,fcl ,tauxci , &
1970 : wci ,gci ,fci ,aer_tau ,aer_tau_w, &
1971 : aer_tau_w_g, aer_tau_w_f ,rdir ,rdif ,tdir , &
1972 : tdif ,explay ,rdirc ,rdifc ,tdirc , &
1973 : tdifc ,explayc )
1974 : !-----------------------------------------------------------------------
1975 : !
1976 : ! Purpose:
1977 : ! Computes layer reflectivities and transmissivities, from the top down
1978 : ! to the surface using the delta-Eddington solutions for each layer
1979 : !
1980 : ! Method:
1981 : ! For more details , see Briegleb, Bruce P., 1992: Delta-Eddington
1982 : ! Approximation for Solar Radiation in the NCAR Community Climate Model,
1983 : ! Journal of Geophysical Research, Vol 97, D7, pp7603-7612).
1984 : !
1985 : ! Modified for maximum/random cloud overlap by Bill Collins and John
1986 : ! Truesdale
1987 : !
1988 : ! Author: Bill Collins
1989 : !
1990 : !-----------------------------------------------------------------------
1991 :
1992 : !
1993 : ! Minimum total transmission below which no layer computation are done:
1994 : !
1995 : real(r8) trmin ! Minimum total transmission allowed
1996 : real(r8) wray ! Rayleigh single scatter albedo
1997 : real(r8) gray ! Rayleigh asymmetry parameter
1998 : real(r8) fray ! Rayleigh forward scattered fraction
1999 :
2000 : parameter (trmin = 1.e-3_r8)
2001 : parameter (wray = 0.999999_r8)
2002 : parameter (gray = 0.0_r8)
2003 : parameter (fray = 0.1_r8)
2004 : !
2005 : !------------------------------Arguments--------------------------------
2006 : !
2007 : ! Input arguments
2008 : !
2009 : real(r8), intent(in) :: coszrs(pcols) ! Cosine zenith angle
2010 : real(r8), intent(in) :: trayoslp ! Tray/sslp
2011 : real(r8), intent(in) :: pflx(pcols,0:pverp) ! Interface pressure
2012 : real(r8), intent(in) :: abh2o ! Absorption coefficiant for h2o
2013 : real(r8), intent(in) :: abo3 ! Absorption coefficiant for o3
2014 : real(r8), intent(in) :: abco2 ! Absorption coefficiant for co2
2015 : real(r8), intent(in) :: abo2 ! Absorption coefficiant for o2
2016 : real(r8), intent(in) :: uh2o(pcols,0:pver) ! Layer absorber amount of h2o
2017 : real(r8), intent(in) :: uo3(pcols,0:pver) ! Layer absorber amount of o3
2018 : real(r8), intent(in) :: uco2(pcols,0:pver) ! Layer absorber amount of co2
2019 : real(r8), intent(in) :: uo2(pcols,0:pver) ! Layer absorber amount of o2
2020 : real(r8), intent(in) :: tauxcl(pcols,0:pver) ! Cloud extinction optical depth (liquid)
2021 : real(r8), intent(in) :: wcl(pcols,0:pver) ! Cloud single scattering albedo (liquid)
2022 : real(r8), intent(in) :: gcl(pcols,0:pver) ! Cloud asymmetry parameter (liquid)
2023 : real(r8), intent(in) :: fcl(pcols,0:pver) ! Cloud forward scattered fraction (liquid)
2024 : real(r8), intent(in) :: tauxci(pcols,0:pver) ! Cloud extinction optical depth (ice)
2025 : real(r8), intent(in) :: wci(pcols,0:pver) ! Cloud single scattering albedo (ice)
2026 : real(r8), intent(in) :: gci(pcols,0:pver) ! Cloud asymmetry parameter (ice)
2027 : real(r8), intent(in) :: fci(pcols,0:pver) ! Cloud forward scattered fraction (ice)
2028 : real(r8), intent(inout) :: aer_tau(pcols,0:pver) ! Aerosol extinction optical depth
2029 : real(r8), intent(inout) :: aer_tau_w(pcols,0:pver) ! Aerosol single scattering albedo * tau
2030 : real(r8), intent(inout) :: aer_tau_w_g(pcols,0:pver) ! Aerosol asymmetry parameter * w * t
2031 : real(r8), intent(inout) :: aer_tau_w_f(pcols,0:pver) ! Aerosol forward scattered fraction * w * tau
2032 :
2033 : integer, intent(in) :: ndayc ! Number of daylight columns
2034 : integer, intent(in) :: ns ! Index of spectral interval
2035 : !
2036 : ! Input/Output arguments
2037 : !
2038 : ! Following variables are defined for each layer; 0 refers to extra
2039 : ! layer above top of model:
2040 : !
2041 : real(r8), intent(inout) :: rdir(nswbands,pcols,0:pver) ! Layer reflectivity to direct rad
2042 : real(r8), intent(inout) :: rdif(nswbands,pcols,0:pver) ! Layer reflectivity to diffuse rad
2043 : real(r8), intent(inout) :: tdir(nswbands,pcols,0:pver) ! Layer transmission to direct rad
2044 : real(r8), intent(inout) :: tdif(nswbands,pcols,0:pver) ! Layer transmission to diffuse rad
2045 : real(r8), intent(inout) :: explay(nswbands,pcols,0:pver) ! Solar beam exp transm for layer
2046 : !
2047 : ! Corresponding quantities for clear-skies
2048 : !
2049 : real(r8), intent(inout) :: rdirc(nswbands,pcols,0:pver) ! Clear layer reflec. to direct rad
2050 : real(r8), intent(inout) :: rdifc(nswbands,pcols,0:pver) ! Clear layer reflec. to diffuse rad
2051 : real(r8), intent(inout) :: tdirc(nswbands,pcols,0:pver) ! Clear layer trans. to direct rad
2052 : real(r8), intent(inout) :: tdifc(nswbands,pcols,0:pver) ! Clear layer trans. to diffuse rad
2053 : real(r8), intent(inout) :: explayc(nswbands,pcols,0:pver)! Solar beam exp transm clear layer
2054 : !
2055 : !---------------------------Local variables-----------------------------
2056 : !
2057 : integer i ! Column indices
2058 : integer k ! Level index
2059 : integer nn ! Index of column loops (max=ndayc)
2060 :
2061 : real(r8) taugab(pcols) ! Layer total gas absorption optical depth
2062 : real(r8) tauray(pcols) ! Layer rayleigh optical depth
2063 : real(r8) taucsc ! Layer cloud scattering optical depth
2064 : real(r8) tautot ! Total layer optical depth
2065 : real(r8) wtot ! Total layer single scatter albedo
2066 : real(r8) gtot ! Total layer asymmetry parameter
2067 : real(r8) ftot ! Total layer forward scatter fraction
2068 : real(r8) wtau ! rayleigh layer scattering optical depth
2069 : real(r8) wt ! layer total single scattering albedo
2070 : real(r8) ts ! layer scaled extinction optical depth
2071 : real(r8) ws ! layer scaled single scattering albedo
2072 : real(r8) gs ! layer scaled asymmetry parameter
2073 : !
2074 : !---------------------------Statement functions-------------------------
2075 : !
2076 : ! Statement functions and other local variables
2077 : !
2078 : real(r8) alpha ! Term in direct reflect and transmissivity
2079 : real(r8) gamma ! Term in direct reflect and transmissivity
2080 : real(r8) el ! Term in alpha,gamma,n,u
2081 : real(r8) taus ! Scaled extinction optical depth
2082 : real(r8) omgs ! Scaled single particle scattering albedo
2083 : real(r8) asys ! Scaled asymmetry parameter
2084 : real(r8) u ! Term in diffuse reflect and
2085 : ! transmissivity
2086 : real(r8) n ! Term in diffuse reflect and
2087 : ! transmissivity
2088 : real(r8) lm ! Temporary for el
2089 : real(r8) ne ! Temporary for n
2090 : real(r8) w ! Dummy argument for statement function
2091 : real(r8) uu ! Dummy argument for statement function
2092 : real(r8) g ! Dummy argument for statement function
2093 : real(r8) e ! Dummy argument for statement function
2094 : real(r8) f ! Dummy argument for statement function
2095 : real(r8) t ! Dummy argument for statement function
2096 : real(r8) et ! Dummy argument for statement function
2097 : !
2098 : ! Intermediate terms for delta-eddington solution
2099 : !
2100 : real(r8) alp ! Temporary for alpha
2101 : real(r8) gam ! Temporary for gamma
2102 : real(r8) ue ! Temporary for u
2103 : real(r8) arg ! Exponential argument
2104 : real(r8) extins ! Extinction
2105 : real(r8) amg ! Alp - gam
2106 : real(r8) apg ! Alp + gam
2107 : !
2108 : ! ssa <=1 limit for aerosol
2109 : !
2110 : real(r8) :: w_limited(pcols,0:pver) ! Aerosol ssa (limited to < 0.999999)
2111 : real(r8) :: aer_g_limit(pcols,0:pver) ! Aerosol tau_w_g (limited ssa)
2112 : real(r8) :: aer_f_limit(pcols,0:pver) ! Aerosol tau_w_f (limited ssa)
2113 : !
2114 : alpha(w,uu,g,e) = .75_r8*w*uu*((1._r8 + g*(1._r8-w))/(1._r8 - e*e*uu*uu))
2115 : gamma(w,uu,g,e) = .50_r8*w*((3._r8*g*(1._r8-w)*uu*uu + 1._r8)/(1._r8-e*e*uu*uu))
2116 : el(w,g) = sqrt(3._r8*(1._r8-w)*(1._r8 - w*g))
2117 : taus(w,f,t) = (1._r8 - w*f)*t
2118 : omgs(w,f) = (1._r8 - f)*w/(1._r8 - w*f)
2119 : asys(g,f) = (g - f)/(1._r8 - f)
2120 : u(w,g,e) = 1.5_r8*(1._r8 - w*g)/e
2121 : n(uu,et) = ((uu+1._r8)*(uu+1._r8)/et ) - ((uu-1._r8)*(uu-1._r8)*et)
2122 : !
2123 : !-----------------------------------------------------------------------
2124 : !
2125 : ! Compute layer radiative properties
2126 : !
2127 : ! Compute radiative properties (reflectivity and transmissivity for
2128 : ! direct and diffuse radiation incident from above, under clear
2129 : ! and cloudy conditions) and transmission of direct radiation
2130 : ! (under clear and cloudy conditions) for each layer.
2131 : !
2132 208428556 : do k=0,pver
2133 3225176356 : do i=1,ndayc
2134 3016747800 : if(aer_tau(i,k) > 0._r8) then !where(aer_tau > 0._r8)
2135 0 : aer_g_limit(i,k) = aer_tau_w_g(i,k) / aer_tau_w(i,k)
2136 0 : aer_f_limit(i,k) = aer_tau_w_f(i,k) / aer_tau_w(i,k)
2137 0 : aer_tau_w(i,k) = aer_tau(i,k) * min(aer_tau_w(i,k)/aer_tau(i,k) , 0.999999_r8)
2138 : else
2139 3016747800 : aer_tau(i,k) = 0._r8
2140 3016747800 : aer_tau_w(i,k) = 0._r8
2141 3016747800 : aer_g_limit(i,k) = 0._r8
2142 3016747800 : aer_f_limit(i,k) = 0._r8
2143 : endif
2144 3016747800 : aer_tau_w_g(i,k) = aer_tau_w(i,k) * aer_g_limit(i,k)
2145 3217732479 : aer_tau_w_f(i,k) = aer_tau_w(i,k) * aer_f_limit(i,k)
2146 : enddo
2147 : enddo
2148 :
2149 208428556 : do k=0,pver
2150 3225176356 : do i=1,ndayc
2151 3016747800 : tauray(i) = trayoslp*(pflx(i,k+1)-pflx(i,k))
2152 3016747800 : taugab(i) = abh2o*uh2o(i,k) + abo3*uo3(i,k) + abco2*uco2(i,k) + abo2*uo2(i,k)
2153 3016747800 : tautot = tauxcl(i,k) + tauxci(i,k) + tauray(i) + taugab(i) + aer_tau(i,k)
2154 3016747800 : taucsc = tauxcl(i,k)*wcl(i,k) + tauxci(i,k)*wci(i,k) + aer_tau_w(i,k)
2155 3016747800 : wtau = wray*tauray(i)
2156 3016747800 : wt = wtau + taucsc
2157 3016747800 : wtot = wt/tautot
2158 : gtot = (wtau*gray + gcl(i,k)*wcl(i,k)*tauxcl(i,k) &
2159 3016747800 : + gci(i,k)*wci(i,k)*tauxci(i,k) + aer_tau_w_g(i,k))/wt
2160 : ftot = (wtau*fray + fcl(i,k)*wcl(i,k)*tauxcl(i,k) &
2161 3016747800 : + fci(i,k)*wci(i,k)*tauxci(i,k) + aer_tau_w_f(i,k))/wt
2162 3016747800 : ts = taus(wtot,ftot,tautot)
2163 3016747800 : ws = omgs(wtot,ftot)
2164 3016747800 : gs = asys(gtot,ftot)
2165 3016747800 : lm = el(ws,gs)
2166 3016747800 : alp = alpha(ws,coszrs(i),gs,lm)
2167 3016747800 : gam = gamma(ws,coszrs(i),gs,lm)
2168 3016747800 : ue = u(ws,gs,lm)
2169 : !
2170 : ! Limit argument of exponential to 25, in case lm very large:
2171 : !
2172 3016747800 : arg = min(lm*ts,25._r8)
2173 3016747800 : extins = exp(-arg)
2174 3016747800 : ne = n(ue,extins)
2175 3016747800 : rdif(ns,i,k) = (ue+1._r8)*(ue-1._r8)*(1._r8/extins - extins)/ne
2176 3016747800 : tdif(ns,i,k) = 4._r8*ue/ne
2177 : !
2178 : ! Limit argument of exponential to 25, in case coszrs is very small:
2179 : !
2180 3016747800 : arg = min(ts/coszrs(i),25._r8)
2181 3016747800 : explay(ns,i,k) = exp(-arg)
2182 3016747800 : apg = alp + gam
2183 3016747800 : amg = alp - gam
2184 3016747800 : rdir(ns,i,k) = amg*(tdif(ns,i,k)*explay(ns,i,k)-1._r8) + apg*rdif(ns,i,k)
2185 3016747800 : tdir(ns,i,k) = apg*tdif(ns,i,k) + (amg*rdif(ns,i,k)-(apg-1._r8))*explay(ns,i,k)
2186 : !
2187 : ! Under rare conditions, reflectivies and transmissivities can be
2188 : ! negative; zero out any negative values
2189 : !
2190 3016747800 : rdir(ns,i,k) = max(rdir(ns,i,k),0.0_r8)
2191 3016747800 : tdir(ns,i,k) = max(tdir(ns,i,k),0.0_r8)
2192 3016747800 : rdif(ns,i,k) = max(rdif(ns,i,k),0.0_r8)
2193 3016747800 : tdif(ns,i,k) = max(tdif(ns,i,k),0.0_r8)
2194 : !
2195 : ! Clear-sky calculation
2196 : !
2197 3217732479 : if (tauxcl(i,k) == 0.0_r8 .and. tauxci(i,k) == 0.0_r8) then
2198 :
2199 2281020946 : rdirc(ns,i,k) = rdir(ns,i,k)
2200 2281020946 : tdirc(ns,i,k) = tdir(ns,i,k)
2201 2281020946 : rdifc(ns,i,k) = rdif(ns,i,k)
2202 2281020946 : tdifc(ns,i,k) = tdif(ns,i,k)
2203 2281020946 : explayc(ns,i,k) = explay(ns,i,k)
2204 : else
2205 735726854 : tautot = tauray(i) + taugab(i) + aer_tau(i,k)
2206 735726854 : taucsc = aer_tau_w(i,k)
2207 : !
2208 : ! wtau already computed for all-sky
2209 : !
2210 735726854 : wt = wtau + taucsc
2211 735726854 : wtot = wt/tautot
2212 735726854 : gtot = (wtau*gray + aer_tau_w_g(i,k))/wt
2213 735726854 : ftot = (wtau*fray + aer_tau_w_f(i,k))/wt
2214 735726854 : ts = taus(wtot,ftot,tautot)
2215 735726854 : ws = omgs(wtot,ftot)
2216 735726854 : gs = asys(gtot,ftot)
2217 735726854 : lm = el(ws,gs)
2218 735726854 : alp = alpha(ws,coszrs(i),gs,lm)
2219 735726854 : gam = gamma(ws,coszrs(i),gs,lm)
2220 735726854 : ue = u(ws,gs,lm)
2221 : !
2222 : ! Limit argument of exponential to 25, in case lm very large:
2223 : !
2224 735726854 : arg = min(lm*ts,25._r8)
2225 735726854 : extins = exp(-arg)
2226 735726854 : ne = n(ue,extins)
2227 735726854 : rdifc(ns,i,k) = (ue+1._r8)*(ue-1._r8)*(1._r8/extins - extins)/ne
2228 735726854 : tdifc(ns,i,k) = 4._r8*ue/ne
2229 : !
2230 : ! Limit argument of exponential to 25, in case coszrs is very small:
2231 : !
2232 735726854 : arg = min(ts/coszrs(i),25._r8)
2233 735726854 : explayc(ns,i,k) = exp(-arg)
2234 735726854 : apg = alp + gam
2235 735726854 : amg = alp - gam
2236 : rdirc(ns,i,k) = amg*(tdifc(ns,i,k)*explayc(ns,i,k)-1._r8)+ &
2237 735726854 : apg*rdifc(ns,i,k)
2238 : tdirc(ns,i,k) = apg*tdifc(ns,i,k) + (amg*rdifc(ns,i,k) - (apg-1._r8))* &
2239 735726854 : explayc(ns,i,k)
2240 : !
2241 : ! Under rare conditions, reflectivies and transmissivities can be
2242 : ! negative; zero out any negative values
2243 : !
2244 735726854 : rdirc(ns,i,k) = max(rdirc(ns,i,k),0.0_r8)
2245 735726854 : tdirc(ns,i,k) = max(tdirc(ns,i,k),0.0_r8)
2246 735726854 : rdifc(ns,i,k) = max(rdifc(ns,i,k),0.0_r8)
2247 735726854 : tdifc(ns,i,k) = max(tdifc(ns,i,k),0.0_r8)
2248 : end if
2249 : end do
2250 : end do
2251 :
2252 749232 : end subroutine raddedmx
2253 :
2254 : !-------------------------------------------------------------------------------
2255 :
2256 1536 : subroutine radsw_init(gravx)
2257 : !-----------------------------------------------------------------------
2258 : !
2259 : ! Purpose:
2260 : ! Initialize various constants for radiation scheme; note that
2261 : ! the radiation scheme uses cgs units.
2262 : !
2263 : ! Author: W. Collins (H2O parameterization) and J. Kiehl
2264 : !
2265 : !-----------------------------------------------------------------------
2266 : !
2267 : ! Input arguments
2268 : !
2269 : real(r8), intent(in) :: gravx ! Acceleration of gravity (MKS)
2270 :
2271 : real(r8), parameter :: ref_tsi = 1367._r8 ! value supplied by Dan Marsh -- see solvar_woods.F90
2272 : !
2273 : !-----------------------------------------------------------------------
2274 : !
2275 : ! Set general radiation consts; convert to cgs units where appropriate:
2276 : !
2277 1536 : gravit = 100._r8*gravx
2278 1536 : rga = 1._r8/gravit
2279 1536 : sslp = 1.013250e6_r8
2280 :
2281 1536 : end subroutine radsw_init
2282 :
2283 : !-------------------------------------------------------------------------------
2284 :
2285 : end module radsw
|