!-------------------------------------- LICENCE BEGIN ------------------------------------
!Environment Canada - Atmospheric Science and Technology License/Disclaimer, 
!                     version 3; Last Modified: May 7, 2008.
!This is free but copyrighted software; you can use/redistribute/modify it under the terms 
!of the Environment Canada - Atmospheric Science and Technology License/Disclaimer 
!version 3 or (at your option) any later version that should be found at: 
!http://collaboration.cmc.ec.gc.ca/science/rpn.comm/license.html 
!
!This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
!without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
!See the above mentioned License/Disclaimer for more details.
!You should have received a copy of the License/Disclaimer along with this software; 
!if not, you can write to: EC-RPN COMM Group, 2121 TransCanada, suite 500, Dorval (Quebec), 
!CANADA, H9P 1J3; or send e-mail to service.rpn@ec.gc.ca
!-------------------------------------- LICENCE END --------------------------------------
*** S/P SEAICE1
*
#include "phy_macros_f.h"

      SUBROUTINE SEAICE1 ( BUS, BUSSIZ,  1,34
     1                     PTSURF, PTSURFSIZ,
     1                     TRNCH, KOUNT, 
     1                     N, M, NK )
*
#include "impnone.cdk"
*
*
      INTEGER BUSSIZ, KOUNT, TRNCH, N, M, NK
      INTEGER PTSURFSIZ
      INTEGER PTSURF(PTSURFSIZ)
      REAL    BUS(BUSSIZ)
*
*
*Author
*          J. Mailhot (April 1999)
*
*Revisions
* 001      B. Bilodeau and S. Belair (April 1999)
*          Coupling to the new SURFACE module
* 002      J. Mailhot (Feb 2000) - Add snow/ice melt/growth processes
*          and revisions of some parameters. Change name of s/r.
* 003      B. Bilodeau (Nov 2000) - New comdeck sfcbus.cdk
* 004      B. Bilodeau (Jan 2001) - Automatic arrays
* 005      J. Mailhot  (Apr 2001) - Multi-level ice model
* 006      B. Bilodeau (Aug 2001) - LOCBUS
* 007      J.-F. Mahfouf (Spring 2003) - 
*              Add implicit boundary condition option for vert. diff.
* 009      A. Plante (apr 2005) - limitation of snow depth to 10 cm.
* 010      A-M. Leduc (Oct 2005)- add LIMSNODP switch
* 011      M. Faucher (Summer 2006) - If OWFLUX. is .true. in coupling mode,
*                fluxes over ocean are taken from ocean model.
*
*Object
*          The multi-level model calculates the temperature profile across a
*          snow/ice slab and the surface fluxes of heat, moisture, and momentum
*          over floating ice-covered surfaces (sea/lake).
*
*Arguments
*
*           - Input/Output -
* BUS       bus of surface variables
*
*           - Input -
* BUSSIZ    size of the surface bus
* PTSURF    surface pointers
* PTSURFSIZ dimension of ptsurf
* KOUNT     number of timestep
* DELT      timestep
* ICEMELT   switch to control ice and snow melting
* N         running length
* M         horizontal dimension
* NK        vertical dimension
*
*
*Notes
*          One-dimensional thermodynamic sea ice model:
*          - based on modified version of nl-layer model of Semtner (1976, JPO 6, 379-389).
*          - includes snow cover on the top of ice, heat conduction through snow and ice,
*            thermal inertia of snow and ice layers, and penetrating solar radiation
*          - includes a parameterization of albedo, conductivity and heat capacity
*            (cf. Ebert and Curry 1993, JGR 98, 10085-10109; Flato and Brown 1996, 
*             JGR 101, 25767-25777)
*          - effects of open leads in ice are considered (using climatological values
*            of lead fraction to modify the analysed ice fraction)  
*          - vertical discretization similar to Flato and Brown (1996)
*            but a flux boundary condition applied at the surface
*
*          When the option ICEMELT = .TRUE. the model allows melting/growth of snow depth
*          and ice thickness, and open water in summer with a crude oceanic mixed layer.
*
*          The routine works with an arbitrary number of levels, but needs at least 2 
*          (NL .GE. 2).
**
*
************************************************************************
*     AUTOMATIC ARRAYS
************************************************************************
*
#include "icelvls.cdk"
*
      AUTOMATIC ( A      , REAL    , (N,NL) )
      AUTOMATIC ( B      , REAL    , (N,NL) )
      AUTOMATIC ( C      , REAL    , (N,NL) )
      AUTOMATIC ( CAP    , REAL    , (N,NL) )
      AUTOMATIC ( COND   , REAL    , (N,NL) )
      AUTOMATIC ( D      , REAL    , (N,NL) )
      AUTOMATIC ( DQSAT  , REAL    , (N   ) )
      AUTOMATIC ( DZ     , REAL    , (N,NL) )
      AUTOMATIC ( EMIST  , REAL    , (N   ) )
      AUTOMATIC ( NSNOW  , INTEGER , (N   ) )
      AUTOMATIC ( QSAT   , REAL    , (N   ) )
      AUTOMATIC ( RHOA   , REAL    , (N   ) )
      AUTOMATIC ( SCR1   , REAL    , (N   ) )
      AUTOMATIC ( SCR2   , REAL    , (N   ) )
      AUTOMATIC ( SCR3   , REAL    , (N   ) )
      AUTOMATIC ( SCR4   , REAL    , (N   ) )
      AUTOMATIC ( SCR5   , REAL    , (N   ) )
      AUTOMATIC ( SCR6   , REAL    , (N   ) )
      AUTOMATIC ( SCR7   , REAL    , (N   ) )
      AUTOMATIC ( SCR8   , REAL    , (N   ) )
      AUTOMATIC ( SCR9   , REAL    , (N   ) )
      AUTOMATIC ( SCR10  , REAL    , (N   ) )
      AUTOMATIC ( SCR11  , REAL    , (N   ) )
      AUTOMATIC ( SOUR   , REAL    , (N,NL) )
      AUTOMATIC ( TB     , REAL    , (N   ) )
      AUTOMATIC ( TP     , REAL    , (N,NL) )
      AUTOMATIC ( VMOD   , REAL    , (N   ) )
      AUTOMATIC ( Z      , REAL    , (N,NL) )
      AUTOMATIC ( ZTN    , REAL    , (N   ) )
      AUTOMATIC ( ZUN    , REAL    , (N   ) )
      AUTOMATIC ( ZSNODP_M, REAL   , (N   ) )
*
************************************************************************
*
*     Local variables "pointing" to the surface bus
*
      REAL ALBSFC, CMU, CTU, FC_ICE
      REAL MC_CPL,HICE_CPL,T_CPL
      REAL FSOL, FV_ICE
      REAL HICE, HST_ICE, HU, ILMO_ICE
      REAL PS, QSICE, TH, TS, T, TT, UU, VV
      REAL Z0H, Z0M
      REAL ZALFAQ, ZALFAT, ZDLAT, ZFCOR, ZFDSI
      REAL ZFTEMP, ZFVAP, ZQDIAG, ZSNODP, ZSNOWRATE, ZTDIAG
      REAL ZTSRAD, ZUDIAG, ZVDIAG, ZFRV, ZZUSL, ZZTSL
*
      POINTER (IALBSFC   , ALBSFC     (1   ) )
      POINTER (ICMU      , CMU        (1   ) )
      POINTER (ICTU      , CTU        (1   ) )
      POINTER (IMC_CPL   , MC_CPL     (1   ) )
      POINTER (IFC_ICE   , FC   _ICE  (1   ) )
      POINTER (IFSOL     , FSOL       (1   ) )
      POINTER (IFV_ICE   , FV   _ICE  (1   ) )
      POINTER (IHICE     , HICE       (1   ) )
      POINTER (IHICE_CPL , HICE_CPL   (1   ) )
      POINTER (IHST_ICE  , HST  _ICE  (1   ) )
      POINTER (IHU       , HU         (1   ) )
      POINTER (IILMO_ICE , ILMO _ICE  (1   ) )
      POINTER (IPS       , PS         (1   ) )
      POINTER (IQSICE    , QSICE      (1   ) )
      POINTER (IT        , T          (N,NL) )
      POINTER (IT_CPL    , T_CPL      (1   ) )
      POINTER (ITH       , TH         (1   ) )
      POINTER (ITS       , TS         (1   ) )
      POINTER (ITT       , TT         (1   ) )
      POINTER (IUU       , UU         (1   ) )
      POINTER (IVV       , VV         (1   ) )
      POINTER (IZ0H      , Z0H        (1   ) )
      POINTER (IZ0M      , Z0M        (1   ) )
      POINTER (IZALFAQ   , ZALFAQ     (1   ) )
      POINTER (IZALFAT   , ZALFAT     (1   ) )
      POINTER (IZDLAT    , ZDLAT      (1   ) )
      POINTER (IZFCOR    , ZFCOR      (1   ) )
      POINTER (IZFDSI    , ZFDSI      (1   ) )
      POINTER (IZFTEMP   , ZFTEMP     (1   ) )
      POINTER (IZFVAP    , ZFVAP      (1   ) )
      POINTER (IZQDIAG   , ZQDIAG     (1   ) )
      POINTER (IZSNODP   , ZSNODP     (1   ) )
      POINTER (IZSNOWRATE, ZSNOWRATE  (1   ) )
      POINTER (IZTDIAG   , ZTDIAG     (1   ) )
      POINTER (IZTSRAD   , ZTSRAD     (1   ) )
      POINTER (IZUDIAG   , ZUDIAG     (1   ) )
      POINTER (IZVDIAG   , ZVDIAG     (1   ) )
      POINTER (IZFRV     , ZFRV       (1   ) )
      POINTER (IZZUSL    , ZZUSL      (1   ) )
      POINTER (IZZTSL    , ZZTSL      (1   ) )
*
*
      INTEGER I, J, K
      REAL BETA, SC
*
#include "vamin.cdk"
      SAVE VAMIN
#include "snoh0.cdk"
      SAVE SNOH0
* 
      REAL CON1,CON2,CON3,CON4,CON5,CON6
      REAL CON7,CON8,CON9,CON10,CON11,CON12
      SAVE CON1,CON2,CON3,CON4,CON5,CON6
      SAVE CON7,CON8,CON9,CON10,CON11,CON12
      REAL FI0,CONDFI,TFRZW,TMELI,TMELS
      SAVE FI0,CONDFI,TFRZW,TMELI,TMELS
      REAL ALBOW,ALBDI,ALBMI,ALBDS,ALBMS,EMISI,EMISNO,EMISW
      SAVE ALBOW,ALBDI,ALBMI,ALBDS,ALBMS,EMISI,EMISNO,EMISW
      REAL COEFCOND,COEFHCAP,COEFEXT
      SAVE COEFCOND,COEFHCAP,COEFEXT
      REAL ROICE,ROSNOW(2),ROSWTR
      SAVE ROICE,ROSNOW,ROSWTR
      REAL Z0ICE,Z0W
      SAVE Z0ICE,Z0W
      REAL BASEHF
      SAVE BASEHF
      REAL HCAPI,HCAPW,VHFICE,VHFBAS,VHFSNO
      SAVE HCAPI,HCAPW,VHFICE,VHFBAS,VHFSNO
      REAL HSMIN,DMIX
      SAVE HSMIN,DMIX
*
      DATA   CON1     , CON2   , CON3  , CON4    /
     1       2.845E-6 , 2.7E-4 , 233.0 , 0.2   /
      DATA   CON5     , CON6   , CON7  , CON8  /
     1       92.88    , 7.364  , 3.2   , 14.24 /
      DATA   CON9     , CON10 , CON11 , CON12 /
     1       19.39    , 0.1   , 0.44  , 0.075 /
      DATA  TFRZW , TMELI , TMELS /  271.2 , 273.05 , 273.15  /
      DATA  ALBOW   ,  ALBDI  ,  ALBMI ,  ALBDS  ,  ALBMS /
     1      0.08    ,  0.57   ,  0.50  ,  0.83   ,  0.77  /
      DATA  FI0   ,  CONDFI , COEFCOND , COEFHCAP , COEFEXT /
     1      0.17  ,  2.034  , 0.1172   , 1.715E+7 , 1.5     /
      DATA  EMISI , EMISNO , EMISW / 0.99 , 0.99 , 0.97 /
      DATA  ROICE ,  ROSWTR  / 913.0 ,  1025.0  /
      DATA  ROSNOW / 330.0 , 450.0 /
      DATA  Z0ICE ,  Z0W  / 1.6E-4 , 3.2E-5 /
      DATA  BASEHF / 2.0 /
      DATA  HCAPI    , HCAPW    , VHFICE   , VHFBAS   , VHFSNO   /
     1      2.062E+3 , 4.088E+3 , 3.014E+8 , 2.679E+8 , 1.097E+8 /
      DATA  HSMIN , DMIX / 0.010 , 30.0 /
*
#include "himin.cdk"
*
      INTEGER PTR, X
*
#include "locbus.cdk"      
      INTEGER INDX_SFC, SURFLEN
      PARAMETER (INDX_SFC = INDX_ICE)
      INTEGER QUELNIVO(MAXVARSURF)
*
#include "zuzt.cdk"
*
#include "consphy.cdk"
*
#include "options.cdk"
*
#include "sfcbus.cdk"
*
*     fonctions-formule
*
#include "dintern.cdk"
#include "fintern.cdk"
#include "xptsurf.cdk"
*
*
      SURFLEN = M
*
*
*     EQUIVALENCES
*
      INIT_LOCBUS()
*
*     Syntax of macro locbus (must be typed in CAPITAL letters): 
*     locbus (pointer, array_name_in_the_bus, level)
*     If level=0, array chosen automatically as follows:
*        1) level =  1 if array has  1 level only (e.g. TSURF )
*        2) level = nk if array has nk levels     (e.g. TMOINS)
*        3) level = indx_sfc if array has a level for each surface type (e.g. FC)
*        4) level has to be specified by user if array has more than one level
*           that all "belong" to the same surface type (e.g. TSOIL)
*
      LOCBUS (IALBSFC   , ALVIS   ,  0 )
      LOCBUS (ICMU      , BM      ,  0 )
      LOCBUS (ICTU      , BT      ,  0 )
      LOCBUS (IFC  _ICE , FC      ,  0 )
      LOCBUS (IFSOL     , FLUSOLIS,  0 )
      LOCBUS (IFV  _ICE , FV      ,  0 )
      LOCBUS (IHICE     , ICEDP   ,  0 )
      LOCBUS (IHST _ICE , HST     ,  0 )
      LOCBUS (IHU       , HUMOINS ,  0 )
      LOCBUS (IILMO_ICE , ILMO    ,  0 )
      LOCBUS (IPS       , PMOINS  ,  0 )
      LOCBUS (IQSICE    , QSURF   ,  0 )
      LOCBUS (IT        , TMICE   ,  1 )
      LOCBUS (ITH       , THETAA  ,  0 )
      LOCBUS (ITS       , TSURF   ,  0 )
      LOCBUS (ITT       , TMOINS  ,  0 )
      LOCBUS (IUU       , UMOINS  ,  0 )
      LOCBUS (IVV       , VMOINS  ,  0 )
      LOCBUS (IZ0H      , Z0T     ,  0 )
      LOCBUS (IZ0M      , Z0      ,  0 )
      LOCBUS (IZALFAQ   , ALFAQ   ,  0 )
      LOCBUS (IZALFAT   , ALFAT   ,  0 )
      LOCBUS (IZDLAT    , DLAT    ,  0 )
      LOCBUS (IZFCOR    , FCOR    ,  0 )
      LOCBUS (IZFDSI    , FDSI    ,  0 )
      LOCBUS (IZFTEMP   , FTEMP   ,  0 )
      LOCBUS (IZFVAP    , FVAP    ,  0 )
      LOCBUS (IZSNODP   , SNODP   ,  0 )
      LOCBUS (IZSNOWRATE, SNOWRATE,  0 )
      LOCBUS (IZTSRAD   , TSRAD   ,  0 )
      LOCBUS (IZUDIAG   , UDIAG   ,  0 )
      LOCBUS (IZVDIAG   , VDIAG   ,  0 )
      LOCBUS (IZTDIAG   , TDIAG   ,  0 )
      LOCBUS (IZQDIAG   , QDIAG   ,  0 )
      LOCBUS (IZFRV     , FRV     ,  0 )
      LOCBUS (IZZUSL    , ZUSL    ,  0 )
      LOCBUS (IZZTSL    , ZTSL    ,  0 )
      IF (COUPLING) then
         LOCBUS (IMC_CPL   , MCCPL   ,  0 )
         LOCBUS (IHICE_CPL , ICEDPCPL,  0 )
         LOCBUS (IT_CPL    , TMICECPL,  1 )
      endif
*
*
      DO I=1,N
         ZTN(I) = ZT
         ZUN(I) = ZU
      END DO
*
*
*                               test on minimum value for number of layers
      IF( NL .LT. 2 ) THEN
         PRINT *,'******* FATAL ERROR IN ICE MODULE - NL < 2  *******'
         STOP
      ENDIF
*
*                               fully-implicit time scheme
      BETA = 1.0
      SC = (1.0 - BETA)*DELT
*
*
**     1.     Preliminaries
*      --------------------
*
      DO I=1,N
*
*                               Air density near the surface
        RHOA(I) = PS(I)/(RGASD*TT(I)*(1.0+DELTA*HU(I)))
*
*                               Modifications for the sea ice surface:
*                               - under-ice seawater temperature
        TB(I) = TFRZW
*
        IF( ICEMELT ) THEN
*                               Roughness lengths for the surface (ice/water)
          IF( HICE(I) .GE. HIMIN ) THEN
            Z0M(I) = Z0ICE
          ELSE
            Z0M(I) = Z0W
*                               remove snow if ice is too thin
            ZSNODP(I) = 0.0
          ENDIF
        ELSE
*                               - minimum ice thickness 
          HICE(I) = MAX ( HICE(I) , HIMIN )
          Z0M(I) = Z0ICE
*
        ENDIF
*
        Z0H(I) = Z0M(I)
*                               Wind module
*
        VMOD  (I) = SQRT( MAX( VAMIN,(UU(I)**2 + VV(I)**2)))
*
*       Damp snow depth with h0*tanh(ff/h0)

       IF (LIMSNODP)THEN
        ZSNODP_M(I) = SNOH0*TANH(ZSNODP(I)/SNOH0)
       ELSE
        ZSNODP_M(I) = ZSNODP(I)
       ENDIF

      END DO
*
*
*       2.     Initialization of temperature profiles
*       ---------------------------------------------
*
*
*                               Temperature at mid-layers
      DO K=1,NL-1
        DO I=1,N
          TP(I,K) = 0.5*( T(I,K) + T(I,K+1) )
        END DO
      END DO
*
      DO I=1,N
        TP(I,NL) = 0.5*( T(I,NL) + TB(I) )
      END DO
*
* Update coupling fields I7 and I8 for sea ice computation
*
      IF (COUPLING .and. .NOT.OWFLUX) THEN
         DO I=1,N
            T   (I,1)= T   (I,1)*(1.-MC_CPL(I)) +    T_CPL(I)*MC_CPL(I)
            HICE(I  )= HICE(I  )*(1.-MC_CPL(I)) + HICE_CPL(I)*MC_CPL(I)
         END DO
      endif

*       3.     Calculate the drag and heat coefficients
*       -----------------------------------------------
*
      DO I=1,N
*                               Saturated specific humidity at surface
        TS(I)    = T(I,1)
        QSAT(I)  = FOQST ( TS  (I), PS(I) )
        DQSAT(I) = FODQS ( QSAT(I), TS(I) )
      END DO
*
      CALL FLXSURF3( CMU, CTU, SCR1, ZFTEMP, ZFVAP, ILMO_ICE,
     $               ZFRV, ZFCOR, TH, HU, ZZUSL, ZZTSL, VMOD, TS, 
     $               QSICE, HST_ICE, Z0M, Z0H, 
     $               SCR2, SCR3, SCR4, SCR5, N) 
*
*
*
*       4.     Parameterizations (albedo, conductivity, capacity,...)
*       -------------------------------------------------------------
*
*
      DO I=1,N
*                               - surface albedo (function of surface type and temperature)
        IF( TS(I) .LT. TMELS ) THEN
          SCR2(I) = ALBDS
        ELSE
          SCR2(I) = ALBMS
        ENDIF
*
        IF( TS(I) .LT. TMELI ) THEN
          SCR3(I) = MIN(ALBDI,MAX(ALBOW,0.08+CON11*HICE(I)**0.28))
          SCR9(I) = CHLC+CHLF
        ELSE
          SCR3(I) = ALBMI
          SCR9(I) = CHLC
        ENDIF
*
      END DO
*
      DO I=1,N
*                               - emissivity and fraction of penetrating solar radiation
*                                 (function of surface type snow/ice/water)
        IF( HICE(I) .GE. HIMIN ) THEN
          IF( ZSNODP(I) .GT. CON10 ) THEN
            ALBSFC(I) = SCR2(I)
            EMIST(I) = EMISNO
            SCR6(I) = 1.0
          ELSE
            ALBSFC(I) = MIN( SCR2(I) , SCR3(I)+ZSNODP(I)*
     1                      (SCR2(I)-SCR3(I))/CON10 )
            EMIST(I) = EMISI
            SCR6(I) = 1.0 - FI0
            SCR6(I) = MIN( 1.0 , SCR6(I)+ZSNODP(I)*
     1                      (1.0-SCR6(I))/CON10 )
          ENDIF
        ELSE
          ALBSFC(I) = ALBOW
          EMIST(I) = EMISW
          SCR6(I) = 1.0
          SCR9(I) = CHLC
        ENDIF
*                               - bulk salinity of the ice
        SCR8(I) = MAX( CON7 , CON8-CON9*HICE(I) )
*
      END DO
*
*
      DO I=1,N
       IF( HICE(I) .GE. HIMIN ) THEN
*                                                       snow layer
        IF( ZSNODP(I) .GE. HSMIN ) THEN
          NSNOW(I) = 1
          DZ(I,1) = ZSNODP_M(I)
          SCR4(I) = ROSNOW(1)
          IF( TP(I,1) .GE. TMELS ) SCR4(I) = ROSNOW(2)
          COND(I,1) = CON1*SCR4(I)**2+CON2*2.**((TP(I,1)-CON3)*CON4)
          CAP(I,1) = SCR4(I)*(CON5+CON6*TP(I,1))
        ELSE
          NSNOW(I) = 0
          DZ(I,1) = HICE(I)/FLOAT(NL)
        ENDIF
*
       ELSE
         NSNOW(I) = 0
         DZ(I,1) = DMIX
         CAP(I,1) = DMIX*ROSWTR*HCAPW
       ENDIF
      END DO
*
*                               			ice slab
      DO K=2,NL
        DO I=1,N
          IF( HICE(I) .GE. HIMIN ) THEN
            SCR3(I) = ROICE*HCAPI
            DZ(I,K) = HICE(I)/FLOAT(NL-NSNOW(I))
            COND(I,K) = CONDFI+COEFCOND*SCR8(I)/MIN(TP(I,K)-TMELI,-0.1)
            COND(I,K) = MAX( 0.2*CONDFI , COND(I,K) )
*
            CAP(I,K) = SCR3(I)+COEFHCAP*SCR8(I)/
     1               MIN( T(I,K)-TMELI , -0.1 )**2
            CAP(I,K) = MIN( 100.0*SCR3(I) , CAP(I,K) )
          ELSE
            NSNOW(I) = 0
            DZ(I,K) = DMIX
            CAP(I,K) = DMIX*ROSWTR*HCAPW
          ENDIF
        END DO
      END DO
*
      DO I=1,N
        IF( HICE(I) .GE. HIMIN .AND. NSNOW(I).EQ.0 ) THEN
          SCR3(I) = ROICE*HCAPI
          DZ(I,1) = HICE(I)/FLOAT(NL-NSNOW(I))
          COND(I,1) = CONDFI+COEFCOND*SCR8(I)/MIN(TP(I,1)-TMELI,-0.1)
          COND(I,1) = MAX( 0.2*CONDFI , COND(I,1) )
*
          CAP(I,1) = SCR3(I)+COEFHCAP*SCR8(I)/
     1             MIN( T(I,1)-TMELI , -0.1 )**2
          CAP(I,1) = MIN( 100.0*SCR3(I) , CAP(I,1) )
        ENDIF
      END DO
*
      DO I=1,N
       IF( HICE(I) .GE. HIMIN ) THEN
        IF( NSNOW(I) .EQ. 0 ) THEN
          CAP(I,1) = SCR3(I)+COEFHCAP*SCR8(I)/
     1               MIN( 0.75*T(I,1)+0.25*T(I,2)-TMELI , -0.1 )**2
          CAP(I,1) = MIN( 100.0*SCR3(I) , CAP(I,1) )
        ELSE
          IF( NL .GT. 2) THEN
            CAP(I,2) = SCR3(I)+COEFHCAP*SCR8(I)/
     1               MIN( 0.75*T(I,2)+0.25*T(I,3)-TMELI , -0.1 )**2
          ELSE
            CAP(I,2) = SCR3(I)+COEFHCAP*SCR8(I)/
     1               MIN( 0.75*T(I,2)+0.25*TB(I)-TMELI , -0.1 )**2
          ENDIF
          CAP(I,2) = MIN( 100.0*SCR3(I) , CAP(I,2) )
        ENDIF 
*                                              add "thin" snow layer 
        IF( NSNOW(I) .EQ. 0 ) THEN
          SCR4(I) = ROSNOW(1)
          IF( T(I,1) .GE. TMELS ) SCR4(I) = ROSNOW(2)
          SCR4(I) = CON1*SCR4(I)**2+CON2*2.**((T(I,1)-CON3)*CON4)
          COND(I,1) = COND(I,1)/
     1                (1.0+ZSNODP(I)*COND(I,1)/(DZ(I,1)*SCR4(I)))
        ENDIF
*
       ENDIF
      END DO
*
      DO I=1,N
*                                              penetrating solar radiation
        SCR7(I) = (1.0-SCR6(I))*FSOL(I)*(1.-ALBSFC(I))
        IF( NSNOW(I).EQ.1 ) THEN
          Z(I,1) = 0.0
          Z(I,2) = 0.5*DZ(I,2)
        ELSE 
          Z(I,1) = 0.5*DZ(I,1)
          Z(I,2) = Z(I,1)+0.5*(DZ(I,2)+DZ(I,1))
        ENDIF
        SOUR(I,1) = SCR7(I)*(1.-EXP(-COEFEXT*Z(I,1)))
        SOUR(I,2) = SCR7(I)*(EXP(-COEFEXT*Z(I,1))
     1                      -EXP(-COEFEXT*Z(I,2)))
*
      END DO
*
      IF( NL .GT. 2) THEN
        DO K=3,NL
          DO I=1,N
            Z(I,K) = Z(I,K-1)+0.5*(DZ(I,K)+DZ(I,K-1))
            SOUR(I,K) = SCR7(I)*(EXP(-COEFEXT*Z(I,K-1))
     1                          -EXP(-COEFEXT*Z(I,K)))
          END DO
        END DO
        DO I=1,N
          Z(I,NL) = Z(I,NL)+0.5*DZ(I,NL)
          SOUR(I,NL) = SCR7(I)*(EXP(-COEFEXT*Z(I,NL-1))
     1                        -EXP(-COEFEXT*Z(I,NL)))
        END DO
      ELSE
        DO I=1,N
          Z(I,NL) = Z(I,NL)+0.5*DZ(I,NL)
          SOUR(I,NL) = SCR7(I)*(1.0-EXP(-COEFEXT*Z(I,NL)))
        END DO
      ENDIF
*
*
*
*       5.     Compute the temperature profile
*       --------------------------------------
*
*                                              linearized terms in surface heat budget
      DO I=1,N
*
        SCR1(I) = 4. * EMIST(I) * STEFAN * TS(I)**3
     1     +  RHOA(I) * CTU(I) * (DQSAT(I) * SCR9(I) + CPD)
     1     
*
        SCR2(I) = 3. * EMIST(I) * STEFAN  * TS(I)**4
     1     + RHOA(I) * CTU(I) * DQSAT(I) * SCR9(I) * TS(I)
*
        SCR3(I) = RHOA(I)*CTU(I)*(CPD*TH(I)-SCR9(I)*(QSAT(I)-HU(I)))
     1     + SCR6(I)*FSOL(I)*(1.-ALBSFC(I))
     1     + EMIST(I)*ZFDSI(I)
*
      END DO
*
*                                              setup tridiagonal terms A, B, C
*                                              and right-hand-side term D
*                                            
      IF( NL.GT.3 ) THEN
        DO K=3,NL-1
          DO I=1,N
            IF( HICE(I) .GE. HIMIN )
     1        CAP(I,K) = 0.5*( DZ(I,K)+DZ(I,K-1) )*CAP(I,K)
          END DO
        END DO
      ENDIF
*
      DO I=1,N
        IF( HICE(I) .GE. HIMIN ) THEN
          SOUR(I,2) = SOUR(I,2)+SOUR(I,1)
          IF( NSNOW(I) .EQ. 0 ) THEN
            CAP(I,2) = ( 0.5*DZ(I,2)+DZ(I,1) )*CAP(I,2)
*                                              add "thin" snow layer 
            SCR4(I) = ROSNOW(1)
            IF( T(I,1) .GE. TMELS ) SCR4(I) = ROSNOW(2)
            SCR4(I) = SCR4(I)*(CON5+CON6*SCR5(I))
            CAP(I,2) = CAP(I,2) + ZSNODP(I)*SCR4(I)
            CAP(I,NL) = 0.5*( DZ(I,NL-1)+DZ(I,NL) )*CAP(I,NL)
          ELSE 
            CAP(I,2) = 0.5*DZ(I,2)*CAP(I,2)+DZ(I,1)*CAP(I,1)
            CAP(I,NL) = 0.5*( DZ(I,NL-1)+DZ(I,NL) )*CAP(I,NL)
          ENDIF 
        ENDIF
      END DO
*
      DO K=2,NL
        DO I=1,N
          IF( HICE(I) .GE. HIMIN ) THEN
            A(I,K) = (COND(I,K-1)/DZ(I,K-1))/CAP(I,K)
            C(I,K) = (COND(I,K)/DZ(I,K))/CAP(I,K)
            B(I,K) = -A(I,K)-C(I,K)
            D(I,K) = DELT*SOUR(I,K)/CAP(I,K) + T(I,K)
          ENDIF
        END DO
      END DO
*
      DO I=1,N
        IF( HICE(I) .GE. HIMIN ) THEN
          A(I,1) = 0.0
          B(I,1) = 0.0
          C(I,1) = 0.0
          D(I,1) = 0.0
          C(I,NL) = 0.0
        ENDIF
      END DO
*
      DO K=1,NL
        DO I=1,N
          IF( HICE(I) .LT. HIMIN ) THEN
            A(I,K) = 0.0
            B(I,K) = 0.0
            C(I,K) = 0.0
            D(I,K) = 0.0
          ENDIF
        END DO
      END DO
*
      DO I=1,N
          IF( HICE(I) .LT. HIMIN )
     1           D(I,1) = T(I,1)
      END DO
*
*
*
*                                             back to full levels
      DO K=1,NL
        DO I=1,N
          TP(I,K) = T(I,K)
        END DO
      END DO
*
      CALL DIFUVD1(D, SC, A, B, C, TP, D, N, N, NL)
*
      DO K=1,NL
        DO I=1,N
          A(I,K) =    -BETA*DELT*A(I,K)
          B(I,K) = 1.0-BETA*DELT*B(I,K)
          C(I,K) =    -BETA*DELT*C(I,K)
        END DO
      END DO
*
      DO I=1,N
*                                              add upper boundary condition
        IF( HICE(I) .GE. HIMIN ) THEN
          C(I,1) = -BETA
          B(I,1) = -C(I,1)+DZ(I,1)*SCR1(I)/COND(I,1)
          D(I,1) = DZ(I,1)*(SCR2(I)+SCR3(I))/COND(I,1)
     1             +(1.0-BETA)*(T(I,2)-T(I,1))
*                                              add lower boundary condition
          D(I,NL) = D(I,NL)+DELT*TB(I)*(COND(I,NL)/
     1                      DZ(I,NL))/CAP(I,NL)
        ENDIF
      END DO
*
      DO K=1,NL
        DO I=1,N
          IF( HICE(I) .LT. HIMIN ) THEN
            A(I,K) = -1.0
            B(I,K) =  1.0
          ENDIF
        END DO
      END DO
*
      DO I=1,N
        IF( HICE(I) .LT. HIMIN ) THEN
          A(I,1) =  0.0
          B(I,1) =  1.0
          C(I,1) =  0.0
          B(I,1) = B(I,1)+DELT*SCR1(I)/CAP(I,1)
          D(I,1) = D(I,1)+DELT*(SCR2(I)+SCR3(I))/CAP(I,1)
        ENDIF
      END DO
*
*
      CALL DIFUVD2(TP, A, B, C, D, D, N, N, NL)
*
*                                              prevent temperatures
*                                              from exceeding melting temperature
      DO I=1,N
        IF( HICE(I) .GE. HIMIN ) THEN
          IF( ZSNODP(I) .GE. HSMIN ) THEN
            SCR4(I) = TMELS
          ELSE
            SCR4(I) = TMELI
          ENDIF
        ENDIF
      END DO
*
      DO K=1,NL
        DO I=1,N
          IF( HICE(I) .GE. HIMIN )
     1      TP(I,K) = MIN ( TP(I,K) , SCR4(I) )
        END DO
      END DO
*
      DO I=1,N
        IF( HICE(I) .LT. HIMIN ) 
     1    SCR4(I) = TB(I)
      END DO
*
*
*                                              surface and snow/ice temperatures
      DO K=1,NL
        DO I=1,N
          T(I,K) = TP(I,K)
        END DO
      END DO
*
      DO I=1,N
        TS(I) = TP(I,1)
*                                              saturated specific humidity at surface
        QSICE(I) = FOQST( TS(I), PS(I) )
      END DO
*
*
*       6.     Melting and growth
*       -------------------------
*                                              melting at the surface (snow/ice)
*                                              growth/melting of ice at the lower boundary
      IF(ICEMELT) THEN
*
        DO I=1,N
*
*                               recompute surface albedo with new TS
*
          IF( TS(I) .LT. TMELS ) THEN
            SCR2(I) = ALBDS
          ELSE
            SCR2(I) = ALBMS
          ENDIF
*
          IF( TS(I) .LT. TMELI ) THEN
            SCR3(I) = MIN(ALBDI,MAX(ALBOW,0.08+CON11*HICE(I)**0.28))
            SCR9(I) = CHLC+CHLF
          ELSE
            SCR3(I) = ALBMI
            SCR9(I) = CHLC
          ENDIF
*
          IF( HICE(I) .GE. HIMIN ) THEN
            IF( ZSNODP(I) .GT. CON10 ) THEN
              ALBSFC(I) = SCR2(I)
            ELSE
              ALBSFC(I) = MIN( SCR2(I) , SCR3(I)+ZSNODP(I)*
     1                        (SCR2(I)-SCR3(I))/CON10 )
            ENDIF
          ELSE
            ALBSFC(I) = ALBOW
            SCR9(I) = CHLC
          ENDIF
*
        END DO
*
        DO I=1,N
*                               compute heat conduction flux in upper layer
          IF( HICE(I) .GE. HIMIN ) THEN
            IF( ZSNODP(I) .GE. HSMIN ) THEN
              SCR7(I) = ROSNOW(1)
              SCR5(I) = 0.5*(T(I,1)+T(I,2))
              IF( SCR5(I) .GE. TMELS ) SCR7(I) = ROSNOW(2)
              COND(I,1) = CON1*SCR7(I)**2
     1                  +CON2*2.**((SCR5(I)-CON3)*CON4)
            ELSE
              SCR7(I) = 0.5*(T(I,1)+T(I,2))
              COND(I,1) = CONDFI+COEFCOND*SCR8(I)
     1                    /MIN(SCR7(I)-TMELI,-0.1)
              COND(I,1) = MAX( 0.2*CONDFI , COND(I,1) )
*                                              add "thin" snow layer 
              SCR5(I) = ROSNOW(1)
              IF( T(I,1) .GE. TMELS ) SCR5(I) = ROSNOW(2)
              SCR5(I) = CON1*SCR5(I)**2+CON2*2.**((T(I,1)-CON3)*CON4)
              COND(I,1) = COND(I,1)/
     1                (1.0+ZSNODP(I)*COND(I,1)/(DZ(I,1)*SCR5(I)))
            ENDIF
            SCR11(I) = COND(I,1)*(T(I,2)-T(I,1))/DZ(I,1)
          ELSE
            SCR11(I) = 0.0
          ENDIF
*
*                               compute HA = H + LE + FWnet + FLnet
          SCR5(I) = RHOA(I)*CTU(I)*
     1              ( CPD*(TS(I)-TH(I))+SCR9(I)*(QSICE(I)-HU(I)) )
     1     - SCR6(I)*FSOL(I)*(1.-ALBSFC(I))
     1             + EMIST(I)*( STEFAN*TS(I)**4 - ZFDSI(I) )
*
          SCR3(I) = SCR5(I) - SCR11(I)
*
        END DO
*
*
        DO I=1,N
*                               criteria for melting at the surface
          SCR10(I) = 0.0
          IF( TS(I).GE.SCR4(I) .AND.
     1        SCR5(I).LE.0.0 .AND. SCR3(I).LT.0.0 ) THEN
*                               melt available snow...
            ZSNODP(I) = ZSNODP(I) + DELT*SCR3(I)/VHFSNO
*                               ...then ice...
            IF( ZSNODP(I).LT.0.0 ) THEN
              HICE(I) = HICE(I) + ZSNODP(I)*VHFSNO/VHFICE 
              ZSNODP(I) = 0.0
*                               ...then warm oceanic mixed layer
              IF( HICE(I).LT.0.0 ) THEN
                TS(I) = TS(I) - HICE(I)*VHFICE/CAP(I,1)
                HICE(I) = 0.0 
                SCR10(I) = 1.0
              ENDIF
            ENDIF
*
          ENDIF
        END DO
*                               add growth/melt of ice at lower boundary
        DO I=1,N
          IF( HICE(I) .GE. HIMIN ) THEN
*
*                               compute heat conduction flux in lower layer
            SCR11(I) = COND(I,NL)*(TB(I)-T(I,NL))/DZ(I,NL)
*                               compute absorption of penetrating solar radiation
            SCR8(I) = FSOL(I)*(1.-ALBSFC(I))*(1.-SCR6(I))
     1                *EXP(-COEFEXT*Z(I,NL))
            HICE(I) = MAX ( 0.0 , HICE(I) +
     1                DELT*( SCR11(I)-SCR8(I)-BASEHF )/VHFBAS )
*                                if ice is too thin, switch to oceanic mixed layer
            IF( HICE(I).LT.HIMIN ) THEN
              TS(I) = TFRZW
              ZSNODP(I) = 0.0
              SCR10 (I) = 1.0
            ENDIF
*
          ELSE
            IF( SCR5(I).GT.0.0 ) THEN
*                               cool oceanic mixed layer...
              TS(I) = TS(I) - DELT*SCR5(I)/CAP(I,1)
*                               ...then form new ice
              IF( TS(I).LE.TFRZW ) THEN
                HICE(I) = HICE(I) + (TFRZW-TS(I))*CAP(I,1)/VHFBAS
                TS(I) = TFRZW
              ENDIF
              SCR10(I) = 1.0
            ENDIF
*
          ENDIF
        END DO
*                               ...and adjust final temperature profile

        DO K=1,NL
          DO I=1,N
            IF( SCR10(I).EQ.1.0 ) THEN
              T(I,K) = TS(I)
              TP(I,K) = TS(I)
            ENDIF
          END DO
        END DO
*                               add snow fall (units changed from 
*                               water equivalent to snow equivalent)
        DO I=1,N
          IF( TS(I).LT.TMELI .AND. HICE(I).GT.HIMIN ) THEN
            ZSNODP(I) = ZSNODP(I) + DELT*ZSNOWRATE(I)*(1000./ROSNOW(1))
          ENDIF
        END DO
*
*                               transition periods
        DO I=1,N
          IF( NSNOW(I).EQ.0 .AND. ZSNODP(I).GE.HSMIN ) THEN
            T(I,1) = TP(I,1)
            T(I,2) = TP(I,1)
            Z(I,1) = 0.0
          ENDIF
        END DO
        DO K=2,NL
          DO I=1,N
            IF( NSNOW(I).EQ.0 .AND. ZSNODP(I).GE.HSMIN )
     1        Z(I,K) = Z(I,K-1)+DZ(I,K-1)
          END DO
        END DO
*
        DO I=1,N
          IF( NSNOW(I).EQ.0 .AND. ZSNODP(I).GE.HSMIN ) THEN
            DZ(I,1) = 0.0
            DZ(I,2) = 0.0
          ENDIF 
        END DO
*
        IF( NL.GT.2 ) THEN
          DO K=3,NL
            DO I=1,N
              IF( NSNOW(I).EQ.0 .AND. ZSNODP(I).GE.HSMIN ) THEN
                DZ(I,K) = DZ(I,K-1)+HICE(I)/FLOAT(NL-1)
                T(I,K) = TP(I,K-1)+((DZ(I,K)-Z(I,K-1))
     1                   /(Z(I,K)-Z(I,K-1)))*(TP(I,K)-TP(I,K-1))
              ENDIF
            END DO
          END DO
        ENDIF
*
        DO I=1,N
          IF( NSNOW(I).EQ.1 .AND. ZSNODP(I).LT.HSMIN ) THEN
            T(I,1) = TP(I,2)
            Z(I,1) = 0.0
            Z(I,2) = 0.0
          ENDIF
        END DO
        IF( NL.GT.2 ) THEN
          DO K=3,NL
            DO I=1,N
              IF( NSNOW(I).EQ.1 .AND. ZSNODP(I).LT.HSMIN )
     1          Z(I,K) = Z(I,K-1)+DZ(I,K-1)
            END DO
          END DO
        ENDIF  
        DO I=1,N
          IF( NSNOW(I).EQ.1 .AND. ZSNODP(I).LT.HSMIN ) THEN
            DZ(I,1) = 0.0
            DZ(I,2) = HICE(I)/FLOAT(NL)
            T(I,2) = TP(I,2)+((DZ(I,2)-Z(I,2))
     1               /(Z(I,3)-Z(I,2)))*(TP(I,3)-TP(I,2))
          ENDIF
        END DO
        IF( NL.GT.3 ) THEN
          DO K=3,NL-1
            DO I=1,N
              IF( NSNOW(I).EQ.1 .AND. ZSNODP(I).LT.HSMIN ) THEN
                DZ(I,K) = DZ(I,K-1)+HICE(I)/FLOAT(NL)
                T(I,K) = TP(I,K)+((DZ(I,K)-Z(I,K))
     1                 /(Z(I,K+1)-Z(I,K)))*(TP(I,K+1)-TP(I,K))
              ENDIF
            END DO
          END DO
        ENDIF  
        DO I=1,N
          IF( NSNOW(I).EQ.1 .AND. ZSNODP(I).LT.HSMIN ) THEN
            DZ(I,NL) = DZ(I,NL-1)+HICE(I)/FLOAT(NL)
            T(I,NL) = TP(I,NL)+((DZ(I,NL)-Z(I,NL))
     1            /(MAX(HICE(I),HIMIN)/FLOAT(NL-1)))*(TB(I)-TP(I,NL))
          ENDIF
        END DO
*
      ENDIF
*
*  RE-update coupling fields I7 and I8 for later flux computation
*
      IF (COUPLING.and. .NOT.OWFLUX) THEN
         DO I=1,N
               T(I,1)=    T(I,1)*(1-MC_CPL(I)) +    T_CPL(I)*MC_CPL(I)
            HICE(I  )= HICE(I  )*(1-MC_CPL(I)) + HICE_CPL(I)*MC_CPL(I)
         END DO
      endif

*       7.     Update fluxes
*       ------------------------------------------------
*
*     Update TS and QSICE
      DO I=1,N
        TS   (I) = T(I,1)
        QSICE(I) = FOQST( TS(I), PS(I) )
      END DO
*
      CALL DIASURF2(ZUDIAG, ZVDIAG, ZTDIAG, ZQDIAG,
     $              N, UU, VV, TS, QSICE,
     $              Z0M, Z0H, ILMO_ICE, ZZUSL,
     $              HST_ICE, ZFRV, ZFTEMP, ZFVAP,
     $              ZUN, ZTN, ZDLAT)
*
*
*VDIR NODEP
      DO I=1,N
*                               remove snow if ice is too thin
        IF( HICE(I).LT.HIMIN ) ZSNODP(I) = 0.0
*
        ZTSRAD   (I) = TS(I)
*
        ZALFAT   (I) = - CTU(I) * ( TS    (I) - TH(I) )
        ZALFAQ   (I) = - CTU(I) * ( QSICE (I) - HU(I) )
        IF (.NOT.IMPFLX) CTU (I) = 0.
        RHOA     (I) = PS(I)/(RGASD * ZTDIAG(I)*(1.+DELTA*ZQDIAG(I)))
        FC   _ICE(I) = -CPD *RHOA(I)*ZALFAT(I)
        FV   _ICE(I) = -(CHLC+CHLF)*RHOA(I)*ZALFAQ(I)
*
        IF (IMPFLX) THEN
          ZALFAT   (I) = - CTU(I) *  TS(I)
          ZALFAQ   (I) = - CTU(I) *  QSICE(I) 
        ENDIF
****
      END DO
*
*     FILL THE ARRAYS TO BE AGGREGATED LATER IN S/R AGREGE
      CALL FILLAGG ( BUS, BUSSIZ, PTSURF, PTSURFSIZ, INDX_ICE, 
     +               SURFLEN )
*
      RETURN
      CONTAINS
#include "fintern90.cdk"
      END