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 5581 for branches/2014/dev_r4765_CNRS_agrif/NEMOGCM/NEMO/LIM_SRC_3/limitd_th.F90 – NEMO

Ignore:
Timestamp:
2015-07-10T13:28:53+02:00 (9 years ago)
Author:
timgraham
Message:

Merged head of trunk into branch

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2014/dev_r4765_CNRS_agrif/NEMOGCM/NEMO/LIM_SRC_3/limitd_th.F90

    r4688 r5581  
    66   !! History :   -   !          (W. H. Lipscomb and E.C. Hunke) CICE (c) original code 
    77   !!            3.0  ! 2005-12  (M. Vancoppenolle) adaptation to LIM-3 
    8    !!             -   ! 2006-06  (M. Vancoppenolle) adaptation to include salt, age and types 
     8   !!             -   ! 2006-06  (M. Vancoppenolle) adaptation to include salt, age 
    99   !!             -   ! 2007-04  (M. Vancoppenolle) Mass conservation checked 
    1010   !!---------------------------------------------------------------------- 
     
    1313   !!   'key_lim3' :                                   LIM3 sea-ice model 
    1414   !!---------------------------------------------------------------------- 
    15    !!   lim_itd_th       : thermodynamics of ice thickness distribution 
    1615   !!   lim_itd_th_rem   : 
    1716   !!   lim_itd_th_reb   : 
     
    2524   USE thd_ice          ! LIM-3 thermodynamic variables 
    2625   USE ice              ! LIM-3 variables 
    27    USE par_ice          ! LIM-3 parameters 
    28    USE limthd_lac       ! LIM-3 lateral accretion 
    2926   USE limvar           ! LIM-3 variables 
    30    USE limcons          ! LIM-3 conservation 
    3127   USE prtctl           ! Print control 
    3228   USE in_out_manager   ! I/O manager 
     
    3430   USE wrk_nemo         ! work arrays 
    3531   USE lib_fortran      ! to use key_nosignedzero 
    36    USE timing          ! Timing 
    37    USE limcons        ! conservation tests 
     32   USE limcons          ! conservation tests 
    3833 
    3934   IMPLICIT NONE 
    4035   PRIVATE 
    4136 
    42    PUBLIC   lim_itd_th         ! called by ice_stp 
    4337   PUBLIC   lim_itd_th_rem 
    4438   PUBLIC   lim_itd_th_reb 
    45    PUBLIC   lim_itd_fitline 
    46    PUBLIC   lim_itd_shiftice 
    47  
    48    REAL(wp) ::   epsi10 = 1.e-10_wp   ! 
    49    REAL(wp) ::   epsi06 = 1.e-6_wp   ! 
    5039 
    5140   !!---------------------------------------------------------------------- 
     
    5645CONTAINS 
    5746 
    58    SUBROUTINE lim_itd_th( kt ) 
    59       !!------------------------------------------------------------------ 
    60       !!                ***  ROUTINE lim_itd_th *** 
    61       !! 
    62       !! ** Purpose :   computes the thermodynamics of ice thickness distribution 
    63       !! 
    64       !! ** Method  : 
    65       !!------------------------------------------------------------------ 
    66       INTEGER, INTENT(in) ::   kt   ! time step index 
    67       ! 
    68       INTEGER ::   ji,jj, jk, jl, ja, jm, jbnd1, jbnd2   ! ice types    dummy loop index          
    69       ! 
    70       REAL(wp) :: zvi_b, zsmv_b, zei_b, zfs_b, zfw_b, zft_b  
    71       !!------------------------------------------------------------------ 
    72       IF( nn_timing == 1 )  CALL timing_start('limitd_th') 
    73  
    74       ! conservation test 
    75       IF( ln_limdiahsb ) CALL lim_cons_hsm(0, 'limitd_th', zvi_b, zsmv_b, zei_b, zfw_b, zfs_b, zft_b) 
    76  
    77       IF( kt == nit000 .AND. lwp ) THEN 
    78          WRITE(numout,*) 
    79          WRITE(numout,*) 'lim_itd_th  : Thermodynamics of the ice thickness distribution' 
    80          WRITE(numout,*) '~~~~~~~~~~~' 
    81       ENDIF 
    82  
    83       !------------------------------------------------------------------------------| 
    84       !  1) Transport of ice between thickness categories.                           | 
    85       !------------------------------------------------------------------------------| 
    86       ! Given thermodynamic growth rates, transport ice between 
    87       ! thickness categories. 
    88       DO jm = 1, jpm 
    89          jbnd1 = ice_cat_bounds(jm,1) 
    90          jbnd2 = ice_cat_bounds(jm,2) 
    91          IF( ice_ncat_types(jm) > 1 )   CALL lim_itd_th_rem( jbnd1, jbnd2, jm, kt ) 
    92       END DO 
    93       ! 
    94       CALL lim_var_glo2eqv    ! only for info 
    95       CALL lim_var_agg(1) 
    96  
    97       !------------------------------------------------------------------------------| 
    98       !  3) Add frazil ice growing in leads. 
    99       !------------------------------------------------------------------------------| 
    100       CALL lim_thd_lac 
    101       CALL lim_var_glo2eqv    ! only for info 
    102       
    103       IF(ln_ctl) THEN   ! Control print 
    104          CALL prt_ctl_info(' ') 
    105          CALL prt_ctl_info(' - Cell values : ') 
    106          CALL prt_ctl_info('   ~~~~~~~~~~~~~ ') 
    107          CALL prt_ctl(tab2d_1=area , clinfo1=' lim_itd_th  : cell area :') 
    108          CALL prt_ctl(tab2d_1=at_i , clinfo1=' lim_itd_th  : at_i      :') 
    109          CALL prt_ctl(tab2d_1=vt_i , clinfo1=' lim_itd_th  : vt_i      :') 
    110          CALL prt_ctl(tab2d_1=vt_s , clinfo1=' lim_itd_th  : vt_s      :') 
    111          DO jl = 1, jpl 
    112             CALL prt_ctl_info(' ') 
    113             CALL prt_ctl_info(' - Category : ', ivar1=jl) 
    114             CALL prt_ctl_info('   ~~~~~~~~~~') 
    115             CALL prt_ctl(tab2d_1=a_i   (:,:,jl)   , clinfo1= ' lim_itd_th  : a_i      : ') 
    116             CALL prt_ctl(tab2d_1=ht_i  (:,:,jl)   , clinfo1= ' lim_itd_th  : ht_i     : ') 
    117             CALL prt_ctl(tab2d_1=ht_s  (:,:,jl)   , clinfo1= ' lim_itd_th  : ht_s     : ') 
    118             CALL prt_ctl(tab2d_1=v_i   (:,:,jl)   , clinfo1= ' lim_itd_th  : v_i      : ') 
    119             CALL prt_ctl(tab2d_1=v_s   (:,:,jl)   , clinfo1= ' lim_itd_th  : v_s      : ') 
    120             CALL prt_ctl(tab2d_1=e_s   (:,:,1,jl) , clinfo1= ' lim_itd_th  : e_s      : ') 
    121             CALL prt_ctl(tab2d_1=t_su  (:,:,jl)   , clinfo1= ' lim_itd_th  : t_su     : ') 
    122             CALL prt_ctl(tab2d_1=t_s   (:,:,1,jl) , clinfo1= ' lim_itd_th  : t_snow   : ') 
    123             CALL prt_ctl(tab2d_1=sm_i  (:,:,jl)   , clinfo1= ' lim_itd_th  : sm_i     : ') 
    124             CALL prt_ctl(tab2d_1=smv_i (:,:,jl)   , clinfo1= ' lim_itd_th  : smv_i    : ') 
    125             DO ja = 1, nlay_i 
    126                CALL prt_ctl_info(' ') 
    127                CALL prt_ctl_info(' - Layer : ', ivar1=ja) 
    128                CALL prt_ctl_info('   ~~~~~~~') 
    129                CALL prt_ctl(tab2d_1=t_i(:,:,ja,jl) , clinfo1= ' lim_itd_th  : t_i      : ') 
    130                CALL prt_ctl(tab2d_1=e_i(:,:,ja,jl) , clinfo1= ' lim_itd_th  : e_i      : ') 
    131             END DO 
    132          END DO 
    133       ENDIF 
    134       ! 
    135       ! conservation test 
    136       IF( ln_limdiahsb ) CALL lim_cons_hsm(1, 'limitd_th', zvi_b, zsmv_b, zei_b, zfw_b, zfs_b, zft_b) 
    137       ! 
    138      IF( nn_timing == 1 )  CALL timing_stop('limitd_th') 
    139    END SUBROUTINE lim_itd_th 
    140    ! 
    141  
    142    SUBROUTINE lim_itd_th_rem( klbnd, kubnd, ntyp, kt ) 
     47   SUBROUTINE lim_itd_th_rem( klbnd, kubnd, kt ) 
    14348      !!------------------------------------------------------------------ 
    14449      !!                ***  ROUTINE lim_itd_th_rem *** 
     
    15358      INTEGER , INTENT (in) ::   klbnd   ! Start thickness category index point 
    15459      INTEGER , INTENT (in) ::   kubnd   ! End point on which the  the computation is applied 
    155       INTEGER , INTENT (in) ::   ntyp    ! Number of the type used 
    15660      INTEGER , INTENT (in) ::   kt      ! Ocean time step  
    15761      ! 
     
    16165      REAL(wp) ::   zx1, zwk1, zdh0, zetamin, zdamax   ! local scalars 
    16266      REAL(wp) ::   zx2, zwk2, zda0, zetamax           !   -      - 
    163       REAL(wp) ::   zx3,             zareamin, zindb   !   -      - 
     67      REAL(wp) ::   zx3         
    16468      CHARACTER (len = 15) :: fieldid 
    16569 
     
    17175      REAL(wp), POINTER, DIMENSION(:,:,:) ::   hL          ! left boundary for the ITD for each thickness 
    17276      REAL(wp), POINTER, DIMENSION(:,:,:) ::   hR          ! left boundary for the ITD for each thickness 
    173       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zht_i_o     ! old ice thickness 
     77      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zht_i_b     ! old ice thickness 
    17478      REAL(wp), POINTER, DIMENSION(:,:,:) ::   dummy_es 
    17579      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zdaice, zdvice          ! local increment of ice area and volume 
     
    18791      !!------------------------------------------------------------------ 
    18892 
    189       CALL wrk_alloc( jpi,jpj, zremap_flag )    ! integer 
    190       CALL wrk_alloc( jpi,jpj,jpl-1, zdonor )   ! integer 
    191       CALL wrk_alloc( jpi,jpj,jpl, zdhice, g0, g1, hL, hR, zht_i_o, dummy_es ) 
     93      CALL wrk_alloc( jpi,jpj, zremap_flag ) 
     94      CALL wrk_alloc( jpi,jpj,jpl-1, zdonor ) 
     95      CALL wrk_alloc( jpi,jpj,jpl, zdhice, g0, g1, hL, hR, zht_i_b, dummy_es ) 
    19296      CALL wrk_alloc( jpi,jpj,jpl-1, zdaice, zdvice )    
    19397      CALL wrk_alloc( jpi,jpj,jpl+1, zhbnew, kkstart = 0 )    
    19498      CALL wrk_alloc( (jpi+1)*(jpj+1), zvetamin, zvetamax )    
    195       CALL wrk_alloc( (jpi+1)*(jpj+1), nind_i, nind_j )   ! integer  
     99      CALL wrk_alloc( (jpi+1)*(jpj+1), nind_i, nind_j )  
    196100      CALL wrk_alloc( jpi,jpj, zhb0,zhb1,vt_i_init,vt_i_final,vt_s_init,vt_s_final,et_i_init,et_i_final,et_s_init,et_s_final ) 
    197  
    198       zareamin = epsi10   !minimum area in thickness categories tolerated by the conceptors of the model 
    199101 
    200102      !!---------------------------------------------------------------------------------------------- 
     
    218120         WRITE(numout,*) ' klbnd :       ', klbnd 
    219121         WRITE(numout,*) ' kubnd :       ', kubnd 
    220          WRITE(numout,*) ' ntyp  :       ', ntyp  
    221122      ENDIF 
    222123 
     
    225126         DO jj = 1, jpj 
    226127            DO ji = 1, jpi 
    227                zindb             = 1.0 - MAX( 0.0, SIGN( 1.0, - a_i(ji,jj,jl) + epsi10 ) )     !0 if no ice and 1 if yes 
    228                ht_i(ji,jj,jl)    = v_i(ji,jj,jl) / MAX( a_i(ji,jj,jl), epsi10 ) * zindb 
    229                zindb             = 1.0 - MAX( 0.0, SIGN( 1.0, - old_a_i(ji,jj,jl) + epsi10) ) !0 if no ice and 1 if yes 
    230                zht_i_o(ji,jj,jl) = old_v_i(ji,jj,jl) / MAX( old_a_i(ji,jj,jl), epsi10 ) * zindb 
    231                IF( a_i(ji,jj,jl) > epsi10 )   zdhice(ji,jj,jl) = ht_i(ji,jj,jl) - zht_i_o(ji,jj,jl)  
     128               rswitch           = MAX( 0.0, SIGN( 1.0, a_i(ji,jj,jl) - epsi10 ) )     !0 if no ice and 1 if yes 
     129               ht_i(ji,jj,jl)    = v_i(ji,jj,jl) / MAX( a_i(ji,jj,jl), epsi10 ) * rswitch 
     130               rswitch           = MAX( 0.0, SIGN( 1.0, a_i_b(ji,jj,jl) - epsi10) ) 
     131               zht_i_b(ji,jj,jl) = v_i_b(ji,jj,jl) / MAX( a_i_b(ji,jj,jl), epsi10 ) * rswitch 
     132               IF( a_i(ji,jj,jl) > epsi10 )   zdhice(ji,jj,jl) = ht_i(ji,jj,jl) - zht_i_b(ji,jj,jl) ! clem: useless IF statement?  
    232133            END DO 
    233134         END DO 
     
    248149      DO jj = 1, jpj 
    249150         DO ji = 1, jpi 
    250             IF ( at_i(ji,jj) .gt. zareamin ) THEN 
     151            IF ( at_i(ji,jj) > epsi10 ) THEN 
    251152               nbrem         = nbrem + 1 
    252153               nind_i(nbrem) = ji 
     
    256157               zremap_flag(ji,jj) = 0 
    257158            ENDIF 
    258          END DO !ji 
    259       END DO !jj 
     159         END DO 
     160      END DO 
    260161 
    261162      !----------------------------------------------------------------------------------------------- 
     
    263164      !----------------------------------------------------------------------------------------------- 
    264165      !- 4.1 Compute category boundaries 
    265       ! Tricky trick see limitd_me.F90 
    266       ! will be soon removed, CT 
    267       ! hi_max(kubnd) = 99. 
    268166      zhbnew(:,:,:) = 0._wp 
    269167 
     
    274172            ! 
    275173            zhbnew(ii,ij,jl) = hi_max(jl) 
    276             IF ( old_a_i(ii,ij,jl) > epsi10 .AND. old_a_i(ii,ij,jl+1) > epsi10 ) THEN 
     174            IF    ( a_i_b(ii,ij,jl) > epsi10 .AND. a_i_b(ii,ij,jl+1) > epsi10 ) THEN 
    277175               !interpolate between adjacent category growth rates 
    278                zslope           = ( zdhice(ii,ij,jl+1) - zdhice(ii,ij,jl) ) / ( zht_i_o(ii,ij,jl+1) - zht_i_o(ii,ij,jl) ) 
    279                zhbnew(ii,ij,jl) = hi_max(jl) + zdhice(ii,ij,jl) + zslope * ( hi_max(jl) - zht_i_o(ii,ij,jl) ) 
    280             ELSEIF ( old_a_i(ii,ij,jl) > epsi10) THEN 
     176               zslope           = ( zdhice(ii,ij,jl+1) - zdhice(ii,ij,jl) ) / ( zht_i_b(ii,ij,jl+1) - zht_i_b(ii,ij,jl) ) 
     177               zhbnew(ii,ij,jl) = hi_max(jl) + zdhice(ii,ij,jl) + zslope * ( hi_max(jl) - zht_i_b(ii,ij,jl) ) 
     178            ELSEIF( a_i_b(ii,ij,jl) > epsi10) THEN 
    281179               zhbnew(ii,ij,jl) = hi_max(jl) + zdhice(ii,ij,jl) 
    282             ELSEIF ( old_a_i(ii,ij,jl+1) > epsi10) THEN 
     180            ELSEIF( a_i_b(ii,ij,jl+1) > epsi10) THEN 
    283181               zhbnew(ii,ij,jl) = hi_max(jl) + zdhice(ii,ij,jl+1) 
    284182            ENDIF 
     
    289187            ii = nind_i(ji) 
    290188            ij = nind_j(ji) 
    291             IF( a_i(ii,ij,jl) > epsi10 .AND. ht_i(ii,ij,jl) >= zhbnew(ii,ij,jl) ) THEN 
     189 
     190            ! clem: we do not want ht_i to be too close to either HR or HL otherwise a division by nearly 0 is possible  
     191            ! in lim_itd_fitline in the case (HR-HL) = 3(Hice - HL) or = 3(HR - Hice) 
     192            IF    ( a_i(ii,ij,jl  ) > epsi10 .AND. ht_i(ii,ij,jl  ) > ( zhbnew(ii,ij,jl) - epsi10 ) ) THEN 
    292193               zremap_flag(ii,ij) = 0 
    293             ELSEIF( a_i(ii,ij,jl+1) > epsi10 .AND. ht_i(ii,ij,jl+1) <= zhbnew(ii,ij,jl) ) THEN 
     194            ELSEIF( a_i(ii,ij,jl+1) > epsi10 .AND. ht_i(ii,ij,jl+1) < ( zhbnew(ii,ij,jl) + epsi10 ) ) THEN 
    294195               zremap_flag(ii,ij) = 0 
    295196            ENDIF 
    296197 
    297198            !- 4.3 Check that each zhbnew does not exceed maximal values hi_max   
     199            IF( zhbnew(ii,ij,jl) < hi_max(jl-1) ) zremap_flag(ii,ij) = 0 
    298200            IF( zhbnew(ii,ij,jl) > hi_max(jl+1) ) zremap_flag(ii,ij) = 0 
    299             IF( zhbnew(ii,ij,jl) < hi_max(jl-1) ) zremap_flag(ii,ij) = 0 
    300          END DO 
    301  
    302       END DO !jl 
     201            ! clem bug: why is not the following instead? 
     202            !!IF( zhbnew(ii,ij,jl) < hi_max(jl-1) ) zremap_flag(ii,ij) = 0 
     203            !!IF( zhbnew(ii,ij,jl) > hi_max(jl  ) ) zremap_flag(ii,ij) = 0 
     204  
     205         END DO 
     206 
     207      END DO 
    303208 
    304209      !----------------------------------------------------------------------------------------------- 
     
    321226      DO jj = 1, jpj 
    322227         DO ji = 1, jpi 
    323             zhb0(ji,jj) = hi_max_typ(0,ntyp) ! 0eme 
    324             zhb1(ji,jj) = hi_max_typ(1,ntyp) ! 1er 
    325  
    326             zhbnew(ji,jj,klbnd-1) = 0._wp 
     228            zhb0(ji,jj) = hi_max(0) 
     229            zhb1(ji,jj) = hi_max(1) 
    327230 
    328231            IF( a_i(ji,jj,kubnd) > epsi10 ) THEN 
    329                zhbnew(ji,jj,kubnd) = 3._wp * ht_i(ji,jj,kubnd) - 2._wp * zhbnew(ji,jj,kubnd-1) 
     232               zhbnew(ji,jj,kubnd) = MAX( hi_max(kubnd-1), 3._wp * ht_i(ji,jj,kubnd) - 2._wp * zhbnew(ji,jj,kubnd-1) ) 
    330233            ELSE 
    331                zhbnew(ji,jj,kubnd) = hi_max(kubnd)   
    332                !!? clem bug: since hi_max(jpl)=99, this limit is very high  
    333                !!? but I think it is erased in fitline subroutine  
    334             ENDIF 
    335  
    336             IF( zhbnew(ji,jj,kubnd) < hi_max(kubnd-1) ) zhbnew(ji,jj,kubnd) = hi_max(kubnd-1) 
    337  
    338          END DO !jj 
    339       END DO !jj 
     234!clem bug               zhbnew(ji,jj,kubnd) = hi_max(kubnd)   
     235               zhbnew(ji,jj,kubnd) = hi_max(kubnd-1) ! not used anyway 
     236            ENDIF 
     237 
     238            ! clem: we do not want ht_i_b to be too close to either HR or HL otherwise a division by nearly 0 is possible  
     239            ! in lim_itd_fitline in the case (HR-HL) = 3(Hice - HL) or = 3(HR - Hice) 
     240            IF    ( zht_i_b(ji,jj,klbnd) < ( zhb0(ji,jj) + epsi10 ) )  THEN 
     241               zremap_flag(ji,jj) = 0 
     242            ELSEIF( zht_i_b(ji,jj,klbnd) > ( zhb1(ji,jj) - epsi10 ) )  THEN 
     243               zremap_flag(ji,jj) = 0 
     244            ENDIF 
     245 
     246         END DO 
     247      END DO 
    340248 
    341249      !----------------------------------------------------------------------------------------------- 
     
    343251      !----------------------------------------------------------------------------------------------- 
    344252      !- 7.1 g(h) for category 1 at start of time step 
    345       CALL lim_itd_fitline( klbnd, zhb0, zhb1, zht_i_o(:,:,klbnd),         & 
    346          &                  g0(:,:,klbnd), g1(:,:,klbnd), hL(:,:,klbnd),   & 
     253      CALL lim_itd_fitline( klbnd, zhb0, zhb1, zht_i_b(:,:,klbnd), g0(:,:,klbnd), g1(:,:,klbnd), hL(:,:,klbnd),   & 
    347254         &                  hR(:,:,klbnd), zremap_flag ) 
    348255 
     
    352259         ij = nind_j(ji)  
    353260 
    354          !ji 
    355          IF (a_i(ii,ij,klbnd) .gt. epsi10) THEN 
     261         IF( a_i(ii,ij,klbnd) > epsi10 ) THEN 
     262 
    356263            zdh0 = zdhice(ii,ij,klbnd) !decrease of ice thickness in the lower category 
    357             ! ji, a_i > epsi10 
    358             IF (zdh0 .lt. 0.0) THEN !remove area from category 1 
    359                ! ji, a_i > epsi10; zdh0 < 0 
    360                zdh0 = MIN(-zdh0,hi_max(klbnd)) 
    361  
     264 
     265            IF( zdh0 < 0.0 ) THEN      !remove area from category 1 
     266               zdh0 = MIN( -zdh0, hi_max(klbnd) ) 
    362267               !Integrate g(1) from 0 to dh0 to estimate area melted 
    363                zetamax = MIN(zdh0,hR(ii,ij,klbnd)) - hL(ii,ij,klbnd) 
    364                IF (zetamax.gt.0.0) THEN 
    365                   zx1  = zetamax 
    366                   zx2  = 0.5 * zetamax*zetamax  
    367                   zda0 = g1(ii,ij,klbnd) * zx2 + g0(ii,ij,klbnd) * zx1 !ice area removed 
    368                   ! Constrain new thickness <= ht_i 
    369                   zdamax = a_i(ii,ij,klbnd) * &  
    370                      (1.0 - ht_i(ii,ij,klbnd)/zht_i_o(ii,ij,klbnd)) ! zdamax > 0 
    371                   !ice area lost due to melting of thin ice 
    372                   zda0   = MIN(zda0, zdamax) 
    373  
     268               zetamax = MIN( zdh0, hR(ii,ij,klbnd) ) - hL(ii,ij,klbnd) 
     269 
     270               IF( zetamax > 0.0 ) THEN 
     271                  zx1    = zetamax 
     272                  zx2    = 0.5 * zetamax * zetamax  
     273                  zda0   = g1(ii,ij,klbnd) * zx2 + g0(ii,ij,klbnd) * zx1                        ! ice area removed 
     274                  zdamax = a_i(ii,ij,klbnd) * (1.0 - ht_i(ii,ij,klbnd) / zht_i_b(ii,ij,klbnd) ) ! Constrain new thickness <= ht_i                 
     275                  zda0   = MIN( zda0, zdamax )                                                  ! ice area lost due to melting  
     276                                                                                                !     of thin ice (zdamax > 0) 
    374277                  ! Remove area, conserving volume 
    375                   ht_i(ii,ij,klbnd) = ht_i(ii,ij,klbnd) &  
    376                      * a_i(ii,ij,klbnd) / ( a_i(ii,ij,klbnd) - zda0 ) 
     278                  ht_i(ii,ij,klbnd) = ht_i(ii,ij,klbnd) * a_i(ii,ij,klbnd) / ( a_i(ii,ij,klbnd) - zda0 ) 
    377279                  a_i(ii,ij,klbnd)  = a_i(ii,ij,klbnd) - zda0 
    378                   v_i(ii,ij,klbnd)  = a_i(ii,ij,klbnd)*ht_i(ii,ij,klbnd) ! clem-useless ? 
    379                ENDIF     ! zetamax > 0 
    380                ! ji, a_i > epsi10 
    381  
    382             ELSE ! if ice accretion 
    383                ! ji, a_i > epsi10; zdh0 > 0 
    384                IF ( ntyp .EQ. 1 ) zhbnew(ii,ij,klbnd-1) = MIN(zdh0,hi_max(klbnd))  
    385                ! zhbnew was 0, and is shifted to the right to account for thin ice 
    386                ! growth in openwater (F0 = f1) 
    387                IF ( ntyp .NE. 1 ) zhbnew(ii,ij,0) = 0  
    388                ! in other types there is 
    389                ! no open water growth (F0 = 0) 
    390             ENDIF ! zdh0  
    391  
    392             ! a_i > epsi10 
    393          ENDIF ! a_i > epsi10 
    394  
    395       END DO ! ji 
     280                  v_i(ii,ij,klbnd)  = a_i(ii,ij,klbnd) * ht_i(ii,ij,klbnd) ! clem-useless ? 
     281               ENDIF 
     282 
     283            ELSE ! if ice accretion zdh0 > 0 
     284               ! zhbnew was 0, and is shifted to the right to account for thin ice growth in openwater (F0 = f1) 
     285               zhbnew(ii,ij,klbnd-1) = MIN( zdh0, hi_max(klbnd) )  
     286            ENDIF 
     287 
     288         ENDIF 
     289 
     290      END DO 
    396291 
    397292      !- 7.3 g(h) for each thickness category   
    398293      DO jl = klbnd, kubnd 
    399          CALL lim_itd_fitline(jl, zhbnew(:,:,jl-1), zhbnew(:,:,jl), ht_i(:,:,jl), & 
    400             g0(:,:,jl), g1(:,:,jl), hL(:,:,jl), hR(:,:,jl), zremap_flag) 
     294         CALL lim_itd_fitline( jl, zhbnew(:,:,jl-1), zhbnew(:,:,jl), ht_i(:,:,jl), & 
     295            &                  g0(:,:,jl), g1(:,:,jl), hL(:,:,jl), hR(:,:,jl), zremap_flag ) 
    401296      END DO 
    402297 
     
    418313            ij = nind_j(ji) 
    419314 
    420             IF (zhbnew(ii,ij,jl) .gt. hi_max(jl)) THEN ! transfer from jl to jl+1 
    421  
     315            IF (zhbnew(ii,ij,jl) > hi_max(jl)) THEN ! transfer from jl to jl+1 
    422316               ! left and right integration limits in eta space 
    423                zvetamin(ji) = MAX(hi_max(jl), hL(ii,ij,jl)) - hL(ii,ij,jl) 
    424                zvetamax(ji) = MIN(zhbnew(ii,ij,jl), hR(ii,ij,jl)) - hL(ii,ij,jl) 
     317               zvetamin(ji) = MAX( hi_max(jl), hL(ii,ij,jl) ) - hL(ii,ij,jl) 
     318               zvetamax(ji) = MIN( zhbnew(ii,ij,jl), hR(ii,ij,jl) ) - hL(ii,ij,jl) 
    425319               zdonor(ii,ij,jl) = jl 
    426320 
    427             ELSE  ! zhbnew(jl) <= hi_max(jl) ; transfer from jl+1 to jl 
    428  
     321            ELSE                                    ! zhbnew(jl) <= hi_max(jl) ; transfer from jl+1 to jl 
    429322               ! left and right integration limits in eta space 
    430323               zvetamin(ji) = 0.0 
    431                zvetamax(ji) = MIN(hi_max(jl), hR(ii,ij,jl+1)) - hL(ii,ij,jl+1) 
     324               zvetamax(ji) = MIN( hi_max(jl), hR(ii,ij,jl+1) ) - hL(ii,ij,jl+1) 
    432325               zdonor(ii,ij,jl) = jl + 1 
    433326 
    434             ENDIF  ! zhbnew(jl) > hi_max(jl) 
    435  
    436             zetamax = MAX(zvetamax(ji), zvetamin(ji)) ! no transfer if etamax < etamin 
     327            ENDIF 
     328 
     329            zetamax = MAX( zvetamax(ji), zvetamin(ji) ) ! no transfer if etamax < etamin 
    437330            zetamin = zvetamin(ji) 
    438331 
    439332            zx1  = zetamax - zetamin 
    440             zwk1 = zetamin*zetamin 
    441             zwk2 = zetamax*zetamax 
    442             zx2  = 0.5 * (zwk2 - zwk1) 
     333            zwk1 = zetamin * zetamin 
     334            zwk2 = zetamax * zetamax 
     335            zx2  = 0.5 * ( zwk2 - zwk1 ) 
    443336            zwk1 = zwk1 * zetamin 
    444337            zwk2 = zwk2 * zetamax 
    445             zx3  = 1.0/3.0 * (zwk2 - zwk1) 
     338            zx3  = 1.0 / 3.0 * ( zwk2 - zwk1 ) 
    446339            nd   = zdonor(ii,ij,jl) 
    447340            zdaice(ii,ij,jl) = g1(ii,ij,nd)*zx2 + g0(ii,ij,nd)*zx1 
    448341            zdvice(ii,ij,jl) = g1(ii,ij,nd)*zx3 + g0(ii,ij,nd)*zx2 + zdaice(ii,ij,jl)*hL(ii,ij,nd) 
    449342 
    450          END DO ! ji 
    451       END DO ! jl klbnd -> kubnd - 1 
     343         END DO 
     344      END DO 
    452345 
    453346      !!---------------------------------------------------------------------------------------------- 
     
    463356         ii = nind_i(ji) 
    464357         ij = nind_j(ji) 
    465          IF ( a_i(ii,ij,1) > epsi10 .AND. ht_i(ii,ij,1) < hiclim ) THEN 
    466             a_i(ii,ij,1)  = a_i(ii,ij,1) * ht_i(ii,ij,1) / hiclim  
    467             ht_i(ii,ij,1) = hiclim 
     358         IF ( a_i(ii,ij,1) > epsi10 .AND. ht_i(ii,ij,1) < rn_himin ) THEN 
     359            a_i (ii,ij,1) = a_i(ii,ij,1) * ht_i(ii,ij,1) / rn_himin  
     360            ht_i(ii,ij,1) = rn_himin 
    468361         ENDIF 
    469       END DO !ji 
     362      END DO 
    470363 
    471364      !!---------------------------------------------------------------------------------------------- 
     
    491384      ENDIF 
    492385 
    493       CALL wrk_dealloc( jpi,jpj, zremap_flag )    ! integer 
    494       CALL wrk_dealloc( jpi,jpj,jpl-1, zdonor )   ! integer 
    495       CALL wrk_dealloc( jpi,jpj,jpl, zdhice, g0, g1, hL, hR, zht_i_o, dummy_es ) 
     386      CALL wrk_dealloc( jpi,jpj, zremap_flag ) 
     387      CALL wrk_dealloc( jpi,jpj,jpl-1, zdonor ) 
     388      CALL wrk_dealloc( jpi,jpj,jpl, zdhice, g0, g1, hL, hR, zht_i_b, dummy_es ) 
    496389      CALL wrk_dealloc( jpi,jpj,jpl-1, zdaice, zdvice )    
    497390      CALL wrk_dealloc( jpi,jpj,jpl+1, zhbnew, kkstart = 0 )    
    498391      CALL wrk_dealloc( (jpi+1)*(jpj+1), zvetamin, zvetamax )    
    499       CALL wrk_dealloc( (jpi+1)*(jpj+1), nind_i, nind_j )   ! integer  
     392      CALL wrk_dealloc( (jpi+1)*(jpj+1), nind_i, nind_j )  
    500393      CALL wrk_dealloc( jpi,jpj, zhb0,zhb1,vt_i_init,vt_i_final,vt_s_init,vt_s_final,et_i_init,et_i_final,et_s_init,et_s_final ) 
    501394 
     
    503396 
    504397 
    505    SUBROUTINE lim_itd_fitline( num_cat, HbL, Hbr, hice,   & 
    506       &                        g0, g1, hL, hR, zremap_flag ) 
     398   SUBROUTINE lim_itd_fitline( num_cat, HbL, Hbr, hice, g0, g1, hL, hR, zremap_flag ) 
    507399      !!------------------------------------------------------------------ 
    508400      !!                ***  ROUTINE lim_itd_fitline *** 
     
    523415      INTEGER , DIMENSION(jpi,jpj), INTENT(in   ) ::   zremap_flag  ! 
    524416      ! 
    525       INTEGER ::   ji,jj           ! horizontal indices 
     417      INTEGER  ::   ji,jj        ! horizontal indices 
    526418      REAL(wp) ::   zh13         ! HbL + 1/3 * (HbR - HbL) 
    527419      REAL(wp) ::   zh23         ! HbL + 2/3 * (HbR - HbL) 
     
    530422      !!------------------------------------------------------------------ 
    531423      ! 
    532       ! 
    533424      DO jj = 1, jpj 
    534425         DO ji = 1, jpi 
    535426            ! 
    536427            IF( zremap_flag(ji,jj) == 1 .AND. a_i(ji,jj,num_cat) > epsi10   & 
    537                &                        .AND. hice(ji,jj)        > 0._wp     ) THEN 
     428               &                        .AND. hice(ji,jj)        > 0._wp ) THEN 
    538429 
    539430               ! Initialize hL and hR 
    540  
    541431               hL(ji,jj) = HbL(ji,jj) 
    542432               hR(ji,jj) = HbR(ji,jj) 
    543433 
    544434               ! Change hL or hR if hice falls outside central third of range 
    545  
    546                zh13 = 1.0/3.0 * (2.0*hL(ji,jj) + hR(ji,jj)) 
    547                zh23 = 1.0/3.0 * (hL(ji,jj) + 2.0*hR(ji,jj)) 
     435               zh13 = 1.0 / 3.0 * ( 2.0 * hL(ji,jj) + hR(ji,jj) ) 
     436               zh23 = 1.0 / 3.0 * ( hL(ji,jj) + 2.0 * hR(ji,jj) ) 
    548437 
    549438               IF    ( hice(ji,jj) < zh13 ) THEN   ;   hR(ji,jj) = 3._wp * hice(ji,jj) - 2._wp * hL(ji,jj) 
     
    552441 
    553442               ! Compute coefficients of g(eta) = g0 + g1*eta 
    554  
    555443               zdhr = 1._wp / (hR(ji,jj) - hL(ji,jj)) 
    556444               zwk1 = 6._wp * a_i(ji,jj,num_cat) * zdhr 
    557445               zwk2 = ( hice(ji,jj) - hL(ji,jj) ) * zdhr 
    558                g0(ji,jj) = zwk1 * ( 2._wp/3._wp - zwk2 ) 
    559                g1(ji,jj) = 2._wp * zdhr * zwk1 * (zwk2 - 0.5) 
     446               g0(ji,jj) = zwk1 * ( 2._wp / 3._wp - zwk2 ) 
     447               g1(ji,jj) = 2._wp * zdhr * zwk1 * ( zwk2 - 0.5 ) 
    560448               ! 
    561             ELSE                   ! remap_flag = .false. or a_i < epsi10  
     449            ELSE  ! remap_flag = .false. or a_i < epsi10  
    562450               hL(ji,jj) = 0._wp 
    563451               hR(ji,jj) = 0._wp 
    564452               g0(ji,jj) = 0._wp 
    565453               g1(ji,jj) = 0._wp 
    566             ENDIF                  ! a_i > epsi10 
     454            ENDIF 
    567455            ! 
    568456         END DO 
     
    588476 
    589477      INTEGER ::   ji, jj, jl, jl2, jl1, jk   ! dummy loop indices 
    590       INTEGER ::   ii, ij          ! indices when changing from 2D-1D is done 
     478      INTEGER ::   ii, ij                     ! indices when changing from 2D-1D is done 
    591479 
    592480      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zaTsfn 
     
    598486      REAL(wp) ::   zdo_aice           ! ice age times volume transferred 
    599487      REAL(wp) ::   zdaTsf             ! aicen*Tsfcn transferred 
    600       REAL(wp) ::   zindsn             ! snow or not 
    601       REAL(wp) ::   zindb              ! ice or not 
    602488 
    603489      INTEGER, POINTER, DIMENSION(:) ::   nind_i, nind_j   ! compressed indices for i/j directions 
    604490 
    605       INTEGER ::   nbrem             ! number of cells with ice to transfer 
    606  
    607       LOGICAL ::   zdaice_negative         ! true if daice < -puny 
    608       LOGICAL ::   zdvice_negative         ! true if dvice < -puny 
    609       LOGICAL ::   zdaice_greater_aicen    ! true if daice > aicen 
    610       LOGICAL ::   zdvice_greater_vicen    ! true if dvice > vicen 
     491      INTEGER  ::   nbrem             ! number of cells with ice to transfer 
    611492      !!------------------------------------------------------------------ 
    612493 
    613494      CALL wrk_alloc( jpi,jpj,jpl, zaTsfn ) 
    614495      CALL wrk_alloc( jpi,jpj, zworka ) 
    615       CALL wrk_alloc( (jpi+1)*(jpj+1), nind_i, nind_j )   ! integer 
     496      CALL wrk_alloc( (jpi+1)*(jpj+1), nind_i, nind_j ) 
    616497 
    617498      !---------------------------------------------------------------------------------------------- 
     
    620501 
    621502      DO jl = klbnd, kubnd 
    622          zaTsfn(:,:,jl) = a_i(:,:,jl)*t_su(:,:,jl) 
    623       END DO 
    624  
    625       !---------------------------------------------------------------------------------------------- 
    626       ! 2) Check for daice or dvice out of range, allowing for roundoff error 
    627       !---------------------------------------------------------------------------------------------- 
    628       ! Note: zdaice < 0 or zdvice < 0 usually happens when category jl 
    629       ! has a small area, with h(n) very close to a boundary.  Then 
    630       ! the coefficients of g(h) are large, and the computed daice and 
    631       ! dvice can be in error. If this happens, it is best to transfer 
    632       ! either the entire category or nothing at all, depending on which 
    633       ! side of the boundary hice(n) lies. 
    634       !----------------------------------------------------------------- 
    635       DO jl = klbnd, kubnd-1 
    636  
    637          zdaice_negative = .false. 
    638          zdvice_negative = .false. 
    639          zdaice_greater_aicen = .false. 
    640          zdvice_greater_vicen = .false. 
    641  
    642          DO jj = 1, jpj 
    643             DO ji = 1, jpi 
    644  
    645                IF (zdonor(ji,jj,jl) .GT. 0) THEN 
    646                   jl1 = zdonor(ji,jj,jl) 
    647  
    648                   IF (zdaice(ji,jj,jl) .LT. 0.0) THEN 
    649                      IF (zdaice(ji,jj,jl) .GT. -epsi10) THEN 
    650                         IF ( ( jl1.EQ.jl   .AND. ht_i(ji,jj,jl1) .GT. hi_max(jl) )           & 
    651                            .OR.                                      & 
    652                            ( jl1.EQ.jl+1 .AND. ht_i(ji,jj,jl1) .LE. hi_max(jl) )           &   
    653                            ) THEN                                                              
    654                            zdaice(ji,jj,jl) = a_i(ji,jj,jl1)  ! shift entire category 
    655                            zdvice(ji,jj,jl) = v_i(ji,jj,jl1) 
    656                         ELSE 
    657                            zdaice(ji,jj,jl) = 0.0 ! shift no ice 
    658                            zdvice(ji,jj,jl) = 0.0 
    659                         ENDIF 
    660                      ELSE 
    661                         zdaice_negative = .true. 
    662                      ENDIF 
    663                   ENDIF 
    664  
    665                   IF (zdvice(ji,jj,jl) .LT. 0.0) THEN 
    666                      IF (zdvice(ji,jj,jl) .GT. -epsi10 ) THEN 
    667                         IF ( ( jl1.EQ.jl .AND. ht_i(ji,jj,jl1).GT.hi_max(jl) )     & 
    668                            .OR.                                     & 
    669                            ( jl1.EQ.jl+1 .AND. ht_i(ji,jj,jl1) .LE. hi_max(jl) ) & 
    670                            ) THEN 
    671                            zdaice(ji,jj,jl) = a_i(ji,jj,jl1) ! shift entire category 
    672                            zdvice(ji,jj,jl) = v_i(ji,jj,jl1)  
    673                         ELSE 
    674                            zdaice(ji,jj,jl) = 0.0    ! shift no ice 
    675                            zdvice(ji,jj,jl) = 0.0 
    676                         ENDIF 
    677                      ELSE 
    678                         zdvice_negative = .true. 
    679                      ENDIF 
    680                   ENDIF 
    681  
    682                   ! If daice is close to aicen, set daice = aicen. 
    683                   IF (zdaice(ji,jj,jl) .GT. a_i(ji,jj,jl1) - epsi10 ) THEN 
    684                      IF (zdaice(ji,jj,jl) .LT. a_i(ji,jj,jl1)+epsi10) THEN 
    685                         zdaice(ji,jj,jl) = a_i(ji,jj,jl1) 
    686                         zdvice(ji,jj,jl) = v_i(ji,jj,jl1)  
    687                      ELSE 
    688                         zdaice_greater_aicen = .true. 
    689                      ENDIF 
    690                   ENDIF 
    691  
    692                   IF (zdvice(ji,jj,jl) .GT. v_i(ji,jj,jl1)-epsi10) THEN 
    693                      IF (zdvice(ji,jj,jl) .LT. v_i(ji,jj,jl1)+epsi10) THEN 
    694                         zdaice(ji,jj,jl) = a_i(ji,jj,jl1) 
    695                         zdvice(ji,jj,jl) = v_i(ji,jj,jl1)  
    696                      ELSE 
    697                         zdvice_greater_vicen = .true. 
    698                      ENDIF 
    699                   ENDIF 
    700  
    701                ENDIF               ! donor > 0 
    702             END DO                   ! i 
    703          END DO                 ! j 
    704  
    705       END DO !jl 
     503         zaTsfn(:,:,jl) = a_i(:,:,jl) * t_su(:,:,jl) 
     504      END DO 
    706505 
    707506      !------------------------------------------------------------------------------- 
    708       ! 3) Transfer volume and energy between categories 
     507      ! 2) Transfer volume and energy between categories 
    709508      !------------------------------------------------------------------------------- 
    710509 
     
    713512         DO jj = 1, jpj 
    714513            DO ji = 1, jpi 
    715                IF (zdaice(ji,jj,jl) .GT. 0.0 ) THEN ! daice(n) can be < puny 
     514               IF (zdaice(ji,jj,jl) > 0.0 ) THEN ! daice(n) can be < puny 
    716515                  nbrem = nbrem + 1 
    717516                  nind_i(nbrem) = ji 
    718517                  nind_j(nbrem) = jj 
    719                ENDIF ! tmask 
     518               ENDIF 
    720519            END DO 
    721520         END DO 
     
    726525 
    727526            jl1 = zdonor(ii,ij,jl) 
    728             zindb             = MAX( 0.0 , SIGN( 1.0 , v_i(ii,ij,jl1) - epsi10 ) ) 
    729             zworka(ii,ij)   = zdvice(ii,ij,jl) / MAX(v_i(ii,ij,jl1),epsi10) * zindb 
     527            rswitch       = MAX( 0._wp , SIGN( 1._wp , v_i(ii,ij,jl1) - epsi10 ) ) 
     528            zworka(ii,ij) = zdvice(ii,ij,jl) / MAX( v_i(ii,ij,jl1), epsi10 ) * rswitch 
    730529            IF( jl1 == jl) THEN   ;   jl2 = jl1+1 
    731             ELSE                    ;   jl2 = jl  
     530            ELSE                  ;   jl2 = jl  
    732531            ENDIF 
    733532 
     
    735534            ! Ice areas 
    736535            !-------------- 
    737  
    738536            a_i(ii,ij,jl1) = a_i(ii,ij,jl1) - zdaice(ii,ij,jl) 
    739537            a_i(ii,ij,jl2) = a_i(ii,ij,jl2) + zdaice(ii,ij,jl) 
     
    742540            ! Ice volumes 
    743541            !-------------- 
    744  
    745542            v_i(ii,ij,jl1) = v_i(ii,ij,jl1) - zdvice(ii,ij,jl)  
    746543            v_i(ii,ij,jl2) = v_i(ii,ij,jl2) + zdvice(ii,ij,jl) 
     
    749546            ! Snow volumes 
    750547            !-------------- 
    751  
    752548            zdvsnow        = v_s(ii,ij,jl1) * zworka(ii,ij) 
    753549            v_s(ii,ij,jl1) = v_s(ii,ij,jl1) - zdvsnow 
     
    757553            ! Snow heat content   
    758554            !-------------------- 
    759  
    760555            zdesnow            = e_s(ii,ij,1,jl1) * zworka(ii,ij) 
    761556            e_s(ii,ij,1,jl1)   = e_s(ii,ij,1,jl1) - zdesnow 
     
    765560            ! Ice age  
    766561            !-------------- 
    767  
    768562            zdo_aice           = oa_i(ii,ij,jl1) * zdaice(ii,ij,jl) 
    769563            oa_i(ii,ij,jl1)    = oa_i(ii,ij,jl1) - zdo_aice 
     
    773567            ! Ice salinity 
    774568            !-------------- 
    775  
    776569            zdsm_vice          = smv_i(ii,ij,jl1) * zworka(ii,ij) 
    777570            smv_i(ii,ij,jl1)   = smv_i(ii,ij,jl1) - zdsm_vice 
     
    781574            ! Surface temperature 
    782575            !--------------------- 
    783  
    784576            zdaTsf             = t_su(ii,ij,jl1) * zdaice(ii,ij,jl) 
    785577            zaTsfn(ii,ij,jl1)  = zaTsfn(ii,ij,jl1) - zdaTsf 
    786578            zaTsfn(ii,ij,jl2)  = zaTsfn(ii,ij,jl2) + zdaTsf  
    787579 
    788          END DO                 ! ji 
     580         END DO 
    789581 
    790582         !------------------ 
     
    793585 
    794586         DO jk = 1, nlay_i 
    795 !CDIR NODEP 
    796587            DO ji = 1, nbrem 
    797588               ii = nind_i(ji) 
     
    799590 
    800591               jl1 = zdonor(ii,ij,jl) 
    801                IF (jl1 .EQ. jl) THEN 
     592               IF (jl1 == jl) THEN 
    802593                  jl2 = jl+1 
    803594               ELSE             ! n1 = n+1 
     
    808599               e_i(ii,ij,jk,jl1) =  e_i(ii,ij,jk,jl1) - zdeice 
    809600               e_i(ii,ij,jk,jl2) =  e_i(ii,ij,jk,jl2) + zdeice  
    810             END DO              ! ji 
    811          END DO                 ! jk 
     601            END DO 
     602         END DO 
    812603 
    813604      END DO                   ! boundaries, 1 to ncat-1 
     
    823614                  ht_i(ji,jj,jl)  =  v_i   (ji,jj,jl) / a_i(ji,jj,jl)  
    824615                  t_su(ji,jj,jl)  =  zaTsfn(ji,jj,jl) / a_i(ji,jj,jl)  
    825                   zindsn          =  1.0 - MAX(0.0,SIGN(1.0,-v_s(ji,jj,jl)+epsi10)) !0 if no ice and 1 if yes 
    826616               ELSE 
    827617                  ht_i(ji,jj,jl)  = 0._wp 
    828                   t_su(ji,jj,jl)  = rtt 
     618                  t_su(ji,jj,jl)  = rt0 
    829619               ENDIF 
    830             END DO                 ! ji 
    831          END DO                 ! jj 
    832       END DO                    ! jl 
     620            END DO 
     621         END DO 
     622      END DO 
    833623      ! 
    834624      CALL wrk_dealloc( jpi,jpj,jpl, zaTsfn ) 
    835625      CALL wrk_dealloc( jpi,jpj, zworka ) 
    836       CALL wrk_dealloc( (jpi+1)*(jpj+1), nind_i, nind_j )   ! integer 
     626      CALL wrk_dealloc( (jpi+1)*(jpj+1), nind_i, nind_j ) 
    837627      ! 
    838628   END SUBROUTINE lim_itd_shiftice 
    839629    
    840630 
    841    SUBROUTINE lim_itd_th_reb( klbnd, kubnd, ntyp ) 
     631   SUBROUTINE lim_itd_th_reb( klbnd, kubnd ) 
    842632      !!------------------------------------------------------------------ 
    843633      !!                ***  ROUTINE lim_itd_th_reb *** 
     
    849639      INTEGER , INTENT (in) ::   klbnd   ! Start thickness category index point 
    850640      INTEGER , INTENT (in) ::   kubnd   ! End point on which the  the computation is applied 
    851       INTEGER , INTENT (in) ::   ntyp    ! number of the ice type involved in the rebinning process 
    852641      ! 
    853642      INTEGER ::   ji,jj, jl   ! dummy loop indices 
     
    861650      REAL(wp), POINTER, DIMENSION(:,:) ::   vt_s_init, vt_s_final   ! snow volume summed over categories 
    862651      !!------------------------------------------------------------------ 
    863       !! clem 2014/04: be carefull, rebining does not conserve salt(maybe?) => the difference is taken into account in limupdate 
    864652       
    865653      CALL wrk_alloc( jpi,jpj,jpl, zdonor )   ! interger 
     
    879667         DO jj = 1, jpj 
    880668            DO ji = 1, jpi  
    881                IF( a_i(ji,jj,jl) > epsi10 ) THEN  
    882                   ht_i(ji,jj,jl) = v_i(ji,jj,jl) / a_i(ji,jj,jl) 
    883                ELSE 
    884                   ht_i(ji,jj,jl) = 0._wp 
    885                ENDIF 
     669               rswitch = MAX( 0._wp , SIGN( 1._wp, a_i(ji,jj,jl) - epsi10 ) ) 
     670               ht_i(ji,jj,jl) = v_i (ji,jj,jl) / MAX( a_i(ji,jj,jl) , epsi10 ) * rswitch 
    886671            END DO 
    887672         END DO 
     
    889674 
    890675      !------------------------------------------------------------------------------ 
    891       ! 2) Make sure thickness of cat klbnd is at least hi_max_typ(klbnd) 
    892       !------------------------------------------------------------------------------ 
    893       DO jj = 1, jpj  
    894          DO ji = 1, jpi  
    895             IF( a_i(ji,jj,klbnd) > epsi10 ) THEN 
    896                IF( ht_i(ji,jj,klbnd) <= hi_max_typ(0,ntyp) .AND. hi_max_typ(0,ntyp) > 0._wp ) THEN 
    897                   a_i(ji,jj,klbnd)  = v_i(ji,jj,klbnd) / hi_max_typ(0,ntyp)  
    898                   ht_i(ji,jj,klbnd) = hi_max_typ(0,ntyp) 
    899                ENDIF 
    900             ENDIF 
    901          END DO 
    902       END DO 
    903  
    904       !------------------------------------------------------------------------------ 
    905       ! 3) If a category thickness is not in bounds, shift the 
     676      ! 2) If a category thickness is not in bounds, shift the 
    906677      ! entire area, volume, and energy to the neighboring category 
    907678      !------------------------------------------------------------------------------ 
     
    932703                  zdonor(ji,jj,jl)  = jl  
    933704                  ! begin TECLIM change 
    934                   !zdaice(ji,jj,jl)  = a_i(ji,jj,jl) 
    935                   !zdvice(ji,jj,jl)  = v_i(ji,jj,jl) 
    936705                  !zdaice(ji,jj,jl)  = a_i(ji,jj,jl) * 0.5_wp 
    937706                  !zdvice(ji,jj,jl)  = v_i(ji,jj,jl)-zdaice(ji,jj,jl)*(hi_max(jl)+hi_max(jl-1)) * 0.5_wp 
    938707                  ! end TECLIM change  
    939708                  ! clem: how much of a_i you send in cat sup is somewhat arbitrary 
    940                   zdaice(ji,jj,jl)  = a_i(ji,jj,jl) * ( ht_i(ji,jj,jl) - hi_max(jl) + epsi10 ) / ht_i(ji,jj,jl)   
    941                   zdvice(ji,jj,jl)  = v_i(ji,jj,jl) - ( a_i(ji,jj,jl) - zdaice(ji,jj,jl) ) * ( hi_max(jl) - epsi10 ) 
     709                  zdaice(ji,jj,jl)  = a_i(ji,jj,jl) * ( ht_i(ji,jj,jl) - hi_max(jl) + epsi20 ) / ht_i(ji,jj,jl)   
     710                  zdvice(ji,jj,jl)  = v_i(ji,jj,jl) - ( a_i(ji,jj,jl) - zdaice(ji,jj,jl) ) * ( hi_max(jl) - epsi20 ) 
    942711               ENDIF 
    943             END DO                 ! ji 
    944          END DO                 ! jj 
     712            END DO 
     713         END DO 
    945714         IF(lk_mpp)   CALL mpp_max( zshiftflag ) 
    946715 
     
    953722         ENDIF 
    954723         ! 
    955       END DO                    ! jl 
     724      END DO 
    956725 
    957726      !---------------------------- 
     
    966735         zshiftflag = 0 
    967736 
    968 !clem-change 
    969737         DO jj = 1, jpj 
    970738            DO ji = 1, jpi 
     
    976744                  zdvice(ji,jj,jl) = v_i(ji,jj,jl+1) 
    977745               ENDIF 
    978             END DO                 ! ji 
    979          END DO                 ! jj 
     746            END DO 
     747         END DO 
    980748 
    981749         IF(lk_mpp)   CALL mpp_max( zshiftflag ) 
     
    988756            zdvice(:,:,jl) = 0._wp 
    989757         ENDIF 
    990 !clem-change 
    991  
    992 !         ! clem-change begin: why not doing that? 
    993 !         DO jj = 1, jpj 
    994 !            DO ji = 1, jpi 
    995 !               IF( a_i(ji,jj,jl+1) > epsi10 .AND. ht_i(ji,jj,jl+1) <= hi_max(jl) ) THEN 
    996 !                  ht_i(ji,jj,jl+1) = hi_max(jl) + epsi10 
    997 !                  a_i (ji,jj,jl+1) = v_i(ji,jj,jl+1) / ht_i(ji,jj,jl+1)  
    998 !               ENDIF 
    999 !            END DO                 ! ji 
    1000 !         END DO                 ! jj 
    1001          ! clem-change end 
    1002  
    1003       END DO                    ! jl 
     758 
     759      END DO 
    1004760 
    1005761      !------------------------------------------------------------------------------ 
    1006       ! 4) Conservation check 
     762      ! 3) Conservation check 
    1007763      !------------------------------------------------------------------------------ 
    1008764 
     
    1017773      ENDIF 
    1018774      ! 
    1019       CALL wrk_dealloc( jpi,jpj,jpl, zdonor )   ! interger 
     775      CALL wrk_dealloc( jpi,jpj,jpl, zdonor ) 
    1020776      CALL wrk_dealloc( jpi,jpj,jpl, zdaice, zdvice ) 
    1021777      CALL wrk_dealloc( jpi,jpj, vt_i_init, vt_i_final, vt_s_init, vt_s_final ) 
     
    1028784   !!---------------------------------------------------------------------- 
    1029785CONTAINS 
    1030    SUBROUTINE lim_itd_th           ! Empty routines 
    1031    END SUBROUTINE lim_itd_th 
    1032    SUBROUTINE lim_itd_th_ini 
    1033    END SUBROUTINE lim_itd_th_ini 
    1034786   SUBROUTINE lim_itd_th_rem 
    1035787   END SUBROUTINE lim_itd_th_rem 
Note: See TracChangeset for help on using the changeset viewer.