Line data Source code
1 : !=======================================================================
2 :
3 : ! Read and write ice model restart files
4 : !
5 : ! authors Elizabeth C. Hunke, LANL
6 :
7 : module icedrv_restart
8 :
9 : use icedrv_kinds
10 : use icedrv_constants, only: nu_diag, nu_restart, nu_dump
11 : use icedrv_constants, only: c0, c1, p5
12 : use icedrv_restart_shared, only: restart, restart_dir, restart_file, lenstr
13 : use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted
14 : use icepack_intfc, only: icepack_query_tracer_flags, icepack_query_tracer_indices
15 : use icepack_intfc, only: icepack_query_parameters
16 : use icedrv_system, only: icedrv_system_abort
17 :
18 : implicit none
19 : private :: write_restart_pond_topo, read_restart_pond_topo, &
20 : write_restart_age, read_restart_age, &
21 : write_restart_FY, read_restart_FY, &
22 : write_restart_lvl, read_restart_lvl, &
23 : write_restart_pond_cesm, read_restart_pond_cesm, &
24 : write_restart_pond_lvl, read_restart_pond_lvl, &
25 : write_restart_fsd, read_restart_fsd, &
26 : write_restart_iso, read_restart_iso, &
27 : write_restart_aero, read_restart_aero
28 :
29 : public :: dumpfile, restartfile, final_restart, &
30 : write_restart_field, read_restart_field
31 :
32 : !=======================================================================
33 :
34 : contains
35 :
36 : !=======================================================================
37 :
38 : !=======================================================================
39 : !---! these subroutines write/read Fortran unformatted data files ..
40 : !=======================================================================
41 :
42 : ! Dumps all values needed for a restart
43 : ! author Elizabeth C. Hunke, LANL
44 :
45 816 : subroutine dumpfile
46 :
47 : use icedrv_calendar, only: sec, month, mday, nyr, istep1
48 : use icedrv_calendar, only: time, time_forc, year_init
49 : use icedrv_domain_size, only: nilyr, nslyr, ncat
50 : use icedrv_forcing, only: oceanmixed_ice
51 : use icedrv_flux, only: scale_factor, swvdr, swvdf, swidr, swidf
52 : use icedrv_flux, only: sst, frzmlt
53 : use icedrv_state, only: aicen, vicen, vsnon, trcrn
54 :
55 : ! local variables
56 :
57 : integer (kind=int_kind) :: &
58 : k, & ! counting indices
59 : iyear
60 :
61 : integer (kind=int_kind) :: &
62 : nt_Tsfc, nt_sice, nt_qice, nt_qsno
63 :
64 : logical (kind=log_kind) :: &
65 : tr_iage, tr_FY, tr_lvl, tr_iso, tr_aero, tr_brine, &
66 : tr_pond_topo, tr_pond_cesm, tr_pond_lvl, tr_fsd
67 : ! solve_zsal, skl_bgc, z_tracers
68 :
69 : character(len=char_len_long) :: filename
70 : character(len=*), parameter :: subname='(dumpfile)'
71 :
72 : ! construct path/file
73 816 : iyear = nyr + year_init - 1
74 :
75 517 : write(filename,'(a,a,a,i4.4,a,i2.2,a,i2.2,a,i5.5)') &
76 1850 : restart_dir(1:lenstr(restart_dir)), &
77 1333 : restart_file(1:lenstr(restart_file)),'.', &
78 1632 : iyear,'-',month,'-',mday,'-',sec
79 :
80 : call icepack_query_tracer_indices(nt_Tsfc_out=nt_Tsfc, nt_sice_out=nt_sice, &
81 816 : nt_qice_out=nt_qice, nt_qsno_out=nt_qsno)
82 : call icepack_query_tracer_flags(tr_iage_out=tr_iage, tr_FY_out=tr_FY, &
83 : tr_lvl_out=tr_lvl, tr_aero_out=tr_aero, tr_iso_out=tr_iso, &
84 : tr_brine_out=tr_brine, &
85 : tr_pond_topo_out=tr_pond_topo, tr_pond_cesm_out=tr_pond_cesm, &
86 816 : tr_pond_lvl_out=tr_pond_lvl,tr_fsd_out=tr_fsd)
87 : ! call icepack_query_parameters(solve_zsal_out=solve_zsal, &
88 : ! skl_bgc_out=skl_bgc, z_tracers_out=z_tracers)
89 816 : call icepack_warnings_flush(nu_diag)
90 816 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
91 0 : file=__FILE__,line= __LINE__)
92 :
93 816 : open(nu_dump,file=filename,form='unformatted')
94 816 : write(nu_dump) istep1,time,time_forc
95 816 : write(nu_diag,*) 'Writing ',filename(1:lenstr(filename))
96 :
97 : !-----------------------------------------------------------------
98 : ! state variables
99 : ! Tsfc is the only tracer written to binary files. All other
100 : ! tracers are written to their own dump/restart binary files.
101 : !-----------------------------------------------------------------
102 :
103 816 : call write_restart_field(nu_dump,aicen(:,:),ncat)
104 816 : call write_restart_field(nu_dump,vicen(:,:),ncat)
105 816 : call write_restart_field(nu_dump,vsnon(:,:),ncat)
106 816 : call write_restart_field(nu_dump,trcrn(:,nt_Tsfc,:),ncat)
107 6132 : do k=1,nilyr
108 6132 : call write_restart_field(nu_dump,trcrn(:,nt_sice+k-1,:),ncat)
109 : enddo
110 6132 : do k=1,nilyr
111 6132 : call write_restart_field(nu_dump,trcrn(:,nt_qice+k-1,:),ncat)
112 : enddo
113 1764 : do k=1,nslyr
114 1764 : call write_restart_field(nu_dump,trcrn(:,nt_qsno+k-1,:),ncat)
115 : enddo
116 :
117 : !-----------------------------------------------------------------
118 : ! radiation fields
119 : !-----------------------------------------------------------------
120 816 : call write_restart_field(nu_dump,scale_factor,1)
121 816 : call write_restart_field(nu_dump,swvdr,1)
122 816 : call write_restart_field(nu_dump,swvdf,1)
123 816 : call write_restart_field(nu_dump,swidr,1)
124 816 : call write_restart_field(nu_dump,swidf,1)
125 :
126 : !-----------------------------------------------------------------
127 : ! for mixed layer model
128 : !-----------------------------------------------------------------
129 816 : if (oceanmixed_ice) then
130 816 : call write_restart_field(nu_dump,sst,1)
131 816 : call write_restart_field(nu_dump,frzmlt,1)
132 : endif
133 :
134 : ! tracers
135 816 : if (tr_iage) call write_restart_age() ! ice age tracer
136 816 : if (tr_FY) call write_restart_FY() ! first-year area tracer
137 816 : if (tr_lvl) call write_restart_lvl() ! level ice tracer
138 816 : if (tr_pond_cesm) call write_restart_pond_cesm() ! CESM melt ponds
139 816 : if (tr_pond_lvl) call write_restart_pond_lvl() ! level-ice melt ponds
140 816 : if (tr_pond_topo) call write_restart_pond_topo() ! topographic melt ponds
141 816 : if (tr_iso) call write_restart_iso() ! ice isotopes
142 816 : if (tr_aero) call write_restart_aero() ! ice aerosols
143 816 : if (tr_brine) call write_restart_hbrine() ! brine height
144 816 : if (tr_fsd) call write_restart_fsd() ! floe size distribution
145 : ! called in icedrv_RunMod.F90 to prevent circular dependencies
146 : ! if (solve_zsal .or. skl_bgc .or. z_tracers) &
147 : ! call write_restart_bgc ! biogeochemistry
148 :
149 816 : end subroutine dumpfile
150 :
151 : !=======================================================================
152 :
153 : ! Restarts from a dump
154 : ! author Elizabeth C. Hunke, LANL
155 :
156 14 : subroutine restartfile (ice_ic)
157 :
158 : use icedrv_calendar, only: istep0, istep1, time, time_forc
159 : use icepack_intfc, only: icepack_aggregate
160 : use icedrv_domain_size, only: nilyr, nslyr, ncat
161 : use icedrv_domain_size, only: max_ntrcr, nx
162 : use icedrv_flux, only: swvdr, swvdf, swidr, swidf
163 : use icedrv_flux, only: sst, frzmlt, scale_factor
164 : use icedrv_forcing, only: oceanmixed_ice
165 : use icedrv_init, only: tmask
166 : use icedrv_state, only: trcr_depend, aice, vice, vsno, trcr
167 : use icedrv_state, only: aice0, aicen, vicen, vsnon, trcrn, aice_init
168 : use icedrv_state, only: trcr_base, nt_strata, n_trcr_strata
169 :
170 : character (*), optional :: ice_ic
171 :
172 : ! local variables
173 :
174 : integer (kind=int_kind) :: &
175 : i, k ! counting indices
176 :
177 : integer (kind=int_kind) :: &
178 : nt_Tsfc, nt_sice, nt_qice, nt_qsno
179 :
180 : logical (kind=log_kind) :: &
181 : tr_iage, tr_FY, tr_lvl, tr_iso, tr_aero, tr_brine, &
182 : tr_pond_topo, tr_pond_cesm, tr_pond_lvl, tr_fsd
183 :
184 : character(len=char_len_long) :: filename
185 : character(len=*), parameter :: subname='(restartfile)'
186 :
187 14 : if (present(ice_ic)) then
188 14 : filename = trim(ice_ic)
189 : else
190 : call icedrv_system_abort(string=subname//'no ice_ic present', &
191 0 : file=__FILE__,line=__LINE__)
192 : endif
193 :
194 14 : write(nu_diag,*) 'Using restart dump=', trim(filename)
195 14 : open(nu_restart,file=filename,form='unformatted')
196 14 : read (nu_restart) istep0,time,time_forc
197 14 : write(nu_diag,*) 'Restart read at istep=',istep0,time,time_forc
198 :
199 : call icepack_query_tracer_indices(nt_Tsfc_out=nt_Tsfc, nt_sice_out=nt_sice, &
200 14 : nt_qice_out=nt_qice, nt_qsno_out=nt_qsno)
201 : call icepack_query_tracer_flags(tr_iage_out=tr_iage, tr_FY_out=tr_FY, &
202 : tr_lvl_out=tr_lvl, tr_aero_out=tr_aero, tr_iso_out=tr_iso, &
203 : tr_brine_out=tr_brine, &
204 : tr_pond_topo_out=tr_pond_topo, tr_pond_cesm_out=tr_pond_cesm, &
205 14 : tr_pond_lvl_out=tr_pond_lvl,tr_fsd_out=tr_fsd)
206 14 : call icepack_warnings_flush(nu_diag)
207 14 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
208 0 : file=__FILE__,line= __LINE__)
209 :
210 14 : istep1 = istep0
211 :
212 : !-----------------------------------------------------------------
213 : ! state variables
214 : ! Tsfc is the only tracer read in this file. All other
215 : ! tracers are in their own dump/restart files.
216 : !-----------------------------------------------------------------
217 14 : write(nu_diag,*) 'min/max area, vol ice, vol snow, Tsfc'
218 :
219 14 : call read_restart_field(nu_restart,aicen,ncat)
220 14 : call read_restart_field(nu_restart,vicen,ncat)
221 14 : call read_restart_field(nu_restart,vsnon,ncat)
222 14 : call read_restart_field(nu_restart,trcrn(:,nt_Tsfc,:),ncat)
223 :
224 14 : write(nu_diag,*) 'min/max sice for each layer'
225 100 : do k=1,nilyr
226 100 : call read_restart_field(nu_restart,trcrn(:,nt_sice+k-1,:),ncat)
227 : enddo
228 :
229 14 : write(nu_diag,*) 'min/max qice for each layer'
230 100 : do k=1,nilyr
231 100 : call read_restart_field(nu_restart,trcrn(:,nt_qice+k-1,:),ncat)
232 : enddo
233 :
234 14 : write(nu_diag,*) 'min/max qsno for each layer'
235 32 : do k=1,nslyr
236 32 : call read_restart_field(nu_restart,trcrn(:,nt_qsno+k-1,:),ncat)
237 : enddo
238 :
239 : !-----------------------------------------------------------------
240 : ! radiation fields
241 : !-----------------------------------------------------------------
242 :
243 14 : write(nu_diag,*) 'min/max radiation fields'
244 :
245 14 : call read_restart_field(nu_restart,scale_factor,1)
246 14 : call read_restart_field(nu_restart,swvdr,1)
247 14 : call read_restart_field(nu_restart,swvdf,1)
248 14 : call read_restart_field(nu_restart,swidr,1)
249 14 : call read_restart_field(nu_restart,swidf,1)
250 :
251 : !-----------------------------------------------------------------
252 : ! for mixed layer model
253 : !-----------------------------------------------------------------
254 :
255 14 : if (oceanmixed_ice) then
256 14 : write(nu_diag,*) 'min/max sst, frzmlt'
257 14 : call read_restart_field(nu_restart,sst,1)
258 14 : call read_restart_field(nu_restart,frzmlt,1)
259 : endif
260 :
261 : ! tracers
262 14 : if (tr_iage) call read_restart_age() ! ice age tracer
263 14 : if (tr_FY) call read_restart_FY() ! first-year area tracer
264 14 : if (tr_lvl) call read_restart_lvl() ! level ice tracer
265 14 : if (tr_pond_cesm) call read_restart_pond_cesm() ! CESM melt ponds
266 14 : if (tr_pond_lvl) call read_restart_pond_lvl() ! level-ice melt ponds
267 14 : if (tr_pond_topo) call read_restart_pond_topo() ! topographic melt ponds
268 14 : if (tr_iso) call read_restart_iso() ! ice isotopes
269 14 : if (tr_aero) call read_restart_aero() ! ice aerosols
270 14 : if (tr_brine) call read_restart_hbrine ! brine height
271 14 : if (tr_fsd) call read_restart_fsd() ! floe size distribution
272 : !-----------------------------------------------------------------
273 : ! Ensure ice is binned in correct categories
274 : ! (should not be necessary unless restarting from a run with
275 : ! different category boundaries).
276 : !
277 : ! If called, this subroutine does not give exact restart.
278 : !-----------------------------------------------------------------
279 : !!! call cleanup_itd
280 :
281 : !-----------------------------------------------------------------
282 : ! compute aggregate ice state and open water area
283 : !-----------------------------------------------------------------
284 :
285 70 : do i = 1, nx
286 56 : if (tmask(i)) &
287 : call icepack_aggregate (ncat=ncat, &
288 : aicen=aicen(i,:), &
289 : trcrn=trcrn(i,:,:), &
290 : vicen=vicen(i,:), &
291 : vsnon=vsnon(i,:), &
292 3 : aice=aice (i), &
293 : trcr=trcr (i,:), &
294 3 : vice=vice (i), &
295 3 : vsno=vsno (i), &
296 3 : aice0=aice0(i), &
297 : ntrcr=max_ntrcr, &
298 : trcr_depend=trcr_depend, &
299 : trcr_base=trcr_base, &
300 : n_trcr_strata=n_trcr_strata, &
301 48 : nt_strata=nt_strata)
302 :
303 70 : aice_init(i) = aice(i)
304 : enddo
305 14 : call icepack_warnings_flush(nu_diag)
306 14 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
307 0 : file=__FILE__, line=__LINE__)
308 :
309 14 : end subroutine restartfile
310 :
311 : !=======================================================================
312 :
313 : ! Reads a single restart field
314 : ! author Chris Newman, LANL
315 :
316 677 : subroutine read_restart_field(nu,work,ndim)
317 :
318 : use icedrv_domain_size, only: nx
319 :
320 : integer (kind=int_kind), intent(in) :: &
321 : nu , & ! unit number (not used for netcdf)
322 : ndim ! number of dimensions
323 :
324 : real (kind=dbl_kind), dimension(nx,ndim), intent(inout) :: &
325 : work ! input array (real, 8-byte)
326 :
327 : ! local variables
328 :
329 : integer (kind=int_kind) :: &
330 : n, i ! loop indices
331 :
332 : real (kind=dbl_kind), dimension(nx) :: &
333 170 : work2 ! input array (real, 8-byte)
334 :
335 : real (kind=dbl_kind) :: &
336 34 : minw, maxw, sumw ! diagnostics
337 :
338 : character(len=*), parameter :: subname='(read_restart_field)'
339 :
340 3526 : do n = 1, ndim
341 14245 : read(nu) (work2(i), i=1,nx)
342 14922 : work(:,n) = work2(:)
343 : enddo
344 :
345 14922 : minw = minval(work)
346 14922 : maxw = maxval(work)
347 14922 : sumw = sum(work)
348 677 : write(nu_diag,*) subname, minw, maxw, sumw
349 :
350 677 : end subroutine read_restart_field
351 :
352 : !=======================================================================
353 :
354 : ! Writes a single restart field.
355 : ! author Chris Newman, LANL
356 :
357 32487 : subroutine write_restart_field(nu,work,ndim)
358 :
359 : use icedrv_domain_size, only: nx
360 :
361 : integer (kind=int_kind), intent(in) :: &
362 : nu , & ! unit number
363 : ndim ! number of dimensions
364 :
365 : real (kind=dbl_kind), dimension(nx,ndim), intent(in) :: &
366 : work ! input array (real, 8-byte)
367 :
368 : ! local variables
369 :
370 : integer (kind=int_kind) :: &
371 : n, i ! loop indices
372 :
373 : real (kind=dbl_kind), dimension(nx) :: &
374 89660 : work2 ! input array (real, 8-byte)
375 :
376 : real (kind=dbl_kind) :: &
377 17932 : minw, maxw, sumw ! diagnostics
378 :
379 : character(len=*), parameter :: subname='(write_restart_field)'
380 :
381 166522 : do n = 1, ndim
382 670175 : work2(:) = work(:,n)
383 702662 : write(nu) (work2(i), i=1,nx)
384 : enddo
385 :
386 702662 : minw = minval(work)
387 702662 : maxw = maxval(work)
388 702662 : sumw = sum(work)
389 32487 : write(nu_diag,*) subname, minw, maxw, sumw
390 :
391 32487 : end subroutine write_restart_field
392 :
393 : !=======================================================================
394 :
395 : ! Finalize the restart file.
396 : ! author David A. Bailey, NCAR
397 :
398 816 : subroutine final_restart()
399 :
400 : use icedrv_calendar, only: istep1, time, time_forc
401 :
402 : character(len=*), parameter :: subname='(final_restart)'
403 :
404 816 : close(nu_dump)
405 816 : write(nu_diag,*) 'Restart read/written ',istep1,time,time_forc
406 :
407 816 : end subroutine final_restart
408 :
409 : !=======================================================================
410 :
411 : ! Dumps all values needed for restarting
412 : !
413 : ! authors Elizabeth C. Hunke, LANL
414 : ! David A. Bailey, NCAR
415 :
416 54 : subroutine write_restart_pond_topo()
417 :
418 : use icedrv_state, only: trcrn
419 : use icedrv_domain_size, only: ncat
420 :
421 : integer (kind=int_kind) :: nt_apnd, nt_hpnd, nt_ipnd
422 : character(len=*), parameter :: subname='(write_restart_pond_topo)'
423 :
424 : call icepack_query_tracer_indices(nt_apnd_out=nt_apnd, nt_hpnd_out=nt_hpnd, &
425 54 : nt_ipnd_out=nt_ipnd)
426 54 : call icepack_warnings_flush(nu_diag)
427 54 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
428 0 : file=__FILE__,line= __LINE__)
429 :
430 54 : call write_restart_field(nu_dump,trcrn(:,nt_apnd,:),ncat)
431 54 : call write_restart_field(nu_dump,trcrn(:,nt_hpnd,:),ncat)
432 54 : call write_restart_field(nu_dump,trcrn(:,nt_ipnd,:),ncat)
433 :
434 54 : end subroutine write_restart_pond_topo
435 :
436 : !=======================================================================
437 :
438 : ! Reads all values needed for a meltpond volume restart
439 : !
440 : ! authors Elizabeth C. Hunke, LANL
441 : ! David A. Bailey, NCAR
442 :
443 2 : subroutine read_restart_pond_topo()
444 :
445 : use icedrv_state, only: trcrn
446 : use icedrv_domain_size, only: ncat
447 : integer (kind=int_kind) :: nt_apnd, nt_hpnd, nt_ipnd
448 : character(len=*), parameter :: subname='(read_restart_pond_topo)'
449 :
450 : call icepack_query_tracer_indices(nt_apnd_out=nt_apnd, nt_hpnd_out=nt_hpnd, &
451 2 : nt_ipnd_out=nt_ipnd)
452 2 : call icepack_warnings_flush(nu_diag)
453 2 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
454 0 : file=__FILE__,line= __LINE__)
455 :
456 2 : write(nu_diag,*) 'min/max topo ponds'
457 :
458 2 : call read_restart_field(nu_restart,trcrn(:,nt_apnd,:),ncat)
459 2 : call read_restart_field(nu_restart,trcrn(:,nt_hpnd,:),ncat)
460 2 : call read_restart_field(nu_restart,trcrn(:,nt_ipnd,:),ncat)
461 :
462 2 : end subroutine read_restart_pond_topo
463 :
464 : !=======================================================================
465 :
466 : ! Dumps all values needed for restarting
467 : ! author Elizabeth C. Hunke, LANL
468 :
469 21 : subroutine write_restart_age()
470 :
471 : use icedrv_state, only: trcrn
472 : use icedrv_domain_size, only: ncat
473 : integer (kind=int_kind) :: nt_iage
474 : character(len=*), parameter :: subname='(write_restart_age)'
475 :
476 21 : call icepack_query_tracer_indices(nt_iage_out=nt_iage)
477 21 : call icepack_warnings_flush(nu_diag)
478 21 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
479 0 : file=__FILE__,line= __LINE__)
480 :
481 21 : call write_restart_field(nu_dump,trcrn(:,nt_iage,:),ncat)
482 :
483 21 : end subroutine write_restart_age
484 :
485 : !=======================================================================
486 :
487 : ! Reads all values needed for an ice age restart
488 : ! author Elizabeth C. Hunke, LANL
489 :
490 1 : subroutine read_restart_age()
491 :
492 : use icedrv_state, only: trcrn
493 : use icedrv_domain_size, only: ncat
494 : integer (kind=int_kind) :: nt_iage
495 : character(len=*), parameter :: subname='(read_restart_age)'
496 :
497 1 : write(nu_diag,*) 'min/max age (s)'
498 :
499 1 : call icepack_query_tracer_indices(nt_iage_out=nt_iage)
500 1 : call icepack_warnings_flush(nu_diag)
501 1 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
502 0 : file=__FILE__,line= __LINE__)
503 :
504 1 : call read_restart_field(nu_restart,trcrn(:,nt_iage,:),ncat)
505 :
506 1 : end subroutine read_restart_age
507 :
508 : !=======================================================================
509 :
510 : ! Dumps all values needed for restarting
511 : ! author Elizabeth C. Hunke, LANL
512 :
513 38 : subroutine write_restart_fsd()
514 :
515 : use icedrv_state, only: trcrn
516 : use icedrv_domain_size, only: ncat, nfsd
517 : integer (kind=int_kind) :: nt_fsd, k
518 : character(len=*), parameter :: subname='(write_restart_fsd)'
519 :
520 38 : call icepack_query_tracer_indices(nt_fsd_out=nt_fsd)
521 38 : call icepack_warnings_flush(nu_diag)
522 38 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
523 0 : file=__FILE__,line= __LINE__)
524 :
525 362 : do k = 1, nfsd
526 362 : call write_restart_field(nu_dump,trcrn(:,nt_fsd+k-1,:),ncat)
527 : end do
528 :
529 38 : end subroutine write_restart_fsd
530 :
531 : !=======================================================================
532 :
533 : ! Reads all values needed for a FSD restart
534 : ! author Elizabeth C. Hunke, LANL
535 :
536 0 : subroutine read_restart_fsd()
537 :
538 : use icedrv_state, only: trcrn
539 : use icedrv_domain_size, only: ncat, nfsd
540 : integer (kind=int_kind) :: nt_fsd, k
541 : character(len=*), parameter :: subname='(read_restart_fsd)'
542 :
543 0 : write(nu_diag,*) 'min/max fsd'
544 :
545 0 : call icepack_query_tracer_indices(nt_fsd_out=nt_fsd)
546 0 : call icepack_warnings_flush(nu_diag)
547 0 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
548 0 : file=__FILE__,line= __LINE__)
549 :
550 0 : do k =1, nfsd
551 0 : call read_restart_field(nu_restart,trcrn(:,nt_fsd+k-1,:),ncat)
552 : end do
553 :
554 0 : end subroutine read_restart_fsd
555 :
556 : !=======================================================================
557 :
558 : ! Dumps all values needed for restarting
559 : ! author Elizabeth C. Hunke, LANL
560 :
561 21 : subroutine write_restart_FY()
562 :
563 : use icedrv_flux, only: frz_onset
564 : use icedrv_state, only: trcrn
565 : use icedrv_domain_size, only: ncat
566 : integer (kind=int_kind) :: nt_FY
567 : character(len=*), parameter :: subname='(write_restart_FY)'
568 :
569 21 : call icepack_query_tracer_indices(nt_FY_out=nt_FY)
570 21 : call icepack_warnings_flush(nu_diag)
571 21 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
572 0 : file=__FILE__,line= __LINE__)
573 :
574 21 : call write_restart_field(nu_dump,trcrn(:,nt_FY,:),ncat)
575 21 : call write_restart_field(nu_dump,frz_onset,1)
576 :
577 21 : end subroutine write_restart_FY
578 :
579 : !=======================================================================
580 :
581 : ! Reads all values needed for an ice FY restart
582 : ! author Elizabeth C. Hunke, LANL
583 :
584 1 : subroutine read_restart_FY()
585 :
586 : use icedrv_flux, only: frz_onset
587 : use icedrv_state, only: trcrn
588 : use icedrv_domain_size, only: ncat
589 : integer (kind=int_kind) :: nt_FY
590 : character(len=*), parameter :: subname='(read_restart_FY)'
591 :
592 1 : call icepack_query_tracer_indices(nt_FY_out=nt_FY)
593 1 : call icepack_warnings_flush(nu_diag)
594 1 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
595 0 : file=__FILE__,line= __LINE__)
596 :
597 1 : write(nu_diag,*) 'min/max first-year ice area'
598 :
599 1 : call read_restart_field(nu_restart,trcrn(:,nt_FY,:),ncat)
600 :
601 1 : write(nu_diag,*) 'min/max frz_onset'
602 :
603 1 : call read_restart_field(nu_restart,frz_onset,1)
604 :
605 1 : end subroutine read_restart_FY
606 :
607 : !=======================================================================
608 :
609 : ! Dumps all values needed for restarting
610 : !
611 : ! author Elizabeth C. Hunke, LANL
612 :
613 774 : subroutine write_restart_lvl()
614 :
615 : use icedrv_state, only: trcrn
616 : use icedrv_domain_size, only: ncat
617 : integer (kind=int_kind) :: nt_alvl, nt_vlvl
618 : character(len=*), parameter :: subname='(write_restart_lvl)'
619 :
620 774 : call icepack_query_tracer_indices(nt_alvl_out=nt_alvl, nt_vlvl_out=nt_vlvl)
621 774 : call icepack_warnings_flush(nu_diag)
622 774 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
623 0 : file=__FILE__,line= __LINE__)
624 :
625 774 : call write_restart_field(nu_dump,trcrn(:,nt_alvl,:),ncat)
626 774 : call write_restart_field(nu_dump,trcrn(:,nt_vlvl,:),ncat)
627 :
628 774 : end subroutine write_restart_lvl
629 :
630 : !=======================================================================
631 :
632 : ! Reads all values needed for an ice lvl restart
633 : !
634 : ! author Elizabeth C. Hunke, LANL
635 :
636 12 : subroutine read_restart_lvl()
637 :
638 : use icedrv_state, only: trcrn
639 : use icedrv_domain_size, only: ncat
640 : integer (kind=int_kind) :: nt_alvl, nt_vlvl
641 : character(len=*), parameter :: subname='(read_restart_lvl)'
642 :
643 12 : call icepack_query_tracer_indices(nt_alvl_out=nt_alvl, nt_vlvl_out=nt_vlvl)
644 12 : call icepack_warnings_flush(nu_diag)
645 12 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
646 0 : file=__FILE__,line= __LINE__)
647 :
648 12 : write(nu_diag,*) 'min/max level ice area, volume'
649 :
650 12 : call read_restart_field(nu_restart,trcrn(:,nt_alvl,:),ncat)
651 12 : call read_restart_field(nu_restart,trcrn(:,nt_vlvl,:),ncat)
652 :
653 12 : end subroutine read_restart_lvl
654 :
655 : !=======================================================================!
656 :
657 : ! Dumps all values needed for restarting
658 : !
659 : ! authors Elizabeth C. Hunke, LANL
660 : ! David A. Bailey, NCAR
661 :
662 21 : subroutine write_restart_pond_cesm()
663 :
664 : use icedrv_state, only: trcrn
665 : use icedrv_domain_size, only: ncat
666 : integer (kind=int_kind) :: nt_apnd, nt_hpnd
667 : character(len=*), parameter :: subname='(write_restart_pond_cesm)'
668 :
669 21 : call icepack_query_tracer_indices(nt_apnd_out=nt_apnd, nt_hpnd_out=nt_hpnd)
670 21 : call icepack_warnings_flush(nu_diag)
671 21 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
672 0 : file=__FILE__,line= __LINE__)
673 :
674 21 : call write_restart_field(nu_dump,trcrn(:,nt_apnd,:),ncat)
675 21 : call write_restart_field(nu_dump,trcrn(:,nt_hpnd,:),ncat)
676 :
677 21 : end subroutine write_restart_pond_cesm
678 :
679 : !=======================================================================
680 :
681 : ! Reads all values needed for a meltpond volume restart
682 : !
683 : ! authors Elizabeth C. Hunke, LANL
684 : ! David A. Bailey, NCAR
685 :
686 1 : subroutine read_restart_pond_cesm()
687 :
688 : use icedrv_state, only: trcrn
689 : use icedrv_domain_size, only: ncat
690 : integer (kind=int_kind) :: nt_apnd, nt_hpnd
691 : character(len=*), parameter :: subname='(read_restart_pond_cesm)'
692 :
693 1 : call icepack_query_tracer_indices(nt_apnd_out=nt_apnd, nt_hpnd_out=nt_hpnd)
694 1 : call icepack_warnings_flush(nu_diag)
695 1 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
696 0 : file=__FILE__,line= __LINE__)
697 :
698 1 : write(nu_diag,*) 'min/max cesm ponds'
699 :
700 1 : call read_restart_field(nu_restart,trcrn(:,nt_apnd,:),ncat)
701 1 : call read_restart_field(nu_restart,trcrn(:,nt_hpnd,:),ncat)
702 :
703 1 : end subroutine read_restart_pond_cesm
704 :
705 : !=======================================================================
706 : !
707 : ! Dumps all values needed for restarting
708 : !
709 : ! authors Elizabeth C. Hunke, LANL
710 :
711 642 : subroutine write_restart_pond_lvl()
712 :
713 : use icedrv_arrays_column, only: dhsn, ffracn
714 : use icedrv_flux, only: fsnow
715 : use icedrv_state, only: trcrn
716 : use icedrv_domain_size, only: ncat
717 : integer (kind=int_kind) :: nt_apnd, nt_hpnd, nt_ipnd
718 : character(len=*), parameter :: subname='(write_restart_pond_lvl)'
719 :
720 : call icepack_query_tracer_indices(nt_apnd_out=nt_apnd, nt_hpnd_out=nt_hpnd, &
721 642 : nt_ipnd_out=nt_ipnd)
722 642 : call icepack_warnings_flush(nu_diag)
723 642 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
724 0 : file=__FILE__,line= __LINE__)
725 :
726 642 : call write_restart_field(nu_dump,trcrn(:,nt_apnd,:),ncat)
727 642 : call write_restart_field(nu_dump,trcrn(:,nt_hpnd,:),ncat)
728 642 : call write_restart_field(nu_dump,trcrn(:,nt_ipnd,:),ncat)
729 642 : call write_restart_field(nu_dump,fsnow(:),1)
730 642 : call write_restart_field(nu_dump,dhsn(:,:),ncat)
731 642 : call write_restart_field(nu_dump,ffracn(:,:),ncat)
732 :
733 642 : end subroutine write_restart_pond_lvl
734 :
735 : !=======================================================================
736 :
737 : ! Reads all values needed for a meltpond volume restart
738 : !
739 : ! authors Elizabeth C. Hunke, LANL
740 :
741 8 : subroutine read_restart_pond_lvl()
742 :
743 : use icedrv_arrays_column, only: dhsn, ffracn
744 : use icedrv_flux, only: fsnow
745 : use icedrv_state, only: trcrn
746 : use icedrv_domain_size, only: ncat
747 : integer (kind=int_kind) :: nt_apnd, nt_hpnd, nt_ipnd
748 : character(len=*), parameter :: subname='(write_restart_pond_lvl)'
749 :
750 : call icepack_query_tracer_indices(nt_apnd_out=nt_apnd, nt_hpnd_out=nt_hpnd, &
751 8 : nt_ipnd_out=nt_ipnd)
752 8 : call icepack_warnings_flush(nu_diag)
753 8 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
754 0 : file=__FILE__,line= __LINE__)
755 :
756 8 : write(nu_diag,*) 'min/max level-ice ponds'
757 :
758 8 : call read_restart_field(nu_restart,trcrn(:,nt_apnd,:),ncat)
759 8 : call read_restart_field(nu_restart,trcrn(:,nt_hpnd,:),ncat)
760 8 : call read_restart_field(nu_restart,trcrn(:,nt_ipnd,:),ncat)
761 8 : call read_restart_field(nu_restart,fsnow(:),1)
762 8 : call read_restart_field(nu_restart,dhsn(:,:),ncat)
763 8 : call read_restart_field(nu_restart,ffracn(:,:),ncat)
764 :
765 8 : end subroutine read_restart_pond_lvl
766 :
767 : !=======================================================================
768 :
769 : ! Dumps all values needed for restarting
770 : !
771 : ! authors Elizabeth Hunke, LANL
772 : ! David Bailey, NCAR
773 : ! Marika Holland, NCAR
774 :
775 21 : subroutine write_restart_aero()
776 :
777 : use icedrv_domain_size, only: n_aero
778 : use icedrv_state, only: trcrn
779 : use icedrv_domain_size, only: ncat
780 :
781 : ! local variables
782 :
783 : integer (kind=int_kind) :: &
784 : k ! loop indices
785 : integer (kind=int_kind) :: nt_aero
786 : character(len=*), parameter :: subname='(write_restart_aero)'
787 :
788 21 : call icepack_query_tracer_indices(nt_aero_out=nt_aero)
789 21 : call icepack_warnings_flush(nu_diag)
790 21 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
791 0 : file=__FILE__,line= __LINE__)
792 :
793 21 : write(nu_diag,*) 'write_restart_aero (aerosols)'
794 :
795 42 : do k = 1, n_aero
796 21 : call write_restart_field(nu_dump, trcrn(:,nt_aero +(k-1)*4,:), ncat)
797 21 : call write_restart_field(nu_dump, trcrn(:,nt_aero+1+(k-1)*4,:), ncat)
798 21 : call write_restart_field(nu_dump, trcrn(:,nt_aero+2+(k-1)*4,:), ncat)
799 42 : call write_restart_field(nu_dump, trcrn(:,nt_aero+3+(k-1)*4,:), ncat)
800 : enddo
801 :
802 21 : end subroutine write_restart_aero
803 :
804 : !=======================================================================
805 :
806 : ! Reads all values needed for an ice aerosol restart
807 : !
808 : ! authors Elizabeth Hunke, LANL
809 : ! David Bailey, NCAR
810 : ! Marika Holland, NCAR
811 :
812 1 : subroutine read_restart_aero()
813 :
814 : use icedrv_domain_size, only: n_aero
815 : use icedrv_state, only: trcrn
816 : use icedrv_domain_size, only: ncat
817 :
818 : ! local variables
819 :
820 : integer (kind=int_kind) :: &
821 : k ! loop indices
822 : integer (kind=int_kind) :: nt_aero
823 : character(len=*), parameter :: subname='(read_restart_aero)'
824 :
825 : !-----------------------------------------------------------------
826 :
827 1 : call icepack_query_tracer_indices(nt_aero_out=nt_aero)
828 1 : call icepack_warnings_flush(nu_diag)
829 1 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
830 0 : file=__FILE__,line= __LINE__)
831 :
832 1 : write(nu_diag,*) 'read_restart_aero (aerosols)'
833 :
834 2 : do k = 1, n_aero
835 1 : call read_restart_field(nu_restart, trcrn(:,nt_aero +(k-1)*4,:), ncat)
836 1 : call read_restart_field(nu_restart, trcrn(:,nt_aero+1+(k-1)*4,:), ncat)
837 1 : call read_restart_field(nu_restart, trcrn(:,nt_aero+2+(k-1)*4,:), ncat)
838 2 : call read_restart_field(nu_restart, trcrn(:,nt_aero+3+(k-1)*4,:), ncat)
839 : enddo
840 :
841 1 : end subroutine read_restart_aero
842 :
843 : !=======================================================================
844 :
845 : ! Dumps all values needed for restarting
846 : !
847 : ! authors Elizabeth Hunke, LANL
848 : ! David Bailey, NCAR
849 : ! Marika Holland, NCAR
850 :
851 21 : subroutine write_restart_iso()
852 :
853 : use icedrv_domain_size, only: n_iso
854 : use icedrv_state, only: trcrn
855 : use icedrv_domain_size, only: ncat
856 :
857 : ! local variables
858 :
859 : integer (kind=int_kind) :: &
860 : k ! loop indices
861 : integer (kind=int_kind) :: nt_isosno, nt_isoice
862 : character(len=*), parameter :: subname='(write_restart_iso)'
863 :
864 21 : call icepack_query_tracer_indices(nt_isosno_out=nt_isosno)
865 21 : call icepack_query_tracer_indices(nt_isoice_out=nt_isoice)
866 21 : call icepack_warnings_flush(nu_diag)
867 21 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
868 0 : file=__FILE__,line= __LINE__)
869 :
870 21 : write(nu_diag,*) 'write_restart_iso (isotopes)'
871 :
872 84 : do k = 1, n_iso
873 63 : call write_restart_field(nu_dump, trcrn(:,nt_isosno+(k-1),:), ncat)
874 84 : call write_restart_field(nu_dump, trcrn(:,nt_isoice+(k-1),:), ncat)
875 : enddo
876 :
877 21 : end subroutine write_restart_iso
878 :
879 : !=======================================================================
880 :
881 : ! Reads all values needed for an ice isotope restart
882 : !
883 : ! authors Elizabeth Hunke, LANL
884 : ! David Bailey, NCAR
885 : ! Marika Holland, NCAR
886 :
887 1 : subroutine read_restart_iso()
888 :
889 : use icedrv_domain_size, only: n_iso
890 : use icedrv_state, only: trcrn
891 : use icedrv_domain_size, only: ncat
892 :
893 : ! local variables
894 :
895 : integer (kind=int_kind) :: &
896 : k ! loop indices
897 : integer (kind=int_kind) :: nt_isosno, nt_isoice
898 : character(len=*), parameter :: subname='(read_restart_iso)'
899 :
900 : !-----------------------------------------------------------------
901 :
902 1 : call icepack_query_tracer_indices(nt_isosno_out=nt_isosno)
903 1 : call icepack_query_tracer_indices(nt_isoice_out=nt_isoice)
904 1 : call icepack_warnings_flush(nu_diag)
905 1 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
906 0 : file=__FILE__,line= __LINE__)
907 :
908 1 : write(nu_diag,*) 'read_restart_iso (isotopes)'
909 :
910 4 : do k = 1, n_iso
911 3 : call read_restart_field(nu_restart, trcrn(:,nt_isosno+(k-1),:), ncat)
912 4 : call read_restart_field(nu_restart, trcrn(:,nt_isoice+(k-1),:), ncat)
913 : enddo
914 :
915 1 : end subroutine read_restart_iso
916 :
917 : !=======================================================================
918 :
919 25 : subroutine write_restart_hbrine()
920 :
921 : ! Dumps all values needed for a hbrine restart
922 : ! author Elizabeth C. Hunke, LANL
923 :
924 : use icedrv_arrays_column, only: first_ice, first_ice_real
925 : use icedrv_state, only: trcrn
926 : use icedrv_domain_size, only: ncat, nx
927 :
928 : ! local variables
929 :
930 : integer (kind=int_kind) :: &
931 : i, n ! horizontal indices
932 : integer (kind=int_kind) :: nt_fbri
933 : character(len=*), parameter :: subname='(write_restart_hbrine)'
934 :
935 25 : call icepack_query_tracer_indices(nt_fbri_out=nt_fbri)
936 25 : call icepack_warnings_flush(nu_diag)
937 25 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
938 0 : file=__FILE__,line= __LINE__)
939 :
940 125 : do i = 1, nx
941 625 : do n = 1, ncat
942 600 : if (first_ice (i,n)) then
943 250 : first_ice_real(i,n) = c1
944 : else
945 250 : first_ice_real(i,n) = c0
946 : endif
947 : enddo ! n
948 : enddo ! i
949 :
950 25 : call write_restart_field(nu_dump,trcrn(:,nt_fbri,:),ncat)
951 25 : call write_restart_field(nu_dump,first_ice_real(:,:),ncat)
952 :
953 25 : end subroutine write_restart_hbrine
954 :
955 : !=======================================================================
956 :
957 1 : subroutine read_restart_hbrine()
958 :
959 : ! Reads all values needed for hbrine
960 : ! author Elizabeth C. Hunke, LANL
961 :
962 : use icedrv_arrays_column, only: first_ice_real, first_ice
963 : use icedrv_state, only: trcrn
964 : use icedrv_domain_size, only: ncat, nx
965 :
966 : ! local variables
967 :
968 : integer (kind=int_kind) :: &
969 : i, n ! horizontal indices
970 : integer (kind=int_kind) :: nt_fbri
971 : character(len=*), parameter :: subname='(read_restart_hbrine)'
972 :
973 1 : call icepack_query_tracer_indices(nt_fbri_out=nt_fbri)
974 1 : call icepack_warnings_flush(nu_diag)
975 1 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
976 0 : file=__FILE__,line= __LINE__)
977 :
978 1 : write(nu_diag,*) 'read brine restart'
979 :
980 1 : call read_restart_field(nu_restart,trcrn(:,nt_fbri,:),ncat)
981 1 : call read_restart_field(nu_restart,first_ice_real(:,:),ncat)
982 :
983 5 : do i = 1, nx
984 25 : do n = 1, ncat
985 24 : if (first_ice_real(i,n) >= p5) then
986 11 : first_ice (i,n) = .true.
987 : else
988 9 : first_ice (i,n) = .false.
989 : endif
990 : enddo ! ncat
991 : enddo ! i
992 :
993 1 : end subroutine read_restart_hbrine
994 :
995 : !=======================================================================
996 :
997 : end module icedrv_restart
998 :
999 : !=======================================================================
|