!=======================================================================
!
!BOP
!
! !MODULE: ice_meltpond - Meltpond parameterization
!
! !DESCRIPTION:
!
! !REVISION HISTORY:
! SVN:$$
!
! authors David A. Bailey (NCAR)
! Marika M. Holland (NCAR)
!
! !INTERFACE:
!
module ice_meltpond 5,7
!
! !USES:
!
use ice_kinds_mod
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_pond ! if .true., read meltponds restart file
!=======================================================================
contains
!=======================================================================
!BOP
!
! !ROUTINE: init_meltponds
!
! !DESCRIPTION:
!
! Initialize melt ponds.
!
! !REVISION HISTORY: same as module
!
! !INTERFACE:
!
subroutine init_meltponds 1,3
!
! !USES:
!
use ice_state
, only: filename_volpn
!
! !INPUT/OUTPUT PARAMETERS:
!
!EOP
!
if (trim(filename_volpn) /= 'none') restart_pond = .true.
if (restart_pond) then
if (trim(runtype) == 'continue') then
call read_restart_pond
else
call read_restart_pond
(filename_volpn)
endif
endif
end subroutine init_meltponds
!=======================================================================
!BOP
!
! !ROUTINE:
!
! !INTERFACE:
!
subroutine compute_ponds(nx_block,ny_block, & 1,3
ilo, ihi, jlo, jhi, &
meltt, melts, frain, &
aicen, vicen, vsnon, &
trcrn, apondn, hpondn)
!
! !DESCRIPTION:
!
! !REVISION HISTORY:
!
! same as module
!
! !USES:
!
use ice_state
, only: nt_Tsfc, nt_volpn
use ice_calendar
, only: dt
use ice_domain_size
, only: max_ntrcr
integer (kind=int_kind), intent(in) :: &
nx_block, ny_block, & ! block dimensions
ilo,ihi,jlo,jhi ! beginning and end of physical domain
real (kind=dbl_kind), dimension(nx_block,ny_block), &
intent(in) :: &
meltt, &
melts, &
frain, &
aicen, &
vicen, &
vsnon
real (kind=dbl_kind), dimension(nx_block,ny_block), &
intent(inout) :: &
apondn, &
hpondn
real (kind=dbl_kind), dimension(nx_block,ny_block,max_ntrcr), &
intent(inout) :: &
trcrn
real (kind=dbl_kind), dimension(nx_block,ny_block) :: &
volpn, &
Tsfcn
integer (kind=int_kind), dimension (nx_block*ny_block) :: &
indxi, indxj ! compressed indices for cells with ice melting
integer (kind=int_kind) :: i,j,ij,icells
real (kind=dbl_kind) :: hi,hs,dTs,rfrac,asnow
real (kind=dbl_kind), parameter :: &
hi_min = p1
Tsfcn(:,:) = trcrn(:,:,nt_Tsfc)
volpn(:,:) = trcrn(:,:,nt_volpn)
!-----------------------------------------------------------------
! Identify grid cells where ice can melt.
!-----------------------------------------------------------------
icells = 0
do j = jlo, jhi
do i = ilo, ihi
if (aicen(i,j) > puny) then
icells = icells + 1
indxi(icells) = i
indxj(icells) = j
endif
enddo ! i
enddo ! j
do ij = 1, icells
i = indxi(ij)
j = indxj(ij)
hi = vicen(i,j)/aicen(i,j)
hs = vsnon(i,j)/aicen(i,j)
dTs = Timelt - Tsfcn(i,j)
! Make the runoff fraction proportional to ice area.
rfrac = 0.85_dbl_kind - 0.7_dbl_kind*aicen(i,j)
volpn(i,j) = volpn(i,j) + (c1-rfrac) &
* (meltt(i,j)*(rhoi/rhofresh) + melts(i,j)*(rhos/rhofresh) &
+ frain(i,j)*dt/rhofresh)
! Use exponential decrease in pond volume DAB
if (Tsfcn(i,j) .lt. Timelt-c2) then
volpn(i,j) = volpn(i,j) &
*exp(p01*(dTs-c2)/(Timelt-c2))
endif
volpn(i,j) = max(volpn(i,j), c0)
apondn(i,j) = min ( sqrt ( volpn(i,j) * 1.25 ), c1)
hpondn(i,j) = 0.8 * apondn(i,j)
! Limit pond depth to 90% of ice thickness
if (hpondn(i,j) .gt. 0.9*hi) then
hpondn(i,j) = 0.9*hi
volpn(i,j) = hpondn(i,j)*apondn(i,j)
! apondn(i,j) = min(volpn(i,j)/hpondn(i,j), 1.)
endif
! If we are freezing, do not change albedo
! if (Tsfcn(i,j) .lt. Timelt-0.15) apondn(i,j) = c0
! fractional area of snow cover
! use linear function as in delta-Eddington
if (hs >= hsmin) then
asnow = min( hs/hs0, c1 )
else
asnow = c0
endif
! fractional area of snow cover
! use snowpatch as in the CCSM3 shortwave
! if (hs > puny) then
! asnow = hs / (hs + snowpatch)
! else
! asnow = c0
! endif
! If we have snow, reduce ponds
if ( hs .gt. puny ) then
apondn(i,j) = (c1-asnow)*apondn(i,j)
hpondn(i,j) = 0.8_dbl_kind * apondn(i,j)
endif
! remove ponds if ice becomes very thin
if (hi .lt. hi_min) then
apondn(i,j) = c0
hpondn(i,j) = c0
volpn(i,j) = c0
endif
trcrn(i,j,nt_volpn) = volpn(i,j)
enddo
end subroutine compute_ponds
!=======================================================================
!
!BOP
!
! !IROUTINE: write_restart_pond - dumps all fields required for restart
!
! !INTERFACE:
!
subroutine write_restart_pond(filename_spec) 1,7
!
! !DESCRIPTION:
!
! Dumps all values needed for restarting
!
! !REVISION HISTORY:
!
! authors Elizabeth C. Hunke, LANL
! David A. Bailey, NCAR
!
! !USES:
!
use ice_domain_size
use ice_calendar
, only: sec, month, mday, nyr, istep1, &
time, time_forc, idate, year_init
use ice_state
!
! !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)),'.volpn.', &
iyear,'-',month,'-',mday,'-',sec
end if
! begin writing restart data
call ice_open
(nu_dump_pond,filename,0)
if (my_task == master_task) then
write(nu_dump_pond) istep1,time,time_forc
write(nu_diag,*) 'Writing ',filename(1:lenstr(filename))
endif
diag = .true.
!-----------------------------------------------------------------
do n = 1, ncat
call ice_write
(nu_dump_pond,0,trcrn(:,:,nt_volpn,n,:),'ruf8',diag)
call ice_write
(nu_dump_pond,0,apondn(:,:,n,:),'ruf8',diag)
call ice_write
(nu_dump_pond,0,hpondn(:,:,n,:),'ruf8',diag)
enddo
if (my_task == master_task) close(nu_dump_pond)
end subroutine write_restart_pond
!=======================================================================
!BOP
!
! !IROUTINE: read_restart_pond - reads all fields required for restart
!
! !INTERFACE:
!
subroutine read_restart_pond(filename_spec) 2,9
!
! !DESCRIPTION:
!
! Reads all values needed for a meltpond volume restart
!
! !REVISION HISTORY:
!
! authors Elizabeth C. Hunke, LANL
! David A. Bailey, NCAR
!
! !USES:
!
use ice_domain_size
use ice_calendar
, only: sec, month, mday, nyr, istep1, &
time, time_forc, idate, year_init
use ice_state
!
! !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)
n = index(filename0,trim(restart_file))
if (n == 0) call abort_ice
('volpn 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)),'.volpn', &
string2(1:lenstr(string2))
endif
endif ! master_task
call ice_open
(nu_restart_pond,filename,0)
if (my_task == master_task) then
read(nu_restart_pond) istep1,time,time_forc
write(nu_diag,*) 'Reading ',filename(1:lenstr(filename))
endif
diag = .true.
!-----------------------------------------------------------------
do n = 1, ncat
call ice_read
(nu_restart_pond,0,trcrn(:,:,nt_volpn,n,:),'ruf8',diag)
call ice_read
(nu_restart_pond,0,apondn(:,:,n,:),'ruf8',diag)
call ice_read
(nu_restart_pond,0,hpondn(:,:,n,:),'ruf8',diag)
enddo
if (my_task == master_task) close(nu_restart_pond)
end subroutine read_restart_pond
!=======================================================================
end module ice_meltpond
!=======================================================================