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 5837 for branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/LIM_SRC_3/limitd_th.F90 – NEMO

Ignore:
Timestamp:
2015-10-26T15:59:39+01:00 (9 years ago)
Author:
timgraham
Message:

Upgraded to r5518 of trunk (NEMO 3.6 stable)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/LIM_SRC_3/limitd_th.F90

    r4333 r5837  
    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 
     32   USE limcons          ! conservation tests 
    3733 
    3834   IMPLICIT NONE 
    3935   PRIVATE 
    4036 
    41    PUBLIC   lim_itd_th         ! called by ice_stp 
    4237   PUBLIC   lim_itd_th_rem 
    4338   PUBLIC   lim_itd_th_reb 
    44    PUBLIC   lim_itd_fitline 
    45    PUBLIC   lim_itd_shiftice 
    46  
    47    REAL(wp) ::   epsi10 = 1.e-10_wp   ! 
    48    REAL(wp) ::   epsi06 = 1.e-6_wp   ! 
    4939 
    5040   !!---------------------------------------------------------------------- 
     
    5545CONTAINS 
    5646 
    57    SUBROUTINE lim_itd_th( kt ) 
    58       !!------------------------------------------------------------------ 
    59       !!                ***  ROUTINE lim_itd_th *** 
    60       !! 
    61       !! ** Purpose :   computes the thermodynamics of ice thickness distribution 
    62       !! 
    63       !! ** Method  : 
    64       !!------------------------------------------------------------------ 
    65       INTEGER, INTENT(in) ::   kt   ! time step index 
    66       ! 
    67       INTEGER ::   jl, ja, jm, jbnd1, jbnd2   ! ice types    dummy loop index          
    68       REAL(wp) :: zchk_v_i, zchk_smv, zchk_fs, zchk_fw, zchk_v_i_b, zchk_smv_b, zchk_fs_b, zchk_fw_b ! Check conservation (C Rousset) 
    69       REAL(wp) :: zchk_vmin, zchk_amin, zchk_amax ! Check errors (C Rousset) 
    70       !!------------------------------------------------------------------ 
    71       IF( nn_timing == 1 )  CALL timing_start('limitd_th') 
    72  
    73       ! ------------------------------- 
    74       !- check conservation (C Rousset) 
    75       IF (ln_limdiahsb) THEN 
    76          zchk_v_i_b = glob_sum( SUM(   v_i(:,:,:), dim=3 ) * area(:,:) * tms(:,:) ) 
    77          zchk_smv_b = glob_sum( SUM( smv_i(:,:,:), dim=3 ) * area(:,:) * tms(:,:) ) 
    78          zchk_fw_b  = glob_sum( rdm_ice(:,:) * area(:,:) * tms(:,:) ) 
    79          zchk_fs_b  = glob_sum( ( sfx_bri(:,:) + sfx_thd(:,:) + sfx_res(:,:) + sfx_mec(:,:) ) * area(:,:) * tms(:,:) ) 
    80        ENDIF 
    81       !- check conservation (C Rousset) 
    82       ! ------------------------------- 
    83  
    84       IF( kt == nit000 .AND. lwp ) THEN 
    85          WRITE(numout,*) 
    86          WRITE(numout,*) 'lim_itd_th  : Thermodynamics of the ice thickness distribution' 
    87          WRITE(numout,*) '~~~~~~~~~~~' 
    88       ENDIF 
    89  
    90       !------------------------------------------------------------------------------| 
    91       !  1) Transport of ice between thickness categories.                           | 
    92       !------------------------------------------------------------------------------| 
    93       ! Given thermodynamic growth rates, transport ice between 
    94       ! thickness categories. 
    95       DO jm = 1, jpm 
    96          jbnd1 = ice_cat_bounds(jm,1) 
    97          jbnd2 = ice_cat_bounds(jm,2) 
    98          IF( ice_ncat_types(jm) > 1 )   CALL lim_itd_th_rem( jbnd1, jbnd2, jm, kt ) 
    99       END DO 
    100       ! 
    101       CALL lim_var_glo2eqv    ! only for info 
    102       CALL lim_var_agg(1) 
    103  
    104       !------------------------------------------------------------------------------| 
    105       !  3) Add frazil ice growing in leads. 
    106       !------------------------------------------------------------------------------| 
    107  
    108       CALL lim_thd_lac 
    109       CALL lim_var_glo2eqv    ! only for info 
    110  
    111      IF(ln_ctl) THEN   ! Control print 
    112          CALL prt_ctl_info(' ') 
    113          CALL prt_ctl_info(' - Cell values : ') 
    114          CALL prt_ctl_info('   ~~~~~~~~~~~~~ ') 
    115          CALL prt_ctl(tab2d_1=area , clinfo1=' lim_itd_th  : cell area :') 
    116          CALL prt_ctl(tab2d_1=at_i , clinfo1=' lim_itd_th  : at_i      :') 
    117          CALL prt_ctl(tab2d_1=vt_i , clinfo1=' lim_itd_th  : vt_i      :') 
    118          CALL prt_ctl(tab2d_1=vt_s , clinfo1=' lim_itd_th  : vt_s      :') 
    119          DO jl = 1, jpl 
    120             CALL prt_ctl_info(' ') 
    121             CALL prt_ctl_info(' - Category : ', ivar1=jl) 
    122             CALL prt_ctl_info('   ~~~~~~~~~~') 
    123             CALL prt_ctl(tab2d_1=a_i   (:,:,jl)   , clinfo1= ' lim_itd_th  : a_i      : ') 
    124             CALL prt_ctl(tab2d_1=ht_i  (:,:,jl)   , clinfo1= ' lim_itd_th  : ht_i     : ') 
    125             CALL prt_ctl(tab2d_1=ht_s  (:,:,jl)   , clinfo1= ' lim_itd_th  : ht_s     : ') 
    126             CALL prt_ctl(tab2d_1=v_i   (:,:,jl)   , clinfo1= ' lim_itd_th  : v_i      : ') 
    127             CALL prt_ctl(tab2d_1=v_s   (:,:,jl)   , clinfo1= ' lim_itd_th  : v_s      : ') 
    128             CALL prt_ctl(tab2d_1=e_s   (:,:,1,jl) , clinfo1= ' lim_itd_th  : e_s      : ') 
    129             CALL prt_ctl(tab2d_1=t_su  (:,:,jl)   , clinfo1= ' lim_itd_th  : t_su     : ') 
    130             CALL prt_ctl(tab2d_1=t_s   (:,:,1,jl) , clinfo1= ' lim_itd_th  : t_snow   : ') 
    131             CALL prt_ctl(tab2d_1=sm_i  (:,:,jl)   , clinfo1= ' lim_itd_th  : sm_i     : ') 
    132             CALL prt_ctl(tab2d_1=smv_i (:,:,jl)   , clinfo1= ' lim_itd_th  : smv_i    : ') 
    133             DO ja = 1, nlay_i 
    134                CALL prt_ctl_info(' ') 
    135                CALL prt_ctl_info(' - Layer : ', ivar1=ja) 
    136                CALL prt_ctl_info('   ~~~~~~~') 
    137                CALL prt_ctl(tab2d_1=t_i(:,:,ja,jl) , clinfo1= ' lim_itd_th  : t_i      : ') 
    138                CALL prt_ctl(tab2d_1=e_i(:,:,ja,jl) , clinfo1= ' lim_itd_th  : e_i      : ') 
    139             END DO 
    140          END DO 
    141       ENDIF 
    142       ! 
    143       ! ------------------------------- 
    144       !- check conservation (C Rousset) 
    145       IF( ln_limdiahsb ) THEN 
    146          zchk_fs  = glob_sum( ( sfx_bri(:,:) + sfx_thd(:,:) + sfx_res(:,:) + sfx_mec(:,:) ) * area(:,:) * tms(:,:) ) - zchk_fs_b 
    147          zchk_fw  = glob_sum( rdm_ice(:,:) * area(:,:) * tms(:,:) ) - zchk_fw_b 
    148   
    149          zchk_v_i = ( glob_sum( SUM(   v_i(:,:,:), dim=3 ) * area(:,:) * tms(:,:) ) - zchk_v_i_b - ( zchk_fw / rhoic ) ) * r1_rdtice 
    150          zchk_smv = ( glob_sum( SUM( smv_i(:,:,:), dim=3 ) * area(:,:) * tms(:,:) ) - zchk_smv_b ) * r1_rdtice + ( zchk_fs / rhoic ) 
    151  
    152          zchk_vmin = glob_min(v_i) 
    153          zchk_amax = glob_max(SUM(a_i,dim=3)) 
    154          zchk_amin = glob_min(a_i) 
    155  
    156          IF(lwp) THEN 
    157             IF ( ABS( zchk_v_i   ) >  1.e-5 ) WRITE(numout,*) 'violation volume [m3/day]     (limitd_th) = ',(zchk_v_i * rday) 
    158             IF ( ABS( zchk_smv   ) >  1.e-4 ) WRITE(numout,*) 'violation saline [psu*m3/day] (limitd_th) = ',(zchk_smv * rday) 
    159             IF ( zchk_vmin <  0.            ) WRITE(numout,*) 'violation v_i<0  [mm]         (limitd_th) = ',(zchk_vmin * 1.e-3) 
    160             IF ( zchk_amax >  amax+epsi10   ) WRITE(numout,*) 'violation a_i>amax            (limitd_th) = ',zchk_amax 
    161             IF ( zchk_amin <  0.            ) WRITE(numout,*) 'violation a_i<0               (limitd_th) = ',zchk_amin 
    162          ENDIF 
    163        ENDIF 
    164       !- check conservation (C Rousset) 
    165       ! ------------------------------- 
    166       ! 
    167      IF( nn_timing == 1 )  CALL timing_stop('limitd_th') 
    168    END SUBROUTINE lim_itd_th 
    169    ! 
    170  
    171    SUBROUTINE lim_itd_th_rem( klbnd, kubnd, ntyp, kt ) 
     47   SUBROUTINE lim_itd_th_rem( klbnd, kubnd, kt ) 
    17248      !!------------------------------------------------------------------ 
    17349      !!                ***  ROUTINE lim_itd_th_rem *** 
     
    18258      INTEGER , INTENT (in) ::   klbnd   ! Start thickness category index point 
    18359      INTEGER , INTENT (in) ::   kubnd   ! End point on which the  the computation is applied 
    184       INTEGER , INTENT (in) ::   ntyp    ! Number of the type used 
    18560      INTEGER , INTENT (in) ::   kt      ! Ocean time step  
    18661      ! 
     
    19065      REAL(wp) ::   zx1, zwk1, zdh0, zetamin, zdamax   ! local scalars 
    19166      REAL(wp) ::   zx2, zwk2, zda0, zetamax           !   -      - 
    192       REAL(wp) ::   zx3,             zareamin, zindb   !   -      - 
     67      REAL(wp) ::   zx3         
    19368      CHARACTER (len = 15) :: fieldid 
    19469 
     
    20075      REAL(wp), POINTER, DIMENSION(:,:,:) ::   hL          ! left boundary for the ITD for each thickness 
    20176      REAL(wp), POINTER, DIMENSION(:,:,:) ::   hR          ! left boundary for the ITD for each thickness 
    202       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zht_i_o     ! old ice thickness 
     77      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zht_i_b     ! old ice thickness 
    20378      REAL(wp), POINTER, DIMENSION(:,:,:) ::   dummy_es 
    20479      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zdaice, zdvice          ! local increment of ice area and volume 
     
    21691      !!------------------------------------------------------------------ 
    21792 
    218       CALL wrk_alloc( jpi,jpj, zremap_flag )    ! integer 
    219       CALL wrk_alloc( jpi,jpj,jpl-1, zdonor )   ! integer 
    220       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 ) 
    22196      CALL wrk_alloc( jpi,jpj,jpl-1, zdaice, zdvice )    
    22297      CALL wrk_alloc( jpi,jpj,jpl+1, zhbnew, kkstart = 0 )    
    22398      CALL wrk_alloc( (jpi+1)*(jpj+1), zvetamin, zvetamax )    
    224       CALL wrk_alloc( (jpi+1)*(jpj+1), nind_i, nind_j )   ! integer  
     99      CALL wrk_alloc( (jpi+1)*(jpj+1), nind_i, nind_j )  
    225100      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 ) 
    226  
    227       zareamin = epsi10   !minimum area in thickness categories tolerated by the conceptors of the model 
    228101 
    229102      !!---------------------------------------------------------------------------------------------- 
     
    247120         WRITE(numout,*) ' klbnd :       ', klbnd 
    248121         WRITE(numout,*) ' kubnd :       ', kubnd 
    249          WRITE(numout,*) ' ntyp  :       ', ntyp  
    250122      ENDIF 
    251123 
     
    254126         DO jj = 1, jpj 
    255127            DO ji = 1, jpi 
    256                zindb             = 1.0 - MAX( 0.0, SIGN( 1.0, - a_i(ji,jj,jl) + epsi10 ) )     !0 if no ice and 1 if yes 
    257                ht_i(ji,jj,jl)    = v_i(ji,jj,jl) / MAX( a_i(ji,jj,jl), epsi10 ) * zindb 
    258                zindb             = 1.0 - MAX( 0.0, SIGN( 1.0, - old_a_i(ji,jj,jl) + epsi10) ) !0 if no ice and 1 if yes 
    259                zht_i_o(ji,jj,jl) = old_v_i(ji,jj,jl) / MAX( old_a_i(ji,jj,jl), epsi10 ) * zindb 
    260                IF( a_i(ji,jj,jl) > epsi06 )   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?  
    261133            END DO 
    262134         END DO 
     
    277149      DO jj = 1, jpj 
    278150         DO ji = 1, jpi 
    279             IF ( at_i(ji,jj) .gt. zareamin ) THEN 
     151            IF ( at_i(ji,jj) > epsi10 ) THEN 
    280152               nbrem         = nbrem + 1 
    281153               nind_i(nbrem) = ji 
     
    285157               zremap_flag(ji,jj) = 0 
    286158            ENDIF 
    287          END DO !ji 
    288       END DO !jj 
     159         END DO 
     160      END DO 
    289161 
    290162      !----------------------------------------------------------------------------------------------- 
     
    292164      !----------------------------------------------------------------------------------------------- 
    293165      !- 4.1 Compute category boundaries 
    294       ! Tricky trick see limitd_me.F90 
    295       ! will be soon removed, CT 
    296       ! hi_max(kubnd) = 99. 
    297166      zhbnew(:,:,:) = 0._wp 
    298167 
     
    302171            ij = nind_j(ji) 
    303172            ! 
    304             IF ( ( zht_i_o(ii,ij,jl) .GT. epsi10 ) .AND. &  
    305                ( zht_i_o(ii,ij,jl+1) .GT. epsi10 ) ) THEN 
     173            zhbnew(ii,ij,jl) = hi_max(jl) 
     174            IF    ( a_i_b(ii,ij,jl) > epsi10 .AND. a_i_b(ii,ij,jl+1) > epsi10 ) THEN 
    306175               !interpolate between adjacent category growth rates 
    307                zslope = ( zdhice(ii,ij,jl+1)     - zdhice(ii,ij,jl) ) / & 
    308                   ( zht_i_o   (ii,ij,jl+1) - zht_i_o   (ii,ij,jl) ) 
    309                zhbnew(ii,ij,jl) = hi_max(jl) + zdhice(ii,ij,jl) + & 
    310                   zslope * ( hi_max(jl) - zht_i_o(ii,ij,jl) ) 
    311             ELSEIF (zht_i_o(ii,ij,jl).gt.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 
    312179               zhbnew(ii,ij,jl) = hi_max(jl) + zdhice(ii,ij,jl) 
    313             ELSEIF (zht_i_o(ii,ij,jl+1).gt.epsi10) THEN 
     180            ELSEIF( a_i_b(ii,ij,jl+1) > epsi10) THEN 
    314181               zhbnew(ii,ij,jl) = hi_max(jl) + zdhice(ii,ij,jl+1) 
    315             ELSE 
    316                zhbnew(ii,ij,jl) = hi_max(jl) 
    317182            ENDIF 
    318183         END DO 
     
    320185         !- 4.2 Check that each zhbnew lies between adjacent values of ice thickness 
    321186         DO ji = 1, nbrem 
    322             ! jl, ji 
    323187            ii = nind_i(ji) 
    324188            ij = nind_j(ji) 
    325             ! jl, ji 
    326             IF ( ( a_i(ii,ij,jl) .GT.epsi10) .AND. &  
    327                ( ht_i(ii,ij,jl).GE. zhbnew(ii,ij,jl) ) & 
    328               ) 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 
    329193               zremap_flag(ii,ij) = 0 
    330             ELSEIF ( ( a_i(ii,ij,jl+1) .GT. epsi10 ) .AND. & 
    331                ( ht_i(ii,ij,jl+1).LE. zhbnew(ii,ij,jl) ) & 
    332                ) THEN 
     194            ELSEIF( a_i(ii,ij,jl+1) > epsi10 .AND. ht_i(ii,ij,jl+1) < ( zhbnew(ii,ij,jl) + epsi10 ) ) THEN 
    333195               zremap_flag(ii,ij) = 0 
    334196            ENDIF 
    335197 
    336198            !- 4.3 Check that each zhbnew does not exceed maximal values hi_max   
    337             ! jl, ji 
    338             IF (zhbnew(ii,ij,jl).gt.hi_max(jl+1)) THEN 
    339                zremap_flag(ii,ij) = 0 
    340             ENDIF 
    341             ! jl, ji 
    342             IF (zhbnew(ii,ij,jl).lt.hi_max(jl-1)) THEN 
    343                zremap_flag(ii,ij) = 0 
    344             ENDIF 
    345             ! jl, ji 
    346          END DO !ji 
    347          ! ji 
    348       END DO !jl 
     199            IF( zhbnew(ii,ij,jl) < hi_max(jl-1) ) zremap_flag(ii,ij) = 0 
     200            IF( zhbnew(ii,ij,jl) > hi_max(jl+1) ) zremap_flag(ii,ij) = 0 
     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 
    349208 
    350209      !----------------------------------------------------------------------------------------------- 
     
    354213      DO jj = 1, jpj 
    355214         DO ji = 1, jpi 
    356             IF ( zremap_flag(ji,jj) == 1 ) THEN 
     215            IF( zremap_flag(ji,jj) == 1 ) THEN 
    357216               nbrem         = nbrem + 1 
    358217               nind_i(nbrem) = ji 
    359218               nind_j(nbrem) = jj 
    360219            ENDIF 
    361          END DO !ji 
    362       END DO !jj 
     220         END DO  
     221      END DO  
    363222 
    364223      !----------------------------------------------------------------------------------------------- 
     
    367226      DO jj = 1, jpj 
    368227         DO ji = 1, jpi 
    369             zhb0(ji,jj) = hi_max_typ(0,ntyp) ! 0eme 
    370             zhb1(ji,jj) = hi_max_typ(1,ntyp) ! 1er 
    371  
    372             zhbnew(ji,jj,klbnd-1) = 0._wp 
     228            zhb0(ji,jj) = hi_max(0) 
     229            zhb1(ji,jj) = hi_max(1) 
    373230 
    374231            IF( a_i(ji,jj,kubnd) > epsi10 ) THEN 
    375                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) ) 
    376233            ELSE 
    377                zhbnew(ji,jj,kubnd) = hi_max(kubnd)   
    378                !!? clem bug: since hi_max(jpl)=99, this limit is very high  
    379                !!? but I think it is erased in fitline subroutine  
    380             ENDIF 
    381  
    382             IF( zhbnew(ji,jj,kubnd) < hi_max(kubnd-1) )   zhbnew(ji,jj,kubnd) = hi_max(kubnd-1) 
    383  
    384          END DO !jj 
    385       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 
    386248 
    387249      !----------------------------------------------------------------------------------------------- 
     
    389251      !----------------------------------------------------------------------------------------------- 
    390252      !- 7.1 g(h) for category 1 at start of time step 
    391       CALL lim_itd_fitline( klbnd, zhb0, zhb1, zht_i_o(:,:,klbnd),         & 
    392          &                  g0(:,:,klbnd), g1(:,:,klbnd), hL(:,:,klbnd),   & 
     253      CALL lim_itd_fitline( klbnd, zhb0, zhb1, zht_i_b(:,:,klbnd), g0(:,:,klbnd), g1(:,:,klbnd), hL(:,:,klbnd),   & 
    393254         &                  hR(:,:,klbnd), zremap_flag ) 
    394255 
     
    398259         ij = nind_j(ji)  
    399260 
    400          !ji 
    401          IF (a_i(ii,ij,klbnd) .gt. epsi10) THEN 
     261         IF( a_i(ii,ij,klbnd) > epsi10 ) THEN 
     262 
    402263            zdh0 = zdhice(ii,ij,klbnd) !decrease of ice thickness in the lower category 
    403             ! ji, a_i > epsi10 
    404             IF (zdh0 .lt. 0.0) THEN !remove area from category 1 
    405                ! ji, a_i > epsi10; zdh0 < 0 
    406                zdh0 = MIN(-zdh0,hi_max(klbnd)) 
    407  
     264 
     265            IF( zdh0 < 0.0 ) THEN      !remove area from category 1 
     266               zdh0 = MIN( -zdh0, hi_max(klbnd) ) 
    408267               !Integrate g(1) from 0 to dh0 to estimate area melted 
    409                zetamax = MIN(zdh0,hR(ii,ij,klbnd)) - hL(ii,ij,klbnd) 
    410                IF (zetamax.gt.0.0) THEN 
    411                   zx1  = zetamax 
    412                   zx2  = 0.5 * zetamax*zetamax  
    413                   zda0 = g1(ii,ij,klbnd) * zx2 + g0(ii,ij,klbnd) * zx1 !ice area removed 
    414                   ! Constrain new thickness <= ht_i 
    415                   zdamax = a_i(ii,ij,klbnd) * &  
    416                      (1.0 - ht_i(ii,ij,klbnd)/zht_i_o(ii,ij,klbnd)) ! zdamax > 0 
    417                   !ice area lost due to melting of thin ice 
    418                   zda0   = MIN(zda0, zdamax) 
    419  
     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) 
    420277                  ! Remove area, conserving volume 
    421                   ht_i(ii,ij,klbnd) = ht_i(ii,ij,klbnd) &  
    422                      * 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 ) 
    423279                  a_i(ii,ij,klbnd)  = a_i(ii,ij,klbnd) - zda0 
    424                   v_i(ii,ij,klbnd)  = a_i(ii,ij,klbnd)*ht_i(ii,ij,klbnd) ! clem-useless ? 
    425                ENDIF     ! zetamax > 0 
    426                ! ji, a_i > epsi10 
    427  
    428             ELSE ! if ice accretion 
    429                ! ji, a_i > epsi10; zdh0 > 0 
    430                IF ( ntyp .EQ. 1 ) zhbnew(ii,ij,klbnd-1) = MIN(zdh0,hi_max(klbnd))  
    431                ! zhbnew was 0, and is shifted to the right to account for thin ice 
    432                ! growth in openwater (F0 = f1) 
    433                IF ( ntyp .NE. 1 ) zhbnew(ii,ij,0) = 0  
    434                ! in other types there is 
    435                ! no open water growth (F0 = 0) 
    436             ENDIF ! zdh0  
    437  
    438             ! a_i > epsi10 
    439          ENDIF ! a_i > epsi10 
    440  
    441       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 
    442291 
    443292      !- 7.3 g(h) for each thickness category   
    444293      DO jl = klbnd, kubnd 
    445          CALL lim_itd_fitline(jl, zhbnew(:,:,jl-1), zhbnew(:,:,jl), ht_i(:,:,jl), & 
    446             g0(:,:,jl), g1(:,:,jl), hL(:,:,jl), hR(:,:,jl),     & 
    447             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 ) 
    448296      END DO 
    449297 
     
    465313            ij = nind_j(ji) 
    466314 
    467             IF (zhbnew(ii,ij,jl) .gt. hi_max(jl)) THEN ! transfer from jl to jl+1 
    468  
     315            IF (zhbnew(ii,ij,jl) > hi_max(jl)) THEN ! transfer from jl to jl+1 
    469316               ! left and right integration limits in eta space 
    470                zvetamin(ji) = MAX(hi_max(jl), hL(ii,ij,jl)) - hL(ii,ij,jl) 
    471                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) 
    472319               zdonor(ii,ij,jl) = jl 
    473320 
    474             ELSE  ! zhbnew(jl) <= hi_max(jl) ; transfer from jl+1 to jl 
    475  
     321            ELSE                                    ! zhbnew(jl) <= hi_max(jl) ; transfer from jl+1 to jl 
    476322               ! left and right integration limits in eta space 
    477323               zvetamin(ji) = 0.0 
    478                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) 
    479325               zdonor(ii,ij,jl) = jl + 1 
    480326 
    481             ENDIF  ! zhbnew(jl) > hi_max(jl) 
    482  
    483             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 
    484330            zetamin = zvetamin(ji) 
    485331 
    486332            zx1  = zetamax - zetamin 
    487             zwk1 = zetamin*zetamin 
    488             zwk2 = zetamax*zetamax 
    489             zx2  = 0.5 * (zwk2 - zwk1) 
     333            zwk1 = zetamin * zetamin 
     334            zwk2 = zetamax * zetamax 
     335            zx2  = 0.5 * ( zwk2 - zwk1 ) 
    490336            zwk1 = zwk1 * zetamin 
    491337            zwk2 = zwk2 * zetamax 
    492             zx3  = 1.0/3.0 * (zwk2 - zwk1) 
     338            zx3  = 1.0 / 3.0 * ( zwk2 - zwk1 ) 
    493339            nd   = zdonor(ii,ij,jl) 
    494340            zdaice(ii,ij,jl) = g1(ii,ij,nd)*zx2 + g0(ii,ij,nd)*zx1 
    495             zdvice(ii,ij,jl) = g1(ii,ij,nd)*zx3 + g0(ii,ij,nd)*zx2 + & 
    496                zdaice(ii,ij,jl)*hL(ii,ij,nd) 
    497  
    498          END DO ! ji 
    499       END DO ! jl klbnd -> kubnd - 1 
     341            zdvice(ii,ij,jl) = g1(ii,ij,nd)*zx3 + g0(ii,ij,nd)*zx2 + zdaice(ii,ij,jl)*hL(ii,ij,nd) 
     342 
     343         END DO 
     344      END DO 
    500345 
    501346      !!---------------------------------------------------------------------------------------------- 
     
    511356         ii = nind_i(ji) 
    512357         ij = nind_j(ji) 
    513          IF ( ( a_i(ii,ij,1) > epsi10 ) .AND. ( ht_i(ii,ij,1) < hiclim ) ) THEN 
    514             a_i(ii,ij,1)  = a_i(ii,ij,1) * ht_i(ii,ij,1) / hiclim  
    515             ht_i(ii,ij,1) = hiclim 
    516             v_i(ii,ij,1)  = a_i(ii,ij,1) * ht_i(ii,ij,1) !clem-useless 
     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 
    517361         ENDIF 
    518       END DO !ji 
     362      END DO 
    519363 
    520364      !!---------------------------------------------------------------------------------------------- 
     
    540384      ENDIF 
    541385 
    542       CALL wrk_dealloc( jpi,jpj, zremap_flag )    ! integer 
    543       CALL wrk_dealloc( jpi,jpj,jpl-1, zdonor )   ! integer 
    544       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 ) 
    545389      CALL wrk_dealloc( jpi,jpj,jpl-1, zdaice, zdvice )    
    546390      CALL wrk_dealloc( jpi,jpj,jpl+1, zhbnew, kkstart = 0 )    
    547391      CALL wrk_dealloc( (jpi+1)*(jpj+1), zvetamin, zvetamax )    
    548       CALL wrk_dealloc( (jpi+1)*(jpj+1), nind_i, nind_j )   ! integer  
     392      CALL wrk_dealloc( (jpi+1)*(jpj+1), nind_i, nind_j )  
    549393      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 ) 
    550394 
     
    552396 
    553397 
    554    SUBROUTINE lim_itd_fitline( num_cat, HbL, Hbr, hice,   & 
    555       &                        g0, g1, hL, hR, zremap_flag ) 
     398   SUBROUTINE lim_itd_fitline( num_cat, HbL, Hbr, hice, g0, g1, hL, hR, zremap_flag ) 
    556399      !!------------------------------------------------------------------ 
    557400      !!                ***  ROUTINE lim_itd_fitline *** 
     
    572415      INTEGER , DIMENSION(jpi,jpj), INTENT(in   ) ::   zremap_flag  ! 
    573416      ! 
    574       INTEGER ::   ji,jj           ! horizontal indices 
     417      INTEGER  ::   ji,jj        ! horizontal indices 
    575418      REAL(wp) ::   zh13         ! HbL + 1/3 * (HbR - HbL) 
    576419      REAL(wp) ::   zh23         ! HbL + 2/3 * (HbR - HbL) 
     
    579422      !!------------------------------------------------------------------ 
    580423      ! 
    581       ! 
    582424      DO jj = 1, jpj 
    583425         DO ji = 1, jpi 
    584426            ! 
    585427            IF( zremap_flag(ji,jj) == 1 .AND. a_i(ji,jj,num_cat) > epsi10   & 
    586                &                        .AND. hice(ji,jj)        > 0._wp     ) THEN 
     428               &                        .AND. hice(ji,jj)        > 0._wp ) THEN 
    587429 
    588430               ! Initialize hL and hR 
    589  
    590431               hL(ji,jj) = HbL(ji,jj) 
    591432               hR(ji,jj) = HbR(ji,jj) 
    592433 
    593434               ! Change hL or hR if hice falls outside central third of range 
    594  
    595                zh13 = 1.0/3.0 * (2.0*hL(ji,jj) + hR(ji,jj)) 
    596                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) ) 
    597437 
    598438               IF    ( hice(ji,jj) < zh13 ) THEN   ;   hR(ji,jj) = 3._wp * hice(ji,jj) - 2._wp * hL(ji,jj) 
     
    601441 
    602442               ! Compute coefficients of g(eta) = g0 + g1*eta 
    603  
    604443               zdhr = 1._wp / (hR(ji,jj) - hL(ji,jj)) 
    605444               zwk1 = 6._wp * a_i(ji,jj,num_cat) * zdhr 
    606445               zwk2 = ( hice(ji,jj) - hL(ji,jj) ) * zdhr 
    607                g0(ji,jj) = zwk1 * ( 2._wp/3._wp - zwk2 ) 
    608                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 ) 
    609448               ! 
    610             ELSE                   ! remap_flag = .false. or a_i < epsi10  
     449            ELSE  ! remap_flag = .false. or a_i < epsi10  
    611450               hL(ji,jj) = 0._wp 
    612451               hR(ji,jj) = 0._wp 
    613452               g0(ji,jj) = 0._wp 
    614453               g1(ji,jj) = 0._wp 
    615             ENDIF                  ! a_i > epsi10 
     454            ENDIF 
    616455            ! 
    617456         END DO 
     
    637476 
    638477      INTEGER ::   ji, jj, jl, jl2, jl1, jk   ! dummy loop indices 
    639       INTEGER ::   ii, ij          ! indices when changing from 2D-1D is done 
     478      INTEGER ::   ii, ij                     ! indices when changing from 2D-1D is done 
    640479 
    641480      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zaTsfn 
     
    647486      REAL(wp) ::   zdo_aice           ! ice age times volume transferred 
    648487      REAL(wp) ::   zdaTsf             ! aicen*Tsfcn transferred 
    649       REAL(wp) ::   zindsn             ! snow or not 
    650       REAL(wp) ::   zindb              ! ice or not 
    651488 
    652489      INTEGER, POINTER, DIMENSION(:) ::   nind_i, nind_j   ! compressed indices for i/j directions 
    653490 
    654       INTEGER ::   nbrem             ! number of cells with ice to transfer 
    655  
    656       LOGICAL ::   zdaice_negative         ! true if daice < -puny 
    657       LOGICAL ::   zdvice_negative         ! true if dvice < -puny 
    658       LOGICAL ::   zdaice_greater_aicen    ! true if daice > aicen 
    659       LOGICAL ::   zdvice_greater_vicen    ! true if dvice > vicen 
     491      INTEGER  ::   nbrem             ! number of cells with ice to transfer 
    660492      !!------------------------------------------------------------------ 
    661493 
    662494      CALL wrk_alloc( jpi,jpj,jpl, zaTsfn ) 
    663495      CALL wrk_alloc( jpi,jpj, zworka ) 
    664       CALL wrk_alloc( (jpi+1)*(jpj+1), nind_i, nind_j )   ! integer 
     496      CALL wrk_alloc( (jpi+1)*(jpj+1), nind_i, nind_j ) 
    665497 
    666498      !---------------------------------------------------------------------------------------------- 
     
    669501 
    670502      DO jl = klbnd, kubnd 
    671          zaTsfn(:,:,jl) = a_i(:,:,jl)*t_su(:,:,jl) 
    672       END DO 
    673  
    674       !---------------------------------------------------------------------------------------------- 
    675       ! 2) Check for daice or dvice out of range, allowing for roundoff error 
    676       !---------------------------------------------------------------------------------------------- 
    677       ! Note: zdaice < 0 or zdvice < 0 usually happens when category jl 
    678       ! has a small area, with h(n) very close to a boundary.  Then 
    679       ! the coefficients of g(h) are large, and the computed daice and 
    680       ! dvice can be in error. If this happens, it is best to transfer 
    681       ! either the entire category or nothing at all, depending on which 
    682       ! side of the boundary hice(n) lies. 
    683       !----------------------------------------------------------------- 
    684       DO jl = klbnd, kubnd-1 
    685  
    686          zdaice_negative = .false. 
    687          zdvice_negative = .false. 
    688          zdaice_greater_aicen = .false. 
    689          zdvice_greater_vicen = .false. 
    690  
    691          DO jj = 1, jpj 
    692             DO ji = 1, jpi 
    693  
    694                IF (zdonor(ji,jj,jl) .GT. 0) THEN 
    695                   jl1 = zdonor(ji,jj,jl) 
    696  
    697                   IF (zdaice(ji,jj,jl) .LT. 0.0) THEN 
    698                      IF (zdaice(ji,jj,jl) .GT. -epsi10) THEN 
    699                         IF ( ( jl1.EQ.jl   .AND. ht_i(ji,jj,jl1) .GT. hi_max(jl) )           & 
    700                            .OR.                                      & 
    701                            ( jl1.EQ.jl+1 .AND. ht_i(ji,jj,jl1) .LE. hi_max(jl) )           &   
    702                            ) THEN                                                              
    703                            zdaice(ji,jj,jl) = a_i(ji,jj,jl1)  ! shift entire category 
    704                            zdvice(ji,jj,jl) = v_i(ji,jj,jl1) 
    705                         ELSE 
    706                            zdaice(ji,jj,jl) = 0.0 ! shift no ice 
    707                            zdvice(ji,jj,jl) = 0.0 
    708                         ENDIF 
    709                      ELSE 
    710                         zdaice_negative = .true. 
    711                      ENDIF 
    712                   ENDIF 
    713  
    714                   IF (zdvice(ji,jj,jl) .LT. 0.0) THEN 
    715                      IF (zdvice(ji,jj,jl) .GT. -epsi10 ) THEN 
    716                         IF ( ( jl1.EQ.jl .AND. ht_i(ji,jj,jl1).GT.hi_max(jl) )     & 
    717                            .OR.                                     & 
    718                            ( jl1.EQ.jl+1 .AND. ht_i(ji,jj,jl1) .LE. hi_max(jl) ) & 
    719                            ) THEN 
    720                            zdaice(ji,jj,jl) = a_i(ji,jj,jl1) ! shift entire category 
    721                            zdvice(ji,jj,jl) = v_i(ji,jj,jl1)  
    722                         ELSE 
    723                            zdaice(ji,jj,jl) = 0.0    ! shift no ice 
    724                            zdvice(ji,jj,jl) = 0.0 
    725                         ENDIF 
    726                      ELSE 
    727                         zdvice_negative = .true. 
    728                      ENDIF 
    729                   ENDIF 
    730  
    731                   ! If daice is close to aicen, set daice = aicen. 
    732                   IF (zdaice(ji,jj,jl) .GT. a_i(ji,jj,jl1) - epsi10 ) THEN 
    733                      IF (zdaice(ji,jj,jl) .LT. a_i(ji,jj,jl1)+epsi10) THEN 
    734                         zdaice(ji,jj,jl) = a_i(ji,jj,jl1) 
    735                         zdvice(ji,jj,jl) = v_i(ji,jj,jl1)  
    736                      ELSE 
    737                         zdaice_greater_aicen = .true. 
    738                      ENDIF 
    739                   ENDIF 
    740  
    741                   IF (zdvice(ji,jj,jl) .GT. v_i(ji,jj,jl1)-epsi10) THEN 
    742                      IF (zdvice(ji,jj,jl) .LT. v_i(ji,jj,jl1)+epsi10) THEN 
    743                         zdaice(ji,jj,jl) = a_i(ji,jj,jl1) 
    744                         zdvice(ji,jj,jl) = v_i(ji,jj,jl1)  
    745                      ELSE 
    746                         zdvice_greater_vicen = .true. 
    747                      ENDIF 
    748                   ENDIF 
    749  
    750                ENDIF               ! donor > 0 
    751             END DO                   ! i 
    752          END DO                 ! j 
    753  
    754       END DO !jl 
     503         zaTsfn(:,:,jl) = a_i(:,:,jl) * t_su(:,:,jl) 
     504      END DO 
    755505 
    756506      !------------------------------------------------------------------------------- 
    757       ! 3) Transfer volume and energy between categories 
     507      ! 2) Transfer volume and energy between categories 
    758508      !------------------------------------------------------------------------------- 
    759509 
     
    762512         DO jj = 1, jpj 
    763513            DO ji = 1, jpi 
    764                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 
    765515                  nbrem = nbrem + 1 
    766516                  nind_i(nbrem) = ji 
    767517                  nind_j(nbrem) = jj 
    768                ENDIF ! tmask 
     518               ENDIF 
    769519            END DO 
    770520         END DO 
     
    775525 
    776526            jl1 = zdonor(ii,ij,jl) 
    777             zindb             = MAX( 0.0 , SIGN( 1.0 , v_i(ii,ij,jl1) - epsi10 ) ) 
    778             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 
    779529            IF( jl1 == jl) THEN   ;   jl2 = jl1+1 
    780             ELSE                    ;   jl2 = jl  
     530            ELSE                  ;   jl2 = jl  
    781531            ENDIF 
    782532 
     
    784534            ! Ice areas 
    785535            !-------------- 
    786  
    787536            a_i(ii,ij,jl1) = a_i(ii,ij,jl1) - zdaice(ii,ij,jl) 
    788537            a_i(ii,ij,jl2) = a_i(ii,ij,jl2) + zdaice(ii,ij,jl) 
     
    791540            ! Ice volumes 
    792541            !-------------- 
    793  
    794542            v_i(ii,ij,jl1) = v_i(ii,ij,jl1) - zdvice(ii,ij,jl)  
    795543            v_i(ii,ij,jl2) = v_i(ii,ij,jl2) + zdvice(ii,ij,jl) 
     
    798546            ! Snow volumes 
    799547            !-------------- 
    800  
    801             zdvsnow          = v_s(ii,ij,jl1) * zworka(ii,ij) 
     548            zdvsnow        = v_s(ii,ij,jl1) * zworka(ii,ij) 
    802549            v_s(ii,ij,jl1) = v_s(ii,ij,jl1) - zdvsnow 
    803550            v_s(ii,ij,jl2) = v_s(ii,ij,jl2) + zdvsnow  
     
    806553            ! Snow heat content   
    807554            !-------------------- 
    808  
    809             zdesnow              = e_s(ii,ij,1,jl1) * zworka(ii,ij) 
     555            zdesnow            = e_s(ii,ij,1,jl1) * zworka(ii,ij) 
    810556            e_s(ii,ij,1,jl1)   = e_s(ii,ij,1,jl1) - zdesnow 
    811557            e_s(ii,ij,1,jl2)   = e_s(ii,ij,1,jl2) + zdesnow 
     
    814560            ! Ice age  
    815561            !-------------- 
    816  
    817             zdo_aice             = oa_i(ii,ij,jl1) * zdaice(ii,ij,jl) 
     562            zdo_aice           = oa_i(ii,ij,jl1) * zdaice(ii,ij,jl) 
    818563            oa_i(ii,ij,jl1)    = oa_i(ii,ij,jl1) - zdo_aice 
    819564            oa_i(ii,ij,jl2)    = oa_i(ii,ij,jl2) + zdo_aice 
     
    822567            ! Ice salinity 
    823568            !-------------- 
    824  
    825             zdsm_vice            = smv_i(ii,ij,jl1) * zworka(ii,ij) 
     569            zdsm_vice          = smv_i(ii,ij,jl1) * zworka(ii,ij) 
    826570            smv_i(ii,ij,jl1)   = smv_i(ii,ij,jl1) - zdsm_vice 
    827571            smv_i(ii,ij,jl2)   = smv_i(ii,ij,jl2) + zdsm_vice 
     
    830574            ! Surface temperature 
    831575            !--------------------- 
    832  
    833             zdaTsf               = t_su(ii,ij,jl1) * zdaice(ii,ij,jl) 
     576            zdaTsf             = t_su(ii,ij,jl1) * zdaice(ii,ij,jl) 
    834577            zaTsfn(ii,ij,jl1)  = zaTsfn(ii,ij,jl1) - zdaTsf 
    835578            zaTsfn(ii,ij,jl2)  = zaTsfn(ii,ij,jl2) + zdaTsf  
    836579 
    837          END DO                 ! ji 
     580         END DO 
    838581 
    839582         !------------------ 
     
    842585 
    843586         DO jk = 1, nlay_i 
    844 !CDIR NODEP 
    845587            DO ji = 1, nbrem 
    846588               ii = nind_i(ji) 
     
    848590 
    849591               jl1 = zdonor(ii,ij,jl) 
    850                IF (jl1 .EQ. jl) THEN 
     592               IF (jl1 == jl) THEN 
    851593                  jl2 = jl+1 
    852594               ELSE             ! n1 = n+1 
     
    857599               e_i(ii,ij,jk,jl1) =  e_i(ii,ij,jk,jl1) - zdeice 
    858600               e_i(ii,ij,jk,jl2) =  e_i(ii,ij,jk,jl2) + zdeice  
    859             END DO              ! ji 
    860          END DO                 ! jk 
     601            END DO 
     602         END DO 
    861603 
    862604      END DO                   ! boundaries, 1 to ncat-1 
     
    872614                  ht_i(ji,jj,jl)  =  v_i   (ji,jj,jl) / a_i(ji,jj,jl)  
    873615                  t_su(ji,jj,jl)  =  zaTsfn(ji,jj,jl) / a_i(ji,jj,jl)  
    874                   zindsn          =  1.0 - MAX(0.0,SIGN(1.0,-v_s(ji,jj,jl)+epsi10)) !0 if no ice and 1 if yes 
    875616               ELSE 
    876617                  ht_i(ji,jj,jl)  = 0._wp 
    877                   t_su(ji,jj,jl)  = rtt 
     618                  t_su(ji,jj,jl)  = rt0 
    878619               ENDIF 
    879             END DO                 ! ji 
    880          END DO                 ! jj 
    881       END DO                    ! jl 
     620            END DO 
     621         END DO 
     622      END DO 
    882623      ! 
    883624      CALL wrk_dealloc( jpi,jpj,jpl, zaTsfn ) 
    884625      CALL wrk_dealloc( jpi,jpj, zworka ) 
    885       CALL wrk_dealloc( (jpi+1)*(jpj+1), nind_i, nind_j )   ! integer 
     626      CALL wrk_dealloc( (jpi+1)*(jpj+1), nind_i, nind_j ) 
    886627      ! 
    887628   END SUBROUTINE lim_itd_shiftice 
    888629    
    889630 
    890    SUBROUTINE lim_itd_th_reb( klbnd, kubnd, ntyp ) 
     631   SUBROUTINE lim_itd_th_reb( klbnd, kubnd ) 
    891632      !!------------------------------------------------------------------ 
    892633      !!                ***  ROUTINE lim_itd_th_reb *** 
     
    898639      INTEGER , INTENT (in) ::   klbnd   ! Start thickness category index point 
    899640      INTEGER , INTENT (in) ::   kubnd   ! End point on which the  the computation is applied 
    900       INTEGER , INTENT (in) ::   ntyp    ! number of the ice type involved in the rebinning process 
    901641      ! 
    902642      INTEGER ::   ji,jj, jl   ! dummy loop indices 
     
    927667         DO jj = 1, jpj 
    928668            DO ji = 1, jpi  
    929                IF( a_i(ji,jj,jl) > epsi10 ) THEN  
    930                   ht_i(ji,jj,jl) = v_i(ji,jj,jl) / a_i(ji,jj,jl) 
    931                ELSE 
    932                   ht_i(ji,jj,jl) = 0._wp 
    933                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 
    934671            END DO 
    935672         END DO 
     
    937674 
    938675      !------------------------------------------------------------------------------ 
    939       ! 2) Make sure thickness of cat klbnd is at least hi_max_typ(klbnd) 
    940       !------------------------------------------------------------------------------ 
    941       DO jj = 1, jpj  
    942          DO ji = 1, jpi  
    943             IF( a_i(ji,jj,klbnd) > epsi10 ) THEN 
    944                IF( ht_i(ji,jj,klbnd) <= hi_max_typ(0,ntyp) .AND. hi_max_typ(0,ntyp) > 0._wp ) THEN 
    945                   a_i(ji,jj,klbnd)  = v_i(ji,jj,klbnd) / hi_max_typ(0,ntyp)  
    946                   ht_i(ji,jj,klbnd) = hi_max_typ(0,ntyp) 
    947                ENDIF 
    948             ENDIF 
    949          END DO 
    950       END DO 
    951  
    952       !------------------------------------------------------------------------------ 
    953       ! 3) If a category thickness is not in bounds, shift the 
     676      ! 2) If a category thickness is not in bounds, shift the 
    954677      ! entire area, volume, and energy to the neighboring category 
    955678      !------------------------------------------------------------------------------ 
     
    980703                  zdonor(ji,jj,jl)  = jl  
    981704                  ! begin TECLIM change 
    982                   !zdaice(ji,jj,jl)  = a_i(ji,jj,jl) 
    983                   !zdvice(ji,jj,jl)  = v_i(ji,jj,jl) 
    984705                  !zdaice(ji,jj,jl)  = a_i(ji,jj,jl) * 0.5_wp 
    985706                  !zdvice(ji,jj,jl)  = v_i(ji,jj,jl)-zdaice(ji,jj,jl)*(hi_max(jl)+hi_max(jl-1)) * 0.5_wp 
    986707                  ! end TECLIM change  
    987708                  ! clem: how much of a_i you send in cat sup is somewhat arbitrary 
    988                   zdaice(ji,jj,jl)  = a_i(ji,jj,jl) * ( ht_i(ji,jj,jl) - hi_max(jl) + epsi10 ) / ht_i(ji,jj,jl)   
    989                   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 ) 
    990711               ENDIF 
    991             END DO                 ! ji 
    992          END DO                 ! jj 
     712            END DO 
     713         END DO 
    993714         IF(lk_mpp)   CALL mpp_max( zshiftflag ) 
    994715 
     
    1001722         ENDIF 
    1002723         ! 
    1003       END DO                    ! jl 
     724      END DO 
    1004725 
    1005726      !---------------------------- 
     
    1014735         zshiftflag = 0 
    1015736 
    1016 !clem-change 
    1017 !         DO jj = 1, jpj 
    1018 !            DO ji = 1, jpi 
    1019 !               IF( a_i(ji,jj,jl+1) >  epsi10 .AND.   & 
    1020 !                  ht_i(ji,jj,jl+1) <= hi_max(jl) ) THEN 
    1021 !                  ! 
    1022 !                  zshiftflag = 1 
    1023 !                  zdonor(ji,jj,jl) = jl + 1 
    1024 !                  zdaice(ji,jj,jl) = a_i(ji,jj,jl+1)  
    1025 !                  zdvice(ji,jj,jl) = v_i(ji,jj,jl+1) 
    1026 !               ENDIF 
    1027 !            END DO                 ! ji 
    1028 !         END DO                 ! jj 
    1029 ! 
    1030 !         IF(lk_mpp)   CALL mpp_max( zshiftflag ) 
    1031 !          
    1032 !         IF( zshiftflag == 1 ) THEN            ! Shift ice between categories 
    1033 !            CALL lim_itd_shiftice( klbnd, kubnd, zdonor, zdaice, zdvice ) 
    1034 !            ! Reset shift parameters 
    1035 !            zdonor(:,:,jl) = 0 
    1036 !            zdaice(:,:,jl) = 0._wp 
    1037 !            zdvice(:,:,jl) = 0._wp 
    1038 !         ENDIF 
    1039 !clem-change 
    1040  
    1041          ! clem-change begin: why not doing that? 
    1042737         DO jj = 1, jpj 
    1043738            DO ji = 1, jpi 
    1044                IF( a_i(ji,jj,jl+1) >  epsi10 .AND.   & 
    1045                   ht_i(ji,jj,jl+1) <= hi_max(jl) ) THEN 
    1046                   ht_i(ji,jj,jl+1) = hi_max(jl) + epsi10 
    1047                   a_i (ji,jj,jl+1) = v_i(ji,jj,jl+1) / ht_i(ji,jj,jl+1)  
     739               IF( a_i(ji,jj,jl+1) > epsi10 .AND. ht_i(ji,jj,jl+1) <= hi_max(jl) ) THEN 
     740                  ! 
     741                  zshiftflag = 1 
     742                  zdonor(ji,jj,jl) = jl + 1 
     743                  zdaice(ji,jj,jl) = a_i(ji,jj,jl+1)  
     744                  zdvice(ji,jj,jl) = v_i(ji,jj,jl+1) 
    1048745               ENDIF 
    1049             END DO                 ! ji 
    1050          END DO                 ! jj 
    1051          ! clem-change end 
    1052  
    1053       END DO                    ! jl 
     746            END DO 
     747         END DO 
     748 
     749         IF(lk_mpp)   CALL mpp_max( zshiftflag ) 
     750          
     751         IF( zshiftflag == 1 ) THEN            ! Shift ice between categories 
     752            CALL lim_itd_shiftice( klbnd, kubnd, zdonor, zdaice, zdvice ) 
     753            ! Reset shift parameters 
     754            zdonor(:,:,jl) = 0 
     755            zdaice(:,:,jl) = 0._wp 
     756            zdvice(:,:,jl) = 0._wp 
     757         ENDIF 
     758 
     759      END DO 
    1054760 
    1055761      !------------------------------------------------------------------------------ 
    1056       ! 4) Conservation check 
     762      ! 3) Conservation check 
    1057763      !------------------------------------------------------------------------------ 
    1058764 
     
    1067773      ENDIF 
    1068774      ! 
    1069       CALL wrk_dealloc( jpi,jpj,jpl, zdonor )   ! interger 
     775      CALL wrk_dealloc( jpi,jpj,jpl, zdonor ) 
    1070776      CALL wrk_dealloc( jpi,jpj,jpl, zdaice, zdvice ) 
    1071777      CALL wrk_dealloc( jpi,jpj, vt_i_init, vt_i_final, vt_s_init, vt_s_final ) 
     
    1078784   !!---------------------------------------------------------------------- 
    1079785CONTAINS 
    1080    SUBROUTINE lim_itd_th           ! Empty routines 
    1081    END SUBROUTINE lim_itd_th 
    1082    SUBROUTINE lim_itd_th_ini 
    1083    END SUBROUTINE lim_itd_th_ini 
    1084786   SUBROUTINE lim_itd_th_rem 
    1085787   END SUBROUTINE lim_itd_th_rem 
Note: See TracChangeset for help on using the changeset viewer.