14 #include "macro_thermodyn.h" 27 mwwat => const_mvap, &
28 dnwat => const_dwatr, &
32 stdatmpa => const_pstd, &
33 stdtemp => const_tem00, &
55 integer,
private :: QA_AE = 0
72 integer,
parameter :: gas_ctg = 2
73 integer,
parameter :: n_atr = 5
74 integer,
allocatable :: nkap(:)
75 integer,
allocatable :: nsiz(:)
80 integer,
parameter :: ic_mix = 1
81 integer,
parameter :: ic_sea = 2
82 integer,
parameter :: ic_dus = 3
84 integer,
parameter :: ig_h2so4 = 1
85 integer,
parameter :: ig_cgas = 2
98 real(RP),
parameter :: avo = 6.0221367e23_rp
99 real(RP),
parameter :: boltz = 1.38048e-23_rp
100 real(RP),
parameter :: conv_n2m = 1.e6_rp/avo*1.e6_rp &
102 real(RP),
parameter :: conv_m2n = 1._rp/conv_n2m
103 real(RP),
parameter :: rhod_ae = 1.83_rp
104 real(RP),
parameter :: rho_kg = rhod_ae*1.e3_rp
105 real(RP),
parameter :: grav = 9.80622_rp
106 real(RP),
parameter :: conv_ms_vl = 1.e-12_rp/rhod_ae
107 real(RP),
parameter :: conv_vl_ms = rhod_ae/1.e-12_rp
108 real(RP),
parameter :: mwrat_s6 = 96._rp/98._rp
109 real(RP),
parameter :: mwrat_s6_i = 1._rp/mwrat_s6
110 real(RP),
parameter :: diffsulf = 9.36e-6_rp
111 real(RP),
parameter :: mwh2so4 = 98._rp
112 real(RP) :: logk_aenucl = -12.4_rp
117 real(RP),
parameter :: c1=1.425e-6_rp, c2=0.5039_rp, c3=108.3_rp
119 integer :: nbins_out = 1024
123 integer,
parameter :: ia_m0 = 1
124 integer,
parameter :: ia_m2 = 2
125 integer,
parameter :: ia_m3 = 3
126 integer,
parameter :: ia_ms = 4
127 integer,
parameter :: ia_kp = 5
128 integer,
parameter :: ik_out = 1
131 integer,
allocatable :: n_siz(:)
132 real(RP),
allocatable :: d_min(:)
133 real(RP),
allocatable :: d_max(:)
134 integer,
allocatable :: n_kap(:)
135 real(RP),
allocatable :: k_min(:)
136 real(RP),
allocatable :: k_max(:)
140 real(RP),
allocatable :: d_lw(:,:), d_ct(:,:), d_up(:,:)
141 real(RP),
allocatable :: k_lw(:,:), k_ct(:,:), k_up(:,:)
142 real(RP) :: dlogd, dk
146 integer,
allocatable :: is_i(:), is_j(:), is_k(:)
147 integer,
allocatable :: ik_i(:), ik_j(:), ik_k(:)
148 integer,
allocatable :: ic_i(:), ic_j(:), ic_k(:)
150 integer :: is1, is2, mc, ik, is0, ic, ia0
152 logical :: flag_npf = .false.
153 logical :: flag_cond = .true.
154 logical :: flag_coag = .true.
155 logical :: flag_ccn_interactive = .true.
156 logical :: flag_regeneration = .true.
160 real(RP) :: h2so4dt = 5.e-6_rp
161 real(RP) :: ocgasdt = 8.e-5_rp
163 real(RP) :: c_kappa = 0.3_rp
164 real(RP) :: t_npf = 21600.0_rp
169 integer,
allocatable :: it_procs2trans(:,:,:,:)
170 integer,
allocatable :: ia_trans2procs(:)
171 integer,
allocatable :: is_trans2procs(:)
172 integer,
allocatable :: ik_trans2procs(:)
173 integer,
allocatable :: ic_trans2procs(:)
174 real(RP),
allocatable :: rnum_out(:)
175 real(RP) :: dg_reg = 5.e-7_rp
176 real(RP) :: sg_reg = 1.6_rp
178 character(len=H_SHORT),
allocatable :: ctg_name(:)
179 real(RP),
parameter :: cleannumber = 1.e-3
194 character(len=*),
intent(in) :: ae_type
195 integer,
intent(out) :: qa
196 integer,
intent(out) :: qs
198 integer,
allocatable :: aero_idx(:,:,:,:)
199 integer :: n_kap_max, n_siz_max, ncat_max
200 integer :: nasiz(3), nakap(3)
201 character(len=H_SHORT) :: attribute, catego, aunit
203 namelist / param_tracer_kajino13 / &
208 integer :: m, ierr, ik, ic, ia0, is0
213 if(
io_l )
write(
io_fid_log,*)
'++++++ Module[Aerosol Tracer] / Categ[ATMOS PHYSICS] / Origin[SCALElib]' 214 if(
io_l )
write(
io_fid_log,*)
'*** Tracers for Kajino(2013) scheme' 216 if ( ae_type /=
'KAJINO13' .AND. ae_type /=
'NONE' )
then 217 write(*,*)
'xxx ATMOS_PHY_AE_TYPE is not KAJINO13. Check!' 221 ncat_max = max( ic_mix, ic_sea, ic_dus )
227 read(
io_fid_conf,nml=param_tracer_kajino13,iostat=ierr)
230 if(
io_l )
write(
io_fid_log,*)
'*** Not found namelist. Default used.' 231 elseif( ierr > 0 )
then 232 write(*,*)
'xxx Not appropriate names in namelist PARAM_TRACER_KAJINO13, Check!' 238 if( ae_ctg > ncat_max )
then 239 write(*,*)
'xxx AE_CTG should be smaller than', ncat_max+1,
'stop' 243 allocate( nsiz(ae_ctg) )
244 allocate( nkap(ae_ctg) )
246 nkap(1:ae_ctg) = nakap(1:ae_ctg)
247 nsiz(1:ae_ctg) = nasiz(1:ae_ctg)
249 if( maxval( nkap ) /= 1 .OR. minval( nkap ) /= 1 )
then 250 write(*,*)
'xxx NKAP(:) /= 1 is not supported now, Stop!' 258 qa_ae = qa_ae + n_atr
262 qa_ae = qa_ae + gas_ctg
271 n_siz_max = max(n_siz_max, nsiz(ic))
272 n_kap_max = max(n_kap_max, nkap(ic))
275 allocate( aero_idx(n_atr,ae_ctg,n_kap_max,n_siz_max) )
283 aero_idx(ia0,ic,ik,is0) = m
294 ic = qa_ae-gas_ctg+ig_h2so4
296 ic = qa_ae-gas_ctg+ig_cgas
321 write(attribute,
'(a)')
"Number" 322 write(aunit,
'(a)')
"num/kg" 323 elseif( ia0 == 2 )
then 324 write(attribute,
'(a)')
"Section" 325 write(aunit,
'(a)')
"m2/kg" 326 elseif( ia0 == 3 )
then 327 write(attribute,
'(a)')
"Volume" 328 write(aunit,
'(a)')
"m3/kg" 329 elseif( ia0 == 4 )
then 330 write(attribute,
'(a)')
"Mass" 331 write(aunit,
'(a)')
"kg/kg" 332 elseif( ia0 == 5 )
then 333 write(attribute,
'(a)')
"kXm" 334 write(aunit,
'(a)')
"kg/kg" 336 if( ic == ic_mix )
then 337 write(catego,
'(a)')
"Sulf_" 338 elseif( ic == ic_sea )
then 339 write(catego,
'(a)')
"Salt_" 340 elseif( ic == ic_dus )
then 341 write(catego,
'(a)')
"Dust_" 345 write(
atmos_phy_ae_kajino13_desc(aero_idx(ia0,ic,ik,is0)),
'(a,a,a,i0)') trim(attribute),
' mixing radio of ', trim(catego), is0
350 ic = qa_ae-gas_ctg+ig_h2so4
352 ic = qa_ae-gas_ctg+ig_cgas
355 ic = qa_ae-gas_ctg+ig_h2so4
357 ic = qa_ae-gas_ctg+ig_cgas
370 qaee = qs + qa_ae - 1
384 real(RP),
allocatable :: d_min_inp(:)
385 real(RP),
allocatable :: d_max_inp(:)
386 real(RP),
allocatable :: k_min_inp(:)
387 real(RP),
allocatable :: k_max_inp(:)
388 integer ,
allocatable :: n_kap_inp(:)
390 real(RP),
parameter :: d_min_def = 1.e-9_rp
391 real(RP),
parameter :: d_max_def = 1.e-5_rp
392 integer ,
parameter :: n_kap_def = 1
393 real(RP),
parameter :: k_min_def = 0.e0_rp
394 real(RP),
parameter :: k_max_def = 1.e0_rp
396 namelist / param_atmos_phy_ae_kajino13 / &
410 flag_ccn_interactive, &
421 if(
io_l )
write(
io_fid_log,*)
'++++++ Module[Aerosol] / Categ[ATMOS PHYSICS] / Origin[SCALElib]' 432 allocate( rnum_out(nbins_out) )
433 allocate( n_siz(n_ctg) )
434 allocate( d_min(n_ctg) )
435 allocate( d_max(n_ctg) )
436 allocate( n_kap(n_ctg) )
437 allocate( k_min(n_ctg) )
438 allocate( k_max(n_ctg) )
439 allocate( d_min_inp(n_ctg) )
440 allocate( d_max_inp(n_ctg) )
441 allocate( n_kap_inp(n_ctg) )
442 allocate( k_min_inp(n_ctg) )
443 allocate( k_max_inp(n_ctg) )
444 allocate( ctg_name(n_ctg) )
446 n_siz(1:n_ctg) = nsiz(1:n_ctg)
447 d_min(1:n_ctg) = d_min_def
448 d_max(1:n_ctg) = d_max_def
449 n_kap(1:n_ctg) = n_kap_def
450 k_min(1:n_ctg) = k_min_def
451 k_max(1:n_ctg) = k_max_def
454 if( n_ctg == 1 )
then 455 write(ctg_name(it),
'(a)')
"Sulfate" 456 elseif( n_ctg == 2 )
then 457 write(ctg_name(it),
'(a)')
"Seasalt" 458 elseif( n_ctg == 3 )
then 459 write(ctg_name(it),
'(a)')
"Dust" 465 read(
io_fid_conf,nml=param_atmos_phy_ae_kajino13,iostat=ierr)
467 if(
io_l )
write(
io_fid_log,*)
'*** Not found namelist. Default used.' 468 elseif( ierr > 0 )
then 469 write(*,*)
'xxx Not appropriate names in namelist PARAM_ATMOS_PHY_AE_KAJINO13. Check!' 487 n_trans = n_trans + n_siz(ic) * n_kap(ic) * n_atr
488 n_siz_max = max(n_siz_max, n_siz(ic))
489 n_kap_max = max(n_kap_max, n_kap(ic))
493 allocate(d_lw(n_siz_max,n_ctg))
494 allocate(d_ct(n_siz_max,n_ctg))
495 allocate(d_up(n_siz_max,n_ctg))
496 allocate(k_lw(n_kap_max,n_ctg))
497 allocate(k_ct(n_kap_max,n_ctg))
498 allocate(k_up(n_kap_max,n_ctg))
507 dlogd = (log(d_max(ic)) - log(d_min(ic)))/
float(n_siz(ic))
508 do is0 = 1, n_siz(ic)
509 d_lw(is0,ic) = exp(log(d_min(ic))+dlogd*
float(is0-1) )
510 d_ct(is0,ic) = exp(log(d_min(ic))+dlogd*(
float(is0)-0.5_rp))
511 d_up(is0,ic) = exp(log(d_min(ic))+dlogd*
float(is0) )
514 dk = (k_max(ic) - k_min(ic))/
float(n_kap(ic))
516 k_lw(ik,ic) = k_min(ic) + dk *
float(ik-1)
517 k_ct(ik,ic) = k_min(ic) + dk *(
float(ik)-0.5_rp)
518 k_up(ik,ic) = k_min(ic) + dk *
float(ik)
524 do is0 = 1, n_siz(ic_mix)
525 if (dg_reg >= d_lw(is0,ic_mix) .AND. &
526 dg_reg < d_up(is0,ic_mix) )
then 538 do is2 = 1, n_siz(ic)
539 do is1 = 1, n_siz(ic)
540 if ( d_ct(is2,ic) >= d_ct(is1,ic) )
then 548 allocate(is_i(mcomb))
549 allocate(is_j(mcomb))
550 allocate(is_k(mcomb))
551 allocate(ik_i(mcomb))
552 allocate(ik_j(mcomb))
553 allocate(ik_k(mcomb))
554 allocate(ic_i(mcomb))
555 allocate(ic_j(mcomb))
556 allocate(ic_k(mcomb))
561 do is2 = 1, n_siz(ic)
562 do is1 = 1, n_siz(ic)
563 if ( d_ct(is2,ic) >= d_ct(is1,ic) )
then 584 allocate( it_procs2trans(n_atr,n_siz_max,n_kap_max,n_ctg) )
585 allocate( ia_trans2procs(n_trans) )
586 allocate( is_trans2procs(n_trans) )
587 allocate( ik_trans2procs(n_trans) )
588 allocate( ic_trans2procs(n_trans) )
590 it_procs2trans(:,:,:,:)= -999
591 ia_trans2procs(:) = 0
592 is_trans2procs(:) = 0
593 ik_trans2procs(:) = 0
594 ic_trans2procs(:) = 0
600 do is0 = 1, n_siz(ic)
603 it_procs2trans(ia0,is0,ik,ic)= it
604 ia_trans2procs(it) = ia0
605 is_trans2procs(it) = is0
606 ik_trans2procs(it) = ik
607 ic_trans2procs(it) = ic
644 pres2qsat_liq => atmos_saturation_pres2qsat_liq
650 integer,
intent(in) :: qqa
651 real(RP),
intent(inout) :: dens(
ka,
ia,
ja)
652 real(RP),
intent(inout) :: momz(
ka,
ia,
ja)
653 real(RP),
intent(inout) :: momx(
ka,
ia,
ja)
654 real(RP),
intent(inout) :: momy(
ka,
ia,
ja)
655 real(RP),
intent(inout) :: rhot(
ka,
ia,
ja)
656 real(RP),
intent(inout) :: emit(
ka,
ia,
ja,qqa)
657 real(RP),
intent(in) :: nreg(
ka,
ia,
ja)
658 real(RP),
intent(inout) :: qtrc(
ka,
ia,
ja,
qa)
659 real(RP),
intent(out) :: cn(
ka,
ia,
ja)
660 real(RP),
intent(out) :: ccn(
ka,
ia,
ja)
661 real(RP),
intent(inout) :: rhoq_t_ae(
ka,
ia,
ja,
qa)
667 real(RP) :: pres_ae(
ka,
ia,
ja)
668 real(RP) :: temp_ae(
ka,
ia,
ja)
669 real(RP) :: qv_ae(
ka,
ia,
ja)
670 real(RP) :: ssliq_ae(
ka,
ia,
ja)
673 real(RP) :: qdry(
ka,
ia,
ja)
674 real(RP) :: rrhog(
ka,
ia,
ja)
677 real(RP) :: t_ccn, t_cn
680 real(RP) :: m0_reg, m2_reg, m3_reg
682 real(RP) :: reg_factor_m2,reg_factor_m3
684 real(RP),
allocatable :: aerosol_procs(:,:,:,:)
685 real(RP),
allocatable :: aerosol_activ(:,:,:,:)
686 real(RP),
allocatable :: emis_procs(:,:,:,:)
687 real(RP),
allocatable :: emis_gas(:)
688 real(RP) :: total_aerosol_mass(
ka,
ia,
ja,n_ctg)
689 real(RP) :: total_aerosol_number(
ka,
ia,
ja,n_ctg)
690 real(RP) :: total_emit_aerosol_mass(
ka,
ia,
ja,n_ctg)
691 real(RP) :: total_emit_aerosol_number(
ka,
ia,
ja,n_ctg)
695 real(RP) :: conc_gas(gas_ctg)
696 character(len=H_LONG) :: ofilename
697 integer :: i, j, k, iq, it
699 if(
io_l )
write(
io_fid_log,*)
'*** Atmos physics step: Aerosol(kajino13)' 707 do is0 = 1, n_siz(ic)
708 if (qtrc(k,i,j,qaes-1+it_procs2trans(ia_m0,is0,ik,ic)) < 0.0_rp .or. &
709 qtrc(k,i,j,qaes-1+it_procs2trans(ia_m2,is0,ik,ic)) < 0.0_rp .or. &
710 qtrc(k,i,j,qaes-1+it_procs2trans(ia_m3,is0,ik,ic)) < 0.0_rp .or. &
711 qtrc(k,i,j,qaes-1+it_procs2trans(ia_ms,is0,ik,ic)) < 0.0_rp .or. &
712 qtrc(k,i,j,qaes-1+it_procs2trans(ia_kp,is0,ik,ic)) < 0.0_rp )
then 713 qtrc(k,i,j,qaes-1+it_procs2trans(1:n_atr,is0,ik,ic)) = 0.0_rp
726 qtrc0(k,i,j,iq) = qtrc(k,i,j,iq)
732 allocate( aerosol_procs(n_atr,n_siz_max,n_kap_max,n_ctg) )
733 allocate( aerosol_activ(n_atr,n_siz_max,n_kap_max,n_ctg) )
734 allocate( emis_procs(n_atr,n_siz_max,n_kap_max,n_ctg) )
735 allocate( emis_gas(gas_ctg) )
737 reg_factor_m2 = dg_reg**2._rp * exp( 2.0_rp *(log(sg_reg)**2._rp))
738 reg_factor_m3 = dg_reg**3._rp * exp( 4.5_rp *(log(sg_reg)**2._rp))
742 aerosol_procs(:,:,:,:) = 0.0_rp
743 aerosol_activ(:,:,:,:) = 0.0_rp
744 emis_procs(:,:,:,:) = 0.0_rp
746 pres_ae(:,:,:) = 0.0_rp
747 temp_ae(:,:,:) = 0.0_rp
748 qv_ae(:,:,:) = 0.0_rp
754 rrhog(k,i,j) = 1.0_rp / dens(k,i,j)
755 th(k,i,j) = rhot(k,i,j) * rrhog(k,i,j)
758 calc_qdry( qdry(k,i,j), qtrc,
tracer_mass, k, i, j, iq )
761 calc_cv( cva(k,i,j), qdry(k,i,j), qtrc, k, i, j, iq,
const_cvdry,
tracer_cv )
764 calc_r( rmoist, qdry(k,i,j), qtrc, k, i, j, iq,
const_rdry,
tracer_r )
765 cpa(k,i,j) = cva(k,i,j) + rmoist
766 calc_pre( pres_ae(k,i,j), dens(k,i,j), th(k,i,j), rmoist, cpa(k,i,j),
const_pre00 )
767 temp_ae(k,i,j) = pres_ae(k,i,j) / ( dens(k,i,j) * rmoist )
769 qv_ae(k,i,j) = qtrc(k,i,j,
i_qv)
771 call pres2qsat_liq( qsat_tmp,temp_ae(k,i,j),pres_ae(k,i,j) )
772 ssliq_ae(k,i,j) = qv_ae(k,i,j)/qsat_tmp - 1.0_rp
774 ssliq_ae(k,i,j) = - 1.0_rp
787 do is0 = 1, n_siz(ic)
788 if (qtrc0(k,i,j,qaes-1+it_procs2trans(ia_m0,is0,ik,ic))*dens(k,i,j) < cleannumber)
then 790 qtrc0(k,i,j,qaes-1+it_procs2trans(ia0,is0,ik,ic)) = 0._rp
804 qtrc1(k,i,j,iq) = qtrc0(k,i,j,iq)
820 aerosol_procs(ia_trans2procs(it), &
821 is_trans2procs(it), &
822 ik_trans2procs(it), &
823 ic_trans2procs(it)) = qtrc1(k,i,j,qaes-1+it)*dens(k,i,j)
824 emis_procs(ia_trans2procs(it), &
825 is_trans2procs(it), &
826 ik_trans2procs(it), &
827 ic_trans2procs(it)) = emit(k,i,j,it)*dens(k,i,j)
830 conc_gas(1:gas_ctg) &
831 = qtrc1(k,i,j,qaee-gas_ctg+1:qaee-gas_ctg+gas_ctg)*dens(k,i,j)*1.e+9_rp
833 emis_gas(1:gas_ctg) = emit(k,i,j,qa_ae-gas_ctg+ig_h2so4:qa_ae-gas_ctg+ig_cgas)
840 flag_npf, flag_cond, flag_coag,&
848 if (flag_ccn_interactive)
then 849 do is0 = 1, n_siz(ic_mix)
851 aerosol_activ(ia0,is0,ik_out,ic_mix) = min(max(0._rp, aerosol_activ(ia0,is0,ik_out,ic_mix)), &
852 aerosol_procs(ia0,is0,ik_out,ic_mix) )
853 aerosol_procs(ia0,is0,ik_out,ic_mix) = &
854 aerosol_procs(ia0,is0,ik_out,ic_mix) - aerosol_activ(ia0,is0,ik_out,ic_mix)
861 if (flag_regeneration)
then 865 m2_reg = m0_reg * reg_factor_m2
866 m3_reg = m0_reg * reg_factor_m3
867 ms_reg = m3_reg * pi6 * conv_vl_ms
868 aerosol_procs(ia_m0,is0_reg,ik_out,ic_mix) = &
869 aerosol_procs(ia_m0,is0_reg,ik_out,ic_mix) + m0_reg
870 aerosol_procs(ia_m2,is0_reg,ik_out,ic_mix) = &
871 aerosol_procs(ia_m2,is0_reg,ik_out,ic_mix) + m2_reg
872 aerosol_procs(ia_m3,is0_reg,ik_out,ic_mix) = &
873 aerosol_procs(ia_m3,is0_reg,ik_out,ic_mix) + m3_reg
874 aerosol_procs(ia_ms,is0_reg,ik_out,ic_mix) = &
875 aerosol_procs(ia_ms,is0_reg,ik_out,ic_mix) + ms_reg
880 do is0 = 1, n_siz(ic_mix)
881 ccn(k,i,j) = ccn(k,i,j) + aerosol_activ(ia_m0,is0,ik_out,ic_mix)
882 cn(k,i,j) = cn(k,i,j) + aerosol_procs(ia_m0,is0,ik_out,ic_mix)
896 do is0 = 1, n_siz(ic)
898 qtrc1(k,i,j,qaes-1+it_procs2trans(ia0,is0,ik,ic)) = aerosol_procs(ia0,is0,ik,ic) / dens(k,i,j)
904 qtrc1(k,i,j,qaee-gas_ctg+1:qaee-gas_ctg+gas_ctg) &
905 = conc_gas(1:gas_ctg) / dens(k,i,j)*1.e-9_rp
910 do is0 = 1, n_siz(ic)
911 if (qtrc1(k,i,j,qaes-1+it_procs2trans(ia_m0,is0,ik,ic))*dens(k,i,j) < cleannumber)
then 913 qtrc1(k,i,j,qaes-1+it_procs2trans(ia0,is0,ik,ic)) = 0._rp
923 do is0 = 1, n_siz(ic)
924 if (qtrc(k,i,j,qaes-1+it_procs2trans(ia_m0,is0,ik,ic)) < 0.0_rp .or. &
925 qtrc(k,i,j,qaes-1+it_procs2trans(ia_m2,is0,ik,ic)) < 0.0_rp .or. &
926 qtrc(k,i,j,qaes-1+it_procs2trans(ia_m3,is0,ik,ic)) < 0.0_rp .or. &
927 qtrc(k,i,j,qaes-1+it_procs2trans(ia_ms,is0,ik,ic)) < 0.0_rp .or. &
928 qtrc(k,i,j,qaes-1+it_procs2trans(ia_kp,is0,ik,ic)) < 0.0_rp )
then 929 qtrc(k,i,j,qaes-1+it_procs2trans(1:n_atr,is0,ik,ic)) = 0.0_rp
936 total_aerosol_mass(k,i,j,:) = 0.0_rp
937 total_aerosol_number(k,i,j,:) = 0.0_rp
938 total_emit_aerosol_mass(k,i,j,:) = 0.0_rp
939 total_emit_aerosol_number(k,i,j,:) = 0.0_rp
942 do is0 = 1, n_siz(ic)
943 total_aerosol_mass(k,i,j,ic) = total_aerosol_mass(k,i,j,ic) &
944 + qtrc1(k,i,j,qaes-1+it_procs2trans(ia_ms,is0,ik,ic))
945 total_aerosol_number(k,i,j,ic) = total_aerosol_number(k,i,j,ic) &
946 + qtrc1(k,i,j,qaes-1+it_procs2trans(ia_m0,is0,ik,ic))
947 total_emit_aerosol_mass(k,i,j,ic) = total_emit_aerosol_mass(k,i,j,ic) &
948 + emit(k,i,j,it_procs2trans(ia_ms,is0,ik,ic))
949 total_emit_aerosol_number(k,i,j,ic) = total_emit_aerosol_number(k,i,j,ic) &
950 + emit(k,i,j,it_procs2trans(ia_m0,is0,ik,ic))
960 write(ofilename,
'(a,a)') trim(ctg_name(ic)),
'mass' 961 call hist_in( total_aerosol_mass(:,:,:,ic), trim(ofilename),
'Total mass mixing ratio of aerosol',
'kg/kg' )
962 write(ofilename,
'(a,a)') trim(ctg_name(ic)),
'number' 963 call hist_in( total_aerosol_number(:,:,:,ic), trim(ofilename),
'Total number mixing ratio of aerosol',
'num/kg' )
964 write(ofilename,
'(a,a)') trim(ctg_name(ic)),
'mass_emit' 965 call hist_in( total_emit_aerosol_mass(:,:,:,ic), trim(ofilename),
'Total mass mixing ratio of emitted aerosol',
'kg/kg' )
966 write(ofilename,
'(a,a)') trim(ctg_name(ic)),
'number_emit' 967 call hist_in( total_emit_aerosol_number(:,:,:,ic), trim(ofilename),
'Total number mixing ratio of emitted aerosol',
'num/kg' )
971 write(ofilename,
'(a,a)') trim(ctg_name(ic)),
'mass' 972 call hist_in( total_aerosol_mass(:,:,:,ic), trim(ofilename),
'Total mass mixing ratio of aerosol',
'kg/kg' )
973 write(ofilename,
'(a,a)') trim(ctg_name(ic)),
'number' 974 call hist_in( total_aerosol_number(:,:,:,ic), trim(ofilename),
'Total number mixing ratio of aerosol',
'num/kg' )
975 write(ofilename,
'(a,a)') trim(ctg_name(ic)),
'mass_emit' 976 call hist_in( total_emit_aerosol_mass(:,:,:,ic), trim(ofilename),
'Total mass mixing ratio of emitted aerosol',
'kg/kg' )
977 write(ofilename,
'(a,a)') trim(ctg_name(ic)),
'number_emit' 978 call hist_in( total_emit_aerosol_number(:,:,:,ic), trim(ofilename),
'Total number mixing ratio of emitted aerosol',
'num/kg' )
981 call hist_in( emit(:,:,:,qa_ae-gas_ctg+ig_h2so4),
'H2SO4_emit',
'Emission ratio of H2SO4 gas',
'ug/m3/s' )
982 call hist_in( emit(:,:,:,qa_ae-gas_ctg+ig_cgas),
'CGAS_emit',
'Emission ratio of Condensabule gas',
'ug/m3/s' )
984 deallocate( aerosol_procs )
985 deallocate( aerosol_activ )
986 deallocate( emis_procs )
987 deallocate( emis_gas )
993 rhoq_t_ae(k,i,j,iq) = ( qtrc1(k,i,j,iq) - qtrc0(k,i,j,iq) ) * dens(k,i,j) /
time_dtsec_atmos_phy_ae 1006 temp_k, pres_pa, super, & !--- in
1007 ! h2so4dt, c_ratio, c_kappa, & !--- in
1008 flag_npf, flag_cond, flag_coag,& !--- in
1009 aerosol_procs, & !--- inout
1010 conc_gas, & !--- inout
1011 emis_procs, & !--- out
1012 emis_gas, & !--- out
1021 real(DP),
intent(in) :: deltt
1022 real(RP),
intent(in) :: temp_k
1023 real(RP),
intent(in) :: pres_pa
1024 real(RP),
intent(in) :: super
1028 logical,
intent(in) :: flag_npf
1029 logical,
intent(in) :: flag_cond
1030 logical,
intent(in) :: flag_coag
1031 real(RP),
intent(inout) :: aerosol_procs(N_ATR,n_siz_max,n_kap_max,n_ctg)
1032 real(RP),
intent(inout) :: conc_gas(GAS_CTG)
1033 real(RP),
intent(out) :: aerosol_activ(N_ATR,n_siz_max,n_kap_max,n_ctg)
1034 real(RP),
intent(in) :: emis_procs(N_ATR,n_siz_max,n_kap_max,n_ctg)
1035 real(RP),
intent(in) :: emis_gas(GAS_CTG)
1041 real(RP) :: c_ratio, t_elaps
1042 real(RP) :: chem_gas(GAS_CTG)
1044 chem_gas(ig_h2so4) = h2so4dt
1045 chem_gas(ig_cgas) = ocgasdt
1049 do ik = 1, n_kap(ic)
1050 do is0 = 1, n_siz(ic)
1051 aerosol_procs(ia_ms,is0,ik,ic) = aerosol_procs(ia_ms,is0,ik,ic) * 1.e+9_rp
1058 do ik = 1, n_kap(ic)
1059 do is0 = 1, n_siz(ic)
1061 aerosol_procs(ia0,is0,ik,ic) = aerosol_procs(ia0,is0,ik,ic) &
1062 + emis_procs(ia0,is0,ik,ic) * deltt
1070 do ik = 1, n_kap(ic)
1071 do is0 = 1, n_siz(ic)
1072 if (aerosol_procs(ia_m0,is0,ik,ic) < cleannumber)
then 1074 aerosol_procs(ia0,is0,ik,ic) = 0._rp
1083 conc_gas(ig_h2so4) = conc_gas(ig_h2so4) + chem_gas(ig_h2so4) * deltt
1084 conc_gas(ig_cgas) = conc_gas(ig_cgas) + chem_gas(ig_cgas) * deltt
1086 conc_gas(ig_h2so4) = conc_gas(ig_h2so4) + emis_gas(ig_h2so4) * deltt
1087 conc_gas(ig_cgas) = conc_gas(ig_cgas) + emis_gas(ig_cgas) * deltt
1089 if( chem_gas(ig_h2so4)+emis_gas(ig_h2so4) /= 0.0_rp )
then 1090 c_ratio = ( chem_gas(ig_h2so4)+emis_gas(ig_h2so4)+chem_gas(ig_cgas)+emis_gas(ig_cgas) ) &
1091 / ( chem_gas(ig_h2so4)+emis_gas(ig_h2so4) )
1104 if( t_elaps <= t_npf )
then 1115 call aerosol_condensation(j_1nm, temp_k, pres_pa, deltt, &
1116 ic_nuc, ik_nuc, is_nuc, n_ctg, n_kap, n_siz, n_atr, &
1117 n_siz_max, n_kap_max, ia_m0, ia_m2, ia_m3, ia_ms, &
1120 conc_gas(ig_h2so4), c_ratio, aerosol_procs )
1127 call aerosol_coagulation(deltt, temp_k, pres_pa, &
1128 mcomb,is_i,is_j,is_k,ik_i,ik_j,ik_k,ic_i,ic_j,ic_k, &
1129 n_atr,n_siz_max,n_kap_max,n_ctg,ia_m0,ia_m2,ia_m3,ia_ms, &
1130 n_siz,n_kap,d_lw,d_ct,d_up,aerosol_procs)
1134 call aerosol_activation(c_kappa, super, temp_k, ia_m0, ia_m2, ia_m3, &
1135 n_atr,n_siz_max,n_kap_max,n_ctg,n_siz,n_kap, &
1136 d_ct,aerosol_procs, aerosol_activ)
1142 do ik = 1, n_kap(ic)
1143 do is0 = 1, n_siz(ic)
1144 aerosol_procs(ia_ms,is0,ik,ic) = aerosol_procs(ia_ms,is0,ik,ic) * 1.e-9_rp
1157 real(RP),
intent(in) :: conc_h2so4
1158 real(RP),
intent(inout) :: J_1nm
1160 real(RP) :: conc_num_h2so4
1164 conc_num_h2so4 = conc_h2so4 * conv_m2n
1167 j_1nm = (10._rp**(logk_aenucl)) * conc_num_h2so4 ** 2._rp
1174 subroutine aerosol_condensation(J_1nm, temp_k, pres_pa, deltt, &
1175 ic_nuc, ik_nuc, is_nuc, n_ctg, n_kap, n_siz, n_atr, &
1176 n_siz_max, n_kap_max, ia_m0, ia_m2, ia_m3, ia_ms, &
1177 ! d_lw, d_ct, d_up, k_lw, k_ct, k_up, &
1179 conc_h2so4, c_ratio, aerosol_procs )
1183 real(RP),
intent(in) :: J_1nm
1184 real(RP),
intent(in) :: temp_k
1185 real(RP),
intent(in) :: pres_pa
1186 real(DP),
intent(in) :: deltt
1187 integer,
intent(in) :: ic_nuc
1188 integer,
intent(in) :: ik_nuc
1189 integer,
intent(in) :: is_nuc
1190 integer,
intent(in) :: n_ctg
1191 integer,
intent(in) :: n_kap(n_ctg)
1192 integer,
intent(in) :: n_siz(n_ctg)
1193 integer,
intent(in) :: n_atr
1194 integer,
intent(in) :: n_siz_max
1195 integer,
intent(in) :: n_kap_max
1196 integer,
intent(in) :: ia_m0
1197 integer,
intent(in) :: ia_m2
1198 integer,
intent(in) :: ia_m3
1199 integer,
intent(in) :: ia_ms
1200 real(RP),
intent(in) :: c_ratio
1201 real(RP),
intent(in) :: d_lw(n_siz_max,n_ctg), d_ct(n_siz_max,n_ctg), d_up(n_siz_max,n_ctg)
1203 real(RP),
intent(inout) :: conc_h2so4
1204 real(RP),
intent(inout) :: aerosol_procs(n_atr,n_siz_max,n_kap_max,n_ctg)
1206 real(RP),
parameter :: alpha = 0.1_rp
1207 real(RP),
parameter :: cour = 0.5_rp
1210 real(RP) :: sq_cbar_h2so4
1211 real(RP) :: cbar_h2so4
1212 real(RP) :: dv_h2so4
1214 real(RP) :: dm0dt_npf, dm2dt_npf, dm3dt_npf, dmsdt_npf
1215 real(RP) :: dm0dt_cnd(n_siz_max,n_kap_max,n_ctg)
1216 real(RP) :: dm2dt_cnd(n_siz_max,n_kap_max,n_ctg)
1217 real(RP) :: dm3dt_cnd(n_siz_max,n_kap_max,n_ctg)
1218 real(RP) :: dmsdt_cnd(n_siz_max,n_kap_max,n_ctg)
1219 real(RP) :: rm0_pls(n_siz_max), rm0_mns(n_siz_max)
1220 real(RP) :: rm2_pls(n_siz_max), rm2_mns(n_siz_max)
1221 real(RP) :: rm3_pls(n_siz_max), rm3_mns(n_siz_max)
1222 real(RP) :: rms_pls(n_siz_max), rms_mns(n_siz_max)
1223 real(RP) :: m0t,m1t,m2t,m3t,dgt,sgt,dm2
1224 real(RP) :: gnc2,gnc3,gfm2,gfm3,harm2,harm3
1225 real(RP) :: lossrate,tmps6
1226 integer :: ic, ik, is0, i, is1, is2
1229 if (conc_h2so4 <= 0.0_rp)
return 1232 drive = conc_h2so4 * mwrat_s6 * conv_ms_vl
1233 sq_cbar_h2so4 = 8.0_rp*rgas*temp_k/(pi*mwh2so4*1.e-3_rp)
1234 cbar_h2so4 = sqrt( sq_cbar_h2so4 )
1235 dv_h2so4 = diffsulf*(stdatmpa/pres_pa)*(temp_k/stdtemp)**1.75_rp
1247 dm0dt_npf = j_1nm * 1.e6_rp
1248 dm2dt_npf = dm0dt_npf * 1.e-18_rp
1249 dm3dt_npf = dm0dt_npf * 1.e-27_rp
1250 dmsdt_npf = dm3dt_npf * pi6 * conv_vl_ms
1254 do ik = 1, n_kap(ic)
1255 do is0 = 1, n_siz(ic)
1257 dm2dt_cnd(is0,ik,ic) = 0._rp
1258 dm3dt_cnd(is0,ik,ic) = 0._rp
1260 if (aerosol_procs(ia_m0,is0,ik,ic) &
1261 *aerosol_procs(ia_m2,is0,ik,ic) &
1262 *aerosol_procs(ia_m3,is0,ik,ic) > 0._rp)
then 1263 m0t = aerosol_procs(ia_m0,is0,ik,ic)
1264 m2t = aerosol_procs(ia_m2,is0,ik,ic)
1265 m3t = aerosol_procs(ia_m3,is0,ik,ic)
1266 call diag_ds(m0t,m2t,m3t,dgt,sgt,dm2)
1267 if (dgt <= 0._rp) dgt = d_ct(is0,ic)
1268 if (sgt <= 0._rp) sgt = 1.3_rp
1269 m1t = m0t*dgt*exp(0.5_rp*(log(sgt)**2._rp))
1271 gnc2 = 8._rp * dv_h2so4 * m0t
1272 gnc3 = 12._rp * dv_h2so4 * m1t
1274 gfm2 = alpha * cbar_h2so4 * m1t
1275 gfm3 = 1.5_rp * alpha * cbar_h2so4 * m2t
1277 harm2 = gnc2 * gfm2 / ( gnc2 + gfm2 )
1278 harm3 = gnc3 * gfm3 / ( gnc3 + gfm3 )
1280 dm2dt_cnd(is0,ik,ic) = harm2*drive
1281 dm3dt_cnd(is0,ik,ic) = harm3*drive
1282 dmsdt_cnd(is0,ik,ic) = dm3dt_cnd(is0,ik,ic)*pi6*conv_vl_ms
1292 lossrate = dmsdt_npf
1295 do ik = 1, n_kap(ic)
1296 do is0 = 1, n_siz(ic)
1297 lossrate = lossrate + dmsdt_cnd(is0,ik,ic)
1302 if (lossrate<=0._rp)
return 1304 isplt = int( (lossrate*deltt) / (cour*conc_h2so4) )+1
1305 dtsplt = deltt/
float(isplt)
1308 loop_split:
do i = 1, isplt
1310 conc_h2so4 = conc_h2so4 - (lossrate * dtsplt) * mwrat_s6_i
1312 if (conc_h2so4 < 0._rp)
then 1313 dtsplt = tmps6 * mwrat_s6 / lossrate
1318 aerosol_procs(ia_m0,is_nuc,ik_nuc,ic_nuc) = &
1319 aerosol_procs(ia_m0,is_nuc,ik_nuc,ic_nuc) + dm0dt_npf * dtsplt
1320 aerosol_procs(ia_m2,is_nuc,ik_nuc,ic_nuc) = &
1321 aerosol_procs(ia_m2,is_nuc,ik_nuc,ic_nuc) + dm2dt_npf * dtsplt
1322 aerosol_procs(ia_m3,is_nuc,ik_nuc,ic_nuc) = &
1323 aerosol_procs(ia_m3,is_nuc,ik_nuc,ic_nuc) + dm3dt_npf * dtsplt
1324 aerosol_procs(ia_ms,is_nuc,ik_nuc,ic_nuc) = &
1325 aerosol_procs(ia_ms,is_nuc,ik_nuc,ic_nuc) + dmsdt_npf * dtsplt
1329 do ik = 1, n_kap(ic)
1330 do is0 = 1, n_siz(ic)
1332 aerosol_procs(ia_m2,is0,ik,ic) = &
1333 aerosol_procs(ia_m2,is0,ik,ic) + dm2dt_cnd(is0,ik,ic) * dtsplt &
1335 aerosol_procs(ia_m3,is0,ik,ic) = &
1336 aerosol_procs(ia_m3,is0,ik,ic) + dm3dt_cnd(is0,ik,ic) * dtsplt &
1338 aerosol_procs(ia_ms,is0,ik,ic) = &
1339 aerosol_procs(ia_ms,is0,ik,ic) + dmsdt_cnd(is0,ik,ic) * dtsplt &
1347 if (conc_h2so4 <= 0.0_rp)
exit loop_split
1353 conc_h2so4 = max(conc_h2so4, 0._rp)
1357 do ik = 1, n_kap(ic)
1368 do is1 = 1, n_siz(ic)
1370 if (aerosol_procs(ia_m0,is1,ik,ic) &
1371 *aerosol_procs(ia_m2,is1,ik,ic) &
1372 *aerosol_procs(ia_m3,is1,ik,ic) > 0._rp)
then 1373 m0t = aerosol_procs(ia_m0,is1,ik,ic)
1374 m2t = aerosol_procs(ia_m2,is1,ik,ic)
1375 m3t = aerosol_procs(ia_m3,is1,ik,ic)
1376 call diag_ds(m0t,m2t,m3t,dgt,sgt,dm2)
1377 if (dgt <= 0._rp) dgt = d_ct(is1,ic)
1378 if (sgt <= 0._rp) sgt = 1.3_rp
1380 do is2 = 1, n_siz(ic)
1381 if (dgt >= d_lw(is2,ic) .AND. dgt < d_up(is2,ic))
then 1382 rm0_pls(is2) = rm0_pls(is2) + aerosol_procs(ia_m0,is1,ik,ic)
1383 rm0_mns(is1) = aerosol_procs(ia_m0,is1,ik,ic)
1384 rm2_pls(is2) = rm2_pls(is2) + aerosol_procs(ia_m2,is1,ik,ic)
1385 rm2_mns(is1) = aerosol_procs(ia_m2,is1,ik,ic)
1386 rm3_pls(is2) = rm3_pls(is2) + aerosol_procs(ia_m3,is1,ik,ic)
1387 rm3_mns(is1) = aerosol_procs(ia_m3,is1,ik,ic)
1388 rms_pls(is2) = rms_pls(is2) + aerosol_procs(ia_ms,is1,ik,ic)
1389 rms_mns(is1) = aerosol_procs(ia_ms,is1,ik,ic)
1398 do is0 = 1, n_siz(ic)
1399 aerosol_procs(ia_m0,is0,ik,ic) = aerosol_procs(ia_m0,is0,ik,ic) &
1400 + rm0_pls(is0) - rm0_mns(is0)
1401 aerosol_procs(ia_m2,is0,ik,ic) = aerosol_procs(ia_m2,is0,ik,ic) &
1402 + rm2_pls(is0) - rm2_mns(is0)
1403 aerosol_procs(ia_m3,is0,ik,ic) = aerosol_procs(ia_m3,is0,ik,ic) &
1404 + rm3_pls(is0) - rm3_mns(is0)
1405 aerosol_procs(ia_ms,is0,ik,ic) = aerosol_procs(ia_ms,is0,ik,ic) &
1406 + rms_pls(is0) - rms_mns(is0)
1413 end subroutine aerosol_condensation
1417 subroutine aerosol_coagulation(deltt, temp_k, pres_pa, &
1418 mcomb,is_i,is_j,is_k,ik_i,ik_j,ik_k,ic_i,ic_j,ic_k, &
1419 n_atr,n_siz_max,n_kap_max,n_ctg,ia_m0,ia_m2,ia_m3,ia_ms, &
1420 n_siz,n_kap,d_lw,d_ct,d_up,aerosol_procs)
1423 real(DP),
intent(in) :: deltt
1424 real(RP),
intent(in) :: temp_k
1425 real(RP),
intent(in) :: pres_pa
1426 integer,
intent(in) :: mcomb
1427 integer,
intent(in) :: is_i(mcomb), is_j(mcomb), is_k(mcomb)
1428 integer,
intent(in) :: ik_i(mcomb), ik_j(mcomb), ik_k(mcomb)
1429 integer,
intent(in) :: ic_i(mcomb), ic_j(mcomb), ic_k(mcomb)
1430 integer,
intent(in) :: n_ctg
1431 integer,
intent(in) :: n_atr
1432 integer,
intent(in) :: n_siz_max
1433 integer,
intent(in) :: n_kap_max
1434 integer,
intent(in) :: ia_m0
1435 integer,
intent(in) :: ia_m2
1436 integer,
intent(in) :: ia_m3
1437 integer,
intent(in) :: ia_ms
1438 integer,
intent(in) :: n_siz(n_ctg)
1439 integer,
intent(in) :: n_kap(n_ctg)
1440 real(RP),
intent(in):: d_lw(n_siz_max,n_ctg), d_ct(n_siz_max,n_ctg), d_up(n_siz_max,n_ctg)
1441 real(RP),
intent(inout) :: aerosol_procs(n_atr,n_siz_max,n_kap_max,n_ctg)
1443 real(RP) :: dt_m0(n_siz_max,n_kap_max,n_ctg)
1444 real(RP) :: dt_m3(n_siz_max,n_kap_max,n_ctg)
1445 real(RP) :: dt_m6(n_siz_max,n_kap_max,n_ctg)
1446 real(RP) :: dt_ms(n_siz_max,n_kap_max,n_ctg)
1447 real(RP) :: sixth(n_siz_max,n_kap_max,n_ctg)
1448 real(RP) :: rm0_pls(n_siz_max), rm0_mns(n_siz_max)
1449 real(RP) :: rm2_pls(n_siz_max), rm2_mns(n_siz_max)
1450 real(RP) :: rm3_pls(n_siz_max), rm3_mns(n_siz_max)
1451 real(RP) :: rms_pls(n_siz_max), rms_mns(n_siz_max)
1454 real(RP) :: rkfm,rknc
1455 real(RP) :: m0i,m0j,m2i,m2j,m3i,m3j,msi,msj,dgi,dgj,sgi,sgj,dm2,m6i,m6j
1456 real(RP) :: dm0i,dm0j,dm0k,dm3i,dm3j,dm3k,dm6i,dm6j,dm6k,dmsi,dmsj,dmsk
1457 real(RP) :: m0t,m3t,m6t,dgt,sgt,m2t
1458 integer :: mc, ic, ik, is0, is1, is2
1460 dt_m0(:,:,:) = 0._rp
1461 dt_m3(:,:,:) = 0._rp
1462 dt_m6(:,:,:) = 0._rp
1463 dt_ms(:,:,:) = 0._rp
1464 sixth(:,:,:) = 0._rp
1466 visair=c1*temp_k**c2/(1._rp+c3/temp_k)
1467 rkfm=(3._rp*boltz*temp_k /rho_kg)**0.5_rp
1468 rknc= 2._rp*boltz*temp_k /(3._rp*visair)
1469 c4 = pi*boltz*temp_k/(8._rp*mwair/avo*1.e-3_rp)
1470 lambda = visair/(0.499_rp*pres_pa)*c4**0.5_rp*1.e2_rp
1475 m0i = aerosol_procs(ia_m0,is_i(mc),ik_i(mc),ic_i(mc))
1476 m0j = aerosol_procs(ia_m0,is_j(mc),ik_j(mc),ic_j(mc))
1477 m2i = aerosol_procs(ia_m2,is_i(mc),ik_i(mc),ic_i(mc))
1478 m2j = aerosol_procs(ia_m2,is_j(mc),ik_j(mc),ic_j(mc))
1479 m3i = aerosol_procs(ia_m3,is_i(mc),ik_i(mc),ic_i(mc))
1480 m3j = aerosol_procs(ia_m3,is_j(mc),ik_j(mc),ic_j(mc))
1481 msi = aerosol_procs(ia_ms,is_i(mc),ik_i(mc),ic_i(mc))
1482 msj = aerosol_procs(ia_ms,is_j(mc),ik_j(mc),ic_j(mc))
1484 if (m0i*m2i*m3i <= 0._rp .OR. m0j*m2j*m3j <= 0._rp) cycle
1486 call diag_ds(m0i,m2i,m3i,dgi,sgi,dm2)
1487 if (dgi <= 0._rp) dgi = d_ct(is_i(mc),ic_i(mc))
1488 if (sgi <= 0._rp) sgi = 1.3_rp
1489 call diag_ds(m0j,m2j,m3j,dgj,sgj,dm2)
1490 if (dgj <= 0._rp) dgj = d_ct(is_j(mc),ic_j(mc))
1491 if (sgj <= 0._rp) sgj = 1.3_rp
1493 m6i = m0i*dgi**6._rp*exp(18._rp*(log(sgi)**2._rp))
1494 m6j = m0j*dgj**6._rp*exp(18._rp*(log(sgj)**2._rp))
1495 sixth(is_i(mc),ik_i(mc),ic_i(mc)) = m6i
1496 sixth(is_j(mc),ik_j(mc),ic_j(mc)) = m6j
1499 if ( is_i(mc) == is_j(mc) .AND. &
1500 ik_i(mc) == ik_j(mc) .AND. &
1501 ic_i(mc) == ic_j(mc) )
then 1502 call aero_intra(m0i, m3i, &
1514 call aero_inter(m0i ,m3i ,m6i , &
1516 dm0i,dm3i,dm6i,dmsi, &
1517 dm0j,dm3j,dm6j,dmsj, &
1518 dm0k,dm3k,dm6k,dmsk, &
1519 dgi ,sgi, rhod_ae, &
1520 dgj ,sgj, rhod_ae, &
1521 rknc, rkfm, lambda, &
1525 dt_m0(is_i(mc),ik_i(mc),ic_i(mc)) = dt_m0(is_i(mc),ik_i(mc),ic_i(mc)) + dm0i
1526 dt_m0(is_j(mc),ik_j(mc),ic_j(mc)) = dt_m0(is_j(mc),ik_j(mc),ic_j(mc)) + dm0j
1527 dt_m0(is_k(mc),ik_k(mc),ic_k(mc)) = dt_m0(is_k(mc),ik_k(mc),ic_k(mc)) + dm0k
1528 dt_m3(is_i(mc),ik_i(mc),ic_i(mc)) = dt_m3(is_i(mc),ik_i(mc),ic_i(mc)) + dm3i
1529 dt_m3(is_j(mc),ik_j(mc),ic_j(mc)) = dt_m3(is_j(mc),ik_j(mc),ic_j(mc)) + dm3j
1530 dt_m3(is_k(mc),ik_k(mc),ic_k(mc)) = dt_m3(is_k(mc),ik_k(mc),ic_k(mc)) + dm3k
1531 dt_m6(is_i(mc),ik_i(mc),ic_i(mc)) = dt_m6(is_i(mc),ik_i(mc),ic_i(mc)) + dm6i
1532 dt_m6(is_j(mc),ik_j(mc),ic_j(mc)) = dt_m6(is_j(mc),ik_j(mc),ic_j(mc)) + dm6j
1533 dt_m6(is_k(mc),ik_k(mc),ic_k(mc)) = dt_m6(is_k(mc),ik_k(mc),ic_k(mc)) + dm6k
1534 dt_ms(is_i(mc),ik_i(mc),ic_i(mc)) = dt_ms(is_i(mc),ik_i(mc),ic_i(mc)) + dmsi
1535 dt_ms(is_j(mc),ik_j(mc),ic_j(mc)) = dt_ms(is_j(mc),ik_j(mc),ic_j(mc)) + dmsj
1536 dt_ms(is_k(mc),ik_k(mc),ic_k(mc)) = dt_ms(is_k(mc),ik_k(mc),ic_k(mc)) + dmsk
1543 do ik = 1, n_kap(ic)
1544 do is0 = 1, n_siz(ic)
1545 if (aerosol_procs(ia_m0,is0,ik,ic) > 0._rp .AND. &
1546 dt_m0(is0,ik,ic)/aerosol_procs(ia_m0,is0,ik,ic) < 1._rp )
then 1547 aerosol_procs(ia_m0,is0,ik,ic)=aerosol_procs(ia_m0,is0,ik,ic) &
1548 *exp( dt_m0(is0,ik,ic)/aerosol_procs(ia_m0,is0,ik,ic) )
1550 aerosol_procs(ia_m0,is0,ik,ic)=aerosol_procs(ia_m0,is0,ik,ic) + dt_m0(is0,ik,ic)
1552 if (aerosol_procs(ia_m3,is0,ik,ic) > 0._rp .AND. &
1553 dt_m3(is0,ik,ic)/aerosol_procs(ia_m3,is0,ik,ic) < 1._rp )
then 1554 aerosol_procs(ia_m3,is0,ik,ic)=aerosol_procs(ia_m3,is0,ik,ic) &
1555 *exp( dt_m3(is0,ik,ic)/aerosol_procs(ia_m3,is0,ik,ic) )
1557 aerosol_procs(ia_m3,is0,ik,ic)=aerosol_procs(ia_m3,is0,ik,ic) + dt_m3(is0,ik,ic)
1559 if (sixth(is0,ik,ic) > 0._rp .AND. &
1560 dt_m6(is0,ik,ic)/sixth(is0,ik,ic) < 1._rp )
then 1561 sixth(is0,ik,ic) =sixth(is0,ik,ic) &
1562 *exp( dt_m6(is0,ik,ic)/sixth(is0,ik,ic) )
1564 sixth(is0,ik,ic) =sixth(is0,ik,ic) + dt_m6(is0,ik,ic)
1566 if (aerosol_procs(ia_ms,is0,ik,ic) > 0._rp .AND. &
1567 dt_ms(is0,ik,ic)/aerosol_procs(ia_ms,is0,ik,ic) < 1._rp )
then 1568 aerosol_procs(ia_ms,is0,ik,ic)=aerosol_procs(ia_ms,is0,ik,ic) &
1569 *exp( dt_ms(is0,ik,ic)/aerosol_procs(ia_ms,is0,ik,ic) )
1571 aerosol_procs(ia_ms,is0,ik,ic)=aerosol_procs(ia_ms,is0,ik,ic) + dt_ms(is0,ik,ic)
1573 m0t = aerosol_procs(ia_m0,is0,ik,ic)
1574 m3t = aerosol_procs(ia_m3,is0,ik,ic)
1575 m6t = sixth(is0,ik,ic)
1576 call diag_ds6(m0t,m3t,m6t, &
1578 if (dgt <= 0._rp) dgt = d_ct(is0,ic)
1579 if (sgt <= 0._rp) sgt = 1.3_rp
1580 if (m3t == 0._rp) aerosol_procs(ia_ms,is0,ik,ic)=0._rp
1581 aerosol_procs(ia_m2,is0,ik,ic)=m2t
1583 aerosol_procs(ia_m0,is0,ik,ic)=m0t
1584 aerosol_procs(ia_m3,is0,ik,ic)=m3t
1591 do ik = 1, n_kap(ic)
1602 do is1 = 1, n_siz(ic)
1604 if (aerosol_procs(ia_m0,is1,ik,ic) &
1605 *aerosol_procs(ia_m2,is1,ik,ic) &
1606 *aerosol_procs(ia_m3,is1,ik,ic) > 0._rp)
then 1607 m0t = aerosol_procs(ia_m0,is1,ik,ic)
1608 m2t = aerosol_procs(ia_m2,is1,ik,ic)
1609 m3t = aerosol_procs(ia_m3,is1,ik,ic)
1610 call diag_ds(m0t,m2t,m3t,dgt,sgt,dm2)
1611 if (dgt <= 0._rp) dgt = d_ct(is1,ic)
1612 if (sgt <= 0._rp) sgt = 1.3_rp
1614 do is2 = 1, n_siz(ic)
1615 if (dgt >= d_lw(is2,ic) .AND. dgt < d_up(is2,ic))
then 1616 rm0_pls(is2) = rm0_pls(is2) + aerosol_procs(ia_m0,is1,ik,ic)
1617 rm0_mns(is1) = aerosol_procs(ia_m0,is1,ik,ic)
1618 rm2_pls(is2) = rm2_pls(is2) + aerosol_procs(ia_m2,is1,ik,ic)
1619 rm2_mns(is1) = aerosol_procs(ia_m2,is1,ik,ic)
1620 rm3_pls(is2) = rm3_pls(is2) + aerosol_procs(ia_m3,is1,ik,ic)
1621 rm3_mns(is1) = aerosol_procs(ia_m3,is1,ik,ic)
1622 rms_pls(is2) = rms_pls(is2) + aerosol_procs(ia_ms,is1,ik,ic)
1623 rms_mns(is1) = aerosol_procs(ia_ms,is1,ik,ic)
1632 do is0 = 1, n_siz(ic)
1633 aerosol_procs(ia_m0,is0,ik,ic) = aerosol_procs(ia_m0,is0,ik,ic) &
1634 + rm0_pls(is0) - rm0_mns(is0)
1635 aerosol_procs(ia_m2,is0,ik,ic) = aerosol_procs(ia_m2,is0,ik,ic) &
1636 + rm2_pls(is0) - rm2_mns(is0)
1637 aerosol_procs(ia_m3,is0,ik,ic) = aerosol_procs(ia_m3,is0,ik,ic) &
1638 + rm3_pls(is0) - rm3_mns(is0)
1639 aerosol_procs(ia_ms,is0,ik,ic) = aerosol_procs(ia_ms,is0,ik,ic) &
1640 + rms_pls(is0) - rms_mns(is0)
1648 end subroutine aerosol_coagulation
1654 subroutine aerosol_activation(c_kappa, super, temp_k, ia_m0, ia_m2, ia_m3, &
1655 n_atr,n_siz_max,n_kap_max,n_ctg,n_siz,n_kap, &
1656 d_ct, aerosol_procs, aerosol_activ)
1660 real(RP),
intent(in) :: super
1661 real(RP),
intent(in) :: c_kappa
1662 real(RP),
intent(in) :: temp_k
1663 integer,
intent(in) :: ia_m0, ia_m2, ia_m3
1664 integer,
intent(in) :: n_atr
1665 integer,
intent(in) :: n_siz_max
1666 integer,
intent(in) :: n_kap_max
1667 integer,
intent(in) :: n_ctg
1668 real(RP),
intent(in) :: d_ct(n_siz_max,n_ctg)
1669 real(RP) :: aerosol_procs(n_atr,n_siz_max,n_kap_max,n_ctg)
1670 real(RP) :: aerosol_activ(n_atr,n_siz_max,n_kap_max,n_ctg)
1671 integer,
intent(in) :: n_siz(n_ctg), n_kap(n_ctg)
1673 real(RP),
parameter :: two3 = 2._rp/3._rp
1674 real(RP),
parameter :: rt2 = sqrt(2._rp)
1675 real(RP),
parameter :: twort2 = rt2
1676 real(RP),
parameter :: thrrt2 = 3._rp/rt2
1677 real(RP) :: smax_inv
1678 real(RP) :: am,scrit_am,aa,tc,st,bb,ac
1679 real(RP) :: m0t,m2t,m3t,dgt,sgt,dm2
1681 real(RP) :: tmp1, tmp2, tmp3
1682 real(RP) :: ccn_frc,cca_frc,ccv_frc
1683 integer :: is0, ik, ic
1685 aerosol_activ(:,:,:,:) = 0._rp
1687 if (super<=0._rp)
return 1689 smax_inv = 1._rp / super
1692 tc = temp_k - stdtemp
1693 if (tc >= 0._rp )
then 1694 st = 75.94_rp-0.1365_rp*tc-0.3827e-3_rp*tc**2._rp
1696 st = 75.93_rp +0.115_rp*tc &
1697 + 6.818e-2_rp*tc**2._rp+6.511e-3_rp*tc**3._rp &
1698 + 2.933e-4_rp*tc**4._rp+6.283e-6_rp*tc**5._rp &
1699 + 5.285e-8_rp*tc**6._rp
1705 aa = 2._rp * st * mwwat * 1.e-3_rp / (dnwat * rgas * temp_k )
1708 do ik = 1, n_kap(ic)
1709 do is0 = 1, n_siz(ic)
1710 m0t = aerosol_procs(ia_m0,is0,ik,ic)
1711 m2t = aerosol_procs(ia_m2,is0,ik,ic)
1712 m3t = aerosol_procs(ia_m3,is0,ik,ic)
1713 call diag_ds(m0t,m2t,m3t,dgt,sgt,dm2)
1714 if (dgt <= 0._rp) dgt = d_ct(is0,ic)
1715 if (sgt <= 0._rp) sgt = 1.3_rp
1718 if (bb > 0._rp .AND. am > 0._rp )
then 1719 scrit_am = 2._rp/sqrt(bb)*(aa/(3._rp*am))**1.5_rp
1723 ac = am * (scrit_am * smax_inv)**two3
1725 tmp1 = log(d_crit) - log(dgt)
1726 tmp2 = 1._rp/(rt2*log(sgt))
1728 ccn_frc= 0.5_rp*(1._rp-erf(tmp1*tmp2))
1729 cca_frc= 0.5_rp*(1._rp-erf(tmp1*tmp2-twort2*tmp3))
1730 ccv_frc= 0.5_rp*(1._rp-erf(tmp1*tmp2-thrrt2*tmp3))
1731 ccn_frc=min(max(ccn_frc,0.0_rp),1.0_rp)
1732 cca_frc=min(max(cca_frc,0.0_rp),1.0_rp)
1733 ccv_frc=min(max(ccv_frc,0.0_rp),1.0_rp)
1734 aerosol_activ(ia_m0,is0,ik,ic) = ccn_frc * aerosol_procs(ia_m0,is0,ik,ic)
1735 aerosol_activ(ia_m2,is0,ik,ic) = cca_frc * aerosol_procs(ia_m2,is0,ik,ic)
1736 aerosol_activ(ia_m3,is0,ik,ic) = ccv_frc * aerosol_procs(ia_m3,is0,ik,ic)
1737 aerosol_activ(ia_ms,is0,ik,ic) = ccv_frc * aerosol_procs(ia_ms,is0,ik,ic)
1743 end subroutine aerosol_activation
1747 subroutine diag_ds(m0,m2,m3, & !i
1750 real(RP) :: m0,m2,m3,dg,sg,m3_bar,m2_bar
1751 real(RP) :: m2_new,m2_old,dm2
1752 real(RP),
parameter :: sgmax=2.5_rp
1753 real(RP),
parameter :: rk1=2._rp
1754 real(RP),
parameter :: rk2=3._rp
1755 real(RP),
parameter :: ratio =rk1/rk2
1756 real(RP),
parameter :: rk1_hat=1._rp/(ratio*(rk2-rk1))
1757 real(RP),
parameter :: rk2_hat=ratio/(rk1-rk2)
1758 real(DP),
parameter :: tiny=1.e-50_dp
1762 if (m0 <= tiny .OR. m2 <= tiny .OR. m3 <= tiny)
then 1774 dg = m2_bar**rk1_hat*m3_bar**rk2_hat
1776 if (m2_bar/m3_bar**ratio < 1._rp)
then 1777 sg = exp(sqrt(2._rp/(rk1*(rk1-rk2)) &
1778 * log(m2_bar/m3_bar**ratio) ))
1781 if (sg > sgmax)
then 1784 call diag_d2(m0,m3,sg, &
1789 if (m2_bar/m3_bar**ratio >= 1._rp)
then 1791 call diag_d2(m0,m3,sg, &
1797 dm2 = m2_old - m2_new
1800 end subroutine diag_ds
1804 subroutine diag_d2(m0,m3,sg, & !i
1807 real(RP) :: dg,sg,m0,m2,m3,aaa
1808 real(RP),
parameter :: one3=1._rp/3._rp
1809 aaa = m0 * exp( 4.5_rp * (log(sg)**2._rp) )
1811 m2 = m0 * dg ** 2._rp * exp( 2.0_rp * (log(sg)**2._rp) )
1814 end subroutine diag_d2
1818 subroutine aero_intra(m0, m3, & !input
1819 dm0,dm3,dm6, & !output
1820 dg, sg, lambda, & !input
1827 real(RP),
intent(in) :: m0
1828 real(RP),
intent(in) :: m3
1830 real(RP),
intent(out) :: dm0
1831 real(RP),
intent(out) :: dm3
1832 real(RP),
intent(out) :: dm6
1833 real(RP),
intent(in) :: dg
1834 real(RP),
intent(in) :: sg
1835 real(RP),
intent(in) :: lambda
1836 real(RP),
intent(in) :: rknc, rkfm
1837 real(DP),
intent(in) :: dt
1840 real(RP) :: mm2,mm1,m1,m4,m2,mm1p5,mm0p5,m0p5,m3p5,m1p5,m5,m2p5
1841 real(RP) :: dm0dt,dm6dt,dm0dt_nc,dm6dt_nc,dm0dt_fm,dm6dt_fm,bbb
1844 real(RP),
parameter :: rk1=3._rp
1845 real(RP),
parameter :: rk2=6._rp
1846 real(RP),
parameter :: ratio=rk1/rk2
1847 real(RP),
parameter :: rk1_hat=1._rp/(ratio*(rk2-rk1))
1848 real(RP),
parameter :: rk2_hat=ratio/(rk1-rk2)
1859 mm2 =m0*dg**(-2._rp) *exp(2.0_rp *(log(sg)**2._rp))
1860 mm1 =m0*dg**(-1._rp) *exp(0.5_rp *(log(sg)**2._rp))
1861 m1 =m0*dg** 1._rp *exp(0.5_rp *(log(sg)**2._rp))
1862 m2 =m0*dg** 2._rp *exp(2.0_rp *(log(sg)**2._rp))
1863 m4 =m0*dg** 4._rp *exp(8.0_rp *(log(sg)**2._rp))
1866 dm0dt_nc=-1._rp*rknc*(m0*m0+m1*mm1+2.492e-2_rp*lambda*(m0*mm1+m1*mm2))
1867 dm6dt_nc= 2._rp*rknc*(m3*m3+m4*m2 +2.492e-2_rp*lambda*(m3*m2 +m4*m1 ))
1871 mm1p5=m0*dg**(-1.5_rp)*exp(1.125_rp*(log(sg)**2._rp))
1872 mm0p5=m0*dg**(-0.5_rp)*exp(0.125_rp*(log(sg)**2._rp))
1873 m0p5 =m0*dg** 0.5_rp *exp(0.125_rp*(log(sg)**2._rp))
1874 m3p5 =m0*dg**( 3.5_rp)*exp(6.125_rp*(log(sg)**2._rp))
1875 m1p5 =m0*dg**( 1.5_rp)*exp(1.125_rp*(log(sg)**2._rp))
1876 m5 =m0*dg** 5._rp *exp(12.50_rp*(log(sg)**2._rp))
1877 m2p5 =m0*dg** 2.5_rp *exp(3.125_rp*(log(sg)**2._rp))
1879 bbb =1._rp+1.2_rp *exp(-2._rp*sg)-0.646_rp*exp(-0.35_rp*sg**2._rp)
1881 dm0dt_fm= -1._rp*bbb*rkfm*(m0*m0p5+m2*mm1p5+2._rp*m1*mm0p5)
1882 dm6dt_fm= 2._rp*bbb*rkfm*(m3p5*m3+m1p5*m5 +2._rp*m2p5*m4 )
1885 if (dm0dt_fm+dm0dt_nc /= 0._rp) dm0dt = dm0dt_fm*dm0dt_nc/(dm0dt_fm+dm0dt_nc)
1886 if (dm6dt_fm+dm6dt_nc /= 0._rp) dm6dt = dm6dt_fm*dm6dt_nc/(dm6dt_fm+dm6dt_nc)
1893 end subroutine aero_intra
1897 subroutine aero_inter(m0i ,m3i ,m6i , & !input unchanged
1898 m0j ,m3j ,m6j , & !input unchanged
1899 dm0i,dm3i,dm6i,dmsi, & !output
1900 dm0j,dm3j,dm6j,dmsj, & !output
1901 dm0k,dm3k,dm6k,dmsk, & !output
1902 dgi ,sgi, rhoi, & !input unchanged
1903 dgj ,sgj, rhoj, & !input unchanged
1904 rknc, rkfm, lambda, & !input unchanged
1911 real(RP),
intent(in) :: m0i,m0j
1912 real(RP),
intent(in) :: m3i,m3j
1913 real(RP),
intent(in) :: m6i,m6j
1914 real(RP),
intent(out) :: dm0i,dm0j,dm0k
1915 real(RP),
intent(out) :: dm3i,dm3j,dm3k
1916 real(RP),
intent(out) :: dm6i,dm6j,dm6k
1917 real(RP),
intent(out) :: dmsi,dmsj,dmsk
1918 real(RP),
intent(in) :: dgi,sgi,rhoi
1919 real(RP),
intent(in) :: dgj,sgj,rhoj
1920 real(RP),
intent(in) :: rknc, rkfm
1921 real(RP),
intent(in) :: lambda
1925 real(RP) :: dm0dt_i,dm3dt_i,dm6dt_i
1926 real(RP) :: dm0dt_j,dm3dt_j,dm6dt_j
1927 real(RP) :: dm0dt_k,dm3dt_k,dm6dt_k
1928 real(RP) :: mm2i,mm1i,m1i,m2i,m4i,m5i,m7i,m8i
1929 real(RP) :: mm2j,mm1j,m1j,m2j,m4j,m5j,m7j,m8j
1930 real(RP) :: mm1p5i,mm0p5i,m0p5i,m1p5i,m2p5i,m3p5i,m4p5i,m5p5i,m6p5i
1931 real(RP) :: mm1p5j,mm0p5j,m0p5j,m1p5j,m2p5j,m3p5j,m4p5j,m5p5j,m6p5j
1932 real(RP) :: dm6dt_nc_i,dm3dt_nc_i,dm0dt_nc_i
1933 real(RP) :: dm6dt_nc_j,dm3dt_nc_j,dm0dt_nc_j
1934 real(RP) :: dm6dt_nc_k,dm3dt_nc_k,dm0dt_nc_k
1935 real(RP) :: dm6dt_fm_i,dm3dt_fm_i,dm0dt_fm_i
1936 real(RP) :: dm6dt_fm_j,dm3dt_fm_j,dm0dt_fm_j
1937 real(RP) :: dm6dt_fm_k,dm3dt_fm_k,dm0dt_fm_k
1938 real(RP) :: bbb,gamma1,gamma2,alpha,beta
1965 mm2i=m0i*dgi**(-2._rp)*exp( 2.0_rp*(log(sgi)**2._rp))
1966 mm1i=m0i*dgi**(-1._rp)*exp( 0.5_rp*(log(sgi)**2._rp))
1967 m1i =m0i*dgi** 1._rp *exp( 0.5_rp*(log(sgi)**2._rp))
1968 m2i =m0i*dgi** 2._rp *exp( 2.0_rp*(log(sgi)**2._rp))
1970 m4i =m0i*dgi** 4._rp *exp( 8.0_rp*(log(sgi)**2._rp))
1971 m5i =m0i*dgi** 5._rp *exp(12.5_rp*(log(sgi)**2._rp))
1973 m7i =m0i*dgi** 7._rp *exp(24.5_rp*(log(sgi)**2._rp))
1975 mm2j=m0j*dgj**(-2._rp)*exp( 2.0_rp*(log(sgj)**2._rp))
1976 mm1j=m0j*dgj**(-1._rp)*exp( 0.5_rp*(log(sgj)**2._rp))
1977 m1j =m0j*dgj** 1._rp *exp( 0.5_rp*(log(sgj)**2._rp))
1978 m2j =m0j*dgj** 2._rp *exp( 2.0_rp*(log(sgj)**2._rp))
1980 m4j =m0j*dgj** 4._rp *exp( 8.0_rp*(log(sgj)**2._rp))
1981 m5j =m0j*dgj** 5._rp *exp(12.5_rp*(log(sgj)**2._rp))
1983 m7j =m0j*dgj** 7._rp *exp(24.5_rp*(log(sgj)**2._rp))
1985 dm0dt_nc_i = -rknc*(2._rp*m0i*m0j+ mm1i*m1j &
1987 +2.492e-2_rp*lambda*(m0i *mm1j+m1i*mm2j &
1988 + m0j *mm1i+m1j*mm2i) )
1989 dm3dt_nc_i = -rknc*(2._rp*m3i*m0j+ m2i *m1j &
1991 +2.492e-2_rp*lambda*(m3i *mm1j+m4i*mm2j &
1992 + m0j *m2i +m1j*m1i ) )
1993 dm6dt_nc_i = -rknc*(2._rp*m6i*m0j+ m5i *m1j &
1995 +2.492e-2_rp*lambda*(m6i *mm1j+m7i*mm2j &
1996 + m0j *m5i +m1j*m4i ) )
1997 dm0dt_nc_j = -rknc*(2._rp*m0i*m0j+ mm1i*m1j &
1999 +2.492e-2_rp*lambda*(m0i *mm1j+m1i*mm2j &
2000 + m0j *mm1i+m1j*mm2i) )
2001 dm3dt_nc_j = -rknc*(2._rp*m0i*m3j+ mm1i*m4j &
2003 +2.492e-2_rp*lambda*(m0i *m2j +m1i*m1j &
2004 + m3j *mm1i+m4j*mm2i) )
2005 dm6dt_nc_j = -rknc*(2._rp*m0i*m6j+ mm1i*m7j &
2007 +2.492e-2_rp*lambda*(m0i *m5j +m1i*m4j &
2008 + m6j *mm1i+m7j*mm2i) )
2009 dm0dt_nc_k = -dm0dt_nc_i
2010 dm3dt_nc_k = -dm3dt_nc_i-dm3dt_nc_j
2011 dm6dt_nc_k = -dm6dt_nc_i-dm6dt_nc_j &
2012 +2._rp*rknc*(2._rp*m3i*m3j+ m2i *m4j &
2014 +2.492e-2_rp*lambda*(m3i *m2j +m4i*m1j &
2015 + m3j *m2i +m4j*m1i) )
2019 mm1p5i=m0i*dgi**(-1.5_rp)*exp( 1.125_rp*(log(sgi)**2._rp) )
2020 mm0p5i=m0i*dgi**(-0.5_rp)*exp( 0.125_rp*(log(sgi)**2._rp) )
2021 m0p5i =m0i*dgi** 0.5_rp *exp( 0.125_rp*(log(sgi)**2._rp) )
2022 m1p5i =m0i*dgi** 1.5_rp *exp( 1.125_rp*(log(sgi)**2._rp) )
2023 m2p5i =m0i*dgi** 2.5_rp *exp( 3.125_rp*(log(sgi)**2._rp) )
2024 m3p5i =m0i*dgi** 3.5_rp *exp( 6.125_rp*(log(sgi)**2._rp) )
2025 m4p5i =m0i*dgi** 4.5_rp *exp(10.125_rp*(log(sgi)**2._rp) )
2026 m5p5i =m0i*dgi** 5.5_rp *exp(15.125_rp*(log(sgi)**2._rp) )
2027 m6p5i =m0i*dgi** 6.5_rp *exp(21.125_rp*(log(sgi)**2._rp) )
2028 m8i =m0i*dgi** 8._rp *exp(32.000_rp*(log(sgi)**2._rp) )
2031 mm1p5j=m0j*dgj**(-1.5_rp)*exp( 1.125_rp*(log(sgj)**2._rp) )
2032 mm0p5j=m0j*dgj**(-0.5_rp)*exp( 0.125_rp*(log(sgj)**2._rp) )
2033 m0p5j =m0j*dgj** 0.5_rp *exp( 0.125_rp*(log(sgj)**2._rp) )
2034 m1p5j =m0j*dgj** 1.5_rp *exp( 1.125_rp*(log(sgj)**2._rp) )
2035 m2p5j =m0j*dgj** 2.5_rp *exp( 3.125_rp*(log(sgj)**2._rp) )
2036 m3p5j =m0j*dgj** 3.5_rp *exp( 6.125_rp*(log(sgj)**2._rp) )
2037 m4p5j =m0j*dgj** 4.5_rp *exp(10.125_rp*(log(sgj)**2._rp) )
2038 m5p5j =m0j*dgj** 5.5_rp *exp(15.125_rp*(log(sgj)**2._rp) )
2039 m6p5j =m0j*dgj** 6.5_rp *exp(21.125_rp*(log(sgj)**2._rp) )
2040 m8j =m0j*dgj** 8._rp *exp(32.000_rp*(log(sgj)**2._rp) )
2044 beta =(1._rp-(sqrt(1._rp+alpha**3._rp)/(1._rp+sqrt(alpha**3._rp))))/(1._rp-1._rp/sqrt(2._rp))
2045 gamma1 =(sgi +alpha*sgj )/(1._rp+alpha)
2046 gamma2 =(sgi**2._rp +alpha*sgj**2._rp)/(1._rp+alpha)
2047 bbb = 1._rp+1.2_rp*beta*dexp(
real(-2._RP*gamma1,kind=
dp))-0.646_rp*beta*dexp(
real(-0.35_RP*gamma2,kind=
dp))
2049 dm0dt_fm_i=-bbb*rkfm*( &
2050 m0i *m0p5j +m2i *mm1p5j +2._rp*m1i *mm0p5j &
2051 + m0j *m0p5i +m2j *mm1p5i +2._rp*m1j *mm0p5i )
2052 dm3dt_fm_i=-bbb*rkfm*( &
2053 m3i *m0p5j +m5i *mm1p5j +2._rp*m4i *mm0p5j &
2054 + m0j *m3p5i +m2j *m1p5i +2._rp*m1j *m2p5i )
2055 dm6dt_fm_i=-bbb*rkfm*( &
2056 m6i *m0p5j +m8i *mm1p5j +2._rp*m7i *mm0p5j &
2057 + m0j *m6p5i +m2j *m4p5i +2._rp*m1j *m5p5i )
2058 dm0dt_fm_j= dm0dt_fm_i
2059 dm3dt_fm_j=-bbb*rkfm*( &
2060 m0i *m3p5j +m2i *m1p5j +2._rp*m1i *m2p5j &
2061 + m3j *m0p5i +m5j *mm1p5i +2._rp*m4j *mm0p5i )
2062 dm6dt_fm_j=-bbb*rkfm*( &
2063 m0i *m6p5j +m2i *m4p5j +2._rp*m1i *m5p5j &
2064 + m6j *m0p5i +m8j *mm1p5i +2._rp*m7j *mm0p5i )
2065 dm0dt_fm_k=-dm0dt_fm_i
2066 dm3dt_fm_k=-dm3dt_fm_i-dm3dt_fm_j
2067 dm6dt_fm_k=-dm6dt_fm_i-dm6dt_fm_j &
2068 +2._rp * bbb*rkfm*( &
2069 m3i *m3p5j +m5i *m1p5j +2._rp*m4i *m2p5j &
2070 + m3j *m3p5i +m5j *m1p5i +2._rp*m4j *m2p5i )
2073 if (dm0dt_fm_i+dm0dt_nc_i/=0._rp) &
2074 dm0dt_i = dm0dt_fm_i*dm0dt_nc_i/(dm0dt_fm_i+dm0dt_nc_i)
2075 if (dm3dt_fm_i+dm3dt_nc_i/=0._rp) &
2076 dm3dt_i = dm3dt_fm_i*dm3dt_nc_i/(dm3dt_fm_i+dm3dt_nc_i)
2077 if (dm6dt_fm_i+dm6dt_nc_i/=0._rp) &
2078 dm6dt_i = dm6dt_fm_i*dm6dt_nc_i/(dm6dt_fm_i+dm6dt_nc_i)
2079 if (dm0dt_fm_j+dm0dt_nc_j/=0._rp) &
2080 dm0dt_j = dm0dt_fm_j*dm0dt_nc_j/(dm0dt_fm_j+dm0dt_nc_j)
2081 if (dm3dt_fm_j+dm3dt_nc_j/=0._rp) &
2082 dm3dt_j = dm3dt_fm_j*dm3dt_nc_j/(dm3dt_fm_j+dm3dt_nc_j)
2083 if (dm6dt_fm_j+dm6dt_nc_j/=0._rp) &
2084 dm6dt_j = dm6dt_fm_j*dm6dt_nc_j/(dm6dt_fm_j+dm6dt_nc_j)
2085 if (dm0dt_fm_k+dm0dt_nc_k/=0._rp) &
2086 dm0dt_k = dm0dt_fm_k*dm0dt_nc_k/(dm0dt_fm_k+dm0dt_nc_k)
2089 if (dm6dt_fm_k+dm6dt_nc_k/=0._rp) &
2090 dm6dt_k = dm6dt_fm_k*dm6dt_nc_k/(dm6dt_fm_k+dm6dt_nc_k)
2092 dm0i = dm0dt_i * dtrest
2093 dm3i = dm3dt_i * dtrest
2094 dm6i = dm6dt_i * dtrest
2095 dmsi = dm3i * rhoi *pi6*1.e12_rp
2096 dm0j = dm0dt_j * dtrest
2097 dm3j = dm3dt_j * dtrest
2098 dm6j = dm6dt_j * dtrest
2099 dmsj = dm3j * rhoj *pi6*1.e12_rp
2100 dm0k = dm0dt_k * dtrest
2102 dm6k = dm6dt_k * dtrest
2107 end subroutine aero_inter
2111 subroutine diag_ds6(m0,m3,m6,m2,dg,sg,dm2)
2113 real(RP) :: m0,m2,m3,m6,dg,sg,m3_bar,m6_bar
2114 real(RP) :: m2_new,m2_old,dm2
2115 real(RP),
parameter :: sgmax=2.5_rp
2116 real(RP),
parameter :: rk1=3._rp
2117 real(RP),
parameter :: rk2=6._rp
2118 real(RP),
parameter :: ratio =rk1/rk2
2119 real(RP),
parameter :: rk1_hat=1._rp/(ratio*(rk2-rk1))
2120 real(RP),
parameter :: rk2_hat=ratio/(rk1-rk2)
2121 real(DP),
parameter :: tiny=1.e-50_dp
2124 if (m0 <= tiny .OR. m3 <= tiny .OR. m6 <= tiny)
then 2136 dg = m3_bar**rk1_hat*m6_bar**rk2_hat
2138 if (m3_bar/m6_bar**ratio < 1._rp)
then 2139 sg = exp(dsqrt(
real(2._RP/(rk1*(rk1-rk2)) &
2140 * log(m3_bar/m6_bar**ratio), kind=
dp )))
2141 m2 = m0*dg**2._rp*exp(2._rp*(log(sg)**2._rp))
2145 if (sg > sgmax)
then 2148 call diag_d2(m0,m3,sg, &
2153 if (m3_bar/m6_bar**ratio >= 1._rp)
then 2155 call diag_d2(m0,m3,sg, &
2161 dm2 = m2_old - m2_new
2165 end subroutine diag_ds6
2167 subroutine trans_ccn(aerosol_procs, aerosol_activ, t_ccn, t_cn, &
2168 n_ctg, n_kap_max, n_siz_max, n_atr, &
2169 ic_out, ia_m0, ia_m2, ia_m3, ik_out, n_siz, &
2170 ! rnum_out, nbins_out, dlog10d_out)
2171 rnum_out, nbins_out)
2175 integer,
intent(in) :: n_ctg, n_kap_max, n_siz_max, n_atr
2176 integer,
intent(in) :: ic_out, ik_out
2177 integer,
intent(in) :: ia_m0, ia_m2, ia_m3
2178 integer,
intent(in) :: n_siz(n_ctg)
2179 real(RP),
intent(in) :: aerosol_procs(n_atr,n_siz_max,n_kap_max,n_ctg)
2180 real(RP),
intent(in) :: aerosol_activ(n_atr,n_siz_max,n_kap_max,n_ctg)
2181 integer,
intent(in) :: nbins_out
2182 real(RP),
intent(out):: rnum_out(nbins_out)
2184 real(RP),
intent(out):: t_ccn
2185 real(RP),
intent(out):: t_cn
2186 real(RP) :: dlog10d_out
2188 real(RP) :: m0t,m2t,m3t,dgt,sgt,dm2
2189 real(RP) :: d_lw2,d_up2,dg2,sg2,fnum0,fnum1
2191 integer :: is0, is_out
2192 real(RP),
parameter :: d_max = 1.e-5_rp
2193 real(RP),
parameter :: d_min = 1.e-9_rp
2194 real(RP) :: d_lw(nbins_out), d_up(nbins_out)
2208 do is0 = 1, n_siz(ic_out)
2230 t_ccn = t_ccn + aerosol_activ(ia_m0,is0,ik_out,ic_out)
2231 t_cn = t_cn + aerosol_procs(ia_m0,is0,ik_out,ic_out)
2236 end subroutine trans_ccn
2251 real(RP),
intent(in) :: qtrc(
ka,
ia,
ja,
qa)
2252 real(RP),
intent(in) :: rh (
ka,
ia,
ja)
2255 re(:,:,:,:) = 0.0_rp
2270 m0_init, dg_init, sg_init, &
2271 d_min_inp, d_max_inp, &
2272 k_min_inp, k_max_inp, &
2283 saturation_pres2qsat_liq => atmos_saturation_pres2qsat_liq
2286 real(RP),
intent(inout) :: qtrc(
ka,
ia,
ja,
qa)
2287 real(RP),
intent(out) :: ccn (
ka,
ia,
ja)
2288 real(RP),
intent(in) :: dens(
ka,
ia,
ja)
2289 real(RP),
intent(in) :: rhot(
ka,
ia,
ja)
2290 real(RP),
intent(in) :: m0_init
2291 real(RP),
intent(in) :: dg_init
2292 real(RP),
intent(in) :: sg_init
2293 real(RP),
intent(in) :: d_min_inp(3)
2294 real(RP),
intent(in) :: d_max_inp(3)
2295 real(RP),
intent(in) :: k_min_inp(3)
2296 real(RP),
intent(in) :: k_max_inp(3)
2297 integer,
intent(in) :: n_kap_inp(3)
2299 integer,
parameter :: ia_m0 = 1
2300 integer,
parameter :: ia_m2 = 2
2301 integer,
parameter :: ia_m3 = 3
2302 integer,
parameter :: ia_ms = 4
2303 integer,
parameter :: ia_kp = 5
2304 integer,
parameter :: ik_out = 1
2306 real(RP) :: c_kappa = 0.3_rp
2307 real(RP),
parameter :: cleannumber = 1.e-3_rp
2309 real(RP),
parameter :: rhod_ae = 1.83_rp
2310 real(RP),
parameter :: conv_vl_ms = rhod_ae/1.e-12_rp
2313 real(RP) :: m0t, dgt, sgt, m2t, m3t, mst
2314 real(RP),
allocatable :: aerosol_procs(:,:,:,:)
2315 real(RP),
allocatable :: aerosol_activ(:,:,:,:)
2316 real(RP),
allocatable :: emis_procs (:,:,:,:)
2318 real(RP) :: conc_gas(gas_ctg)
2319 integer :: n_siz_max, n_kap_max, n_ctg
2326 real(RP),
allocatable :: d_lw(:,:), d_ct(:,:), d_up(:,:)
2327 real(RP),
allocatable :: k_lw(:,:), k_ct(:,:), k_up(:,:)
2328 real(RP) :: dlogd, dk
2329 real(RP),
allocatable :: d_min(:)
2330 real(RP),
allocatable :: d_max(:)
2331 integer,
allocatable :: n_kap(:)
2332 real(RP),
allocatable :: k_min(:)
2333 real(RP),
allocatable :: k_max(:)
2335 real(RP) :: pott, qdry, pres
2336 real(RP) :: temp, cpa, cva, qsat_tmp, ssliq, rmoist
2339 integer :: ia0, ik, is0, ic, k, i, j, it, iq
2346 allocate( d_min(n_ctg) )
2347 allocate( d_max(n_ctg) )
2348 allocate( n_kap(n_ctg) )
2349 allocate( k_min(n_ctg) )
2350 allocate( k_max(n_ctg) )
2353 d_min(1:n_ctg) = d_min_inp(1:n_ctg)
2354 d_max(1:n_ctg) = d_max_inp(1:n_ctg)
2355 n_kap(1:n_ctg) = n_kap_inp(1:n_ctg)
2356 k_min(1:n_ctg) = k_min_inp(1:n_ctg)
2357 k_max(1:n_ctg) = k_max_inp(1:n_ctg)
2364 n_trans = n_trans + nsiz(ic) * nkap(ic) * n_atr
2365 n_siz_max = max(n_siz_max, nsiz(ic))
2366 n_kap_max = max(n_kap_max, nkap(ic))
2369 allocate( aerosol_procs(n_atr,n_siz_max,n_kap_max,n_ctg) )
2370 allocate( aerosol_activ(n_atr,n_siz_max,n_kap_max,n_ctg) )
2371 allocate( emis_procs(n_atr,n_siz_max,n_kap_max,n_ctg) )
2372 aerosol_procs(:,:,:,:) = 0._rp
2373 aerosol_activ(:,:,:,:) = 0._rp
2374 emis_procs(:,:,:,:) = 0._rp
2383 allocate(d_lw(n_siz_max,n_ctg))
2384 allocate(d_ct(n_siz_max,n_ctg))
2385 allocate(d_up(n_siz_max,n_ctg))
2386 allocate(k_lw(n_kap_max,n_ctg))
2387 allocate(k_ct(n_kap_max,n_ctg))
2388 allocate(k_up(n_kap_max,n_ctg))
2398 dlogd = (log(d_max(ic)) - log(d_min(ic)))/
real(NSIZ(ic),kind=
rp)
2400 do is0 = 1, nsiz(ic)
2401 d_lw(is0,ic) = exp(log(d_min(ic))+dlogd*
real(is0-1,kind=RP) )
2402 d_ct(is0,ic) = exp(log(d_min(ic))+dlogd*(
real(is0 ,kind=
rp)-0.5_rp))
2403 d_up(is0,ic) = exp(log(d_min(ic))+dlogd*
real(is0 ,kind=RP) )
2405 dk = (k_max(ic) - k_min(ic))/
real(n_kap(ic),kind=
rp)
2406 do ik = 1, n_kap(ic)
2407 k_lw(ik,ic) = k_min(ic) + dk *
real(ik-1,kind=
rp)
2408 k_ct(ik,ic) = k_min(ic) + dk *(
real(ik ,kind=
rp)-0.5_rp)
2409 k_up(ik,ic) = k_min(ic) + dk *
real(ik ,kind=
rp)
2419 if ( m0t <= cleannumber )
then 2423 if(
io_l )
write(
io_fid_log,*)
'*** WARNING! Initial aerosol number is set as ', cleannumber,
'[#/m3]' 2426 m2t = m0t*dgt**(2.d0) *dexp(2.0d0 *(dlog(
real(sgt,kind=
dp))**2.d0))
2427 m3t = m0t*dgt**(3.d0) *dexp(4.5d0 *(dlog(
real(sgt,kind=
dp))**2.d0))
2428 mst = m3t*pi6*conv_vl_ms
2432 do ik = 1, n_kap(ic)
2433 do is0 = 1, nsiz(ic)
2434 if (dgt >= d_lw(is0,ic) .and. dgt < d_up(is0,ic))
then 2435 aerosol_procs(ia_m0,is0,ik,ic) = aerosol_procs(ia_m0,is0,ik,ic) + m0t
2436 aerosol_procs(ia_m2,is0,ik,ic) = aerosol_procs(ia_m2,is0,ik,ic) + m2t
2437 aerosol_procs(ia_m3,is0,ik,ic) = aerosol_procs(ia_m3,is0,ik,ic) + m3t
2438 aerosol_procs(ia_ms,is0,ik,ic) = aerosol_procs(ia_ms,is0,ik,ic) + mst*1.e-9_rp
2439 elseif (dgt < d_lw(1,ic))
then 2440 aerosol_procs(ia_m0,1 ,ik,ic) = aerosol_procs(ia_m0,1 ,ik,ic) + m0t
2441 aerosol_procs(ia_m2,1 ,ik,ic) = aerosol_procs(ia_m2,1 ,ik,ic) + m2t
2442 aerosol_procs(ia_m3,1 ,ik,ic) = aerosol_procs(ia_m3,1 ,ik,ic) + m3t
2443 aerosol_procs(ia_ms,1 ,ik,ic) = aerosol_procs(ia_ms,1 ,ik,ic) + mst*1.e-9_rp
2444 elseif (dgt >= d_up(nsiz(ic),ic))
then 2445 aerosol_procs(ia_m0,nsiz(ic),ik,ic) = aerosol_procs(ia_m0,nsiz(ic),ik,ic) + m0t
2446 aerosol_procs(ia_m2,nsiz(ic),ik,ic) = aerosol_procs(ia_m2,nsiz(ic),ik,ic) + m2t
2447 aerosol_procs(ia_m3,nsiz(ic),ik,ic) = aerosol_procs(ia_m3,nsiz(ic),ik,ic) + m3t
2448 aerosol_procs(ia_ms,nsiz(ic),ik,ic) = aerosol_procs(ia_ms,nsiz(ic),ik,ic) + mst*1.e-9_rp
2454 conc_gas(:) = 0.0_rp
2461 do is0 = 1, nsiz(ic)
2463 qtrc(k,i,j,qaes+it) = aerosol_procs(ia0,is0,ik,ic) / dens(k,i,j)
2471 qtrc(k,i,j,qaes+it) = conc_gas(ic) / dens(k,i,j) * 1.e-9_rp
2483 if (
i_qv > 0 )
then 2490 temp = pres / ( dens(k,i,j) * rmoist )
2492 call saturation_pres2qsat_liq( qsat_tmp, temp, pres )
2494 ssliq = qtrc(k,i,j,
i_qv) / qsat_tmp - 1.0_rp
2499 call aerosol_activation( c_kappa, ssliq, temp, ia_m0, ia_m2, ia_m3, &
2500 n_atr, n_siz_max, n_kap_max, n_ctg, nsiz, n_kap, &
2501 d_ct, aerosol_procs, aerosol_activ )
2503 do is0 = 1, nsiz(ic_mix)
2504 ccn(k,i,j) = ccn(k,i,j) + aerosol_activ(ia_m0,is0,ik_out,ic_mix)
integer, public is
start point of inner domain: x, local
real(rp), public const_cvdry
specific heat (dry air,constant volume) [J/kg/K]
integer, public je
end point of inner domain: y, local
real(rp), public const_cpdry
specific heat (dry air,constant pressure) [J/kg/K]
module ATMOSPHERE / Saturation adjustment
subroutine, public prc_mpistop
Abort MPI.
real(dp), public time_nowsec
subday part of current time [sec]
integer, parameter, public n_ae
real(rp), dimension(qa_max), public tracer_r
logical, public io_l
output log or not? (this process)
character(len=h_mid), dimension(:), allocatable, target, public atmos_phy_ae_kajino13_desc
subroutine, public atmos_phy_ae_kajino13_config(AE_TYPE, QA, QS)
Config.
real(dp), public time_startdaysec
second of start time [sec]
integer, public ke
end point of inner domain: z, local
real(rp), dimension(n_ae), target, public atmos_phy_ae_kajino13_dens
real(rp), dimension(qa_max), public tracer_cv
real(rp), public const_rdry
specific gas constant (dry air) [J/kg/K]
real(rp), public const_undef
character(len=h_short), dimension(:), allocatable, target, public atmos_phy_ae_kajino13_name
subroutine, public atmos_phy_ae_kajino13_mkinit(QTRC, CCN, DENS, RHOT, m0_init, dg_init, sg_init, d_min_inp, d_max_inp, k_min_inp, k_max_inp, n_kap_inp)
real(rp), dimension(qa_max), public tracer_cp
logical, public io_nml
output log or not? (for namelist, this process)
integer, public ia
of whole cells: x, local, with HALO
integer, public ka
of whole cells: z, local, with HALO
real(rp), public const_pre00
pressure reference [Pa]
subroutine, public atmos_phy_ae_kajino13_setup
Setup.
subroutine, public atmos_phy_ae_kajino13(QQA, DENS, MOMZ, MOMX, MOMY, RHOT, EMIT, NREG, QTRC, CN, CCN, RHOQ_t_AE)
Aerosol Microphysics.
integer, public js
start point of inner domain: y, local
character(len=h_short), dimension(:), allocatable, target, public atmos_phy_ae_kajino13_unit
real(dp), public time_dtsec_atmos_phy_ae
time interval of physics(aerosol ) [sec]
real(rp), parameter, public const_rvap
specific gas constant (water vapor) [J/kg/K]
subroutine aerosol_zerochem(deltt, temp_k, pres_pa, super, flag_npf, flag_cond, flag_coag, aerosol_procs, conc_gas, emis_procs, emis_gas, aerosol_activ)
integer, public ks
start point of inner domain: z, local
subroutine, public atmos_phy_ae_kajino13_effectiveradius(Re, QTRC, RH)
Calculate Effective Radius.
subroutine, public prof_rapstart(rapname_base, level)
Start raptime.
integer, public ie
end point of inner domain: x, local
module ATMOSPHERE / Physics Aerosol Microphysics
real(rp), public const_pi
pi
integer, public io_fid_conf
Config file ID.
subroutine, public tracer_regist(QS, NQ, NAME, DESC, UNIT, CV, CP, R, ADVC, MASS)
Regist tracer.
integer, public io_fid_log
Log file ID.
real(rp), public const_mdry
mass weight (dry air) [g/mol]
subroutine, public prof_rapend(rapname_base, level)
Save raptime.
integer, parameter, public rp
integer, parameter, public dp
integer, public io_fid_nml
Log file ID (only for output namelist)
real(rp), dimension(qa_max), public tracer_mass
subroutine aerosol_nucleation(conc_h2so4, J_1nm)
integer, public ja
of whole cells: y, local, with HALO