!-----------------------------------
      subroutine sfc_sice                                               &
!...................................
!  ---  inputs:
     &     ( im, km, ps, u1, v1, t1, q1, delt,                          &
     &       sfcemis, dlwflx, sfcnsw, sfcdsw, srflag,                   &
     &       cm, ch, prsl1, prslki, slimsk, ddvel,                      &
     &       flag_iter, mom4ice, lsm, lprnt,ipr,                        &
!  ---  input/outputs:
     &       hice, fice, tice, weasd, tskin, tprcp, stc, ep,            &
!  ---  outputs:
     &       snwdph, qsurf, snowmt, gflux, cmm, chh, evap, hflx         &
     &     )

! ===================================================================== !
!  description:                                                         !
!                                                                       !
!  usage:                                                               !
!                                                                       !
!    call sfc_sice                                                      !
!       inputs:                                                         !
!          ( im, km, ps, u1, v1, t1, q1, delt,                          !
!            sfcemis, dlwflx, sfcnsw, sfcdsw, srflag,                   !
!            cm, ch, prsl1, prslki, slimsk, ddvel,                      !
!            flag_iter, mom4ice, lsm,                                   !
!       input/outputs:                                                  !
!            hice, fice, tice, weasd, tskin, tprcp, stc, ep,            !
!       outputs:                                                        !
!            snwdph, qsurf, snowmt, gflux, cmm, chh, evap, hflx )       !
!                                                                       !
!  subprogram called:  ice3lay.                                         !
!                                                                       !
!  program history log:                                                 !
!         2005  --  xingren wu created  from original progtm and added  !
!                     two-layer ice model                               !
!         200x  -- sarah lu    added flag_iter                          !
!    oct  2006  -- h. wei      added cmm and chh to output              !
!         2007  -- x. wu modified for mom4 coupling (i.e. mom4ice)      !
!         2007  -- s. moorthi micellaneous changes                      !
!    may  2009  -- y.-t. hou   modified to include surface emissivity   !
!                     effect on lw radiation. replaced the confusing    !
!                     slrad with sfc net sw sfcnsw (dn-up). reformatted !
!                     the code and add program documentation block.     !
!    sep  2009 -- s. moorthi removed rcl, changed pressure units and    !
!                     further optimized                                 !
!                                                                       !
!                                                                       !
!  ====================  defination of variables  ====================  !
!                                                                       !
!  inputs:                                                       size   !
!     im, km   - integer, horiz dimension and num of soil layers   1    !
!     ps       - real, surface pressure                            im   !
!     u1, v1   - real, u/v component of surface layer wind         im   !
!     t1       - real, surface layer mean temperature ( k )        im   !
!     q1       - real, surface layer mean specific humidity        im   !
!     delt     - real, time interval (second)                      1    !
!     sfcemis  - real, sfc lw emissivity ( fraction )              im   !
!     dlwflx   - real, total sky sfc downward lw flux ( w/m**2 )   im   !
!     sfcnsw   - real, total sky sfc netsw flx into ground(w/m**2) im   !
!     sfcdsw   - real, total sky sfc downward sw flux ( w/m**2 )   im   !
!     srflag   - real, snow/rain flag for precipitation            im   !
!     cm       - real, surface exchange coeff for momentum (m/s)   im   !
!     ch       - real, surface exchange coeff heat & moisture(m/s) im   !
!     prsl1    - real, surface layer mean pressure                 im   !
!     prslki   - real,                                             im   !
!     slimsk   - real, sea/land/ice mask (=0/1/2)                  im   !
!     ddvel    - real,                                             im   !
!     flag_iter- logical,                                          im   !
!     mom4ice  - logical,                                          im   !
!     lsm      - integer, flag for land surface model scheme       1    !
!                =0: use osu scheme; =1: use noah scheme                !
!                                                                       !
!  input/outputs:                                                       !
!     hice     - real, sea-ice thickness                           im   !
!     fice     - real, sea-ice concentration                       im   !
!     tice     - real, sea-ice surface temperature                 im   !
!     weasd    - real, water equivalent accumulated snow depth (mm)im   !
!     tskin    - real, ground surface skin temperature ( k )       im   !
!     tprcp    - real, total precipitation                         im   !
!     stc      - real, soil temp (k)                              im,km !
!     ep       - real, potential evaporation                       im   !
!                                                                       !
!  outputs:                                                             !
!     snwdph   - real, water equivalent snow depth (mm)            im   !
!     qsurf    - real, specific humidity at sfc                    im   !
!     snowmt   - real, snow melt (m)                               im   !
!     gflux    - real, soil heat flux (w/m**2)                     im   !
!     cmm      - real,                                             im   !
!     chh      - real,                                             im   !
!     evap     - real, evaperation from latent heat flux           im   !
!     hflx     - real, sensible heat flux                          im   !
!                                                                       !
! ===================================================================== !
!
      use machine , only : kind_phys
      use funcphys, only : fpvs
      use physcons, only : sbc => con_sbc, hvap => con_hvap,            &
     &                     tgice => con_tice, cp => con_cp,             &
     &                     eps => con_eps, epsm1 => con_epsm1,          &
     &                     grav => con_g, rvrdm1 => con_fvirt,          &
     &                     t0c => con_t0c, rd => con_rd
!
      implicit none
!
!  ---  constant parameters:
      integer,              parameter :: kmi   = 2        ! 2-layer of ice
      real(kind=kind_phys), parameter :: cpinv = 1.0/cp
      real(kind=kind_phys), parameter :: hvapi = 1.0/hvap
      real(kind=kind_phys), parameter :: elocp = hvap/cp
      real(kind=kind_phys), parameter :: himax = 8.0      ! maximum ice thickness allowed
      real(kind=kind_phys), parameter :: himin = 0.1      ! minimum ice thickness required
      real(kind=kind_phys), parameter :: hsmax = 2.0      ! maximum snow depth allowed
      real(kind=kind_phys), parameter :: timin = 173.0    ! minimum temperature allowed for snow/ice
      real(kind=kind_phys), parameter :: albfw = 0.06     ! albedo for lead
      real(kind=kind_phys), parameter :: dsi   = 1.0/0.33

!  ---  inputs:
      integer, intent(in) :: im, km, lsm, ipr
      logical, intent(in) :: lprnt

      real (kind=kind_phys), dimension(im), intent(in) :: ps, u1, v1,   &
     &       t1, q1, sfcemis, dlwflx, sfcnsw, sfcdsw, srflag, cm, ch,   &
     &       prsl1, prslki, slimsk, ddvel

      real (kind=kind_phys), intent(in) :: delt

      logical, intent(in) :: flag_iter(im), mom4ice

!  ---  input/outputs:
      real (kind=kind_phys), dimension(im), intent(inout) :: hice,      &
     &       fice, tice, weasd, tskin, tprcp, ep

      real (kind=kind_phys), dimension(im,km), intent(inout) :: stc

!  ---  outputs:
      real (kind=kind_phys), dimension(im), intent(out) :: snwdph,      &
     &       qsurf, snowmt, gflux, cmm, chh, evap, hflx

!  ---  locals:
      real (kind=kind_phys), dimension(im) :: ffw, evapi, evapw,        &
     &       hflxi, hflxw, sneti, snetw, qssi, qssw, hfd, hfi, hfw,     &
     &       focn, snof, hi_save, hs_save, psurf, q0, qs1, rch, rho,    &
     &       snowd, theta1, tv1, ps1, wind

      real (kind=kind_phys) :: cimin, t12, t14, tem, stsice(im,kmi)

      integer :: i, k
 
      logical :: flag(im)
!
!===> ...  begin here
!
!  --- ...  set minimum ice concentration required

      if (mom4ice) then
         cimin = 0.15          ! mom4ice and mask
      else
         cimin = 0.50          ! gfs only
      endif

!  --- ...  set flag for sea-ice

      do i = 1, im
         flag(i) = (slimsk(i)>=2.0) .and. flag_iter(i)
      enddo

      if (mom4ice) then
        do i = 1, im
          if (flag(i)) then
            hi_save(i) = hice(i)
            hs_save(i) = weasd(i) * 0.001
          endif
        enddo
      endif
!
      do i = 1, im
        if (flag_iter(i) .and. slimsk(i)<1.5) then
          hice(i) = 0.0
          fice(i) = 0.0
        endif
      enddo

!  --- ...  snow-rain detection

      if (.not. mom4ice .and. lsm > 0) then
        do i = 1, im
          if (flag(i)) then
            if (srflag(i) == 1.0) then
              ep(i) = 0.0
              weasd(i) = weasd(i) + 1.e3*tprcp(i)
              tprcp(i)  = 0.0
            endif
          endif
        enddo
      endif

!  --- ...  initialize variables. all units are supposedly m.k.s. unless specifie
!           psurf is in pascals, wind is wind speed, theta1 is adiabatic surface
!           temp from level 1, rho is density, qs1 is sat. hum. at level1 and qss
!           is sat. hum. at surface
!           convert slrad to the civilized unit from langley minute-1 k-4

      do i = 1, im
        if (flag(i)) then
          psurf(i) = 1000.0 * ps(i)
          ps1(i)   = 1000.0 * prsl1(i)

!         dlwflx has been given a negative sign for downward longwave
!         sfcnsw is the net shortwave flux (direction: dn-up)

          wind(i)   = sqrt(u1(i)*u1(i) + v1(i)*v1(i))                   &
     &              + max(0.0, min(ddvel(i), 30.0))
          wind(i)   = max(wind(i), 1.0)

          q0(i)     = max(q1(i), 1.0e-8)
!         tsurf(i)  = tskin(i)
          theta1(i) = t1(i) * prslki(i)
          tv1(i)    = t1(i) * (1.0 + rvrdm1*q0(i))
          rho(i)    = prsl1(i) / (rd*tv1(i))
          qs1(i)    = fpvs(t1(i))
          qs1(i)    = eps*qs1(i) / (prsl1(i) + epsm1*qs1(i))
          qs1(i)    = max(qs1(i), 1.e-8)
          q0 (i)    = min(qs1(i), q0(i))

          ffw(i)    = 1.0 - fice(i)
          if (fice(i) < cimin) then
            print *,'warning: ice fraction is low:', fice(i)
            fice(i) = cimin
            ffw (i) = 1.0 - fice(i)
            tice(i) = tgice
            tskin(i)= tgice
            print *,'fix ice fraction: reset it to:', fice(i)
          endif

          qssi(i) = fpvs(tice(i))
          qssi(i) = eps*qssi(i) / (ps(i) + epsm1*qssi(i))
          qssw(i) = fpvs(tgice)
          qssw(i) = eps*qssw(i) / (ps(i) + epsm1*qssw(i))

!  --- ...  snow depth in water equivalent is converted from mm to m unit

          if (mom4ice) then
            snowd(i) = weasd(i) * 0.001 / fice(i)
          else
            snowd(i) = weasd(i) * 0.001
          endif
!         flagsnw(i) = .false.

!  --- ...  when snow depth is less than 1 mm, a patchy snow is assumed and
!           soil is allowed to interact with the atmosphere.
!           we should eventually move to a linear combination of soil and
!           snow under the condition of patchy snow.
        endif
      enddo


      do i = 1, im
        if (flag(i)) then

!  --- ...  rcp = rho cp ch v

          cmm(i) = cm(i)  * wind(i)
          chh(i) = rho(i) * ch(i) * wind(i)
          rch(i) = chh(i) * cp

!  --- ...  sensible and latent heat flux over open water & sea ice

          evapi(i) = elocp * rch(i) * (qssi(i) - q0(i))
          evapw(i) = elocp * rch(i) * (qssw(i) - q0(i))
!         evap(i)  = fice(i)*evapi(i) + ffw(i)*evapw(i)
        endif
      enddo

!  --- ...  update sea ice temperature

      do k = 1, kmi
        do i = 1, im
          if (flag(i)) then
            stsice(i,k) = stc(i,k)
          endif
        enddo
      enddo

      if (lprnt) write(0,*)' tice=',tice(ipr)

      do i = 1, im
        if (flag(i)) then
          snetw(i) = sfcdsw(i) * (1.0 - albfw)
          snetw(i) = min(3.0*sfcnsw(i)/(1.0+2.0*ffw(i)), snetw(i))
          sneti(i) = (sfcnsw(i) - ffw(i)*snetw(i)) / fice(i)

          t12 = tice(i) * tice(i)
          t14 = t12 * t12

!  --- ...  hfi = net non-solar and upir heat flux @ ice surface

          hfi(i) = -dlwflx(i) + sfcemis(i)*sbc*t14 + evapi(i)           &
     &           + rch(i)*(tice(i) - theta1(i))
          hfd(i) = 4.0*sfcemis(i)*sbc*tice(i)*t12                       &
     &           + (1.0 + elocp*eps*hvap*qs1(i)/(rd*t12)) * rch(i)

          t12 = tgice * tgice
          t14 = t12 * t12

!  --- ...  hfw = net heat flux @ water surface (within ice)

!         hfw(i) = -dlwflx(i) + sfcemis(i)*sbc*t14 + evapw(i)           &
!    &           + rch(i)*(tgice - theta1(i)) - snetw(i)

          focn(i) = 2.0     ! heat flux from ocean - should be from ocn model
          snof(i) = 0.0     ! snowfall rate - snow accumulates in gbphys

          hice(i) = max( min( hice(i), himax ), himin )
          snowd(i) = min( snowd(i), hsmax )

          if (snowd(i) > (2.0*hice(i))) then
            print *, 'warning: too much snow :',snowd(i)
            snowd(i) = 2.0 * hice(i)
            print *,'fix: decrease snow depth to:',snowd(i)
          endif
        endif
      enddo

      if (lprnt) write(0,*)' tice2=',tice(ipr)
      call ice3lay
!  ---  inputs:                                                         !
!    &     ( im, kmi, fice, flag, hfi, hfd, sneti, focn, delt,          !
!  ---  outputs:                                                        !
!    &       snowd, hice, stsice, tice, snof, snowmt, gflux )           !

      if (lprnt) write(0,*)' tice3=',tice(ipr)
      if (mom4ice) then
        do i = 1, im
          if (flag(i)) then
            hice(i)  = hi_save(i)
            snowd(i) = hs_save(i)
          endif
        enddo
      endif

      do i = 1, im
        if (flag(i)) then
          if (tice(i) < timin) then
            print *,'warning: snow/ice temperature is too low:',tice(i)
     &,' i=',i
            tice(i) = timin
            print *,'fix snow/ice temperature: reset it to:',tice(i)
          endif

          if (stsice(i,1) < timin) then
            print *,'warning: layer 1 ice temp is too low:',stsice(i,1)
     &,' i=',i
            stsice(i,1) = timin
            print *,'fix layer 1 ice temp: reset it to:',stsice(i,1)
          endif

          if (stsice(i,2) < timin) then
            print *,'warning: layer 2 ice temp is too low:',stsice(i,2)
            stsice(i,2) = timin
            print *,'fix layer 2 ice temp: reset it to:',stsice(i,2)
          endif

          tskin(i) = tice(i)*fice(i) + tgice*ffw(i)
        endif
      enddo

      do k = 1, kmi
        do i = 1, im
          if (flag(i)) then
            stc(i,k) = min(stsice(i,k), t0c)
          endif
        enddo
      enddo

!  --- ...  calculate sensible heat flux (& evap over sea ice)

      do i = 1, im
        if (flag(i)) then
          hflxi(i) = rch(i) * (tice(i) - theta1(i))
          hflxw(i) = rch(i) * (tgice - theta1(i))
          hflx(i)  = fice(i)*hflxi(i) + ffw(i)*hflxw(i)
          evap(i)  = fice(i)*evapi(i) + ffw(i)*evapw(i)
        endif
      enddo
!
!  --- ...  the rest of the output

      do i = 1, im
        if (flag(i)) then
          qsurf(i) = q1(i) + evap(i) / (elocp*rch(i))

!  --- ...  convert snow depth back to mm of water equivalent

          weasd(i)  = snowd(i) * 1000.0
          snwdph(i) = weasd(i) * dsi             ! snow depth in mm
        endif
      enddo

      do i = 1, im
        if (flag(i)) then
          tem     = 1.0 / rho(i)
          hflx(i) = hflx(i) * tem * cpinv
          evap(i) = evap(i) * tem * hvapi
        endif
      enddo
!
      return

! =================
      contains
! =================


!-----------------------------------
      subroutine ice3lay
!...................................
!  ---  inputs:
!    &     ( im, kmi, fice, flag, hfi, hfd, sneti, focn, delt,          &
!  ---  input/outputs:
!    &       snowd, hice, stsice, tice, snof,                           &
!  ---  outputs:
!    &       snowmt, gflux                                              &
!    &     )

!**************************************************************************
!                                                                         *
!            three-layer sea ice vertical thermodynamics                  *
!                                                                         *
! based on:  m. winton, "a reformulated three-layer sea ice model",       *
! journal of atmospheric and oceanic technology, 2000                     *
!                                                                         *
!                                                                         *
!        -> +---------+ <- tice - diagnostic surface temperature ( <= 0c )*
!       /   |         |                                                   *
!   snowd   |  snow   | <- 0-heat capacity snow layer                     *
!       \   |         |                                                   *
!        => +---------+                                                   *
!       /   |         |                                                   *
!      /    |         | <- t1 - upper 1/2 ice temperature; this layer has *
!     /     |         |         a variable (t/s dependent) heat capacity  *
!   hice    |...ice...|                                                   *
!     \     |         |                                                   *
!      \    |         | <- t2 - lower 1/2 ice temp. (fixed heat capacity) *
!       \   |         |                                                   *
!        -> +---------+ <- base of ice fixed at seawater freezing temp.   *
!                                                                         *
!  =====================  defination of variables  =====================  !
!                                                                         !
!  inputs:                                                         size   !
!     im, kmi  - integer, horiz dimension and num of ice layers      1    !
!     fice     - real, sea-ice concentration                         im   !
!     flag     - logical, ice mask flag                              1    !
!     hfi      - real, net non-solar and heat flux @ surface(w/m^2)  im   !
!     hfd      - real, heat flux derivatice @ sfc (w/m^2/deg-c)      im   !
!     sneti    - real, net solar incoming at top  (w/m^2)            im   !
!     focn     - real, heat flux from ocean    (w/m^2)               im   !
!     delt     - real, timestep                (sec)                 1    !
!                                                                         !
!  input/outputs:                                                         !
!     snowd    - real, surface pressure                              im   !
!     hice     - real, sea-ice thickness                             im   !
!     stsice   - real, temp @ midpt of ice levels  (deg c)          im,kmi!     
!     tice     - real, surface temperature     (deg c)               im   !
!     snof     - real, snowfall rate           (m/sec)               im   !
!                                                                         !
!  outputs:                                                               !
!     snowmt   - real, snow melt during delt   (m)                   im   !
!     gflux    - real, conductive heat flux    (w/m^2)               im   !
!                                                                         !
!  locals:                                                                !
!     hdi      - real, ice-water interface     (m)                   im   !
!     hsni     - real, snow-ice                (m)                   im   !
!                                                                         !
! ======================================================================= !
!

!  ---  constant parameters: (properties of ice, snow, and seawater)
      real (kind=kind_phys), parameter :: ds   = 330.0    ! snow (ov sea ice) density (kg/m^3)
      real (kind=kind_phys), parameter :: dw   =1000.0    ! fresh water density  (kg/m^3)
      real (kind=kind_phys), parameter :: t0c  =273.15    ! freezing temp of fresh ice (k)
      real (kind=kind_phys), parameter :: ks   = 0.31     ! conductivity of snow   (w/mk)
      real (kind=kind_phys), parameter :: i0   = 0.3      ! ice surface penetrating solar fraction
      real (kind=kind_phys), parameter :: ki   = 2.03     ! conductivity of ice  (w/mk)
      real (kind=kind_phys), parameter :: di   = 917.0    ! density of ice   (kg/m^3)
      real (kind=kind_phys), parameter :: ci   = 2054.0   ! heat capacity of fresh ice (j/kg/k)
      real (kind=kind_phys), parameter :: li   = 3.34e5   ! latent heat of fusion (j/kg-ice)
      real (kind=kind_phys), parameter :: si   = 1.0      ! salinity of sea ice
      real (kind=kind_phys), parameter :: mu   = 0.054    ! relates freezing temp to salinity
      real (kind=kind_phys), parameter :: tfi  = -mu*si   ! sea ice freezing temp = -mu*salinity
      real (kind=kind_phys), parameter :: tfw  = -1.8     ! tfw - seawater freezing temp (c)
      real (kind=kind_phys), parameter :: tfi0 = tfi-0.0001
      real (kind=kind_phys), parameter :: dici = di*ci 
      real (kind=kind_phys), parameter :: dili = di*li 
      real (kind=kind_phys), parameter :: dsli = ds*li 
      real (kind=kind_phys), parameter :: ki4  = ki*4.0

!  ---  inputs:
!     integer, intent(in) :: im, kmi

!     real (kind=kind_phys), dimension(im), intent(in) :: fice, hfi,    &
!    &       hfd, sneti, focn

!     real (kind=kind_phys), intent(in) :: delt

!     logical, dimension(im), intent(in) :: flag

!  ---  input/outputs:
!     real (kind=kind_phys), dimension(im), intent(inout) :: snowd,     &
!    &       hice, tice, snof

!     real (kind=kind_phys), dimension(im,kmi), intent(inout) :: stsice

!  ---  outputs:
!     real (kind=kind_phys), dimension(im), intent(out) :: snowmt,      &
!    &       gflux

!  ---  locals:
      real (kind=kind_phys), dimension(im) :: hdi, hsni, a, b, ip,      &
     &      a1, b1, c1, a10, b10, k12, k32, h1, h2, dh, f1, tsf,        &
     &      tmelt, bmelt

      real (kind=kind_phys) :: dt2, dt4, dt6

      integer :: i
!
!===> ...  begin here
!
      dt2 = 2.0 * delt
      dt4 = 4.0 * delt
      dt6 = 6.0 * delt

      do i = 1, im
        if (flag(i)) then
          snowd(i) = snowd(i) * dw / ds
          hdi(i) = (ds*snowd(i) + di*hice(i)) / dw

          if (hice(i) < hdi(i)) then
            snowd(i) = snowd(i) + hice(i) - hdi(i)
            hsni (i) = (hdi(i) - hice(i)) * ds / di
            hice (i) = hice(i) + hsni(i)
          endif

          snof(i) = snof(i) * dw / ds
          tice(i) = tice(i) - t0c
          stsice(i,1) = min(stsice(i,1)-t0c, tfi0)     ! degc
          stsice(i,2) = min(stsice(i,2)-t0c, tfi0)     ! degc

          ip(i) = i0 * sneti(i)         ! ip +v (in winton ip=-i0*sneti as sol -v)
          if (snowd(i) > 0.0) then
            tsf(i) = 0.0
            ip (i) = 0.0
          else
            tsf(i) = tfi
            ip (i) = i0 * sneti(i)      ! ip +v here (in winton ip=-i0*sneti)
          endif
          tice(i) = min(tice(i), tsf(i))

!  --- ...  compute ice temperature

          b(i) = hfd(i)
          a(i) = hfi(i) - sneti(i) + ip(i) - tice(i)*b(i)  ! +v sol input here
          k12(i) = ki4*ks / (ks*hice(i) + ki4*snowd(i))
          k32(i) = 2.0 * ki / hice(i)

          a10(i) = dici*hice(i)/dt2 + k32(i)*(dt4*k32(i) + dici*hice(i))&
     &           / (dt6*k32(i) + dici*hice(i))
          b10(i) = -di*hice(i) * (ci*stsice(i,1) + li*tfi/stsice(i,1))  &
     &           / dt2 - ip(i)                                          &
     &           - k32(i)*(dt4*k32(i)*tfw + dici*hice(i)*stsice(i,2))   &
     &           / (dt6*k32(i) + dici*hice(i))

          a1(i) = a10(i) + k12(i)*b(i) / (k12(i) + b(i))
          b1(i) = b10(i) + a(i)*k12(i) / (k12(i) + b(i))
          c1(i) = dili*tfi / dt2*hice(i)

          stsice(i,1) = -(sqrt(b1(i)*b1(i) - 4.0*a1(i)*c1(i))           &
     &                + b1(i))/(2.0*a1(i))
          tice(i) = (k12(i)*stsice(i,1) - a(i)) / (k12(i) + b(i))

          if (tice(i) > tsf(i)) then
            a1(i) = a10(i) + k12(i)
            b1(i) = b10(i) - k12(i)*tsf(i)
            stsice(i,1) = -(sqrt(b1(i)*b1(i) - 4.0*a1(i)*c1(i))         &
     &                  + b1(i)) / (2.0*a1(i))
            tice(i) = tsf(i)
            tmelt(i) = (k12(i)*(stsice(i,1) - tsf(i))                   &
     &               - (a(i) + b(i)*tsf(i))) * delt
          else
            tmelt(i) = 0.0
            snowd(i) = snowd(i) + snof(i)*delt
          endif

          stsice(i,2) = (dt2*k32(i)*(stsice(i,1) + 2.0*tfw)             &
     &                + dici*hice(i)*stsice(i,2))                       &
     &                / (dt6*k32(i) + dici*hice(i))

          bmelt(i) = (focn(i) + ki4*(stsice(i,2) - tfw)/hice(i)) * delt

!  --- ...  resize the ice ...

          h1(i) = 0.5 * hice(i)
          h2(i) = 0.5 * hice(i)

!  --- ...  top ...

          if (tmelt(i) <= snowd(i)*dsli) then
            snowmt(i) = tmelt(i) / dsli
            snowd (i) = snowd(i) - tmelt(i)/dsli
          else
            snowmt(i) = snowd(i)
            h1(i) = h1(i) - (tmelt(i) - snowd(i)*dsli)                  &
     &            / (di * (ci - li/stsice(i,1)) * (tfi - stsice(i,1)))
            snowd(i) = 0.0
          endif

!  --- ...  and bottom

          if (bmelt(i) < 0.0) then
            dh(i) = -bmelt(i) / (dili + dici*(tfi - tfw))
            stsice(i,2) = (h2(i)*stsice(i,2) + dh(i)*tfw)               &
     &                  / (h2(i) + dh(i))
            h2(i) = h2(i) + dh(i)
          else
            h2(i) = h2(i) - bmelt(i) / (dili + dici*(tfi - stsice(i,2)))
          endif

!  --- ...  if ice remains, even up 2 layers, else, pass negative energy back in snow

          hice(i) = h1(i) + h2(i)

          if (hice(i) > 0.0) then
            if (h1(i) > 0.5*hice(i)) then
              f1(i) = 1.0 - 2.0*h2(i) / hice(i)
              stsice(i,2) = f1(i)                                       &
     &                    * (stsice(i,1) + li*tfi/(ci*stsice(i,1)))     &
     &                    + (1.0 - f1(i))*stsice(i,2)

              if (stsice(i,2) > tfi) then
                hice(i) = hice(i) - h2(i)*ci*(stsice(i,2) - tfi)        &
     &                  / (li*delt)
                stsice(i,2) = tfi
              endif
            else
              f1(i) = 2.0 * h1(i) / hice(i)
              stsice(i,1) = f1(i)                                       &
     &                    * (stsice(i,1) + li*tfi/(ci*stsice(i,1)))     &
     &                    + (1.0 - f1(i))*stsice(i,2)
              stsice(i,1) = (stsice(i,1) - sqrt(stsice(i,1)*stsice(i,1) &
     &                    - 4.0*tfi*li/ci)) / 2.0
            endif

            k12(i) = ki4*ks / (ks*hice(i) + ki4*snowd(i))
            gflux(i) = k12(i) * (stsice(i,1) - tice(i))
          else
            snowd(i) = snowd(i) + (h1(i)*(ci*(stsice(i,1) - tfi)        &
     &               - li*(1.0 - tfi/stsice(i,1)))                      &
     &               + h2(i)*(ci*(stsice(i,2) - tfi) - li)) / li

            hice(i) = max(0.0, snowd(i)*ds/di)
            snowd(i) = 0.0
            stsice(i,1) = tfw
            stsice(i,2) = tfw
            gflux(i) = 0.0
          endif   ! end if_hice_block

          gflux(i) = fice(i) * gflux(i)
          snowmt(i) = snowmt(i) * ds / dw
          snowd(i) = snowd(i) * ds / dw
          tice(i) = tice(i) + t0c
          stsice(i,1) = stsice(i,1) + t0c
          stsice(i,2) = stsice(i,2) + t0c
        endif   ! end if_flag_block
      enddo   ! end do_i_loop

      return
!...................................
      end subroutine ice3lay
!-----------------------------------

! =========================== !
!     end contain programs    !
! =========================== !

!...................................
      end subroutine sfc_sice
!-----------------------------------