Line data Source code
1 : module chem_prod_loss_diags
2 : use shr_kind_mod, only : r8 => shr_kind_r8
3 : use chem_mods, only : clscnt1, clscnt4, gas_pcnst, clsmap, permute
4 : use ppgrid, only : pver
5 : use chem_mods, only : rxntot
6 : use cam_history, only : addfld, outfld, add_default
7 : use mo_tracname, only : solsym
8 :
9 : implicit none
10 :
11 : private
12 : public :: chem_prod_loss_diags_init
13 : public :: chem_prod_loss_diags_out
14 :
15 : contains
16 :
17 : !-----------------------------------------------------------------------------
18 : !-----------------------------------------------------------------------------
19 0 : subroutine chem_prod_loss_diags_init
20 : use phys_control, only : phys_getopts
21 :
22 :
23 : integer :: i,j
24 : logical :: history_scwaccm_forcing
25 0 : call phys_getopts( history_scwaccm_forcing_out = history_scwaccm_forcing )
26 :
27 : do i = 1,clscnt4
28 : j = clsmap(i,4)
29 : call addfld( trim(solsym(j))//'_CHMP', (/ 'lev' /), 'I', '/cm3/s', 'chemical production rate' )
30 : call addfld( trim(solsym(j))//'_CHML', (/ 'lev' /), 'I', '/cm3/s', 'chemical loss rate' )
31 : if (history_scwaccm_forcing ) then
32 : if ( trim(solsym(j))=='CH4' .or. &
33 : trim(solsym(j))=='CFC11' .or. &
34 : trim(solsym(j))=='CFC12' .or. &
35 : trim(solsym(j))=='N2O' ) then
36 : call add_default( trim(solsym(j))//'_CHML', 1, ' ')
37 : endif
38 : endif
39 : enddo
40 : do i = 1,clscnt1
41 : j = clsmap(i,1)
42 : if (history_scwaccm_forcing ) then
43 : if ( trim(solsym(j))=='CH4' .or. &
44 : trim(solsym(j))=='CFC11' .or. &
45 : trim(solsym(j))=='CFC12' .or. &
46 : trim(solsym(j))=='N2O' ) then
47 : call add_default( trim(solsym(j))//'_CHML', 1, ' ')
48 : endif
49 : endif
50 : enddo
51 :
52 0 : call addfld('H_PEROX_CHMP', (/ 'lev' /), 'I', '/cm3/s', 'total ROOH production rate' ) !PJY changed "RO2" to "ROOH"
53 :
54 0 : end subroutine chem_prod_loss_diags_init
55 :
56 : !-----------------------------------------------------------------------------
57 : !-----------------------------------------------------------------------------
58 0 : subroutine chem_prod_loss_diags_out( ncol, lchnk, base_sol, reaction_rates, prod_in, loss_in, xhnm )
59 :
60 : integer, intent(in) :: ncol, lchnk
61 : real(r8), intent(in) :: base_sol(ncol,pver,gas_pcnst)
62 : real(r8), intent(in) :: reaction_rates(ncol,pver,max(1,rxntot))
63 : real(r8), intent(in) :: prod_in(ncol,pver,max(1,clscnt4))
64 : real(r8), intent(in) :: loss_in(ncol,pver,max(1,clscnt4))
65 : real(r8), intent(in) :: xhnm(ncol,pver)
66 :
67 0 : real(r8), dimension(ncol,pver,max(1,clscnt4)) :: prod_out, loss_out
68 0 : real(r8), dimension(ncol,pver) :: prod_hydrogen_peroxides_out
69 : integer :: lev, i, k, j, m
70 :
71 0 : level_loop : do lev = 1,pver
72 0 : column_loop : do i = 1,ncol
73 :
74 : !-----------------------------------------------------------------------
75 : ! ... Prod/Loss history buffers...
76 : !-----------------------------------------------------------------------
77 0 : cls_loop2: do k = 1,clscnt4
78 : j = clsmap(k,4)
79 : m = permute(k,4)
80 : prod_out(i,lev,k) = prod_in(i,lev,m)
81 : loss_out(i,lev,k) = loss_in(i,lev,m)
82 : end do cls_loop2
83 : end do column_loop
84 : end do level_loop
85 :
86 0 : prod_hydrogen_peroxides_out(:,:) = 0._r8
87 :
88 : do i = 1,clscnt4
89 : j = clsmap(i,4)
90 : prod_out(:,:,i) = prod_out(:,:,i)*xhnm(:,:)
91 : loss_out(:,:,i) = loss_out(:,:,i)*xhnm(:,:)
92 : call outfld( trim(solsym(j))//'_CHMP', prod_out(:,:,i), ncol, lchnk )
93 : call outfld( trim(solsym(j))//'_CHML', loss_out(:,:,i), ncol, lchnk )
94 : !
95 : ! added code for ROOH production !PJY not "RO2 production"
96 : !
97 : if ( trim(solsym(j)) == 'ALKOOH' &
98 : .or.trim(solsym(j)) == 'C2H5OOH' &
99 : .or.trim(solsym(j)) == 'CH3OOH' & !PJY added this
100 : .or.trim(solsym(j)) == 'CH3COOH' &
101 : .or.trim(solsym(j)) == 'CH3COOOH' &
102 : .or.trim(solsym(j)) == 'C3H7OOH' & !PJY corrected this (from CH3H7OOH)
103 : .or.trim(solsym(j)) == 'EOOH' &
104 : .or.trim(solsym(j)) == 'ISOPOOH' &
105 : .or.trim(solsym(j)) == 'MACROOH' &
106 : .or.trim(solsym(j)) == 'MEKOOH' &
107 : .or.trim(solsym(j)) == 'POOH' &
108 : .or.trim(solsym(j)) == 'ROOH' &
109 : .or.trim(solsym(j)) == 'TERPOOH' &
110 : .or.trim(solsym(j)) == 'TOLOOH' &
111 : .or.trim(solsym(j)) == 'XOOH' ) then
112 : prod_hydrogen_peroxides_out(:,:) = prod_hydrogen_peroxides_out(:,:) + prod_out(:,:,i)
113 : end if
114 : enddo
115 :
116 0 : call outfld( 'H_PEROX_CHMP', prod_hydrogen_peroxides_out(:,:), ncol, lchnk )
117 :
118 0 : end subroutine chem_prod_loss_diags_out
119 :
120 : end module chem_prod_loss_diags
121 :
|