78 subroutine rrtmgp_lw_main_run(doLWrad, doLWclrsky, top_at_1, doGP_lwscat, &
79 nCol, nLay, nGases,rrtmgp_phys_blksz, &
80 nGauss_angles, icseed_lw, iovr, iovr_convcld, iovr_max, iovr_maxrand, iovr_rand, &
81 iovr_dcorr, iovr_exp, iovr_exprand, isubc_lw, semis, tsfg, p_lay, p_lev, t_lay, &
82 t_lev, vmr_o2, vmr_h2o, vmr_o3, vmr_ch4, vmr_n2o, vmr_co2, &
83 cld_frac, cld_lwp, cld_reliq, cld_iwp, cld_reice, cld_swp, cld_resnow, &
84 cld_rwp, cld_rerain, precip_frac, cld_cnv_lwp, cld_cnv_reliq, cld_cnv_iwp, &
85 cld_cnv_reice, cld_pbl_lwp, cld_pbl_reliq, cld_pbl_iwp, cld_pbl_reice, &
86 cloud_overlap_param, active_gases_array, aerlw_tau, aerlw_ssa, aerlw_g, &
87 fluxlwUP_allsky, fluxlwDOWN_allsky, fluxlwUP_clrsky, fluxlwDOWN_clrsky, &
88 fluxlwUP_radtime, fluxlwDOWN_radtime, fluxlwUP_jac, errmsg, errflg)
91 logical,
intent(in) :: &
96 integer,
intent(in) :: &
111 integer,
intent(in),
dimension(:) :: &
113 real(kind_phys),
dimension(:),
intent(in) :: &
116 real(kind_phys),
dimension(:,:),
intent(in) :: &
127 real(kind_phys),
dimension(:,:),
intent(in) :: &
139 real(kind_phys),
dimension(:,:),
intent(in),
optional :: &
148 real(kind_phys),
dimension(:,:,:),
intent(in) :: &
152 character(len=*),
dimension(:),
intent(in) :: &
156 real(kind_phys),
dimension(:,:),
intent(inout),
optional :: &
158 real(kind_phys),
dimension(:,:),
intent(inout) :: &
165 character(len=*),
intent(out) :: &
167 integer,
intent(out) :: &
171 type(ty_fluxes_byband) :: flux_allsky, flux_clrsky
172 integer :: icol, ilay, igas, iband, icol2, ix, iblck
173 integer,
dimension(rrtmgp_phys_blksz) :: ipseed_lw
175 real(kind_phys),
dimension(rrtmgp_phys_blksz) :: zcf0, zcf1
176 logical,
dimension(rrtmgp_phys_blksz,nLay,lw_gas_props%get_ngpt()) :: maskmcica
177 real(kind_phys),
dimension(rrtmgp_phys_blksz) :: tau_rain, tau_snow
178 real(kind_dbl_prec),
dimension(lw_gas_props%get_ngpt()) :: rng1d
179 real(rte_wp),
dimension(lw_gas_props%get_ngpt(),nLay,rrtmgp_phys_blksz) :: rng3d,rng3d2
180 real(kind_dbl_prec),
dimension(lw_gas_props%get_ngpt()*nLay) :: rng2d
181 real(rte_wp),
dimension(rrtmgp_phys_blksz,nLay+1,lw_gas_props%get_nband()),
target :: &
182 fluxlw_up_allsky, fluxlw_up_clrsky, fluxlw_dn_allsky, fluxlw_dn_clrsky
183 real(rte_wp),
dimension(rrtmgp_phys_blksz,lw_gas_props%get_ngpt()) :: lw_ds
184 real(rte_wp),
dimension(lw_gas_props%get_nband(),rrtmgp_phys_blksz) :: sfc_emiss_byband
185 real(rte_wp),
dimension(rrtmgp_phys_blksz,nLay+1) :: fluxlw_up_jac
186 logical :: dogp_sgs_cnv, dogp_sgs_pbl
188 type(ty_gas_concs) :: gas_concs
189 type(ty_optical_props_1scl) :: lw_optical_props_clrsky, lw_optical_props_aerosol_local
190 type(ty_optical_props_2str) :: lw_optical_props_clouds, lw_optical_props_cloudsbyband, &
191 lw_optical_props_cnvcloudsbyband, lw_optical_props_pblcloudsbyband, &
192 lw_optical_props_precipbyband
193 type(ty_source_func_lw) :: sources
199 if (.not. dolwrad)
return
202 dogp_sgs_cnv = .false.
203 if (
present(cld_cnv_lwp) .and.
present(cld_cnv_reliq) .and. &
204 present(cld_cnv_iwp) .and.
present(cld_cnv_reice))
then
205 dogp_sgs_cnv = .true.
209 dogp_sgs_pbl = .false.
210 if (
present(cld_pbl_lwp) .and.
present(cld_pbl_reliq) .and. &
211 present(cld_pbl_iwp) .and.
present(cld_pbl_reice))
then
212 dogp_sgs_pbl = .true.
220 call check_error_msg(
'rrtmgp_lw_main_gas_concs_run',gas_concs%init(active_gases_array))
223 call check_error_msg(
'rrtmgp_lw_main_gas_optics_run',&
224 lw_optical_props_clrsky%alloc_1scl(rrtmgp_phys_blksz, nlay, lw_gas_props))
225 call check_error_msg(
'rrtmgp_lw_main_sources_run',&
226 sources%alloc(rrtmgp_phys_blksz, nlay, lw_gas_props))
227 call check_error_msg(
'rrtmgp_lw_main_cloud_optics_run',&
228 lw_optical_props_cloudsbyband%alloc_2str(rrtmgp_phys_blksz, nlay, lw_gas_props%get_band_lims_wavenumber()))
229 call check_error_msg(
'rrtmgp_lw_main_precip_optics_run',&
230 lw_optical_props_precipbyband%alloc_2str(rrtmgp_phys_blksz, nlay, lw_gas_props%get_band_lims_wavenumber()))
231 call check_error_msg(
'rrtmgp_lw_mian_cloud_sampling_run', &
232 lw_optical_props_clouds%alloc_2str(rrtmgp_phys_blksz, nlay, lw_gas_props))
233 call check_error_msg(
'rrtmgp_lw_main_aerosol_optics_run',&
234 lw_optical_props_aerosol_local%alloc_1scl(rrtmgp_phys_blksz, nlay, lw_gas_props%get_band_lims_wavenumber()))
235 if (dogp_sgs_cnv)
then
236 call check_error_msg(
'rrtmgp_lw_main_cnv_cloud_optics_run',&
237 lw_optical_props_cnvcloudsbyband%alloc_2str(rrtmgp_phys_blksz, nlay, lw_gas_props%get_band_lims_wavenumber()))
239 if (dogp_sgs_pbl)
then
240 call check_error_msg(
'rrtmgp_lw_main_pbl_cloud_optics_run',&
241 lw_optical_props_pblcloudsbyband%alloc_2str(rrtmgp_phys_blksz, nlay, lw_gas_props%get_band_lims_wavenumber()))
249 do icol=1,ncol,rrtmgp_phys_blksz
250 icol2 = icol + rrtmgp_phys_blksz - 1
255 lw_optical_props_clrsky%tau = 0._kind_phys
256 lw_optical_props_precipbyband%tau = 0._kind_phys
257 lw_optical_props_precipbyband%ssa = 0._kind_phys
258 lw_optical_props_precipbyband%g = 0._kind_phys
259 lw_optical_props_cloudsbyband%tau = 0._kind_phys
260 lw_optical_props_cloudsbyband%ssa = 0._kind_phys
261 lw_optical_props_cloudsbyband%g = 0._kind_phys
262 lw_optical_props_clouds%tau = 0._kind_phys
263 lw_optical_props_clouds%ssa = 0._kind_phys
264 lw_optical_props_clouds%g = 0._kind_phys
265 sources%sfc_source = 0._kind_phys
266 sources%lay_source = 0._kind_phys
267 sources%sfc_source_Jac = 0._kind_phys
268 fluxlw_up_allsky = 0._rte_wp
269 fluxlw_dn_allsky = 0._rte_wp
270 fluxlw_up_clrsky = 0._rte_wp
271 fluxlw_dn_clrsky = 0._rte_wp
272 if (dogp_sgs_cnv) lw_optical_props_cnvcloudsbyband%tau = 0._kind_phys
273 if (dogp_sgs_pbl) lw_optical_props_pblcloudsbyband%tau = 0._kind_phys
276 fluxlw_up_allsky = 0._rte_wp
277 fluxlw_dn_allsky = 0._rte_wp
278 fluxlw_up_clrsky = 0._rte_wp
279 fluxlw_dn_clrsky = 0._rte_wp
280 flux_allsky%bnd_flux_up => fluxlw_up_allsky
281 flux_allsky%bnd_flux_dn => fluxlw_dn_allsky
282 flux_clrsky%bnd_flux_up => fluxlw_up_clrsky
283 flux_clrsky%bnd_flux_dn => fluxlw_dn_clrsky
290 call check_error_msg(
'rrtmgp_lw_main_set_vmr_o2', &
291 gas_concs%set_vmr(trim(active_gases_array(istr_o2)), real(vmr_o2(icol:icol2,:),kind=rte_wp)))
292 call check_error_msg(
'rrtmgp_lw_main_set_vmr_co2', &
293 gas_concs%set_vmr(trim(active_gases_array(istr_co2)),real(vmr_co2(icol:icol2,:),kind=rte_wp)))
294 call check_error_msg(
'rrtmgp_lw_main_set_vmr_ch4', &
295 gas_concs%set_vmr(trim(active_gases_array(istr_ch4)),real(vmr_ch4(icol:icol2,:),kind=rte_wp)))
296 call check_error_msg(
'rrtmgp_lw_main_set_vmr_n2o', &
297 gas_concs%set_vmr(trim(active_gases_array(istr_n2o)),real(vmr_n2o(icol:icol2,:),kind=rte_wp)))
298 call check_error_msg(
'rrtmgp_lw_main_set_vmr_h2o', &
299 gas_concs%set_vmr(trim(active_gases_array(istr_h2o)),real(vmr_h2o(icol:icol2,:),kind=rte_wp)))
300 call check_error_msg(
'rrtmgp_lw_main_set_vmr_o3', &
301 gas_concs%set_vmr(trim(active_gases_array(istr_o3)), real(vmr_o3(icol:icol2,:),kind=rte_wp)))
309 do iblck=1,rrtmgp_phys_blksz
310 if (semis(icol+iblck-1) > eps .and. semis(icol+iblck-1) <= 1._kind_phys)
then
311 do iband=1,lw_gas_props%get_nband()
312 sfc_emiss_byband(iband,iblck) = semis(icol+iblck-1)
315 sfc_emiss_byband(1:lw_gas_props%get_nband(),iblck) = 1.0
324 call check_error_msg(
'rrtmgp_lw_main_gas_optics',lw_gas_props%gas_optics(&
325 real(p_lay(icol:icol2,:),kind=rte_wp), &
326 real(p_lev(icol:icol2,:),kind=rte_wp), &
327 real(t_lay(icol:icol2,:),kind=rte_wp), &
328 real(tsfg(icol:icol2),kind=rte_wp), &
330 lw_optical_props_clrsky, &
332 tlev=real(t_lev(icol:icol2,:),kind=rte_wp)))
340 zcf0(:) = 1._kind_phys
341 zcf1(:) = 1._kind_phys
342 do iblck = 1, rrtmgp_phys_blksz
344 zcf0(iblck) = min(zcf0(iblck), 1._kind_phys - cld_frac(icol+iblck-1,ilay))
346 if (zcf0(iblck) <= ftiny) zcf0(iblck) = 0._kind_phys
347 if (zcf0(iblck) > oneminus) zcf0(iblck) = 1._kind_phys
348 zcf1(iblck) = 1._kind_phys - zcf0(iblck)
351 if (any(zcf1 .gt. eps))
then
353 call check_error_msg(
'rrtmgp_lw_main_cloud_optics',lw_cloud_props%cloud_optics(&
354 real(cld_lwp(icol:icol2,:),kind=rte_wp), &
355 real(cld_iwp(icol:icol2,:),kind=rte_wp), &
356 real(cld_reliq(icol:icol2,:),kind=rte_wp), &
357 real(cld_reice(icol:icol2,:),kind=rte_wp), &
358 lw_optical_props_cloudsbyband))
361 if (dogp_sgs_cnv)
then
363 call check_error_msg(
'rrtmgp_lw_main_cnv_cloud_optics',lw_cloud_props%cloud_optics(&
364 real(cld_cnv_lwp(icol:icol2,:),kind=rte_wp), &
365 real(cld_cnv_iwp(icol:icol2,:),kind=rte_wp), &
366 real(cld_cnv_reliq(icol:icol2,:),kind=rte_wp), &
367 real(cld_cnv_reice(icol:icol2,:),kind=rte_wp), &
368 lw_optical_props_cnvcloudsbyband))
371 call check_error_msg(
'rrtmgp_lw_main_increment_cnvclouds_to_clouds',&
372 lw_optical_props_cnvcloudsbyband%increment(lw_optical_props_cloudsbyband))
376 if (dogp_sgs_pbl)
then
378 call check_error_msg(
'rrtmgp_lw_main_pbl_cloud_optics',lw_cloud_props%cloud_optics(&
379 real(cld_pbl_lwp(icol:icol2,:),kind=rte_wp), &
380 real(cld_pbl_iwp(icol:icol2,:),kind=rte_wp), &
381 real(cld_pbl_reliq(icol:icol2,:),kind=rte_wp), &
382 real(cld_pbl_reice(icol:icol2,:),kind=rte_wp), &
383 lw_optical_props_pblcloudsbyband))
386 call check_error_msg(
'rrtmgp_lw_main_increment_pblclouds_to_clouds',&
387 lw_optical_props_pblcloudsbyband%increment(lw_optical_props_cloudsbyband))
396 tau_rain(:) = 0._kind_phys
397 tau_snow(:) = 0._kind_phys
398 do ix=1,rrtmgp_phys_blksz
400 if (cld_frac(icol+ix-1,ilay) .gt. eps)
then
402 tau_rain(ix) = absrain*cld_rwp(icol+ix-1,ilay)
405 if (cld_swp(icol+ix-1,ilay) .gt. 0. .and. cld_resnow(icol+ix-1,ilay) .gt. 10._kind_phys)
then
406 tau_snow(ix) = abssnow0*1.05756*cld_swp(icol+ix-1,ilay)/cld_resnow(icol+ix-1,ilay)
410 do iband=1,lw_gas_props%get_nband()
411 lw_optical_props_precipbyband%tau(ix,ilay,iband) = tau_rain(ix) + tau_snow(ix)
417 call check_error_msg(
'rrtmgp_lw_main_increment_precip_to_clouds',&
418 lw_optical_props_precipbyband%increment(lw_optical_props_cloudsbyband))
426 if (any(zcf1 .gt. eps))
then
428 if(isubc_lw == 1)
then
429 do ix=1,rrtmgp_phys_blksz
430 ipseed_lw(ix) = lw_gas_props%get_ngpt() + icol + ix - 1
432 elseif (isubc_lw == 2)
then
433 do ix=1,rrtmgp_phys_blksz
434 ipseed_lw(ix) = icseed_lw(icol+ix-1)
439 do ix=1,rrtmgp_phys_blksz
442 if (iovr == iovr_max)
then
445 rng3d(:,ilay,ix) = rng1d
450 rng3d(:,ilay,ix) = rng1d
457 if (iovr == iovr_maxrand .or. iovr == iovr_rand .or. iovr == iovr_max)
then
458 call sampled_mask(rng3d, real(cld_frac(icol:icol2,:),kind=rte_wp), maskmcica)
461 if (iovr == iovr_dcorr)
then
462 do ix=1,rrtmgp_phys_blksz
466 rng3d2(:,:,ix) = reshape(source = rng2d,shape=[lw_gas_props%get_ngpt(),nlay])
469 call sampled_mask(rng3d, real(cld_frac(icol:icol2,:),kind=rte_wp), &
470 maskmcica, overlap_param = real(cloud_overlap_param(icol:icol2,1:nlay-1),kind=rte_wp), &
474 if (iovr == iovr_exp .or. iovr == iovr_exprand)
then
475 call sampled_mask(rng3d, real(cld_frac(icol:icol2,:),kind=rte_wp), &
476 maskmcica, overlap_param = real(cloud_overlap_param(icol:icol2,1:nlay-1),kind=rte_wp))
479 call check_error_msg(
'rrtmgp_lw_main_cloud_sampling',&
480 draw_samples(maskmcica, .true., &
481 lw_optical_props_cloudsbyband, lw_optical_props_clouds))
490 lw_optical_props_aerosol_local%tau = aerlw_tau(icol:icol2,:,:)
491 call check_error_msg(
'rrtmgp_lw_main_increment_aerosol_to_clrsky',&
492 lw_optical_props_aerosol_local%increment(lw_optical_props_clrsky))
496 call check_error_msg(
'rrtmgp_lw_main_opt_angle',&
497 lw_gas_props%compute_optimal_angles(lw_optical_props_clrsky,lw_ds))
498 if (ngauss_angles .gt. 1)
then
499 call check_error_msg(
'rrtmgp_lw_main_lw_rte_clrsky',rte_lw( &
500 lw_optical_props_clrsky, &
505 n_gauss_angles = ngauss_angles))
507 call check_error_msg(
'rrtmgp_lw_main_lw_rte_clrsky',rte_lw( &
508 lw_optical_props_clrsky, &
517 fluxlwup_clrsky(icol:icol2,:) = sum(flux_clrsky%bnd_flux_up, dim=3)
518 fluxlwdown_clrsky(icol:icol2,:) = sum(flux_clrsky%bnd_flux_dn, dim=3)
520 fluxlwup_clrsky(icol:icol2,:) = 0.0
521 fluxlwdown_clrsky(icol:icol2,:) = 0.0
540 if (dogp_lwscat)
then
542 call check_error_msg(
'rrtmgp_lw_main_increment_clrsky_to_clouds',&
543 lw_optical_props_clrsky%increment(lw_optical_props_clouds))
545 if (
present(fluxlwup_jac))
then
547 call check_error_msg(
'rrtmgp_lw_main_lw_rte_allsky',rte_lw( &
548 lw_optical_props_clouds, &
553 n_gauss_angles = ngauss_angles, &
554 flux_up_jac = fluxlw_up_jac))
556 call check_error_msg(
'rrtmgp_lw_main_lw_rte_allsky',rte_lw( &
557 lw_optical_props_clouds, &
562 n_gauss_angles = ngauss_angles))
567 call check_error_msg(
'rrtmgp_lw_main_increment_clouds_to_clrsky', &
568 lw_optical_props_clouds%increment(lw_optical_props_clrsky))
570 if (
present(fluxlwup_jac))
then
572 call check_error_msg(
'rrtmgp_lw_rte_run',rte_lw( &
573 lw_optical_props_clrsky, &
578 n_gauss_angles = ngauss_angles, &
579 flux_up_jac = fluxlw_up_jac))
581 call check_error_msg(
'rrtmgp_lw_rte_run',rte_lw( &
582 lw_optical_props_clrsky, &
587 n_gauss_angles = ngauss_angles))
592 fluxlwup_allsky(icol:icol2,:) = sum(flux_allsky%bnd_flux_up, dim=3)
593 fluxlwdown_allsky(icol:icol2,:) = sum(flux_allsky%bnd_flux_dn, dim=3)
596 if (
present(fluxlwup_jac))
then
597 fluxlwup_jac(icol:icol2,:) = fluxlw_up_jac
599 fluxlwup_radtime(icol:icol2,:) = fluxlwup_allsky(icol:icol2,:)
600 fluxlwdown_radtime(icol:icol2,:) = fluxlwdown_allsky(icol:icol2,:)