Energy-conserving sea ice model
Routines to grow/melt ice and adjust temperature profile
See Bitz, C.M., and W.H. Lipscomb, 1999:
An energy-conserving thermodynamic model of sea ice,
J. Geophys. Res., 104, 15,669-15,677.
See Bitz, C.M., M.M. Holland, M. Eby, and A.J. Weaver, 2001: Simulating the ice-thickness distribution in a coupled climate model, J. Geophys. Res., 106, 2441-2464.
REVISION HISTORY:
author: C. M. Bitz, UWINTERFACE:
module ice_dhUSES:
use ice_kinds_mod
use ice_constants
use ice_itd
INTERFACE:
subroutine dh( dtsub, sal1d, tiz
$ , tbot, hi, hs, fbot
$ , fnet, condb, flh, ni
$ , dhib, dhit, dhs, subi
$ , subs, dhif, dhsf, qi
$ , focn, i,j )
DESCRIPTION:
Computes the thickness changes at the top and bottom
and adjusts layer energy of melt;
does not allow h less than 0.
Focn= actual flux of heat from the ocean layer under sea ice
(equal to fbot unless all the ice melts away);
compensates for rare case of melting entire slab through
REVISION HISTORY:
author: C. M. Bitz, UWUSES:
use ice_state
use ice_diagnostics
use shr_sys_mod, only : shr_sys_abort
INPUT/OUTPUT PARAMETERS:
real (kind=dbl_kind), intent(in) ::
& dtsub ! timestep
&, sal1d (nmax+1) ! ice salinity (ppt)
&, tiz (0:nmax) ! snow/ice internal temp (C)
&, Tbot ! ice bottom in (C)
&, hi ! initial ice thickness (m)
&, hs ! initial snow thickness (m)
&, fbot ! flx from ocean, potent. (W/m**2)
&, fnet ! net flx at top srf incl. cond. flx (W/m**2)
&, condb ! cond. flx at bot. (W/m**2)
&, flh ! latent heat flx (w/m**2)
integer (kind=int_kind), intent(in) ::
& ni ! number of layers
&, i,j ! grid location for debugging
! thickness changes from grow/melt (default) or sublimate/flooding
real (kind=dbl_kind), intent(out) ::
& dhib ! ice bot, dhib<0 if melt (m)
&, dhit ! ice top, dhit<=0 (m)
&, dhs ! snow top, dhit<=0 (m)
&, subi ! ice top, subi<0 if sublimating (m)
&, subs ! snow, subs<0 if sublimating (m)
&, dhif ! ice top from flooding, dhif>0 (m)
&, dhsf ! snow from flooding, dhsf<0 (m)
&, qi(nmax) ! energy of melt of ice per unit vol. (J/m**3)
&, focn ! actual flx of heat used from ocn (w/m**2)
INTERFACE:
subroutine freeboard(hs,hi,dhs,qs,dhsf,dhif,qiflood)DESCRIPTION:
Freeboard adjustment due to flooding ... snow-ice formation
REVISION HISTORY:
author: C. M. Bitz, UWUSES:
INPUT/OUTPUT PARAMETERS:
real (kind=dbl_kind), intent(in) ::
& hs ! initial snow thickness (m)
&, hi ! initial ice thickness (m)
&, dhs ! snow top, dhit<=0 (m)
&, qs ! energy of melt of snow per unit vol. (J/m**3)
real (kind=dbl_kind), intent(out) ::
& dhsf ! snow from flooding, dhsf<0 (m)
&, dhif ! ice top from flooding, dhif>0 (m)
&, qiflood ! energy of melt of flooded ice (W/m**2)
INTERFACE:
subroutine srfsub( qi, qs, delti, delts, ni,
$ subi, subs, etop, enet )
DESCRIPTION:
Compute the sea ice and snow thickness changes from sublimation/condensation
REVISION HISTORY:
author: C. M. Bitz, UWUSES:
INPUT/OUTPUT PARAMETERS:
real (kind=dbl_kind), intent(in) ::
& qi (1:nmax), qs ! energy of melt of ice/snow per vol (J/m**3)
&, delti(nmax), delts ! thickness of ice/snow layer (m)
integer (kind=int_kind), intent(in) :: ni ! number of layers
real (kind=dbl_kind), intent(out) ::
& subi, subs ! subl/cond. amount for ice/snow (m)
real (kind=dbl_kind), intent(inout) ::
& etop ! energy avail to sub/cond ice/snow (J/m**2)
&, enet ! energy needed to melt all ice/snow (J/m**2)
INTERFACE:
subroutine srfmelt( qi, qs, delti, delts, ni,
$ dhit, dhs, etop )
DESCRIPTION:
Melt ice/snow from the top srf
REVISION HISTORY:
author: C. M. Bitz, UWUSES:
INPUT/OUTPUT PARAMETERS:
real (kind=dbl_kind), intent(in) ::
& qi (1:nmax), qs ! energy of melt of ice/snow per vol (J/m**3)
&, delti(nmax), delts ! thickness of ice/snow layer (m)
integer (kind=int_kind), intent(in) :: ni ! number of layers
real (kind=dbl_kind), intent(out) ::
& dhit ! ice thickness change (m)
&, dhs ! snow thickness change (m)
real (kind=dbl_kind), intent(inout) ::
& etop ! energy avail to melt ice and snow (J/m**2)
INTERFACE:
subroutine botmelt( qi, qs, delti, delts, ni,
$ dhib, dhs, ebot )
DESCRIPTION:
Melt from bottom
REVISION HISTORY:
author: C. M. Bitz, UWUSES:
INPUT/OUTPUT PARAMETERS:
real (kind=dbl_kind), intent(in) ::
& qi (1:nmax), qs ! energy of melt of ice/snow per vol (J/m**3)
&, delti(nmax), delts ! thickness of ice/snow layer (m)
integer (kind=int_kind), intent(in) :: ni ! number of layers
real (kind=dbl_kind), intent(out) :: dhib ! ice thickness change (m)
real (kind=dbl_kind), intent(inout) ::
& dhs ! snow thickness change (m)
&, ebot ! energy avail to melt ice and snow (J/m**2)
INTERFACE:
subroutine adjust(hi0,dhib,dhit,dhif,dhsf,qiflood,qigrow,ni,qi_tw)DESCRIPTION:
Adjusts temperature profile to account for changing the layer spacing due to growth/melt (incl. subl/cond, flooding). At start the energy of melting was computed after updating tiz from the heat equation. hi is the thickness prior to changes from dhib and dhit; hi_tw is the thickness after making these changes; dhib is less than 0 if there is melt at the bottom; dhit is less than 0 if there is melt at the top; generally _tw is a suffix to label the adjusted variables.
REVISION HISTORY:
author: C. M. Bitz, UWUSES:
INPUT/OUTPUT PARAMETERS:
real (kind=dbl_kind), intent(in) ::
& hi0 ! initial ice thickness (m)
&, dhib ! ice bot, dhib<0 if melt (m)
&, dhit ! ice top, dhit<=0 (m)
&, dhif ! ice top from flooding, dhif>0 (m)
&, dhsf ! snow from flooding, dhsf<0 (m)
&, qiflood ! qi for flooded ice (J/m**3)
&, qigrow ! qi for ice growing on bot (J/m**3)
integer (kind=int_kind), intent(in) :: ni
real (kind=dbl_kind), intent(inout) ::
& qi_tw(nmax) ! energy of melt of ice per unit vol. (J/m**3)
INTERFACE:
real function energ(Tmp ,sal)DESCRIPTION:
Compute the energy of melting per unit volume (J/m**3) relative to melting (negative quantity)
REVISION HISTORY:
author: C. M. Bitz, UWUSES:
INPUT/OUTPUT PARAMETERS:
real (kind=dbl_kind), intent(in) ::
& Tmp ! midpt temperature of ice layer (C)
&, sal ! midpt salinity of ice layer (ppt)