New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 5260 for branches/2014/dev_r4650_UKMO10_Tidally_Meaned_Diagnostics/NEMOGCM/NEMO/LIM_SRC_3/limthd_dif.F90 – NEMO

Ignore:
Timestamp:
2015-05-12T12:37:15+02:00 (9 years ago)
Author:
deazer
Message:

Merged branch with Trunk at revision 5253.
Checked with SETTE, passes modified iodef.xml for AMM12 experiment

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2014/dev_r4650_UKMO10_Tidally_Meaned_Diagnostics/NEMOGCM/NEMO/LIM_SRC_3/limthd_dif.F90

    r4333 r5260  
    1919   USE phycst         ! physical constants (ocean directory)  
    2020   USE ice            ! LIM-3 variables 
    21    USE par_ice        ! LIM-3 parameters 
    2221   USE thd_ice        ! LIM-3: thermodynamics 
    2322   USE in_out_manager ! I/O manager 
     
    2524   USE wrk_nemo       ! work arrays 
    2625   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     26   USE sbc_oce, ONLY : lk_cpl 
    2727 
    2828   IMPLICIT NONE 
     
    3131   PUBLIC   lim_thd_dif   ! called by lim_thd 
    3232 
    33    REAL(wp) ::   epsi10      =  1.e-10_wp    ! 
    3433   !!---------------------------------------------------------------------- 
    3534   !! NEMO/LIM3 4.0 , UCL - NEMO Consortium (2011) 
     
    3938CONTAINS 
    4039 
    41    SUBROUTINE lim_thd_dif( kideb , kiut , jl ) 
     40   SUBROUTINE lim_thd_dif( kideb , kiut ) 
    4241      !!------------------------------------------------------------------ 
    4342      !!                ***  ROUTINE lim_thd_dif  *** 
     
    7473      !! 
    7574      !! ** Inputs / Ouputs : (global commons) 
    76       !!           surface temperature : t_su_b 
    77       !!           ice/snow temperatures   : t_i_b, t_s_b 
    78       !!           ice salinities          : s_i_b 
     75      !!           surface temperature : t_su_1d 
     76      !!           ice/snow temperatures   : t_i_1d, t_s_1d 
     77      !!           ice salinities          : s_i_1d 
    7978      !!           number of layers in the ice/snow: nlay_i, nlay_s 
    8079      !!           profile of the ice/snow layers : z_i, z_s 
    81       !!           total ice/snow thickness : ht_i_b, ht_s_b 
     80      !!           total ice/snow thickness : ht_i_1d, ht_s_1d 
    8281      !! 
    8382      !! ** External :  
     
    9190      !!           (04-2007) Energy conservation tested by M. Vancoppenolle 
    9291      !!------------------------------------------------------------------ 
    93       INTEGER , INTENT (in) ::   kideb   ! Start point on which the  the computation is applied 
    94       INTEGER , INTENT (in) ::   kiut    ! End point on which the  the computation is applied 
    95       INTEGER , INTENT (in) ::   jl      ! Category number 
     92      INTEGER , INTENT(in) ::   kideb, kiut   ! Start/End point on which the  the computation is applied 
    9693 
    9794      !! * Local variables 
     
    9996      INTEGER ::   ii, ij      ! temporary dummy loop index 
    10097      INTEGER ::   numeq       ! current reference number of equation 
    101       INTEGER ::   layer       ! vertical dummy loop index  
     98      INTEGER ::   jk       ! vertical dummy loop index  
    10299      INTEGER ::   nconv       ! number of iterations in iterative procedure 
    103100      INTEGER ::   minnumeqmin, maxnumeqmax 
    104       INTEGER, DIMENSION(kiut) ::   numeqmin   ! reference number of top equation 
    105       INTEGER, DIMENSION(kiut) ::   numeqmax   ! reference number of bottom equation 
    106       INTEGER, DIMENSION(kiut) ::   isnow      ! switch for presence (1) or absence (0) of snow 
     101       
     102      INTEGER, POINTER, DIMENSION(:) ::   numeqmin   ! reference number of top equation 
     103      INTEGER, POINTER, DIMENSION(:) ::   numeqmax   ! reference number of bottom equation 
     104       
    107105      REAL(wp) ::   zg1s      =  2._wp        ! for the tridiagonal system 
    108106      REAL(wp) ::   zg1       =  2._wp        ! 
    109107      REAL(wp) ::   zgamma    =  18009._wp    ! for specific heat 
    110108      REAL(wp) ::   zbeta     =  0.117_wp     ! for thermal conductivity (could be 0.13) 
    111       REAL(wp) ::   zraext_s  =  1.e+8_wp     ! extinction coefficient of radiation in the snow 
     109      REAL(wp) ::   zraext_s  =  10._wp       ! extinction coefficient of radiation in the snow 
    112110      REAL(wp) ::   zkimin    =  0.10_wp      ! minimum ice thermal conductivity 
     111      REAL(wp) ::   ztsu_err  =  1.e-5_wp     ! range around which t_su is considered as 0°C  
    113112      REAL(wp) ::   ztmelt_i    ! ice melting temperature 
    114113      REAL(wp) ::   zerritmax   ! current maximal error on temperature  
    115       REAL(wp), DIMENSION(kiut) ::   ztfs        ! ice melting point 
    116       REAL(wp), DIMENSION(kiut) ::   ztsuold     ! old surface temperature (before the iterative procedure ) 
    117       REAL(wp), DIMENSION(kiut) ::   ztsuoldit   ! surface temperature at previous iteration 
    118       REAL(wp), DIMENSION(kiut) ::   zh_i        ! ice layer thickness 
    119       REAL(wp), DIMENSION(kiut) ::   zh_s        ! snow layer thickness 
    120       REAL(wp), DIMENSION(kiut) ::   zfsw        ! solar radiation absorbed at the surface 
    121       REAL(wp), DIMENSION(kiut) ::   zf          ! surface flux function 
    122       REAL(wp), DIMENSION(kiut) ::   dzf         ! derivative of the surface flux function 
    123       REAL(wp), DIMENSION(kiut) ::   zerrit      ! current error on temperature 
    124       REAL(wp), DIMENSION(kiut) ::   zdifcase    ! case of the equation resolution (1->4) 
    125       REAL(wp), DIMENSION(kiut) ::   zftrice     ! solar radiation transmitted through the ice 
    126       REAL(wp), DIMENSION(kiut) ::   zihic, zhsu 
    127       REAL(wp), DIMENSION(kiut,0:nlay_i) ::   ztcond_i    ! Ice thermal conductivity 
    128       REAL(wp), DIMENSION(kiut,0:nlay_i) ::   zradtr_i    ! Radiation transmitted through the ice 
    129       REAL(wp), DIMENSION(kiut,0:nlay_i) ::   zradab_i    ! Radiation absorbed in the ice 
    130       REAL(wp), DIMENSION(kiut,0:nlay_i) ::   zkappa_i    ! Kappa factor in the ice 
    131       REAL(wp), DIMENSION(kiut,0:nlay_i) ::   ztiold      ! Old temperature in the ice 
    132       REAL(wp), DIMENSION(kiut,0:nlay_i) ::   zeta_i      ! Eta factor in the ice 
    133       REAL(wp), DIMENSION(kiut,0:nlay_i) ::   ztitemp     ! Temporary temperature in the ice to check the convergence 
    134       REAL(wp), DIMENSION(kiut,0:nlay_i) ::   zspeche_i   ! Ice specific heat 
    135       REAL(wp), DIMENSION(kiut,0:nlay_i) ::   z_i         ! Vertical cotes of the layers in the ice 
    136       REAL(wp), DIMENSION(kiut,0:nlay_s) ::   zradtr_s    ! Radiation transmited through the snow 
    137       REAL(wp), DIMENSION(kiut,0:nlay_s) ::   zradab_s    ! Radiation absorbed in the snow 
    138       REAL(wp), DIMENSION(kiut,0:nlay_s) ::   zkappa_s    ! Kappa factor in the snow 
    139       REAL(wp), DIMENSION(kiut,0:nlay_s) ::   zeta_s       ! Eta factor in the snow 
    140       REAL(wp), DIMENSION(kiut,0:nlay_s) ::   ztstemp      ! Temporary temperature in the snow to check the convergence 
    141       REAL(wp), DIMENSION(kiut,0:nlay_s) ::   ztsold       ! Temporary temperature in the snow 
    142       REAL(wp), DIMENSION(kiut,0:nlay_s) ::   z_s          ! Vertical cotes of the layers in the snow 
    143       REAL(wp), DIMENSION(kiut,jkmax+2) ::   zindterm   ! Independent term 
    144       REAL(wp), DIMENSION(kiut,jkmax+2) ::   zindtbis   ! temporary independent term 
    145       REAL(wp), DIMENSION(kiut,jkmax+2) ::   zdiagbis 
    146       REAL(wp), DIMENSION(kiut,jkmax+2,3) ::   ztrid   ! tridiagonal system terms 
     114      REAL(wp) ::   zhsu 
     115       
     116      REAL(wp), POINTER, DIMENSION(:)     ::   isnow       ! switch for presence (1) or absence (0) of snow 
     117      REAL(wp), POINTER, DIMENSION(:)     ::   ztsub       ! old surface temperature (before the iterative procedure ) 
     118      REAL(wp), POINTER, DIMENSION(:)     ::   ztsubit     ! surface temperature at previous iteration 
     119      REAL(wp), POINTER, DIMENSION(:)     ::   zh_i        ! ice layer thickness 
     120      REAL(wp), POINTER, DIMENSION(:)     ::   zh_s        ! snow layer thickness 
     121      REAL(wp), POINTER, DIMENSION(:)     ::   zfsw        ! solar radiation absorbed at the surface 
     122      REAL(wp), POINTER, DIMENSION(:)     ::   zqns_ice_b  ! solar radiation absorbed at the surface 
     123      REAL(wp), POINTER, DIMENSION(:)     ::   zf          ! surface flux function 
     124      REAL(wp), POINTER, DIMENSION(:)     ::   dzf         ! derivative of the surface flux function 
     125      REAL(wp), POINTER, DIMENSION(:)     ::   zerrit      ! current error on temperature 
     126      REAL(wp), POINTER, DIMENSION(:)     ::   zdifcase    ! case of the equation resolution (1->4) 
     127      REAL(wp), POINTER, DIMENSION(:)     ::   zftrice     ! solar radiation transmitted through the ice 
     128      REAL(wp), POINTER, DIMENSION(:)     ::   zihic 
     129       
     130      REAL(wp), POINTER, DIMENSION(:,:)   ::   ztcond_i    ! Ice thermal conductivity 
     131      REAL(wp), POINTER, DIMENSION(:,:)   ::   zradtr_i    ! Radiation transmitted through the ice 
     132      REAL(wp), POINTER, DIMENSION(:,:)   ::   zradab_i    ! Radiation absorbed in the ice 
     133      REAL(wp), POINTER, DIMENSION(:,:)   ::   zkappa_i    ! Kappa factor in the ice 
     134      REAL(wp), POINTER, DIMENSION(:,:)   ::   ztib        ! Old temperature in the ice 
     135      REAL(wp), POINTER, DIMENSION(:,:)   ::   zeta_i      ! Eta factor in the ice 
     136      REAL(wp), POINTER, DIMENSION(:,:)   ::   ztitemp     ! Temporary temperature in the ice to check the convergence 
     137      REAL(wp), POINTER, DIMENSION(:,:)   ::   zspeche_i   ! Ice specific heat 
     138      REAL(wp), POINTER, DIMENSION(:,:)   ::   z_i         ! Vertical cotes of the layers in the ice 
     139      REAL(wp), POINTER, DIMENSION(:,:)   ::   zradtr_s    ! Radiation transmited through the snow 
     140      REAL(wp), POINTER, DIMENSION(:,:)   ::   zradab_s    ! Radiation absorbed in the snow 
     141      REAL(wp), POINTER, DIMENSION(:,:)   ::   zkappa_s    ! Kappa factor in the snow 
     142      REAL(wp), POINTER, DIMENSION(:,:)   ::   zeta_s      ! Eta factor in the snow 
     143      REAL(wp), POINTER, DIMENSION(:,:)   ::   ztstemp     ! Temporary temperature in the snow to check the convergence 
     144      REAL(wp), POINTER, DIMENSION(:,:)   ::   ztsb        ! Temporary temperature in the snow 
     145      REAL(wp), POINTER, DIMENSION(:,:)   ::   z_s         ! Vertical cotes of the layers in the snow 
     146      REAL(wp), POINTER, DIMENSION(:,:)   ::   zindterm    ! 'Ind'ependent term 
     147      REAL(wp), POINTER, DIMENSION(:,:)   ::   zindtbis    ! Temporary 'ind'ependent term 
     148      REAL(wp), POINTER, DIMENSION(:,:)   ::   zdiagbis    ! Temporary 'dia'gonal term 
     149      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztrid       ! Tridiagonal system terms 
     150       
     151      ! diag errors on heat 
     152      REAL(wp), POINTER, DIMENSION(:)     :: zdq, zq_ini, zhfx_err 
     153       
     154      ! Mono-category 
     155      REAL(wp)                            :: zepsilon      ! determines thres. above which computation of G(h) is done 
     156      REAL(wp)                            :: zratio_s      ! dummy factor 
     157      REAL(wp)                            :: zratio_i      ! dummy factor 
     158      REAL(wp)                            :: zh_thres      ! thickness thres. for G(h) computation 
     159      REAL(wp)                            :: zhe           ! dummy factor 
     160      REAL(wp)                            :: zkimean       ! mean sea ice thermal conductivity 
     161      REAL(wp)                            :: zfac          ! dummy factor 
     162      REAL(wp)                            :: zihe          ! dummy factor 
     163      REAL(wp)                            :: zheshth       ! dummy factor 
     164       
     165      REAL(wp), POINTER, DIMENSION(:)     :: zghe          ! G(he), th. conduct enhancement factor, mono-cat 
     166       
    147167      !!------------------------------------------------------------------      
    148168      !  
     169      CALL wrk_alloc( jpij, numeqmin, numeqmax ) 
     170      CALL wrk_alloc( jpij, isnow, ztsub, ztsubit, zh_i, zh_s, zfsw ) 
     171      CALL wrk_alloc( jpij, zf, dzf, zqns_ice_b, zerrit, zdifcase, zftrice, zihic, zghe ) 
     172      CALL wrk_alloc( jpij,nlay_i+1, ztcond_i, zradtr_i, zradab_i, zkappa_i, ztib, zeta_i, ztitemp, z_i, zspeche_i, kjstart=0 ) 
     173      CALL wrk_alloc( jpij,nlay_s+1,           zradtr_s, zradab_s, zkappa_s, ztsb, zeta_s, ztstemp, z_s, kjstart=0 ) 
     174      CALL wrk_alloc( jpij,nlay_i+3, zindterm, zindtbis, zdiagbis  ) 
     175      CALL wrk_alloc( jpij,nlay_i+3,3, ztrid ) 
     176 
     177      CALL wrk_alloc( jpij, zdq, zq_ini, zhfx_err ) 
     178 
     179      ! --- diag error on heat diffusion - PART 1 --- ! 
     180      zdq(:) = 0._wp ; zq_ini(:) = 0._wp       
     181      DO ji = kideb, kiut 
     182         zq_ini(ji) = ( SUM( q_i_1d(ji,1:nlay_i) ) * ht_i_1d(ji) * r1_nlay_i +  & 
     183            &           SUM( q_s_1d(ji,1:nlay_s) ) * ht_s_1d(ji) * r1_nlay_s )  
     184      END DO 
     185 
    149186      !------------------------------------------------------------------------------! 
    150187      ! 1) Initialization                                                            ! 
    151188      !------------------------------------------------------------------------------! 
    152       ! 
    153189      DO ji = kideb , kiut 
    154          ! is there snow or not 
    155          isnow(ji)= NINT(  1._wp - MAX( 0._wp , SIGN(1._wp, - ht_s_b(ji) ) )  ) 
    156          ! surface temperature of fusion 
    157 !!gm ???  ztfs(ji) = rtt !!!???? 
    158          ztfs(ji) = REAL( isnow(ji) ) * rtt + REAL( 1 - isnow(ji) ) * rtt 
     190         isnow(ji)= 1._wp - MAX( 0._wp , SIGN(1._wp, - ht_s_1d(ji) ) )  ! is there snow or not 
    159191         ! layer thickness 
    160          zh_i(ji) = ht_i_b(ji) / REAL( nlay_i ) 
    161          zh_s(ji) = ht_s_b(ji) / REAL( nlay_s ) 
     192         zh_i(ji) = ht_i_1d(ji) * r1_nlay_i 
     193         zh_s(ji) = ht_s_1d(ji) * r1_nlay_s 
    162194      END DO 
    163195 
     
    169201      z_i(:,0) = 0._wp   ! vert. coord. of the up. lim. of the 1st ice layer 
    170202 
    171       DO layer = 1, nlay_s            ! vert. coord of the up. lim. of the layer-th snow layer 
    172          DO ji = kideb , kiut 
    173             z_s(ji,layer) = z_s(ji,layer-1) + ht_s_b(ji) / REAL( nlay_s ) 
    174          END DO 
    175       END DO 
    176  
    177       DO layer = 1, nlay_i            ! vert. coord of the up. lim. of the layer-th ice layer 
    178          DO ji = kideb , kiut 
    179             z_i(ji,layer) = z_i(ji,layer-1) + ht_i_b(ji) / REAL( nlay_i ) 
     203      DO jk = 1, nlay_s            ! vert. coord of the up. lim. of the layer-th snow layer 
     204         DO ji = kideb , kiut 
     205            z_s(ji,jk) = z_s(ji,jk-1) + ht_s_1d(ji) * r1_nlay_s 
     206         END DO 
     207      END DO 
     208 
     209      DO jk = 1, nlay_i            ! vert. coord of the up. lim. of the layer-th ice layer 
     210         DO ji = kideb , kiut 
     211            z_i(ji,jk) = z_i(ji,jk-1) + ht_i_1d(ji) * r1_nlay_i 
    180212         END DO 
    181213      END DO 
    182214      ! 
    183215      !------------------------------------------------------------------------------| 
    184       ! 2) Radiations                                                                | 
     216      ! 2) Radiation                                                       | 
    185217      !------------------------------------------------------------------------------| 
    186218      ! 
     
    194226      ! zfsw    = (1-i0).qsr_ice   is absorbed at the surface  
    195227      ! zftrice = io.qsr_ice       is below the surface  
    196       ! fstbif  = io.qsr_ice.exp(-k(h_i)) transmitted below the ice  
    197  
     228      ! ftr_ice = io.qsr_ice.exp(-k(h_i)) transmitted below the ice  
     229      ! fr1_i0_1d = i0 for a thin ice cover, fr1_i0_2d = i0 for a thick ice cover 
     230      zhsu = 0.1_wp ! threshold for the computation of i0 
    198231      DO ji = kideb , kiut 
    199232         ! switches 
    200          isnow(ji) = NINT(  1._wp - MAX( 0._wp , SIGN( 1._wp , - ht_s_b(ji) ) ) )  
     233         isnow(ji) = 1._wp - MAX( 0._wp , SIGN( 1._wp , - ht_s_1d(ji) ) )  
    201234         ! hs > 0, isnow = 1 
    202          zhsu (ji) = hnzst  ! threshold for the computation of i0 
    203          zihic(ji) = MAX( 0._wp , 1._wp - ( ht_i_b(ji) / zhsu(ji) ) )      
    204  
    205          i0(ji)    = REAL( 1 - isnow(ji) ) * ( fr1_i0_1d(ji) + zihic(ji) * fr2_i0_1d(ji) ) 
    206          !fr1_i0_1d = i0 for a thin ice surface 
    207          !fr1_i0_2d = i0 for a thick ice surface 
    208          !            a function of the cloud cover 
    209          ! 
    210          !i0(ji)     =  (1.0-FLOAT(isnow(ji)))*3.0/(100*ht_s_b(ji)+10.0) 
    211          !formula used in Cice 
     235         zihic(ji) = MAX( 0._wp , 1._wp - ( ht_i_1d(ji) / zhsu ) )      
     236 
     237         i0(ji)    = ( 1._wp - isnow(ji) ) * ( fr1_i0_1d(ji) + zihic(ji) * fr2_i0_1d(ji) ) 
    212238      END DO 
    213239 
     
    217243      !------------------------------------------------------- 
    218244      DO ji = kideb , kiut 
    219          zfsw   (ji) =  qsr_ice_1d(ji) * ( 1 - i0(ji) )   ! Shortwave radiation absorbed at surface 
    220          zftrice(ji) =  qsr_ice_1d(ji) *       i0(ji)     ! Solar radiation transmitted below the surface layer 
    221          dzf    (ji) = dqns_ice_1d(ji)                    ! derivative of incoming nonsolar flux  
     245         zfsw   (ji)    =  qsr_ice_1d(ji) * ( 1 - i0(ji) )   ! Shortwave radiation absorbed at surface 
     246         zftrice(ji)    =  qsr_ice_1d(ji) *       i0(ji)     ! Solar radiation transmitted below the surface layer 
     247         dzf    (ji)    = dqns_ice_1d(ji)                    ! derivative of incoming nonsolar flux  
     248         zqns_ice_b(ji) = qns_ice_1d(ji)                     ! store previous qns_ice_1d value 
    222249      END DO 
    223250 
     
    230257      END DO 
    231258 
    232       DO layer = 1, nlay_s          ! Radiation through snow 
     259      DO jk = 1, nlay_s          ! Radiation through snow 
    233260         DO ji = kideb, kiut 
    234261            !                             ! radiation transmitted below the layer-th snow layer 
    235             zradtr_s(ji,layer) = zradtr_s(ji,0) * EXP( - zraext_s * ( MAX ( 0._wp , z_s(ji,layer) ) ) ) 
     262            zradtr_s(ji,jk) = zradtr_s(ji,0) * EXP( - zraext_s * ( MAX ( 0._wp , z_s(ji,jk) ) ) ) 
    236263            !                             ! radiation absorbed by the layer-th snow layer 
    237             zradab_s(ji,layer) = zradtr_s(ji,layer-1) - zradtr_s(ji,layer) 
     264            zradab_s(ji,jk) = zradtr_s(ji,jk-1) - zradtr_s(ji,jk) 
    238265         END DO 
    239266      END DO 
    240267 
    241268      DO ji = kideb, kiut           ! ice initialization 
    242          zradtr_i(ji,0) = zradtr_s(ji,nlay_s) * REAL( isnow(ji) ) + zftrice(ji) * REAL( 1 - isnow(ji) ) 
    243       END DO 
    244  
    245       DO layer = 1, nlay_i          ! Radiation through ice 
     269         zradtr_i(ji,0) = zradtr_s(ji,nlay_s) * isnow(ji) + zftrice(ji) * ( 1._wp - isnow(ji) ) 
     270      END DO 
     271 
     272      DO jk = 1, nlay_i          ! Radiation through ice 
    246273         DO ji = kideb, kiut 
    247274            !                             ! radiation transmitted below the layer-th ice layer 
    248             zradtr_i(ji,layer) = zradtr_i(ji,0) * EXP( - kappa_i * ( MAX ( 0._wp , z_i(ji,layer) ) ) ) 
     275            zradtr_i(ji,jk) = zradtr_i(ji,0) * EXP( - rn_kappa_i * ( MAX ( 0._wp , z_i(ji,jk) ) ) ) 
    249276            !                             ! radiation absorbed by the layer-th ice layer 
    250             zradab_i(ji,layer) = zradtr_i(ji,layer-1) - zradtr_i(ji,layer) 
     277            zradab_i(ji,jk) = zradtr_i(ji,jk-1) - zradtr_i(ji,jk) 
    251278         END DO 
    252279      END DO 
    253280 
    254281      DO ji = kideb, kiut           ! Radiation transmitted below the ice 
    255          fstbif_1d(ji) = fstbif_1d(ji) + iatte_1d(ji) * zradtr_i(ji,nlay_i) * a_i_b(ji) / at_i_b(ji) ! clem modif 
    256       END DO 
    257  
    258       ! +++++ 
    259       ! just to check energy conservation 
    260       DO ji = kideb, kiut 
    261          ii = MOD( npb(ji) - 1 , jpi ) + 1 
    262          ij =    ( npb(ji) - 1 ) / jpi + 1 
    263          fstroc(ii,ij,jl) = iatte_1d(ji) * zradtr_i(ji,nlay_i) ! clem modif 
    264       END DO 
    265       ! +++++ 
    266  
    267       DO layer = 1, nlay_i 
    268          DO ji = kideb, kiut 
    269             radab(ji,layer) = zradab_i(ji,layer) 
    270          END DO 
     282         ftr_ice_1d(ji) = zradtr_i(ji,nlay_i)  
    271283      END DO 
    272284 
     
    277289      ! 
    278290      DO ji = kideb, kiut        ! Old surface temperature 
    279          ztsuold  (ji) =  t_su_b(ji)                              ! temperature at the beg of iter pr. 
    280          ztsuoldit(ji) =  t_su_b(ji)                              ! temperature at the previous iter 
    281          t_su_b   (ji) =  MIN( t_su_b(ji), ztfs(ji)-0.00001 )     ! necessary 
    282          zerrit   (ji) =  1000._wp                                ! initial value of error 
    283       END DO 
    284  
    285       DO layer = 1, nlay_s       ! Old snow temperature 
    286          DO ji = kideb , kiut 
    287             ztsold(ji,layer) =  t_s_b(ji,layer) 
    288          END DO 
    289       END DO 
    290  
    291       DO layer = 1, nlay_i       ! Old ice temperature 
    292          DO ji = kideb , kiut 
    293             ztiold(ji,layer) =  t_i_b(ji,layer) 
     291         ztsub  (ji) =  t_su_1d(ji)                              ! temperature at the beg of iter pr. 
     292         ztsubit(ji) =  t_su_1d(ji)                              ! temperature at the previous iter 
     293         t_su_1d(ji) =  MIN( t_su_1d(ji), rt0 - ztsu_err )       ! necessary 
     294         zerrit (ji) =  1000._wp                                 ! initial value of error 
     295      END DO 
     296 
     297      DO jk = 1, nlay_s       ! Old snow temperature 
     298         DO ji = kideb , kiut 
     299            ztsb(ji,jk) =  t_s_1d(ji,jk) 
     300         END DO 
     301      END DO 
     302 
     303      DO jk = 1, nlay_i       ! Old ice temperature 
     304         DO ji = kideb , kiut 
     305            ztib(ji,jk) =  t_i_1d(ji,jk) 
    294306         END DO 
    295307      END DO 
     
    298310      zerritmax =  1000._wp    ! maximal value of error on all points 
    299311 
    300       DO WHILE ( zerritmax > maxer_i_thd .AND. nconv < nconv_i_thd ) 
     312      DO WHILE ( zerritmax > rn_terr_dif .AND. nconv < nn_conv_dif ) 
    301313         ! 
    302314         nconv = nconv + 1 
     
    306318         !------------------------------------------------------------------------------| 
    307319         ! 
    308          IF( thcon_i_swi == 0 ) THEN      ! Untersteiner (1964) formula 
    309             DO ji = kideb , kiut 
    310                ztcond_i(ji,0)        = rcdic + zbeta*s_i_b(ji,1) / MIN(-epsi10,t_i_b(ji,1)-rtt) 
    311                ztcond_i(ji,0)        = MAX(ztcond_i(ji,0),zkimin) 
    312             END DO 
    313             DO layer = 1, nlay_i-1 
     320         IF( nn_ice_thcon == 0 ) THEN      ! Untersteiner (1964) formula 
     321            DO ji = kideb , kiut 
     322               ztcond_i(ji,0) = rcdic + zbeta * s_i_1d(ji,1) / MIN( -epsi10, t_i_1d(ji,1) - rt0 ) 
     323               ztcond_i(ji,0) = MAX( ztcond_i(ji,0), zkimin ) 
     324            END DO 
     325            DO jk = 1, nlay_i-1 
    314326               DO ji = kideb , kiut 
    315                   ztcond_i(ji,layer) = rcdic + zbeta*( s_i_b(ji,layer) + s_i_b(ji,layer+1) ) /  & 
    316                      MIN(-2.0_wp * epsi10, t_i_b(ji,layer)+t_i_b(ji,layer+1) - 2.0_wp * rtt) 
    317                   ztcond_i(ji,layer) = MAX(ztcond_i(ji,layer),zkimin) 
     327                  ztcond_i(ji,jk) = rcdic + zbeta * ( s_i_1d(ji,jk) + s_i_1d(ji,jk+1) ) /  & 
     328                     MIN(-2.0_wp * epsi10, t_i_1d(ji,jk) + t_i_1d(ji,jk+1) - 2.0_wp * rt0) 
     329                  ztcond_i(ji,jk) = MAX( ztcond_i(ji,jk), zkimin ) 
    318330               END DO 
    319331            END DO 
    320332         ENDIF 
    321333 
    322          IF( thcon_i_swi == 1 ) THEN      ! Pringle et al formula included: 2.11 + 0.09 S/T - 0.011.T 
    323             DO ji = kideb , kiut 
    324                ztcond_i(ji,0) = rcdic + 0.090_wp * s_i_b(ji,1) / MIN( -epsi10, t_i_b(ji,1)-rtt )   & 
    325                   &                   - 0.011_wp * ( t_i_b(ji,1) - rtt 
     334         IF( nn_ice_thcon == 1 ) THEN      ! Pringle et al formula included: 2.11 + 0.09 S/T - 0.011.T 
     335            DO ji = kideb , kiut 
     336               ztcond_i(ji,0) = rcdic + 0.090_wp * s_i_1d(ji,1) / MIN( -epsi10, t_i_1d(ji,1) - rt0 )   & 
     337                  &                   - 0.011_wp * ( t_i_1d(ji,1) - rt0 
    326338               ztcond_i(ji,0) = MAX( ztcond_i(ji,0), zkimin ) 
    327339            END DO 
    328             DO layer = 1, nlay_i-1 
     340            DO jk = 1, nlay_i-1 
    329341               DO ji = kideb , kiut 
    330                   ztcond_i(ji,layer) = rcdic + 0.090_wp * ( s_i_b(ji,layer) + s_i_b(ji,layer+1) )   & 
    331                      &                                  / MIN(-2.0_wp * epsi10, t_i_b(ji,layer)+t_i_b(ji,layer+1) - 2.0_wp * rtt)   & 
    332                      &                       - 0.0055_wp* ( t_i_b(ji,layer) + t_i_b(ji,layer+1) - 2.0*rtt )   
    333                   ztcond_i(ji,layer) = MAX( ztcond_i(ji,layer), zkimin ) 
     342                  ztcond_i(ji,jk) = rcdic +                                                                       &  
     343                     &                 0.09_wp * ( s_i_1d(ji,jk) + s_i_1d(ji,jk+1) )                              & 
     344                     &                 / MIN( -2._wp * epsi10, t_i_1d(ji,jk) + t_i_1d(ji,jk+1) - 2.0_wp * rt0 )   & 
     345                     &               - 0.0055_wp * ( t_i_1d(ji,jk) + t_i_1d(ji,jk+1) - 2.0 * rt0 )   
     346                  ztcond_i(ji,jk) = MAX( ztcond_i(ji,jk), zkimin ) 
    334347               END DO 
    335348            END DO 
    336349            DO ji = kideb , kiut 
    337                ztcond_i(ji,nlay_i) = rcdic + 0.090_wp * s_i_b(ji,nlay_i) / MIN(-epsi10,t_bo_b(ji)-rtt)   & 
    338                   &                        - 0.011_wp * ( t_bo_b(ji) - rtt 
     350               ztcond_i(ji,nlay_i) = rcdic + 0.090_wp * s_i_1d(ji,nlay_i) / MIN( -epsi10, t_bo_1d(ji) - rt0 )   & 
     351                  &                        - 0.011_wp * ( t_bo_1d(ji) - rt0 
    339352               ztcond_i(ji,nlay_i) = MAX( ztcond_i(ji,nlay_i), zkimin ) 
    340353            END DO 
    341354         ENDIF 
    342          ! 
    343          !------------------------------------------------------------------------------| 
    344          !  5) kappa factors                                                            | 
    345          !------------------------------------------------------------------------------| 
    346          ! 
     355          
     356         ! 
     357         !------------------------------------------------------------------------------| 
     358         !  5) G(he) - enhancement of thermal conductivity in mono-category case        | 
     359         !------------------------------------------------------------------------------| 
     360         ! 
     361         ! Computation of effective thermal conductivity G(h) 
     362         ! Used in mono-category case only to simulate an ITD implicitly 
     363         ! Fichefet and Morales Maqueda, JGR 1997 
     364 
     365         zghe(:) = 1._wp 
     366 
     367         SELECT CASE ( nn_monocat ) 
     368 
     369         CASE (1,3) ! LIM3 
     370 
     371            zepsilon = 0.1_wp 
     372            zh_thres = EXP( 1._wp ) * zepsilon * 0.5_wp 
     373 
     374            DO ji = kideb, kiut 
     375    
     376               ! Mean sea ice thermal conductivity 
     377               zkimean  = SUM( ztcond_i(ji,0:nlay_i) ) / REAL( nlay_i+1, wp ) 
     378 
     379               ! Effective thickness he (zhe) 
     380               zfac     = 1._wp / ( rcdsn + zkimean ) 
     381               zratio_s = rcdsn   * zfac 
     382               zratio_i = zkimean * zfac 
     383               zhe      = zratio_s * ht_i_1d(ji) + zratio_i * ht_s_1d(ji) 
     384 
     385               ! G(he) 
     386               rswitch  = MAX( 0._wp , SIGN( 1._wp , zhe - zh_thres ) )  ! =0 if zhe < zh_thres, if > 
     387               zghe(ji) = ( 1._wp - rswitch ) + rswitch * 0.5_wp * ( 1._wp + LOG( 2._wp * zhe / zepsilon ) ) 
     388    
     389               ! Impose G(he) < 2. 
     390               zghe(ji) = MIN( zghe(ji), 2._wp ) 
     391 
     392            END DO 
     393 
     394         END SELECT 
     395 
     396         ! 
     397         !------------------------------------------------------------------------------| 
     398         !  6) kappa factors                                                            | 
     399         !------------------------------------------------------------------------------| 
     400         ! 
     401         !--- Snow 
    347402         DO ji = kideb, kiut 
    348  
    349             !-- Snow kappa factors 
    350             zkappa_s(ji,0)         = rcdsn / MAX(epsi10,zh_s(ji)) 
    351             zkappa_s(ji,nlay_s)    = rcdsn / MAX(epsi10,zh_s(ji)) 
    352          END DO 
    353  
    354          DO layer = 1, nlay_s-1 
    355             DO ji = kideb , kiut 
    356                zkappa_s(ji,layer)  = 2.0 * rcdsn / & 
    357                   MAX(epsi10,2.0*zh_s(ji)) 
    358             END DO 
    359          END DO 
    360  
    361          DO layer = 1, nlay_i-1 
    362             DO ji = kideb , kiut 
    363                !-- Ice kappa factors 
    364                zkappa_i(ji,layer)  = 2.0*ztcond_i(ji,layer)/ & 
    365                   MAX(epsi10,2.0*zh_i(ji))  
    366             END DO 
    367          END DO 
    368  
    369          DO ji = kideb , kiut 
    370             zkappa_i(ji,0)        = ztcond_i(ji,0)/MAX(epsi10,zh_i(ji)) 
    371             zkappa_i(ji,nlay_i)   = ztcond_i(ji,nlay_i) / MAX(epsi10,zh_i(ji)) 
    372             !-- Interface 
    373             zkappa_s(ji,nlay_s)   = 2.0*rcdsn*ztcond_i(ji,0)/MAX(epsi10, & 
    374                (ztcond_i(ji,0)*zh_s(ji) + rcdsn*zh_i(ji))) 
    375             zkappa_i(ji,0)        = zkappa_s(ji,nlay_s)*REAL( isnow(ji) ) & 
    376                + zkappa_i(ji,0)*REAL( 1 - isnow(ji) ) 
    377          END DO 
    378          ! 
    379          !------------------------------------------------------------------------------| 
    380          ! 6) Sea ice specific heat, eta factors                                        | 
    381          !------------------------------------------------------------------------------| 
    382          ! 
    383          DO layer = 1, nlay_i 
    384             DO ji = kideb , kiut 
    385                ztitemp(ji,layer)   = t_i_b(ji,layer) 
    386                zspeche_i(ji,layer) = cpic + zgamma*s_i_b(ji,layer)/ & 
    387                   MAX((t_i_b(ji,layer)-rtt)*(ztiold(ji,layer)-rtt),epsi10) 
    388                zeta_i(ji,layer)    = rdt_ice / MAX(rhoic*zspeche_i(ji,layer)*zh_i(ji), & 
    389                   epsi10) 
    390             END DO 
    391          END DO 
    392  
    393          DO layer = 1, nlay_s 
    394             DO ji = kideb , kiut 
    395                ztstemp(ji,layer) = t_s_b(ji,layer) 
    396                zeta_s(ji,layer)  = rdt_ice / MAX(rhosn*cpic*zh_s(ji),epsi10) 
    397             END DO 
    398          END DO 
    399          ! 
    400          !------------------------------------------------------------------------------| 
    401          ! 7) surface flux computation                                                  | 
    402          !------------------------------------------------------------------------------| 
    403          ! 
    404          DO ji = kideb , kiut 
    405  
    406             ! update of the non solar flux according to the update in T_su 
    407             qnsr_ice_1d(ji) = qnsr_ice_1d(ji) + dqns_ice_1d(ji) * &  
    408                ( t_su_b(ji) - ztsuoldit(ji) ) 
    409  
     403            zfac                  =  1. / MAX( epsi10 , zh_s(ji) ) 
     404            zkappa_s(ji,0)        = zghe(ji) * rcdsn * zfac 
     405            zkappa_s(ji,nlay_s)   = zghe(ji) * rcdsn * zfac 
     406         END DO 
     407 
     408         DO jk = 1, nlay_s-1 
     409            DO ji = kideb , kiut 
     410               zkappa_s(ji,jk)    = zghe(ji) * 2.0 * rcdsn / MAX( epsi10, 2.0 * zh_s(ji) ) 
     411            END DO 
     412         END DO 
     413 
     414         !--- Ice 
     415         DO jk = 1, nlay_i-1 
     416            DO ji = kideb , kiut 
     417               zkappa_i(ji,jk)    = zghe(ji) * 2.0 * ztcond_i(ji,jk) / MAX( epsi10 , 2.0 * zh_i(ji) ) 
     418            END DO 
     419         END DO 
     420 
     421         !--- Snow-ice interface 
     422         DO ji = kideb , kiut 
     423            zfac                  = 1./ MAX( epsi10 , zh_i(ji) ) 
     424            zkappa_i(ji,0)        = zghe(ji) * ztcond_i(ji,0) * zfac 
     425            zkappa_i(ji,nlay_i)   = zghe(ji) * ztcond_i(ji,nlay_i) * zfac 
     426            zkappa_s(ji,nlay_s)   = zghe(ji) * zghe(ji) * 2.0 * rcdsn * ztcond_i(ji,0) / &  
     427           &                        MAX( epsi10, ( zghe(ji) * ztcond_i(ji,0) * zh_s(ji) + zghe(ji) * rcdsn * zh_i(ji) ) ) 
     428            zkappa_i(ji,0)        = zkappa_s(ji,nlay_s) * isnow(ji) + zkappa_i(ji,0) * ( 1._wp - isnow(ji) ) 
     429         END DO 
     430 
     431         ! 
     432         !------------------------------------------------------------------------------| 
     433         ! 7) Sea ice specific heat, eta factors                                        | 
     434         !------------------------------------------------------------------------------| 
     435         ! 
     436         DO jk = 1, nlay_i 
     437            DO ji = kideb , kiut 
     438               ztitemp(ji,jk)   = t_i_1d(ji,jk) 
     439               zspeche_i(ji,jk) = cpic + zgamma * s_i_1d(ji,jk) / MAX( ( t_i_1d(ji,jk) - rt0 ) * ( ztib(ji,jk) - rt0 ), epsi10 ) 
     440               zeta_i(ji,jk)    = rdt_ice / MAX( rhoic * zspeche_i(ji,jk) * zh_i(ji), epsi10 ) 
     441            END DO 
     442         END DO 
     443 
     444         DO jk = 1, nlay_s 
     445            DO ji = kideb , kiut 
     446               ztstemp(ji,jk) = t_s_1d(ji,jk) 
     447               zeta_s(ji,jk)  = rdt_ice / MAX( rhosn * cpic * zh_s(ji), epsi10 ) 
     448            END DO 
     449         END DO 
     450 
     451         ! 
     452         !------------------------------------------------------------------------------| 
     453         ! 8) surface flux computation                                                  | 
     454         !------------------------------------------------------------------------------| 
     455         ! 
     456         IF ( ln_it_qnsice ) THEN  
     457            DO ji = kideb , kiut 
     458               ! update of the non solar flux according to the update in T_su 
     459               qns_ice_1d(ji) = qns_ice_1d(ji) + dqns_ice_1d(ji) * ( t_su_1d(ji) - ztsubit(ji) ) 
     460            END DO 
     461         ENDIF 
     462 
     463         ! Update incoming flux 
     464         DO ji = kideb , kiut 
    410465            ! update incoming flux 
    411             zf(ji)    =   zfsw(ji)              & ! net absorbed solar radiation 
    412                + qnsr_ice_1d(ji)           ! non solar total flux  
    413             ! (LWup, LWdw, SH, LH) 
    414  
    415          END DO 
    416  
    417          ! 
    418          !------------------------------------------------------------------------------| 
    419          ! 8) tridiagonal system terms                                                  | 
     466            zf(ji)    =          zfsw(ji)              & ! net absorbed solar radiation 
     467               &         + qns_ice_1d(ji)                ! non solar total flux (LWup, LWdw, SH, LH) 
     468         END DO 
     469 
     470         ! 
     471         !------------------------------------------------------------------------------| 
     472         ! 9) tridiagonal system terms                                                  | 
    420473         !------------------------------------------------------------------------------| 
    421474         ! 
     
    427480         !!ice interior terms (top equation has the same form as the others) 
    428481 
    429          DO numeq=1,jkmax+2 
     482         DO numeq=1,nlay_i+3 
    430483            DO ji = kideb , kiut 
    431484               ztrid(ji,numeq,1) = 0. 
     
    440493         DO numeq = nlay_s + 2, nlay_s + nlay_i  
    441494            DO ji = kideb , kiut 
    442                layer              = numeq - nlay_s - 1 
    443                ztrid(ji,numeq,1)  =  - zeta_i(ji,layer)*zkappa_i(ji,layer-1) 
    444                ztrid(ji,numeq,2)  =  1.0 + zeta_i(ji,layer)*(zkappa_i(ji,layer-1) + & 
    445                   zkappa_i(ji,layer)) 
    446                ztrid(ji,numeq,3)  =  - zeta_i(ji,layer)*zkappa_i(ji,layer) 
    447                zindterm(ji,numeq) =  ztiold(ji,layer) + zeta_i(ji,layer)* & 
    448                   zradab_i(ji,layer) 
     495               jk                 = numeq - nlay_s - 1 
     496               ztrid(ji,numeq,1)  =  - zeta_i(ji,jk) * zkappa_i(ji,jk-1) 
     497               ztrid(ji,numeq,2)  =  1.0 + zeta_i(ji,jk) * ( zkappa_i(ji,jk-1) + zkappa_i(ji,jk) ) 
     498               ztrid(ji,numeq,3)  =  - zeta_i(ji,jk) * zkappa_i(ji,jk) 
     499               zindterm(ji,numeq) =  ztib(ji,jk) + zeta_i(ji,jk) * zradab_i(ji,jk) 
    449500            END DO 
    450501         ENDDO 
     
    454505            !!ice bottom term 
    455506            ztrid(ji,numeq,1)  =  - zeta_i(ji,nlay_i)*zkappa_i(ji,nlay_i-1)    
    456             ztrid(ji,numeq,2)  =  1.0 + zeta_i(ji,nlay_i)*( zkappa_i(ji,nlay_i)*zg1 & 
    457                +  zkappa_i(ji,nlay_i-1) ) 
     507            ztrid(ji,numeq,2)  =  1.0 + zeta_i(ji,nlay_i) * ( zkappa_i(ji,nlay_i) * zg1 + zkappa_i(ji,nlay_i-1) ) 
    458508            ztrid(ji,numeq,3)  =  0.0 
    459             zindterm(ji,numeq) =  ztiold(ji,nlay_i) + zeta_i(ji,nlay_i)* & 
    460                ( zradab_i(ji,nlay_i) + zkappa_i(ji,nlay_i)*zg1 & 
    461                *  t_bo_b(ji) )  
     509            zindterm(ji,numeq) =  ztib(ji,nlay_i) + zeta_i(ji,nlay_i) *  & 
     510               &                  ( zradab_i(ji,nlay_i) + zkappa_i(ji,nlay_i) * zg1 *  t_bo_1d(ji) )  
    462511         ENDDO 
    463512 
    464513 
    465514         DO ji = kideb , kiut 
    466             IF ( ht_s_b(ji).gt.0.0 ) THEN 
     515            IF ( ht_s_1d(ji) > 0.0 ) THEN 
    467516               ! 
    468517               !------------------------------------------------------------------------------| 
     
    472521               !!snow interior terms (bottom equation has the same form as the others) 
    473522               DO numeq = 3, nlay_s + 1 
    474                   layer =  numeq - 1 
    475                   ztrid(ji,numeq,1)   =  - zeta_s(ji,layer)*zkappa_s(ji,layer-1) 
    476                   ztrid(ji,numeq,2)   =  1.0 + zeta_s(ji,layer)*( zkappa_s(ji,layer-1) + & 
    477                      zkappa_s(ji,layer) ) 
    478                   ztrid(ji,numeq,3)   =  - zeta_s(ji,layer)*zkappa_s(ji,layer) 
    479                   zindterm(ji,numeq)  =  ztsold(ji,layer) + zeta_s(ji,layer)* & 
    480                      zradab_s(ji,layer) 
     523                  jk                  =  numeq - 1 
     524                  ztrid(ji,numeq,1)   =  - zeta_s(ji,jk) * zkappa_s(ji,jk-1) 
     525                  ztrid(ji,numeq,2)   =  1.0 + zeta_s(ji,jk) * ( zkappa_s(ji,jk-1) + zkappa_s(ji,jk) ) 
     526                  ztrid(ji,numeq,3)   =  - zeta_s(ji,jk)*zkappa_s(ji,jk) 
     527                  zindterm(ji,numeq)  =  ztsb(ji,jk) + zeta_s(ji,jk) * zradab_s(ji,jk) 
    481528               END DO 
    482529 
     
    484531               IF ( nlay_i.eq.1 ) THEN 
    485532                  ztrid(ji,nlay_s+2,3)    =  0.0 
    486                   zindterm(ji,nlay_s+2)   =  zindterm(ji,nlay_s+2) + zkappa_i(ji,1)* & 
    487                      t_bo_b(ji)  
     533                  zindterm(ji,nlay_s+2)   =  zindterm(ji,nlay_s+2) + zkappa_i(ji,1) * t_bo_1d(ji)  
    488534               ENDIF 
    489535 
    490                IF ( t_su_b(ji) .LT. rtt ) THEN 
     536               IF ( t_su_1d(ji) < rt0 ) THEN 
    491537 
    492538                  !------------------------------------------------------------------------------| 
     
    498544 
    499545                  !!surface equation 
    500                   ztrid(ji,1,1) = 0.0 
    501                   ztrid(ji,1,2) = dzf(ji) - zg1s*zkappa_s(ji,0) 
    502                   ztrid(ji,1,3) = zg1s*zkappa_s(ji,0) 
    503                   zindterm(ji,1) = dzf(ji)*t_su_b(ji)  - zf(ji) 
     546                  ztrid(ji,1,1)  = 0.0 
     547                  ztrid(ji,1,2)  = dzf(ji) - zg1s * zkappa_s(ji,0) 
     548                  ztrid(ji,1,3)  = zg1s * zkappa_s(ji,0) 
     549                  zindterm(ji,1) = dzf(ji) * t_su_1d(ji) - zf(ji) 
    504550 
    505551                  !!first layer of snow equation 
    506                   ztrid(ji,2,1)  =  - zkappa_s(ji,0)*zg1s*zeta_s(ji,1) 
    507                   ztrid(ji,2,2)  =  1.0 + zeta_s(ji,1)*(zkappa_s(ji,1) + zkappa_s(ji,0)*zg1s) 
     552                  ztrid(ji,2,1)  =  - zkappa_s(ji,0) * zg1s * zeta_s(ji,1) 
     553                  ztrid(ji,2,2)  =  1.0 + zeta_s(ji,1) * ( zkappa_s(ji,1) + zkappa_s(ji,0) * zg1s ) 
    508554                  ztrid(ji,2,3)  =  - zeta_s(ji,1)* zkappa_s(ji,1) 
    509                   zindterm(ji,2) =  ztsold(ji,1) + zeta_s(ji,1)*zradab_s(ji,1) 
     555                  zindterm(ji,2) =  ztsb(ji,1) + zeta_s(ji,1) * zradab_s(ji,1) 
    510556 
    511557               ELSE  
     
    521567                  !!first layer of snow equation 
    522568                  ztrid(ji,2,1)  =  0.0 
    523                   ztrid(ji,2,2)  =  1.0 + zeta_s(ji,1) * ( zkappa_s(ji,1) + & 
    524                      zkappa_s(ji,0) * zg1s ) 
     569                  ztrid(ji,2,2)  =  1.0 + zeta_s(ji,1) * ( zkappa_s(ji,1) + zkappa_s(ji,0) * zg1s ) 
    525570                  ztrid(ji,2,3)  =  - zeta_s(ji,1)*zkappa_s(ji,1)  
    526                   zindterm(ji,2) = ztsold(ji,1) + zeta_s(ji,1) *            & 
    527                      ( zradab_s(ji,1) +                         & 
    528                      zkappa_s(ji,0) * zg1s * t_su_b(ji) )  
     571                  zindterm(ji,2) = ztsb(ji,1) + zeta_s(ji,1) *  & 
     572                     &             ( zradab_s(ji,1) + zkappa_s(ji,0) * zg1s * t_su_1d(ji) )  
    529573               ENDIF 
    530574            ELSE 
     
    534578               !------------------------------------------------------------------------------| 
    535579               ! 
    536                IF (t_su_b(ji) .LT. rtt) THEN 
     580               IF ( t_su_1d(ji) < rt0 ) THEN 
    537581                  ! 
    538582                  !------------------------------------------------------------------------------| 
     
    548592                  ztrid(ji,numeqmin(ji),2)   =  dzf(ji) - zkappa_i(ji,0)*zg1     
    549593                  ztrid(ji,numeqmin(ji),3)   =  zkappa_i(ji,0)*zg1 
    550                   zindterm(ji,numeqmin(ji))  =  dzf(ji)*t_su_b(ji) - zf(ji) 
     594                  zindterm(ji,numeqmin(ji))  =  dzf(ji)*t_su_1d(ji) - zf(ji) 
    551595 
    552596                  !!first layer of ice equation 
    553597                  ztrid(ji,numeqmin(ji)+1,1) =  - zkappa_i(ji,0) * zg1 * zeta_i(ji,1) 
    554                   ztrid(ji,numeqmin(ji)+1,2) =  1.0 + zeta_i(ji,1) * ( zkappa_i(ji,1) &  
    555                      + zkappa_i(ji,0) * zg1 ) 
    556                   ztrid(ji,numeqmin(ji)+1,3) =  - zeta_i(ji,1)*zkappa_i(ji,1)   
    557                   zindterm(ji,numeqmin(ji)+1)=  ztiold(ji,1) + zeta_i(ji,1)*zradab_i(ji,1)   
     598                  ztrid(ji,numeqmin(ji)+1,2) =  1.0 + zeta_i(ji,1) * ( zkappa_i(ji,1) + zkappa_i(ji,0) * zg1 ) 
     599                  ztrid(ji,numeqmin(ji)+1,3) =  - zeta_i(ji,1) * zkappa_i(ji,1)   
     600                  zindterm(ji,numeqmin(ji)+1)=  ztib(ji,1) + zeta_i(ji,1) * zradab_i(ji,1)   
    558601 
    559602                  !!case of only one layer in the ice (surface & ice equations are altered) 
    560603 
    561                   IF (nlay_i.eq.1) THEN 
     604                  IF ( nlay_i == 1 ) THEN 
    562605                     ztrid(ji,numeqmin(ji),1)    =  0.0 
    563                      ztrid(ji,numeqmin(ji),2)    =  dzf(ji) - zkappa_i(ji,0)*2.0 
    564                      ztrid(ji,numeqmin(ji),3)    =  zkappa_i(ji,0)*2.0 
    565                      ztrid(ji,numeqmin(ji)+1,1)  =  -zkappa_i(ji,0)*2.0*zeta_i(ji,1) 
    566                      ztrid(ji,numeqmin(ji)+1,2)  =  1.0 + zeta_i(ji,1)*(zkappa_i(ji,0)*2.0 + & 
    567                         zkappa_i(ji,1)) 
     606                     ztrid(ji,numeqmin(ji),2)    =  dzf(ji) - zkappa_i(ji,0) * 2.0 
     607                     ztrid(ji,numeqmin(ji),3)    =  zkappa_i(ji,0) * 2.0 
     608                     ztrid(ji,numeqmin(ji)+1,1)  =  -zkappa_i(ji,0) * 2.0 * zeta_i(ji,1) 
     609                     ztrid(ji,numeqmin(ji)+1,2)  =  1.0 + zeta_i(ji,1) * ( zkappa_i(ji,0) * 2.0 + zkappa_i(ji,1) ) 
    568610                     ztrid(ji,numeqmin(ji)+1,3)  =  0.0 
    569611 
    570                      zindterm(ji,numeqmin(ji)+1) =  ztiold(ji,1) + zeta_i(ji,1)* & 
    571                         ( zradab_i(ji,1) + zkappa_i(ji,1)*t_bo_b(ji) ) 
     612                     zindterm(ji,numeqmin(ji)+1) =  ztib(ji,1) + zeta_i(ji,1) * & 
     613                        &                          ( zradab_i(ji,1) + zkappa_i(ji,1) * t_bo_1d(ji) ) 
    572614                  ENDIF 
    573615 
     
    585627                  !!first layer of ice equation 
    586628                  ztrid(ji,numeqmin(ji),1)      =  0.0 
    587                   ztrid(ji,numeqmin(ji),2)      =  1.0 + zeta_i(ji,1)*(zkappa_i(ji,1) + zkappa_i(ji,0)* & 
    588                      zg1)   
     629                  ztrid(ji,numeqmin(ji),2)      =  1.0 + zeta_i(ji,1) * ( zkappa_i(ji,1) + zkappa_i(ji,0) * zg1 )   
    589630                  ztrid(ji,numeqmin(ji),3)      =  - zeta_i(ji,1) * zkappa_i(ji,1) 
    590                   zindterm(ji,numeqmin(ji))     =  ztiold(ji,1) + zeta_i(ji,1)*( zradab_i(ji,1) + & 
    591                      zkappa_i(ji,0) * zg1 * t_su_b(ji) )  
     631                  zindterm(ji,numeqmin(ji))     =  ztib(ji,1) + zeta_i(ji,1) * & 
     632                     &                             ( zradab_i(ji,1) + zkappa_i(ji,0) * zg1 * t_su_1d(ji) )  
    592633 
    593634                  !!case of only one layer in the ice (surface & ice equations are altered) 
    594                   IF (nlay_i.eq.1) THEN 
     635                  IF ( nlay_i == 1 ) THEN 
    595636                     ztrid(ji,numeqmin(ji),1)  =  0.0 
    596                      ztrid(ji,numeqmin(ji),2)  =  1.0 + zeta_i(ji,1)*(zkappa_i(ji,0)*2.0 + & 
    597                         zkappa_i(ji,1)) 
     637                     ztrid(ji,numeqmin(ji),2)  =  1.0 + zeta_i(ji,1) * ( zkappa_i(ji,0) * 2.0 + zkappa_i(ji,1) ) 
    598638                     ztrid(ji,numeqmin(ji),3)  =  0.0 
    599                      zindterm(ji,numeqmin(ji)) =  ztiold(ji,1) + zeta_i(ji,1)* & 
    600                         (zradab_i(ji,1) + zkappa_i(ji,1)*t_bo_b(ji)) & 
    601                         + t_su_b(ji)*zeta_i(ji,1)*zkappa_i(ji,0)*2.0 
     639                     zindterm(ji,numeqmin(ji)) =  ztib(ji,1) + zeta_i(ji,1) * ( zradab_i(ji,1) + zkappa_i(ji,1) * t_bo_1d(ji) )  & 
     640                        &                       + t_su_1d(ji) * zeta_i(ji,1) * zkappa_i(ji,0) * 2.0 
    602641                  ENDIF 
    603642 
     
    609648         ! 
    610649         !------------------------------------------------------------------------------| 
    611          ! 9) tridiagonal system solving                                                | 
     650         ! 10) tridiagonal system solving                                               | 
    612651         !------------------------------------------------------------------------------| 
    613652         ! 
     
    618657 
    619658         maxnumeqmax = 0 
    620          minnumeqmin = jkmax+4 
     659         minnumeqmin = nlay_i+5 
    621660 
    622661         DO ji = kideb , kiut 
     
    627666         END DO 
    628667 
    629          DO layer = minnumeqmin+1, maxnumeqmax 
    630             DO ji = kideb , kiut 
    631                numeq               =  min(max(numeqmin(ji)+1,layer),numeqmax(ji)) 
    632                zdiagbis(ji,numeq)  =  ztrid(ji,numeq,2) - ztrid(ji,numeq,1)* & 
    633                   ztrid(ji,numeq-1,3)/zdiagbis(ji,numeq-1) 
    634                zindtbis(ji,numeq)  =  zindterm(ji,numeq) - ztrid(ji,numeq,1)* & 
    635                   zindtbis(ji,numeq-1)/zdiagbis(ji,numeq-1) 
     668         DO jk = minnumeqmin+1, maxnumeqmax 
     669            DO ji = kideb , kiut 
     670               numeq               =  min(max(numeqmin(ji)+1,jk),numeqmax(ji)) 
     671               zdiagbis(ji,numeq)  =  ztrid(ji,numeq,2)  - ztrid(ji,numeq,1) * ztrid(ji,numeq-1,3)  / zdiagbis(ji,numeq-1) 
     672               zindtbis(ji,numeq)  =  zindterm(ji,numeq) - ztrid(ji,numeq,1) * zindtbis(ji,numeq-1) / zdiagbis(ji,numeq-1) 
    636673            END DO 
    637674         END DO 
     
    639676         DO ji = kideb , kiut 
    640677            ! ice temperatures 
    641             t_i_b(ji,nlay_i)    =  zindtbis(ji,numeqmax(ji))/zdiagbis(ji,numeqmax(ji)) 
    642          END DO 
    643  
    644          DO numeq = nlay_i + nlay_s + 1, nlay_s + 2, -1 
    645             DO ji = kideb , kiut 
    646                layer    =  numeq - nlay_s - 1 
    647                t_i_b(ji,layer)  =  (zindtbis(ji,numeq) - ztrid(ji,numeq,3)* & 
    648                   t_i_b(ji,layer+1))/zdiagbis(ji,numeq) 
     678            t_i_1d(ji,nlay_i)    =  zindtbis(ji,numeqmax(ji)) / zdiagbis(ji,numeqmax(ji)) 
     679         END DO 
     680 
     681         DO numeq = nlay_i + nlay_s, nlay_s + 2, -1 
     682            DO ji = kideb , kiut 
     683               jk    =  numeq - nlay_s - 1 
     684               t_i_1d(ji,jk)  =  ( zindtbis(ji,numeq) - ztrid(ji,numeq,3) * t_i_1d(ji,jk+1) ) / zdiagbis(ji,numeq) 
    649685            END DO 
    650686         END DO 
     
    652688         DO ji = kideb , kiut 
    653689            ! snow temperatures       
    654             IF (ht_s_b(ji).GT.0._wp) & 
    655                t_s_b(ji,nlay_s)     =  (zindtbis(ji,nlay_s+1) - ztrid(ji,nlay_s+1,3) & 
    656                *  t_i_b(ji,1))/zdiagbis(ji,nlay_s+1) & 
    657                *        MAX(0.0,SIGN(1.0,ht_s_b(ji)))  
     690            IF (ht_s_1d(ji) > 0._wp) & 
     691               t_s_1d(ji,nlay_s)     =  ( zindtbis(ji,nlay_s+1) - ztrid(ji,nlay_s+1,3) * t_i_1d(ji,1) )  & 
     692               &                        / zdiagbis(ji,nlay_s+1) * MAX( 0.0, SIGN( 1.0, ht_s_1d(ji) ) )  
    658693 
    659694            ! surface temperature 
    660             isnow(ji)     = NINT(  1.0 - MAX( 0.0 , SIGN( 1.0 , -ht_s_b(ji) )  ) ) 
    661             ztsuoldit(ji) = t_su_b(ji) 
    662             IF( t_su_b(ji) < ztfs(ji) ) & 
    663                t_su_b(ji) = ( zindtbis(ji,numeqmin(ji)) - ztrid(ji,numeqmin(ji),3)* ( REAL( isnow(ji) )*t_s_b(ji,1)   & 
    664                &          + REAL( 1 - isnow(ji) )*t_i_b(ji,1) ) ) / zdiagbis(ji,numeqmin(ji))   
     695            isnow(ji)   = 1._wp - MAX( 0._wp , SIGN( 1._wp , -ht_s_1d(ji) ) ) 
     696            ztsubit(ji) = t_su_1d(ji) 
     697            IF( t_su_1d(ji) < rt0 ) & 
     698               t_su_1d(ji) = ( zindtbis(ji,numeqmin(ji)) - ztrid(ji,numeqmin(ji),3) *  & 
     699               &             ( isnow(ji) * t_s_1d(ji,1) + ( 1._wp - isnow(ji) ) * t_i_1d(ji,1) ) ) / zdiagbis(ji,numeqmin(ji))   
    665700         END DO 
    666701         ! 
    667702         !-------------------------------------------------------------------------- 
    668          !  10) Has the scheme converged ?, end of the iterative procedure         | 
     703         !  11) Has the scheme converged ?, end of the iterative procedure         | 
    669704         !-------------------------------------------------------------------------- 
    670705         ! 
    671706         ! check that nowhere it has started to melt 
    672          ! zerrit(ji) is a measure of error, it has to be under maxer_i_thd 
    673          DO ji = kideb , kiut 
    674             t_su_b(ji) =  MAX(  MIN( t_su_b(ji) , ztfs(ji) ) , 190._wp  ) 
    675             zerrit(ji) =  ABS( t_su_b(ji) - ztsuoldit(ji) )      
    676          END DO 
    677  
    678          DO layer  =  1, nlay_s 
    679             DO ji = kideb , kiut 
    680                ii = MOD( npb(ji) - 1, jpi ) + 1 
    681                ij = ( npb(ji) - 1 ) / jpi + 1 
    682                t_s_b(ji,layer) = MAX(  MIN( t_s_b(ji,layer), rtt ), 190._wp  ) 
    683                zerrit(ji)      = MAX(zerrit(ji),ABS(t_s_b(ji,layer) - ztstemp(ji,layer))) 
    684             END DO 
    685          END DO 
    686  
    687          DO layer  =  1, nlay_i 
    688             DO ji = kideb , kiut 
    689                ztmelt_i        = -tmut * s_i_b(ji,layer) + rtt  
    690                t_i_b(ji,layer) =  MAX(MIN(t_i_b(ji,layer),ztmelt_i), 190._wp) 
    691                zerrit(ji)      =  MAX(zerrit(ji),ABS(t_i_b(ji,layer) - ztitemp(ji,layer))) 
     707         ! zerrit(ji) is a measure of error, it has to be under terr_dif 
     708         DO ji = kideb , kiut 
     709            t_su_1d(ji) =  MAX(  MIN( t_su_1d(ji) , rt0 ) , 190._wp  ) 
     710            zerrit(ji)  =  ABS( t_su_1d(ji) - ztsubit(ji) )      
     711         END DO 
     712 
     713         DO jk  =  1, nlay_s 
     714            DO ji = kideb , kiut 
     715               t_s_1d(ji,jk) = MAX(  MIN( t_s_1d(ji,jk), rt0 ), 190._wp  ) 
     716               zerrit(ji)    = MAX( zerrit(ji), ABS( t_s_1d(ji,jk) - ztstemp(ji,jk) ) ) 
     717            END DO 
     718         END DO 
     719 
     720         DO jk  =  1, nlay_i 
     721            DO ji = kideb , kiut 
     722               ztmelt_i      = -tmut * s_i_1d(ji,jk) + rt0  
     723               t_i_1d(ji,jk) =  MAX( MIN( t_i_1d(ji,jk), ztmelt_i ), 190._wp ) 
     724               zerrit(ji)    =  MAX( zerrit(ji), ABS( t_i_1d(ji,jk) - ztitemp(ji,jk) ) ) 
    692725            END DO 
    693726         END DO 
     
    703736      END DO  ! End of the do while iterative procedure 
    704737 
    705       IF( ln_nicep .AND. lwp ) THEN 
     738      IF( ln_icectl .AND. lwp ) THEN 
    706739         WRITE(numout,*) ' zerritmax : ', zerritmax 
    707740         WRITE(numout,*) ' nconv     : ', nconv 
     
    710743      ! 
    711744      !-------------------------------------------------------------------------! 
    712       !   11) Fluxes at the interfaces                                          ! 
     745      !   12) Fluxes at the interfaces                                          ! 
    713746      !-------------------------------------------------------------------------! 
    714747      DO ji = kideb, kiut 
    715 #if ! defined key_coupled 
    716748         ! forced mode only : update of latent heat fluxes (sublimation) (always >=0, upward flux)  
    717          qla_ice_1d (ji) = MAX( 0._wp, qla_ice_1d (ji) + dqla_ice_1d(ji) * ( t_su_b(ji) - ztsuold(ji) ) ) 
    718 #endif 
     749         IF( .NOT. lk_cpl) qla_ice_1d (ji) = MAX( 0._wp, qla_ice_1d (ji) + dqla_ice_1d(ji) * ( t_su_1d(ji) - ztsub(ji) ) ) 
    719750         !                                ! surface ice conduction flux 
    720          isnow(ji)       = NINT(  1._wp - MAX( 0._wp, SIGN( 1._wp, -ht_s_b(ji) ) ) ) 
    721          fc_su(ji)       =  -     REAL( isnow(ji) ) * zkappa_s(ji,0) * zg1s * (t_s_b(ji,1) - t_su_b(ji))   & 
    722             &               - REAL( 1 - isnow(ji) ) * zkappa_i(ji,0) * zg1  * (t_i_b(ji,1) - t_su_b(ji)) 
     751         isnow(ji)       = 1._wp - MAX( 0._wp, SIGN( 1._wp, -ht_s_1d(ji) ) ) 
     752         fc_su(ji)       =  -           isnow(ji)   * zkappa_s(ji,0) * zg1s * (t_s_1d(ji,1) - t_su_1d(ji))   & 
     753            &               - ( 1._wp - isnow(ji) ) * zkappa_i(ji,0) * zg1  * (t_i_1d(ji,1) - t_su_1d(ji)) 
    723754         !                                ! bottom ice conduction flux 
    724          fc_bo_i(ji)     =  - zkappa_i(ji,nlay_i) * ( zg1*(t_bo_b(ji) - t_i_b(ji,nlay_i)) ) 
    725       END DO 
    726  
    727       !-------------------------! 
    728       ! Heat conservation       ! 
    729       !-------------------------! 
    730       IF( con_i .AND. jiindex_1d > 0 ) THEN 
     755         fc_bo_i(ji)     =  - zkappa_i(ji,nlay_i) * ( zg1*(t_bo_1d(ji) - t_i_1d(ji,nlay_i)) ) 
     756      END DO 
     757 
     758      ! --- computes sea ice energy of melting compulsory for limthd_dh --- ! 
     759      CALL lim_thd_enmelt( kideb, kiut ) 
     760 
     761      ! --- diagnose the change in non-solar flux due to surface temperature change --- ! 
     762      IF ( ln_it_qnsice ) hfx_err_dif_1d(:) = hfx_err_dif_1d(:) - ( qns_ice_1d(:)  - zqns_ice_b(:) ) * a_i_1d(:)  
     763 
     764      ! --- diag conservation imbalance on heat diffusion - PART 2 --- ! 
     765      DO ji = kideb, kiut 
     766         zdq(ji)        = - zq_ini(ji) + ( SUM( q_i_1d(ji,1:nlay_i) ) * ht_i_1d(ji) * r1_nlay_i +  & 
     767            &                              SUM( q_s_1d(ji,1:nlay_s) ) * ht_s_1d(ji) * r1_nlay_s ) 
     768         IF( t_su_1d(ji) < rt0 ) THEN  ! case T_su < 0degC 
     769            zhfx_err(ji) = qns_ice_1d(ji) + qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) + zdq(ji) * r1_rdtice  
     770         ELSE                          ! case T_su = 0degC 
     771            zhfx_err(ji) = fc_su(ji) + i0(ji) * qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) + zdq(ji) * r1_rdtice  
     772         ENDIF 
     773         hfx_err_1d(ji) = hfx_err_1d(ji) + zhfx_err(ji) * a_i_1d(ji) 
     774 
     775         ! total heat that is sent to the ocean (i.e. not used in the heat diffusion equation) 
     776         hfx_err_dif_1d(ji) = hfx_err_dif_1d(ji) + zhfx_err(ji) * a_i_1d(ji) 
     777      END DO  
     778 
     779      !----------------------------------------- 
     780      ! Heat flux used to warm/cool ice in W.m-2 
     781      !----------------------------------------- 
     782      DO ji = kideb, kiut 
     783         IF( t_su_1d(ji) < rt0 ) THEN  ! case T_su < 0degC 
     784            hfx_dif_1d(ji) = hfx_dif_1d(ji)  +   & 
     785               &            ( qns_ice_1d(ji) + qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) ) * a_i_1d(ji) 
     786         ELSE                          ! case T_su = 0degC 
     787            hfx_dif_1d(ji) = hfx_dif_1d(ji) +    & 
     788               &             ( fc_su(ji) + i0(ji) * qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) ) * a_i_1d(ji) 
     789         ENDIF 
     790         ! correction on the diagnosed heat flux due to non-convergence of the algorithm used to solve heat equation 
     791         hfx_dif_1d(ji) = hfx_dif_1d(ji) - zhfx_err(ji) * a_i_1d(ji) 
     792      END DO    
     793      ! 
     794      CALL wrk_dealloc( jpij, numeqmin, numeqmax ) 
     795      CALL wrk_dealloc( jpij, isnow, ztsub, ztsubit, zh_i, zh_s, zfsw ) 
     796      CALL wrk_dealloc( jpij, zf, dzf, zerrit, zdifcase, zftrice, zihic, zghe ) 
     797      CALL wrk_dealloc( jpij,nlay_i+1, ztcond_i, zradtr_i, zradab_i, zkappa_i, ztib, zeta_i, ztitemp, z_i, zspeche_i, kjstart = 0 ) 
     798      CALL wrk_dealloc( jpij,nlay_s+1,           zradtr_s, zradab_s, zkappa_s, ztsb, zeta_s, ztstemp, z_s, kjstart = 0 ) 
     799      CALL wrk_dealloc( jpij,nlay_i+3, zindterm, zindtbis, zdiagbis ) 
     800      CALL wrk_dealloc( jpij,nlay_i+3,3, ztrid ) 
     801      CALL wrk_dealloc( jpij, zdq, zq_ini, zhfx_err ) 
     802 
     803   END SUBROUTINE lim_thd_dif 
     804 
     805   SUBROUTINE lim_thd_enmelt( kideb, kiut ) 
     806      !!----------------------------------------------------------------------- 
     807      !!                   ***  ROUTINE lim_thd_enmelt ***  
     808      !!                  
     809      !! ** Purpose :   Computes sea ice energy of melting q_i (J.m-3) from temperature 
     810      !! 
     811      !! ** Method  :   Formula (Bitz and Lipscomb, 1999) 
     812      !!------------------------------------------------------------------- 
     813      INTEGER, INTENT(in) ::   kideb, kiut   ! bounds for the spatial loop 
     814      ! 
     815      INTEGER  ::   ji, jk   ! dummy loop indices 
     816      REAL(wp) ::   ztmelts  ! local scalar  
     817      !!------------------------------------------------------------------- 
     818      ! 
     819      DO jk = 1, nlay_i             ! Sea ice energy of melting 
    731820         DO ji = kideb, kiut 
    732             ! Upper snow value 
    733             fc_s(ji,0) = - REAL( isnow(ji) ) * zkappa_s(ji,0) * zg1s * ( t_s_b(ji,1) - t_su_b(ji) )  
    734             ! Bott. snow value 
    735             fc_s(ji,1) = - REAL( isnow(ji) ) * zkappa_s(ji,1) * ( t_i_b(ji,1) - t_s_b(ji,1) )  
    736          END DO 
    737          DO ji = kideb, kiut         ! Upper ice layer 
    738             fc_i(ji,0) = - REAL( isnow(ji) ) * &  ! interface flux if there is snow 
    739                ( zkappa_i(ji,0)  * ( t_i_b(ji,1) - t_s_b(ji,nlay_s ) ) ) & 
    740                - REAL( 1 - isnow(ji) ) * ( zkappa_i(ji,0) * &  
    741                zg1 * ( t_i_b(ji,1) - t_su_b(ji) ) ) ! upper flux if not 
    742          END DO 
    743          DO layer = 1, nlay_i - 1         ! Internal ice layers 
    744             DO ji = kideb, kiut 
    745                fc_i(ji,layer) = - zkappa_i(ji,layer) * ( t_i_b(ji,layer+1) - t_i_b(ji,layer) ) 
    746                ii = MOD( npb(ji) - 1, jpi ) + 1 
    747                ij = ( npb(ji) - 1 ) / jpi + 1 
    748             END DO 
    749          END DO 
    750          DO ji = kideb, kiut         ! Bottom ice layers 
    751             fc_i(ji,nlay_i) = - zkappa_i(ji,nlay_i) * ( zg1*(t_bo_b(ji) - t_i_b(ji,nlay_i)) ) 
    752          END DO 
    753       ENDIF 
     821            ztmelts      = - tmut  * s_i_1d(ji,jk) + rt0 
     822            t_i_1d(ji,jk) = MIN( t_i_1d(ji,jk), ztmelts ) ! Force t_i_1d to be lower than melting point 
     823                                                          !   (sometimes dif scheme produces abnormally high temperatures)    
     824            q_i_1d(ji,jk) = rhoic * ( cpic * ( ztmelts - t_i_1d(ji,jk) )                           & 
     825               &                    + lfus * ( 1.0 - ( ztmelts-rt0 ) / ( t_i_1d(ji,jk) - rt0 ) )   & 
     826               &                    - rcp  *         ( ztmelts-rt0 )  )  
     827         END DO 
     828      END DO 
     829      DO jk = 1, nlay_s             ! Snow energy of melting 
     830         DO ji = kideb, kiut 
     831            q_s_1d(ji,jk) = rhosn * ( cpic * ( rt0 - t_s_1d(ji,jk) ) + lfus ) 
     832         END DO 
     833      END DO 
    754834      ! 
    755    END SUBROUTINE lim_thd_dif 
     835   END SUBROUTINE lim_thd_enmelt 
    756836 
    757837#else 
Note: See TracChangeset for help on using the changeset viewer.