53 private :: rd_mstrn_setup
54 private :: rd_mstrn_dtrn3
55 private :: rd_mstrn_two_stream
61 real(RP),
private,
parameter :: rd_cossza_min = 0.017_rp
62 real(RP),
private,
parameter :: rd_eps = 1.e-4_rp
64 real(RP),
private :: rd_toa = 100.0_rp
65 integer,
private :: rd_kadd = 10
66 integer,
private,
parameter :: rd_naero =
n_hyd +
n_ae 67 integer,
private,
parameter :: rd_hydro_str = 1
68 integer,
private,
parameter :: rd_hydro_end =
n_hyd 69 integer,
private,
parameter :: rd_aero_str =
n_hyd + 1
70 integer,
private,
parameter :: rd_aero_end =
n_hyd +
n_ae 72 integer,
private :: rd_kmax
74 real(RP),
private,
allocatable :: rd_zh (:)
75 real(RP),
private,
allocatable :: rd_z (:)
76 real(RP),
private,
allocatable :: rd_rhodz (:)
77 real(RP),
private,
allocatable :: rd_pres (:)
78 real(RP),
private,
allocatable :: rd_presh (:)
79 real(RP),
private,
allocatable :: rd_temp (:)
80 real(RP),
private,
allocatable :: rd_temph (:)
81 real(RP),
private,
allocatable :: rd_gas (:,:)
82 real(RP),
private,
allocatable :: rd_cfc (:,:)
83 real(RP),
private,
allocatable :: rd_aerosol_conc(:,:)
84 real(RP),
private,
allocatable :: rd_aerosol_radi(:,:)
85 real(RP),
private,
allocatable :: rd_cldfrac (:)
87 integer,
private :: i_mpae2rd (rd_naero)
88 data i_mpae2rd(1 :
n_hyd ) / 1, 1, 2, 2, 2, 2 /
91 character(len=H_LONG),
private :: mstrn_gaspara_inputfile =
'PARAG.29' 92 character(len=H_LONG),
private :: mstrn_aeropara_inputfile =
'PARAPC.29' 93 character(len=H_LONG),
private :: mstrn_hygropara_inputfile =
'VARDATA.RM29' 95 integer,
private :: mstrn_nband = 29
97 integer,
private,
parameter :: mstrn_nstream = 1
98 integer,
private,
parameter :: mstrn_ch_limit = 10
99 integer,
private,
parameter :: mstrn_nflag = 7
100 integer,
private,
parameter :: mstrn_nfitp = 26
101 integer,
private,
parameter :: mstrn_nfitt = 3
103 integer,
private,
parameter :: mstrn_ngas = 7
111 integer,
private,
parameter :: mstrn_ncfc = 28
139 integer,
private :: mstrn_nptype = 9
150 integer,
private,
parameter :: mstrn_nsfc = 7
158 integer,
private,
parameter :: mstrn_nfitplk = 5
159 integer,
private,
parameter :: mstrn_nplkord = 3
160 integer,
private,
parameter :: mstrn_nmoment = 6
161 integer,
private :: mstrn_nradius = 8
162 integer,
private,
parameter :: mstrn_ncloud = 2
164 logical,
private :: atmos_phy_rd_mstrn_only_qci = .false.
165 logical,
private :: atmos_phy_rd_mstrn_only_tropocloud = .false.
169 real(RP),
private,
allocatable :: waveh (:)
171 real(RP),
private,
allocatable :: logfitp (:)
172 real(RP),
private,
allocatable :: fitt (:)
173 real(RP),
private,
allocatable :: logfitt (:)
174 integer,
private,
allocatable :: iflgb (:,:)
175 integer,
private,
allocatable :: nch (:)
176 real(RP),
private,
allocatable :: wgtch (:,:)
177 integer,
private,
allocatable :: ngasabs (:)
178 integer,
private,
allocatable :: igasabs (:,:)
180 real(RP),
private,
allocatable :: akd (:,:,:,:,:)
181 real(RP),
private,
allocatable :: skd (:,:,:,:)
182 real(RP),
private,
allocatable :: acfc (:,:)
184 real(RP),
private,
allocatable :: fitplk (:,:)
185 real(RP),
private,
allocatable :: fsol (:)
186 real(RP),
private :: fsol_tot
187 real(RP),
private,
allocatable :: sfc (:,:)
188 real(RP),
private,
allocatable :: rayleigh(:)
189 real(RP),
private,
allocatable :: qmol (:,:)
190 real(RP),
private,
allocatable :: q (:,:,:,:)
192 integer,
private,
allocatable :: hygro_flag(:)
193 real(RP),
private,
allocatable :: radmode (:,:)
198 integer,
private,
parameter :: i_swlw = 4
199 integer,
private,
parameter :: i_h2o_continuum = 5
200 integer,
private,
parameter :: i_cfc_continuum = 7
202 integer,
private,
parameter :: i_clearsky = 1
203 integer,
private,
parameter :: i_cloud = 2
206 real(RP),
private :: rho_std
208 real(RP),
private :: m(2)
209 real(RP),
private :: w(2)
210 real(RP),
private :: wmns(2), wpls(2)
211 real(RP),
private :: wbar(2), wscale(2)
236 integer,
intent(in) :: KA, KS, KE
238 real(RP),
intent(in) :: CZ(ka)
239 real(RP),
intent(in) :: FZ(0:ka)
241 real(RP) :: ATMOS_PHY_RD_MSTRN_TOA
242 integer :: ATMOS_PHY_RD_MSTRN_KADD
243 character(len=H_LONG) :: ATMOS_PHY_RD_MSTRN_GASPARA_IN_FILENAME
244 character(len=H_LONG) :: ATMOS_PHY_RD_MSTRN_AEROPARA_IN_FILENAME
245 character(len=H_LONG) :: ATMOS_PHY_RD_MSTRN_HYGROPARA_IN_FILENAME
246 integer :: ATMOS_PHY_RD_MSTRN_nband
247 integer :: ATMOS_PHY_RD_MSTRN_nptype
248 integer :: ATMOS_PHY_RD_MSTRN_nradius
250 namelist / param_atmos_phy_rd_mstrn / &
251 atmos_phy_rd_mstrn_toa, &
252 atmos_phy_rd_mstrn_kadd, &
253 atmos_phy_rd_mstrn_gaspara_in_filename, &
254 atmos_phy_rd_mstrn_aeropara_in_filename, &
255 atmos_phy_rd_mstrn_hygropara_in_filename, &
256 atmos_phy_rd_mstrn_nband, &
257 atmos_phy_rd_mstrn_nptype, &
258 atmos_phy_rd_mstrn_nradius, &
259 atmos_phy_rd_mstrn_only_qci, &
260 atmos_phy_rd_mstrn_only_tropocloud
263 integer :: ngas, ncfc
268 log_info(
"ATMOS_PHY_RD_mstrnx_setup",*)
'Setup' 269 log_info(
"ATMOS_PHY_RD_mstrnx_setup",*)
'Sekiguchi and Nakajima (2008) mstrnX radiation process' 272 atmos_phy_rd_mstrn_toa = rd_toa
273 atmos_phy_rd_mstrn_kadd = rd_kadd
274 atmos_phy_rd_mstrn_gaspara_in_filename = mstrn_gaspara_inputfile
275 atmos_phy_rd_mstrn_aeropara_in_filename = mstrn_aeropara_inputfile
276 atmos_phy_rd_mstrn_hygropara_in_filename = mstrn_hygropara_inputfile
277 atmos_phy_rd_mstrn_nband = mstrn_nband
278 atmos_phy_rd_mstrn_nptype = mstrn_nptype
279 atmos_phy_rd_mstrn_nradius = mstrn_nradius
282 read(
io_fid_conf,nml=param_atmos_phy_rd_mstrn,iostat=ierr)
284 log_info(
"ATMOS_PHY_RD_mstrnx_setup",*)
'Not found namelist. Default used.' 285 elseif( ierr > 0 )
then 286 log_error(
"ATMOS_PHY_RD_mstrnx_setup",*)
'Not appropriate names in namelist PARAM_ATMOS_PHY_RD_MSTRN. Check!' 289 log_nml(param_atmos_phy_rd_mstrn)
291 rd_toa = atmos_phy_rd_mstrn_toa
292 rd_kadd = atmos_phy_rd_mstrn_kadd
293 mstrn_gaspara_inputfile = atmos_phy_rd_mstrn_gaspara_in_filename
294 mstrn_aeropara_inputfile = atmos_phy_rd_mstrn_aeropara_in_filename
295 mstrn_hygropara_inputfile = atmos_phy_rd_mstrn_hygropara_in_filename
296 mstrn_nband = atmos_phy_rd_mstrn_nband
297 mstrn_nptype = atmos_phy_rd_mstrn_nptype
298 mstrn_nradius = atmos_phy_rd_mstrn_nradius
301 call rd_mstrn_setup( ngas, &
305 call rd_profile_setup
308 rd_kmax = kmax + rd_kadd
312 allocate( rd_zh(rd_kmax+1) )
313 allocate( rd_z(rd_kmax ) )
315 allocate( rd_rhodz(rd_kmax ) )
316 allocate( rd_pres(rd_kmax ) )
317 allocate( rd_presh(rd_kmax+1) )
318 allocate( rd_temp(rd_kmax ) )
319 allocate( rd_temph(rd_kmax+1) )
321 allocate( rd_gas(rd_kmax,ngas ) )
322 allocate( rd_cfc(rd_kmax,ncfc ) )
323 allocate( rd_aerosol_conc(rd_kmax,rd_naero) )
324 allocate( rd_aerosol_radi(rd_kmax,rd_naero) )
325 allocate( rd_cldfrac(rd_kmax ) )
328 call rd_profile_setup_zgrid( &
331 rd_toa, cz(:), fz(:), &
335 call rd_profile_read( rd_kmax, &
350 rd_aerosol_conc(:,:), &
351 rd_aerosol_radi(:,:), &
360 KA, KS, KE, IA, IS, IE, JA, JS, JE, &
361 DENS, TEMP, PRES, QV, &
366 temp_sfc, albedo_sfc, &
368 CLDFRAC, MP_Re, MP_Qe, &
396 integer,
intent(in) :: KA, KS, KE
397 integer,
intent(in) :: IA, IS, IE
398 integer,
intent(in) :: JA, JS, JE
400 real(RP),
intent(in) :: DENS (ka,ia,ja)
401 real(RP),
intent(in) :: TEMP (ka,ia,ja)
402 real(RP),
intent(in) :: PRES (ka,ia,ja)
403 real(RP),
intent(in) :: QV (ka,ia,ja)
404 real(RP),
intent(in) :: CZ ( ka,ia,ja)
405 real(RP),
intent(in) :: FZ (0:ka,ia,ja)
406 real(RP),
intent(in) :: fact_ocean (ia,ja)
407 real(RP),
intent(in) :: fact_land (ia,ja)
408 real(RP),
intent(in) :: fact_urban (ia,ja)
409 real(RP),
intent(in) :: temp_sfc (ia,ja)
411 real(RP),
intent(in) :: solins (ia,ja)
412 real(RP),
intent(in) :: cosSZA (ia,ja)
413 real(RP),
intent(in) :: cldfrac (ka,ia,ja)
414 real(RP),
intent(in) :: MP_Re (ka,ia,ja,
n_hyd)
415 real(RP),
intent(in) :: MP_Qe (ka,ia,ja,
n_hyd)
416 real(RP),
intent(in) :: AE_Re (ka,ia,ja,
n_ae)
418 real(RP),
intent(out) :: flux_rad (ka,ia,ja,2,2,2)
419 real(RP),
intent(out) :: flux_rad_top (ia,ja,2,2,2)
422 real(RP),
intent(out),
optional :: dtau_s(ka,ia,ja)
423 real(RP),
intent(out),
optional :: dem_s (ka,ia,ja)
426 integer :: tropopause(ia,ja)
429 real(RP),
parameter :: min_cldfrac = 1.e-8_rp
431 real(RP) :: rhodz_merge (rd_kmax,ia,ja)
432 real(RP) :: pres_merge (rd_kmax,ia,ja)
433 real(RP) :: temp_merge (rd_kmax,ia,ja)
434 real(RP) :: temph_merge (rd_kmax+1,ia,ja)
436 real(RP) :: gas_merge (rd_kmax,ia,ja,mstrn_ngas)
437 real(RP) :: cfc_merge (rd_kmax,ia,ja,mstrn_ncfc)
438 real(RP) :: aerosol_conc_merge(rd_kmax,ia,ja,rd_naero )
439 real(RP) :: aerosol_radi_merge(rd_kmax,ia,ja,rd_naero )
440 real(RP) :: cldfrac_merge (rd_kmax,ia,ja)
443 real(RP) :: flux_rad_merge(rd_kmax+1,ia,ja,2,2,mstrn_ncloud)
444 real(RP) :: tauCLD_067u (rd_kmax,ia,ja)
445 real(RP) :: emisCLD_105u (rd_kmax,ia,ja)
449 integer :: ihydro, iaero
450 integer :: RD_k, k, i, j, v, ic
453 log_progress(*)
'atmosphere / physics / radiation / mstrnX' 457 if ( atmos_phy_rd_mstrn_only_tropocloud )
then 465 tropopause(i,j) = ke+1
467 if ( pres(k,i,j) >= 300.e+2_rp )
then 469 elseif( pres(k,i,j) < 50.e+2_rp )
then 472 gamma = ( temp(k+1,i,j) - temp(k,i,j) ) / ( cz(k+1,i,j) - cz(k,i,j) )
473 if( gamma > 1.e-4_rp ) tropopause(i,j) = k
486 tropopause(i,j) = ke+1
493 if ( rd_profile_use_climatology )
then 494 call rd_profile_read( rd_kmax, &
509 rd_aerosol_conc(:,:), &
510 rd_aerosol_radi(:,:), &
521 temph_merge(rd_k,i,j) = rd_temph(rd_k)
524 temph_merge(rd_kadd+1,i,j) = temp(ke,i,j)
525 do rd_k = rd_kadd+2, rd_kmax
526 k = ks + rd_kmax - rd_k
528 temph_merge(rd_k,i,j) = ( temp(k ,i,j) * (cz(k+1,i,j)-fz(k,i,j)) / (cz(k+1,i,j)-cz(k,i,j)) &
529 + temp(k+1,i,j) * (fz(k ,i,j)-cz(k,i,j)) / (cz(k+1,i,j)-cz(k,i,j)) )
531 temph_merge(rd_kmax+1,i,j) = temp(ks,i,j)
544 rhodz_merge(rd_k,i,j) = rd_rhodz(rd_k)
545 pres_merge(rd_k,i,j) = rd_pres(rd_k)
546 temp_merge(rd_k,i,j) = rd_temp(rd_k)
549 do rd_k = rd_kadd+1, rd_kmax
550 k = ks + rd_kmax - rd_k
552 rhodz_merge(rd_k,i,j) = dens(k,i,j) * ( fz(k,i,j)-fz(k-1,i,j) )
553 pres_merge(rd_k,i,j) = pres(k,i,j) * 1.e-2_rp
554 temp_merge(rd_k,i,j) = temp(k,i,j)
570 gas_merge(rd_k,i,j,v) = rd_gas(rd_k,v)
583 do rd_k = rd_kadd+1, rd_kmax
584 k = ks + rd_kmax - rd_k
585 zerosw = sign(0.5_rp, qv(k,i,j)-eps) + 0.5_rp
586 gas_merge(rd_k,i,j,1) = qv(k,i,j) / mvap * mdry / ppm * zerosw
602 cfc_merge(rd_k,i,j,v) = rd_cfc(rd_k,v)
615 cldfrac_merge(rd_k,i,j) = rd_cldfrac(rd_k)
618 do rd_k = rd_kadd+1, rd_kmax
619 k = ks + rd_kmax - rd_k
621 cldfrac_merge(rd_k,i,j) = 0.5_rp + sign( 0.5_rp, cldfrac(k,i,j)-min_cldfrac )
637 aerosol_conc_merge(rd_k,i,j,v) = rd_aerosol_conc(rd_k,v)
638 aerosol_radi_merge(rd_k,i,j,v) = rd_aerosol_radi(rd_k,v)
646 if ( atmos_phy_rd_mstrn_only_qci .and. &
647 ( ihydro /=
i_hc .and. ihydro /=
i_hi ) )
then 649 aerosol_conc_merge(:,:,:,ihydro) = 0.0_rp
659 do rd_k = rd_kadd+1, rd_kadd+1 + ke - tropopause(i,j)
660 aerosol_conc_merge(rd_k,i,j,ihydro) = 0.0_rp
662 do rd_k = rd_kadd+1 + ke - tropopause(i,j) + 1, rd_kmax
663 k = ks + rd_kmax - rd_k
664 aerosol_conc_merge(rd_k,i,j,ihydro) = max( mp_qe(k,i,j,ihydro), 0.0_rp ) &
680 do rd_k = rd_kadd+1, rd_kmax
681 k = ks + rd_kmax - rd_k
682 aerosol_radi_merge(rd_k,i,j,ihydro) = mp_re(k,i,j,ihydro)
710 do rd_k = rd_kadd+1, rd_kmax
711 aerosol_conc_merge(rd_k,i,j,
n_hyd+iaero) = rd_aerosol_conc(rd_k,
n_hyd+iaero)
712 aerosol_radi_merge(rd_k,i,j,
n_hyd+iaero) = rd_aerosol_radi(rd_k,
n_hyd+iaero)
723 call rd_mstrn_dtrn3( rd_kmax, ia, is, ie, ja, js, je, &
724 mstrn_ngas, mstrn_ncfc, rd_naero, &
725 rd_hydro_str, rd_hydro_end, rd_aero_str, rd_aero_end, &
726 solins(:,:), cossza(:,:), &
727 rhodz_merge(:,:,:), pres_merge(:,:,:), &
728 temp_merge(:,:,:), temph_merge(:,:,:), temp_sfc(:,:), &
729 gas_merge(:,:,:,:), cfc_merge(:,:,:,:), &
730 aerosol_conc_merge(:,:,:,:), aerosol_radi_merge(:,:,:,:), &
732 cldfrac_merge(:,:,:), &
733 albedo_sfc(:,:,:,:), &
734 fact_ocean(:,:), fact_land(:,:), fact_urban(:,:), &
735 flux_rad_merge(:,:,:,:,:,:), flux_rad_sfc_dn(:,:,:,:), &
736 taucld_067u(:,:,:), emiscld_105u(:,:,:) )
750 do rd_k = rd_kadd+1, rd_kmax+1
751 k = ks + rd_kmax - rd_k
753 flux_rad(k,i,j,
i_lw,
i_up,ic) = flux_rad_merge(rd_k,i,j,
i_lw,
i_up,ic)
754 flux_rad(k,i,j,
i_lw,
i_dn,ic) = flux_rad_merge(rd_k,i,j,
i_lw,
i_dn,ic)
755 flux_rad(k,i,j,
i_sw,
i_up,ic) = flux_rad_merge(rd_k,i,j,
i_sw,
i_up,ic)
756 flux_rad(k,i,j,
i_sw,
i_dn,ic) = flux_rad_merge(rd_k,i,j,
i_sw,
i_dn,ic)
780 if (
present( dtau_s ) )
then 787 do rd_k = rd_kadd+1, rd_kmax
788 k = ks + rd_kmax - rd_k
789 dtau_s(k,i,j) = taucld_067u(rd_k,i,j)
795 if (
present( dem_s ) )
then 802 do rd_k = rd_kadd+1, rd_kmax
803 k = ks + rd_kmax - rd_k
804 dem_s(k,i,j) = emiscld_105u(rd_k,i,j)
815 subroutine rd_mstrn_setup( &
827 integer,
intent(out) :: ngas
828 integer,
intent(out) :: ncfc
830 integer :: nband, nstream, nfitP, nfitT, nflag
831 integer :: nsfc, nptype, nplkord, nfitPLK
834 character(len=H_LONG) :: dummy
837 integer :: iw, ich, ip, it, igas, icfc, iptype, im
844 allocate( waveh(mstrn_nband+1) )
845 allocate( logfitp(mstrn_nfitp) )
846 allocate( fitt(mstrn_nfitt) )
847 allocate( logfitt(mstrn_nfitt) )
849 allocate( iflgb(mstrn_nflag, mstrn_nband) )
850 allocate( nch( mstrn_nband) )
851 allocate( wgtch(mstrn_ch_limit,mstrn_nband) )
852 allocate( ngasabs( mstrn_nband) )
853 allocate( igasabs(mstrn_ngas, mstrn_nband) )
855 allocate( akd(mstrn_ch_limit,mstrn_nfitp,mstrn_nfitt,mstrn_ngas,mstrn_nband) )
856 allocate( skd(mstrn_ch_limit,mstrn_nfitp,mstrn_nfitt, mstrn_nband) )
857 allocate( acfc(mstrn_ncfc,mstrn_nband) )
861 file = trim(mstrn_gaspara_inputfile), &
862 form =
'formatted', &
866 if ( ierr /= 0 )
then 867 log_error(
"RD_MSTRN_setup",*)
'Input data file does not found! ', trim(mstrn_gaspara_inputfile)
872 read(fid,*) nband, nstream, nfitp, nfitt, nflag, ncfc
874 if ( nband /= mstrn_nband )
then 875 log_error(
"RD_MSTRN_setup",*)
'Inconsistent parameter value! nband(given,file)=', mstrn_nband, nband
878 if ( nstream /= mstrn_nstream )
then 879 log_error(
"RD_MSTRN_setup",*)
'Inconsistent parameter value! nstream(given,file)=', mstrn_nstream, nstream
882 if ( nfitp /= mstrn_nfitp )
then 883 log_error(
"RD_MSTRN_setup",*)
'Inconsistent parameter value! nfitP(given,file)=', mstrn_nfitp, nfitp
886 if ( nfitt /= mstrn_nfitt )
then 887 log_error(
"RD_MSTRN_setup",*)
'Inconsistent parameter value! nfitT(given,file)=', mstrn_nfitt, nfitt
890 if ( nflag /= mstrn_nflag )
then 891 log_error(
"RD_MSTRN_setup",*)
'Inconsistent parameter value! nflag(given,file)=', mstrn_nflag, nflag
894 if ( ncfc /= mstrn_ncfc )
then 895 log_error(
"RD_MSTRN_setup",*)
'Inconsistent parameter value! ncfc(given,file)=', mstrn_ncfc, ncfc
904 read(fid,*) logfitp(:)
909 logfitt(:) = log10( fitt(:) )
912 do iw = 1, mstrn_nband
916 read(fid,*) iflgb(:,iw)
922 read(fid,*) (wgtch(ich,iw),ich=1,nch(iw))
925 read(fid,*) ngasabs(iw)
928 if ( ngasabs(iw) > 0 )
then 929 do igas = 1, ngasabs(iw)
930 read(fid,*) igasabs(igas,iw)
931 do it = 1, mstrn_nfitt
932 do ip = 1, mstrn_nfitp
933 read(fid,*) (akd(ich,ip,it,igasabs(igas,iw),iw),ich=1,nch(iw))
940 if ( iflgb(i_h2o_continuum,iw) > 0 )
then 942 do it = 1, mstrn_nfitt
943 do ip = 1, mstrn_nfitp
944 read(fid,*) (skd(ich,ip,it,iw),ich=1,nch(iw))
950 if ( iflgb(i_cfc_continuum,iw) > 0 )
then 952 read(fid,*) (acfc(icfc,iw),icfc=1,mstrn_ncfc)
962 allocate( fitplk(mstrn_nfitplk,mstrn_nband) )
963 allocate( fsol( mstrn_nband) )
964 allocate( sfc(mstrn_nsfc, mstrn_nband) )
965 allocate( rayleigh( mstrn_nband) )
967 allocate( qmol( mstrn_nmoment,mstrn_nband) )
968 allocate( q(-1:mstrn_nradius+1,mstrn_nptype,mstrn_nmoment,mstrn_nband) )
969 q(-1:0 ,:,:,:) = 0.d0
970 q(mstrn_nradius+1,:,:,:) = 0.d0
973 file = trim(mstrn_aeropara_inputfile), &
974 form =
'formatted', &
978 if ( ierr /= 0 )
then 979 log_error(
"RD_MSTRN_setup",*)
'Input data file does not found! ', trim(mstrn_aeropara_inputfile)
984 read(fid,*) nband, nsfc, nptype, nstream, nplkord, nfitplk
986 if ( nband /= mstrn_nband )
then 987 log_error(
"RD_MSTRN_setup",*)
'Inconsistent parameter value! nband(given,file)=', mstrn_nband, nband
990 if ( nsfc /= mstrn_nsfc )
then 991 log_error(
"RD_MSTRN_setup",*)
'Inconsistent parameter value! nsfc(given,file)=', mstrn_nsfc, nsfc
994 if ( nptype /= mstrn_nptype )
then 995 log_error(
"RD_MSTRN_setup",*)
'Inconsistent parameter value! nptype(given,file)=', mstrn_nptype, nptype
998 if ( nstream /= mstrn_nstream )
then 999 log_error(
"RD_MSTRN_setup",*)
'Inconsistent parameter value! nstream(given,file)=', mstrn_nstream, nstream
1002 if ( nplkord /= mstrn_nplkord )
then 1003 log_error(
"RD_MSTRN_setup",*)
'Inconsistent parameter value! nplkord(given,file)=', mstrn_nplkord, nplkord
1006 if ( nfitplk /= mstrn_nfitplk )
then 1007 log_error(
"RD_MSTRN_setup",*)
'Inconsistent parameter value! nfitPLK(given,file)=', mstrn_nfitplk, nfitplk
1013 read(fid,*) waveh(:)
1016 do iw = 1, mstrn_nband
1020 read(fid,*) fitplk(:,iw)
1023 read(fid,*) fsol(iw)
1026 read(fid,*) sfc(:,iw)
1029 read(fid,*) rayleigh(iw)
1033 do im = 1, mstrn_nmoment
1035 read(fid,*) qmol(im,iw)
1037 do iptype = 1, nptype
1038 read(fid,*) q(1:mstrn_nradius,iptype,im,iw)
1047 do iw = 1, mstrn_nband
1048 fsol_tot = fsol_tot + fsol(iw)
1054 allocate( hygro_flag(mstrn_nptype) )
1055 allocate( radmode(mstrn_nptype,mstrn_nradius) )
1058 file = trim(mstrn_hygropara_inputfile), &
1059 form =
'formatted', &
1063 if ( ierr /= 0 )
then 1064 log_error(
"RD_MSTRN_setup",*)
'Input data file does not found! ', trim(mstrn_hygropara_inputfile)
1070 if ( nptype /= mstrn_nptype )
then 1071 log_error(
"RD_MSTRN_setup",*)
'Inconsistent parameter value! nptype(given,file)=', mstrn_nptype, nptype
1075 do iptype = 1, nptype
1077 read(fid,*) hygro_flag(iptype), nradius
1079 if ( nradius /= mstrn_nradius )
then 1080 log_error(
"RD_MSTRN_setup",*)
'Inconsistent parameter value! nradius(given,file)=', mstrn_nradius, nradius
1084 read(fid,*) radmode(iptype,:)
1091 log_info(
"RD_MSTRN_setup",
'(1x,A,F12.7)')
'Baseline of total solar insolation : ', fsol_tot
1094 rho_std = pstd / ( rdry * tem00 )
1096 m(
i_sw) = 1.0_rp / sqrt(3.0_rp)
1100 m(
i_lw) = 1.0_rp / 1.66_rp
1105 wmns(im) = sqrt( w(im) / m(im) )
1106 wpls(im) = sqrt( w(im) * m(im) )
1107 wscale(im) = wpls(im) / wbar(im)
1117 end subroutine rd_mstrn_setup
1121 subroutine rd_mstrn_dtrn3( &
1122 rd_kmax, IA, IS, IE, JA, JS, JE, &
1158 integer,
intent(in) :: rd_kmax
1159 integer,
intent(in) :: IA, IS, IE
1160 integer,
intent(in) :: JA, JS, JE
1162 integer,
intent(in) :: ngas
1163 integer,
intent(in) :: ncfc
1164 integer,
intent(in) :: naero
1165 integer,
intent(in) :: hydro_str
1166 integer,
intent(in) :: hydro_end
1167 integer,
intent(in) :: aero_str
1168 integer,
intent(in) :: aero_end
1169 real(RP),
intent(in) :: solins (ia,ja)
1170 real(RP),
intent(in) :: cosSZA (ia,ja)
1171 real(RP),
intent(in) :: rhodz (rd_kmax ,ia,ja)
1172 real(RP),
intent(in) :: pres (rd_kmax ,ia,ja)
1173 real(RP),
intent(in) :: temp (rd_kmax ,ia,ja)
1174 real(RP),
intent(in) :: temph (rd_kmax+1,ia,ja)
1175 real(RP),
intent(in) :: temp_sfc (ia,ja)
1176 real(RP),
intent(in) :: gas (rd_kmax,ia,ja,ngas )
1177 real(RP),
intent(in) :: cfc (rd_kmax,ia,ja,ncfc )
1178 real(RP),
intent(in) :: aerosol_conc(rd_kmax,ia,ja,naero)
1179 real(RP),
intent(in) :: aerosol_radi(rd_kmax,ia,ja,naero)
1180 integer,
intent(in) :: aero2ptype (naero)
1181 real(RP),
intent(in) :: cldfrac (rd_kmax,ia,ja)
1183 real(RP),
intent(in) :: fact_ocean (ia,ja)
1184 real(RP),
intent(in) :: fact_land (ia,ja)
1185 real(RP),
intent(in) :: fact_urban (ia,ja)
1186 real(RP),
intent(out) :: rflux (rd_kmax+1,ia,ja,2,2,mstrn_ncloud)
1188 real(RP),
intent(out) :: tauCLD_067u (rd_kmax,ia,ja)
1189 real(RP),
intent(out) :: emisCLD_105u(rd_kmax,ia,ja)
1192 real(RP) :: dz_std (rd_kmax)
1195 integer :: indexP (rd_kmax)
1196 real(RP) :: factP (rd_kmax)
1197 real(RP) :: factT32(rd_kmax)
1198 real(RP) :: factT21(rd_kmax)
1199 integer :: indexR (rd_kmax,naero)
1200 real(RP) :: factR (rd_kmax,naero)
1203 real(RP) :: tauGAS(rd_kmax,mstrn_ch_limit)
1204 real(RP) :: A1, A2, A3, factPT
1205 real(RP) :: qv, length
1209 real(RP) :: tauPR (rd_kmax,mstrn_ncloud)
1210 real(RP) :: omgPR (rd_kmax,mstrn_ncloud)
1211 real(RP) :: optparam(rd_kmax,mstrn_nmoment,mstrn_ncloud)
1212 real(RP) :: q_fit, dp_P
1215 real(RP) :: bbar (rd_kmax )
1216 real(RP) :: bbarh(rd_kmax+1)
1218 real(RP) :: wl, beta
1221 real(RP) :: tau(rd_kmax, mstrn_ncloud)
1222 real(RP) :: omg(rd_kmax, mstrn_ncloud)
1223 real(RP) :: g (rd_kmax,0:2,mstrn_ncloud)
1227 real(RP) :: b (rd_kmax,0:2,mstrn_ncloud)
1228 real(RP) :: fsol_rgn
1230 real(RP) :: flux (rd_kmax+1,2,mstrn_ncloud)
1231 real(RP) :: flux_direct(rd_kmax+1, mstrn_ncloud)
1234 real(RP) :: tauCLD (rd_kmax)
1235 real(RP) :: emisCLD(rd_kmax)
1240 integer :: ip, ir, irgn, irgn_alb
1241 integer :: igas, icfc, iaero, iptype
1242 integer :: iw, ich, iplk, icloud, im
1277 dz_std(k) = rhodz(k,i,j) / rho_std * 100.0_rp
1282 logp = log10( pres(k,i,j) )
1283 logt = log10( temp(k,i,j) )
1285 indexp(k) = mstrn_nfitp
1287 do ip = mstrn_nfitp, 2, -1
1288 if( logp >= logfitp(ip) ) indexp(k) = ip
1293 factp(k) = ( logp - logfitp(ip-1) ) / ( logfitp(ip) - logfitp(ip-1) )
1295 factt32(k) = ( logt - logfitt(2) ) / ( logfitt(3) - logfitt(2) ) &
1296 * ( temp(k,i,j) - fitt(1) ) / ( fitt(3) - fitt(1) )
1297 factt21(k) = ( logt - logfitt(2) ) / ( logfitt(2) - logfitt(1) ) &
1298 * ( fitt(3) - temp(k,i,j) ) / ( fitt(3) - fitt(1) )
1303 iptype = aero2ptype(iaero)
1307 if ( aerosol_radi(k,i,j,iaero) <= radmode(iptype,1) )
then 1310 indexr(k,iaero) = ir
1311 factr(k,iaero) = ( aerosol_radi(k,i,j,iaero) - radmode(iptype,ir) ) &
1312 / ( radmode(iptype,ir+1) - radmode(iptype,ir) )
1314 elseif( aerosol_radi(k,i,j,iaero) > radmode(iptype,mstrn_nradius) )
then 1319 indexr(k,iaero) = ir
1320 factr(k,iaero) = 1.0_rp
1323 indexr(k,iaero) = -1
1325 do ir = 1, mstrn_nradius-1
1326 if ( aerosol_radi(k,i,j,iaero) <= radmode(iptype,ir+1) &
1327 .AND. aerosol_radi(k,i,j,iaero) > radmode(iptype,ir ) )
then 1329 indexr(k,iaero) = ir
1330 factr(k,iaero) = ( aerosol_radi(k,i,j,iaero) - radmode(iptype,ir) ) &
1331 / ( radmode(iptype,ir+1) - radmode(iptype,ir) )
1347 rflux(:,i,j,:,:,:) = 0.0_rp
1348 rflux_sfc_dn( i,j,:,: ) = 0.0_rp
1350 do iw = 1, mstrn_nband
1351 if ( iflgb(i_swlw,iw) == 0 )
then 1359 if ( waveh(iw) >= 10000.0_rp / 0.7_rp )
then 1373 taugas(k,ich) = 0.0_rp
1382 do igas = 1, ngasabs(iw)
1383 gasno = igasabs(igas,iw)
1389 length = gas(k,i,j,igasabs(igas,iw)) * ppm * dz_std(k)
1393 a1 = akd(ich,ip-1,1,gasno,iw) * ( 1.0_rp - factp(k) )&
1394 + akd(ich,ip ,1,gasno,iw) * ( factp(k) )
1395 a2 = akd(ich,ip-1,2,gasno,iw) * ( 1.0_rp - factp(k) )&
1396 + akd(ich,ip ,2,gasno,iw) * ( factp(k) )
1397 a3 = akd(ich,ip-1,3,gasno,iw) * ( 1.0_rp - factp(k) )&
1398 + akd(ich,ip ,3,gasno,iw) * ( factp(k) )
1400 factpt = factt32(k)*(a3-a2) + a2 + factt21(k)*(a2-a1)
1402 taugas(k,ich) = taugas(k,ich) + 10.0_rp**factpt * length
1408 if ( iflgb(i_h2o_continuum,iw) == 1 )
then 1413 qv = gas(k,i,j,1) * ppm * dz_std(k)
1414 length = qv*qv / ( qv + dz_std(k) )
1418 a1 = skd(ich,ip-1,1,iw) * ( 1.0_rp-factp(k) )&
1419 + skd(ich,ip ,1,iw) * ( factp(k) )
1420 a2 = skd(ich,ip-1,2,iw) * ( 1.0_rp-factp(k) )&
1421 + skd(ich,ip ,2,iw) * ( factp(k) )
1422 a3 = skd(ich,ip-1,3,iw) * ( 1.0_rp-factp(k) )&
1423 + skd(ich,ip ,3,iw) * ( factp(k) )
1425 factpt = factt32(k)*(a3-a2) + a2 + factt21(k)*(a2-a1)
1427 taugas(k,ich) = taugas(k,ich) + 10.0_rp**factpt * length
1432 if ( iflgb(i_cfc_continuum,iw) == 1 )
then 1438 valsum = valsum + 10.0_rp**acfc(icfc,iw) * cfc(k,i,j,icfc)
1440 valsum = valsum * ppm * dz_std(k)
1444 taugas(k,ich) = taugas(k,ich) + valsum
1458 dp_p = rhodz(k,i,j) * grav / pstd
1459 length = rayleigh(iw) * dp_p
1462 do im = 1, mstrn_nstream*2+2
1463 optparam(k,im,i_cloud ) = qmol(im,iw) * length
1464 optparam(k,im,i_clearsky) = qmol(im,iw) * length
1469 do iaero = hydro_str, hydro_end
1470 iptype = aero2ptype(iaero)
1474 ir = indexr(k,iaero)
1476 length = aerosol_conc(k,i,j,iaero) * ppm * dz_std(k)
1479 do im = 1, mstrn_nstream*2+2
1480 q_fit = q(ir ,iptype,im,iw) * ( 1.0_rp-factr(k,iaero) ) &
1481 + q(ir+1,iptype,im,iw) * ( factr(k,iaero) )
1483 optparam(k,im,i_cloud) = optparam(k,im,i_cloud) + q_fit * length
1486 q_fit = q(ir ,iptype,1,iw) * ( 1.0_rp-factr(k,iaero) ) &
1487 + q(ir+1,iptype,1,iw) * ( factr(k,iaero) )
1489 taucld(k) = taucld(k) + q_fit * length
1494 do iaero = aero_str, aero_end
1495 iptype = aero2ptype(iaero)
1499 ir = indexr(k,iaero)
1501 length = aerosol_conc(k,i,j,iaero) * ppm * dz_std(k)
1504 do im = 1, mstrn_nstream*2+2
1505 q_fit = q(ir ,iptype,im,iw) * ( 1.0_rp-factr(k,iaero) ) &
1506 + q(ir+1,iptype,im,iw) * ( factr(k,iaero) )
1508 optparam(k,im,i_cloud ) = optparam(k,im,i_cloud ) + q_fit * length
1509 optparam(k,im,i_clearsky) = optparam(k,im,i_clearsky) + q_fit * length
1514 do icloud = 1, mstrn_ncloud
1517 taupr(k,icloud) = optparam(k,1,icloud)
1518 omgpr(k,icloud) = optparam(k,1,icloud) - optparam(k,2,icloud)
1521 zerosw = 0.5_rp - sign(0.5_rp,omgpr(k,icloud)-rd_eps)
1523 g(k,0,icloud) = 1.0_rp
1524 g(k,1,icloud) = optparam(k,3,icloud) * ( 1.0_rp-zerosw ) / ( omgpr(k,icloud)+zerosw )
1525 g(k,2,icloud) = optparam(k,4,icloud) * ( 1.0_rp-zerosw ) / ( omgpr(k,icloud)+zerosw )
1531 if ( waveh(iw) <= 1.493e+4_rp .AND. 1.493e+4_rp < waveh(iw+1) )
then 1534 taucld_067u(k,i,j) = taucld(k)
1545 tau(k,icloud) = taugas(k,ich) + taupr(k,icloud)
1548 zerosw = 0.5_rp - sign( 0.5_rp, tau(k,icloud)-rd_eps )
1550 omg(k,icloud) = ( 1.0_rp-zerosw ) * omgpr(k,icloud) / ( tau(k,icloud)-zerosw ) &
1551 + ( zerosw ) * 1.0_rp
1558 if ( irgn ==
i_sw )
then 1563 b(k,0,icloud) = 0.0_rp
1564 b(k,1,icloud) = 0.0_rp
1565 b(k,2,icloud) = 0.0_rp
1570 fsol_rgn = fsol(iw) / fsol_tot * solins(i,j)
1572 elseif( irgn ==
i_lw )
then 1574 wl = 10000.0_rp / sqrt( waveh(iw) * waveh(iw+1) )
1581 do iplk = mstrn_nfitplk, 1, -1
1582 beta = beta / ( wl*temp(k,i,j) ) + fitplk(iplk,iw)
1585 bbar(k) = exp(-beta) * temp(k,i,j) / (wl*wl)
1593 do iplk = mstrn_nfitplk, 1, -1
1594 beta = beta / ( wl*temph(k,i,j) ) + fitplk(iplk,iw)
1597 bbarh(k) = exp(-beta) * temph(k,i,j) / (wl*wl)
1603 zerosw = 0.5_rp - sign( 0.5_rp, tau(k,icloud)-rd_eps )
1605 b(k,0,icloud) = bbarh(k)
1606 b(k,1,icloud) = ( 1.0_rp-zerosw ) &
1608 + 4.0_rp * bbar(k ) &
1609 - 3.0_rp * bbarh(k ) &
1610 ) / ( tau(k,icloud)-zerosw )
1611 b(k,2,icloud) = ( 1.0_rp-zerosw ) &
1613 - 2.0_rp * bbar(k ) &
1615 ) / ( tau(k,icloud)*tau(k,icloud)-zerosw ) * 2.0_rp
1622 do iplk = mstrn_nfitplk, 1, -1
1623 beta = beta / ( wl*temp_sfc(i,j) ) + fitplk(iplk,iw)
1626 b_sfc = exp(-beta) * temp_sfc(i,j) / (wl*wl)
1634 call rd_mstrn_two_stream( rd_kmax, &
1643 albedo_sfc(i,j,:,irgn_alb), &
1653 rflux(k,i,j,irgn,
i_up,icloud) = rflux(k,i,j,irgn,
i_up,icloud) + flux(k,
i_up,icloud) * wgtch(ich,iw)
1654 rflux(k,i,j,irgn,
i_dn,icloud) = rflux(k,i,j,irgn,
i_dn,icloud) + flux(k,
i_dn,icloud) * wgtch(ich,iw)
1659 + ( flux_direct(rd_kmax+1,i_cloud) ) * wgtch(ich,iw)
1661 + ( flux(rd_kmax+1,
i_dn,i_cloud) - flux_direct(rd_kmax+1,i_cloud) ) * wgtch(ich,iw)
1664 if ( waveh(iw) <= 952.0_rp .AND. 952.0_rp < waveh(iw+1) )
then 1667 emiscld_105u(k,i,j) = emiscld(k)
1683 end subroutine rd_mstrn_dtrn3
1688 subroutine rd_mstrn_two_stream( &
1710 integer,
intent(in) :: RD_KMAX
1711 real(RP),
intent(in) :: cosSZA0
1712 real(RP),
intent(in) :: fsol
1713 integer,
intent(in) :: irgn
1714 real(RP),
intent(in) :: tau (rd_kmax, mstrn_ncloud)
1715 real(RP),
intent(in) :: omg (rd_kmax, mstrn_ncloud)
1716 real(RP),
intent(in) :: g (rd_kmax,0:2,mstrn_ncloud)
1717 real(RP),
intent(in) :: b (rd_kmax,0:2,mstrn_ncloud)
1718 real(RP),
intent(in) :: b_sfc
1719 real(RP),
intent(in) :: albedo_sfc (
n_rad_dir)
1720 real(RP),
intent(in) :: cldfrac (rd_kmax)
1721 real(RP),
intent(out) :: flux (rd_kmax+1,2,mstrn_ncloud)
1722 real(RP),
intent(out) :: flux_direct(rd_kmax+1, mstrn_ncloud)
1723 real(RP),
intent(out) :: emisCLD (rd_kmax)
1735 real(RP) :: Pmns, Ppls
1736 real(RP) :: Smns, Spls
1743 real(RP) :: Apls_mns, Bpls_mns
1744 real(DP) :: V0mns, V0pls
1745 real(DP) :: V1mns, V1pls
1746 real(DP) :: Dmns0, Dmns1, Dmns2
1747 real(DP) :: Dpls0, Dpls1, Dpls2
1748 real(RP) :: SIGmns, SIGpls
1750 real(RP) :: zerosw, tmp
1753 real(RP) :: Tdir0(rd_kmax,mstrn_ncloud)
1754 real(RP) :: R0 (rd_kmax,mstrn_ncloud)
1755 real(RP) :: T0 (rd_kmax,mstrn_ncloud)
1756 real(RP) :: Em_LW(rd_kmax,mstrn_ncloud)
1757 real(RP) :: Em_SW(rd_kmax,mstrn_ncloud)
1758 real(RP) :: Ep_LW(rd_kmax,mstrn_ncloud)
1759 real(RP) :: Ep_SW(rd_kmax,mstrn_ncloud)
1762 real(RP) :: cf (rd_kmax )
1763 real(RP) :: tau_bar_sol(rd_kmax+1)
1764 real(RP) :: Tdir (rd_kmax+1)
1765 real(RP) :: R (rd_kmax+1)
1766 real(RP) :: T (rd_kmax+1)
1767 real(RP) :: Em (rd_kmax+1)
1768 real(RP) :: Ep (rd_kmax+1)
1771 real(RP) :: R12mns(rd_kmax+1)
1772 real(RP) :: R12pls(rd_kmax+1)
1773 real(RP) :: E12mns(rd_kmax+1)
1774 real(RP) :: E12pls(rd_kmax+1)
1775 real(RP) :: Umns, Upls
1777 real(RP) :: Em0(mstrn_ncloud)
1779 real(RP) :: Wmns_irgn, M_irgn, W_irgn, Wpls_irgn, Wscale_irgn
1781 integer,
parameter :: I_SFC2TOA = 1
1782 integer,
parameter :: I_TOA2SFC = 2
1785 integer :: k, icloud
1790 wmns_irgn = wmns(irgn)
1791 wpls_irgn = wpls(irgn)
1792 wscale_irgn = wscale(irgn)
1794 cossza = max( cossza0, rd_cossza_min )
1801 tau_new = ( 1.0_rp - omg(k,icloud)*g(k,2,icloud) ) * tau(k,icloud)
1803 omg_new = ( 1.0_rp - g(k,2,icloud) ) / ( 1.0_rp - omg(k,icloud)*g(k,2,icloud) ) * omg(k,icloud)
1804 omg_new = min( omg_new, eps1 )
1806 g_new = ( g(k,1,icloud) - g(k,2,icloud) ) / ( 1.0_rp - g(k,2,icloud) )
1808 #if defined(PGI) || defined(SX) 1809 tdir0(k,icloud) = exp( -min( tau_new/cossza, 1.e+3_rp ) )
1811 tdir0(k,icloud) = exp(-tau_new/cossza)
1814 factor = ( 1.0_rp - omg(k,icloud)*g(k,2,icloud) )
1815 b_new0 = b(k,0,icloud)
1816 b_new1 = b(k,1,icloud) / factor
1817 b_new2 = b(k,2,icloud) / (factor*factor)
1818 c0 = wmns_irgn * 2.0_rp * pi * ( 1.0_rp - omg_new ) * b_new0
1819 c1 = wmns_irgn * 2.0_rp * pi * ( 1.0_rp - omg_new ) * b_new1
1820 c2 = wmns_irgn * 2.0_rp * pi * ( 1.0_rp - omg_new ) * b_new2
1823 pmns = omg_new * 0.5_rp * ( 1.0_rp - 3.0_rp * g_new * m_irgn*m_irgn )
1824 ppls = omg_new * 0.5_rp * ( 1.0_rp + 3.0_rp * g_new * m_irgn*m_irgn )
1827 smns = omg_new * 0.5_rp * ( 1.0_rp - 3.0_rp * g_new * m_irgn*cossza )
1828 spls = omg_new * 0.5_rp * ( 1.0_rp + 3.0_rp * g_new * m_irgn*cossza )
1831 sw = 0.5_rp + sign(0.5_rp,tau_new-rd_eps)
1832 tau_new = max( tau_new, rd_eps )
1835 x = ( 1.0_rp - w_irgn * ( ppls - pmns ) ) / m_irgn
1836 y = ( 1.0_rp - w_irgn * ( ppls + pmns ) ) / m_irgn
1840 #if defined(PGI) || defined(SX) 1841 e = exp( -min( lamda*tau_new, 1.e+3_rp ) )
1843 e = exp(-lamda*tau_new)
1847 apls_mns = ( x * ( 1.0_dp+e ) - lamda * ( 1.0_dp-e ) ) &
1848 / ( x * ( 1.0_dp+e ) + lamda * ( 1.0_dp-e ) )
1849 bpls_mns = ( x * ( 1.0_dp-e ) - lamda * ( 1.0_dp+e ) ) &
1850 / ( x * ( 1.0_dp-e ) + lamda * ( 1.0_dp+e ) )
1853 r0(k,icloud) = ( sw ) * 0.5_rp * ( apls_mns + bpls_mns ) &
1854 + ( 1.0_rp-sw ) * ( tau_new * ( pmns ) / m_irgn )
1855 t0(k,icloud) = ( sw ) * 0.5_rp * ( apls_mns - bpls_mns ) &
1856 + ( 1.0_rp-sw ) * ( 1.0_rp - tau_new * ( 1.0_rp - ppls ) / m_irgn )
1859 dmns0 = c0 / y + 2.0_rp * c2 / (x*y*y) + c1 / (x*y)
1860 dpls0 = c0 / y + 2.0_rp * c2 / (x*y*y) - c1 / (x*y)
1861 dmns1 = c1 / y + 2.0_rp * c2 / (x*y)
1862 dpls1 = c1 / y - 2.0_rp * c2 / (x*y)
1868 v1mns = dmns0 + dmns1*tau_new + dmns2*tau_new*tau_new
1869 v1pls = dpls0 + dpls1*tau_new + dpls2*tau_new*tau_new
1871 em_lw(k,icloud) = ( sw ) * ( v0mns - r0(k,icloud) * v0pls - t0(k,icloud) * v1mns ) &
1872 + ( 1.0_rp-sw ) * 0.5_rp * tau_new * ( 2.0_rp*c0 + c1*tau_new + c2*tau_new*tau_new )
1873 ep_lw(k,icloud) = ( sw ) * ( v1pls - t0(k,icloud) * v0pls - r0(k,icloud) * v1mns ) &
1874 + ( 1.0_rp-sw ) * 0.5_rp * tau_new * ( 2.0_rp*c0 + c1*tau_new + c2*tau_new*tau_new )
1877 sigmns = wmns_irgn * ( spls - smns )
1878 sigpls = wmns_irgn * ( spls + smns )
1880 tmp = x*y*cossza-1.0/cossza
1881 zerosw = 1.0_rp - sign(1.0_rp,abs(tmp)-eps)
1882 qgamma = ( sigpls*x*cossza + sigmns ) / ( tmp + zerosw*eps )
1884 v0pls = 0.5_rp * ( ( 1.0_rp + 1.0_rp/(x*cossza) ) * qgamma + sigmns / x )
1885 v0mns = 0.5_rp * ( ( 1.0_rp - 1.0_rp/(x*cossza) ) * qgamma - sigmns / x )
1887 v1pls = v0pls * tdir0(k,icloud)
1888 v1mns = v0mns * tdir0(k,icloud)
1890 em_sw(k,icloud) = ( sw ) * ( v0mns - r0(k,icloud) * v0pls - t0(k,icloud) * v1mns ) &
1891 + ( 1.0_rp-sw ) * wmns_irgn * smns * tau_new * sqrt( tdir0(k,icloud) )
1892 ep_sw(k,icloud) = ( sw ) * ( v1pls - t0(k,icloud) * v0pls - r0(k,icloud) * v1mns ) &
1893 + ( 1.0_rp-sw ) * wmns_irgn * spls * tau_new * sqrt( tdir0(k,icloud) )
1901 if ( icloud == 1 )
then 1915 tdir(k) = ( cf(k) ) * tdir0(k,i_cloud ) &
1916 + ( 1.0_rp-cf(k) ) * tdir0(k,i_clearsky)
1919 tau_bar_sol(1) = fsol
1922 tau_bar_sol(k) = tau_bar_sol(k-1) * tdir(k-1)
1927 em(k) = ( cf(k) ) * ( em_lw(k,i_cloud ) &
1928 + em_sw(k,i_cloud ) * tau_bar_sol(k) ) &
1929 + ( 1.0_rp-cf(k) ) * ( em_lw(k,i_clearsky) &
1930 + em_sw(k,i_clearsky) * tau_bar_sol(k) )
1932 ep(k) = ( cf(k) ) * ( ep_lw(k,i_cloud ) &
1933 + ep_sw(k,i_cloud ) * tau_bar_sol(k) ) &
1934 + ( 1.0_rp-cf(k) ) * ( ep_lw(k,i_clearsky) &
1935 + ep_sw(k,i_clearsky) * tau_bar_sol(k) )
1937 flux_direct(k,icloud) = cossza * tau_bar_sol(k)
1941 r(rd_kmax+1) = ( cf(rd_kmax) ) * albedo_sfc(
i_r_diffuse) &
1942 + ( 1.0_rp-cf(rd_kmax) ) * albedo_sfc(
i_r_diffuse)
1943 t(rd_kmax+1) = 0.0_rp
1945 flux_direct(rd_kmax+1,icloud) = cossza * tau_bar_sol(rd_kmax+1)
1947 em0(i_cloud ) = wpls_irgn * ( flux_direct(rd_kmax+1,icloud) * albedo_sfc(
i_r_direct) / (w_irgn*m_irgn) &
1948 + 2.0_rp * pi * ( 1.0_rp-albedo_sfc(
i_r_diffuse) ) * b_sfc )
1949 em0(i_clearsky) = wpls_irgn * ( flux_direct(rd_kmax+1,icloud) * albedo_sfc(
i_r_direct) / (w_irgn*m_irgn) &
1950 + 2.0_rp * pi * ( 1.0_rp-albedo_sfc(
i_r_diffuse) ) * b_sfc )
1952 em(rd_kmax+1) = ( cf(rd_kmax) ) * em0(i_cloud ) &
1953 + ( 1.0_rp-cf(rd_kmax) ) * em0(i_clearsky)
1954 ep(rd_kmax+1) = 0.0_rp
1961 r12pls(rd_kmax+1) = r(rd_kmax+1)
1962 e12mns(rd_kmax+1) = em(rd_kmax+1)
1965 do k = rd_kmax, 1, -1
1966 r(k) = ( cf(k) ) * r0(k,i_cloud ) &
1967 + ( 1.0_rp-cf(k) ) * r0(k,i_clearsky)
1968 t(k) = ( cf(k) ) * t0(k,i_cloud ) &
1969 + ( 1.0_rp-cf(k) ) * t0(k,i_clearsky)
1971 r12pls(k) = r(k) + t(k) / ( 1.0_rp - r12pls(k+1) * r(k) ) &
1972 * ( r12pls(k+1) * t(k) )
1973 e12mns(k) = em(k) + t(k) / ( 1.0_rp - r12pls(k+1) * r(k) ) &
1974 * ( r12pls(k+1) * ep(k) + e12mns(k+1) )
1984 r12mns(k) = r(k) + t(k) / ( 1.0_rp - r12mns(k-1) * r(k) ) &
1985 * ( r12mns(k-1) *t(k) )
1986 e12pls(k) = ep(k) + t(k) / ( 1.0_rp - r12mns(k-1) * r(k) ) &
1987 * ( r12mns(k-1)*em(k) + e12pls(k-1) )
1997 umns = e12mns(1) + r12pls(1) * upls
1999 flux(1,
i_up,icloud) = wscale_irgn * umns
2000 flux(1,
i_dn,icloud) = wscale_irgn * upls + flux_direct(1,icloud)
2004 upls = ( e12pls(k-1) + r12mns(k-1)*e12mns(k) ) / ( 1.0_rp - r12mns(k-1)*r12pls(k) )
2005 umns = e12mns(k) + r12pls(k) * upls
2007 flux(k,
i_up,icloud) = wscale_irgn * umns
2008 flux(k,
i_dn,icloud) = wscale_irgn * upls + flux_direct(k,icloud)
2011 if ( icloud == 2 )
then 2014 emiscld(k) = 1.0_rp - r(k) - t(k)
2022 end subroutine rd_mstrn_two_stream
module atmosphere / physics / radiation / mstrnX
real(rp), parameter, public const_ppm
parts par million
module coupler / surface-atmospehre
integer, parameter, public n_ae
integer, parameter, public i_r_vis
integer, parameter, public i_hi
ice water cloud
real(rp), parameter, public const_tem00
temperature reference (0C) [K]
subroutine, public atmos_phy_rd_profile_setup_zgrid(KA, KS, KE, KMAX, KADD, toa, CZ, FZ, zh, z)
Setup vertical grid for radiation.
integer, public io_fid_conf
Config file ID.
integer, parameter, public n_rad_dir
integer, parameter, public n_rad_rgn
subroutine, public atmos_phy_rd_mstrnx_setup(KA, KS, KE, CZ, FZ)
Setup.
module atmosphere / physics/ radiation / profile
module atmosphere / aerosol
integer, parameter, public i_lw
real(rp), public const_rdry
specific gas constant (dry air) [J/kg/K]
integer, parameter, public i_sw
real(rp), public const_mvap
mass weight (water vapor) [g/mol]
subroutine, public atmos_phy_rd_profile_setup
Setup.
module atmosphere / hydrometeor
integer, parameter, public i_dn
integer function, public io_get_available_fid()
search & get available file ID
real(rp), public atmos_grid_cartesc_real_basepoint_lat
position of base point in real world [rad,-pi,pi]
real(rp), public const_grav
standard acceleration of gravity [m/s2]
subroutine, public prc_abort
Abort Process.
integer, parameter, public i_hc
liquid water cloud
integer, parameter, public i_r_direct
subroutine, public prof_rapstart(rapname_base, level)
Start raptime.
subroutine, public atmos_phy_rd_mstrnx_flux(KA, KS, KE, IA, IS, IE, JA, JS, JE, DENS, TEMP, PRES, QV, CZ, FZ, fact_ocean, fact_land, fact_urban, temp_sfc, albedo_sfc, solins, cosSZA, CLDFRAC, MP_Re, MP_Qe, AE_Re, flux_rad, flux_rad_top, flux_rad_sfc_dn, dtau_s, dem_s)
Radiation main.
real(rp), public const_eps
small number
integer, parameter, public i_r_nir
module Atmosphere GRID CartesC Real(real space)
subroutine, public atmos_phy_rd_profile_read(kmax, ngas, ncfc, naero, real_lat, now_date, zh, z, rhodz, pres, presh, temp, temph, gas, cfc, aerosol_conc, aerosol_radi, cldfrac)
Read profile for radiation.
real(rp), dimension(n_hyd), public hyd_dens
real(rp), public const_pi
pi
module atmosphere / physics / radiation / common
integer, dimension(6), public time_nowdate
current time [YYYY MM DD HH MM SS]
integer, parameter, public i_r_ir
integer, parameter, public i_r_diffuse
integer, parameter, public n_hyd
real(rp), public const_mdry
mass weight (dry air) [g/mol]
subroutine, public prof_rapend(rapname_base, level)
Save raptime.
logical, public atmos_phy_rd_profile_use_climatology
use climatology?
integer, parameter, public i_up
real(rp), public const_pstd
standard pressure [Pa]
real(rp), public const_eps1
small number