Routines to initialize the ice thickness distribution and
utilities to redistribute ice among categories. These routines
are not specific to a particular numerical implementation.
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, A.J. Weaver, M. Eby, 2001:
Simulating the ice-thickness distribution in a climate model,
J. Geophys. Res., 106, 2441-2464.
REVISION HISTORY:
author: C. M. Bitz, UW code heavily modified by Elizabeth C. Hunke, LANLINTERFACE:
module ice_itdUSES:
use ice_kinds_mod use ice_model_size use ice_constants use ice_state
INTERFACE:
subroutine init_itdDESCRIPTION:
Initialize area fraction and thickness boundaries for the itd model
REVISION HISTORY:
authors: William H. Lipscomb, LANL Elizabeth C. Hunke LANL and C. M. Bitz UWUSES:
use shr_sys_mod, only : shr_sys_abortINPUT/OUTPUT PARAMETERS:
INTERFACE:
subroutine aggregateDESCRIPTION:
Aggregate ice state over the grid
REVISION HISTORY:
author: C. M. Bitz, UWUSES:
use ice_domain use ice_flux use ice_gridINPUT/OUTPUT PARAMETERS:
INTERFACE:
subroutine aggregate_pt(i,j)DESCRIPTION:
Aggregate ice thickness distribution state
REVISION HISTORY:
author: C. M. Bitz, UWUSES:
use ice_fluxINPUT/OUTPUT PARAMETERS:
integer (kind=int_kind), intent(in) :: i, j
INTERFACE:
subroutine to_column(i,j)DESCRIPTION:
Define column state variables for given point (i,j)
REVISION HISTORY:
authors: Elizabeth C. Hunke, LANL and C. M. Bitz, UWINPUT/OUTPUT PARAMETERS:
integer (kind=int_kind), intent(in) :: i,j
INTERFACE:
subroutine from_column(i,j)DESCRIPTION:
Reload state variables for given point (i,j) from column variables
REVISION HISTORY:
authors: Elizabeth C. Hunke, LANL and C. M. Bitz, UWINPUT/OUTPUT PARAMETERS:
integer (kind=int_kind), intent(in) :: i,j
INTERFACE:
subroutine check_state(i,j)DESCRIPTION:
Insist that certain fields are monotone. Should not be necessary if all is well, but best to keep going. Model will not conserve energy and water if fields are zeroed here.
REVISION HISTORY:
author: C. M. Bitz, UWUSES:
use ice_fluxINPUT/OUTPUT PARAMETERS:
integer (kind=int_kind) :: i,j
INTERFACE:
subroutine distr_checkDESCRIPTION:
Force ice thickness distribution to maintain two rules
(1) the fractional area cannot be less than some limiting value
(2) each categories thickness lies within the
max and min thickness range for that category
REVISION HISTORY:
author: C. M. Bitz, UWUSES:
use ice_flux use ice_gridINPUT/OUTPUT PARAMETERS:
INTERFACE:
subroutine normalize_state(dvicen,dvices,dvsnon,dvsnos)DESCRIPTION:
Normalize the state variables for the ice thickness distribution to conserve volume after removing small areas
REVISION HISTORY:
author: C. M. Bitz, UWUSES:
use ice_model_size use ice_mpi_internal use ice_grid use ice_calendarINPUT/OUTPUT PARAMETERS:
real (kind=dbl_kind), intent(in) :: & dvicen(1), dvsnon(1) ! total nuked ice/snow volumes north &, dvices(1), dvsnos(1) ! total nuked ice/snow volumes south
INTERFACE:
subroutine rebin_ice(i,j)DESCRIPTION:
Rebins thicknesses into defined categories
REVISION HISTORY:
author: C. M. Bitz, UWUSES:
use ice_fluxINPUT/OUTPUT PARAMETERS:
integer (kind=int_kind), intent(in) :: & i,j
INTERFACE:
subroutine movedn( Tf0 $ , ai1, vi1, vs1, ei1, Tsf1 $ , hi1, hs1 & , h1min, nn1 $ , ai2, vi2, vs2, ei2, Tsf2 $ , hi2, hs2 & , h2min, nn2 )DESCRIPTION:
Moves ice from cat 2 to cat 1.
It is possible that the final thickness will be below the
boundary of cat 1 if the ice has melted a lot, in which case
it will be moved down again by a subsequent call
REVISION HISTORY:
author: C. M. Bitz, UWUSES:
INPUT/OUTPUT PARAMETERS:
real (kind=dbl_kind), intent(in) :: & Tf0 ! freezing temperature of ocean &, h1min, h2min ! minimum thickness range of cat 1, 2 (m) integer (kind=int_kind), intent(in) :: & nn1, nn2 ! number of layers in cat 1, 2 real (kind=dbl_kind), intent(inout) :: & ai1, ai2 ! fraction of ice &, vi1, vi2 ! volume per unit area of ice (m) &, vs1, vs2 ! volume per unit area of snow (m) &, hi1, hi2 ! ice thickness (m) &, hs1, hs2 ! snow thickness (m) &, Tsf1, Tsf2 ! ice/snow top surf. temperature (K) real (kind=dbl_kind), intent(inout), dimension (:) :: & ei1 ! energy of melting of ice per layer (J/m**2) &, ei2 ! energy of melting of ice per layer (J/m**2)
INTERFACE:
subroutine moveup( Tf0 $ , ai1, vi1, vs1, ei1, Tsf1 $ , hi1, hs1 & , h1min, nn1 $ , ai2, vi2, vs2, ei2, Tsf2 $ , hi2, hs2 & , h2min, nn2 )DESCRIPTION:
Moves ice from cat 1 to 2.
It is possible that the final thickness will be above the
boundary of cat 2. If the ice needs to move up again,
it will do so in a subsequent call
REVISION HISTORY:
author: C. M. Bitz, UWUSES:
INPUT/OUTPUT PARAMETERS:
real (kind=dbl_kind), intent(in) :: & Tf0 ! temperature of ocean &, h1min, h2min ! minimum thickness range of cat 1, 2 (m) integer (kind=int_kind), intent(in) :: & nn1, nn2 ! number of layers in cat 1, 2 real (kind=dbl_kind), intent(inout) :: & ai1, ai2 ! fraction of ice &, vi1, vi2 ! volume per unit area of ice (m) &, vs1, vs2 ! volume per unit area of snow (m) &, hi1, hi2 ! ice thickness (m) &, hs1, hs2 ! snow thickness (m) &, Tsf1, Tsf2 ! ice/snow top surf. temperature (K) &, ei1(nn1) ! energy of melting of ice per layer (J/m**2) &, ei2(nn2) ! energy of melting of ice per layer (J/m**2)
INTERFACE:
subroutine zerocat( Tf0, ai, vi, vs, ei $ , Tsf & , hs, hi & , hmin, nn )DESCRIPTION:
Reset category variables in the case of no ice
REVISION HISTORY:
author: C. M. Bitz, UWUSES:
INPUT/OUTPUT PARAMETERS:
real (kind=dbl_kind), intent(in) :: Tf0 ! freezing temperature integer (kind=int_kind), intent(in) :: nn ! number of layers in cat real (kind=dbl_kind), intent(in) :: hmin real (kind=dbl_kind), intent(inout) :: & ai ! fraction of ice &, vi ! volume per unit area of ice (m) &, vs ! volume per unit area of snow (m) &, hi ! ice thickness (m) &, hs ! snow thickness (m) &, Tsf ! ice/snow top surf. temperature (K) &, ei (nn) ! energy of melting of ice per layer (J/m**2)