Line data Source code
1 : !=======================================================================
2 :
3 : ! Flux variable declarations for biogeochemistry
4 : !
5 : ! author Elizabeth C. Hunke, LANL
6 : !
7 : module ice_flux_bgc
8 :
9 : use ice_kinds_mod
10 : use ice_blocks, only: nx_block, ny_block
11 : use ice_domain_size, only: max_blocks, ncat
12 : use ice_fileunits, only: nu_diag
13 : use ice_exit, only: abort_ice
14 : use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted
15 : use icepack_intfc, only: icepack_max_iso, icepack_max_aero, icepack_max_nbtrcr, &
16 : icepack_max_algae, icepack_max_doc, icepack_max_don, icepack_max_dic, icepack_max_fe, & ! LCOV_EXCL_LINE
17 : icepack_query_tracer_indices, icepack_query_tracer_flags, icepack_query_parameters
18 :
19 : implicit none
20 : private
21 :
22 : public :: bgcflux_ice_to_ocn, alloc_flux_bgc
23 :
24 : ! in from atmosphere
25 :
26 : real (kind=dbl_kind), & ! coupling variable for both tr_aero and tr_zaero
27 : dimension (:,:,:,:), allocatable, public :: & ! LCOV_EXCL_LINE
28 : fiso_atm, & ! isotope deposition rate (kg/m^2 s) ! LCOV_EXCL_LINE
29 : faero_atm ! aerosol deposition rate (kg/m^2 s)
30 :
31 : real (kind=dbl_kind), &
32 : dimension (:,:,:,:), allocatable, public :: & ! LCOV_EXCL_LINE
33 : flux_bio_atm ! all bio fluxes to ice from atmosphere
34 :
35 : ! out to ocean
36 :
37 : real (kind=dbl_kind), &
38 : dimension (:,:,:,:), allocatable, public :: & ! LCOV_EXCL_LINE
39 : fiso_ocn, & ! isotope flux to ocean (kg/m^2/s) ! LCOV_EXCL_LINE
40 : faero_ocn ! aerosol flux to ocean (kg/m^2/s)
41 :
42 : real (kind=dbl_kind), &
43 : dimension (:,:,:,:), allocatable, public :: & ! LCOV_EXCL_LINE
44 : flux_bio , & ! all bio fluxes to ocean ! LCOV_EXCL_LINE
45 : flux_bio_ai ! all bio fluxes to ocean, averaged over grid cell
46 :
47 : ! internal
48 :
49 : logical (kind=log_kind), public :: &
50 : cpl_bgc ! switch to couple BGC via drivers
51 :
52 : real (kind=dbl_kind), dimension (:,:,:,:), allocatable, public :: &
53 : hin_old , & ! old ice thickness ! LCOV_EXCL_LINE
54 : dsnown ! change in snow thickness in category n (m)
55 :
56 : real (kind=dbl_kind), dimension (:,:,:), allocatable, public :: &
57 : nit , & ! ocean nitrate (mmol/m^3) ! LCOV_EXCL_LINE
58 : amm , & ! ammonia/um (mmol/m^3) ! LCOV_EXCL_LINE
59 : sil , & ! silicate (mmol/m^3) ! LCOV_EXCL_LINE
60 : dmsp , & ! dmsp (mmol/m^3) ! LCOV_EXCL_LINE
61 : dms , & ! dms (mmol/m^3) ! LCOV_EXCL_LINE
62 : hum , & ! humic material carbon (mmol/m^3) ! LCOV_EXCL_LINE
63 : fnit , & ! ice-ocean nitrate flux (mmol/m^2/s), positive to ocean ! LCOV_EXCL_LINE
64 : famm , & ! ice-ocean ammonia/um flux (mmol/m^2/s), positive to ocean ! LCOV_EXCL_LINE
65 : fsil , & ! ice-ocean silicate flux (mmol/m^2/s), positive to ocean ! LCOV_EXCL_LINE
66 : fdmsp , & ! ice-ocean dmsp (mmol/m^2/s), positive to ocean ! LCOV_EXCL_LINE
67 : fdms , & ! ice-ocean dms (mmol/m^2/s), positive to ocean ! LCOV_EXCL_LINE
68 : fhum , & ! ice-ocean humic material carbon (mmol/m^2/s), positive to ocean ! LCOV_EXCL_LINE
69 : fdust ! ice-ocean dust flux (kg/m^2/s), positive to ocean
70 :
71 : real (kind=dbl_kind), dimension (:,:,:,:), allocatable, public :: &
72 : algalN , & ! ocean algal nitrogen (mmol/m^3) (diatoms, pico, phaeo) ! LCOV_EXCL_LINE
73 : falgalN ! ice-ocean algal nitrogen flux (mmol/m^2/s) (diatoms, pico, phaeo)
74 :
75 : real (kind=dbl_kind), dimension (:,:,:,:), allocatable, public :: &
76 : doc , & ! ocean doc (mmol/m^3) (saccharids, lipids, tbd ) ! LCOV_EXCL_LINE
77 : fdoc ! ice-ocean doc flux (mmol/m^2/s) (saccharids, lipids, tbd)
78 :
79 : real (kind=dbl_kind), dimension (:,:,:,:), allocatable, public :: &
80 : don , & ! ocean don (mmol/m^3) (proteins and amino acids) ! LCOV_EXCL_LINE
81 : fdon ! ice-ocean don flux (mmol/m^2/s) (proteins and amino acids)
82 :
83 : real (kind=dbl_kind), dimension (:,:,:,:), allocatable, public :: &
84 : dic , & ! ocean dic (mmol/m^3) ! LCOV_EXCL_LINE
85 : fdic ! ice-ocean dic flux (mmol/m^2/s)
86 :
87 : real (kind=dbl_kind), dimension (:,:,:,:), allocatable, public :: &
88 : fed, fep , & ! ocean dissolved and particulate fe (nM) ! LCOV_EXCL_LINE
89 : ffed, ffep ! ice-ocean dissolved and particulate fe flux (umol/m^2/s)
90 :
91 : real (kind=dbl_kind), dimension (:,:,:,:), allocatable, public :: &
92 : zaeros ! ocean aerosols (mmol/m^3)
93 :
94 : ! isotopes
95 : real (kind=dbl_kind), & ! coupling variable for tr_iso
96 : dimension (:,:,:,:), allocatable, public :: & ! LCOV_EXCL_LINE
97 : fiso_evap , & ! isotope evaporation rate (kg/m^2 s) ! LCOV_EXCL_LINE
98 : Qa_iso , & ! isotope specific humidity (kg/kg) ! LCOV_EXCL_LINE
99 : Qref_iso ! 2m atm reference isotope spec humidity (kg/kg)
100 :
101 : real (kind=dbl_kind), & ! coupling variable for tr_iso
102 : dimension (:,:,:), allocatable, public :: & ! LCOV_EXCL_LINE
103 : HDO_ocn , & ! seawater concentration of HDO (kg/kg) ! LCOV_EXCL_LINE
104 : H2_16O_ocn, & ! seawater concentration of H2_16O (kg/kg) ! LCOV_EXCL_LINE
105 : H2_18O_ocn ! seawater concentration of H2_18O (kg/kg)
106 :
107 : !=======================================================================
108 :
109 : contains
110 :
111 : !=======================================================================
112 : !
113 : ! Allocate space for all variables
114 : !
115 37 : subroutine alloc_flux_bgc
116 :
117 : integer (int_kind) :: ierr
118 :
119 : allocate( &
120 : nit (nx_block,ny_block,max_blocks), & ! ocean nitrate (mmol/m^3) ! LCOV_EXCL_LINE
121 : amm (nx_block,ny_block,max_blocks), & ! ammonia/um (mmol/m^3) ! LCOV_EXCL_LINE
122 : sil (nx_block,ny_block,max_blocks), & ! silicate (mmol/m^3) ! LCOV_EXCL_LINE
123 : dmsp (nx_block,ny_block,max_blocks), & ! dmsp (mmol/m^3) ! LCOV_EXCL_LINE
124 : dms (nx_block,ny_block,max_blocks), & ! dms (mmol/m^3) ! LCOV_EXCL_LINE
125 : hum (nx_block,ny_block,max_blocks), & ! humic material carbon (mmol/m^3) ! LCOV_EXCL_LINE
126 : fnit (nx_block,ny_block,max_blocks), & ! ice-ocean nitrate flux (mmol/m^2/s), positive to ocean ! LCOV_EXCL_LINE
127 : famm (nx_block,ny_block,max_blocks), & ! ice-ocean ammonia/um flux (mmol/m^2/s), positive to ocean ! LCOV_EXCL_LINE
128 : fsil (nx_block,ny_block,max_blocks), & ! ice-ocean silicate flux (mmol/m^2/s), positive to ocean ! LCOV_EXCL_LINE
129 : fdmsp (nx_block,ny_block,max_blocks), & ! ice-ocean dmsp (mmol/m^2/s), positive to ocean ! LCOV_EXCL_LINE
130 : fdms (nx_block,ny_block,max_blocks), & ! ice-ocean dms (mmol/m^2/s), positive to ocean ! LCOV_EXCL_LINE
131 : fhum (nx_block,ny_block,max_blocks), & ! ice-ocean humic material carbon (mmol/m^2/s), positive to ocean ! LCOV_EXCL_LINE
132 : fdust (nx_block,ny_block,max_blocks), & ! ice-ocean dust flux (kg/m^2/s), positive to ocean ! LCOV_EXCL_LINE
133 : hin_old (nx_block,ny_block,ncat,max_blocks), & ! old ice thickness ! LCOV_EXCL_LINE
134 : dsnown (nx_block,ny_block,ncat,max_blocks), & ! change in snow thickness in category n (m) ! LCOV_EXCL_LINE
135 : HDO_ocn (nx_block,ny_block,max_blocks), & ! seawater concentration of HDO (kg/kg) ! LCOV_EXCL_LINE
136 : H2_16O_ocn (nx_block,ny_block,max_blocks), & ! seawater concentration of H2_16O (kg/kg) ! LCOV_EXCL_LINE
137 : H2_18O_ocn (nx_block,ny_block,max_blocks), & ! seawater concentration of H2_18O (kg/kg) ! LCOV_EXCL_LINE
138 : Qa_iso (nx_block,ny_block,icepack_max_iso,max_blocks), & ! isotope specific humidity (kg/kg) ! LCOV_EXCL_LINE
139 : Qref_iso (nx_block,ny_block,icepack_max_iso,max_blocks), & ! 2m atm reference isotope spec humidity (kg/kg) ! LCOV_EXCL_LINE
140 : fiso_atm (nx_block,ny_block,icepack_max_iso,max_blocks), & ! isotope deposition rate (kg/m^2 s) ! LCOV_EXCL_LINE
141 : fiso_evap (nx_block,ny_block,icepack_max_iso,max_blocks), & ! isotope evaporation rate (kg/m^2 s) ! LCOV_EXCL_LINE
142 : fiso_ocn (nx_block,ny_block,icepack_max_iso,max_blocks), & ! isotope flux to ocean (kg/m^2/s) ! LCOV_EXCL_LINE
143 : faero_atm (nx_block,ny_block,icepack_max_aero,max_blocks), & ! aerosol deposition rate (kg/m^2 s) ! LCOV_EXCL_LINE
144 : faero_ocn (nx_block,ny_block,icepack_max_aero,max_blocks), & ! aerosol flux to ocean (kg/m^2/s) ! LCOV_EXCL_LINE
145 : zaeros (nx_block,ny_block,icepack_max_aero,max_blocks), & ! ocean aerosols (mmol/m^3) ! LCOV_EXCL_LINE
146 : flux_bio_atm(nx_block,ny_block,icepack_max_nbtrcr,max_blocks), & ! all bio fluxes to ice from atmosphere ! LCOV_EXCL_LINE
147 : flux_bio (nx_block,ny_block,icepack_max_nbtrcr,max_blocks), & ! all bio fluxes to ocean ! LCOV_EXCL_LINE
148 : flux_bio_ai (nx_block,ny_block,icepack_max_nbtrcr,max_blocks), & ! all bio fluxes to ocean, averaged over grid cell ! LCOV_EXCL_LINE
149 : algalN (nx_block,ny_block,icepack_max_algae,max_blocks), & ! ocean algal nitrogen (mmol/m^3) (diatoms, pico, phaeo) ! LCOV_EXCL_LINE
150 : falgalN (nx_block,ny_block,icepack_max_algae,max_blocks), & ! ice-ocn algalN flux (mmol/m^2/s) (diatoms, pico, phaeo) ! LCOV_EXCL_LINE
151 : doc (nx_block,ny_block,icepack_max_doc,max_blocks), & ! ocean doc (mmol/m^3) (saccharids, lipids, tbd ) ! LCOV_EXCL_LINE
152 : fdoc (nx_block,ny_block,icepack_max_doc,max_blocks), & ! ice-ocean doc flux (mmol/m^2/s) (saccharids, lipids, tbd) ! LCOV_EXCL_LINE
153 : don (nx_block,ny_block,icepack_max_don,max_blocks), & ! ocean don (mmol/m^3) (proteins and amino acids) ! LCOV_EXCL_LINE
154 : fdon (nx_block,ny_block,icepack_max_don,max_blocks), & ! ice-ocean don flux (mmol/m^2/s) (proteins and amino acids) ! LCOV_EXCL_LINE
155 : dic (nx_block,ny_block,icepack_max_dic,max_blocks), & ! ocean dic (mmol/m^3) ! LCOV_EXCL_LINE
156 : fdic (nx_block,ny_block,icepack_max_dic,max_blocks), & ! ice-ocean dic flux (mmol/m^2/s) ! LCOV_EXCL_LINE
157 : fed (nx_block,ny_block,icepack_max_fe, max_blocks), & ! ocean dissolved fe (nM) ! LCOV_EXCL_LINE
158 : fep (nx_block,ny_block,icepack_max_fe, max_blocks), & ! ocean particulate fe (nM) ! LCOV_EXCL_LINE
159 : ffed (nx_block,ny_block,icepack_max_fe, max_blocks), & ! ice-ocean dissolved fe flux (umol/m^2/s) ! LCOV_EXCL_LINE
160 : ffep (nx_block,ny_block,icepack_max_fe, max_blocks), & ! ice-ocean particulate fe flux (umol/m^2/s) ! LCOV_EXCL_LINE
161 37 : stat=ierr)
162 37 : if (ierr/=0) call abort_ice('(alloc_flux_bgc): Out of memory')
163 :
164 37 : end subroutine alloc_flux_bgc
165 :
166 : !=======================================================================
167 :
168 : ! Initialize some fluxes sent to coupler for use by the atm model
169 : !
170 : ! author: Nicole Jeffery, LANL
171 :
172 0 : subroutine bgcflux_ice_to_ocn(nx_block, &
173 : ny_block, & ! LCOV_EXCL_LINE
174 : flux_bio, & ! LCOV_EXCL_LINE
175 : f_nit, f_sil, & ! LCOV_EXCL_LINE
176 : f_amm, f_dmsp, & ! LCOV_EXCL_LINE
177 : f_dms, f_hum, & ! LCOV_EXCL_LINE
178 : f_dust, f_algalN, & ! LCOV_EXCL_LINE
179 : f_doc, f_dic, & ! LCOV_EXCL_LINE
180 : f_don, f_fep, & ! LCOV_EXCL_LINE
181 0 : f_fed)
182 :
183 : use ice_constants, only: c0
184 : use ice_domain_size, only: n_zaero, n_algae, n_doc, n_dic, n_don, n_fed, n_fep
185 :
186 : real(kind=dbl_kind), dimension(:,:,:), intent(in) :: &
187 : flux_bio
188 : real(kind=dbl_kind), dimension(:,:), intent(out):: &
189 : f_nit, & ! nitrate flux mmol/m^2/s positive to ocean ! LCOV_EXCL_LINE
190 : f_sil, & ! silicate flux mmol/m^2/s ! LCOV_EXCL_LINE
191 : f_amm, & ! ammonium flux mmol/m^2/s ! LCOV_EXCL_LINE
192 : f_dmsp, & ! DMSPd flux mmol/m^2/s ! LCOV_EXCL_LINE
193 : f_dms, & ! DMS flux mmol/m^2/s ! LCOV_EXCL_LINE
194 : f_hum, & ! humic flux mmol/m^2/s ! LCOV_EXCL_LINE
195 : f_dust ! dust flux kg/m^2/s
196 :
197 : real(kind=dbl_kind), dimension(:,:,:), intent(out):: &
198 : f_algalN, & ! algal nitrogen flux mmol/m^2/s ! LCOV_EXCL_LINE
199 : f_doc, & ! DOC flux mmol/m^2/s ! LCOV_EXCL_LINE
200 : f_dic, & ! DIC flux mmol/m^2/s ! LCOV_EXCL_LINE
201 : f_don, & ! DON flux mmol/m^2/s ! LCOV_EXCL_LINE
202 : f_fep, & ! particulate iron flux umol/m^2/s ! LCOV_EXCL_LINE
203 : f_fed ! dissolved iron flux umol/m^2/s
204 :
205 : integer (kind=int_kind), intent(in) :: &
206 : nx_block, & ! LCOV_EXCL_LINE
207 : ny_block
208 :
209 : ! local variables
210 :
211 : integer (kind=int_kind) :: &
212 : i,j , & ! horizontal indices ! LCOV_EXCL_LINE
213 : k ! tracer index
214 :
215 : logical (kind=log_kind) :: &
216 : skl_bgc, solve_zbgc, & ! LCOV_EXCL_LINE
217 : tr_bgc_Nit, tr_bgc_N, & ! LCOV_EXCL_LINE
218 : tr_bgc_DON, tr_bgc_C, tr_bgc_Am, tr_bgc_Sil, tr_bgc_DMS, tr_bgc_Fe, & ! LCOV_EXCL_LINE
219 : tr_bgc_hum, tr_zaero
220 :
221 : integer (kind=int_kind) :: &
222 : nlt_bgc_Nit, nlt_bgc_Am, & ! LCOV_EXCL_LINE
223 : nlt_bgc_Sil, nlt_bgc_DMSPd, nlt_bgc_DMS, nlt_bgc_hum
224 :
225 : integer (kind=int_kind), dimension(icepack_max_algae) :: &
226 : nlt_bgc_N, nlt_bgc_C ! algae
227 : integer (kind=int_kind), dimension(icepack_max_doc) :: &
228 : nlt_bgc_DOC ! disolved organic carbon
229 : integer (kind=int_kind), dimension(icepack_max_don) :: &
230 : nlt_bgc_DON !
231 : integer (kind=int_kind), dimension(icepack_max_dic) :: &
232 : nlt_bgc_DIC ! disolved inorganic carbon
233 : integer (kind=int_kind), dimension(icepack_max_fe) :: &
234 : nlt_bgc_Fed, nlt_bgc_Fep !
235 : integer (kind=int_kind), dimension(icepack_max_aero) :: &
236 : nlt_zaero ! non-reacting layer aerosols
237 :
238 : character(len=*), parameter :: subname = '(bgcflux_ice_to_ocn)'
239 :
240 0 : call icepack_query_parameters(skl_bgc_out=skl_bgc, solve_zbgc_out=solve_zbgc)
241 : call icepack_query_tracer_flags( &
242 : tr_bgc_Nit_out=tr_bgc_Nit, tr_bgc_N_out=tr_bgc_N, & ! LCOV_EXCL_LINE
243 : tr_bgc_DON_out=tr_bgc_DON, tr_bgc_C_out=tr_bgc_C, tr_bgc_Am_out=tr_bgc_Am, & ! LCOV_EXCL_LINE
244 : tr_bgc_Sil_out=tr_bgc_Sil, tr_bgc_DMS_out=tr_bgc_DMS, tr_bgc_Fe_out=tr_bgc_Fe, & ! LCOV_EXCL_LINE
245 0 : tr_bgc_hum_out=tr_bgc_hum, tr_zaero_out=tr_zaero)
246 : call icepack_query_tracer_indices( &
247 : nlt_bgc_N_out=nlt_bgc_N, nlt_bgc_C_out=nlt_bgc_C, nlt_bgc_DOC_out=nlt_bgc_DOC, & ! LCOV_EXCL_LINE
248 : nlt_bgc_DON_out=nlt_bgc_DON, nlt_bgc_DIC_out=nlt_bgc_DIC, & ! LCOV_EXCL_LINE
249 : nlt_bgc_Fed_out=nlt_bgc_Fed, nlt_bgc_Fep_out=nlt_bgc_Fep, & ! LCOV_EXCL_LINE
250 : nlt_zaero_out=nlt_zaero, nlt_bgc_Nit_out=nlt_bgc_Nit, nlt_bgc_Am_out=nlt_bgc_Am, & ! LCOV_EXCL_LINE
251 : nlt_bgc_Sil_out=nlt_bgc_Sil, nlt_bgc_DMSPd_out=nlt_bgc_DMSPd, & ! LCOV_EXCL_LINE
252 0 : nlt_bgc_DMS_out=nlt_bgc_DMS, nlt_bgc_hum_out=nlt_bgc_hum)
253 0 : call icepack_warnings_flush(nu_diag)
254 0 : if (icepack_warnings_aborted()) call abort_ice(error_message=subname, &
255 0 : file=__FILE__, line=__LINE__)
256 :
257 0 : f_nit (:,:) = c0
258 0 : f_sil (:,:) = c0
259 0 : f_amm (:,:) = c0
260 0 : f_dmsp (:,:) = c0
261 0 : f_dms (:,:) = c0
262 0 : f_hum (:,:) = c0
263 0 : f_dust (:,:) = c0
264 0 : f_algalN(:,:,:)= c0
265 0 : f_doc (:,:,:)= c0
266 0 : f_dic (:,:,:)= c0
267 0 : f_don (:,:,:)= c0
268 0 : f_fep (:,:,:)= c0
269 0 : f_fed (:,:,:)= c0
270 :
271 0 : do j = 1, ny_block
272 0 : do i = 1, nx_block
273 0 : if (skl_bgc .or. solve_zbgc) then
274 0 : do k = 1, n_algae
275 0 : f_algalN(i,j,k) = flux_bio(i,j,nlt_bgc_N(k))
276 : enddo
277 : endif
278 0 : if (tr_bgc_C) then
279 0 : do k = 1, n_doc
280 0 : f_doc(i,j,k) = flux_bio(i,j,nlt_bgc_DOC(k))
281 : enddo
282 0 : do k = 1, n_dic
283 0 : f_dic(i,j,k) = flux_bio(i,j,nlt_bgc_DIC(k))
284 : enddo
285 : endif
286 0 : if (tr_bgc_DON) then
287 0 : do k = 1, n_don
288 0 : f_don(i,j,k) = flux_bio(i,j,nlt_bgc_DON(k))
289 : enddo
290 : endif
291 0 : if (tr_bgc_Fe) then
292 0 : do k = 1, n_fep
293 0 : f_fep(i,j,k) = flux_bio(i,j,nlt_bgc_Fep(k))
294 : enddo
295 0 : do k = 1, n_fed
296 0 : f_fed(i,j,k) = flux_bio(i,j,nlt_bgc_Fed(k))
297 : enddo
298 : endif
299 0 : if (tr_bgc_Nit) f_nit(i,j) = flux_bio(i,j,nlt_bgc_Nit)
300 0 : if (tr_bgc_Sil) f_sil(i,j) = flux_bio(i,j,nlt_bgc_Sil)
301 0 : if (tr_bgc_Am) f_amm(i,j) = flux_bio(i,j,nlt_bgc_Am)
302 0 : if (tr_bgc_hum) f_hum(i,j) = flux_bio(i,j,nlt_bgc_hum)
303 0 : if (tr_bgc_DMS) then
304 0 : f_dms(i,j) = flux_bio(i,j,nlt_bgc_DMS)
305 0 : f_dmsp(i,j) = flux_bio(i,j,nlt_bgc_DMSPd)
306 : endif
307 0 : if (tr_zaero) then
308 0 : do k = 3, n_zaero
309 0 : f_dust(i,j) = f_dust(i,j) + flux_bio(i,j,nlt_zaero(k))
310 : enddo
311 : endif
312 : enddo
313 : enddo
314 :
315 0 : end subroutine bgcflux_ice_to_ocn
316 :
317 : !=======================================================================
318 :
319 : end module ice_flux_bgc
320 :
321 : !=======================================================================
|