130 use mpiutil,
only: ccpp_bcast
131 use machine,
only : kind_phys, kind_io4, kind_io8
134 & nswstr, wvnsw2=>wvnum2
137 use funcphys,
only : fpkap
138 use aerclm_def,
only : ntrcaerm
146 character(40),
parameter :: &
147 & VTAGAER=
'NCEP-Radiation_aerosols v5.2 Jan 2013 '
153 integer,
parameter,
public :: nf_aesw = 3
155 integer,
parameter,
public :: nf_aelw = 3
157 integer,
parameter,
public :: nlwstr = 1
159 integer,
parameter,
public :: nspc = 5
161 integer,
parameter,
public :: nspc1 = nspc + 1
163 real (kind=kind_phys),
parameter :: f_zero = 0.0
164 real (kind=kind_phys),
parameter :: f_one = 1.0
169 integer,
save :: nswbnd = nbdsw
172 integer,
save :: nlwbnd = nbdlw
174 integer,
save :: nswlwbd = nbdsw+nbdlw
178 logical,
save :: lalwflg = .true.
182 logical,
save :: laswflg = .true.
187 logical,
save :: lavoflg = .true.
189 logical,
save :: lmap_new = .true.
198 integer,
parameter,
public :: nwvsol = 151
201 integer,
parameter,
public :: nwvtot = 57600
203 integer,
parameter,
public :: nwvtir = 4000
206 integer,
dimension(NWVSOL),
save :: nwvns0
208 data nwvns0 / 100, 11, 14, 18, 24, 33, 50, 83, 12, 12, &
209 & 13, 15, 15, 17, 18, 20, 21, 24, 26, 30, 32, 37, 42, &
210 & 47, 55, 64, 76, 91, 111, 139, 179, 238, 333, 41, 42, 45, &
211 & 46, 48, 51, 53, 55, 58, 61, 64, 68, 71, 75, 79, 84, &
212 & 89, 95, 101, 107, 115, 123, 133, 142, 154, 167, 181, 197, 217, &
213 & 238, 263, 293, 326, 368, 417, 476, 549, 641, 758, 909, 101, 103, &
214 & 105, 108, 109, 112, 115, 117, 119, 122, 125, 128, 130, 134, 137, &
215 & 140, 143, 147, 151, 154, 158, 163, 166, 171, 175, 181, 185, 190, &
216 & 196, 201, 207, 213, 219, 227, 233, 240, 248, 256, 264, 274, 282, &
217 & 292, 303, 313, 325, 337, 349, 363, 377, 392, 408, 425, 444, 462, &
218 & 483, 505, 529, 554, 580, 610, 641, 675, 711, 751, 793, 841, 891, &
219 & 947,1008,1075,1150,1231,1323,1425,1538,1667,1633,14300 /
222 real (kind=kind_phys),
dimension(NWVSOL),
save :: s0intv
224 data s0intv( 1: 50) / &
225 & 1.60000e-6, 2.88000e-5, 3.60000e-5, 4.59200e-5, 6.13200e-5, &
226 & 8.55000e-5, 1.28600e-4, 2.16000e-4, 2.90580e-4, 3.10184e-4, &
227 & 3.34152e-4, 3.58722e-4, 3.88050e-4, 4.20000e-4, 4.57056e-4, &
228 & 4.96892e-4, 5.45160e-4, 6.00600e-4, 6.53600e-4, 7.25040e-4, &
229 & 7.98660e-4, 9.11200e-4, 1.03680e-3, 1.18440e-3, 1.36682e-3, &
230 & 1.57560e-3, 1.87440e-3, 2.25500e-3, 2.74500e-3, 3.39840e-3, &
231 & 4.34000e-3, 5.75400e-3, 7.74000e-3, 9.53050e-3, 9.90192e-3, &
232 & 1.02874e-2, 1.06803e-2, 1.11366e-2, 1.15830e-2, 1.21088e-2, &
233 & 1.26420e-2, 1.32250e-2, 1.38088e-2, 1.44612e-2, 1.51164e-2, &
234 & 1.58878e-2, 1.66500e-2, 1.75140e-2, 1.84450e-2, 1.94106e-2 /
235 data s0intv( 51:100) / &
236 & 2.04864e-2, 2.17248e-2, 2.30640e-2, 2.44470e-2, 2.59840e-2, &
237 & 2.75940e-2, 2.94138e-2, 3.13950e-2, 3.34800e-2, 3.57696e-2, &
238 & 3.84054e-2, 4.13490e-2, 4.46880e-2, 4.82220e-2, 5.22918e-2, &
239 & 5.70078e-2, 6.19888e-2, 6.54720e-2, 6.69060e-2, 6.81226e-2, &
240 & 6.97788e-2, 7.12668e-2, 7.27100e-2, 7.31610e-2, 7.33471e-2, &
241 & 7.34814e-2, 7.34717e-2, 7.35072e-2, 7.34939e-2, 7.35202e-2, &
242 & 7.33249e-2, 7.31713e-2, 7.35462e-2, 7.36920e-2, 7.23677e-2, &
243 & 7.25023e-2, 7.24258e-2, 7.20766e-2, 7.18284e-2, 7.32757e-2, &
244 & 7.31645e-2, 7.33277e-2, 7.36128e-2, 7.33752e-2, 7.28965e-2, &
245 & 7.24924e-2, 7.23307e-2, 7.21050e-2, 7.12620e-2, 7.10903e-2 /
246 data s0intv(101:151) / 7.12714e-2, &
247 & 7.08012e-2, 7.03752e-2, 7.00350e-2, 6.98639e-2, 6.90690e-2, &
248 & 6.87621e-2, 6.52080e-2, 6.65184e-2, 6.60038e-2, 6.47615e-2, &
249 & 6.44831e-2, 6.37206e-2, 6.24102e-2, 6.18698e-2, 6.06320e-2, &
250 & 5.83498e-2, 5.67028e-2, 5.51232e-2, 5.48645e-2, 5.12340e-2, &
251 & 4.85581e-2, 4.85010e-2, 4.79220e-2, 4.44058e-2, 4.48718e-2, &
252 & 4.29373e-2, 4.15242e-2, 3.81744e-2, 3.16342e-2, 2.99615e-2, &
253 & 2.92740e-2, 2.67484e-2, 1.76904e-2, 1.40049e-2, 1.46224e-2, &
254 & 1.39993e-2, 1.19574e-2, 1.06386e-2, 1.00980e-2, 8.63808e-3, &
255 & 6.52736e-3, 4.99410e-3, 4.39350e-3, 2.21676e-3, 1.33812e-3, &
256 & 1.12320e-3, 5.59000e-4, 3.60000e-4, 2.98080e-4, 7.46294e-5 /
258 real (kind=kind_phys),
dimension(NBDSW),
save :: wvn_sw1, wvn_sw2
259 real (kind=kind_phys),
dimension(NBDLW),
save :: wvn_lw1, wvn_lw2
267 integer,
parameter :: minvyr = 1850
269 integer,
parameter :: maxvyr = 1999
272 integer,
allocatable,
save :: ivolae(:,:,:)
291 integer,
parameter :: nxc = 5
293 integer,
parameter :: nae = 7
295 integer,
parameter :: ndm = 5
297 integer,
parameter :: imxae = 72
299 integer,
parameter :: jmxae = 37
301 integer,
parameter :: naerbnd=61
303 integer,
parameter :: nrhlev =8
305 integer,
parameter :: ncm1 = 6
307 integer,
parameter :: ncm2 = 4
308 integer,
parameter :: ncm = ncm1+ncm2
311 real (kind=kind_phys),
dimension(NRHLEV),
save :: rhlev
312 data rhlev(:) / 0.0, 0.5, 0.7, 0.8, 0.9, 0.95, 0.98, 0.99 /
322 real (kind=kind_phys),
save,
dimension(NDM,NAE) :: haer
324 real (kind=kind_phys),
save,
dimension(NDM,NAE) :: prsref
326 real (kind=kind_phys),
save,
dimension(NDM,NAE) :: sigref
348 real (kind=kind_phys),
allocatable,
save,
dimension(:,:) :: &
349 & extrhi, scarhi, ssarhi, asyrhi
350 real (kind=kind_phys),
allocatable,
save,
dimension(:,:,:) :: &
351 & extrhd, scarhd, ssarhd, asyrhd
352 real (kind=kind_phys),
allocatable,
save,
dimension(:) :: &
365 real (kind=kind_phys),
dimension(NXC,IMXAE,JMXAE),
save :: cmixg
367 real (kind=kind_phys),
dimension( 2 ,IMXAE,JMXAE),
save :: denng
369 integer,
dimension(NXC,IMXAE,JMXAE),
save :: idxcg
371 integer,
dimension( IMXAE,JMXAE),
save :: kprfg
380 integer,
parameter :: kaerbndd=61
381 integer,
parameter :: kaerbndi=56
383 integer,
parameter :: krhlev =36
385 integer,
parameter :: kcm1 = 5
387 integer,
parameter :: kcm2 = 10
389 integer,
parameter :: kcm = kcm1 + kcm2
391 real (kind=kind_phys),
dimension(KRHLEV) :: rhlev_grt &
392 data rhlev_grt(:)/ .00, .05, .10, .15, .20, .25, .30, .35, &
393 & .40, .45, .50, .55, .60, .65, .70, .75, .80, .81, .82, &
394 & .83, .84, .85, .86, .87, .88, .89, .90, .91, .92, .93, &
395 & .94, .95, .96, .97, .98, .99 /
403 real (kind=kind_phys),
allocatable,
save,
dimension(:,:) :: &
404 & extrhi_grt, extrhi_grt_550, scarhi_grt, ssarhi_grt, asyrhi_grt
415 real (kind=kind_phys),
allocatable,
save,
dimension(:,:,:) :: &
416 & extrhd_grt, extrhd_grt_550, scarhd_grt, ssarhd_grt, asyrhd_grt
419 integer,
parameter :: num_gc = 5
420 character*2 :: gridcomp(num_gc)
421 integer,
dimension (num_gc):: num_radius, radius_lower
422 integer,
dimension (num_gc):: trc_to_aod
424 data gridcomp /
'DU',
'SS',
'SU',
'BC',
'OC'/
425 data num_radius /5, 5, 1, 2, 2 /
426 data radius_lower /1, 6, 11, 12, 14 /
427 data trc_to_aod /1, 5, 4, 2, 3/
442 integer,
dimension(NCM) :: idxspc
443 data idxspc / 1, 2, 1, 1, 1, 1, 3, 5, 5, 4 /
449 real (kind=kind_phys),
parameter :: wvn550 = 1.0e4/0.55
451 integer,
save :: nv_aod = 1
452 integer :: i550,id550
456 public aer_init, aer_update, setaer
497 subroutine aer_init &
498 & ( nlay, mpicomm, mpirank, mpiroot, &
499 & iaermdl, iaerflg, lalw1bd, aeros_file, con_pi, &
500 & con_t0c, con_c, con_boltz, con_plnk, errflg, errmsg)
544 integer,
intent(in) :: nlay, mpirank, mpiroot
545 type(mpi_comm),
intent(in) :: mpicomm
546 integer,
intent(in) :: iaermdl, iaerflg
547 logical,
intent(in) :: lalw1bd
548 character(len=26),
intent(in) :: aeros_file
549 real(kind_phys),
intent(in) :: con_pi,con_t0c, con_c, con_boltz, &
552 integer,
intent(out) :: errflg
553 character(len=*),
intent(out) :: errmsg
556 real (kind=kind_phys),
dimension(NWVTOT) :: solfwv
557 real (kind=kind_phys),
dimension(NWVTIR) :: eirfwv
571 laswflg= (mod(iaerflg,10) > 0)
572 lalwflg= (mod(iaerflg/10,10) > 0)
573 lavoflg= (mod(iaerflg/100,10) >0)
577 if ( mpirank == mpiroot )
then
579 call wrt_aerlog(iaermdl, iaerflg, lalw1bd, errflg, errmsg)
586 if ( iaerflg == 0 )
return
608 nswlwbd = nswbnd + nlwbnd
610 wvn_sw1(:) = wvnsw1(:)
611 wvn_sw2(:) = wvnsw2(:)
612 wvn_lw1(:) = wvnlw1(:)
613 wvn_lw2(:) = wvnlw2(:)
618 if ( iaermdl == 0 )
then
621 wvn_sw1(2:nbdsw-1) = wvn_sw1(2:nbdsw-1) + 1
622 wvn_lw1(2:nbdlw) = wvn_lw1(2:nbdlw) + 1
627 if ( iaerflg /= 100 )
then
632 call set_spectrum(con_pi, con_t0c, con_c, con_boltz, con_plnk, &
640 if ( iaermdl==0 .or. iaermdl==5 )
then
643 & ( solfwv, eirfwv, mpicomm, mpirank, mpiroot, aeros_file, &
648 elseif ( iaermdl==1 .or. iaermdl==2 .or. iaermdl==6)
then
650 call gocart_aerinit &
652 & ( solfwv, eirfwv, mpirank, &
658 if ( mpirank == mpiroot )
then
659 print *,
' !!! ERROR in aerosol model scheme selection', &
660 &
' iaermdl =',iaermdl
662 errmsg =
'ERROR(aer_init): aerosol model scheme selected'// &
675 call set_volcaer(errflg, errmsg)
688 subroutine wrt_aerlog(iaermdl, iaerflg, lalw1bd, errflg, errmsg)
717 integer,
intent(in) :: iaermdl, iaerflg
718 logical,
intent(in) :: lalw1bd
720 integer,
intent(out) :: errflg
721 character(len=*),
intent(out) :: errmsg
734 if ( iaermdl==0 .or. iaermdl==5 )
then
735 print *,
' - Using OPAC-seasonal climatology for tropospheric', &
737 elseif ( iaermdl == 1 )
then
738 print *,
' - Using MERRA2-climatology for tropospheric', &
740 elseif ( iaermdl == 6 )
then
741 print *,
' - Using MERRA2 3 hourly aerosol for tropospheric', &
743 elseif ( iaermdl == 2 )
then
744 print *,
' - Using GOCART-prognostic aerosols for tropospheric', &
747 print *,
' !!! ERROR in selection of aerosol model scheme', &
748 &
' IAER_MDL =',iaermdl
750 errmsg =
'ERROR(wrt_aerlog): Selected aerosol model scheme is'//&
755 print *,
' IAER=',iaerflg,
' LW-trop-aer=',lalwflg, &
756 &
' SW-trop-aer=',laswflg,
' Volc-aer=',lavoflg
758 if ( iaerflg <= 0 )
then
759 print *,
' - No tropospheric/volcanic aerosol effect included'
760 print *,
' Input values of aerosol optical properties to' &
761 & ,
' both SW and LW radiations are set to zeros'
763 if ( iaerflg >= 100 )
then
764 print *,
' - Include stratospheric volcanic aerosol effect'
766 print *,
' - No stratospheric volcanic aerosol effect'
770 print *,
' - Compute multi-band aerosol optical' &
771 & ,
' properties for SW input parameters'
773 print *,
' - No SW radiation aerosol effect, values of' &
774 & ,
' aerosol properties to SW input are set to zeros'
779 print *,
' - Compute 1 broad-band aerosol optical' &
780 & ,
' properties for LW input parameters'
782 print *,
' - Compute multi-band aerosol optical' &
783 & ,
' properties for LW input parameters'
786 print *,
' - No LW radiation aerosol effect, values of' &
787 & ,
' aerosol properties to LW input are set to zeros'
792 end subroutine wrt_aerlog
798 subroutine set_spectrum(con_pi, con_t0c, con_c, con_boltz, &
799 & con_plnk, errflg, errmsg)
841 real(kind_phys),
intent(in) :: con_pi, con_t0c, con_c, con_boltz, &
848 integer,
intent(out) :: errflg
849 character(len=*),
intent(out) :: errmsg
851 real (kind=kind_phys) :: soltot, tmp1, tmp2, tmp3
853 integer :: nb, nw, nw1, nw2, nmax, nmin
875 nw1 = nw1 + nwvns0(nb-1)
878 nw2 = nw1 + nwvns0(nb) - 1
881 solfwv(nw) = s0intv(nb)
892 tmp1 = (con_pi + con_pi) * con_plnk * con_c* con_c
893 tmp2 = con_plnk * con_c / (con_boltz * con_t0c)
898 eirfwv(nw) = (tmp1 * tmp3**3) / (exp(tmp2*tmp3) - 1.0)
902 end subroutine set_spectrum
908 subroutine set_volcaer(errflg, errmsg)
931 integer,
intent(out) :: errflg
932 character(len=*),
intent(out) :: errmsg
944 if ( .not.
allocated(ivolae) )
then
945 allocate ( ivolae(12,4,10) )
949 end subroutine set_volcaer
953 end subroutine aer_init
966 subroutine clim_aerinit &
967 & ( solfwv, eirfwv, mpicomm, mpirank, mpiroot, aeros_file, &
1008 real (kind=kind_phys),
dimension(:) :: solfwv
1009 real (kind=kind_phys),
dimension(:) :: eirfwv
1010 type(mpi_comm),
intent(in) :: mpicomm
1011 integer,
intent(in) :: mpirank, mpiroot
1012 character(len=26),
intent(in) :: aeros_file
1014 integer,
intent(out) :: errflg
1015 character(len=*),
intent(out) :: errmsg
1018 real (kind=kind_phys),
dimension(NAERBND,NCM1) :: &
1019 & rhidext0, rhidsca0, rhidssa0, rhidasy0
1020 real (kind=kind_phys),
dimension(NAERBND,NRHLEV,NCM2):: &
1021 & rhdpext0, rhdpsca0, rhdpssa0, rhdpasy0
1022 real (kind=kind_phys),
dimension(NAERBND) :: straext0
1024 real (kind=kind_phys),
dimension(NSWBND,NAERBND) :: solwaer
1025 real (kind=kind_phys),
dimension(NSWBND) :: solbnd
1026 real (kind=kind_phys),
dimension(NLWBND,NAERBND) :: eirwaer
1027 real (kind=kind_phys),
dimension(NLWBND) :: eirbnd
1029 integer,
dimension(NSWBND) :: nv1, nv2
1030 integer,
dimension(NLWBND) :: nr1, nr2
1041 call set_aercoef(mpicomm, mpirank, mpiroot, &
1042 & aeros_file, errflg, errmsg)
1056 subroutine set_aercoef(mpicomm, mpirank, mpiroot, &
1057 & aeros_file,errflg, errmsg)
1136 type(mpi_comm),
intent(in) :: mpicomm
1137 integer,
intent(in) :: mpirank, mpiroot
1138 character(len=26),
intent(in) :: aeros_file
1140 integer,
intent(out) :: errflg
1141 character(len=*),
intent(out) :: errmsg
1144 integer,
dimension(NAERBND) :: iendwv
1146 integer :: i, j, k, m, mb, ib, ii, id, iw, iw1, iw2, ik, ibs, ibe
1148 real (kind=kind_phys) :: sumsol, sumir, fac, tmp, wvs, wve
1150 logical :: file_exist
1151 character :: cline*80
1164 if (mpirank==mpiroot)
then
1165 inquire (file=aeros_file, exist=file_exist)
1167 if ( file_exist )
then
1169 open (unit=niaercm,file=aeros_file,status=
'OLD', &
1170 & action=
'read',form=
'FORMATTED')
1173 print *,
' Requested aerosol data file "',aeros_file, &
1175 print *,
' *** Stopped in subroutine aero_init !!'
1177 errmsg =
'ERROR(set_aercoef): Requested aerosol data file '// &
1178 & aeros_file//
' not found'
1185 read (niaercm,12) cline
1198 if ( .not.
allocated( extrhi ) )
then
1199 allocate ( extrhi( ncm1,nswlwbd) )
1200 allocate ( scarhi( ncm1,nswlwbd) )
1201 allocate ( ssarhi( ncm1,nswlwbd) )
1202 allocate ( asyrhi( ncm1,nswlwbd) )
1203 allocate ( extrhd(nrhlev,ncm2,nswlwbd) )
1204 allocate ( scarhd(nrhlev,ncm2,nswlwbd) )
1205 allocate ( ssarhd(nrhlev,ncm2,nswlwbd) )
1206 allocate ( asyrhd(nrhlev,ncm2,nswlwbd) )
1207 allocate ( extstra( nswlwbd) )
1219 if (mpirank==mpiroot)
then
1221 read(niaercm,21) cline
1223 read(niaercm,22) iendwv(:)
1227 read(niaercm,21) cline
1228 read(niaercm,24) haer(:,:)
1232 read(niaercm,21) cline
1233 read(niaercm,26) prsref(:,:)
1237 read(niaercm,21) cline
1238 read(niaercm,28) rhidext0(:,:)
1242 read(niaercm,21) cline
1243 read(niaercm,28) rhidsca0(:,:)
1246 read(niaercm,21) cline
1247 read(niaercm,28) rhidssa0(:,:)
1250 read(niaercm,21) cline
1251 read(niaercm,28) rhidasy0(:,:)
1254 read(niaercm,21) cline
1255 read(niaercm,28) rhdpext0(:,:,:)
1258 read(niaercm,21) cline
1259 read(niaercm,28) rhdpsca0(:,:,:)
1262 read(niaercm,21) cline
1263 read(niaercm,28) rhdpssa0(:,:,:)
1266 read(niaercm,21) cline
1267 read(niaercm,28) rhdpasy0(:,:,:)
1270 read(niaercm,21) cline
1271 read(niaercm,28) straext0(:)
1277 call ccpp_bcast(iendwv, mpiroot, mpicomm, ierr)
1278 call ccpp_bcast(haer, mpiroot, mpicomm, ierr)
1279 call ccpp_bcast(prsref, mpiroot, mpicomm, ierr)
1280 call ccpp_bcast(rhidext0, mpiroot, mpicomm, ierr)
1281 call ccpp_bcast(rhidsca0, mpiroot, mpicomm, ierr)
1282 call ccpp_bcast(rhidssa0, mpiroot, mpicomm, ierr)
1283 call ccpp_bcast(rhidasy0, mpiroot, mpicomm, ierr)
1284 call ccpp_bcast(rhdpext0, mpiroot, mpicomm, ierr)
1285 call ccpp_bcast(rhdpsca0, mpiroot, mpicomm, ierr)
1286 call ccpp_bcast(rhdpssa0, mpiroot, mpicomm, ierr)
1287 call ccpp_bcast(rhdpasy0, mpiroot, mpicomm, ierr)
1288 call ccpp_bcast(straext0, mpiroot, mpicomm, ierr)
1293 sigref(:,:) = 0.001 * prsref(:,:)
1303 solwaer(i,j) = f_zero
1313 mb = ib + nswstr - 1
1314 if ( wvn_sw2(mb) >= wvn550 .and. wvn550 >= wvn_sw1(mb) )
then
1318 if ( wvn_sw1(mb) < wvs )
then
1322 if ( wvn_sw1(mb) > wve )
then
1332 mb = ib + nswstr - 1
1334 iw1 = nint(wvn_sw1(mb))
1335 iw2 = nint(wvn_sw2(mb))
1337 lab_swdowhile :
do while ( iw1 > iendwv(ii) )
1338 if ( ii == naerbnd )
exit lab_swdowhile
1342 if ( lmap_new )
then
1346 sumsol = -0.5 * solfwv(iw1)
1360 solbnd(ib) = solbnd(ib) + solfwv(iw)
1361 sumsol = sumsol + solfwv(iw)
1363 if ( iw == iendwv(ii) )
then
1364 solwaer(ib,ii) = sumsol
1366 if ( ii < naerbnd )
then
1373 if ( iw2 /= iendwv(ii) )
then
1374 solwaer(ib,ii) = sumsol
1377 if ( lmap_new )
then
1378 tmp = fac * solfwv(iw2)
1379 solwaer(ib,ii) = solwaer(ib,ii) + tmp
1380 solbnd(ib) = solbnd(ib) + tmp
1396 eirwaer(i,j) = f_zero
1402 if (nlwbnd > 1 )
then
1406 mb = ib + nlwstr - 1
1407 if ( wvn_lw1(mb) < wvs )
then
1411 if ( wvn_lw1(mb) > wve )
then
1422 if ( nlwbnd == 1 )
then
1427 mb = ib + nlwstr - 1
1428 iw1 = nint(wvn_lw1(mb))
1429 iw2 = nint(wvn_lw2(mb))
1432 lab_lwdowhile :
do while ( iw1 > iendwv(ii) )
1433 if ( ii == naerbnd )
exit lab_lwdowhile
1437 if ( lmap_new )
then
1441 sumir = -0.5 * eirfwv(iw1)
1455 eirbnd(ib) = eirbnd(ib) + eirfwv(iw)
1456 sumir = sumir + eirfwv(iw)
1458 if ( iw == iendwv(ii) )
then
1459 eirwaer(ib,ii) = sumir
1461 if ( ii < naerbnd )
then
1468 if ( iw2 /= iendwv(ii) )
then
1469 eirwaer(ib,ii) = sumir
1472 if ( lmap_new )
then
1473 tmp = fac * eirfwv(iw2)
1474 eirwaer(ib,ii) = eirwaer(ib,ii) + tmp
1475 eirbnd(ib) = eirbnd(ib) + tmp
1533 end subroutine set_aercoef
1585 real (kind=kind_phys) :: sumk, sums, sumok, sumokg, sumreft, &
1586 & sp, refb, reft, rsolbd, rirbd
1588 integer :: ib, nb, ni, nh, nc
1599 rsolbd = f_one / solbnd(nb)
1610 do ni = nv1(nb), nv2(nb)
1611 sp = sqrt( (f_one - rhidssa0(ni,nc)) &
1612 & / (f_one - rhidssa0(ni,nc)*rhidasy0(ni,nc)) )
1613 reft = (f_one - sp) / (f_one + sp)
1614 sumreft = sumreft + reft*solwaer(nb,ni)
1616 sumk = sumk + rhidext0(ni,nc)*solwaer(nb,ni)
1617 sums = sums + rhidsca0(ni,nc)*solwaer(nb,ni)
1618 sumok = sumok + rhidssa0(ni,nc)*solwaer(nb,ni) &
1620 sumokg = sumokg + rhidssa0(ni,nc)*solwaer(nb,ni) &
1621 & * rhidext0(ni,nc)*rhidasy0(ni,nc)
1624 refb = sumreft * rsolbd
1626 extrhi(nc,nb) = sumk * rsolbd
1627 scarhi(nc,nb) = sums * rsolbd
1628 asyrhi(nc,nb) = sumokg / (sumok + 1.0e-10)
1629 ssarhi(nc,nb) = 4.0*refb &
1630 & / ( (f_one+refb)**2 - asyrhi(nc,nb)*(f_one-refb)**2 )
1642 do ni = nv1(nb), nv2(nb)
1643 sp = sqrt( (f_one - rhdpssa0(ni,nh,nc)) &
1644 & / (f_one - rhdpssa0(ni,nh,nc)*rhdpasy0(ni,nh,nc)) )
1645 reft = (f_one - sp) / (f_one + sp)
1646 sumreft = sumreft + reft*solwaer(nb,ni)
1648 sumk = sumk + rhdpext0(ni,nh,nc)*solwaer(nb,ni)
1649 sums = sums + rhdpsca0(ni,nh,nc)*solwaer(nb,ni)
1650 sumok = sumok + rhdpssa0(ni,nh,nc)*solwaer(nb,ni) &
1651 & * rhdpext0(ni,nh,nc)
1652 sumokg = sumokg + rhdpssa0(ni,nh,nc)*solwaer(nb,ni) &
1653 & * rhdpext0(ni,nh,nc)*rhdpasy0(ni,nh,nc)
1656 refb = sumreft * rsolbd
1658 extrhd(nh,nc,nb) = sumk * rsolbd
1659 scarhd(nh,nc,nb) = sums * rsolbd
1660 asyrhd(nh,nc,nb) = sumokg / (sumok + 1.0e-10)
1661 ssarhd(nh,nc,nb) = 4.0*refb &
1662 & / ( (f_one+refb)**2 - asyrhd(nh,nc,nb)*(f_one-refb)**2 )
1669 do ni = nv1(nb), nv2(nb)
1670 sumk = sumk + straext0(ni)*solwaer(nb,ni)
1673 extstra(nb) = sumk * rsolbd
1700 rirbd = f_one / eirbnd(nb)
1709 do ni = nr1(nb), nr2(nb)
1710 sp = sqrt( (f_one - rhidssa0(ni,nc)) &
1711 & / (f_one - rhidssa0(ni,nc)*rhidasy0(ni,nc)) )
1712 reft = (f_one - sp) / (f_one + sp)
1713 sumreft = sumreft + reft*eirwaer(nb,ni)
1715 sumk = sumk + rhidext0(ni,nc)*eirwaer(nb,ni)
1716 sums = sums + rhidsca0(ni,nc)*eirwaer(nb,ni)
1717 sumok = sumok + rhidssa0(ni,nc)*eirwaer(nb,ni) &
1719 sumokg = sumokg + rhidssa0(ni,nc)*eirwaer(nb,ni) &
1720 & * rhidext0(ni,nc)*rhidasy0(ni,nc)
1723 refb = sumreft * rirbd
1725 extrhi(nc,ib) = sumk * rirbd
1726 scarhi(nc,ib) = sums * rirbd
1727 asyrhi(nc,ib) = sumokg / (sumok + 1.0e-10)
1728 ssarhi(nc,ib) = 4.0*refb &
1729 & / ( (f_one+refb)**2 - asyrhi(nc,ib)*(f_one-refb)**2 )
1740 do ni = nr1(nb), nr2(nb)
1741 sp = sqrt( (f_one - rhdpssa0(ni,nh,nc)) &
1742 & / (f_one - rhdpssa0(ni,nh,nc)*rhdpasy0(ni,nh,nc)) )
1743 reft = (f_one - sp) / (f_one + sp)
1744 sumreft = sumreft + reft*eirwaer(nb,ni)
1746 sumk = sumk + rhdpext0(ni,nh,nc)*eirwaer(nb,ni)
1747 sums = sums + rhdpsca0(ni,nh,nc)*eirwaer(nb,ni)
1748 sumok = sumok + rhdpssa0(ni,nh,nc)*eirwaer(nb,ni) &
1749 & * rhdpext0(ni,nh,nc)
1750 sumokg = sumokg + rhdpssa0(ni,nh,nc)*eirwaer(nb,ni) &
1751 & * rhdpext0(ni,nh,nc)*rhdpasy0(ni,nh,nc)
1754 refb = sumreft * rirbd
1756 extrhd(nh,nc,ib) = sumk * rirbd
1757 scarhd(nh,nc,ib) = sums * rirbd
1758 asyrhd(nh,nc,ib) = sumokg / (sumok + 1.0e-10)
1759 ssarhd(nh,nc,ib) = 4.0*refb &
1760 & / ( (f_one+refb)**2 - asyrhd(nh,nc,ib)*(f_one-refb)**2 )
1767 do ni = nr1(nb), nr2(nb)
1768 sumk = sumk + straext0(ni)*eirwaer(nb,ni)
1771 extstra(ib) = sumk * rirbd
1790 end subroutine optavg
1794 end subroutine clim_aerinit
1806 subroutine aer_update &
1807 & ( iyear, imon, mpicomm, mpirank, mpiroot, &
1808 & iaermdl, aeros_file, errflg, errmsg )
1838 integer,
intent(in) :: iyear, imon, mpirank, mpiroot
1839 type(mpi_comm),
intent(in) :: mpicomm
1840 integer,
intent(in) :: iaermdl
1841 character(len=26),
intent(in) :: aeros_file
1843 integer,
intent(out) :: errflg
1844 character(len=*),
intent(out) :: errmsg
1854 if ( imon < 1 .or. imon > 12 )
then
1855 print *,
' ***** ERROR in specifying requested month !!! ', &
1858 errmsg =
'ERROR(aer_update): Requested month not valid'
1863 if ( lalwflg .or. laswflg )
then
1865 if ( iaermdl == 0 .or. iaermdl==5 )
then
1866 call trop_update(mpicomm, mpirank, mpiroot, aeros_file, &
1868 if(errflg/=0)
return
1875 call volc_update(mpicomm, mpirank, mpiroot, errflg, errmsg)
1886 subroutine trop_update(mpicomm, mpirank, mpiroot, aeros_file, &
1924 type(mpi_comm),
intent(in) :: mpicomm
1925 integer,
intent(in) :: mpirank, mpiroot
1927 character(len=26),
intent(in) :: aeros_file
1929 integer,
intent(out) :: errflg
1930 character(len=*),
intent(out) :: errmsg
1934 real (kind=kind_phys) :: cmix(nxc), denn, tem
1935 integer :: idxc(nxc), kprf
1937 integer :: i, id, j, k, m, nc
1938 logical :: file_exist
1940 character :: cline*80, ctyp*3
1952 if ( mpirank==mpiroot )
then
1953 inquire (file=aeros_file, exist=file_exist)
1955 if ( file_exist )
then
1957 open (unit=niaercm,file=aeros_file,status=
'OLD', &
1958 & action=
'read',form=
'FORMATTED')
1961 print *,
' Opened aerosol data file: ',aeros_file
1963 print *,
' Requested aerosol data file "',aeros_file, &
1965 print *,
' *** Stopped in subroutine trop_update !!'
1967 errmsg =
'ERROR(trop_update):Requested aerosol data file '// &
1968 & aeros_file //
' not found.'
1978 cmixg(m,i,j) = f_zero
1986 denng(1,i,j) = f_zero
1987 denng(2,i,j) = f_zero
1991 read_and_broadcast:
if (mpirank==mpiroot)
then
1994 lab_do_12mon :
do m = 1, 12
1996 read(niaercm,12) cline
1999 if ( m /= imon )
then
2008 if ( mpirank==mpiroot ) print *,
' --- Reading ',cline
2012 read(niaercm,14) (idxc(k),cmix(k),k=1,nxc),kprf,denn,nc,&
2014 14
format(5(i2,e11.4),i2,f8.2,i3,1x,a3)
2018 if ( kprf >= 6 )
then
2019 denng(2,i,j) = cmix(nxc)
2021 denng(2,i,j) = f_zero
2026 idxcg(k,i,j) = idxc(k)
2027 cmixg(k,i,j) = cmix(k)
2030 idxcg(nxc,i,j) = idxc(nxc)
2031 cmixg(nxc,i,j) = tem
2040 endif read_and_broadcast
2042 call ccpp_bcast(kprfg, mpiroot, mpicomm, ierr)
2043 call ccpp_bcast(denng, mpiroot, mpicomm, ierr)
2044 call ccpp_bcast(idxcg, mpiroot, mpicomm, ierr)
2045 call ccpp_bcast(cmixg, mpiroot, mpicomm, ierr)
2061 end subroutine trop_update
2068 subroutine volc_update(mpicomm, mpirank, mpiroot, errflg, errmsg)
2107 type(mpi_comm),
intent(in) :: mpicomm
2108 integer,
intent(in) :: mpirank, mpiroot
2113 integer,
intent(out) :: errflg
2114 character(len=*),
intent(out) :: errmsg
2118 logical :: file_exist
2120 character :: cline*80, volcano_file*32
2121 data volcano_file /
'volcanic_aerosols_1850-1859.txt ' /
2133 if ( kyrstr<=iyear .and. iyear<=kyrend )
then
2138 kyrstr = iyear - mod(iyear,10)
2145 if ( iyear < minvyr .or. iyear > maxvyr )
then
2150 if ( mpirank==mpiroot )
then
2151 print *,
' Request volcanic date out of range,', &
2152 &
' optical depth set to lowest value'
2155 write(volcano_file(19:27),60) kyrstr,kyrend
2156 60
format(i4.4,
'-',i4.4)
2157 read_and_broadcast:
if (mpirank==mpiroot)
then
2158 inquire (file=volcano_file, exist=file_exist)
2159 if ( file_exist )
then
2161 open (unit=niaercm,file=volcano_file,status=
'OLD', &
2162 & action=
'read',form=
'FORMATTED')
2164 read(niaercm,62) cline
2168 print *,
' Opened volcanic data file: ',volcano_file
2173 read(niaercm,64) (ivolae(i,j,k),i=1,12)
2180 print *,
' Requested volcanic data file "', &
2181 & volcano_file,
'" not found!'
2182 print *,
' *** Stopped in subroutine VOLC_AERINIT !!'
2184 errmsg =
'ERROR(volc_update): Requested volcanic data '// &
2185 &
'file '//volcano_file//
' not found!'
2188 endif read_and_broadcast
2192 call ccpp_bcast(ivolae, mpiroot, mpicomm, ierr)
2197 if ( mpirank==mpiroot )
then
2198 k = mod(kyrsav,10) + 1
2199 print *,
' CHECK: Sample Volcanic data used for month, year:', &
2201 print *, ivolae(kmonsav,:,k)
2205 end subroutine volc_update
2209 end subroutine aer_update
2239 & ( prsi,prsl,prslk,tvly,rhlay,slmsk,tracer,aerfld,xlon,xlat, &
2240 & imax,nlay,nlp1, lsswr,lslwr,iaermdl,iaerflg,top_at_1, &
2241 & con_pi,con_rd,con_g,aerosw,aerolw, &
2242 & aerodp, ext550, errflg, errmsg &
2305 integer,
intent(in) :: imax, nlay, nlp1, iaermdl, iaerflg
2306 real (kind=kind_phys),
intent(in) :: con_pi, con_rd, con_g
2307 real (kind=kind_phys),
dimension(:,:),
intent(in) :: prsi, prsl, &
2308 & prslk, tvly, rhlay
2309 real (kind=kind_phys),
dimension(:),
intent(in) :: xlon, xlat, &
2311 real (kind=kind_phys),
dimension(:,:,:),
intent(in):: tracer
2312 real (kind=kind_phys),
dimension(:,:,:),
intent(in):: aerfld
2314 logical,
intent(in) :: lsswr, lslwr, top_at_1
2318 real (kind=kind_phys),
dimension(:,:,:,:),
intent(out) :: &
2321 real (kind=kind_phys),
dimension(:,:) ,
intent(out) :: aerodp
2322 real (kind=kind_phys),
dimension(:,:) ,
intent(out) :: ext550
2323 integer,
intent(out) :: errflg
2324 character(len=*),
intent(out) :: errmsg
2327 real (kind=kind_phys),
parameter :: psrfh = 5.0
2329 real (kind=kind_phys),
dimension(IMAX) :: alon,alat,volcae,rdelp
2331 real (kind=kind_phys) :: prsln(nlp1),hz(imax,nlp1),dz(imax,nlay)
2332 real (kind=kind_phys) :: tmp1, tmp2, psrfl
2334 integer :: kcutl(imax), kcuth(imax)
2335 integer :: i, i1, j, k, m, mb, kh, kl
2337 logical :: laddsw=.false., laersw=.false.
2338 logical :: laddlw=.false., laerlw=.false.
2341 real (kind=kind_phys) :: rdg
2342 real (kind=kind_phys) :: rovg
2345 rdg = 180._kind_phys / con_pi
2346 rovg = 0.001_kind_phys * con_rd / con_g
2358 if ( .not. (lsswr .or. lslwr) )
then
2362 if ( iaerflg <= 0 )
then
2366 laersw = lsswr .and. laswflg
2367 laerlw = lslwr .and. lalwflg
2372 alon(i) = xlon(i) * rdg
2373 if (alon(i) < f_zero) alon(i) = alon(i) + 360.0
2374 alat(i) = xlat(i) * rdg
2380 if ( laswflg .or. lalwflg )
then
2382 lab_do_imax :
do i = 1, imax
2384 lab_if_flip :
if (.not. top_at_1)
then
2387 prsln(k) = log(prsi(i,k))
2389 prsln(nlp1)= log(prsl(i,nlay))
2392 dz(i,k) = rovg * (prsln(k) - prsln(k+1)) * tvly(i,k)
2394 dz(i,nlay) = 2.0 * dz(i,nlay)
2398 hz(i,k+1) = hz(i,k) + dz(i,k)
2403 prsln(1) = log(prsl(i,1))
2405 prsln(k) = log(prsi(i,k))
2409 dz(i,k) = rovg * (prsln(k+1) - prsln(k)) * tvly(i,k)
2411 dz(i,1) = 2.0 * dz(i,1)
2415 hz(i,k) = hz(i,k+1) + dz(i,k)
2433 if ( iaermdl==0 .or. iaermdl==5 )
then
2437 & ( prsi,prsl,prslk,tvly,rhlay,dz,hz,tracer, &
2438 & alon,alat,slmsk, laersw,laerlw, &
2439 & imax,nlay,nlp1,top_at_1, &
2442 & aerosw,aerolw,aerodp,errflg,errmsg &
2446 elseif ( iaermdl==1 .or. iaermdl==2 .or. iaermdl==6)
then
2448 call aer_property_gocart &
2450 & ( prsi,prsl,prslk,tvly,rhlay,dz,hz,tracer,aerfld, &
2451 & alon,alat,slmsk,laersw,laerlw,con_rd, &
2454 & aerosw,aerolw,aerodp,ext550,errflg,errmsg &
2457 if(errflg/=0)
return
2508 if ( iaerflg == 100 )
then
2512 laddsw = lsswr .and. laswflg
2513 laddlw = lslwr .and. lalwflg
2516 i1 = mod(kyrsav, 10) + 1
2521 if ( alat(i) > 46.0 )
then
2522 volcae(i) = 1.0e-4 * ivolae(kmonsav,1,i1)
2523 else if ( alat(i) > 44.0 )
then
2524 volcae(i) = 5.0e-5 &
2525 & * (ivolae(kmonsav,1,i1) + ivolae(kmonsav,2,i1))
2526 else if ( alat(i) > 1.0 )
then
2527 volcae(i) = 1.0e-4 * ivolae(kmonsav,2,i1)
2528 else if ( alat(i) > -1.0 )
then
2529 volcae(i) = 5.0e-5 &
2530 & * (ivolae(kmonsav,2,i1) + ivolae(kmonsav,3,i1))
2531 else if ( alat(i) >-44.0 )
then
2532 volcae(i) = 1.0e-4 * ivolae(kmonsav,3,i1)
2533 else if ( alat(i) >-46.0 )
then
2534 volcae(i) = 5.0e-5 &
2535 & * (ivolae(kmonsav,3,i1) + ivolae(kmonsav,4,i1))
2537 volcae(i) = 1.0e-4 * ivolae(kmonsav,4,i1)
2547 tmp1 = abs( alat(i) )
2548 if ( tmp1 > 70.0 )
then
2550 elseif ( tmp1 < 20.0 )
then
2553 psrfl = 110.0 + 2.0*tmp1
2558 rdelp(i) = f_one / prsi(i,2)
2560 lab_do_kcuth0 :
do k = 2, nlay-2
2561 if ( prsi(i,k) >= psrfh )
then
2567 lab_do_kcutl0 :
do k = 2, nlay-2
2568 if ( prsi(i,k) >= psrfl )
then
2570 rdelp(i) = f_one / (prsi(i,k) - prsi(i,kcuth(i)))
2582 if ( wvn_sw1(mb) > 20000 )
then
2584 elseif ( wvn_sw2(mb) < 20000 )
then
2589 tmp1 = (0.275e-4 * (wvn_sw2(mb)+wvn_sw1(mb))) ** tmp2
2595 tmp2 = tmp1 * ((prsi(i,k+1) - prsi(i,k)) * rdelp(i))
2596 aerosw(i,k,m,1) = aerosw(i,k,m,1) + tmp2*volcae(i)
2601 if ( aerosw(i,kl,m,1) > 10.*aerosw(i,kl+1,m,1) )
then
2602 tmp2 = aerosw(i,kl,m,1) + aerosw(i,kl+1,m,1)
2603 aerosw(i,kl ,m,1) = 0.8 * tmp2
2604 aerosw(i,kl+1,m,1) = 0.2 * tmp2
2626 if ( nlwbnd == 1 )
then
2628 tmp1 = (0.55 / 11.0) ** 1.2
2633 tmp2 = tmp1 * ((prsi(i,k+1) - prsi(i,k)) * rdelp(i)) &
2636 aerolw(i,k,m,1) = aerolw(i,k,m,1) + tmp2
2644 tmp1 = (0.275e-4 * (wvn_lw2(m) + wvn_lw1(m))) ** 1.2
2650 tmp2 = tmp1 * ((prsi(i,k+1)-prsi(i,k)) * rdelp(i))
2651 aerolw(i,k,m,1) = aerolw(i,k,m,1) + tmp2*volcae(i)
2665 tmp1 = abs( alat(i) )
2666 if ( tmp1 > 70.0 )
then
2668 elseif ( tmp1 < 20.0 )
then
2671 psrfl = 110.0 + 2.0*tmp1
2676 rdelp(i) = f_one / prsi(i,nlay-1)
2678 lab_do_kcuth1 :
do k = nlay-1, 2, -1
2679 if ( prsi(i,k) >= psrfh )
then
2685 lab_do_kcutl1 :
do k = nlay, 2, -1
2686 if ( prsi(i,k) >= psrfl )
then
2688 rdelp(i) = f_one / (prsi(i,k) - prsi(i,kcuth(i)+1))
2700 if ( wvn_sw1(mb) > 20000 )
then
2702 elseif ( wvn_sw2(mb) < 20000 )
then
2707 tmp1 = (0.275e-4 * (wvn_sw2(mb)+wvn_sw1(mb))) ** tmp2
2713 tmp2 = tmp1 * ((prsi(i,k) - prsi(i,k+1)) * rdelp(i))
2714 aerosw(i,k,m,1) = aerosw(i,k,m,1) + tmp2*volcae(i)
2719 if ( aerosw(i,kl,m,1) > 10.*aerosw(i,kl-1,m,1) )
then
2720 tmp2 = aerosw(i,kl,m,1) + aerosw(i,kl-1,m,1)
2721 aerosw(i,kl ,m,1) = 0.8 * tmp2
2722 aerosw(i,kl-1,m,1) = 0.2 * tmp2
2743 if ( nlwbnd == 1 )
then
2745 tmp1 = (0.55 / 11.0) ** 1.2
2750 tmp2 = tmp1 * ((prsi(i,k) - prsi(i,k+1)) * rdelp(i)) &
2753 aerolw(i,k,m,1) = aerolw(i,k,m,1) + tmp2
2761 tmp1 = (0.275e-4 * (wvn_lw2(m) + wvn_lw1(m))) ** 1.2
2767 tmp2 = tmp1 * ((prsi(i,k)-prsi(i,k+1)) * rdelp(i))
2768 aerolw(i,k,m,1) = aerolw(i,k,m,1) + tmp2*volcae(i)
2781 end subroutine setaer
2812 subroutine aer_property &
2813 & ( prsi,prsl,prslk,tvly,rhlay,dz,hz,tracer, &
2814 & alon,alat,slmsk, laersw,laerlw, &
2815 & imax,nlay,nlp1,top_at_1, &
2816 & aerosw,aerolw,aerodp,errflg,errmsg &
2880 integer,
intent(in) :: imax, nlay, nlp1
2882 logical,
intent(in) :: laersw, laerlw, top_at_1
2884 real (kind=kind_phys),
dimension(:,:),
intent(in) :: prsi, prsl, &
2885 & prslk, tvly, rhlay, dz, hz
2886 real (kind=kind_phys),
dimension(:),
intent(in) :: alon, alat, &
2888 real (kind=kind_phys),
dimension(:,:,:),
intent(in):: tracer
2891 real (kind=kind_phys),
dimension(:,:,:,:),
intent(out) :: &
2893 real (kind=kind_phys),
dimension(:,:) ,
intent(out) :: aerodp
2894 integer,
intent(out) :: errflg
2895 character(len=*),
intent(out) :: errmsg
2898 real (kind=kind_phys),
dimension(NCM) :: cmix
2899 real (kind=kind_phys),
dimension( 2) :: denn
2900 real (kind=kind_phys),
dimension(NSPC) :: spcodp
2902 real (kind=kind_phys),
dimension(NLAY) :: delz, rh1, dz1
2903 integer,
dimension(NLAY) :: idmaer
2905 real (kind=kind_phys),
dimension(NLAY,NSWLWBD):: tauae,ssaae,asyae
2908 real (kind=kind_phys) :: tmp1, tmp2, rps, dtmp, h1
2909 real (kind=kind_phys) :: wi, wj, w11, w12, w21, w22
2911 integer :: i, ii, i1, i2, i3, j1, j2, j3, k, m, m1, &
2915 real (kind=kind_phys),
parameter :: dltg = 360.0 / float(imxae)
2916 real (kind=kind_phys),
parameter :: hdlt = 0.5 * dltg
2917 real (kind=kind_phys),
parameter :: rdlt = 1.0 / dltg
2936 lab_do_imax :
do i = 1, imax
2942 lab_do_imxae :
do while ( i3 <= imxae )
2943 tmp1 = dltg * (i3 - 1)
2944 dtmp = alon(i) - tmp1
2947 if ( dtmp > dltg )
then
2949 if ( i3 > imxae )
then
2950 print *,
' ERROR! In setclimaer alon>360. ipt =',i, &
2951 &
', dltg,alon,tlon,dlon =',dltg,alon(i),tmp1,dtmp
2953 errmsg =
'ERROR(aer_property) alon > 360'
2956 elseif ( dtmp >= f_zero )
then
2958 i2 = mod(i3,imxae) + 1
2960 if ( dtmp <= hdlt )
then
2970 print *,
' ERROR! In setclimaer alon< 0. ipt =',i, &
2971 &
', dltg,alon,tlon,dlon =',dltg,alon(i),tmp1,dtmp
2973 errmsg =
'ERROR(aer_property) alon < 0'
2983 lab_do_jmxae :
do while ( j3 <= jmxae )
2984 tmp2 = 90.0 - dltg * (j3 - 1)
2985 dtmp = tmp2 - alat(i)
2988 if ( dtmp > dltg )
then
2990 if ( j3 >= jmxae )
then
2991 print *,
' ERROR! In setclimaer alat<-90. ipt =',i, &
2992 &
', dltg,alat,tlat,dlat =',dltg,alat(i),tmp2,dtmp
2994 errmsg =
'ERROR(aer_property) alat < -90'
2997 elseif ( dtmp >= f_zero )
then
3001 if ( dtmp <= hdlt )
then
3011 print *,
' ERROR! In setclimaer alat>90. ipt =',i, &
3012 &
', dltg,alat,tlat,dlat =',dltg,alat(i),tmp2,dtmp
3014 errmsg =
'ERROR(aer_property) alat > 90'
3024 kpa = max( kprfg(i1,j1),kprfg(i1,j2),kprfg(i2,j1),kprfg(i2,j2) )
3029 if ( kp /= kpa )
then
3030 if ( kpa == 6 )
then
3032 if ( slmsk(i) > f_zero )
then
3034 h1 = 0.5*(haer(1,6) + haer(1,7))
3039 elseif ( kpa == 7 )
then
3041 if ( slmsk(i) <= f_zero )
then
3043 h1 = 0.5*(haer(1,6) + haer(1,7))
3057 w11 = (f_one-wi) * (f_one-wj)
3058 w12 = (f_one-wi) * wj
3059 w21 = wi * (f_one-wj)
3074 denn(m) = w11*denng(m,i1,j1) + w12*denng(m,i1,j2) &
3075 & + w21*denng(m,i2,j1) + w22*denng(m,i2,j2)
3084 cmix(ii) = cmix(ii) + w11*cmixg(m,i1,j1)
3088 cmix(ii) = cmix(ii) + w12*cmixg(m,i1,j2)
3092 cmix(ii) = cmix(ii) + w21*cmixg(m,i2,j1)
3096 cmix(ii) = cmix(ii) + w22*cmixg(m,i2,j2)
3112 lab_if_flip :
if (.not. top_at_1)
then
3114 if ( prsi(i,1) > 100.0 )
then
3115 rps = f_one / prsi(i,1)
3117 print *,
' !!! (1) Error in subr radiation_aerosols:', &
3118 &
' unrealistic surface pressure =', i,prsi(i,1)
3120 errmsg =
'ERROR(aer_property): Unrealistic surface pressure'
3126 if (prsi(i,k+1)*rps < sigref(ii,kp))
then
3128 if (ii == 2 .and. prsref(2,kp) == prsref(3,kp))
then
3140 if (tmp1 > f_zero)
then
3142 delz(k) = tmp1 * (exp(-hz(i,k)*tmp2)-exp(-hz(i,k+1)*tmp2))
3150 if ( prsi(i,nlp1) > 100.0 )
then
3151 rps = 1.0 / prsi(i,nlp1)
3153 print *,
' !!! (2) Error in subr radiation_aerosols:', &
3154 &
' unrealistic surface pressure =', i,prsi(i,nlp1)
3159 if (prsi(i,k)*rps < sigref(ii,kp))
then
3161 if (ii == 2 .and. prsref(2,kp) == prsref(3,kp))
then
3173 if (tmp1 > f_zero)
then
3175 delz(k) = tmp1 * (exp(-hz(i,k+1)*tmp2)-exp(-hz(i,k)*tmp2))
3194 call radclimaer(top_at_1)
3202 aerosw(i,k,m,1) = tauae(k,m)
3203 aerosw(i,k,m,2) = ssaae(k,m)
3204 aerosw(i,k,m,3) = asyae(k,m)
3210 aerodp(i,1) = aerodp(i,1) + tauae(k,nv_aod)
3215 aerodp(i,m+1) = spcodp(m)
3222 if ( nlwbnd == 1 )
then
3226 aerolw(i,k,m,1) = tauae(k,m1)
3227 aerolw(i,k,m,2) = ssaae(k,m1)
3228 aerolw(i,k,m,3) = asyae(k,m1)
3235 aerolw(i,k,m,1) = tauae(k,m1)
3236 aerolw(i,k,m,2) = ssaae(k,m1)
3237 aerolw(i,k,m,3) = asyae(k,m1)
3255 subroutine radclimaer(top_at_1)
3287 real (kind=kind_phys) :: crt1, crt2
3288 parameter(crt1=30.0, crt2=0.03333)
3291 logical,
intent(in) :: top_at_1
3295 real (kind=kind_phys) :: cm, hd, hdi, sig0u, sig0l, ratio, tt0, &
3296 & ex00, sc00, ss00, as00, ex01, sc01, ss01, as01, tt1, &
3297 & ex02, sc02, ss02, as02, ex03, sc03, ss03, as03, tt2, &
3298 & ext1, sca1, ssa1, asy1, drh0, drh1, rdrh
3300 integer :: ih1, ih2, kk, idom, icmp, ib, ii, ic, ic1
3309 lab_do_layer :
do kk = 1, nlay
3314 do while ( rh1(kk) > rhlev(ih2) )
3316 if ( ih2 > nrhlev )
exit
3318 ih1 = max( 1, ih2-1 )
3319 ih2 = min( nrhlev, ih2 )
3321 drh0 = rhlev(ih2) - rhlev(ih1)
3322 drh1 = rh1(kk) - rhlev(ih1)
3323 if ( ih1 == ih2 )
then
3333 lab_if_idom :
if (idom == 5)
then
3337 tauae(kk,ib) = f_zero
3338 if ( ib <= nswbnd )
then
3340 asyae(kk,ib) = 0.696
3347 elseif (idom == 4)
then lab_if_idom
3351 tauae(kk,ib) = extstra(ib) * delz(kk)
3352 if ( ib <= nswbnd )
then
3354 asyae(kk,ib) = 0.696
3363 spcodp(idx) = spcodp(idx) + tauae(kk,nv_aod)
3365 elseif (idom == 3)
then lab_if_idom
3380 ex03 = extrhd(ih1,1,ib) &
3381 & + rdrh * (extrhd(ih2,1,ib) - extrhd(ih1,1,ib))
3382 sc03 = scarhd(ih1,1,ib) &
3383 & + rdrh * (scarhd(ih2,1,ib) - scarhd(ih1,1,ib))
3384 ss03 = ssarhd(ih1,1,ib) &
3385 & + rdrh * (ssarhd(ih2,1,ib) - ssarhd(ih1,1,ib))
3386 as03 = asyrhd(ih1,1,ib) &
3387 & + rdrh * (asyrhd(ih2,1,ib) - asyrhd(ih1,1,ib))
3389 ext1 = 0.17e-3*ex01 + 0.4*ex02 + 0.59983*ex03
3390 sca1 = 0.17e-3*sc01 + 0.4*sc02 + 0.59983*sc03
3391 ssa1 = 0.17e-3*ss01*ex01 + 0.4*ss02*ex02 + 0.59983*ss03*ex03
3392 asy1 = 0.17e-3*as01*sc01 + 0.4*as02*sc02 + 0.59983*as03*sc03
3394 tauae(kk,ib) = ext1 * 730.0 * delz(kk)
3395 ssaae(kk,ib) = min(f_one, ssa1/ext1)
3396 asyae(kk,ib) = min(f_one, asy1/sca1)
3399 if ( ib==nv_aod )
then
3400 spcodp(1) = spcodp(1) + 0.17e-3*ex01*730.0*delz(kk)
3401 spcodp(2) = spcodp(2) + 0.4 *ex02*730.0*delz(kk)
3402 spcodp(3) = spcodp(3) + 0.59983*ex03*730.0*delz(kk)
3407 elseif (idom == 1)
then lab_if_idom
3410 lab_do_ib :
do ib = 1, nswlwbd
3416 lab_do_icmp :
do icmp = 1, ncm
3421 lab_if_cm :
if ( cm > f_zero )
then
3423 lab_if_ic :
if ( ic <= ncm1 )
then
3424 tt0 = cm * extrhi(ic,ib)
3426 sca1 = sca1 + cm * scarhi(ic,ib)
3427 ssa1 = ssa1 + cm * ssarhi(ic,ib) * extrhi(ic,ib)
3428 asy1 = asy1 + cm * asyrhi(ic,ib) * scarhi(ic,ib)
3432 ex00 = extrhd(ih1,ic1,ib) &
3433 & + rdrh * (extrhd(ih2,ic1,ib) - extrhd(ih1,ic1,ib))
3434 sc00 = scarhd(ih1,ic1,ib) &
3435 & + rdrh * (scarhd(ih2,ic1,ib) - scarhd(ih1,ic1,ib))
3436 ss00 = ssarhd(ih1,ic1,ib) &
3437 & + rdrh * (ssarhd(ih2,ic1,ib) - ssarhd(ih1,ic1,ib))
3438 as00 = asyrhd(ih1,ic1,ib) &
3439 & + rdrh * (asyrhd(ih2,ic1,ib) - asyrhd(ih1,ic1,ib))
3443 sca1 = sca1 + cm * sc00
3444 ssa1 = ssa1 + cm * ss00 * ex00
3445 asy1 = asy1 + cm * as00 * sc00
3449 if ( ib==nv_aod )
then
3450 spcodp(idx) = spcodp(idx) + tt0*denn(1)*delz(kk)
3456 tauae(kk,ib) = ext1 * denn(1) * delz(kk)
3457 ssaae(kk,ib) = min(f_one, ssa1/ext1)
3458 asyae(kk,ib) = min(f_one, asy1/sca1)
3461 elseif (idom == 2)
then lab_if_idom
3465 tauae(kk,ib) = extrhi(6,ib) * denn(2) * delz(kk)
3466 ssaae(kk,ib) = ssarhi(6,ib)
3467 asyae(kk,ib) = asyrhi(6,ib)
3471 spcodp(1) = spcodp(1) + tauae(kk,nv_aod)
3477 tauae(kk,ib) = f_zero
3478 ssaae(kk,ib) = f_one
3479 asyae(kk,ib) = f_zero
3498 if ( tauae(kk,ib) > f_zero )
then
3499 ratio = tauae(kk-1,ib) / tauae(kk,ib)
3504 tt0 = tauae(kk,ib) + tauae(kk-1,ib)
3508 if ( ratio > crt1 )
then
3510 tauae(kk-1,ib) = tt2
3513 if ( ratio < crt2 )
then
3515 tauae(kk-1,ib) = tt1
3523 do kk = nlay-1, 1, -1
3524 if ( tauae(kk,ib) > f_zero )
then
3525 ratio = tauae(kk+1,ib) / tauae(kk,ib)
3530 tt0 = tauae(kk,ib) + tauae(kk+1,ib)
3534 if ( ratio > crt1 )
then
3536 tauae(kk+1,ib) = tt2
3539 if ( ratio < crt2 )
then
3541 tauae(kk+1,ib) = tt1
3550 end subroutine radclimaer
3554 end subroutine aer_property
3567 subroutine gocart_aerinit &
3568 & ( solfwv, eirfwv, me, &
3606 real (kind=kind_phys),
dimension(:) :: solfwv
3607 real (kind=kind_phys),
dimension(:) :: eirfwv
3609 integer,
intent(in) :: me
3612 integer,
intent(out) :: errflg
3613 character(len=*),
intent(out) :: errmsg
3616 real (kind=kind_phys),
dimension(kaerbndi,kcm1) :: &
3617 & rhidext0_grt, rhidsca0_grt, rhidssa0_grt, rhidasy0_grt
3618 real (kind=kind_phys),
dimension(kaerbndd,krhlev,kcm2):: &
3619 & rhdpext0_grt, rhdpsca0_grt, rhdpssa0_grt, rhdpasy0_grt
3621 real (kind=kind_phys),
dimension(nswbnd,kaerbndd) :: solwaer
3622 real (kind=kind_phys),
dimension(nswbnd) :: solbnd
3623 real (kind=kind_phys),
dimension(nlwbnd,kaerbndd) :: eirwaer
3624 real (kind=kind_phys),
dimension(nlwbnd) :: eirbnd
3626 real (kind=kind_phys),
dimension(nswbnd,kaerbndi) :: solwaer_du
3627 real (kind=kind_phys),
dimension(nswbnd) :: solbnd_du
3628 real (kind=kind_phys),
dimension(nlwbnd,kaerbndi) :: eirwaer_du
3629 real (kind=kind_phys),
dimension(nlwbnd) :: eirbnd_du
3631 integer,
dimension(nswbnd) :: nv1, nv2, nv1_du, nv2_du
3632 integer,
dimension(nlwbnd) :: nr1, nr2, nr1_du, nr2_du
3634 integer,
dimension(kaerbndd) :: iendwv
3635 integer,
dimension(kaerbndi) :: iendwv_du
3636 real (kind=kind_phys),
dimension(kaerbndd) :: wavelength
3637 real (kind=kind_phys),
dimension(kaerbndi) :: wavelength_du
3638 real (kind=kind_phys) :: sumsol, sumir, sumsol_du, sumir_du
3640 integer :: i, j, k, mb, ib, ii, iix, iw, iw1, iw2
3654 print *,
'NOTE: gocart aerosol initialization is reading input ', &
3655 &
'data with all MPI ranks'
3657 if (kcm /= ntrcaerm )
then
3658 print *,
'ERROR in # of gocart aer species',kcm
3660 errmsg =
'ERROR(gocart_init): Incorrect # of species'
3666 if ( .not.
allocated( extrhi_grt ) )
then
3667 allocate ( extrhi_grt( kcm1,nswlwbd) )
3668 allocate ( extrhi_grt_550( kcm1,1) )
3669 allocate ( scarhi_grt( kcm1,nswlwbd) )
3670 allocate ( ssarhi_grt( kcm1,nswlwbd) )
3671 allocate ( asyrhi_grt( kcm1,nswlwbd) )
3672 allocate ( extrhd_grt(krhlev,kcm2,nswlwbd) )
3673 allocate ( extrhd_grt_550(krhlev,kcm2,1) )
3674 allocate ( scarhd_grt(krhlev,kcm2,nswlwbd) )
3675 allocate ( ssarhd_grt(krhlev,kcm2,nswlwbd) )
3676 allocate ( asyrhd_grt(krhlev,kcm2,nswlwbd) )
3689 iendwv(i) = int(10000. / wavelength(i))
3693 iendwv_du(i) = int(10000. / wavelength_du(i))
3701 solbnd_du(:)= f_zero
3704 solwaer(i,j) = f_zero
3707 solwaer_du(i,j) = f_zero
3712 mb = ib + nswstr - 1
3715 iw1 = nint(wvnsw1(mb))
3716 iw2 = nint(wvnsw2(mb))
3718 if ( wvnsw2(mb)>=wvn550 .and. wvn550>=wvnsw1(mb) )
then
3723 do while ( iw1 > iendwv(ii) )
3724 if ( ii == kaerbndd )
exit
3731 do while ( iw1 > iendwv_du(iix) )
3732 if ( iix == kaerbndi )
exit
3740 solbnd(ib) = solbnd(ib) + solfwv(iw)
3741 sumsol = sumsol + solfwv(iw)
3743 if ( iw == iendwv(ii) )
then
3744 solwaer(ib,ii) = sumsol
3745 if ( ii < kaerbndd )
then
3752 solbnd_du(ib) = solbnd_du(ib) + solfwv(iw)
3753 sumsol_du = sumsol_du + solfwv(iw)
3755 if ( iw == iendwv_du(iix) )
then
3756 solwaer_du(ib,iix) = sumsol_du
3757 if ( iix < kaerbndi )
then
3764 if ( iw2 /= iendwv(ii) )
then
3765 solwaer(ib,ii) = sumsol
3767 if ( iw2 /= iendwv_du(iix) )
then
3768 solwaer_du(ib,iix) = sumsol_du
3781 eirbnd_du(:) = f_zero
3784 eirwaer(i,j) = f_zero
3787 eirwaer_du(i,j) = f_zero
3794 if ( nlwbnd == 1 )
then
3798 mb = ib + nlwstr - 1
3799 iw1 = nint(wvnlw1(mb))
3800 iw2 = nint(wvnlw2(mb))
3804 do while ( iw1 > iendwv(ii) )
3805 if ( ii == kaerbndd )
exit
3812 do while ( iw1 > iendwv_du(iix) )
3813 if ( iix == kaerbndi )
exit
3821 eirbnd(ib) = eirbnd(ib) + eirfwv(iw)
3822 sumir = sumir + eirfwv(iw)
3824 if ( iw == iendwv(ii) )
then
3825 eirwaer(ib,ii) = sumir
3827 if ( ii < kaerbndd )
then
3834 eirbnd_du(ib) = eirbnd_du(ib) + eirfwv(iw)
3835 sumir_du = sumir_du + eirfwv(iw)
3837 if ( iw == iendwv_du(iix) )
then
3838 eirwaer_du(ib,iix) = sumir_du
3840 if ( iix < kaerbndi )
then
3847 if ( iw2 /= iendwv(ii) )
then
3848 eirwaer(ib,ii) = sumir
3850 if ( iw2 /= iendwv_du(iix) )
then
3851 eirwaer_du(ib,iix) = sumir_du
3916 subroutine rd_gocart_luts
3955 integer :: iradius, ik, ibeg
3956 integer,
parameter :: numspc = 5
3959 real,
dimension(kaerbndd) :: lambda
3960 real,
dimension(kaerbndi) :: lambda_du
3961 real,
dimension(krhlev) :: rh
3962 real,
dimension(kaerbndd,krhlev,numspc) :: bext
3963 real,
dimension(kaerbndd,krhlev,numspc) :: bsca
3964 real,
dimension(kaerbndd,krhlev,numspc) :: g
3965 real,
dimension(kaerbndi,krhlev,numspc) :: bext_du
3966 real,
dimension(kaerbndi,krhlev,numspc) :: bsca_du
3967 real,
dimension(kaerbndi,krhlev,numspc) :: g_du
3969 logical :: file_exist
3970 character*50 :: fin, dummy
3973 fin=
'optics_'//gridcomp(1)//
'.dat'
3974 inquire (file=trim(fin), exist=file_exist)
3975 if ( file_exist )
then
3977 open (unit=niaercm, file=fin, status=
'OLD')
3981 errmsg =
'ERROR(rd_gocart_luts): Requested luts file '// &
3982 & trim(fin)//
' not found'
3988 read(niaercm,
'(a40)') dummy
3989 read(niaercm,*) (lambda_du(i), i=1, kaerbndi)
3991 read(niaercm,
'(a40)') dummy
3992 read(niaercm,*) (rh(i), i=1, krhlev)
3995 read(niaercm,
'(a40)') dummy
3997 read(niaercm,*) (bext_du(i,j,k), i=1,kaerbndi)
4002 read(niaercm,
'(a40)') dummy
4004 read(niaercm,*) (bsca_du(i,j,k), i=1, kaerbndi)
4009 read(niaercm,
'(a40)') dummy
4011 read(niaercm,*) (g_du(i,j,k), i=1, kaerbndi)
4018 wavelength_du(j) = 1.e6 * lambda_du(i)
4019 if (int(wavelength_du(j)*100) == 55)
then
4025 ii = kaerbndi -i + 1
4026 rhidext0_grt(ii,k) = bext_du(i,1,k)
4027 rhidsca0_grt(ii,k) = bsca_du(i,1,k)
4028 if ( bext_du(i,1,k) /= f_zero)
then
4029 rhidssa0_grt(ii,k) = bsca_du(i,1,k)/bext_du(i,1,k)
4031 rhidssa0_grt(ii,k) = f_one
4033 rhidasy0_grt(ii,k) = g_du(i,1,k)
4039 fin=
'optics_'//gridcomp(ib)//
'.dat'
4040 inquire (file=trim(fin), exist=file_exist)
4041 if ( file_exist )
then
4043 open (unit=niaercm, file=fin, status=
'OLD')
4047 errmsg =
'ERROR(rd_gocart_luts): Requested luts file '// &
4048 & trim(fin)//
' not found'
4052 ibeg = radius_lower(ib) - kcm1
4053 iradius = num_radius(ib)
4056 read(niaercm,
'(a40)') dummy
4057 read(niaercm,*) (lambda(i), i=1, kaerbndd)
4059 read(niaercm,
'(a40)') dummy
4060 read(niaercm,*) (rh(i), i=1, krhlev)
4063 read(niaercm,
'(a40)') dummy
4065 read(niaercm,*) (bext(i,j,k), i=1,kaerbndd)
4070 read(niaercm,
'(a40)') dummy
4072 read(niaercm,*) (bsca(i,j,k), i=1, kaerbndd)
4077 read(niaercm,
'(a40)') dummy
4079 read(niaercm,*) (g(i,j,k), i=1, kaerbndd)
4086 wavelength(j) = 1.e6 * lambda(i)
4087 if (int(wavelength(j)*100) == 55)
then
4094 ii = kaerbndd -i + 1
4096 rhdpext0_grt(ii,j,ik) = bext(i,j,k)
4097 rhdpsca0_grt(ii,j,ik) = bsca(i,j,k)
4098 if ( bext(i,j,k) /= f_zero)
then
4099 rhdpssa0_grt(ii,j,ik) = bsca(i,j,k)/bext(i,j,k)
4101 rhdpssa0_grt(ii,j,ik) = f_one
4103 rhdpasy0_grt(ii,j,ik) = g(i,j,k)
4111 end subroutine rd_gocart_luts
4119 subroutine optavg_gocart
4175 real (kind=kind_phys) :: sumk, sums, sumok, sumokg, sumreft, &
4176 & sp, refb, reft, rsolbd, rirbd
4178 integer :: ib, nb, ni, nh, nc
4186 rsolbd = f_one / solbnd_du(nb)
4194 do ni = nv1_du(nb), nv2_du(nb)
4195 sp = sqrt( (f_one - rhidssa0_grt(ni,nc)) &
4196 & / (f_one - rhidssa0_grt(ni,nc)*rhidasy0_grt(ni,nc)) )
4197 reft = (f_one - sp) / (f_one + sp)
4198 sumreft = sumreft + reft*solwaer_du(nb,ni)
4200 sumk = sumk + rhidext0_grt(ni,nc)*solwaer_du(nb,ni)
4201 sums = sums + rhidsca0_grt(ni,nc)*solwaer_du(nb,ni)
4202 sumok = sumok + rhidssa0_grt(ni,nc)*solwaer_du(nb,ni) &
4203 & * rhidext0_grt(ni,nc)
4204 sumokg = sumokg + rhidssa0_grt(ni,nc)*solwaer_du(nb,ni) &
4205 & * rhidext0_grt(ni,nc)*rhidasy0_grt(ni,nc)
4208 refb = sumreft * rsolbd
4210 extrhi_grt(nc,nb) = sumk * rsolbd
4211 if (nb==nv_aod)
then
4212 extrhi_grt_550(nc,1) = rhidext0_grt(id550,nc)
4214 scarhi_grt(nc,nb) = sums * rsolbd
4215 asyrhi_grt(nc,nb) = sumokg / (sumok + 1.0e-10)
4216 ssarhi_grt(nc,nb) = 4.0*refb &
4217 & / ( (f_one+refb)**2 - asyrhi_grt(nc,nb)*(f_one-refb)**2 )
4220 rsolbd = f_one / solbnd(nb)
4229 do ni = nv1(nb), nv2(nb)
4230 sp = sqrt( (f_one - rhdpssa0_grt(ni,nh,nc)) &
4231 & /(f_one-rhdpssa0_grt(ni,nh,nc)*rhdpasy0_grt(ni,nh,nc)))
4232 reft = (f_one - sp) / (f_one + sp)
4233 sumreft = sumreft + reft*solwaer(nb,ni)
4235 sumk = sumk + rhdpext0_grt(ni,nh,nc)*solwaer(nb,ni)
4236 sums = sums + rhdpsca0_grt(ni,nh,nc)*solwaer(nb,ni)
4237 sumok = sumok + rhdpssa0_grt(ni,nh,nc)*solwaer(nb,ni) &
4238 & * rhdpext0_grt(ni,nh,nc)
4239 sumokg = sumokg + rhdpssa0_grt(ni,nh,nc)*solwaer(nb,ni)&
4240 & * rhdpext0_grt(ni,nh,nc)*rhdpasy0_grt(ni,nh,nc)
4243 refb = sumreft * rsolbd
4245 extrhd_grt(nh,nc,nb) = sumk * rsolbd
4246 if (nb==nv_aod)
then
4247 extrhd_grt_550(nh,nc,1) = rhdpext0_grt(i550,nh,nc)
4249 scarhd_grt(nh,nc,nb) = sums * rsolbd
4250 asyrhd_grt(nh,nc,nb) = sumokg / (sumok + 1.0e-10)
4251 ssarhd_grt(nh,nc,nb) = 4.0*refb &
4252 & /((f_one+refb)**2 - asyrhd_grt(nh,nc,nb)*(f_one-refb)**2)
4268 rirbd = f_one / eirbnd_du(nb)
4276 do ni = nr1_du(nb), nr2_du(nb)
4277 sp = sqrt( (f_one - rhidssa0_grt(ni,nc)) &
4278 & / (f_one - rhidssa0_grt(ni,nc)*rhidasy0_grt(ni,nc)) )
4279 reft = (f_one - sp) / (f_one + sp)
4280 sumreft = sumreft + reft*eirwaer_du(nb,ni)
4282 sumk = sumk + rhidext0_grt(ni,nc)*eirwaer_du(nb,ni)
4283 sums = sums + rhidsca0_grt(ni,nc)*eirwaer_du(nb,ni)
4284 sumok = sumok + rhidssa0_grt(ni,nc)*eirwaer_du(nb,ni) &
4285 & * rhidext0_grt(ni,nc)
4286 sumokg = sumokg + rhidssa0_grt(ni,nc)*eirwaer_du(nb,ni) &
4287 & * rhidext0_grt(ni,nc)*rhidasy0_grt(ni,nc)
4290 refb = sumreft * rirbd
4292 extrhi_grt(nc,ib) = sumk * rirbd
4293 scarhi_grt(nc,ib) = sums * rirbd
4294 asyrhi_grt(nc,ib) = sumokg / (sumok + 1.0e-10)
4295 ssarhi_grt(nc,ib) = 4.0*refb &
4296 & / ( (f_one+refb)**2 - asyrhi_grt(nc,ib)*(f_one-refb)**2 )
4300 rirbd = f_one / eirbnd(nb)
4309 do ni = nr1(nb), nr2(nb)
4310 sp = sqrt( (f_one - rhdpssa0_grt(ni,nh,nc)) &
4311 & /(f_one-rhdpssa0_grt(ni,nh,nc)*rhdpasy0_grt(ni,nh,nc)))
4312 reft = (f_one - sp) / (f_one + sp)
4313 sumreft = sumreft + reft*eirwaer(nb,ni)
4315 sumk = sumk + rhdpext0_grt(ni,nh,nc)*eirwaer(nb,ni)
4316 sums = sums + rhdpsca0_grt(ni,nh,nc)*eirwaer(nb,ni)
4317 sumok = sumok + rhdpssa0_grt(ni,nh,nc)*eirwaer(nb,ni) &
4318 & * rhdpext0_grt(ni,nh,nc)
4319 sumokg = sumokg+ rhdpssa0_grt(ni,nh,nc)*eirwaer(nb,ni) &
4320 & * rhdpext0_grt(ni,nh,nc)*rhdpasy0_grt(ni,nh,nc)
4323 refb = sumreft * rirbd
4325 extrhd_grt(nh,nc,ib) = sumk * rirbd
4326 scarhd_grt(nh,nc,ib) = sums * rirbd
4327 asyrhd_grt(nh,nc,ib) = sumokg / (sumok + 1.0e-10)
4328 ssarhd_grt(nh,nc,ib) = 4.0*refb &
4329 & /((f_one+refb)**2 - asyrhd_grt(nh,nc,ib)*(f_one-refb)**2)
4337 end subroutine optavg_gocart
4341 end subroutine gocart_aerinit
4372 subroutine aer_property_gocart &
4376 & ( prsi,prsl,prslk,tvly,rhlay,dz,hz,tracer,aerfld, &
4377 & alon,alat,slmsk, laersw,laerlw,con_rd, &
4380 & aerosw,aerolw,aerodp,ext550,errflg,errmsg &
4433 integer,
intent(in) :: imax, nlay, nlp1
4434 logical,
intent(in) :: laersw, laerlw
4435 real (kind=kind_phys),
intent(in) :: con_rd
4436 real (kind=kind_phys),
dimension(:,:),
intent(in) :: prsi, prsl, &
4437 & prslk, tvly, rhlay, dz, hz
4438 real (kind=kind_phys),
dimension(:),
intent(in) :: alon, alat, &
4440 real (kind=kind_phys),
dimension(:,:,:),
intent(in):: tracer
4441 real (kind=kind_phys),
dimension(:,:,:),
intent(in):: aerfld
4444 real (kind=kind_phys),
dimension(:,:,:,:),
intent(out) :: &
4446 real (kind=kind_phys),
dimension(:,:) ,
intent(out) :: aerodp
4447 real (kind=kind_phys),
dimension(:,:) ,
intent(out) :: ext550
4448 integer,
intent(out) :: errflg
4449 character(len=*),
intent(out) :: errmsg
4452 real (kind=kind_phys),
dimension(nlay,nswlwbd):: tauae,ssaae,asyae
4453 real (kind=kind_phys),
dimension(nlay,1):: tauae_550
4454 real (kind=kind_phys),
dimension(nlay,nspc) :: spcodp
4456 real (kind=kind_phys),
dimension(nlay,kcm) :: aerms
4457 real (kind=kind_phys),
dimension(nlay) :: dz1, rh1
4458 real (kind=kind_phys) :: plv, tv, rho
4459 integer :: i, m, m1, k
4469 lab_do_imaxg :
do i = 1, imax
4476 tauae_550(k,1) = f_zero
4492 spcodp(k,m) = f_zero
4498 dz1(k) = 1000.*dz(i,k)
4499 plv = 100.*prsl(i,k)
4501 rho = plv / ( con_rd * tv)
4504 aerms(k,m) = aerfld(i,k,m)*rho
4523 aerosw(i,k,m,1) = tauae(k,m)
4524 aerosw(i,k,m,2) = ssaae(k,m)
4525 aerosw(i,k,m,3) = asyae(k,m)
4531 aerodp(i,1) = aerodp(i,1) + tauae_550(k,1)
4532 ext550(i,k) = tauae_550(k,1)
4534 aerodp(i,m+1) = aerodp(i,m+1)+spcodp(k,m)
4542 if ( nlwbnd == 1 )
then
4546 aerolw(i,k,m,1) = tauae(k,m1)
4547 aerolw(i,k,m,2) = ssaae(k,m1)
4548 aerolw(i,k,m,3) = asyae(k,m1)
4555 aerolw(i,k,m,1) = tauae(k,m1)
4556 aerolw(i,k,m,2) = ssaae(k,m1)
4557 aerolw(i,k,m,3) = asyae(k,m1)
4602 real (kind=kind_phys) :: drh0, drh1, rdrh
4603 real (kind=kind_phys) :: cm, ext01, ext01_550, sca01,asy01,ssa01
4604 real (kind=kind_phys) :: ext1, ext1_550, asy1, ssa1,sca1,tau_550
4605 real (kind=kind_phys) :: sum_tau,sum_asy,sum_ssa,tau,asy,ssa
4606 real (kind=kind_phys) :: sum_tau_550
4607 integer :: ih1, ih2, nbin, ib, ntrc, ktrc
4611 do while ( rh1(k) > rhlev_grt(ih2) )
4613 if ( ih2 > krhlev )
exit
4615 ih1 = max( 1, ih2-1 )
4616 ih2 = min( krhlev, ih2 )
4618 drh0 = rhlev_grt(ih2) - rhlev_grt(ih1)
4619 drh1 = rh1(k) - rhlev_grt(ih1)
4620 if ( ih1 == ih2 )
then
4630 if (ib == nv_aod )
then
4631 sum_tau_550 = f_zero
4645 cm = max(aerms(k,m),0.0) * dz1(k)
4646 ext1 = ext1 + cm*extrhi_grt(m,ib)
4647 if (ib == nv_aod)
then
4648 ext1_550 = ext1_550 + cm*extrhi_grt_550(m,1)
4650 sca1 = sca1 + cm*scarhi_grt(m,ib)
4651 ssa1 = ssa1 + cm*extrhi_grt(m,ib) * ssarhi_grt(m,ib)
4652 asy1 = asy1 + cm*scarhi_grt(m,ib) * asyrhi_grt(m,ib)
4655 if (ext1 > f_zero) ssa=min(f_one, ssa1/ext1)
4656 if (sca1 > f_zero) asy=min(f_one, asy1/sca1)
4659 if ( ib==nv_aod )
then
4661 spcodp(k,1) = tau_550
4662 sum_tau_550 = sum_tau_550 + tau_550
4665 sum_tau = sum_tau + tau
4666 sum_ssa = sum_ssa + tau * ssa
4667 sum_asy = sum_asy + tau * ssa * asy
4672 if ( ib==nv_aod )
then
4678 ktrc = trc_to_aod(ntrc)
4679 do nbin = 1, num_radius(ntrc)
4680 m1 = radius_lower(ntrc) + nbin - 1
4681 m = m1 - num_radius(1)
4682 cm = max(aerms(k,m1),0.0) * dz1(k)
4683 ext01 = extrhd_grt(ih1,m,ib) + &
4684 & rdrh * (extrhd_grt(ih2,m,ib)-extrhd_grt(ih1,m,ib))
4685 if ( ib==nv_aod )
then
4686 ext01_550 = extrhd_grt_550(ih1,m,1) + &
4687 & rdrh * (extrhd_grt_550(ih2,m,1)-extrhd_grt_550(ih1,m,1))
4689 sca01 = scarhd_grt(ih1,m,ib) + &
4690 & rdrh * (scarhd_grt(ih2,m,ib)-scarhd_grt(ih1,m,ib))
4691 ssa01 = ssarhd_grt(ih1,m,ib) + &
4692 & rdrh * (ssarhd_grt(ih2,m,ib)-ssarhd_grt(ih1,m,ib))
4693 asy01 = asyrhd_grt(ih1,m,ib) + &
4694 & rdrh * (asyrhd_grt(ih2,m,ib)-asyrhd_grt(ih1,m,ib))
4695 ext1 = ext1 + cm*ext01
4696 if ( ib==nv_aod )
then
4697 ext1_550 = ext1_550 + cm*ext01_550
4699 sca1 = sca1 + cm*sca01
4700 ssa1 = ssa1 + cm*ext01 * ssa01
4701 asy1 = asy1 + cm*sca01 * asy01
4704 if (ext1 > f_zero) ssa=min(f_one, ssa1/ext1)
4705 if (sca1 > f_zero) asy=min(f_one, asy1/sca1)
4707 if ( ib==nv_aod )
then
4709 spcodp(k,ktrc) = tau_550
4710 sum_tau_550 = sum_tau_550 + tau_550
4713 sum_tau = sum_tau + tau
4714 sum_ssa = sum_ssa + tau * ssa
4715 sum_asy = sum_asy + tau * ssa * asy
4719 tauae(k,ib) = sum_tau
4720 if ( ib==nv_aod )
then
4721 tauae_550(k,1) = sum_tau_550
4723 if (sum_tau > f_zero) ssaae(k,ib) = sum_ssa / sum_tau
4724 if (sum_ssa > f_zero) asyae(k,ib) = sum_asy / sum_ssa
4729 end subroutine aeropt
4733 end subroutine aer_property_gocart
this module defines fortran unit numbers for input/output data files for the ncep gfs model.
This module contains climatological atmospheric aerosol schemes for radiation computations.
This module contains LW band parameters set up.
This module is for specifying the band structures and program parameters used by the RRTMG-SW scheme.