Line data Source code
1 : !-----------------------------------------------------------------
2 : ! Manages the reaction rates of the green house gas species.
3 : ! This is used with the reduced ghg chemical mechanism.
4 : !
5 : ! Created by: Francis Vitt -- 20 Aug 2008
6 : !-----------------------------------------------------------------
7 : module mo_ghg_chem
8 :
9 : use shr_kind_mod, only : r8 => shr_kind_r8
10 : use boundarydata, only : boundarydata_type, boundarydata_init, boundarydata_update
11 : use physics_types, only : physics_state
12 : use cam_abortutils, only : endrun
13 : use ppgrid, only : pcols, pver, begchunk, endchunk
14 :
15 : implicit none
16 :
17 : private
18 : save
19 :
20 : public :: ghg_chem_set_rates
21 : public :: ghg_chem_set_flbc
22 : public :: ghg_chem_init
23 : public :: ghg_chem_timestep_init
24 : public :: ghg_chem_final
25 :
26 : integer, parameter :: ncnst=4 ! number of constituents
27 : type(boundarydata_type) :: chemdata
28 : character(len=6), dimension(ncnst), parameter :: nc_names = & ! constituent names
29 : (/'TN2O ', 'TCH4 ', 'TCFC11', 'TCFC12'/)
30 :
31 : integer :: n2o_rxt, ch4_rxt, cfc11_rxt, cfc12_rxt, lyman_alpha_rxt
32 : integer :: n2o_ndx, ch4_ndx, cfc11_ndx, cfc12_ndx
33 : integer :: ghg_ndx(ncnst)
34 : character(len=6) :: ghg_bnd_names(ncnst)
35 :
36 : logical :: lyman_alpha = .false.
37 : type(boundarydata_type) :: h2orate_data
38 : character(len=4), parameter :: h2orate_name = 'jh2o'
39 :
40 : contains
41 :
42 : !-----------------------------------------------------------------
43 : !-----------------------------------------------------------------
44 0 : subroutine ghg_chem_init(phys_state, bndtvg, h2orates)
45 : use mo_chem_utls, only : get_rxt_ndx, get_spc_ndx
46 : use cam_history, only : addfld
47 :
48 : implicit none
49 :
50 : type(physics_state), intent(in) :: phys_state(begchunk:endchunk)
51 : character(len=*), intent(in) :: bndtvg ! pathname for greenhouse gas loss rate
52 : character(len=*),optional, intent(in) :: h2orates ! lyman-alpha h2o loss rates
53 :
54 : integer :: ids(8)
55 : integer :: m,mm
56 :
57 0 : n2o_rxt = get_rxt_ndx( 'n2o_loss' )
58 0 : ch4_rxt = get_rxt_ndx( 'ch4_loss' )
59 0 : cfc11_rxt = get_rxt_ndx( 'cfc11_loss' )
60 0 : cfc12_rxt = get_rxt_ndx( 'cfc12_loss' )
61 0 : lyman_alpha_rxt = get_rxt_ndx( 'lyman_alpha' )
62 :
63 0 : n2o_ndx = get_spc_ndx('N2O')
64 0 : ch4_ndx = get_spc_ndx('CH4')
65 0 : cfc11_ndx = get_spc_ndx('CFC11')
66 0 : cfc12_ndx = get_spc_ndx('CFC12')
67 :
68 0 : ids(1) = n2o_rxt
69 0 : ids(2) = ch4_rxt
70 0 : ids(3) = cfc11_rxt
71 0 : ids(4) = cfc12_rxt
72 0 : ids(5) = n2o_ndx
73 0 : ids(6) = ch4_ndx
74 0 : ids(7) = cfc11_ndx
75 0 : ids(8) = cfc12_ndx
76 :
77 0 : if( any( ids < 1 ) ) then
78 0 : call endrun('need to configure with ghg chemistry mechanism')
79 : endif
80 :
81 0 : call boundarydata_init(bndtvg,phys_state,nc_names,ncnst,chemdata)
82 :
83 0 : if ( present( h2orates ) ) then
84 0 : if ( len_trim( h2orates ) > 0 .and. lyman_alpha_rxt > 0 ) then
85 0 : lyman_alpha = .true.
86 0 : call boundarydata_init(h2orates,phys_state,(/h2orate_name/),1,h2orate_data)
87 : endif
88 : endif
89 :
90 0 : call addfld( 'GHG_CFC11_R', (/ 'lev' /), 'I', '1/sec', 'prescribed cfc11 loss rate for ghg chem' )
91 0 : call addfld( 'GHG_CFC12_R', (/ 'lev' /), 'I', '1/sec', 'prescribed cfc12 loss rate for ghg chem' )
92 0 : call addfld( 'GHG_N2O_R', (/ 'lev' /), 'I', '1/sec', 'prescribed n2o loss rate for ghg chem' )
93 0 : call addfld( 'GHG_CH4_R', (/ 'lev' /), 'I', '1/sec', 'prescribed ch4 loss rate for ghg chem' )
94 0 : call addfld( 'GHG_H2O_R', (/ 'lev' /), 'I', '1/sec', 'prescribed h2o loss rate for ghg chem' )
95 :
96 0 : ghg_ndx = (/ n2o_ndx, ch4_ndx, cfc11_ndx, cfc12_ndx /)
97 0 : ghg_bnd_names = (/ 'N2OVMR', 'CH4VMR', 'F11VMR', 'F12VMR' /)
98 :
99 0 : end subroutine ghg_chem_init
100 :
101 : !-----------------------------------------------------------------
102 : !-----------------------------------------------------------------
103 0 : subroutine ghg_chem_timestep_init(phys_state)
104 : implicit none
105 :
106 : type(physics_state), intent(in) :: phys_state(begchunk:endchunk)
107 :
108 0 : call boundarydata_update(phys_state,chemdata)
109 0 : if (lyman_alpha) then
110 0 : call boundarydata_update(phys_state,h2orate_data)
111 : endif
112 0 : end subroutine ghg_chem_timestep_init
113 :
114 : !-----------------------------------------------------------------
115 : !-----------------------------------------------------------------
116 0 : subroutine ghg_chem_set_rates( rxn_rates, latmapback, zen_angle, ncol, lchnk )
117 : use chem_mods, only : rxntot
118 : use cam_history, only : outfld
119 : use mo_constants, only : pi
120 :
121 : implicit none
122 :
123 : integer, intent(in) :: ncol ! number columns in chunk
124 : real(r8), intent(inout) :: rxn_rates(ncol,pver,rxntot) ! ghg loss rates
125 : integer, intent(in) :: latmapback(pcols)
126 : real(r8), intent(in) :: zen_angle(ncol)
127 : integer, intent(in) :: lchnk ! chunk index
128 :
129 : integer :: i,k
130 : real(r8), parameter :: half_pi = pi/2._r8
131 :
132 0 : do k=1,pver-2
133 0 : do i=1,ncol
134 0 : rxn_rates(i,k,n2o_rxt) = chemdata%datainst(latmapback(i),k,lchnk,1)
135 : rxn_rates(i,k,ch4_rxt) = chemdata%datainst(latmapback(i),k,lchnk,2)
136 : rxn_rates(i,k,cfc11_rxt) = chemdata%datainst(latmapback(i),k,lchnk,3)
137 0 : rxn_rates(i,k,cfc12_rxt) = chemdata%datainst(latmapback(i),k,lchnk,4)
138 : enddo
139 : enddo
140 :
141 0 : rxn_rates(:ncol,pver-1:pver,n2o_rxt) = 0._r8
142 : rxn_rates(:ncol,pver-1:pver,ch4_rxt) = 0._r8
143 : rxn_rates(:ncol,pver-1:pver,cfc11_rxt) = 0._r8
144 : rxn_rates(:ncol,pver-1:pver,cfc12_rxt) = 0._r8
145 :
146 : call outfld( 'GHG_CFC11_R', rxn_rates(:ncol,:,cfc11_rxt), ncol, lchnk )
147 : call outfld( 'GHG_CFC12_R', rxn_rates(:ncol,:,cfc12_rxt), ncol, lchnk )
148 : call outfld( 'GHG_N2O_R', rxn_rates(:ncol,:,n2o_rxt), ncol, lchnk )
149 : call outfld( 'GHG_CH4_R', rxn_rates(:ncol,:,ch4_rxt), ncol, lchnk )
150 :
151 : if (lyman_alpha_rxt > 0) then
152 : rxn_rates(:ncol,:,lyman_alpha_rxt) = 0._r8
153 : endif
154 :
155 : if (lyman_alpha) then
156 : do i=1,ncol
157 : if (zen_angle(i) < half_pi) then
158 : rxn_rates(i,:,lyman_alpha_rxt) = h2orate_data%datainst(latmapback(i),:,lchnk,1)
159 : endif
160 : enddo
161 :
162 : call outfld( 'GHG_H2O_R', rxn_rates(:ncol,:,lyman_alpha_rxt), ncol, lchnk )
163 : endif
164 :
165 : endsubroutine ghg_chem_set_rates
166 :
167 : !-----------------------------------------------------------------
168 : !-----------------------------------------------------------------
169 0 : subroutine ghg_chem_set_flbc( vmr, ncol )
170 0 : use chem_surfvals, only : chem_surfvals_get
171 : use chem_mods, only : gas_pcnst
172 : use mo_flbc, only : has_flbc
173 : implicit none
174 :
175 : integer, intent(in) :: ncol ! number columns in chunk
176 : real(r8), intent(inout) :: vmr(ncol,pver,gas_pcnst) ! xported species (vmr)
177 : integer :: i,ndx
178 :
179 : do i = 1,ncnst
180 0 : ndx = ghg_ndx(i)
181 0 : if ( has_flbc(ndx)) then
182 0 : vmr(:ncol, pver-1, ndx) = vmr(:ncol, pver, ndx)
183 : else
184 0 : vmr(:ncol, pver-1:pver, ndx) = chem_surfvals_get(ghg_bnd_names(i))
185 : endif
186 : enddo
187 :
188 : endsubroutine ghg_chem_set_flbc
189 :
190 : !-----------------------------------------------------------------
191 : !-----------------------------------------------------------------
192 0 : subroutine ghg_chem_final
193 : implicit none
194 :
195 0 : deallocate(chemdata%fields)
196 0 : deallocate(chemdata%datainst)
197 0 : deallocate(chemdata%cdates)
198 0 : deallocate(chemdata%lat)
199 0 : deallocate(chemdata%zi)
200 :
201 0 : if (lyman_alpha) then
202 :
203 0 : deallocate(h2orate_data%fields)
204 0 : deallocate(h2orate_data%datainst)
205 0 : deallocate(h2orate_data%cdates)
206 0 : deallocate(h2orate_data%lat)
207 0 : deallocate(h2orate_data%zi)
208 :
209 : endif
210 :
211 0 : end subroutine ghg_chem_final
212 :
213 : end module mo_ghg_chem
|