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 5965 for branches/2014/dev_r4650_UKMO14.5_SST_BIAS_CORRECTION/NEMOGCM/NEMO/LIM_SRC_3/limitd_me.F90 – NEMO

Ignore:
Timestamp:
2015-12-01T16:35:30+01:00 (8 years ago)
Author:
timgraham
Message:

Upgraded branch to r5518 of trunk (v3.6 stable revision)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2014/dev_r4650_UKMO14.5_SST_BIAS_CORRECTION/NEMOGCM/NEMO/LIM_SRC_3/limitd_me.F90

    r4624 r5965  
    55   !!====================================================================== 
    66   !! History :  LIM  ! 2006-02  (M. Vancoppenolle) Original code  
    7    !!            3.2  ! 2009-07  (M. Vancoppenolle, Y. Aksenov, G. Madec) bug correction in smsw & sfx_mec 
     7   !!            3.2  ! 2009-07  (M. Vancoppenolle, Y. Aksenov, G. Madec) bug correction in smsw & sfx_dyn 
    88   !!            4.0  ! 2011-02  (G. Madec) dynamical allocation 
    99   !!---------------------------------------------------------------------- 
     
    1818   USE thd_ice          ! LIM thermodynamics 
    1919   USE ice              ! LIM variables 
    20    USE par_ice          ! LIM parameters 
    2120   USE dom_ice          ! LIM domain 
    22    USE limthd_lac       ! LIM 
    2321   USE limvar           ! LIM 
    24    USE limcons          ! LIM 
    25    USE in_out_manager   ! I/O manager 
    2622   USE lbclnk           ! lateral boundary condition - MPP exchanges 
    2723   USE lib_mpp          ! MPP library 
    2824   USE wrk_nemo         ! work arrays 
    2925   USE prtctl           ! Print control 
    30   ! Check budget (Rousset) 
     26 
     27   USE in_out_manager   ! I/O manager 
    3128   USE iom              ! I/O manager 
    32    USE lib_fortran     ! glob_sum 
     29   USE lib_fortran      ! glob_sum 
    3330   USE limdiahsb 
    34    USE timing          ! Timing 
     31   USE timing           ! Timing 
     32   USE limcons          ! conservation tests 
    3533 
    3634   IMPLICIT NONE 
     
    4038   PUBLIC   lim_itd_me_icestrength 
    4139   PUBLIC   lim_itd_me_init 
    42    PUBLIC   lim_itd_me_zapsmall 
    43    PUBLIC   lim_itd_me_alloc        ! called by iceini.F90 
    44  
    45    REAL(wp) ::   epsi20 = 1.e-20_wp   ! constant values 
    46    REAL(wp) ::   epsi10 = 1.e-10_wp   ! constant values 
    47    REAL(wp) ::   epsi06 = 1.e-06_wp   ! constant values 
     40   PUBLIC   lim_itd_me_alloc        ! called by sbc_lim_init  
    4841 
    4942   !----------------------------------------------------------------------- 
     
    129122      !!  and Elizabeth C. Hunke, LANL are gratefully acknowledged 
    130123      !!--------------------------------------------------------------------! 
    131       INTEGER ::   ji, jj, jk, jl   ! dummy loop index 
    132       INTEGER ::   niter, nitermax = 20   ! local integer  
    133       LOGICAL  ::   asum_error            ! flag for asum .ne. 1 
     124      INTEGER  ::   ji, jj, jk, jl        ! dummy loop index 
     125      INTEGER  ::   niter                 ! local integer  
    134126      INTEGER  ::   iterate_ridging       ! if true, repeat the ridging 
    135       REAL(wp) ::   w1, tmpfac            ! local scalar 
     127      REAL(wp) ::   za, zfac              ! local scalar 
    136128      CHARACTER (len = 15) ::   fieldid 
    137       REAL(wp), POINTER, DIMENSION(:,:) ::   closing_net     ! net rate at which area is removed    (1/s) 
    138                                                              ! (ridging ice area - area of new ridges) / dt 
    139       REAL(wp), POINTER, DIMENSION(:,:) ::   divu_adv        ! divu as implied by transport scheme  (1/s) 
    140       REAL(wp), POINTER, DIMENSION(:,:) ::   opning          ! rate of opening due to divergence/shear 
    141       REAL(wp), POINTER, DIMENSION(:,:) ::   closing_gross   ! rate at which area removed, not counting area of new ridges 
    142       REAL(wp), POINTER, DIMENSION(:,:) ::   msnow_mlt       ! mass of snow added to ocean (kg m-2) 
    143       REAL(wp), POINTER, DIMENSION(:,:) ::   esnow_mlt       ! energy needed to melt snow in ocean (J m-2) 
    144       REAL(wp), POINTER, DIMENSION(:,:) ::   vt_i_init, vt_i_final  !  ice volume summed over categories 
    145       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) 
    146       REAL(wp) :: zchk_vmin, zchk_amin, zchk_amax ! Check errors (C Rousset) 
    147       ! mass and salt flux (clem) 
    148       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zviold, zvsold, zsmvold   ! old ice volume... 
     129      REAL(wp), POINTER, DIMENSION(:,:)   ::   closing_net     ! net rate at which area is removed    (1/s) 
     130                                                               ! (ridging ice area - area of new ridges) / dt 
     131      REAL(wp), POINTER, DIMENSION(:,:)   ::   divu_adv        ! divu as implied by transport scheme  (1/s) 
     132      REAL(wp), POINTER, DIMENSION(:,:)   ::   opning          ! rate of opening due to divergence/shear 
     133      REAL(wp), POINTER, DIMENSION(:,:)   ::   closing_gross   ! rate at which area removed, not counting area of new ridges 
     134      REAL(wp), POINTER, DIMENSION(:,:)   ::   msnow_mlt       ! mass of snow added to ocean (kg m-2) 
     135      REAL(wp), POINTER, DIMENSION(:,:)   ::   esnow_mlt       ! energy needed to melt snow in ocean (J m-2) 
     136      REAL(wp), POINTER, DIMENSION(:,:)   ::   vt_i_init, vt_i_final  !  ice volume summed over categories 
     137      ! 
     138      INTEGER, PARAMETER ::   nitermax = 20     
     139      ! 
     140      REAL(wp) :: zvi_b, zsmv_b, zei_b, zfs_b, zfw_b, zft_b  
    149141      !!----------------------------------------------------------------------------- 
    150142      IF( nn_timing == 1 )  CALL timing_start('limitd_me') 
    151143 
    152       CALL wrk_alloc( jpi, jpj, closing_net, divu_adv, opning, closing_gross, msnow_mlt, esnow_mlt, vt_i_init, vt_i_final ) 
    153  
    154       CALL wrk_alloc( jpi, jpj, jpl, zviold, zvsold, zsmvold )   ! clem 
    155  
    156       IF( numit == nstart  )   CALL lim_itd_me_init   ! Initialization (first time-step only) 
     144      CALL wrk_alloc( jpi,jpj, closing_net, divu_adv, opning, closing_gross, msnow_mlt, esnow_mlt, vt_i_init, vt_i_final ) 
    157145 
    158146      IF(ln_ctl) THEN 
     
    162150 
    163151      IF( ln_limdyn ) THEN          !   Start ridging and rafting   ! 
    164       ! ------------------------------- 
    165       !- check conservation (C Rousset) 
    166       IF (ln_limdiahsb) THEN 
    167          zchk_v_i_b = glob_sum( SUM(   v_i(:,:,:), dim=3 ) * area(:,:) * tms(:,:) ) 
    168          zchk_smv_b = glob_sum( SUM( smv_i(:,:,:), dim=3 ) * area(:,:) * tms(:,:) ) 
    169          zchk_fw_b  = glob_sum( rdm_ice(:,:) * area(:,:) * tms(:,:) ) 
    170          zchk_fs_b  = glob_sum( ( sfx_bri(:,:) + sfx_thd(:,:) + sfx_res(:,:) + sfx_mec(:,:) ) * area(:,:) * tms(:,:) ) 
    171       ENDIF 
    172       !- check conservation (C Rousset) 
    173       ! ------------------------------- 
    174  
    175       ! mass and salt flux init (clem) 
    176       zviold(:,:,:) = v_i(:,:,:) 
    177       zvsold(:,:,:) = v_s(:,:,:) 
    178       zsmvold(:,:,:) = smv_i(:,:,:) 
     152 
     153      ! conservation test 
     154      IF( ln_limdiahsb ) CALL lim_cons_hsm(0, 'limitd_me', zvi_b, zsmv_b, zei_b, zfw_b, zfs_b, zft_b) 
     155 
     156      CALL lim_var_zapsmall 
     157      CALL lim_var_glo2eqv            ! equivalent variables, requested for rafting 
    179158 
    180159      !-----------------------------------------------------------------------------! 
    181160      ! 1) Thickness categories boundaries, ice / o.w. concentrations, init_ons 
    182161      !-----------------------------------------------------------------------------! 
    183       Cp = 0.5 * grav * (rau0-rhoic) * rhoic / rau0                ! proport const for PE 
     162      Cp = 0.5 * grav * (rau0-rhoic) * rhoic * r1_rau0             ! proport const for PE 
    184163      ! 
    185164      CALL lim_itd_me_ridgeprep                                    ! prepare ridging 
     
    215194            !  (thick, newly ridged ice). 
    216195 
    217             closing_net(ji,jj) = Cs * 0.5 * ( Delta_i(ji,jj) - ABS( divu_i(ji,jj) ) ) - MIN( divu_i(ji,jj), 0._wp ) 
     196            closing_net(ji,jj) = rn_cs * 0.5 * ( delta_i(ji,jj) - ABS( divu_i(ji,jj) ) ) - MIN( divu_i(ji,jj), 0._wp ) 
    218197 
    219198            ! 2.2 divu_adv 
     
    259238               ! Reduce the closing rate if more than 100% of the open water  
    260239               ! would be removed.  Reduce the opening rate proportionately. 
    261                IF ( ato_i(ji,jj) .GT. epsi10 .AND. athorn(ji,jj,0) .GT. 0.0 ) THEN 
    262                   w1 = athorn(ji,jj,0) * closing_gross(ji,jj) * rdt_ice 
    263                   IF ( w1 .GT. ato_i(ji,jj)) THEN 
    264                      tmpfac = ato_i(ji,jj) / w1 
    265                      closing_gross(ji,jj) = closing_gross(ji,jj) * tmpfac 
    266                      opning(ji,jj) = opning(ji,jj) * tmpfac 
    267                   ENDIF !w1 
    268                ENDIF !at0i and athorn 
    269  
    270             END DO ! ji 
    271          END DO ! jj 
     240               za   = athorn(ji,jj,0) * closing_gross(ji,jj) * rdt_ice 
     241               IF( za > epsi20 ) THEN 
     242                  zfac = MIN( 1._wp, ato_i(ji,jj) / za ) 
     243                  closing_gross(ji,jj) = closing_gross(ji,jj) * zfac 
     244                  opning       (ji,jj) = opning       (ji,jj) * zfac 
     245               ENDIF 
     246 
     247            END DO 
     248         END DO 
    272249 
    273250         ! correction to closing rate / opening if excessive ice removal 
     
    275252         ! Reduce the closing rate if more than 100% of any ice category  
    276253         ! would be removed.  Reduce the opening rate proportionately. 
    277  
    278254         DO jl = 1, jpl 
    279255            DO jj = 1, jpj 
    280256               DO ji = 1, jpi 
    281                   IF ( a_i(ji,jj,jl) > epsi10 .AND. athorn(ji,jj,jl) > 0._wp )THEN 
    282                      w1 = athorn(ji,jj,jl) * closing_gross(ji,jj) * rdt_ice 
    283                      IF ( w1  >  a_i(ji,jj,jl) ) THEN 
    284                         tmpfac = a_i(ji,jj,jl) / w1 
    285                         closing_gross(ji,jj) = closing_gross(ji,jj) * tmpfac 
    286                         opning       (ji,jj) = opning       (ji,jj) * tmpfac 
    287                      ENDIF 
     257                  za = athorn(ji,jj,jl) * closing_gross(ji,jj) * rdt_ice 
     258                  IF( za  >  epsi20 ) THEN 
     259                     zfac = MIN( 1._wp, a_i(ji,jj,jl) / za ) 
     260                     closing_gross(ji,jj) = closing_gross(ji,jj) * zfac 
     261                     opning       (ji,jj) = opning       (ji,jj) * zfac 
    288262                  ENDIF 
    289                END DO !ji 
    290             END DO ! jj 
    291          END DO !jl 
     263               END DO 
     264            END DO 
     265         END DO 
    292266 
    293267         ! 3.3 Redistribute area, volume, and energy. 
     
    298272         ! 3.4 Compute total area of ice plus open water after ridging. 
    299273         !-----------------------------------------------------------------------------! 
    300  
    301          CALL lim_itd_me_asumr 
     274         ! This is in general not equal to one because of divergence during transport 
     275         asum(:,:) = ato_i(:,:) 
     276         DO jl = 1, jpl 
     277            asum(:,:) = asum(:,:) + a_i(:,:,jl) 
     278         END DO 
    302279 
    303280         ! 3.5 Do we keep on iterating ??? 
     
    310287         DO jj = 1, jpj 
    311288            DO ji = 1, jpi 
    312                IF (ABS(asum(ji,jj) - kamax ) .LT. epsi10) THEN 
     289               IF (ABS(asum(ji,jj) - kamax ) < epsi10) THEN 
    313290                  closing_net(ji,jj) = 0._wp 
    314291                  opning     (ji,jj) = 0._wp 
     
    346323      ! Convert ridging rate diagnostics to correct units. 
    347324      ! Update fresh water and heat fluxes due to snow melt. 
    348  
    349       asum_error = .false.  
    350  
    351325      DO jj = 1, jpj 
    352326         DO ji = 1, jpi 
    353  
    354             IF(ABS(asum(ji,jj) - kamax) > epsi10 ) asum_error = .true. 
    355327 
    356328            dardg1dt(ji,jj) = dardg1dt(ji,jj) * r1_rdtice 
     
    362334            ! 5) Heat, salt and freshwater fluxes 
    363335            !-----------------------------------------------------------------------------! 
    364             fmmec(ji,jj) = fmmec(ji,jj) + msnow_mlt(ji,jj) * r1_rdtice     ! fresh water source for ocean 
    365             fhmec(ji,jj) = fhmec(ji,jj) + esnow_mlt(ji,jj) * r1_rdtice     ! heat sink for ocean 
     336            wfx_snw(ji,jj) = wfx_snw(ji,jj) + msnow_mlt(ji,jj) * r1_rdtice     ! fresh water source for ocean 
     337            hfx_dyn(ji,jj) = hfx_dyn(ji,jj) + esnow_mlt(ji,jj) * r1_rdtice     ! heat sink for ocean (<0, W.m-2) 
    366338 
    367339         END DO 
     
    369341 
    370342      ! Check if there is a ridging error 
    371       DO jj = 1, jpj 
    372          DO ji = 1, jpi 
    373             IF( ABS( asum(ji,jj) - kamax)  >  epsi10 ) THEN   ! there is a bug 
    374                WRITE(numout,*) ' ' 
    375                WRITE(numout,*) ' ALERTE : Ridging error: total area = ', asum(ji,jj) 
    376                WRITE(numout,*) ' limitd_me ' 
    377                WRITE(numout,*) ' POINT : ', ji, jj 
    378                WRITE(numout,*) ' jpl, a_i, athorn ' 
    379                WRITE(numout,*) 0, ato_i(ji,jj), athorn(ji,jj,0) 
    380                DO jl = 1, jpl 
    381                   WRITE(numout,*) jl, a_i(ji,jj,jl), athorn(ji,jj,jl) 
    382                END DO 
    383             ENDIF  ! asum 
    384  
    385          END DO !ji 
    386       END DO !jj 
     343      IF( lwp ) THEN 
     344         DO jj = 1, jpj 
     345            DO ji = 1, jpi 
     346               IF( ABS( asum(ji,jj) - kamax)  >  epsi10 ) THEN   ! there is a bug 
     347                  WRITE(numout,*) ' ' 
     348                  WRITE(numout,*) ' ALERTE : Ridging error: total area = ', asum(ji,jj) 
     349                  WRITE(numout,*) ' limitd_me ' 
     350                  WRITE(numout,*) ' POINT : ', ji, jj 
     351                  WRITE(numout,*) ' jpl, a_i, athorn ' 
     352                  WRITE(numout,*) 0, ato_i(ji,jj), athorn(ji,jj,0) 
     353                  DO jl = 1, jpl 
     354                     WRITE(numout,*) jl, a_i(ji,jj,jl), athorn(ji,jj,jl) 
     355                  END DO 
     356               ENDIF 
     357            END DO 
     358         END DO 
     359      END IF 
    387360 
    388361      ! Conservation check 
     
    393366      ENDIF 
    394367 
     368      CALL lim_var_agg( 1 )  
     369 
    395370      !-----------------------------------------------------------------------------! 
    396       ! 6) Updating state variables and trend terms (done in limupdate) 
     371      ! control prints 
    397372      !-----------------------------------------------------------------------------! 
    398       CALL lim_var_glo2eqv 
    399       CALL lim_itd_me_zapsmall 
    400  
    401       !-------------------------------- 
    402       ! Update mass/salt fluxes (clem) 
    403       !-------------------------------- 
    404       DO jl = 1, jpl 
    405          DO jj = 1, jpj  
    406             DO ji = 1, jpi 
    407                diag_dyn_gr(ji,jj) = diag_dyn_gr(ji,jj) + ( v_i(ji,jj,jl) - zviold(ji,jj,jl) ) * r1_rdtice 
    408                rdm_ice(ji,jj) = rdm_ice(ji,jj) + ( v_i(ji,jj,jl) - zviold(ji,jj,jl) ) * rhoic  
    409                rdm_snw(ji,jj) = rdm_snw(ji,jj) + ( v_s(ji,jj,jl) - zvsold(ji,jj,jl) ) * rhosn  
    410                sfx_mec(ji,jj) = sfx_mec(ji,jj) - ( smv_i(ji,jj,jl) - zsmvold(ji,jj,jl) ) * rhoic * r1_rdtice  
    411             END DO 
    412          END DO 
    413       END DO 
    414  
    415       IF(ln_ctl) THEN     ! Control print 
     373      IF(ln_ctl) THEN  
     374         CALL lim_var_glo2eqv 
     375 
    416376         CALL prt_ctl_info(' ') 
    417377         CALL prt_ctl_info(' - Cell values : ') 
    418378         CALL prt_ctl_info('   ~~~~~~~~~~~~~ ') 
    419          CALL prt_ctl(tab2d_1=area , clinfo1=' lim_itd_me  : cell area :') 
     379         CALL prt_ctl(tab2d_1=e12t , clinfo1=' lim_itd_me  : cell area :') 
    420380         CALL prt_ctl(tab2d_1=at_i , clinfo1=' lim_itd_me  : at_i      :') 
    421381         CALL prt_ctl(tab2d_1=vt_i , clinfo1=' lim_itd_me  : vt_i      :') 
     
    445405      ENDIF 
    446406 
    447       ! ------------------------------- 
    448       !- check conservation (C Rousset) 
    449       IF (ln_limdiahsb) THEN 
    450          zchk_fs  = glob_sum( ( sfx_bri(:,:) + sfx_thd(:,:) + sfx_res(:,:) + sfx_mec(:,:) ) * area(:,:) * tms(:,:) ) - zchk_fs_b 
    451          zchk_fw  = glob_sum( rdm_ice(:,:) * area(:,:) * tms(:,:) ) - zchk_fw_b 
    452   
    453          zchk_v_i = ( glob_sum( SUM(   v_i(:,:,:), dim=3 ) * area(:,:) * tms(:,:) ) - zchk_v_i_b - ( zchk_fw / rhoic ) ) * r1_rdtice 
    454          zchk_smv = ( glob_sum( SUM( smv_i(:,:,:), dim=3 ) * area(:,:) * tms(:,:) ) - zchk_smv_b ) * r1_rdtice + ( zchk_fs / rhoic ) 
    455  
    456          zchk_vmin = glob_min(v_i) 
    457          zchk_amax = glob_max(SUM(a_i,dim=3)) 
    458          zchk_amin = glob_min(a_i) 
    459         
    460          IF(lwp) THEN 
    461             IF ( ABS( zchk_v_i   ) >  1.e-5 ) WRITE(numout,*) 'violation volume [m3/day]     (limitd_me) = ',(zchk_v_i * rday) 
    462             IF ( ABS( zchk_smv   ) >  1.e-4 ) WRITE(numout,*) 'violation saline [psu*m3/day] (limitd_me) = ',(zchk_smv * rday) 
    463             IF ( zchk_vmin <  0.            ) WRITE(numout,*) 'violation v_i<0  [mm]         (limitd_me) = ',(zchk_vmin * 1.e-3) 
    464             IF ( zchk_amax >  kamax+epsi10  ) WRITE(numout,*) 'violation a_i>amax            (limitd_me) = ',zchk_amax 
    465             IF ( zchk_amin <  0.            ) WRITE(numout,*) 'violation a_i<0               (limitd_me) = ',zchk_amin 
    466          ENDIF 
    467       ENDIF 
    468       !- check conservation (C Rousset) 
    469       ! ------------------------------- 
     407      ! conservation test 
     408      IF( ln_limdiahsb ) CALL lim_cons_hsm(1, 'limitd_me', zvi_b, zsmv_b, zei_b, zfw_b, zfs_b, zft_b) 
    470409 
    471410      ENDIF  ! ln_limdyn=.true. 
    472411      ! 
    473412      CALL wrk_dealloc( jpi, jpj, closing_net, divu_adv, opning, closing_gross, msnow_mlt, esnow_mlt, vt_i_init, vt_i_final ) 
    474       ! 
    475       CALL wrk_dealloc( jpi, jpj, jpl, zviold, zvsold, zsmvold )   ! clem 
    476413      ! 
    477414      IF( nn_timing == 1 )  CALL timing_stop('limitd_me') 
     
    494431      !!---------------------------------------------------------------------- 
    495432      INTEGER, INTENT(in) ::   kstrngth    ! = 1 for Rothrock formulation, 0 for Hibler (1979) 
    496  
    497       INTEGER ::   ji,jj, jl   ! dummy loop indices 
    498       INTEGER ::   ksmooth     ! smoothing the resistance to deformation 
    499       INTEGER ::   numts_rm    ! number of time steps for the P smoothing 
    500       REAL(wp) ::   hi, zw1, zp, zdummy, zzc, z1_3   ! local scalars 
     433      INTEGER             ::   ji,jj, jl   ! dummy loop indices 
     434      INTEGER             ::   ksmooth     ! smoothing the resistance to deformation 
     435      INTEGER             ::   numts_rm    ! number of time steps for the P smoothing 
     436      REAL(wp)            ::   zhi, zp, z1_3  ! local scalars 
    501437      REAL(wp), POINTER, DIMENSION(:,:) ::   zworka   ! temporary array used here 
    502438      !!---------------------------------------------------------------------- 
     
    524460                  ! 
    525461                  IF( a_i(ji,jj,jl) > epsi10 .AND. athorn(ji,jj,jl) > 0._wp ) THEN 
    526                      hi = v_i(ji,jj,jl) / a_i(ji,jj,jl) 
     462                     zhi = v_i(ji,jj,jl) / a_i(ji,jj,jl) 
    527463                     !---------------------------- 
    528464                     ! PE loss from deforming ice 
    529465                     !---------------------------- 
    530                      strength(ji,jj) = strength(ji,jj) - athorn(ji,jj,jl) * hi * hi 
     466                     strength(ji,jj) = strength(ji,jj) - athorn(ji,jj,jl) * zhi * zhi 
    531467 
    532468                     !-------------------------- 
    533469                     ! PE gain from rafting ice 
    534470                     !-------------------------- 
    535                      strength(ji,jj) = strength(ji,jj) + 2._wp * araft(ji,jj,jl) * hi * hi 
     471                     strength(ji,jj) = strength(ji,jj) + 2._wp * araft(ji,jj,jl) * zhi * zhi 
    536472 
    537473                     !---------------------------- 
    538474                     ! PE gain from ridging ice 
    539475                     !---------------------------- 
    540                      strength(ji,jj) = strength(ji,jj) + aridge(ji,jj,jl)/krdg(ji,jj,jl)     & 
    541                         * z1_3 * (hrmax(ji,jj,jl)**3 - hrmin(ji,jj,jl)**3) / ( hrmax(ji,jj,jl)-hrmin(ji,jj,jl) )    
    542 !!gm Optimization:  (a**3-b**3)/(a-b) = a*a+ab+b*b   ==> less costly operations even if a**3 is replaced by a*a*a...                     
    543                   ENDIF            ! aicen > epsi10 
     476                     strength(ji,jj) = strength(ji,jj) + aridge(ji,jj,jl) / krdg(ji,jj,jl)     & 
     477                        * z1_3 * ( hrmax(ji,jj,jl)**2 + hrmin(ji,jj,jl)**2 +  hrmax(ji,jj,jl) * hrmin(ji,jj,jl) )   
     478                        !!(a**3-b**3)/(a-b) = a*a+ab+b*b                       
     479                  ENDIF 
    544480                  ! 
    545                END DO ! ji 
    546             END DO !jj 
    547          END DO !jl 
    548  
    549          zzc = Cf * Cp     ! where Cp = (g/2)*(rhow-rhoi)*(rhoi/rhow) and Cf accounts for frictional dissipation 
    550          strength(:,:) = zzc * strength(:,:) / aksum(:,:) 
    551  
     481               END DO 
     482            END DO 
     483         END DO 
     484    
     485         strength(:,:) = rn_pe_rdg * Cp * strength(:,:) / aksum(:,:) 
     486                         ! where Cp = (g/2)*(rhow-rhoi)*(rhoi/rhow) and rn_pe_rdg accounts for frictional dissipation 
    552487         ksmooth = 1 
    553488 
     
    557492      ELSE                      ! kstrngth ne 1:  Hibler (1979) form 
    558493         ! 
    559          strength(:,:) = Pstar * vt_i(:,:) * EXP( - C_rhg * ( 1._wp - at_i(:,:) )  ) 
     494         strength(:,:) = rn_pstar * vt_i(:,:) * EXP( - rn_crhg * ( 1._wp - at_i(:,:) )  ) 
    560495         ! 
    561496         ksmooth = 1 
     
    569504      ! CAN BE REMOVED 
    570505      ! 
    571       IF ( brinstren_swi == 1 ) THEN 
     506      IF( ln_icestr_bvf ) THEN 
    572507 
    573508         DO jj = 1, jpj 
    574509            DO ji = 1, jpi 
    575                IF ( bv_i(ji,jj) .GT. 0.0 ) THEN 
    576                   zdummy = MIN ( bv_i(ji,jj), 0.10 ) * MIN( bv_i(ji,jj), 0.10 ) 
    577                ELSE 
    578                   zdummy = 0.0 
    579                ENDIF 
    580510               strength(ji,jj) = strength(ji,jj) * exp(-5.88*SQRT(MAX(bv_i(ji,jj),0.0))) 
    581             END DO              ! j 
    582          END DO                 ! i 
     511            END DO 
     512         END DO 
    583513 
    584514      ENDIF 
     
    596526         CALL lbc_lnk( strength, 'T', 1. ) 
    597527 
    598          DO jj = 2, jpj - 1 
    599             DO ji = 2, jpi - 1 
    600                IF ( ( asum(ji,jj) - ato_i(ji,jj) ) .GT. epsi10) THEN ! ice is 
    601                   ! present 
    602                   zworka(ji,jj) = 4.0 * strength(ji,jj)              & 
    603                      &          + strength(ji-1,jj) * tms(ji-1,jj) &   
    604                      &          + strength(ji+1,jj) * tms(ji+1,jj) &   
    605                      &          + strength(ji,jj-1) * tms(ji,jj-1) &   
    606                      &          + strength(ji,jj+1) * tms(ji,jj+1)     
    607  
    608                   zw1 = 4.0 + tms(ji-1,jj) + tms(ji+1,jj) + tms(ji,jj-1) + tms(ji,jj+1) 
    609                   zworka(ji,jj) = zworka(ji,jj) / zw1 
     528         DO jj = 2, jpjm1 
     529            DO ji = 2, jpim1 
     530               IF ( ( asum(ji,jj) - ato_i(ji,jj) ) > 0._wp) THEN  
     531                  zworka(ji,jj) = ( 4.0 * strength(ji,jj)              & 
     532                     &                  + strength(ji-1,jj) * tmask(ji-1,jj,1) + strength(ji+1,jj) * tmask(ji+1,jj,1) &   
     533                     &                  + strength(ji,jj-1) * tmask(ji,jj-1,1) + strength(ji,jj+1) * tmask(ji,jj+1,1) & 
     534                     &            ) / ( 4.0 + tmask(ji-1,jj,1) + tmask(ji+1,jj,1) + tmask(ji,jj-1,1) + tmask(ji,jj+1,1) ) 
    610535               ELSE 
    611536                  zworka(ji,jj) = 0._wp 
     
    614539         END DO 
    615540 
    616          DO jj = 2, jpj - 1 
    617             DO ji = 2, jpi - 1 
     541         DO jj = 2, jpjm1 
     542            DO ji = 2, jpim1 
    618543               strength(ji,jj) = zworka(ji,jj) 
    619544            END DO 
     
    621546         CALL lbc_lnk( strength, 'T', 1. ) 
    622547 
    623       ENDIF ! ksmooth 
     548      ENDIF 
    624549 
    625550      !-------------------- 
     
    638563         DO jj = 1, jpj - 1 
    639564            DO ji = 1, jpi - 1 
    640                IF ( ( asum(ji,jj) - ato_i(ji,jj) ) .GT. epsi10) THEN       ! ice is present 
     565               IF ( ( asum(ji,jj) - ato_i(ji,jj) ) > 0._wp) THEN  
    641566                  numts_rm = 1 ! number of time steps for the running mean 
    642                   IF ( strp1(ji,jj) .GT. 0.0 ) numts_rm = numts_rm + 1 
    643                   IF ( strp2(ji,jj) .GT. 0.0 ) numts_rm = numts_rm + 1 
     567                  IF ( strp1(ji,jj) > 0.0 ) numts_rm = numts_rm + 1 
     568                  IF ( strp2(ji,jj) > 0.0 ) numts_rm = numts_rm + 1 
    644569                  zp = ( strength(ji,jj) + strp1(ji,jj) + strp2(ji,jj) ) / numts_rm 
    645570                  strp2(ji,jj) = strp1(ji,jj) 
     
    670595      !!---------------------------------------------------------------------! 
    671596      INTEGER ::   ji,jj, jl    ! dummy loop indices 
    672       INTEGER ::   krdg_index   !  
    673       REAL(wp) ::   Gstari, astari, hi, hrmean, zdummy   ! local scalar 
     597      REAL(wp) ::   Gstari, astari, zhi, hrmean, zdummy   ! local scalar 
    674598      REAL(wp), POINTER, DIMENSION(:,:)   ::   zworka    ! temporary array used here 
    675599      REAL(wp), POINTER, DIMENSION(:,:,:) ::   Gsum      ! Gsum(n) = sum of areas in categories 0 to n 
     
    679603      CALL wrk_alloc( jpi,jpj,jpl+2, Gsum, kkstart = -1 ) 
    680604 
    681       Gstari     = 1.0/Gstar     
    682       astari     = 1.0/astar     
     605      Gstari     = 1.0/rn_gstar     
     606      astari     = 1.0/rn_astar     
    683607      aksum(:,:)    = 0.0 
    684608      athorn(:,:,:) = 0.0 
     
    691615 
    692616      !     ! Zero out categories with very small areas 
    693       CALL lim_itd_me_zapsmall 
     617      CALL lim_var_zapsmall 
    694618 
    695619      !------------------------------------------------------------------------------! 
     
    698622 
    699623      ! Compute total area of ice plus open water. 
    700       CALL lim_itd_me_asumr 
    701       ! This is in general not equal to one  
    702       ! because of divergence during transport 
     624      ! This is in general not equal to one because of divergence during transport 
     625      asum(:,:) = ato_i(:,:) 
     626      DO jl = 1, jpl 
     627         asum(:,:) = asum(:,:) + a_i(:,:,jl) 
     628      END DO 
    703629 
    704630      ! Compute cumulative thickness distribution function 
     
    708634 
    709635      Gsum(:,:,-1) = 0._wp 
    710  
    711       DO jj = 1, jpj 
    712          DO ji = 1, jpi 
    713             IF( ato_i(ji,jj) > epsi10 ) THEN   ;   Gsum(ji,jj,0) = ato_i(ji,jj) 
    714             ELSE                               ;   Gsum(ji,jj,0) = 0._wp 
    715             ENDIF 
    716          END DO 
    717       END DO 
     636      Gsum(:,:,0 ) = ato_i(:,:) 
    718637 
    719638      ! for each value of h, you have to add ice concentration then 
    720639      DO jl = 1, jpl 
    721          DO jj = 1, jpj  
    722             DO ji = 1, jpi 
    723                IF( a_i(ji,jj,jl) .GT. epsi10 ) THEN   ;   Gsum(ji,jj,jl) = Gsum(ji,jj,jl-1) + a_i(ji,jj,jl) 
    724                ELSE                                   ;   Gsum(ji,jj,jl) = Gsum(ji,jj,jl-1) 
    725                ENDIF 
    726             END DO 
    727          END DO 
     640         Gsum(:,:,jl) = Gsum(:,:,jl-1) + a_i(:,:,jl) 
    728641      END DO 
    729642 
     
    746659      !----------------------------------------------------------------- 
    747660 
    748       krdg_index = 1 
    749  
    750       IF( krdg_index == 0 ) THEN       !--- Linear formulation (Thorndike et al., 1975) 
    751          DO jl = 0, ice_cat_bounds(1,2)       ! only undeformed ice participates 
     661      IF( nn_partfun == 0 ) THEN       !--- Linear formulation (Thorndike et al., 1975) 
     662         DO jl = 0, jpl     
    752663            DO jj = 1, jpj  
    753664               DO ji = 1, jpi 
    754                   IF( Gsum(ji,jj,jl) < Gstar) THEN 
    755                      athorn(ji,jj,jl) = Gstari * (Gsum(ji,jj,jl)-Gsum(ji,jj,jl-1)) * & 
    756                         (2.0 - (Gsum(ji,jj,jl-1)+Gsum(ji,jj,jl))*Gstari) 
    757                   ELSEIF (Gsum(ji,jj,jl-1) < Gstar) THEN 
    758                      athorn(ji,jj,jl) = Gstari * (Gstar-Gsum(ji,jj,jl-1)) *  & 
    759                         (2.0 - (Gsum(ji,jj,jl-1)+Gstar)*Gstari) 
     665                  IF( Gsum(ji,jj,jl) < rn_gstar) THEN 
     666                     athorn(ji,jj,jl) = Gstari * ( Gsum(ji,jj,jl) - Gsum(ji,jj,jl-1) ) * & 
     667                        &                        ( 2.0 - (Gsum(ji,jj,jl-1) + Gsum(ji,jj,jl) ) * Gstari ) 
     668                  ELSEIF (Gsum(ji,jj,jl-1) < rn_gstar) THEN 
     669                     athorn(ji,jj,jl) = Gstari * ( rn_gstar - Gsum(ji,jj,jl-1) ) *  & 
     670                        &                        ( 2.0 - ( Gsum(ji,jj,jl-1) + rn_gstar ) * Gstari ) 
    760671                  ELSE 
    761672                     athorn(ji,jj,jl) = 0.0 
    762673                  ENDIF 
    763                END DO ! ji 
    764             END DO ! jj 
    765          END DO ! jl  
     674               END DO 
     675            END DO 
     676         END DO 
    766677 
    767678      ELSE                             !--- Exponential, more stable formulation (Lipscomb et al, 2007) 
    768679         !                         
    769680         zdummy = 1._wp / ( 1._wp - EXP(-astari) )        ! precompute exponential terms using Gsum as a work array 
    770  
    771681         DO jl = -1, jpl 
    772682            Gsum(:,:,jl) = EXP( -Gsum(:,:,jl) * astari ) * zdummy 
    773          END DO !jl 
    774          DO jl = 0, ice_cat_bounds(1,2) 
     683         END DO 
     684         DO jl = 0, jpl 
    775685             athorn(:,:,jl) = Gsum(:,:,jl-1) - Gsum(:,:,jl) 
    776686         END DO 
    777687         ! 
    778       ENDIF ! krdg_index 
    779  
    780       IF( raftswi == 1 ) THEN      ! Ridging and rafting ice participation functions 
     688      ENDIF 
     689 
     690      IF( ln_rafting ) THEN      ! Ridging and rafting ice participation functions 
    781691         ! 
    782692         DO jl = 1, jpl 
    783693            DO jj = 1, jpj  
    784694               DO ji = 1, jpi 
    785                   IF ( athorn(ji,jj,jl) .GT. 0._wp ) THEN 
     695                  IF ( athorn(ji,jj,jl) > 0._wp ) THEN 
    786696!!gm  TANH( -X ) = - TANH( X )  so can be computed only 1 time.... 
    787                      aridge(ji,jj,jl) = ( TANH (  Craft * ( ht_i(ji,jj,jl) - hparmeter ) ) + 1.0 ) * 0.5 * athorn(ji,jj,jl) 
    788                      araft (ji,jj,jl) = ( TANH ( -Craft * ( ht_i(ji,jj,jl) - hparmeter ) ) + 1.0 ) * 0.5 * athorn(ji,jj,jl) 
     697                     aridge(ji,jj,jl) = ( TANH (  rn_craft * ( ht_i(ji,jj,jl) - rn_hraft ) ) + 1.0 ) * 0.5 * athorn(ji,jj,jl) 
     698                     araft (ji,jj,jl) = ( TANH ( -rn_craft * ( ht_i(ji,jj,jl) - rn_hraft ) ) + 1.0 ) * 0.5 * athorn(ji,jj,jl) 
    789699                     IF ( araft(ji,jj,jl) < epsi06 )   araft(ji,jj,jl)  = 0._wp 
    790700                     aridge(ji,jj,jl) = MAX( athorn(ji,jj,jl) - araft(ji,jj,jl), 0.0 ) 
    791                   ENDIF ! athorn 
    792                END DO ! ji 
    793             END DO ! jj 
    794          END DO ! jl 
    795  
    796       ELSE  ! raftswi = 0 
     701                  ENDIF 
     702               END DO 
     703            END DO 
     704         END DO 
     705 
     706      ELSE 
    797707         ! 
    798708         DO jl = 1, jpl 
     
    802712      ENDIF 
    803713 
    804       IF ( raftswi == 1 ) THEN 
    805  
    806          IF( MAXVAL(aridge + araft - athorn(:,:,1:jpl)) .GT. epsi10 ) THEN 
     714      IF( ln_rafting ) THEN 
     715 
     716         IF( MAXVAL(aridge + araft - athorn(:,:,1:jpl)) > epsi10 .AND. lwp ) THEN 
    807717            DO jl = 1, jpl 
    808718               DO jj = 1, jpj 
    809719                  DO ji = 1, jpi 
    810                      IF ( aridge(ji,jj,jl) + araft(ji,jj,jl) - athorn(ji,jj,jl) .GT. epsi10 ) THEN 
     720                     IF ( aridge(ji,jj,jl) + araft(ji,jj,jl) - athorn(ji,jj,jl) > epsi10 ) THEN 
    811721                        WRITE(numout,*) ' ALERTE 96 : wrong participation function ... ' 
    812722                        WRITE(numout,*) ' ji, jj, jl : ', ji, jj, jl 
     
    854764            DO ji = 1, jpi 
    855765 
    856                IF (a_i(ji,jj,jl) .GT. epsi10 .AND. athorn(ji,jj,jl) .GT. 0.0 ) THEN 
    857                   hi = v_i(ji,jj,jl) / a_i(ji,jj,jl) 
    858                   hrmean          = MAX(SQRT(Hstar*hi), hi*krdgmin) 
    859                   hrmin(ji,jj,jl) = MIN(2.0*hi, 0.5*(hrmean + hi)) 
     766               IF (a_i(ji,jj,jl) > epsi10 .AND. athorn(ji,jj,jl) > 0.0 ) THEN 
     767                  zhi = v_i(ji,jj,jl) / a_i(ji,jj,jl) 
     768                  hrmean          = MAX(SQRT(rn_hstar*zhi), zhi*krdgmin) 
     769                  hrmin(ji,jj,jl) = MIN(2.0*zhi, 0.5*(hrmean + zhi)) 
    860770                  hrmax(ji,jj,jl) = 2.0*hrmean - hrmin(ji,jj,jl) 
    861                   hraft(ji,jj,jl) = kraft*hi 
    862                   krdg(ji,jj,jl)  = hrmean / hi 
     771                  hraft(ji,jj,jl) = kraft*zhi 
     772                  krdg(ji,jj,jl)  = hrmean / zhi 
    863773               ELSE 
    864774                  hraft(ji,jj,jl) = 0.0 
     
    868778               ENDIF 
    869779 
    870             END DO ! ji 
    871          END DO ! jj 
    872       END DO ! jl 
     780            END DO 
     781         END DO 
     782      END DO 
    873783 
    874784      ! Normalization factor : aksum, ensures mass conservation 
     
    902812      LOGICAL, PARAMETER ::   l_conservation_check = .true.  ! if true, check conservation (useful for debugging) 
    903813      ! 
    904       LOGICAL ::   neg_ato_i      ! flag for ato_i(i,j) < -puny 
    905       LOGICAL ::   large_afrac    ! flag for afrac > 1 
    906       LOGICAL ::   large_afrft    ! flag for afrac > 1 
    907814      INTEGER ::   ji, jj, jl, jl1, jl2, jk   ! dummy loop indices 
    908815      INTEGER ::   ij                ! horizontal index, combines i and j loops 
    909816      INTEGER ::   icells            ! number of cells with aicen > puny 
    910       REAL(wp) ::   zindb, zsrdg2   ! local scalar 
    911       REAL(wp) ::   hL, hR, farea, zdummy, zdummy0, ztmelts    ! left and right limits of integration 
     817      REAL(wp) ::   hL, hR, farea, ztmelts    ! left and right limits of integration 
    912818 
    913819      INTEGER , POINTER, DIMENSION(:) ::   indxi, indxj   ! compressed indices 
     
    917823 
    918824      REAL(wp), POINTER, DIMENSION(:,:,:) ::   aicen_init, vicen_init   ! ice  area    & volume before ridging 
    919       REAL(wp), POINTER, DIMENSION(:,:,:) ::   vsnon_init, esnon_init   ! snow volume  & energy before ridging 
     825      REAL(wp), POINTER, DIMENSION(:,:,:) ::   vsnwn_init, esnwn_init   ! snow volume  & energy before ridging 
    920826      REAL(wp), POINTER, DIMENSION(:,:,:) ::   smv_i_init, oa_i_init    ! ice salinity & age    before ridging 
    921827 
     
    925831      REAL(wp), POINTER, DIMENSION(:,:) ::   ardg1 , ardg2    ! area of ice ridged & new ridges 
    926832      REAL(wp), POINTER, DIMENSION(:,:) ::   vsrdg , esrdg    ! snow volume & energy of ridging ice 
    927       REAL(wp), POINTER, DIMENSION(:,:) ::   oirdg1, oirdg2   ! areal age content of ridged & rifging ice 
    928833      REAL(wp), POINTER, DIMENSION(:,:) ::   dhr   , dhr2     ! hrmax - hrmin  &  hrmax^2 - hrmin^2 
    929834 
     
    934839      REAL(wp), POINTER, DIMENSION(:,:) ::   srdg2   ! sal*volume of new ridges 
    935840      REAL(wp), POINTER, DIMENSION(:,:) ::   smsw    ! sal*volume of water trapped into ridges 
     841      REAL(wp), POINTER, DIMENSION(:,:) ::   oirdg1, oirdg2   ! ice age of ice ridged 
    936842 
    937843      REAL(wp), POINTER, DIMENSION(:,:) ::   afrft            ! fraction of category area rafted 
     
    939845      REAL(wp), POINTER, DIMENSION(:,:) ::   virft , vsrft    ! ice & snow volume of rafting ice 
    940846      REAL(wp), POINTER, DIMENSION(:,:) ::   esrft , smrft    ! snow energy & salinity of rafting ice 
    941       REAL(wp), POINTER, DIMENSION(:,:) ::   oirft1, oirft2   ! areal age content of rafted ice & rafting ice 
     847      REAL(wp), POINTER, DIMENSION(:,:) ::   oirft1, oirft2   ! ice age of ice rafted 
    942848 
    943849      REAL(wp), POINTER, DIMENSION(:,:,:) ::   eirft      ! ice energy of rafting ice 
     
    947853      !!---------------------------------------------------------------------- 
    948854 
    949       CALL wrk_alloc( (jpi+1)*(jpj+1),      indxi, indxj ) 
    950       CALL wrk_alloc( jpi, jpj,             vice_init, vice_final, eice_init, eice_final ) 
    951       CALL wrk_alloc( jpi, jpj,             afrac, fvol , ardg1, ardg2, vsrdg, esrdg, oirdg1, oirdg2, dhr, dhr2 ) 
    952       CALL wrk_alloc( jpi, jpj,             vrdg1, vrdg2, vsw  , srdg1, srdg2, smsw ) 
    953       CALL wrk_alloc( jpi, jpj,             afrft, arft1, arft2, virft, vsrft, esrft, smrft, oirft1, oirft2 ) 
    954       CALL wrk_alloc( jpi, jpj, jpl,        aicen_init, vicen_init, vsnon_init, esnon_init, smv_i_init, oa_i_init ) 
    955       CALL wrk_alloc( jpi, jpj, jkmax,      eirft, erdg1, erdg2, ersw ) 
    956       CALL wrk_alloc( jpi, jpj, jkmax, jpl, eicen_init ) 
     855      CALL wrk_alloc( (jpi+1)*(jpj+1),       indxi, indxj ) 
     856      CALL wrk_alloc( jpi, jpj,              vice_init, vice_final, eice_init, eice_final ) 
     857      CALL wrk_alloc( jpi, jpj,              afrac, fvol , ardg1, ardg2, vsrdg, esrdg, dhr, dhr2 ) 
     858      CALL wrk_alloc( jpi, jpj,              vrdg1, vrdg2, vsw  , srdg1, srdg2, smsw, oirdg1, oirdg2 ) 
     859      CALL wrk_alloc( jpi, jpj,              afrft, arft1, arft2, virft, vsrft, esrft, smrft, oirft1, oirft2 ) 
     860      CALL wrk_alloc( jpi, jpj, jpl,         aicen_init, vicen_init, vsnwn_init, esnwn_init, smv_i_init, oa_i_init ) 
     861      CALL wrk_alloc( jpi, jpj, nlay_i,      eirft, erdg1, erdg2, ersw ) 
     862      CALL wrk_alloc( jpi, jpj, nlay_i, jpl, eicen_init ) 
    957863 
    958864      ! Conservation check 
     
    962868         CALL lim_column_sum        (jpl,    v_i,       vice_init ) 
    963869         CALL lim_column_sum_energy (jpl, nlay_i,  e_i, eice_init ) 
    964          DO ji = mi0(jiindx), mi1(jiindx) 
    965             DO jj = mj0(jjindx), mj1(jjindx) 
     870         DO ji = mi0(iiceprt), mi1(iiceprt) 
     871            DO jj = mj0(jiceprt), mj1(jiceprt) 
    966872               WRITE(numout,*) ' vice_init  : ', vice_init(ji,jj) 
    967873               WRITE(numout,*) ' eice_init  : ', eice_init(ji,jj) 
     
    973879      ! 1) Compute change in open water area due to closing and opening. 
    974880      !------------------------------------------------------------------------------- 
    975  
    976       neg_ato_i = .false. 
    977  
    978881      DO jj = 1, jpj 
    979882         DO ji = 1, jpi 
    980883            ato_i(ji,jj) = ato_i(ji,jj) - athorn(ji,jj,0) * closing_gross(ji,jj) * rdt_ice        & 
    981884               &                        + opning(ji,jj)                          * rdt_ice 
    982             IF( ato_i(ji,jj) < -epsi10 ) THEN 
    983                neg_ato_i = .TRUE. 
    984             ELSEIF( ato_i(ji,jj) < 0._wp ) THEN    ! roundoff error 
     885            IF    ( ato_i(ji,jj) < -epsi10 ) THEN    ! there is a bug 
     886               IF(lwp)   WRITE(numout,*) 'Ridging error: ato_i < 0 -- ato_i : ',ato_i(ji,jj) 
     887            ELSEIF( ato_i(ji,jj) < 0._wp   ) THEN    ! roundoff error 
    985888               ato_i(ji,jj) = 0._wp 
    986889            ENDIF 
    987          END DO !jj 
    988       END DO !ji 
    989  
    990       ! if negative open water area alert it 
    991       IF( neg_ato_i ) THEN       ! there is a bug 
    992          DO jj = 1, jpj  
    993             DO ji = 1, jpi 
    994                IF( ato_i(ji,jj) < -epsi10 ) THEN  
    995                   WRITE(numout,*) ''   
    996                   WRITE(numout,*) 'Ridging error: ato_i < 0' 
    997                   WRITE(numout,*) 'ato_i : ', ato_i(ji,jj) 
    998                ENDIF               ! ato_i < -epsi10 
    999             END DO 
    1000          END DO 
    1001       ENDIF 
     890         END DO 
     891      END DO 
    1002892 
    1003893      !----------------------------------------------------------------- 
    1004894      ! 2) Save initial state variables 
    1005895      !----------------------------------------------------------------- 
    1006  
    1007       DO jl = 1, jpl 
    1008          aicen_init(:,:,jl) = a_i(:,:,jl) 
    1009          vicen_init(:,:,jl) = v_i(:,:,jl) 
    1010          vsnon_init(:,:,jl) = v_s(:,:,jl) 
    1011          ! 
    1012          smv_i_init(:,:,jl) = smv_i(:,:,jl) 
    1013          oa_i_init (:,:,jl) = oa_i (:,:,jl) 
    1014       END DO !jl 
    1015  
    1016       esnon_init(:,:,:) = e_s(:,:,1,:) 
    1017  
    1018       DO jl = 1, jpl   
    1019          DO jk = 1, nlay_i 
    1020             eicen_init(:,:,jk,jl) = e_i(:,:,jk,jl) 
    1021          END DO 
    1022       END DO 
     896      aicen_init(:,:,:)   = a_i  (:,:,:) 
     897      vicen_init(:,:,:)   = v_i  (:,:,:) 
     898      vsnwn_init(:,:,:)   = v_s  (:,:,:) 
     899      smv_i_init(:,:,:)   = smv_i(:,:,:) 
     900      esnwn_init(:,:,:)   = e_s  (:,:,1,:) 
     901      eicen_init(:,:,:,:) = e_i  (:,:,:,:) 
     902      oa_i_init (:,:,:)   = oa_i (:,:,:) 
    1023903 
    1024904      ! 
     
    1043923                  indxi(icells) = ji 
    1044924                  indxj(icells) = jj 
    1045                ENDIF ! test on a_icen_init  
    1046             END DO ! ji 
    1047          END DO ! jj 
    1048  
    1049          large_afrac = .false. 
    1050          large_afrft = .false. 
    1051  
    1052 !CDIR NODEP 
     925               ENDIF 
     926            END DO 
     927         END DO 
     928 
    1053929         DO ij = 1, icells 
    1054930            ji = indxi(ij) 
     
    1064940            arft2(ji,jj) = arft1(ji,jj) / kraft 
    1065941 
    1066             oirdg1(ji,jj)= aridge(ji,jj,jl1)*closing_gross(ji,jj)*rdt_ice 
    1067             oirft1(ji,jj)= araft (ji,jj,jl1)*closing_gross(ji,jj)*rdt_ice 
    1068             oirdg2(ji,jj)= oirdg1(ji,jj) / krdg(ji,jj,jl1) 
    1069             oirft2(ji,jj)= oirft1(ji,jj) / kraft 
    1070  
    1071942            !--------------------------------------------------------------- 
    1072943            ! 3.3) Compute ridging /rafting fractions, make sure afrac <=1  
     
    1076947            afrft(ji,jj) = arft1(ji,jj) / aicen_init(ji,jj,jl1) !rafting 
    1077948 
    1078             IF (afrac(ji,jj) > kamax + epsi10) THEN  !riging 
    1079                large_afrac = .true. 
    1080             ELSEIF (afrac(ji,jj) > kamax) THEN  ! roundoff error 
     949            IF( afrac(ji,jj) > kamax + epsi10 ) THEN  ! there is a bug 
     950               IF(lwp)   WRITE(numout,*) ' ardg > a_i -- ardg, aicen_init : ', ardg1(ji,jj), aicen_init(ji,jj,jl1) 
     951            ELSEIF( afrac(ji,jj) > kamax ) THEN       ! roundoff error 
    1081952               afrac(ji,jj) = kamax 
    1082953            ENDIF 
    1083             IF (afrft(ji,jj) > kamax + epsi10) THEN !rafting 
    1084                large_afrft = .true. 
    1085             ELSEIF (afrft(ji,jj) > kamax) THEN  ! roundoff error 
     954 
     955            IF( afrft(ji,jj) > kamax + epsi10 ) THEN ! there is a bug 
     956               IF(lwp)   WRITE(numout,*) ' arft > a_i -- arft, aicen_init : ', arft1(ji,jj), aicen_init(ji,jj,jl1)  
     957            ELSEIF( afrft(ji,jj) > kamax) THEN       ! roundoff error 
    1086958               afrft(ji,jj) = kamax 
    1087959            ENDIF 
     
    1091963            !     / rafting category n1. 
    1092964            !-------------------------------------------------------------------------- 
    1093             vrdg1(ji,jj) = vicen_init(ji,jj,jl1) * afrac(ji,jj) / ( 1._wp + ridge_por ) 
    1094             vrdg2(ji,jj) = vrdg1(ji,jj) * ( 1. + ridge_por ) 
    1095             vsw  (ji,jj) = vrdg1(ji,jj) * ridge_por 
    1096  
    1097             vsrdg(ji,jj) = vsnon_init(ji,jj,jl1) * afrac(ji,jj) 
    1098             esrdg(ji,jj) = esnon_init(ji,jj,jl1) * afrac(ji,jj) 
    1099             srdg1(ji,jj) = smv_i_init(ji,jj,jl1) * afrac(ji,jj) / ( 1._wp + ridge_por ) 
    1100             srdg2(ji,jj) = smv_i_init(ji,jj,jl1) * afrac(ji,jj) 
     965            vrdg1(ji,jj) = vicen_init(ji,jj,jl1) * afrac(ji,jj) 
     966            vrdg2(ji,jj) = vrdg1(ji,jj) * ( 1. + rn_por_rdg ) 
     967            vsw  (ji,jj) = vrdg1(ji,jj) * rn_por_rdg 
     968 
     969            vsrdg (ji,jj) = vsnwn_init(ji,jj,jl1) * afrac(ji,jj) 
     970            esrdg (ji,jj) = esnwn_init(ji,jj,jl1) * afrac(ji,jj) 
     971            srdg1 (ji,jj) = smv_i_init(ji,jj,jl1) * afrac(ji,jj) 
     972            oirdg1(ji,jj) = oa_i_init (ji,jj,jl1) * afrac(ji,jj) 
     973            oirdg2(ji,jj) = oa_i_init (ji,jj,jl1) * afrac(ji,jj) / krdg(ji,jj,jl1)  
    1101974 
    1102975            ! rafting volumes, heat contents ... 
    1103             virft(ji,jj) = vicen_init(ji,jj,jl1) * afrft(ji,jj) 
    1104             vsrft(ji,jj) = vsnon_init(ji,jj,jl1) * afrft(ji,jj) 
    1105             esrft(ji,jj) = esnon_init(ji,jj,jl1) * afrft(ji,jj) 
    1106             smrft(ji,jj) = smv_i_init(ji,jj,jl1) * afrft(ji,jj)  
     976            virft (ji,jj) = vicen_init(ji,jj,jl1) * afrft(ji,jj) 
     977            vsrft (ji,jj) = vsnwn_init(ji,jj,jl1) * afrft(ji,jj) 
     978            esrft (ji,jj) = esnwn_init(ji,jj,jl1) * afrft(ji,jj) 
     979            smrft (ji,jj) = smv_i_init(ji,jj,jl1) * afrft(ji,jj)  
     980            oirft1(ji,jj) = oa_i_init (ji,jj,jl1) * afrft(ji,jj)  
     981            oirft2(ji,jj) = oa_i_init (ji,jj,jl1) * afrft(ji,jj) / kraft  
    1107982 
    1108983            ! substract everything 
    1109             a_i(ji,jj,jl1)   = a_i(ji,jj,jl1)   - ardg1(ji,jj)  - arft1(ji,jj) 
    1110             v_i(ji,jj,jl1)   = v_i(ji,jj,jl1)   - vrdg1(ji,jj)  - virft(ji,jj) 
    1111             v_s(ji,jj,jl1)   = v_s(ji,jj,jl1)   - vsrdg(ji,jj)  - vsrft(ji,jj) 
    1112             e_s(ji,jj,1,jl1) = e_s(ji,jj,1,jl1) - esrdg(ji,jj)  - esrft(ji,jj) 
     984            a_i(ji,jj,jl1)   = a_i(ji,jj,jl1)   - ardg1 (ji,jj) - arft1 (ji,jj) 
     985            v_i(ji,jj,jl1)   = v_i(ji,jj,jl1)   - vrdg1 (ji,jj) - virft (ji,jj) 
     986            v_s(ji,jj,jl1)   = v_s(ji,jj,jl1)   - vsrdg (ji,jj) - vsrft (ji,jj) 
     987            e_s(ji,jj,1,jl1) = e_s(ji,jj,1,jl1) - esrdg (ji,jj) - esrft (ji,jj) 
     988            smv_i(ji,jj,jl1) = smv_i(ji,jj,jl1) - srdg1 (ji,jj) - smrft (ji,jj) 
    1113989            oa_i(ji,jj,jl1)  = oa_i(ji,jj,jl1)  - oirdg1(ji,jj) - oirft1(ji,jj) 
    1114             smv_i(ji,jj,jl1) = smv_i(ji,jj,jl1) - srdg1(ji,jj)  - smrft(ji,jj) 
    1115990 
    1116991            !----------------------------------------------------------------- 
    1117992            ! 3.5) Compute properties of new ridges 
    1118993            !----------------------------------------------------------------- 
    1119             !------------- 
     994            !--------- 
    1120995            ! Salinity 
    1121             !------------- 
    1122             smsw(ji,jj)  = sss_m(ji,jj) * vsw(ji,jj) * rhoic / rau0       ! salt content of seawater frozen in voids 
    1123  
    1124             zsrdg2       = srdg1(ji,jj) + smsw(ji,jj)                     ! salt content of new ridge 
    1125  
    1126             srdg2(ji,jj) = MIN( s_i_max * vrdg2(ji,jj) , zsrdg2 )         ! impose a maximum salinity 
     996            !--------- 
     997            smsw(ji,jj)  = vsw(ji,jj) * sss_m(ji,jj)                      ! salt content of seawater frozen in voids !! MV HC2014 
     998            srdg2(ji,jj) = srdg1(ji,jj) + smsw(ji,jj)                     ! salt content of new ridge 
     999 
     1000            !srdg2(ji,jj) = MIN( rn_simax * vrdg2(ji,jj) , zsrdg2 )         ! impose a maximum salinity 
    11271001             
    1128             !                                                             ! excess of salt is flushed into the ocean 
    1129             !sfx_mec(ji,jj) = sfx_mec(ji,jj) + ( zsrdg2 - srdg2(ji,jj) ) * rhoic * r1_rdtice 
    1130  
    1131             !rdm_ice(ji,jj) = rdm_ice(ji,jj) + vsw(ji,jj) * rhoic    ! gurvan: increase in ice volume du to seawater frozen in voids              
     1002            sfx_dyn(ji,jj) = sfx_dyn(ji,jj) - smsw(ji,jj) * rhoic * r1_rdtice 
     1003            wfx_dyn(ji,jj) = wfx_dyn(ji,jj) - vsw (ji,jj) * rhoic * r1_rdtice   ! increase in ice volume du to seawater frozen in voids              
    11321004 
    11331005            !------------------------------------             
     
    11551027            !           ij looping 1-icells 
    11561028 
    1157             msnow_mlt(ji,jj) = msnow_mlt(ji,jj) + rhosn*vsrdg(ji,jj)*(1.0-fsnowrdg)   &   ! rafting included 
    1158                &                                + rhosn*vsrft(ji,jj)*(1.0-fsnowrft) 
    1159  
    1160             esnow_mlt(ji,jj) = esnow_mlt(ji,jj) + esrdg(ji,jj)*(1.0-fsnowrdg)         &   !rafting included 
    1161                &                                + esrft(ji,jj)*(1.0-fsnowrft)           
     1029            msnow_mlt(ji,jj) = msnow_mlt(ji,jj) + rhosn*vsrdg(ji,jj)*(1.0-rn_fsnowrdg)   &   ! rafting included 
     1030               &                                + rhosn*vsrft(ji,jj)*(1.0-rn_fsnowrft) 
     1031 
     1032            ! in J/m2 (same as e_s) 
     1033            esnow_mlt(ji,jj) = esnow_mlt(ji,jj) - esrdg(ji,jj)*(1.0-rn_fsnowrdg)         &   !rafting included 
     1034               &                                - esrft(ji,jj)*(1.0-rn_fsnowrft)           
    11621035 
    11631036            !----------------------------------------------------------------- 
     
    11721045            dhr2(ji,jj) = hrmax(ji,jj,jl1) * hrmax(ji,jj,jl1) - hrmin(ji,jj,jl1) * hrmin(ji,jj,jl1) 
    11731046 
    1174          END DO                 ! ij 
     1047         END DO 
    11751048 
    11761049         !-------------------------------------------------------------------- 
     
    11791052         !-------------------------------------------------------------------- 
    11801053         DO jk = 1, nlay_i 
    1181 !CDIR NODEP 
    11821054            DO ij = 1, icells 
    11831055               ji = indxi(ij) 
    11841056               jj = indxj(ij) 
    11851057               ! heat content of ridged ice 
    1186                erdg1(ji,jj,jk)      = eicen_init(ji,jj,jk,jl1) * afrac(ji,jj) / ( 1._wp + ridge_por )  
     1058               erdg1(ji,jj,jk)      = eicen_init(ji,jj,jk,jl1) * afrac(ji,jj)  
    11871059               eirft(ji,jj,jk)      = eicen_init(ji,jj,jk,jl1) * afrft(ji,jj) 
    11881060               e_i  (ji,jj,jk,jl1)  = e_i(ji,jj,jk,jl1) - erdg1(ji,jj,jk) - eirft(ji,jj,jk) 
    1189                ! sea water heat content 
    1190                ztmelts          = - tmut * sss_m(ji,jj) + rtt 
    1191                ! heat content per unit volume 
    1192                zdummy0          = - rcp * ( sst_m(ji,jj) + rt0 - rtt ) * vsw(ji,jj) 
    1193  
    1194                ! corrected sea water salinity 
    1195                zindb  = MAX( 0._wp , SIGN( 1._wp , vsw(ji,jj) - epsi20 ) ) 
    1196                zdummy = zindb * ( srdg1(ji,jj) - srdg2(ji,jj) ) / MAX( ridge_por * vsw(ji,jj), epsi20 ) 
    1197  
    1198                ztmelts          = - tmut * zdummy + rtt 
    1199                ersw(ji,jj,jk)   = - rcp * ( ztmelts - rtt ) * vsw(ji,jj) 
    1200  
    1201                ! heat flux 
    1202                fheat_mec(ji,jj) = fheat_mec(ji,jj) + ( ersw(ji,jj,jk) - zdummy0 ) * r1_rdtice 
    1203  
    1204                ! Correct dimensions to avoid big values 
    1205                ersw(ji,jj,jk)   = ersw(ji,jj,jk) * 1.e-09 
    1206  
    1207                ! Mutliply by ice volume, and divide by number of layers to get heat content in 10^9 J 
    1208                ersw (ji,jj,jk)  = ersw(ji,jj,jk) * area(ji,jj) * vsw(ji,jj) / REAL( nlay_i ) 
    1209  
     1061                
     1062                
     1063               ! enthalpy of the trapped seawater (J/m2, >0) 
     1064               ! clem: if sst>0, then ersw <0 (is that possible?) 
     1065               ersw(ji,jj,jk)   = - rhoic * vsw(ji,jj) * rcp * sst_m(ji,jj) * r1_nlay_i 
     1066 
     1067               ! heat flux to the ocean 
     1068               hfx_dyn(ji,jj) = hfx_dyn(ji,jj) + ersw(ji,jj,jk) * r1_rdtice  ! > 0 [W.m-2] ocean->ice flux  
     1069 
     1070               ! it is added to sea ice because the sign convention is the opposite of the sign convention for the ocean 
    12101071               erdg2(ji,jj,jk)  = erdg1(ji,jj,jk) + ersw(ji,jj,jk) 
    1211             END DO ! ij 
    1212          END DO !jk 
     1072 
     1073            END DO 
     1074         END DO 
    12131075 
    12141076 
    12151077         IF( con_i ) THEN 
    12161078            DO jk = 1, nlay_i 
    1217 !CDIR NODEP 
    12181079               DO ij = 1, icells 
    12191080                  ji = indxi(ij) 
    12201081                  jj = indxj(ij) 
    12211082                  eice_init(ji,jj) = eice_init(ji,jj) + erdg2(ji,jj,jk) - erdg1(ji,jj,jk) 
    1222                END DO ! ij 
    1223             END DO !jk 
    1224          ENDIF 
    1225  
    1226          IF( large_afrac ) THEN   ! there is a bug 
    1227 !CDIR NODEP 
    1228             DO ij = 1, icells 
    1229                ji = indxi(ij) 
    1230                jj = indxj(ij) 
    1231                IF( afrac(ji,jj) > kamax + epsi10 ) THEN  
    1232                   WRITE(numout,*) '' 
    1233                   WRITE(numout,*) ' ardg > a_i' 
    1234                   WRITE(numout,*) ' ardg, aicen_init : ', ardg1(ji,jj), aicen_init(ji,jj,jl1) 
    1235                ENDIF 
    1236             END DO 
    1237          ENDIF 
    1238          IF( large_afrft ) THEN  ! there is a bug 
    1239 !CDIR NODEP 
    1240             DO ij = 1, icells 
    1241                ji = indxi(ij) 
    1242                jj = indxj(ij) 
    1243                IF( afrft(ji,jj) > kamax + epsi10 ) THEN  
    1244                   WRITE(numout,*) '' 
    1245                   WRITE(numout,*) ' arft > a_i' 
    1246                   WRITE(numout,*) ' arft, aicen_init : ', arft1(ji,jj), aicen_init(ji,jj,jl1) 
    1247                ENDIF 
     1083               END DO 
    12481084            END DO 
    12491085         ENDIF 
     
    12531089         !------------------------------------------------------------------------------- 
    12541090         !        jl1 looping 1-jpl 
    1255          DO jl2  = ice_cat_bounds(1,1), ice_cat_bounds(1,2)  
     1091         DO jl2  = 1, jpl  
    12561092            ! over categories to which ridged ice is transferred 
    1257 !CDIR NODEP 
    12581093            DO ij = 1, icells 
    12591094               ji = indxi(ij) 
     
    12641099               ! Transfer area, volume, and energy accordingly. 
    12651100 
    1266                IF( hrmin(ji,jj,jl1) >= hi_max(jl2)  .OR.        & 
    1267                    hrmax(ji,jj,jl1) <= hi_max(jl2-1) ) THEN 
     1101               IF( hrmin(ji,jj,jl1) >= hi_max(jl2) .OR. hrmax(ji,jj,jl1) <= hi_max(jl2-1) ) THEN 
    12681102                  hL = 0._wp 
    12691103                  hR = 0._wp 
     
    12791113               a_i  (ji,jj  ,jl2) = a_i  (ji,jj  ,jl2) + ardg2 (ji,jj) * farea 
    12801114               v_i  (ji,jj  ,jl2) = v_i  (ji,jj  ,jl2) + vrdg2 (ji,jj) * fvol(ji,jj) 
    1281                v_s  (ji,jj  ,jl2) = v_s  (ji,jj  ,jl2) + vsrdg (ji,jj) * fvol(ji,jj) * fsnowrdg 
    1282                e_s  (ji,jj,1,jl2) = e_s  (ji,jj,1,jl2) + esrdg (ji,jj) * fvol(ji,jj) * fsnowrdg 
     1115               v_s  (ji,jj  ,jl2) = v_s  (ji,jj  ,jl2) + vsrdg (ji,jj) * fvol(ji,jj) * rn_fsnowrdg 
     1116               e_s  (ji,jj,1,jl2) = e_s  (ji,jj,1,jl2) + esrdg (ji,jj) * fvol(ji,jj) * rn_fsnowrdg 
    12831117               smv_i(ji,jj  ,jl2) = smv_i(ji,jj  ,jl2) + srdg2 (ji,jj) * fvol(ji,jj) 
    12841118               oa_i (ji,jj  ,jl2) = oa_i (ji,jj  ,jl2) + oirdg2(ji,jj) * farea 
    12851119 
    1286             END DO ! ij 
     1120            END DO 
    12871121 
    12881122            ! Transfer ice energy to category jl2 by ridging 
    12891123            DO jk = 1, nlay_i 
    1290 !CDIR NODEP 
    12911124               DO ij = 1, icells 
    12921125                  ji = indxi(ij) 
    12931126                  jj = indxj(ij) 
    1294                   e_i(ji,jj,jk,jl2) = e_i(ji,jj,jk,jl2) + fvol(ji,jj)*erdg2(ji,jj,jk) 
     1127                  e_i(ji,jj,jk,jl2) = e_i(ji,jj,jk,jl2) + fvol(ji,jj) * erdg2(ji,jj,jk) 
    12951128               END DO 
    12961129            END DO 
     
    12981131         END DO                 ! jl2 (new ridges)             
    12991132 
    1300          DO jl2 = ice_cat_bounds(1,1), ice_cat_bounds(1,2)  
    1301  
    1302 !CDIR NODEP 
     1133         DO jl2 = 1, jpl  
     1134 
    13031135            DO ij = 1, icells 
    13041136               ji = indxi(ij) 
     
    13071139               ! thickness category jl2, transfer area, volume, and energy accordingly. 
    13081140               ! 
    1309                IF( hraft(ji,jj,jl1) <= hi_max(jl2)  .AND.        & 
    1310                    hraft(ji,jj,jl1) >  hi_max(jl2-1) ) THEN 
     1141               IF( hraft(ji,jj,jl1) <= hi_max(jl2) .AND. hraft(ji,jj,jl1) >  hi_max(jl2-1) ) THEN 
    13111142                  a_i  (ji,jj  ,jl2) = a_i  (ji,jj  ,jl2) + arft2 (ji,jj) 
    13121143                  v_i  (ji,jj  ,jl2) = v_i  (ji,jj  ,jl2) + virft (ji,jj) 
    1313                   v_s  (ji,jj  ,jl2) = v_s  (ji,jj  ,jl2) + vsrft (ji,jj) * fsnowrft 
    1314                   e_s  (ji,jj,1,jl2) = e_s  (ji,jj,1,jl2) + esrft (ji,jj) * fsnowrft 
     1144                  v_s  (ji,jj  ,jl2) = v_s  (ji,jj  ,jl2) + vsrft (ji,jj) * rn_fsnowrft 
     1145                  e_s  (ji,jj,1,jl2) = e_s  (ji,jj,1,jl2) + esrft (ji,jj) * rn_fsnowrft 
    13151146                  smv_i(ji,jj  ,jl2) = smv_i(ji,jj  ,jl2) + smrft (ji,jj)     
    1316                   oa_i (ji,jj  ,jl2) = oa_i (ji,jj  ,jl2) + oirft2(ji,jj)     
    1317                ENDIF ! hraft 
     1147                  oa_i (ji,jj  ,jl2) = oa_i (ji,jj  ,jl2) + oirft2(ji,jj) 
     1148               ENDIF 
    13181149               ! 
    1319             END DO ! ij 
     1150            END DO 
    13201151 
    13211152            ! Transfer rafted ice energy to category jl2  
    13221153            DO jk = 1, nlay_i 
    1323 !CDIR NODEP 
    13241154               DO ij = 1, icells 
    13251155                  ji = indxi(ij) 
    13261156                  jj = indxj(ij) 
    1327                   IF(  hraft(ji,jj,jl1)  <=  hi_max(jl2)   .AND.        & 
    1328                        hraft(ji,jj,jl1)  >   hi_max(jl2-1)  ) THEN 
     1157                  IF( hraft(ji,jj,jl1) <= hi_max(jl2) .AND. hraft(ji,jj,jl1) > hi_max(jl2-1)  ) THEN 
    13291158                     e_i(ji,jj,jk,jl2) = e_i(ji,jj,jk,jl2) + eirft(ji,jj,jk) 
    13301159                  ENDIF 
    1331                END DO           ! ij 
    1332             END DO !jk 
    1333  
    1334          END DO ! jl2 
     1160               END DO 
     1161            END DO 
     1162 
     1163         END DO 
    13351164 
    13361165      END DO ! jl1 (deforming categories) 
     
    13461175         CALL lim_cons_check (eice_init, eice_final, 1.0e-2, fieldid)  
    13471176 
    1348          DO ji = mi0(jiindx), mi1(jiindx) 
    1349             DO jj = mj0(jjindx), mj1(jjindx) 
     1177         DO ji = mi0(iiceprt), mi1(iiceprt) 
     1178            DO jj = mj0(jiceprt), mj1(jiceprt) 
    13501179               WRITE(numout,*) ' vice_init  : ', vice_init (ji,jj) 
    13511180               WRITE(numout,*) ' vice_final : ', vice_final(ji,jj) 
     
    13561185      ENDIF 
    13571186      ! 
    1358       CALL wrk_dealloc( (jpi+1)*(jpj+1),      indxi, indxj ) 
    1359       CALL wrk_dealloc( jpi, jpj,             vice_init, vice_final, eice_init, eice_final ) 
    1360       CALL wrk_dealloc( jpi, jpj,             afrac, fvol , ardg1, ardg2, vsrdg, esrdg, oirdg1, oirdg2, dhr, dhr2 ) 
    1361       CALL wrk_dealloc( jpi, jpj,             vrdg1, vrdg2, vsw  , srdg1, srdg2, smsw ) 
    1362       CALL wrk_dealloc( jpi, jpj,             afrft, arft1, arft2, virft, vsrft, esrft, smrft, oirft1, oirft2 ) 
    1363       CALL wrk_dealloc( jpi, jpj, jpl,        aicen_init, vicen_init, vsnon_init, esnon_init, smv_i_init, oa_i_init ) 
    1364       CALL wrk_dealloc( jpi, jpj, jkmax,      eirft, erdg1, erdg2, ersw ) 
    1365       CALL wrk_dealloc( jpi, jpj, jkmax, jpl, eicen_init ) 
     1187      CALL wrk_dealloc( (jpi+1)*(jpj+1),        indxi, indxj ) 
     1188      CALL wrk_dealloc( jpi, jpj,               vice_init, vice_final, eice_init, eice_final ) 
     1189      CALL wrk_dealloc( jpi, jpj,               afrac, fvol , ardg1, ardg2, vsrdg, esrdg, dhr, dhr2 ) 
     1190      CALL wrk_dealloc( jpi, jpj,               vrdg1, vrdg2, vsw  , srdg1, srdg2, smsw, oirdg1, oirdg2 ) 
     1191      CALL wrk_dealloc( jpi, jpj,               afrft, arft1, arft2, virft, vsrft, esrft, smrft, oirft1, oirft2 ) 
     1192      CALL wrk_dealloc( jpi, jpj, jpl,          aicen_init, vicen_init, vsnwn_init, esnwn_init, smv_i_init, oa_i_init ) 
     1193      CALL wrk_dealloc( jpi, jpj, nlay_i,       eirft, erdg1, erdg2, ersw ) 
     1194      CALL wrk_dealloc( jpi, jpj, nlay_i, jpl, eicen_init ) 
    13661195      ! 
    13671196   END SUBROUTINE lim_itd_me_ridgeshift 
    1368  
    1369  
    1370    SUBROUTINE lim_itd_me_asumr 
    1371       !!----------------------------------------------------------------------------- 
    1372       !!                ***  ROUTINE lim_itd_me_asumr *** 
    1373       !! 
    1374       !! ** Purpose :   finds total fractional area 
    1375       !! 
    1376       !! ** Method  :   Find the total area of ice plus open water in each grid cell. 
    1377       !!              This is similar to the aggregate_area subroutine except that the 
    1378       !!              total area can be greater than 1, so the open water area is  
    1379       !!              included in the sum instead of being computed as a residual.  
    1380       !!----------------------------------------------------------------------------- 
    1381       INTEGER ::   jl   ! dummy loop index 
    1382       !!----------------------------------------------------------------------------- 
    1383       ! 
    1384       asum(:,:) = ato_i(:,:)                    ! open water 
    1385       DO jl = 1, jpl                            ! ice categories 
    1386          asum(:,:) = asum(:,:) + a_i(:,:,jl) 
    1387       END DO 
    1388       ! 
    1389    END SUBROUTINE lim_itd_me_asumr 
    1390  
    13911197 
    13921198   SUBROUTINE lim_itd_me_init 
     
    14041210      !!------------------------------------------------------------------- 
    14051211      INTEGER :: ios                 ! Local integer output status for namelist read 
    1406       NAMELIST/namiceitdme/ ridge_scheme_swi, Cs, Cf, fsnowrdg, fsnowrft,&  
    1407          Gstar, astar,                                & 
    1408          Hstar, raftswi, hparmeter, Craft, ridge_por, & 
    1409          sal_max_ridge,  partfun_swi, transfun_swi,   & 
    1410          brinstren_swi 
     1212      NAMELIST/namiceitdme/ rn_cs, rn_fsnowrdg, rn_fsnowrft,              &  
     1213        &                   rn_gstar, rn_astar, rn_hstar, ln_rafting, rn_hraft, rn_craft, rn_por_rdg, & 
     1214        &                   nn_partfun 
    14111215      !!------------------------------------------------------------------- 
    14121216      ! 
     
    14241228         WRITE(numout,*)' lim_itd_me_init : ice parameters for mechanical ice redistribution ' 
    14251229         WRITE(numout,*)' ~~~~~~~~~~~~~~~' 
    1426          WRITE(numout,*)'   Switch choosing the ice redistribution scheme           ridge_scheme_swi', ridge_scheme_swi  
    1427          WRITE(numout,*)'   Fraction of shear energy contributing to ridging        Cs              ', Cs  
    1428          WRITE(numout,*)'   Ratio of ridging work to PotEner change in ridging      Cf              ', Cf  
    1429          WRITE(numout,*)'   Fraction of snow volume conserved during ridging        fsnowrdg        ', fsnowrdg  
    1430          WRITE(numout,*)'   Fraction of snow volume conserved during ridging        fsnowrft        ', fsnowrft  
    1431          WRITE(numout,*)'   Fraction of total ice coverage contributing to ridging  Gstar           ', Gstar 
    1432          WRITE(numout,*)'   Equivalent to G* for an exponential part function       astar           ', astar 
    1433          WRITE(numout,*)'   Quantity playing a role in max ridged ice thickness     Hstar           ', Hstar 
    1434          WRITE(numout,*)'   Rafting of ice sheets or not                            raftswi         ', raftswi 
    1435          WRITE(numout,*)'   Parmeter thickness (threshold between ridge-raft)       hparmeter       ', hparmeter 
    1436          WRITE(numout,*)'   Rafting hyperbolic tangent coefficient                  Craft           ', Craft   
    1437          WRITE(numout,*)'   Initial porosity of ridges                              ridge_por       ', ridge_por 
    1438          WRITE(numout,*)'   Maximum salinity of ridging ice                         sal_max_ridge   ', sal_max_ridge 
    1439          WRITE(numout,*)'   Switch for part. function (0) linear (1) exponential    partfun_swi     ', partfun_swi 
    1440          WRITE(numout,*)'   Switch for tran. function (0) linear (1) exponential    transfun_swi    ', transfun_swi 
    1441          WRITE(numout,*)'   Switch for including brine volume in ice strength comp. brinstren_swi   ', brinstren_swi 
     1230         WRITE(numout,*)'   Fraction of shear energy contributing to ridging        rn_cs       = ', rn_cs  
     1231         WRITE(numout,*)'   Fraction of snow volume conserved during ridging        rn_fsnowrdg = ', rn_fsnowrdg  
     1232         WRITE(numout,*)'   Fraction of snow volume conserved during ridging        rn_fsnowrft = ', rn_fsnowrft  
     1233         WRITE(numout,*)'   Fraction of total ice coverage contributing to ridging  rn_gstar    = ', rn_gstar 
     1234         WRITE(numout,*)'   Equivalent to G* for an exponential part function       rn_astar    = ', rn_astar 
     1235         WRITE(numout,*)'   Quantity playing a role in max ridged ice thickness     rn_hstar    = ', rn_hstar 
     1236         WRITE(numout,*)'   Rafting of ice sheets or not                            ln_rafting  = ', ln_rafting 
     1237         WRITE(numout,*)'   Parmeter thickness (threshold between ridge-raft)       rn_hraft    = ', rn_hraft 
     1238         WRITE(numout,*)'   Rafting hyperbolic tangent coefficient                  rn_craft    = ', rn_craft   
     1239         WRITE(numout,*)'   Initial porosity of ridges                              rn_por_rdg  = ', rn_por_rdg 
     1240         WRITE(numout,*)'   Switch for part. function (0) linear (1) exponential    nn_partfun  = ', nn_partfun 
    14421241      ENDIF 
    14431242      ! 
    14441243   END SUBROUTINE lim_itd_me_init 
    1445  
    1446  
    1447    SUBROUTINE lim_itd_me_zapsmall 
    1448       !!------------------------------------------------------------------- 
    1449       !!                   ***  ROUTINE lim_itd_me_zapsmall *** 
    1450       !! 
    1451       !! ** Purpose :   Remove too small sea ice areas and correct salt fluxes 
    1452       !! 
    1453       !! history : 
    1454       !! author: William H. Lipscomb, LANL 
    1455       !! Nov 2003:  Modified by Julie Schramm to conserve volume and energy 
    1456       !! Sept 2004: Modified by William Lipscomb; replaced normalize_state with 
    1457       !!            additions to local freshwater, salt, and heat fluxes 
    1458       !!  9.0, LIM3.0 - 02-2006 (M. Vancoppenolle) original code 
    1459       !!------------------------------------------------------------------- 
    1460       INTEGER ::   ji, jj, jl, jk   ! dummy loop indices 
    1461       INTEGER ::   icells           ! number of cells with ice to zap 
    1462  
    1463       REAL(wp), POINTER, DIMENSION(:,:) ::   zmask   ! 2D workspace 
    1464       REAL(wp)                          ::   zmask_glo 
    1465 !!gm      REAL(wp) ::   xtmp      ! temporary variable 
    1466       !!------------------------------------------------------------------- 
    1467  
    1468       CALL wrk_alloc( jpi, jpj, zmask ) 
    1469  
    1470       DO jl = 1, jpl 
    1471  
    1472          !----------------------------------------------------------------- 
    1473          ! Count categories to be zapped. 
    1474          ! Abort model in case of negative area. 
    1475          !----------------------------------------------------------------- 
    1476          icells = 0 
    1477          zmask(:,:)  = 0._wp 
    1478          DO jj = 1, jpj 
    1479             DO ji = 1, jpi 
    1480                IF(  ( a_i(ji,jj,jl) >= -epsi10 .AND. a_i(ji,jj,jl) <  0._wp   ) .OR.   & 
    1481                   & ( a_i(ji,jj,jl) >  0._wp   .AND. a_i(ji,jj,jl) <= epsi10  ) .OR.   & 
    1482                   & ( v_i(ji,jj,jl) == 0._wp   .AND. a_i(ji,jj,jl) >  0._wp   ) .OR.   & 
    1483                   & ( v_i(ji,jj,jl) >  0._wp   .AND. v_i(ji,jj,jl) <= epsi10  ) )   zmask(ji,jj) = 1._wp 
    1484             END DO 
    1485          END DO 
    1486          !zmask_glo = glob_sum(zmask) 
    1487          !IF( ln_nicep .AND. lwp ) WRITE(numout,*) zmask_glo, ' cells of ice zapped in the ocean ' 
    1488  
    1489          !----------------------------------------------------------------- 
    1490          ! Zap ice energy and use ocean heat to melt ice 
    1491          !----------------------------------------------------------------- 
    1492  
    1493          DO jk = 1, nlay_i 
    1494             DO jj = 1 , jpj 
    1495                DO ji = 1 , jpi 
    1496 !!gm                  xtmp = e_i(ji,jj,jk,jl) / area(ji,jj) * r1_rdtice 
    1497 !!gm                  xtmp = xtmp * unit_fac 
    1498                   ! fheat_res(ji,jj) = fheat_res(ji,jj) - xtmp 
    1499                   e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl) * ( 1._wp - zmask(ji,jj) ) 
    1500                END DO 
    1501             END DO 
    1502          END DO 
    1503  
    1504          DO jj = 1 , jpj 
    1505             DO ji = 1 , jpi 
    1506  
    1507                !----------------------------------------------------------------- 
    1508                ! Zap snow energy and use ocean heat to melt snow 
    1509                !----------------------------------------------------------------- 
    1510                !           xtmp = esnon(i,j,n) / dt ! < 0 
    1511                !           fhnet(i,j)      = fhnet(i,j)      + xtmp 
    1512                !           fhnet_hist(i,j) = fhnet_hist(i,j) + xtmp 
    1513                ! xtmp is greater than 0 
    1514                ! fluxes are positive to the ocean 
    1515                ! here the flux has to be negative for the ocean 
    1516 !!gm               xtmp = ( rhosn*cpic*( rtt-t_s(ji,jj,1,jl) ) + rhosn*lfus ) * r1_rdtice 
    1517                !           fheat_res(ji,jj) = fheat_res(ji,jj) - xtmp 
    1518  
    1519 !!gm               xtmp = ( rhosn*cpic*( rtt-t_s(ji,jj,1,jl) ) + rhosn*lfus ) * r1_rdtice !RB   ??????? 
    1520  
    1521                t_s(ji,jj,1,jl) = rtt * zmask(ji,jj) + t_s(ji,jj,1,jl) * ( 1._wp - zmask(ji,jj) ) 
    1522  
    1523                !----------------------------------------------------------------- 
    1524                ! zap ice and snow volume, add water and salt to ocean 
    1525                !----------------------------------------------------------------- 
    1526  
    1527                !           xtmp = (rhoi*vicen(i,j,n) + rhos*vsnon(i,j,n)) / dt 
    1528                !           sfx_res(ji,jj)  = sfx_res(ji,jj) + ( sss_m(ji,jj)                  )   & 
    1529                !                                            * rhosn * v_s(ji,jj,jl) * r1_rdtice 
    1530                !           sfx_res(ji,jj)  = sfx_res(ji,jj) + ( sss_m(ji,jj) - sm_i(ji,jj,jl) )   &  
    1531                !                                            * rhoic * v_i(ji,jj,jl) * r1_rdtice 
    1532                !           sfx (i,j)      = sfx (i,j)      + xtmp 
    1533  
    1534                ato_i(ji,jj)    = a_i  (ji,jj,jl) *       zmask(ji,jj)   + ato_i(ji,jj) 
    1535                a_i  (ji,jj,jl) = a_i  (ji,jj,jl) * ( 1._wp - zmask(ji,jj) ) 
    1536                v_i  (ji,jj,jl) = v_i  (ji,jj,jl) * ( 1._wp - zmask(ji,jj) ) 
    1537                v_s  (ji,jj,jl) = v_s  (ji,jj,jl) * ( 1._wp - zmask(ji,jj) ) 
    1538                t_su (ji,jj,jl) = t_su (ji,jj,jl) * ( 1._wp - zmask(ji,jj) ) + t_bo(ji,jj) * zmask(ji,jj) 
    1539                oa_i (ji,jj,jl) = oa_i (ji,jj,jl) * ( 1._wp - zmask(ji,jj) ) 
    1540                smv_i(ji,jj,jl) = smv_i(ji,jj,jl) * ( 1._wp - zmask(ji,jj) ) 
    1541                ! 
    1542             END DO 
    1543          END DO 
    1544          ! 
    1545       END DO                 ! jl  
    1546       ! 
    1547       CALL wrk_dealloc( jpi, jpj, zmask ) 
    1548       ! 
    1549    END SUBROUTINE lim_itd_me_zapsmall 
    15501244 
    15511245#else 
     
    15581252   SUBROUTINE lim_itd_me_icestrength 
    15591253   END SUBROUTINE lim_itd_me_icestrength 
    1560    SUBROUTINE lim_itd_me_sort 
    1561    END SUBROUTINE lim_itd_me_sort 
    15621254   SUBROUTINE lim_itd_me_init 
    15631255   END SUBROUTINE lim_itd_me_init 
    1564    SUBROUTINE lim_itd_me_zapsmall 
    1565    END SUBROUTINE lim_itd_me_zapsmall 
    15661256#endif 
    15671257   !!====================================================================== 
Note: See TracChangeset for help on using the changeset viewer.