Soot
Contents |
Description
The carma-soot branch of WACCM handles black carbon soot aerosol. Mike Mills developed this branch and used in simulating smoke produced following a nuclear war.
Model Configuration
Tracers
Before building WACCM, instruct WACCM to keep track of one additional tracer (SOOT01), in addition to the default configuration of 63 in WACCM:
setenv WACCM_CONFIGURE_OPTS '-nadv 64'
If your simulations have more than 1 tracer, add 63 to this number and use the command above.
Soot radiative feedback
Radiative properties of soot are known to WACCM. In order to include radiative feedback from CARMA's soot bins in WACCM, we simply need to make a couple of modifications to the routine source/models/atm/cam/src/physics/cam1/aerosol_intr.F90:
line 49, don't use WACCM's carbon aerosol because we want to use CARMA's:
! Set this flag to .TRUE. to turn on carbon logical, private, parameter :: def_carbon = .FALSE. ! default logical, private :: carbon = def_carbon
line 53, switch radiative feedback on for carbon:
! Set this flag to .TRUE. to turn on carbon feedback in ! set_aerosol_from_prognostics() logical, private, parameter :: def_feedback_carbon = .TRUE. ! switch to TRUE for soot feedback, FALSE for control logical, private :: feedback_carbon = def_feedback_carbon
line 330:
! Allow carbon feedback without prognostic carbon for nuclear soot - MJM 2006.10.14
! error check...
if (.not. chem_is('trop_mozart') ) then
if (feedback_carbon.and.(.not.carbon)) then
! write(6,*) 'ERROR: AEROSOL_SETOPTS: Feedback of prognostic'
! write(6,*) 'carbon aerosols is only allowed when these'
! write(6,*) 'prognostic aerosols are enabled.'
! call endrun
write(6,*)'Soot radiative feedback on'
endif
endif
line 871:
if (feedback_carbon) then
! if (trim(cnst_name(m)) == 'BCPHO' .or. trim(cnst_name(m)) == 'CB1' ) then
if (trim(cnst_name(m)) == 'SOOT' .or. trim(cnst_name(m)) == 'SOOT01' ) then
! write (6,*) ' Soot found:',state%q(5,54,m)
! write (6,*) ' BCPHO found '
! write (6,*) ' SOOT found '
aeromix(:ncol,:,idxBCPHO) = state%q(:ncol,:,m)
History variables
The following reaction rates affecting ozone were added to the history output:
'J_O2_a', 'J_O2_b', 'R_NO_HO2', 'R_CH3O2_NO', 'R_O3_O', 'R_O_O', 'R_NO2_O', 'R_HO2_O3' , 'R_HO2_O' , 'R_H_O3' , 'R_OH_O' , 'R_CLO_O' , 'J_Cl2O2' , 'R_BrO_ClOa' , 'R_BrO_ClOb', 'R_BrO_BrO' , 'R_BrO_O' , 'J_HOCl' , 'J_HOBr' , 'J_NO3_b', 'R_O2_O', 'J_O3_a', 'J_O3_b', 'R_O1D_H2O', 'R_N_O2', 'R_NO_ON', 'J_NO', 'R_O2_O', 'J_O3_a', 'J_O3_b', 'R_O1D_H2O', 'R_N_O2', 'R_NO_ON', 'J_NO'
The following code was added to mo_gas_phase_chemdr.F90:
!-----------------------------------------------------------------------
! ... Output loss rates for Ox = O3 + O
!-----------------------------------------------------------------------
! O + O + M -> O2 + M
do k = 1,pver
wrk(:,k) = reaction_rates(:,k,rid_usr2)*vmr(:,k,id_o)*vmr(:,k,id_o)
wrk(:,k) = wrk(:,k)*invariants(:,k,indexm) ! multiply by air density M (molec/cm3)
end do
call outfld( 'R_O_O', wrk, ncol, lchnk )
! Cl2O2 + hv -> 2*Cl
do k = 1,pver
wrk(:,k) = reaction_rates(:,k,rid_jcl2o2) * vmr(:,k,id_cl2o2)
wrk(:,k) = wrk(:,k)*invariants(:,k,indexm) ! multiply by air density M (molec/cm3)
end do
call outfld( 'J_Cl2O2', wrk, ncol, lchnk )
! ClO + BrO -> Br + Cl + O2
do k = 1,pver
wrk(:,k) = reaction_rates(:,k,rid_r0184) * vmr(:,k,id_bro) * vmr(:,k,id_clo)
wrk(:,k) = wrk(:,k)*invariants(:,k,indexm) ! multiply by air density M (molec/cm3)
end do
call outfld( 'R_BrO_ClOa', wrk, ncol, lchnk )
! ClO + BrO -> BrCl + O2
do k = 1,pver
wrk(:,k) = reaction_rates(:,k,rid_r0185) * vmr(:,k,id_bro) * vmr(:,k,id_clo)
wrk(:,k) = wrk(:,k)*invariants(:,k,indexm) ! multiply by air density M (molec/cm3)
end do
call outfld( 'R_BrO_ClOb', wrk, ncol, lchnk )
! BrO + BrO -> 2Br + O2
do k = 1,pver
wrk(:,k) = reaction_rates(:,k,rid_r0186) * vmr(:,k,id_bro) * vmr(:,k,id_bro)
wrk(:,k) = wrk(:,k)*invariants(:,k,indexm) ! multiply by air density M (molec/cm3)
end do
call outfld( 'R_BrO_BrO', wrk, ncol, lchnk )
! BrO + O -> Br + O2
do k = 1,pver
wrk(:,k) = reaction_rates(:,k,rid_r0178) * vmr(:,k,id_bro) * vmr(:,k,id_o)
wrk(:,k) = wrk(:,k)*invariants(:,k,indexm) ! multiply by air density M (molec/cm3)
end do
call outfld( 'R_BrO_O', wrk, ncol, lchnk )
! HOCl + hv -> OH + Cl
do k = 1,pver
wrk(:,k) = reaction_rates(:,k,rid_jhocl) * vmr(:,k,id_hocl)
wrk(:,k) = wrk(:,k)*invariants(:,k,indexm) ! multiply by air density M (molec/cm3)
end do
call outfld( 'J_HOCl', wrk, ncol, lchnk )
! HOBr + hv -> OH + Br
do k = 1,pver
wrk(:,k) = reaction_rates(:,k,rid_jhobr) * vmr(:,k,id_hobr)
wrk(:,k) = wrk(:,k)*invariants(:,k,indexm) ! multiply by air density M (molec/cm3)
end do
call outfld( 'J_HOBr', wrk, ncol, lchnk )
! O + O3 -> 2O2
do k = 1,pver
wrk(:,k) = reaction_rates(:,k,rid_cph1) * vmr(:,k,id_o) * vmr(:,k,id_o3)
wrk(:,k) = wrk(:,k)*invariants(:,k,indexm) ! multiply by air density M (molec/cm3)
end do
call outfld( 'R_O3_O', wrk, ncol, lchnk )
! Catalytic NOx cycle competition:
!
! NO + O3 -> NO2 + O2 | NO + O3 -> NO2 + O2
! (cph13) NO2 + O -> NO + O2 | NO2 + hv -> NO + O
! ------------------ | O + O2 + M -> O3 + M
! Net: O + O3 -> 2O2 | ----------------------
! | Net: Null
!
! Hence the rate of Ox destruction is 2*(cph13)*[NO2]*[O]
do k = 1,pver
wrk(:,k) = reaction_rates(:,k,rid_cph13)*vmr(:,k,id_no2)*vmr(:,k,id_o)
wrk(:,k) = wrk(:,k)*invariants(:,k,indexm) ! multiply by air density M (molec/cm3)
end do
call outfld( 'R_NO2_O', wrk, ncol, lchnk )
! HO2 + O3 -> OH + 2O2
do k = 1,pver
wrk(:,k) = reaction_rates(:,k,rid_cph9)*vmr(:,k,id_ho2)*vmr(:,k,id_o3)
wrk(:,k) = wrk(:,k)*invariants(:,k,indexm) ! multiply by air density M (molec/cm3)
end do
call outfld( 'R_HO2_O3', wrk, ncol, lchnk )
! HO2 + O -> OH + O2
do k = 1,pver
wrk(:,k) = reaction_rates(:,k,rid_cph4)*vmr(:,k,id_ho2)*vmr(:,k,id_o)
wrk(:,k) = wrk(:,k)*invariants(:,k,indexm) ! multiply by air density M (molec/cm3)
end do
call outfld( 'R_HO2_O', wrk, ncol, lchnk )
! H + O3 -> OH + O2
do k = 1,pver
wrk(:,k) = reaction_rates(:,k,rid_cph7)*vmr(:,k,id_h)*vmr(:,k,id_o3)
wrk(:,k) = wrk(:,k)*invariants(:,k,indexm) ! multiply by air density M (molec/cm3)
end do
call outfld( 'R_H_O3', wrk, ncol, lchnk )
! OH + O -> H + O2
do k = 1,pver
wrk(:,k) = reaction_rates(:,k,rid_cph3)*vmr(:,k,id_oh)*vmr(:,k,id_o)
wrk(:,k) = wrk(:,k)*invariants(:,k,indexm) ! multiply by air density M (molec/cm3)
end do
call outfld( 'R_OH_O', wrk, ncol, lchnk )
! ClO + O -> Cl + O2
do k = 1,pver
wrk(:,k) = 2.*reaction_rates(:,k,rid_r0156)*vmr(:,k,id_clo)*vmr(:,k,id_o)
wrk(:,k) = wrk(:,k)*invariants(:,k,indexm) ! multiply by air density M (molec/cm3)
end do
call outfld( 'R_CLO_O', wrk, ncol, lchnk )
! NO3 + hv -> NO + O2
do k = 1,pver
wrk(:,k) = 2.*reaction_rates(:,k,rid_jno3_b)*vmr(:,k,id_no3)
wrk(:,k) = wrk(:,k)*invariants(:,k,indexm) ! multiply by air density M (molec/cm3)
end do
call outfld( 'J_NO3_b', wrk, ncol, lchnk )
Known Issues
- Simulations were run with an inverted scaling of sedimentation velocities when passing from CARMA to WACCM and back in carma.F90. They should be re-run to ensure this does not affect results.
- Output of the N+O2 reaction rate used the wrong rate constant. This has been fixed as of March 17, 2008. This reaction is not a rate-limiting step in ozone catalysis, and thereby does not impact the results.