!=======================================================================
!
!BOP
!
! !MODULE: ice_lvl - Ridged ice tracers for sea ice
!
! !DESCRIPTION:
!
! !REVISION HISTORY:
! SVN:$$
!
! authors Elizabeth Hunke
!
! !INTERFACE:
!
module ice_lvl 3,8
!
! !USES:
!
use ice_kinds_mod
use ice_domain_size
use ice_constants
use ice_fileunits
use ice_read_write
use ice_restart
, only: lenstr, restart_dir, restart_file, &
pointer_file, runtype
use ice_communicate
, only: my_task, master_task
use ice_exit
, only: abort_ice
!
!EOP
!
implicit none
logical (kind=log_kind) :: &
restart_lvl ! if .true., read lvl tracer restart file
!=======================================================================
contains
!=======================================================================
!BOP
!
! !ROUTINE: init_lvl
!
! !DESCRIPTION:
!
! Initialize ice lvl tracers (call prior to reading restart data)
!
! !REVISION HISTORY: same as module
!
! !INTERFACE:
!
subroutine init_lvl 1,3
!
! !USES:
!
use ice_state
, only: filename_lvl
!
!EOP
!
if (trim(filename_lvl) /= 'none') restart_lvl = .true.
if (restart_lvl) then
if (trim(runtype) == 'continue') then
call read_restart_lvl
else
call read_restart_lvl
(filename_lvl)
endif
endif
end subroutine init_lvl
!=======================================================================
!---! these subroutines write/read Fortran unformatted data files ..
!=======================================================================
!
!BOP
!
! !IROUTINE: write_restart_lvl - dumps all fields required for restart
!
! !INTERFACE:
!
subroutine write_restart_lvl(filename_spec) 1,6
!
! !DESCRIPTION:
!
! Dumps all values needed for restarting
!
! !REVISION HISTORY:
!
! author Elizabeth C. Hunke, LANL
!
! !USES:
!
use ice_domain_size
use ice_calendar
, only: sec, month, mday, nyr, istep1, &
time, time_forc, idate, year_init
use ice_state
, only: nt_alvl, nt_vlvl, trcrn
!
! !INPUT/OUTPUT PARAMETERS:
!
character(len=char_len_long), intent(in), optional :: filename_spec
!EOP
!
integer (kind=int_kind) :: &
i, j, k, n, it, iblk, & ! counting indices
iyear, imonth, iday ! year, month, day
character(len=char_len_long) :: filename
logical (kind=log_kind) :: diag
! construct path/file
if (present(filename_spec)) then
filename = trim(filename_spec)
else
iyear = nyr + year_init - 1
imonth = month
iday = mday
write(filename,'(a,a,a,i4.4,a,i2.2,a,i2.2,a,i5.5)') &
restart_dir(1:lenstr(restart_dir)), &
restart_file(1:lenstr(restart_file)),'.lvl.', &
iyear,'-',month,'-',mday,'-',sec
end if
! begin writing restart data
call ice_open
(nu_dump_lvl,filename,0)
if (my_task == master_task) then
write(nu_dump_lvl) istep1,time,time_forc
write(nu_diag,*) 'Writing ',filename(1:lenstr(filename))
endif
diag = .true.
!-----------------------------------------------------------------
do n = 1, ncat
call ice_write
(nu_dump_lvl,0,trcrn(:,:,nt_alvl,n,:),'ruf8',diag)
call ice_write
(nu_dump_lvl,0,trcrn(:,:,nt_vlvl,n,:),'ruf8',diag)
enddo
if (my_task == master_task) close(nu_dump_lvl)
end subroutine write_restart_lvl
!=======================================================================
!BOP
!
! !IROUTINE: read_restart_lvl - reads all fields required for restart
!
! !INTERFACE:
!
subroutine read_restart_lvl(filename_spec) 2,8
!
! !DESCRIPTION:
!
! Reads all values needed for an ice lvl restart
!
! !REVISION HISTORY:
!
! author Elizabeth C. Hunke, LANL
!
! !USES:
!
use ice_domain_size
use ice_calendar
, only: sec, month, mday, nyr, istep1, &
time, time_forc, idate, year_init
use ice_state
, only: nt_alvl, nt_vlvl, trcrn
!
! !INPUT/OUTPUT PARAMETERS:
!
character(len=char_len_long), intent(in), optional :: filename_spec
!EOP
!
integer (kind=int_kind) :: &
i, j, k, n, it, iblk, & ! counting indices
iyear, imonth, iday ! year, month, day
character(len=char_len_long) :: &
filename, filename0, string1, string2
logical (kind=log_kind) :: &
diag
if (my_task == master_task) then
! reconstruct path/file
if (present(filename_spec)) then
filename = filename_spec
else
open(nu_rst_pointer,file=pointer_file)
read(nu_rst_pointer,'(a)') filename0
filename = trim(filename0)
close(nu_rst_pointer)
! reconstruct path/file
n = index(filename0,trim(restart_file))
if (n == 0) call abort_ice
('ilvl restart: filename discrepancy')
string1 = trim(filename0(1:n-1))
string2 = trim(filename0(n+lenstr
(restart_file):lenstr(filename0)))
write(filename,'(a,a,a,a)') &
string1(1:lenstr(string1)), &
restart_file(1:lenstr(restart_file)),'.lvl', &
string2(1:lenstr(string2))
endif
endif ! master_task
call ice_open
(nu_restart_lvl,filename,0)
if (my_task == master_task) then
read(nu_restart_lvl) istep1,time,time_forc
write(nu_diag,*) 'Reading ',filename(1:lenstr(filename))
endif
diag = .true.
!-----------------------------------------------------------------
do n = 1, ncat
call ice_read
(nu_restart_lvl,0,trcrn(:,:,nt_alvl,n,:),'ruf8',diag)
call ice_read
(nu_restart_lvl,0,trcrn(:,:,nt_vlvl,n,:),'ruf8',diag)
enddo
if (my_task == master_task) close(nu_restart_lvl)
end subroutine read_restart_lvl
!=======================================================================
end module ice_lvl
!=======================================================================