Line data Source code
1 : !=========================================================================
2 : !
3 : ! Restart routines for the column package.
4 : !
5 : ! author: Elizabeth C. Hunke, LANL
6 : !
7 : module icedrv_restart_bgc
8 :
9 : use icedrv_kinds
10 : use icedrv_constants
11 : use icedrv_domain_size, only: ncat, nblyr, nx
12 : use icepack_intfc, only: icepack_max_algae, icepack_max_doc, icepack_max_don
13 : use icepack_intfc, only: icepack_max_dic, icepack_max_aero, icepack_max_fe
14 : use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted
15 : use icepack_intfc, only: icepack_query_parameters, icepack_query_tracer_sizes
16 : use icepack_intfc, only: icepack_query_tracer_flags, icepack_query_tracer_indices
17 : use icedrv_system, only: icedrv_system_abort
18 :
19 : implicit none
20 :
21 : private
22 : public :: write_restart_bgc, &
23 : read_restart_bgc
24 :
25 : !=======================================================================
26 :
27 : contains
28 :
29 : !=======================================================================
30 : !
31 : ! Dumps all values needed for a bgc restart
32 : !
33 : ! author Elizabeth C. Hunke, LANL
34 :
35 268 : subroutine write_restart_bgc()
36 :
37 : use icedrv_domain_size, only: n_algae, n_doc, n_dic
38 : use icedrv_domain_size, only: n_don, n_zaero, n_fed, n_fep
39 : use icedrv_flux, only: sss, nit, amm, sil, dmsp, dms, algalN
40 : use icedrv_flux, only: doc, don, dic, fed, fep, zaeros, hum
41 : use icedrv_state, only: trcrn
42 : use icedrv_restart, only: write_restart_field
43 :
44 : ! local variables
45 :
46 : integer (kind=int_kind) :: &
47 : i, k , & ! horizontal, vertical indices
48 : mm ! n_algae
49 :
50 : logical (kind=log_kind) :: skl_bgc, z_tracers
51 :
52 : integer (kind=int_kind) :: nbtrcr
53 : logical (kind=log_kind) :: tr_bgc_Nit, tr_bgc_Am, tr_bgc_Sil, tr_bgc_hum
54 : logical (kind=log_kind) :: tr_bgc_DMS, tr_bgc_PON, tr_bgc_N, tr_bgc_C
55 : logical (kind=log_kind) :: tr_bgc_DON, tr_bgc_Fe, tr_zaero , tr_bgc_chl
56 : integer (kind=int_kind) :: nt_bgc_Nit, nt_bgc_AM, nt_bgc_Sil
57 : integer (kind=int_kind) :: nt_bgc_hum, nt_bgc_PON
58 : integer (kind=int_kind) :: nt_bgc_DMSPp, nt_bgc_DMSPd, nt_bgc_DMS
59 : integer (kind=int_kind) :: nt_zbgc_frac
60 : integer (kind=int_kind), dimension(icepack_max_algae) :: nt_bgc_N
61 : integer (kind=int_kind), dimension(icepack_max_algae) :: nt_bgc_chl
62 : integer (kind=int_kind), dimension(icepack_max_algae) :: nt_bgc_C
63 : integer (kind=int_kind), dimension(icepack_max_doc) :: nt_bgc_DOC
64 : integer (kind=int_kind), dimension(icepack_max_don) :: nt_bgc_DON
65 : integer (kind=int_kind), dimension(icepack_max_dic) :: nt_bgc_DIC
66 : integer (kind=int_kind), dimension(icepack_max_aero) :: nt_zaero
67 : integer (kind=int_kind), dimension(icepack_max_fe) :: nt_bgc_Fed
68 : integer (kind=int_kind), dimension(icepack_max_fe) :: nt_bgc_Fep
69 :
70 : character(len=*), parameter :: subname='(write_restart_bgc)'
71 :
72 : !-----------------------------------------------------------------
73 : ! query Icepack values
74 : !-----------------------------------------------------------------
75 :
76 67 : call icepack_query_parameters(skl_bgc_out=skl_bgc)
77 67 : call icepack_query_parameters(z_tracers_out=z_tracers)
78 67 : call icepack_query_tracer_sizes(nbtrcr_out=nbtrcr)
79 : call icepack_query_tracer_flags(tr_bgc_Nit_out=tr_bgc_Nit, &
80 : tr_bgc_Am_out=tr_bgc_Am, &
81 : tr_bgc_Sil_out=tr_bgc_Sil, tr_bgc_hum_out=tr_bgc_hum, &
82 : tr_bgc_DMS_out=tr_bgc_DMS, tr_bgc_PON_out=tr_bgc_PON, &
83 : tr_bgc_N_out=tr_bgc_N, tr_bgc_C_out=tr_bgc_C, &
84 : tr_bgc_DON_out=tr_bgc_DON, tr_bgc_Fe_out=tr_bgc_Fe, &
85 67 : tr_zaero_out=tr_zaero, tr_bgc_chl_out=tr_bgc_chl)
86 : call icepack_query_tracer_indices( &
87 : nt_bgc_N_out=nt_bgc_N, nt_bgc_AM_out=nt_bgc_AM, &
88 : nt_bgc_chl_out=nt_bgc_chl, nt_bgc_C_out=nt_bgc_C, &
89 : nt_bgc_DOC_out=nt_bgc_DOC, &
90 : nt_bgc_DIC_out=nt_bgc_DIC, nt_bgc_Nit_out=nt_bgc_Nit, &
91 : nt_bgc_Sil_out=nt_bgc_Sil, nt_bgc_hum_out=nt_bgc_hum, &
92 : nt_bgc_DMSPp_out=nt_bgc_DMSPp, nt_bgc_DMSPd_out=nt_bgc_DMSPd, &
93 : nt_bgc_DMS_out=nt_bgc_DMS, nt_bgc_PON_out=nt_bgc_PON, &
94 : nt_bgc_DON_out=nt_bgc_DON, nt_bgc_Fed_out=nt_bgc_Fed, &
95 : nt_bgc_Fep_out=nt_bgc_Fep, nt_zbgc_frac_out=nt_zbgc_frac, &
96 67 : nt_zaero_out=nt_zaero)
97 67 : call icepack_warnings_flush(nu_diag)
98 67 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
99 0 : file=__FILE__,line= __LINE__)
100 :
101 : !-----------------------------------------------------------------
102 : ! Skeletal layer BGC
103 : !-----------------------------------------------------------------
104 :
105 67 : if (skl_bgc) then
106 0 : do k = 1, n_algae
107 0 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_N(k),:),ncat)
108 0 : if (tr_bgc_chl) &
109 0 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_chl(k),:),ncat)
110 : enddo
111 0 : if (tr_bgc_C) then
112 : ! do k = 1, n_algae
113 : ! call write_restart_field(nu_dump,trcrn(:,nt_bgc_C(k),:),ncat)
114 : ! enddo
115 0 : do k = 1, n_doc
116 0 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_DOC(k),:),ncat)
117 : enddo
118 0 : do k = 1, n_dic
119 0 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_DIC(k),:),ncat)
120 : enddo
121 : endif
122 0 : if (tr_bgc_Nit) &
123 0 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_Nit,:),ncat)
124 0 : if (tr_bgc_Am) &
125 0 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_Am,:),ncat)
126 0 : if (tr_bgc_Sil) &
127 0 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_Sil,:),ncat)
128 0 : if (tr_bgc_hum) &
129 0 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_hum,:),ncat)
130 0 : if (tr_bgc_DMS) then
131 0 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_DMSPp,:),ncat)
132 0 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_DMSPd,:),ncat)
133 0 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_DMS,:),ncat)
134 : endif
135 0 : if (tr_bgc_PON) &
136 0 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_PON,:),ncat)
137 0 : if (tr_bgc_DON) then
138 0 : do k = 1, n_don
139 0 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_DON(k),:),ncat)
140 : enddo
141 : endif
142 0 : if (tr_bgc_Fe ) then
143 0 : do k = 1, n_fed
144 0 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_Fed(k),:),ncat)
145 : enddo
146 0 : do k = 1, n_fep
147 0 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_Fep(k),:),ncat)
148 : enddo
149 : endif
150 :
151 67 : elseif (z_tracers) then
152 :
153 : !-----------------------------------------------------------------
154 : ! Z layer BGC
155 : !-----------------------------------------------------------------
156 :
157 67 : if (tr_bgc_Nit) then
158 45 : write(nu_diag,*) 'z bgc restart: min/max Nitrate'
159 495 : do k = 1, nblyr+3
160 495 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_Nit+k-1,:),ncat)
161 : enddo
162 : endif
163 67 : if (tr_bgc_N) then
164 180 : do mm = 1, n_algae
165 1485 : do k = 1, nblyr+3
166 1485 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_N(mm)+k-1,:),ncat)
167 : enddo
168 180 : if (tr_bgc_chl) then
169 0 : do k = 1, nblyr+3
170 0 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_chl(mm)+k-1,:),ncat)
171 : enddo
172 : endif
173 : enddo ! n_algae
174 : endif ! tr_bgc_N
175 67 : if (tr_bgc_C) then
176 : ! algal C is not yet distinct from algal N
177 : ! do mm = 1, n_algae
178 : ! do k = 1, nblyr+3
179 : ! call write_restart_field(nu_dump,trcrn(:,nt_bgc_C(mm)+k-1,:),ncat)
180 : ! enddo
181 : ! enddo
182 135 : do mm = 1, n_doc
183 1035 : do k = 1, nblyr+3
184 990 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_DOC(mm)+k-1,:),ncat)
185 : enddo
186 : enddo
187 90 : do mm = 1, n_dic
188 540 : do k = 1, nblyr+3
189 495 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_DIC(mm)+k-1,:),ncat)
190 : enddo
191 : enddo
192 : endif !tr_bgc_C
193 67 : if (tr_bgc_Am) then
194 495 : do k = 1, nblyr+3
195 495 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_Am+k-1,:),ncat)
196 : enddo
197 : endif
198 67 : if (tr_bgc_Sil) then
199 495 : do k = 1, nblyr+3
200 495 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_Sil+k-1,:),ncat)
201 : enddo
202 : endif
203 67 : if (tr_bgc_hum) then
204 495 : do k = 1, nblyr+3
205 495 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_hum+k-1,:),ncat)
206 : enddo
207 : endif
208 67 : if (tr_bgc_DMS) then
209 495 : do k = 1, nblyr+3
210 450 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_DMSPp+k-1,:),ncat)
211 450 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_DMSPd+k-1,:),ncat)
212 495 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_DMS+k-1,:),ncat)
213 : enddo
214 : endif
215 67 : if (tr_bgc_PON) then
216 495 : do k = 1, nblyr+3
217 495 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_PON+k-1,:),ncat)
218 : enddo
219 : endif
220 67 : if (tr_bgc_DON) then
221 90 : do mm = 1, n_don
222 540 : do k = 1, nblyr+3
223 495 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_DON(mm)+k-1,:),ncat)
224 : enddo
225 : enddo
226 : endif
227 67 : if (tr_bgc_Fe ) then
228 90 : do mm = 1, n_fed
229 540 : do k = 1, nblyr+3
230 495 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_Fed(mm)+k-1,:),ncat)
231 : enddo
232 : enddo
233 90 : do mm = 1, n_fep
234 540 : do k = 1, nblyr+3
235 495 : call write_restart_field(nu_dump,trcrn(:,nt_bgc_Fep(mm)+k-1,:),ncat)
236 : enddo
237 : enddo
238 : endif
239 67 : if (tr_zaero) then
240 337 : do mm = 1, n_zaero
241 3037 : do k = 1, nblyr+3
242 2970 : call write_restart_field(nu_dump,trcrn(:,nt_zaero(mm)+k-1,:),ncat)
243 : enddo
244 : enddo
245 : endif
246 67 : if (nbtrcr > 0) then
247 1102 : do mm = 1, nbtrcr
248 1102 : call write_restart_field(nu_dump,trcrn(:,nt_zbgc_frac+mm-1,:),ncat)
249 : enddo
250 : endif
251 :
252 : !-----------------------------------------------------------------
253 : ! Ocean BGC
254 : !-----------------------------------------------------------------
255 :
256 67 : if (tr_bgc_N) then
257 180 : do k = 1, n_algae
258 180 : call write_restart_field(nu_dump,algalN(:,k),1)
259 : enddo ! k
260 : endif
261 67 : if (tr_bgc_C) then
262 135 : do k = 1, n_doc
263 135 : call write_restart_field(nu_dump,doc(:,k),1)
264 : enddo ! k
265 90 : do k = 1, n_dic
266 90 : call write_restart_field(nu_dump,dic(:,k),1)
267 : enddo ! k
268 : endif
269 67 : if (tr_bgc_Nit) &
270 45 : call write_restart_field(nu_dump,nit,1)
271 67 : if (tr_bgc_Am) &
272 45 : call write_restart_field(nu_dump,amm,1)
273 67 : if (tr_bgc_Sil) &
274 45 : call write_restart_field(nu_dump,sil,1)
275 67 : if (tr_bgc_hum) &
276 45 : call write_restart_field(nu_dump,hum,1)
277 67 : if (tr_bgc_DMS) then
278 45 : call write_restart_field(nu_dump,dmsp,1)
279 45 : call write_restart_field(nu_dump,dms,1)
280 : endif
281 67 : if (tr_bgc_DON) then
282 90 : do k = 1, n_don
283 90 : call write_restart_field(nu_dump,don(:,k),1)
284 : enddo ! k
285 : endif
286 67 : if (tr_bgc_Fe ) then
287 90 : do k = 1, n_fed
288 90 : call write_restart_field(nu_dump,fed(:,k),1)
289 : enddo ! k
290 90 : do k = 1, n_fep
291 90 : call write_restart_field(nu_dump,fep(:,k),1)
292 : enddo ! k
293 : endif
294 67 : if (tr_zaero) then
295 337 : do k = 1, n_zaero
296 337 : call write_restart_field(nu_dump,zaeros(:,k),1)
297 : enddo ! k
298 : endif
299 :
300 : endif ! skl_bgc or z_tracers
301 :
302 67 : end subroutine write_restart_bgc
303 :
304 : !=======================================================================
305 : !
306 : ! Reads all values needed for a bgc restart
307 : !
308 : ! author Elizabeth C. Hunke, LANL
309 :
310 12 : subroutine read_restart_bgc()
311 :
312 : use icedrv_domain_size, only: n_algae, n_doc, n_dic
313 : use icedrv_domain_size, only: n_don, n_zaero, n_fed, n_fep
314 : use icedrv_flux, only: sss, nit, amm, sil, dmsp, dms, algalN
315 : use icedrv_flux, only: doc, don, dic, fed, fep, zaeros, hum
316 : use icedrv_state, only: trcrn
317 : use icedrv_restart, only: read_restart_field
318 :
319 : ! local variables
320 :
321 : integer (kind=int_kind) :: &
322 : i, k, & ! indices
323 : mm ! n_algae
324 :
325 : logical (kind=log_kind) :: skl_bgc, z_tracers
326 :
327 : integer (kind=int_kind) :: nbtrcr
328 : logical (kind=log_kind) :: tr_bgc_Nit, tr_bgc_Am, tr_bgc_Sil, tr_bgc_hum
329 : logical (kind=log_kind) :: tr_bgc_DMS, tr_bgc_PON, tr_bgc_N, tr_bgc_C
330 : logical (kind=log_kind) :: tr_bgc_DON, tr_bgc_Fe, tr_zaero , tr_bgc_chl
331 : integer (kind=int_kind) :: nt_bgc_Nit, nt_bgc_AM, nt_bgc_Sil
332 : integer (kind=int_kind) :: nt_bgc_hum, nt_bgc_PON
333 : integer (kind=int_kind) :: nt_bgc_DMSPp, nt_bgc_DMSPd, nt_bgc_DMS
334 : integer (kind=int_kind) :: nt_zbgc_frac
335 : integer (kind=int_kind), dimension(icepack_max_algae) :: nt_bgc_N
336 : integer (kind=int_kind), dimension(icepack_max_algae) :: nt_bgc_chl
337 : integer (kind=int_kind), dimension(icepack_max_algae) :: nt_bgc_C
338 : integer (kind=int_kind), dimension(icepack_max_doc) :: nt_bgc_DOC
339 : integer (kind=int_kind), dimension(icepack_max_don) :: nt_bgc_DON
340 : integer (kind=int_kind), dimension(icepack_max_dic) :: nt_bgc_DIC
341 : integer (kind=int_kind), dimension(icepack_max_aero) :: nt_zaero
342 : integer (kind=int_kind), dimension(icepack_max_fe) :: nt_bgc_Fed
343 : integer (kind=int_kind), dimension(icepack_max_fe) :: nt_bgc_Fep
344 :
345 : character(len=*), parameter :: subname='(read_restart_bgc)'
346 :
347 : !-----------------------------------------------------------------
348 : ! query Icepack values
349 : !-----------------------------------------------------------------
350 :
351 3 : call icepack_query_parameters(skl_bgc_out=skl_bgc)
352 3 : call icepack_query_parameters(z_tracers_out=z_tracers)
353 3 : call icepack_query_tracer_sizes(nbtrcr_out=nbtrcr)
354 :
355 :
356 : call icepack_query_tracer_flags(tr_bgc_Nit_out=tr_bgc_Nit, &
357 : tr_bgc_Am_out=tr_bgc_Am, &
358 : tr_bgc_Sil_out=tr_bgc_Sil, tr_bgc_hum_out=tr_bgc_hum, &
359 : tr_bgc_DMS_out=tr_bgc_DMS, tr_bgc_PON_out=tr_bgc_PON, &
360 : tr_bgc_N_out=tr_bgc_N, tr_bgc_C_out=tr_bgc_C, &
361 : tr_bgc_DON_out=tr_bgc_DON, tr_bgc_Fe_out=tr_bgc_Fe, &
362 3 : tr_zaero_out=tr_zaero, tr_bgc_chl_out=tr_bgc_chl)
363 : call icepack_query_tracer_indices( &
364 : nt_bgc_N_out=nt_bgc_N, nt_bgc_AM_out=nt_bgc_AM, &
365 : nt_bgc_chl_out=nt_bgc_chl, nt_bgc_C_out=nt_bgc_C, &
366 : nt_bgc_DOC_out=nt_bgc_DOC, &
367 : nt_bgc_DIC_out=nt_bgc_DIC, nt_bgc_Nit_out=nt_bgc_Nit, &
368 : nt_bgc_Sil_out=nt_bgc_Sil, nt_bgc_hum_out=nt_bgc_hum, &
369 : nt_bgc_DMSPp_out=nt_bgc_DMSPp, nt_bgc_DMSPd_out=nt_bgc_DMSPd, &
370 : nt_bgc_DMS_out=nt_bgc_DMS, nt_bgc_PON_out=nt_bgc_PON, &
371 : nt_bgc_DON_out=nt_bgc_DON, nt_bgc_Fed_out=nt_bgc_Fed, &
372 : nt_bgc_Fep_out=nt_bgc_Fep, nt_zbgc_frac_out=nt_zbgc_frac, &
373 3 : nt_zaero_out=nt_zaero)
374 3 : call icepack_warnings_flush(nu_diag)
375 3 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
376 0 : file=__FILE__,line= __LINE__)
377 :
378 : !-----------------------------------------------------------------
379 : ! Skeletal Layer BGC
380 : !-----------------------------------------------------------------
381 :
382 3 : if (skl_bgc) then
383 0 : write(nu_diag,*) 'skl bgc restart'
384 :
385 0 : write (nu_diag,*) 'min/max algal N, chl'
386 0 : do k = 1, n_algae
387 0 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_N(k),:),ncat)
388 0 : if (tr_bgc_chl) &
389 0 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_chl(k),:),ncat)
390 : enddo ! k
391 0 : if (tr_bgc_C) then
392 : ! algal C is not yet distinct from algal N
393 : ! write (nu_diag,*) 'min/max algal C, DOC, DIC'
394 : ! do k = 1, n_algae
395 : ! call read_restart_field(nu_restart,trcrn(:,nt_bgc_C(k),:),ncat)
396 : ! enddo
397 0 : write (nu_diag,*) 'min/max DOC, DIC'
398 0 : do k = 1, n_doc
399 0 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_DOC(k),:),ncat)
400 : enddo
401 0 : do k = 1, n_dic
402 0 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_DIC(k),:),ncat)
403 : enddo
404 : endif
405 0 : write (nu_diag,*) 'min/max Nit, Am, Sil, hum'
406 0 : if (tr_bgc_Nit) &
407 0 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_Nit,:),ncat)
408 0 : if (tr_bgc_Am) &
409 0 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_Am,:),ncat)
410 0 : if (tr_bgc_Sil) &
411 0 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_Sil,:),ncat)
412 0 : if (tr_bgc_hum) &
413 0 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_hum,:),ncat)
414 0 : if (tr_bgc_DMS) then
415 0 : write (nu_diag,*) 'min/max pDMSP, dDMSP, DMS'
416 0 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_DMSPp,:),ncat)
417 0 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_DMSPd,:),ncat)
418 0 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_DMS,:),ncat)
419 : endif
420 0 : write (nu_diag,*) 'min/max PON'
421 0 : if (tr_bgc_PON) &
422 0 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_PON,:),ncat)
423 0 : if (tr_bgc_DON) then
424 0 : write (nu_diag,*) 'min/max DON'
425 0 : do k = 1, n_don
426 0 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_DON(k),:),ncat)
427 : enddo
428 : endif
429 0 : if (tr_bgc_Fe) then
430 0 : write (nu_diag,*) 'min/max dFe, pFe'
431 0 : do k = 1, n_fed
432 0 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_Fed (k),:),ncat)
433 : enddo
434 0 : do k = 1, n_fep
435 0 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_Fep (k),:),ncat)
436 : enddo
437 : endif
438 :
439 3 : elseif (z_tracers) then
440 :
441 : !-----------------------------------------------------------------
442 : ! Z Layer BGC
443 : !-----------------------------------------------------------------
444 :
445 3 : if (tr_bgc_Nit) then
446 2 : write(nu_diag,*) 'z bgc restart: min/max Nitrate'
447 22 : do k=1, nblyr+3
448 22 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_Nit+k-1,:),ncat)
449 : enddo
450 : endif ! Nit
451 3 : if (tr_bgc_N) then
452 8 : do mm = 1, n_algae
453 6 : write(nu_diag,*) ' min/max Algal N', n_algae
454 66 : do k=1, nblyr+3
455 66 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_N(mm)+k-1,:),ncat)
456 : enddo
457 8 : if (tr_bgc_chl) then
458 0 : write(nu_diag,*) ' min/max Algal chla'
459 0 : do k=1, nblyr+3
460 0 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_chl(mm)+k-1,:),ncat)
461 : enddo
462 : endif ! tr_bgc_chl
463 : enddo ! n_algae
464 : endif ! tr_bgc_N
465 3 : if (tr_bgc_C) then
466 : ! algal C is not yet distinct from algal N
467 : ! do mm = 1, n_algae
468 : ! write(nu_diag,*) ' min/max algalC'
469 : ! do k=1, nblyr+3
470 : ! call read_restart_field(nu_restart,trcrn(:,nt_bgc_C(mm)+k-1,:),ncat)
471 : ! enddo
472 : ! enddo !mm
473 6 : do mm = 1, n_doc
474 4 : write(nu_diag,*) ' min/max DOC'
475 46 : do k=1, nblyr+3
476 44 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_DOC(mm)+k-1,:),ncat)
477 : enddo
478 : enddo !mm
479 4 : do mm = 1, n_dic
480 2 : write(nu_diag,*) ' min/max DIC'
481 24 : do k=1, nblyr+3
482 22 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_DIC(mm)+k-1,:),ncat)
483 : enddo
484 : enddo !mm
485 : endif ! tr_bgc_C
486 3 : if (tr_bgc_Am) then
487 2 : write(nu_diag,*) ' min/max ammonium'
488 22 : do k=1, nblyr+3
489 22 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_Am+k-1,:),ncat)
490 : enddo
491 : endif
492 3 : if (tr_bgc_Sil) then
493 2 : write(nu_diag,*) ' min/max silicate'
494 22 : do k=1, nblyr+3
495 22 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_Sil+k-1,:),ncat)
496 : enddo
497 : endif
498 3 : if (tr_bgc_hum) then
499 2 : write(nu_diag,*) ' min/max humic material'
500 22 : do k=1, nblyr+3
501 22 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_hum+k-1,:),ncat)
502 : enddo
503 : endif
504 3 : if (tr_bgc_DMS) then
505 2 : write (nu_diag,*) 'min/max pDMSP, dDMSP, DMS'
506 22 : do k=1, nblyr+3
507 20 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_DMSPp+k-1,:),ncat)
508 20 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_DMSPd+k-1,:),ncat)
509 22 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_DMS+k-1,:),ncat)
510 : enddo
511 : endif
512 3 : if (tr_bgc_PON) then
513 2 : write(nu_diag,*) ' min/max PON'
514 22 : do k=1, nblyr+3
515 22 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_PON+k-1,:),ncat)
516 : enddo
517 : endif
518 3 : if (tr_bgc_DON) then
519 4 : do mm = 1, n_don
520 2 : write(nu_diag,*) ' min/max DON'
521 24 : do k=1, nblyr+3
522 22 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_DON(mm)+k-1,:),ncat)
523 : enddo
524 : enddo !mm
525 : endif
526 3 : if (tr_bgc_Fe) then
527 4 : do mm = 1, n_fed
528 2 : write(nu_diag,*) ' min/max dFe '
529 24 : do k=1, nblyr+3
530 22 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_Fed (mm)+k-1,:),ncat)
531 : enddo
532 : enddo !mm
533 4 : do mm = 1, n_fep
534 2 : write(nu_diag,*) ' min/max pFe '
535 24 : do k=1, nblyr+3
536 22 : call read_restart_field(nu_restart,trcrn(:,nt_bgc_Fep (mm)+k-1,:),ncat)
537 : enddo
538 : enddo !mm
539 : endif
540 3 : if (tr_zaero) then
541 15 : do mm = 1, n_zaero
542 12 : write(nu_diag,*) ' min/max z aerosols'
543 135 : do k=1, nblyr+3
544 132 : call read_restart_field(nu_restart,trcrn(:,nt_zaero(mm)+k-1,:),ncat)
545 : enddo
546 : enddo !mm
547 : endif
548 3 : if (nbtrcr > 0) then
549 3 : write (nu_diag,*) 'min/max zbgc_frac'
550 49 : do mm = 1, nbtrcr
551 49 : call read_restart_field(nu_restart,trcrn(:,nt_zbgc_frac+mm-1,:),ncat)
552 : enddo
553 : endif
554 :
555 : !-----------------------------------------------------------------
556 : ! Ocean BGC
557 : !-----------------------------------------------------------------
558 :
559 3 : write(nu_diag,*) 'mixed layer ocean bgc restart'
560 3 : if (tr_bgc_N) then
561 2 : write (nu_diag,*) 'min/max algalN'
562 8 : do k = 1, n_algae
563 8 : call read_restart_field(nu_restart,algalN(:,k),1)
564 : enddo ! k
565 : endif
566 3 : if (tr_bgc_C) then
567 2 : write (nu_diag,*) 'min/max DOC, DIC'
568 6 : do k = 1, n_doc
569 6 : call read_restart_field(nu_restart,doc(:,k),1)
570 : enddo ! k
571 4 : do k = 1, n_dic
572 4 : call read_restart_field(nu_restart,dic(:,k),1)
573 : enddo ! k
574 : endif !tr_bgc_C
575 :
576 3 : write (nu_diag,*) 'min/max Nit, Am, Sil, hum, DMSP, DMS'
577 3 : if (tr_bgc_Nit) &
578 2 : call read_restart_field(nu_restart,nit,1)
579 3 : if (tr_bgc_Am) &
580 2 : call read_restart_field(nu_restart,amm ,1)
581 3 : if (tr_bgc_Sil) &
582 2 : call read_restart_field(nu_restart,sil,1)
583 3 : if (tr_bgc_hum) &
584 2 : call read_restart_field(nu_restart,hum,1)
585 3 : if (tr_bgc_DMS) then
586 2 : call read_restart_field(nu_restart,dmsp,1)
587 2 : call read_restart_field(nu_restart,dms,1)
588 : endif
589 3 : if (tr_bgc_DON) then
590 2 : write (nu_diag,*) 'min/max DON'
591 4 : do k = 1, n_don
592 4 : call read_restart_field(nu_restart,don(:,k),1)
593 : enddo ! k
594 : endif
595 3 : if (tr_bgc_Fe ) then
596 2 : write (nu_diag,*) 'min/max dFe, pFe'
597 4 : do k = 1, n_fed
598 4 : call read_restart_field(nu_restart,fed(:,k),1)
599 : enddo ! k
600 4 : do k = 1, n_fep
601 4 : call read_restart_field(nu_restart,fep(:,k),1)
602 : enddo ! k
603 : endif
604 3 : if (tr_zaero) then
605 3 : write (nu_diag,*) 'min/max zaeros'
606 15 : do k = 1, n_zaero
607 15 : call read_restart_field(nu_restart,zaeros(:,k),1)
608 : enddo ! k
609 : endif
610 :
611 : endif ! skl_bgc or z_tracers
612 :
613 3 : end subroutine read_restart_bgc
614 :
615 : !=======================================================================
616 :
617 : end module icedrv_restart_bgc
618 :
619 : !=======================================================================
|