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 10425 for NEMO/trunk/src/ICE – NEMO

Changeset 10425 for NEMO/trunk/src/ICE


Ignore:
Timestamp:
2018-12-19T22:54:16+01:00 (5 years ago)
Author:
smasson
Message:

trunk: merge back dev_r10164_HPC09_ESIWACE_PREP_MERGE@10424 into the trunk

Location:
NEMO/trunk/src/ICE
Files:
19 edited

Legend:

Unmodified
Added
Removed
  • NEMO/trunk/src/ICE/ice.F90

    r10415 r10425  
    207207   REAL(wp), PUBLIC, PARAMETER ::   epsi20 = 1.e-20_wp  !: small number  
    208208 
     209   !                                     !!** some other parameters for advection using the ULTIMATE-MACHO scheme 
     210   LOGICAL, PUBLIC, DIMENSION(2) :: l_split_advumx = .FALSE.    ! force one iteration at the first time-step 
    209211 
    210212   !                                     !!** define arrays 
     
    463465 
    464466      ice_alloc = MAXVAL( ierr(:) ) 
    465       IF( ice_alloc /= 0 )   CALL ctl_warn('ice_alloc: failed to allocate arrays.') 
     467      IF( ice_alloc /= 0 )   CALL ctl_stop( 'STOP', 'ice_alloc: failed to allocate arrays.' ) 
    466468      ! 
    467469   END FUNCTION ice_alloc 
  • NEMO/trunk/src/ICE/ice1d.F90

    r10069 r10425  
    229229 
    230230      ice1D_alloc = MAXVAL( ierr(:) ) 
    231       IF( ice1D_alloc /= 0 )   CALL ctl_warn( 'ice1D_alloc: failed to allocate arrays.' ) 
     231      IF( ice1D_alloc /= 0 )   CALL ctl_stop( 'STOP',  'ice1D_alloc: failed to allocate arrays.' ) 
    232232      ! 
    233233   END FUNCTION ice1D_alloc 
  • NEMO/trunk/src/ICE/icecor.F90

    r10069 r10425  
    119119            END DO 
    120120         END DO 
    121          CALL lbc_lnk_multi( u_ice, 'U', -1., v_ice, 'V', -1. )            ! lateral boundary conditions 
     121         CALL lbc_lnk_multi( 'icecor', u_ice, 'U', -1., v_ice, 'V', -1. )            ! lateral boundary conditions 
    122122      ENDIF 
    123123 
  • NEMO/trunk/src/ICE/icectl.F90

    r10415 r10425  
    7777      IF( icount == 0 ) THEN 
    7878         !                          ! water flux 
    79          pdiag_fv = glob_sum( -( wfx_bog(:,:) + wfx_bom(:,:) + wfx_sum(:,:) + wfx_sni(:,:) +                  & 
     79         pdiag_fv = glob_sum( 'icectl',                                                                       & 
     80            &                 -( wfx_bog(:,:) + wfx_bom(:,:) + wfx_sum(:,:) + wfx_sni(:,:) +                  & 
    8081            &                    wfx_opw(:,:) + wfx_res(:,:) + wfx_dyn(:,:) + wfx_lam(:,:) + wfx_pnd(:,:)  +  & 
    8182            &                    wfx_snw_sni(:,:) + wfx_snw_sum(:,:) + wfx_snw_dyn(:,:) + wfx_snw_sub(:,:) +  & 
     
    8485         ! 
    8586         !                          ! salt flux 
    86          pdiag_fs = glob_sum(  ( sfx_bri(:,:) + sfx_bog(:,:) + sfx_bom(:,:) + sfx_sum(:,:) + sfx_sni(:,:) +  & 
     87         pdiag_fs = glob_sum( 'icectl',                                                                     & 
     88            &                  ( sfx_bri(:,:) + sfx_bog(:,:) + sfx_bom(:,:) + sfx_sum(:,:) + sfx_sni(:,:) +  & 
    8789            &                    sfx_opw(:,:) + sfx_res(:,:) + sfx_dyn(:,:) + sfx_sub(:,:) + sfx_lam(:,:)    & 
    8890            &                  ) *  e1e2t(:,:) ) * zconv  
    8991         ! 
    9092         !                          ! heat flux 
    91          pdiag_ft = glob_sum(  ( hfx_sum(:,:) + hfx_bom(:,:) + hfx_bog(:,:) + hfx_dif(:,:) + hfx_opw(:,:) + hfx_snw(:,:)  &  
     93         pdiag_ft = glob_sum( 'icectl',                                                                    & 
     94            &                  ( hfx_sum(:,:) + hfx_bom(:,:) + hfx_bog(:,:) + hfx_dif(:,:) + hfx_opw(:,:) + hfx_snw(:,:)  &  
    9295            &                  - hfx_thd(:,:) - hfx_dyn(:,:) - hfx_res(:,:) - hfx_sub(:,:) - hfx_spr(:,:)   & 
    9396            &                  ) *  e1e2t(:,:) ) * zconv 
    9497 
    95          pdiag_v = glob_sum( SUM( v_i * rhoi + v_s * rhos, dim=3 ) * e1e2t * zconv ) 
    96  
    97          pdiag_s = glob_sum( SUM( sv_i * rhoi            , dim=3 ) * e1e2t * zconv ) 
    98  
    99          pdiag_t = glob_sum( (  SUM( SUM( e_i(:,:,1:nlay_i,:), dim=4 ), dim=3 )     & 
     98         pdiag_v = glob_sum( 'icectl', SUM( v_i * rhoi + v_s * rhos, dim=3 ) * e1e2t * zconv ) 
     99 
     100         pdiag_s = glob_sum( 'icectl', SUM( sv_i * rhoi            , dim=3 ) * e1e2t * zconv ) 
     101 
     102         pdiag_t = glob_sum( 'icectl', (  SUM( SUM( e_i(:,:,1:nlay_i,:), dim=4 ), dim=3 )     & 
    100103            &                 + SUM( SUM( e_s(:,:,1:nlay_s,:), dim=4 ), dim=3 ) ) * e1e2t ) * zconv 
    101104 
     
    103106 
    104107         ! water flux 
    105          zfv  = glob_sum( -( wfx_bog(:,:) + wfx_bom(:,:) + wfx_sum(:,:) + wfx_sni(:,:) +                  & 
     108         zfv = glob_sum( 'icectl',                                                                        & 
     109            &             -( wfx_bog(:,:) + wfx_bom(:,:) + wfx_sum(:,:) + wfx_sni(:,:) +                  & 
    106110            &                wfx_opw(:,:) + wfx_res(:,:) + wfx_dyn(:,:) + wfx_lam(:,:) + wfx_pnd(:,:)  +  & 
    107111            &                wfx_snw_sni(:,:) + wfx_snw_sum(:,:) + wfx_snw_dyn(:,:) + wfx_snw_sub(:,:) +  & 
     
    110114 
    111115         ! salt flux 
    112          zfs  = glob_sum(  ( sfx_bri(:,:) + sfx_bog(:,:) + sfx_bom(:,:) + sfx_sum(:,:) + sfx_sni(:,:) +  & 
     116         zfs = glob_sum( 'icectl',                                                                       & 
     117            &              ( sfx_bri(:,:) + sfx_bog(:,:) + sfx_bom(:,:) + sfx_sum(:,:) + sfx_sni(:,:) +  & 
    113118            &                sfx_opw(:,:) + sfx_res(:,:) + sfx_dyn(:,:) + sfx_sub(:,:) + sfx_lam(:,:)    &  
    114119            &              ) * e1e2t(:,:) ) * zconv - pdiag_fs 
    115120 
    116121         ! heat flux 
    117          zft  = glob_sum(  ( hfx_sum(:,:) + hfx_bom(:,:) + hfx_bog(:,:) + hfx_dif(:,:) + hfx_opw(:,:) + hfx_snw(:,:)  &  
     122         zft = glob_sum( 'icectl',                                                                      & 
     123            &              ( hfx_sum(:,:) + hfx_bom(:,:) + hfx_bog(:,:) + hfx_dif(:,:) + hfx_opw(:,:) + hfx_snw(:,:)  &  
    118124            &              - hfx_thd(:,:) - hfx_dyn(:,:) - hfx_res(:,:) - hfx_sub(:,:) - hfx_spr(:,:)   & 
    119125            &              ) * e1e2t(:,:) ) * zconv - pdiag_ft 
    120126  
    121127         ! outputs 
    122          zv = ( ( glob_sum( SUM( v_i * rhoi + v_s * rhos, dim=3 ) * e1e2t ) * zconv  & 
     128         zv = ( ( glob_sum( 'icectl', SUM( v_i * rhoi + v_s * rhos, dim=3 ) * e1e2t ) * zconv  & 
    123129            &     - pdiag_v ) * r1_rdtice - zfv ) * rday 
    124130 
    125          zs = ( ( glob_sum( SUM( sv_i * rhoi            , dim=3 ) * e1e2t ) * zconv  & 
     131         zs = ( ( glob_sum( 'icectl', SUM( sv_i * rhoi            , dim=3 ) * e1e2t ) * zconv  & 
    126132            &     - pdiag_s ) * r1_rdtice + zfs ) * rday 
    127133 
    128          zt = ( glob_sum( (  SUM( SUM( e_i(:,:,1:nlay_i,:), dim=4 ), dim=3 )   & 
     134         zt = ( glob_sum( 'icectl',                                                                & 
     135            &             (  SUM( SUM( e_i(:,:,1:nlay_i,:), dim=4 ), dim=3 )                       & 
    129136            &              + SUM( SUM( e_s(:,:,1:nlay_s,:), dim=4 ), dim=3 ) ) * e1e2t ) * zconv   & 
    130137            &   - pdiag_t ) * r1_rdtice + zft 
    131138 
    132139         ! zvtrp and zetrp must be close to 0 if the advection scheme is conservative 
    133          zvtrp = glob_sum( ( diag_trp_vi * rhoi + diag_trp_vs * rhos ) * e1e2t  ) * zconv * rday  
    134          zetrp = glob_sum( ( diag_trp_ei        + diag_trp_es        ) * e1e2t  ) * zconv 
    135  
    136          zvmin = glob_min( v_i ) 
    137          zamax = glob_max( SUM( a_i, dim=3 ) ) 
    138          zamin = glob_min( a_i ) 
     140         zvtrp = glob_sum( 'icectl', ( diag_trp_vi * rhoi + diag_trp_vs * rhos ) * e1e2t  ) * zconv * rday  
     141         zetrp = glob_sum( 'icectl', ( diag_trp_ei        + diag_trp_es        ) * e1e2t  ) * zconv 
     142 
     143         zvmin = glob_min( 'icectl', v_i ) 
     144         zamax = glob_max( 'icectl', SUM( a_i, dim=3 ) ) 
     145         zamin = glob_min( 'icectl', a_i ) 
    139146 
    140147         ! set threshold values and calculate the ice area (+epsi10 to set a threshold > 0 when there is no ice)  
    141          zarea   = glob_sum( SUM( a_i + epsi10, dim=3 ) * e1e2t ) * zconv ! in 1.e9 m2 
     148         zarea   = glob_sum( 'icectl', SUM( a_i + epsi10, dim=3 ) * e1e2t ) * zconv ! in 1.e9 m2 
    142149         zv_sill = zarea * 2.5e-5 
    143150         zs_sill = zarea * 25.e-5 
     
    184191 
    185192      ! water flux 
    186       zvfx  = glob_sum( ( wfx_ice + wfx_snw + wfx_spr + wfx_sub + diag_vice + diag_vsnw ) * e1e2t ) * zconv * rday 
     193      zvfx  = glob_sum( 'icectl', ( wfx_ice + wfx_snw + wfx_spr + wfx_sub + diag_vice + diag_vsnw ) * e1e2t ) * zconv * rday 
    187194 
    188195      ! salt flux 
    189       zsfx  = glob_sum( ( sfx + diag_sice ) * e1e2t ) * zconv * rday 
     196      zsfx  = glob_sum( 'icectl', ( sfx + diag_sice ) * e1e2t ) * zconv * rday 
    190197 
    191198      ! heat flux 
    192       zhfx  = glob_sum( ( qt_atm_oi - qt_oce_ai - diag_heat ) * e1e2t ) * zconv 
     199      zhfx  = glob_sum( 'icectl', ( qt_atm_oi - qt_oce_ai - diag_heat ) * e1e2t ) * zconv 
    193200 
    194201      ! set threshold values and calculate the ice area (+epsi10 to set a threshold > 0 when there is no ice)  
    195       zarea   = glob_sum( SUM( a_i + epsi10, dim=3 ) * e1e2t ) * zconv ! in 1.e9 m2 
     202      zarea   = glob_sum( 'icectl', SUM( a_i + epsi10, dim=3 ) * e1e2t ) * zconv ! in 1.e9 m2 
    196203      zv_sill = zarea * 2.5e-5 
    197204      zs_sill = zarea * 25.e-5 
     
    400407      IF( lk_mpp ) THEN 
    401408         DO ialert_id = 1, inb_altests 
    402             CALL mpp_sum(inb_alp(ialert_id)) 
     409            CALL mpp_sum('icectl', inb_alp(ialert_id)) 
    403410         END DO 
    404411      ENDIF 
  • NEMO/trunk/src/ICE/icedia.F90

    r10069 r10425  
    5252      ALLOCATE( vol_loc_ini(jpi,jpj), sal_loc_ini(jpi,jpj), tem_loc_ini(jpi,jpj), STAT=ice_dia_alloc ) 
    5353 
    54       IF( lk_mpp             )   CALL mpp_sum ( ice_dia_alloc ) 
    55       IF( ice_dia_alloc /= 0 )   CALL ctl_warn( 'ice_dia_alloc: failed to allocate arrays' ) 
     54      CALL mpp_sum ( 'icedia', ice_dia_alloc ) 
     55      IF( ice_dia_alloc /= 0 )   CALL ctl_stop( 'STOP',  'ice_dia_alloc: failed to allocate arrays' ) 
    5656      ! 
    5757   END FUNCTION ice_dia_alloc 
     
    8585      ! 1 -  Contents ! 
    8686      ! ----------------------- ! 
    87       zbg_ivol = glob_sum( vt_i(:,:) * e1e2t(:,:) ) * 1.e-9                  ! ice volume (km3) 
    88       zbg_svol = glob_sum( vt_s(:,:) * e1e2t(:,:) ) * 1.e-9                  ! snow volume (km3) 
    89       zbg_area = glob_sum( at_i(:,:) * e1e2t(:,:) ) * 1.e-6                  ! area (km2) 
    90       zbg_isal = glob_sum( SUM( sv_i(:,:,:), dim=3 ) * e1e2t(:,:) ) * 1.e-9 ! salt content (pss*km3) 
    91       zbg_item = glob_sum( et_i * e1e2t(:,:) ) * 1.e-20                      ! heat content (1.e20 J) 
    92       zbg_stem = glob_sum( et_s * e1e2t(:,:) ) * 1.e-20                      ! heat content (1.e20 J) 
     87      zbg_ivol = glob_sum( 'icedia', vt_i(:,:) * e1e2t(:,:) ) * 1.e-9                  ! ice volume (km3) 
     88      zbg_svol = glob_sum( 'icedia', vt_s(:,:) * e1e2t(:,:) ) * 1.e-9                  ! snow volume (km3) 
     89      zbg_area = glob_sum( 'icedia', at_i(:,:) * e1e2t(:,:) ) * 1.e-6                  ! area (km2) 
     90      zbg_isal = glob_sum( 'icedia', SUM( sv_i(:,:,:), dim=3 ) * e1e2t(:,:) ) * 1.e-9 ! salt content (pss*km3) 
     91      zbg_item = glob_sum( 'icedia', et_i * e1e2t(:,:) ) * 1.e-20                      ! heat content (1.e20 J) 
     92      zbg_stem = glob_sum( 'icedia', et_s * e1e2t(:,:) ) * 1.e-20                      ! heat content (1.e20 J) 
    9393       
    9494      ! ---------------------------! 
    9595      ! 2 - Trends due to forcing  ! 
    9696      ! ---------------------------! 
    97       z_frc_volbot = r1_rau0 * glob_sum( - ( wfx_ice(:,:) + wfx_snw(:,:) + wfx_err_sub(:,:) ) * e1e2t(:,:) ) * 1.e-9   ! freshwater flux ice/snow-ocean  
    98       z_frc_voltop = r1_rau0 * glob_sum( - ( wfx_sub(:,:) + wfx_spr(:,:) )                    * e1e2t(:,:) ) * 1.e-9   ! freshwater flux ice/snow-atm 
    99       z_frc_sal    = r1_rau0 * glob_sum( -       sfx(:,:)                                     * e1e2t(:,:) ) * 1.e-9   ! salt fluxes ice/snow-ocean 
    100       z_frc_tembot =           glob_sum(   qt_oce_ai(:,:)                                     * e1e2t(:,:) ) * 1.e-20  ! heat on top of ocean (and below ice) 
    101       z_frc_temtop =           glob_sum(   qt_atm_oi(:,:)                                     * e1e2t(:,:) ) * 1.e-20  ! heat on top of ice-coean 
     97      z_frc_volbot = r1_rau0 * glob_sum( 'icedia', -( wfx_ice(:,:) + wfx_snw(:,:) + wfx_err_sub(:,:) ) * e1e2t(:,:) ) * 1.e-9   ! freshwater flux ice/snow-ocean  
     98      z_frc_voltop = r1_rau0 * glob_sum( 'icedia', -( wfx_sub(:,:) + wfx_spr(:,:) )                    * e1e2t(:,:) ) * 1.e-9   ! freshwater flux ice/snow-atm 
     99      z_frc_sal    = r1_rau0 * glob_sum( 'icedia', -      sfx(:,:)                                     * e1e2t(:,:) ) * 1.e-9   ! salt fluxes ice/snow-ocean 
     100      z_frc_tembot =           glob_sum( 'icedia',  qt_oce_ai(:,:)                                     * e1e2t(:,:) ) * 1.e-20  ! heat on top of ocean (and below ice) 
     101      z_frc_temtop =           glob_sum( 'icedia',  qt_atm_oi(:,:)                                     * e1e2t(:,:) ) * 1.e-20  ! heat on top of ice-coean 
    102102      ! 
    103103      frc_voltop  = frc_voltop  + z_frc_voltop  * rdt_ice ! km3 
     
    110110      ! 3 -  Content variations ! 
    111111      ! ----------------------- ! 
    112       zdiff_vol = r1_rau0 * glob_sum( ( rhoi*vt_i(:,:) + rhos*vt_s(:,:) - vol_loc_ini(:,:) ) * e1e2t(:,:) ) * 1.e-9   ! freshwater trend (km3)  
    113       zdiff_sal = r1_rau0 * glob_sum( ( rhoi* SUM( sv_i(:,:,:), dim=3 ) - sal_loc_ini(:,:) ) * e1e2t(:,:) ) * 1.e-9   ! salt content trend (km3*pss) 
    114       zdiff_tem =           glob_sum( ( et_i(:,:) + et_s(:,:)           - tem_loc_ini(:,:) ) * e1e2t(:,:) ) * 1.e-20  ! heat content trend (1.e20 J) 
     112      zdiff_vol = r1_rau0 * glob_sum( 'icedia', ( rhoi*vt_i(:,:) + rhos*vt_s(:,:) - vol_loc_ini(:,:) ) * e1e2t(:,:) ) * 1.e-9   ! freshwater trend (km3)  
     113      zdiff_sal = r1_rau0 * glob_sum( 'icedia', ( rhoi* SUM( sv_i(:,:,:), dim=3 ) - sal_loc_ini(:,:) ) * e1e2t(:,:) ) * 1.e-9   ! salt content trend (km3*pss) 
     114      zdiff_tem =           glob_sum( 'icedia', ( et_i(:,:) + et_s(:,:)           - tem_loc_ini(:,:) ) * e1e2t(:,:) ) * 1.e-20  ! heat content trend (1.e20 J) 
    115115      !                               + SUM( qevap_ice * a_i_b, dim=3 )       !! clem: I think this term should not be there (but needs a check) 
    116116 
     
    125125      ! 5 - Diagnostics writing ! 
    126126      ! ----------------------- ! 
    127 !!gm I don't understand the division by the ocean surface (i.e. glob_sum( e1e2t(:,:) ) * 1.e-20 * kt*rdt ) 
     127!!gm I don't understand the division by the ocean surface (i.e. glob_sum( 'icedia', e1e2t(:,:) ) * 1.e-20 * kt*rdt ) 
    128128!!   and its multiplication bu kt ! is it really what we want ? what is this quantity ? 
    129129!!   IF it is really what we want, compute it at kt=nit000, not 3 time by time-step ! 
     
    135135      IF( iom_use('ibgheatco')    )   CALL iom_put( 'ibgheatco' , zdiff_tem     )   ! ice/snow heat content drift       (1.e20 J) 
    136136      IF( iom_use('ibgheatfx')    )   CALL iom_put( 'ibgheatfx' ,               &   ! ice/snow heat flux drift          (W/m2) 
    137          &                                                     zdiff_tem /glob_sum( e1e2t(:,:) * 1.e-20 * kt*rdt ) ) 
     137         &                                                     zdiff_tem /glob_sum( 'icedia', e1e2t(:,:) * 1.e-20 * kt*rdt ) ) 
    138138 
    139139      IF( iom_use('ibgfrcvoltop') )   CALL iom_put( 'ibgfrcvoltop' , frc_voltop )   ! vol  forcing ice/snw-atm          (km3 equivalent ocean water)  
     
    143143      IF( iom_use('ibgfrctembot') )   CALL iom_put( 'ibgfrctembot' , frc_tembot )   ! heat on top of ocean(below ice)   (1.e20 J)    
    144144      IF( iom_use('ibgfrchfxtop') )   CALL iom_put( 'ibgfrchfxtop' ,            &   ! heat on top of ice/snw/ocean      (W/m2)  
    145          &                                                          frc_temtop / glob_sum( e1e2t(:,:) ) * 1.e-20 * kt*rdt  ) 
     145         &                                                          frc_temtop / glob_sum( 'icedia', e1e2t(:,:) ) * 1.e-20 * kt*rdt  ) 
    146146      IF( iom_use('ibgfrchfxbot') )   CALL iom_put( 'ibgfrchfxbot' ,            &   ! heat on top of ocean(below ice)   (W/m2)  
    147          &                                                          frc_tembot / glob_sum( e1e2t(:,:) ) * 1.e-20 * kt*rdt  ) 
     147         &                                                          frc_tembot / glob_sum( 'icedia', e1e2t(:,:) ) * 1.e-20 * kt*rdt  ) 
    148148 
    149149      IF( iom_use('ibgvol_tot' )  )   CALL iom_put( 'ibgvol_tot'  , zbg_ivol     )   ! ice volume                       (km3) 
  • NEMO/trunk/src/ICE/icedyn.F90

    r10415 r10425  
    116116         END DO 
    117117      END DO 
    118       CALL lbc_lnk_multi( zhi_max(:,:,:), 'T', 1., zhs_max(:,:,:), 'T', 1., zhip_max(:,:,:), 'T', 1. ) 
     118      CALL lbc_lnk_multi( 'icedyn', zhi_max(:,:,:), 'T', 1., zhs_max(:,:,:), 'T', 1., zhip_max(:,:,:), 'T', 1. ) 
    119119      ! 
    120120      ! 
     
    155155            END DO 
    156156         END DO 
    157          CALL lbc_lnk( zdivu_i, 'T', 1. ) 
     157         CALL lbc_lnk( 'icedyn', zdivu_i, 'T', 1. ) 
    158158         IF( iom_use('icediv') )   CALL iom_put( "icediv" , zdivu_i(:,:) ) 
    159159 
     
    176176            END DO 
    177177         END DO 
    178          CALL lbc_lnk( zdivu_i, 'T', 1. ) 
     178         CALL lbc_lnk( 'icedyn', zdivu_i, 'T', 1. ) 
    179179         IF( iom_use('icediv') )   CALL iom_put( "icediv" , zdivu_i(:,:) ) 
    180180 
  • NEMO/trunk/src/ICE/icedyn_adv_pra.F90

    r10069 r10425  
    101101      zcfl  =            MAXVAL( ABS( pu_ice(:,:) ) * rdt_ice * r1_e1u(:,:) ) 
    102102      zcfl  = MAX( zcfl, MAXVAL( ABS( pv_ice(:,:) ) * rdt_ice * r1_e2v(:,:) ) ) 
    103       IF( lk_mpp )   CALL mpp_max( zcfl ) 
     103      CALL mpp_max( 'icedyn_adv_pra', zcfl ) 
    104104       
    105105      IF( zcfl > 0.5 ) THEN   ;   initad = 2   ;   zusnit = 0.5_wp 
     
    425425 
    426426      !-- Lateral boundary conditions 
    427       CALL lbc_lnk_multi( psm , 'T',  1., ps0 , 'T',  1.   & 
     427      CALL lbc_lnk_multi( 'icedyn_adv_pra', psm , 'T',  1., ps0 , 'T',  1.   & 
    428428         &              , psx , 'T', -1., psy , 'T', -1.   &   ! caution gradient ==> the sign changes 
    429429         &              , psxx, 'T',  1., psyy, 'T',  1.   & 
     
    599599 
    600600      !-- Lateral boundary conditions 
    601       CALL lbc_lnk_multi( psm , 'T',  1.,  ps0 , 'T',  1.   & 
     601      CALL lbc_lnk_multi( 'icedyn_adv_pra', psm , 'T',  1.,  ps0 , 'T',  1.   & 
    602602         &              , psx , 'T', -1.,  psy , 'T', -1.   &   ! caution gradient ==> the sign changes 
    603603         &              , psxx, 'T',  1.,  psyy, 'T',  1.   & 
     
    640640         &      STAT = ierr ) 
    641641      ! 
    642       IF( lk_mpp    )   CALL mpp_sum( ierr ) 
     642      CALL mpp_sum( 'icedyn_adv_pra', ierr ) 
    643643      IF( ierr /= 0 )   CALL ctl_stop('STOP', 'adv_pra_init : unable to allocate ice arrays for Prather advection scheme') 
    644644      ! 
  • NEMO/trunk/src/ICE/icedyn_adv_umx.F90

    r10418 r10425  
    3535   REAL(wp) ::   z1_120 = 1._wp / 120._wp   ! =1/120 
    3636 
    37    REAL(wp), DIMENSION(:,:), ALLOCATABLE :: amaxu, amaxv 
     37   REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: amaxu, amaxv 
    3838    
    3939   ! advect H all the way (and get V=H*A at the end) 
     
    119119      INTEGER  ::   icycle                  ! number of sub-timestep for the advection 
    120120      REAL(wp) ::   zamsk                   ! 1 if advection of concentration, 0 if advection of other tracers 
    121       REAL(wp) ::   zcfl , zdt 
    122       REAL(wp), DIMENSION(jpi,jpj) ::   zudy, zvdx, zcu_box, zcv_box, zua_ho, zva_ho 
    123       REAL(wp), DIMENSION(jpi,jpj) ::   zhvar 
    124       REAL(wp), DIMENSION(jpi,jpj) ::   zati1, zati2, z1_ai, z1_aip 
     121      REAL(wp) ::   zdt 
     122      REAL(wp), DIMENSION(1)       ::   zcflprv, zcflnow   ! send zcflnow and receive zcflprv 
     123      REAL(wp), DIMENSION(jpi,jpj) ::   zudy, zvdx 
     124      REAL(wp), DIMENSION(jpi,jpj) ::   zati1, zati2 
     125 
     126 
     127 
     128      REAL(wp), DIMENSION(jpi,jpj)     ::   zcu_box, zcv_box 
     129      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   zua_ho, zva_ho 
     130      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   z1_ai, z1_aip 
     131      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   zhvar 
     132 
    125133      !!---------------------------------------------------------------------- 
    126134      ! 
     
    128136      ! 
    129137      ! 
    130       ! --- If ice drift field is too fast, use an appropriate time step for advection (CFL test for stability) --- !         
    131       zcfl  =            MAXVAL( ABS( pu_ice(:,:) ) * rdt_ice * r1_e1u(:,:) ) 
    132       zcfl  = MAX( zcfl, MAXVAL( ABS( pv_ice(:,:) ) * rdt_ice * r1_e2v(:,:) ) ) 
    133       IF( lk_mpp )   CALL mpp_max( zcfl ) 
    134  
    135       IF( zcfl > 0.5 ) THEN   ;   icycle = 2  
    136       ELSE                    ;   icycle = 1  
     138      ! --- If ice drift field is too fast, use an appropriate time step for advection (CFL test for stability) --- ! 
     139      !     When needed, the advection split is applied at the next time-step in order to avoid blocking global comm. 
     140      !     ...this should not affect too much the stability... Was ok on the tests we did... 
     141      zcflnow(1) =                  MAXVAL( ABS( pu_ice(:,:) ) * rdt_ice * r1_e1u(:,:) ) 
     142      zcflnow(1) = MAX( zcflnow(1), MAXVAL( ABS( pv_ice(:,:) ) * rdt_ice * r1_e2v(:,:) ) ) 
     143       
     144      ! non-blocking global communication send zcflnow and receive zcflprv 
     145      CALL mpp_delay_max( 'icedyn_adv_umx', 'cflice', zcflnow(:), zcflprv(:), kt == nitend - nn_fsbc + 1 ) 
     146 
     147      IF( zcflprv(1) > .5 ) THEN   ;   icycle = 2 
     148      ELSE                         ;   icycle = 1 
    137149      ENDIF 
    138150       
     
    159171 
    160172      IF( ll_zeroup2 ) THEN 
    161          IF(.NOT. ALLOCATED(amaxu))       ALLOCATE(amaxu (jpi,jpj)) 
    162          IF(.NOT. ALLOCATED(amaxv))       ALLOCATE(amaxv (jpi,jpj)) 
     173         IF(.NOT. ALLOCATED(amaxu))       ALLOCATE(amaxu (jpi,jpj,jpl)) 
     174         IF(.NOT. ALLOCATED(amaxv))       ALLOCATE(amaxv (jpi,jpj,jpl)) 
    163175      ENDIF 
    164176      !---------------! 
     
    167179      DO jt = 1, icycle 
    168180 
    169          IF( ll_ADVopw ) THEN 
    170             zamsk = 1._wp 
    171             CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zudy, zvdx, zcu_box, zcv_box, pato_i(:,:), pato_i(:,:) )   ! Open water area  
    172             zamsk = 0._wp 
    173          ELSE 
     181!!$         IF( ll_ADVopw ) THEN 
     182!!$            zamsk = 1._wp 
     183!!$            CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zudy, zvdx, zcu_box, zcv_box, pato_i(:,:), pato_i(:,:) )   ! Open water area  
     184!!$            zamsk = 0._wp 
     185!!$         ELSE 
    174186            zati1(:,:) = SUM( pa_i(:,:,:), dim=3 ) 
    175          ENDIF 
     187!!$         ENDIF 
    176188          
    177          DO jl = 1, jpl 
     189         WHERE( pa_i(:,:,:) >= epsi20 )   ;   z1_ai(:,:,:) = 1._wp / pa_i(:,:,:) 
     190         ELSEWHERE                        ;   z1_ai(:,:,:) = 0. 
     191         END WHERE 
    178192            ! 
    179             WHERE( pa_i(:,:,jl) >= epsi20 )   ;   z1_ai(:,:) = 1._wp / pa_i(:,:,jl) 
    180             ELSEWHERE                         ;   z1_ai(:,:) = 0. 
    181             END WHERE 
    182             ! 
    183             WHERE( pa_ip(:,:,jl) >= epsi20 )  ;   z1_aip(:,:) = 1._wp / pa_ip(:,:,jl) 
    184             ELSEWHERE                         ;   z1_aip(:,:) = 0. 
    185             END WHERE 
    186             ! 
    187             IF( ll_zeroup2 ) THEN 
     193         WHERE( pa_ip(:,:,:) >= epsi20 )  ;   z1_aip(:,:,:) = 1._wp / pa_ip(:,:,:) 
     194         ELSEWHERE                        ;   z1_aip(:,:,:) = 0. 
     195         END WHERE 
     196         ! 
     197         IF( ll_zeroup2 ) THEN 
     198            DO jl = 1, jpl 
    188199               DO jj = 2, jpjm1 
    189200                  DO ji = fs_2, fs_jpim1 
    190                      amaxu(ji,jj)=MAX( pa_i(ji,jj,jl), pa_i(ji,jj-1,jl), pa_i(ji,jj+1,jl), & 
    191                         &                              pa_i(ji+1,jj,jl), pa_i(ji+1,jj-1,jl), pa_i(ji+1,jj+1,jl) ) 
    192                      amaxv(ji,jj)=MAX( pa_i(ji,jj,jl), pa_i(ji-1,jj,jl), pa_i(ji+1,jj,jl), & 
    193                         &                              pa_i(ji,jj+1,jl), pa_i(ji-1,jj+1,jl), pa_i(ji+1,jj+1,jl) ) 
    194                  END DO 
    195                END DO 
    196                CALL lbc_lnk_multi(amaxu, 'T', 1., amaxv, 'T', 1.) 
    197             ENDIF 
     201                     amaxu(ji,jj,jl)=MAX( pa_i(ji,jj,jl), pa_i(ji,jj-1,jl), pa_i(ji,jj+1,jl), & 
     202                        &                                 pa_i(ji+1,jj,jl), pa_i(ji+1,jj-1,jl), pa_i(ji+1,jj+1,jl) ) 
     203                     amaxv(ji,jj,jl)=MAX( pa_i(ji,jj,jl), pa_i(ji-1,jj,jl), pa_i(ji+1,jj,jl), & 
     204                        &                                 pa_i(ji,jj+1,jl), pa_i(ji-1,jj+1,jl), pa_i(ji+1,jj+1,jl) ) 
     205                  END DO 
     206               END DO 
     207            END DO 
     208            CALL lbc_lnk_multi('icedyn_adv_umx', amaxu, 'T', 1., amaxv, 'T', 1.) 
     209         ENDIF 
     210         ! 
     211         DO jl = 1, jpl 
     212            zua_ho(:,:,jl) = zudy(:,:) 
     213            zva_ho(:,:,jl) = zvdx(:,:) 
     214         END DO 
     215          
     216         zamsk = 1._wp 
     217         CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, pa_i, pa_i, zua_ho, zva_ho ) ! Ice area 
     218         zamsk = 0._wp 
     219         ! 
     220         IF( ll_thickness ) THEN 
     221            DO jl = 1, jpl 
     222               zua_ho(:,:,jl) = zudy(:,:) 
     223               zva_ho(:,:,jl) = zvdx(:,:) 
     224            END DO 
     225         ENDIF 
    198226            ! 
     227         zhvar(:,:,:) = pv_i(:,:,:) * z1_ai(:,:,:) 
     228         CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho , zva_ho , zcu_box, zcv_box, zhvar, pv_i )    ! Ice volume 
     229         IF( ll_thickness )   pv_i(:,:,:) = zhvar(:,:,:) * pa_i(:,:,:) 
     230         ! 
     231         zhvar(:,:,:) = pv_s(:,:,:) * z1_ai(:,:,:) 
     232         CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho , zva_ho , zcu_box, zcv_box, zhvar, pv_s )    ! Snw volume 
     233         IF( ll_thickness )   pv_s(:,:,:) = zhvar(:,:,:) * pa_i(:,:,:) 
     234         ! 
     235         zhvar(:,:,:) = psv_i(:,:,:) * z1_ai(:,:,:) 
     236         CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho , zva_ho , zcu_box, zcv_box, zhvar, psv_i )    ! Salt content 
     237         ! 
     238         zhvar(:,:,:) = poa_i(:,:,:) * z1_ai(:,:,:) 
     239         CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho , zva_ho , zcu_box, zcv_box, zhvar, poa_i )    ! Age content 
     240         ! 
     241         DO jk = 1, nlay_i 
     242            zhvar(:,:,:) = pe_i(:,:,jk,:) * z1_ai(:,:,:) 
     243            CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, pe_i(:,:,jk,:) ) ! Ice heat content 
     244         END DO 
     245         ! 
     246         DO jk = 1, nlay_s 
     247            zhvar(:,:,:) = pe_s(:,:,jk,:) * z1_ai(:,:,:) 
     248            CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, pe_s(:,:,jk,:) ) ! Snw heat content 
     249         END DO 
     250            ! 
     251         IF ( ln_pnd_H12 ) THEN 
     252            ! 
     253            DO jl = 1, jpl 
     254               zua_ho(:,:,jl) = zudy(:,:) 
     255               zva_ho(:,:,jl) = zvdx(:,:) 
     256            END DO 
     257             
    199258            zamsk = 1._wp 
    200             CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zudy, zvdx, zcu_box, zcv_box, pa_i(:,:,jl), pa_i(:,:,jl), &        ! Ice area 
    201                &          zua_ho, zva_ho ) 
     259            CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, pa_ip, pa_ip, zua_ho, zva_ho ) ! mp fraction 
    202260            zamsk = 0._wp 
    203261            ! 
    204             IF( ll_thickness ) THEN 
    205                zua_ho(:,:) = zudy(:,:) 
    206                zva_ho(:,:) = zvdx(:,:) 
    207             ENDIF 
    208             ! 
    209             zhvar(:,:) = pv_i(:,:,jl) * z1_ai(:,:) 
    210             CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho , zva_ho , zcu_box, zcv_box, zhvar(:,:), pv_i (:,:,jl) )    ! Ice volume 
    211             IF( ll_thickness )   pv_i(:,:,jl) = zhvar(:,:) * pa_i(:,:,jl) 
    212             ! 
    213             zhvar(:,:) = pv_s(:,:,jl) * z1_ai(:,:) 
    214             CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho , zva_ho , zcu_box, zcv_box, zhvar(:,:), pv_s (:,:,jl) )    ! Snw volume 
    215             IF( ll_thickness )   pv_s(:,:,jl) = zhvar(:,:) * pa_i(:,:,jl) 
    216             ! 
    217             zhvar(:,:) = psv_i(:,:,jl) * z1_ai(:,:) 
    218             CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho , zva_ho , zcu_box, zcv_box, zhvar(:,:), psv_i(:,:,jl) )    ! Salt content 
    219             ! 
    220             zhvar(:,:) = poa_i(:,:,jl) * z1_ai(:,:) 
    221             CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho , zva_ho , zcu_box, zcv_box, zhvar(:,:), poa_i(:,:,jl) )    ! Age content 
    222             ! 
    223             DO jk = 1, nlay_i 
    224                zhvar(:,:) = pe_i(:,:,jk,jl) * z1_ai(:,:) 
    225                CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar(:,:), pe_i(:,:,jk,jl) ) ! Ice heat content 
    226             END DO 
    227             ! 
    228             DO jk = 1, nlay_s 
    229                zhvar(:,:) = pe_s(:,:,jk,jl) * z1_ai(:,:) 
    230                CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar(:,:), pe_s(:,:,jk,jl) ) ! Snw heat content 
    231             END DO 
    232             ! 
    233             IF ( ln_pnd_H12 ) THEN 
    234                ! 
    235                zamsk = 1._wp 
    236                CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zudy, zvdx, zcu_box, zcv_box, pa_ip(:,:,jl), pa_ip(:,:,jl), &   ! mp fraction 
    237                   &          zua_ho, zva_ho ) 
    238                zamsk = 0._wp 
    239  
    240                zhvar(:,:) = pv_ip(:,:,jl) * z1_ai(:,:) 
    241                CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho , zva_ho , zcu_box, zcv_box, zhvar(:,:), pv_ip(:,:,jl) ) ! mp volume 
    242             ENDIF 
    243             ! 
    244             ! 
    245          END DO 
    246          ! 
    247          IF( .NOT. ll_ADVopw ) THEN 
     262            zhvar(:,:,:) = pv_ip(:,:,:) * z1_ai(:,:,:) 
     263            CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho , zva_ho , zcu_box, zcv_box, zhvar, pv_ip ) ! mp volume 
     264         ENDIF 
     265         ! 
     266         ! 
     267!!$         IF( .NOT. ll_ADVopw ) THEN 
    248268            zati2(:,:) = SUM( pa_i(:,:,:), dim=3 ) 
    249269            DO jj = 2, jpjm1 
     
    253273               END DO 
    254274            END DO 
    255             CALL lbc_lnk( pato_i(:,:), 'T',  1. ) 
    256          ENDIF 
     275            CALL lbc_lnk( 'icedyn_adv_umx', pato_i(:,:), 'T',  1. ) 
     276!!$         ENDIF 
    257277         ! 
    258278      END DO 
     
    279299      INTEGER                     , INTENT(in   )           ::   kt             ! number of iteration 
    280300      REAL(wp)                    , INTENT(in   )           ::   pdt            ! tracer time-step 
    281       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   )           ::   pu   , pv      ! 2 ice velocity components => u*e2 
    282       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   )           ::   puc  , pvc     ! 2 ice velocity components => u*e2 or u*a*e2u 
    283       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   )           ::   pubox, pvbox   ! upstream velocity 
    284       REAL(wp), DIMENSION(jpi,jpj), INTENT(inout)           ::   pt             ! tracer field 
    285       REAL(wp), DIMENSION(jpi,jpj), INTENT(inout)           ::   ptc            ! tracer content field 
    286       REAL(wp), DIMENSION(jpi,jpj), INTENT(  out), OPTIONAL ::   pua_ho, pva_ho ! high order u*a fluxes 
    287       ! 
    288       INTEGER  ::   ji, jj           ! dummy loop indices   
     301      REAL(wp), DIMENSION(:,:  ), INTENT(in   )           ::   pu   , pv      ! 2 ice velocity components => u*e2 
     302      REAL(wp), DIMENSION(:,:,:), INTENT(in   )           ::   puc  , pvc     ! 2 ice velocity components => u*e2 or u*a*e2u 
     303      REAL(wp), DIMENSION(:,:  ), INTENT(in   )           ::   pubox, pvbox   ! upstream velocity 
     304      REAL(wp), DIMENSION(:,:,:), INTENT(inout)           ::   pt             ! tracer field 
     305      REAL(wp), DIMENSION(:,:,:), INTENT(inout)           ::   ptc            ! tracer content field 
     306      REAL(wp), DIMENSION(jpi,jpj,jpl), INTENT(  out), OPTIONAL ::   pua_ho, pva_ho ! high order u*a fluxes 
     307      ! 
     308      INTEGER  ::   ji, jj, jl       ! dummy loop indices   
    289309      REAL(wp) ::   ztra             ! local scalar 
    290310      INTEGER  ::   kn_limiter = 1   ! 1=nonosc ; 2=superbee ; 3=h3(rachid) 
    291       REAL(wp), DIMENSION(jpi,jpj) ::   zfu_ho , zfv_ho , zt_u, zt_v, zpt 
    292       REAL(wp), DIMENSION(jpi,jpj) ::   zfu_ups, zfv_ups, zt_ups   ! only for nonosc  
     311      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   zfu_ho , zfv_ho , zt_u, zt_v, zpt 
     312      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   zfu_ups, zfv_ups, zt_ups   ! only for nonosc  
    293313      !!---------------------------------------------------------------------- 
    294314      ! 
     
    297317 
    298318      IF( ll_gurvan .AND. pamsk==0. ) THEN 
    299          DO jj = 2, jpjm1 
    300             DO ji = fs_2, fs_jpim1 
    301                pt(ji,jj) = ( pt (ji,jj) + pt(ji,jj) * pdt * ( pu(ji,jj) - pu(ji-1,jj) ) * r1_e1e2t(ji,jj) & 
    302                   &                     + pt(ji,jj) * pdt * ( pv(ji,jj) - pv(ji,jj-1) ) * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 
    303             END DO 
    304          END DO 
    305          CALL lbc_lnk( pt, 'T', 1. ) 
     319         DO jl = 1, jpl 
     320            DO jj = 2, jpjm1 
     321               DO ji = fs_2, fs_jpim1 
     322                  pt(ji,jj,jl) = ( pt (ji,jj,jl) + pt(ji,jj,jl) * pdt * ( pu(ji,jj) - pu(ji-1,jj) ) * r1_e1e2t(ji,jj)     & 
     323                     &                           + pt(ji,jj,jl) * pdt * ( pv(ji,jj) - pv(ji,jj-1) ) * r1_e1e2t(ji,jj) )   & 
     324                     &           * tmask(ji,jj,1) 
     325               END DO 
     326            END DO 
     327         END DO 
     328         CALL lbc_lnk( 'icedyn_adv_umx', pt, 'T', 1. ) 
    306329      ENDIF 
    307330 
     
    310333 
    311334         ! fluxes in both x-y directions 
    312          DO jj = 1, jpjm1 
    313             DO ji = 1, fs_jpim1 
    314                IF( ll_clem ) THEN 
    315                   zfu_ups(ji,jj) = MAX( pu(ji,jj), 0._wp ) * pt(ji,jj) + MIN( pu(ji,jj), 0._wp ) * pt(ji+1,jj) 
    316                   zfv_ups(ji,jj) = MAX( pv(ji,jj), 0._wp ) * pt(ji,jj) + MIN( pv(ji,jj), 0._wp ) * pt(ji,jj+1) 
    317                ELSE 
    318                   zfu_ups(ji,jj) = MAX( puc(ji,jj), 0._wp ) * pt(ji,jj) + MIN( puc(ji,jj), 0._wp ) * pt(ji+1,jj) 
    319                   zfv_ups(ji,jj) = MAX( pvc(ji,jj), 0._wp ) * pt(ji,jj) + MIN( pvc(ji,jj), 0._wp ) * pt(ji,jj+1) 
    320                ENDIF 
    321             END DO 
    322          END DO 
    323  
    324       ELSE 
    325          ! 
    326          IF( MOD( (kt - 1) / nn_fsbc , 2 ) ==  MOD( (jt - 1) , 2 ) ) THEN   !==  odd ice time step:  adv_x then adv_y  ==! 
    327             ! flux in x-direction 
     335         DO jl = 1, jpl 
    328336            DO jj = 1, jpjm1 
    329337               DO ji = 1, fs_jpim1 
    330338                  IF( ll_clem ) THEN 
    331                      zfu_ups(ji,jj) = MAX( pu(ji,jj), 0._wp ) * pt(ji,jj) + MIN( pu(ji,jj), 0._wp ) * pt(ji+1,jj) 
     339                     zfu_ups(ji,jj,jl) = MAX( pu(ji,jj), 0._wp ) * pt(ji,jj,jl) + MIN( pu(ji,jj), 0._wp ) * pt(ji+1,jj,jl) 
     340                     zfv_ups(ji,jj,jl) = MAX( pv(ji,jj), 0._wp ) * pt(ji,jj,jl) + MIN( pv(ji,jj), 0._wp ) * pt(ji,jj+1,jl) 
    332341                  ELSE 
    333                      zfu_ups(ji,jj) = MAX( puc(ji,jj), 0._wp ) * pt(ji,jj) + MIN( puc(ji,jj), 0._wp ) * pt(ji+1,jj) 
    334                   ENDIF 
     342                     zfu_ups(ji,jj,jl) = MAX( puc(ji,jj,jl), 0._wp ) * pt(ji,jj,jl) + MIN( puc(ji,jj,jl), 0._wp ) * pt(ji+1,jj,jl) 
     343                     zfv_ups(ji,jj,jl) = MAX( pvc(ji,jj,jl), 0._wp ) * pt(ji,jj,jl) + MIN( pvc(ji,jj,jl), 0._wp ) * pt(ji,jj+1,jl) 
     344                  ENDIF 
     345               END DO 
     346            END DO 
     347         END DO 
     348 
     349      ELSE 
     350         ! 
     351         IF( MOD( (kt - 1) / nn_fsbc , 2 ) ==  MOD( (jt - 1) , 2 ) ) THEN   !==  odd ice time step:  adv_x then adv_y  ==! 
     352            ! flux in x-direction 
     353            DO jl = 1, jpl 
     354               DO jj = 1, jpjm1 
     355                  DO ji = 1, fs_jpim1 
     356                     IF( ll_clem ) THEN 
     357                        zfu_ups(ji,jj,jl) = MAX( pu(ji,jj), 0._wp ) * pt(ji,jj,jl) + MIN( pu(ji,jj), 0._wp ) * pt(ji+1,jj,jl) 
     358                     ELSE 
     359                        zfu_ups(ji,jj,jl) = MAX( puc(ji,jj,jl), 0._wp ) * pt(ji,jj,jl) + MIN( puc(ji,jj,jl), 0._wp ) * pt(ji+1,jj,jl) 
     360                     ENDIF 
     361                  END DO 
    335362               END DO 
    336363            END DO 
    337364             
    338365            ! first guess of tracer content from u-flux 
    339             DO jj = 2, jpjm1 
    340                DO ji = fs_2, fs_jpim1   ! vector opt. 
    341                   IF( ll_clem ) THEN 
    342                      IF( ll_gurvan ) THEN 
    343                         zpt(ji,jj) = ( pt(ji,jj) - ( zfu_ups(ji,jj) - zfu_ups(ji-1,jj) ) * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 
     366            DO jl = 1, jpl 
     367               DO jj = 2, jpjm1 
     368                  DO ji = fs_2, fs_jpim1   ! vector opt. 
     369                     IF( ll_clem ) THEN 
     370                        IF( ll_gurvan ) THEN 
     371                           zpt(ji,jj,jl) = ( pt(ji,jj,jl) - ( zfu_ups(ji,jj,jl) - zfu_ups(ji-1,jj,jl) ) * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 
     372                        ELSE 
     373                           zpt(ji,jj,jl) = ( pt(ji,jj,jl) - ( zfu_ups(ji,jj,jl) - zfu_ups(ji-1,jj,jl) ) * pdt * r1_e1e2t(ji,jj)  & 
     374                              &            + pt(ji,jj,jl) * pdt * ( pu(ji,jj) - pu(ji-1,jj) ) * r1_e1e2t(ji,jj) * (1.-pamsk) & 
     375                              &            ) * tmask(ji,jj,1) 
     376                        ENDIF 
    344377                     ELSE 
    345                         zpt(ji,jj) = ( pt(ji,jj) - ( zfu_ups(ji,jj) - zfu_ups(ji-1,jj) ) * pdt * r1_e1e2t(ji,jj)  & 
    346                            &                     + pt(ji,jj) * pdt * ( pu(ji,jj) - pu(ji-1,jj) ) * r1_e1e2t(ji,jj) * (1.-pamsk) & 
    347                            &         ) * tmask(ji,jj,1) 
    348                      ENDIF 
    349                   ELSE 
    350                      zpt(ji,jj) = ( ptc(ji,jj) - ( zfu_ups(ji,jj) - zfu_ups(ji-1,jj) ) * pdt * r1_e1e2t(ji,jj) ) & 
    351                         &         * tmask(ji,jj,1) 
    352                   ENDIF 
    353 !!                  IF( ji==26 .AND. jj==86) THEN 
    354 !!                     WRITE(numout,*) '************************' 
    355 !!                     WRITE(numout,*) 'zpt upstream',zpt(ji,jj) 
    356 !!                  ENDIF 
    357                END DO 
    358             END DO 
    359             CALL lbc_lnk( zpt, 'T', 1. ) 
     378                        zpt(ji,jj,jl) = ( ptc(ji,jj,jl) - ( zfu_ups(ji,jj,jl) - zfu_ups(ji-1,jj,jl) ) * pdt * r1_e1e2t(ji,jj) ) & 
     379                           &         * tmask(ji,jj,1) 
     380                     ENDIF 
     381                     !!                  IF( ji==26 .AND. jj==86) THEN 
     382                     !!                     WRITE(numout,*) '************************' 
     383                     !!                     WRITE(numout,*) 'zpt upstream',zpt(ji,jj) 
     384                     !!                  ENDIF 
     385                  END DO 
     386               END DO 
     387            END DO 
     388            CALL lbc_lnk( 'icedyn_adv_umx', zpt, 'T', 1. ) 
    360389            ! 
    361390            ! flux in y-direction 
    362             DO jj = 1, jpjm1 
    363                DO ji = 1, fs_jpim1 
    364                   IF( ll_clem ) THEN 
    365                      zfv_ups(ji,jj) = MAX( pv(ji,jj), 0._wp ) * zpt(ji,jj) + MIN( pv(ji,jj), 0._wp ) * zpt(ji,jj+1) 
    366                   ELSE 
    367                      zfv_ups(ji,jj) = MAX( pvc(ji,jj), 0._wp ) * zpt(ji,jj) + MIN( pvc(ji,jj), 0._wp ) * zpt(ji,jj+1) 
    368                   ENDIF 
    369                END DO 
    370             END DO 
    371  
     391            DO jl = 1, jpl 
     392               DO jj = 1, jpjm1 
     393                  DO ji = 1, fs_jpim1 
     394                     IF( ll_clem ) THEN 
     395                        zfv_ups(ji,jj,jl) = MAX( pv(ji,jj), 0._wp ) * zpt(ji,jj,jl) + MIN( pv(ji,jj), 0._wp ) * zpt(ji,jj+1,jl) 
     396                     ELSE 
     397                        zfv_ups(ji,jj,jl) = MAX( pvc(ji,jj,jl), 0._wp ) * zpt(ji,jj,jl) + MIN( pvc(ji,jj,jl), 0._wp ) * zpt(ji,jj+1,jl) 
     398                     ENDIF 
     399                  END DO 
     400               END DO 
     401            END DO 
    372402         ! 
    373403         ELSE                                                               !==  even ice time step:  adv_y then adv_x  ==! 
    374404            ! flux in y-direction 
    375             DO jj = 1, jpjm1 
    376                DO ji = 1, fs_jpim1 
    377                   IF( ll_clem ) THEN 
    378                      zfv_ups(ji,jj) = MAX( pv(ji,jj), 0._wp ) * pt(ji,jj) + MIN( pv(ji,jj), 0._wp ) * pt(ji,jj+1) 
    379                   ELSE 
    380                      zfv_ups(ji,jj) = MAX( pvc(ji,jj), 0._wp ) * pt(ji,jj) + MIN( pvc(ji,jj), 0._wp ) * pt(ji,jj+1) 
    381                   ENDIF 
     405            DO jl = 1, jpl 
     406               DO jj = 1, jpjm1 
     407                  DO ji = 1, fs_jpim1 
     408                     IF( ll_clem ) THEN 
     409                        zfv_ups(ji,jj,jl) = MAX( pv(ji,jj), 0._wp ) * pt(ji,jj,jl) + MIN( pv(ji,jj), 0._wp ) * pt(ji,jj+1,jl) 
     410                     ELSE 
     411                        zfv_ups(ji,jj,jl) = MAX( pvc(ji,jj,jl), 0._wp ) * pt(ji,jj,jl) + MIN( pvc(ji,jj,jl), 0._wp ) * pt(ji,jj+1,jl) 
     412                     ENDIF 
     413                  END DO 
    382414               END DO 
    383415            END DO 
    384416 
    385417            ! first guess of tracer content from v-flux 
    386             DO jj = 2, jpjm1 
    387                DO ji = fs_2, fs_jpim1   ! vector opt. 
    388                   IF( ll_clem ) THEN 
    389                      IF( ll_gurvan ) THEN 
    390                         zpt(ji,jj) = ( pt(ji,jj) - ( zfv_ups(ji,jj) - zfv_ups(ji,jj-1) ) * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 
     418            DO jl = 1, jpl 
     419               DO jj = 2, jpjm1 
     420                  DO ji = fs_2, fs_jpim1   ! vector opt. 
     421                     IF( ll_clem ) THEN 
     422                        IF( ll_gurvan ) THEN 
     423                           zpt(ji,jj,jl) = ( pt(ji,jj,jl) - ( zfv_ups(ji,jj,jl) - zfv_ups(ji,jj-1,jl) ) * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 
     424                        ELSE 
     425                           zpt(ji,jj,jl) = ( pt(ji,jj,jl) - ( zfv_ups(ji,jj,jl) - zfv_ups(ji,jj-1,jl) ) * pdt * r1_e1e2t(ji,jj) & 
     426                              &            + pt(ji,jj,jl) * pdt * ( pv(ji,jj) - pv(ji,jj-1) ) * r1_e1e2t(ji,jj) * (1.-pamsk) ) & 
     427                              &            * tmask(ji,jj,1) 
     428                        ENDIF 
    391429                     ELSE 
    392                         zpt(ji,jj) = ( pt(ji,jj) - ( zfv_ups(ji,jj) - zfv_ups(ji,jj-1) ) * pdt * r1_e1e2t(ji,jj) & 
    393                         &                        + pt(ji,jj) * pdt * ( pv(ji,jj) - pv(ji,jj-1) ) * r1_e1e2t(ji,jj) * (1.-pamsk) ) & 
    394                         &         * tmask(ji,jj,1) 
    395                      ENDIF 
    396                   ELSE 
    397                      zpt(ji,jj) = ( ptc(ji,jj) - ( zfv_ups(ji,jj) - zfv_ups(ji,jj-1) ) * pdt * r1_e1e2t(ji,jj) ) & 
    398                         &         * tmask(ji,jj,1) 
    399                   ENDIF 
    400 !!                  IF( ji==26 .AND. jj==86) THEN 
    401 !!                     WRITE(numout,*) '************************' 
    402 !!                     WRITE(numout,*) 'zpt upstream',zpt(ji,jj) 
    403 !!                  ENDIF 
    404                 END DO 
    405             END DO 
    406             CALL lbc_lnk( zpt, 'T', 1. ) 
     430                        zpt(ji,jj,jl) = ( ptc(ji,jj,jl) - ( zfv_ups(ji,jj,jl) - zfv_ups(ji,jj-1,jl) ) * pdt * r1_e1e2t(ji,jj) ) & 
     431                           &            * tmask(ji,jj,1) 
     432                     ENDIF 
     433                     !!                  IF( ji==26 .AND. jj==86) THEN 
     434                     !!                     WRITE(numout,*) '************************' 
     435                     !!                     WRITE(numout,*) 'zpt upstream',zpt(ji,jj) 
     436                     !!                  ENDIF 
     437                  END DO 
     438               END DO 
     439            END DO 
     440            CALL lbc_lnk( 'icedyn_adv_umx', zpt, 'T', 1. ) 
    407441            ! 
    408442            ! flux in x-direction 
    409             DO jj = 1, jpjm1 
    410                DO ji = 1, fs_jpim1 
    411                   IF( ll_clem ) THEN 
    412                      zfu_ups(ji,jj) = MAX( pu(ji,jj), 0._wp ) * zpt(ji,jj) + MIN( pu(ji,jj), 0._wp ) * zpt(ji+1,jj) 
    413                   ELSE 
    414                      zfu_ups(ji,jj) = MAX( puc(ji,jj), 0._wp ) * zpt(ji,jj) + MIN( puc(ji,jj), 0._wp ) * zpt(ji+1,jj) 
    415                   ENDIF 
     443            DO jl = 1, jpl 
     444               DO jj = 1, jpjm1 
     445                  DO ji = 1, fs_jpim1 
     446                     IF( ll_clem ) THEN 
     447                        zfu_ups(ji,jj,jl) = MAX( pu(ji,jj), 0._wp ) * zpt(ji,jj,jl) + MIN( pu(ji,jj), 0._wp ) * zpt(ji+1,jj,jl) 
     448                     ELSE 
     449                        zfu_ups(ji,jj,jl) = MAX( puc(ji,jj,jl), 0._wp ) * zpt(ji,jj,jl) + MIN( puc(ji,jj,jl), 0._wp ) * zpt(ji+1,jj,jl) 
     450                     ENDIF 
     451                  END DO 
    416452               END DO 
    417453            END DO 
     
    425461 
    426462      IF( ll_zeroup2 ) THEN 
    427          DO jj = 1, jpjm1 
    428             DO ji = 1, fs_jpim1   ! vector opt. 
    429                IF( amaxu(ji,jj) == 0._wp )   zfu_ups(ji,jj) = 0._wp 
    430                IF( amaxv(ji,jj) == 0._wp )   zfv_ups(ji,jj) = 0._wp 
     463         DO jl = 1, jpl 
     464            DO jj = 1, jpjm1 
     465               DO ji = 1, fs_jpim1   ! vector opt. 
     466                  IF( amaxu(ji,jj,jl) == 0._wp )   zfu_ups(ji,jj,jl) = 0._wp 
     467                  IF( amaxv(ji,jj,jl) == 0._wp )   zfv_ups(ji,jj,jl) = 0._wp 
     468               END DO 
    431469            END DO 
    432470         END DO 
     
    434472 
    435473      ! guess after content field with upstream scheme 
    436       DO jj = 2, jpjm1 
    437          DO ji = fs_2, fs_jpim1 
    438             ztra          = - (   zfu_ups(ji,jj) - zfu_ups(ji-1,jj  )   & 
    439                &                + zfv_ups(ji,jj) - zfv_ups(ji  ,jj-1) ) * r1_e1e2t(ji,jj) 
    440             IF( ll_clem ) THEN 
    441                IF( ll_gurvan ) THEN 
    442                   zt_ups(ji,jj) = ( pt (ji,jj) + pdt * ztra ) * tmask(ji,jj,1) 
     474      DO jl = 1, jpl 
     475         DO jj = 2, jpjm1 
     476            DO ji = fs_2, fs_jpim1 
     477               ztra          = - (   zfu_ups(ji,jj,jl) - zfu_ups(ji-1,jj  ,jl)   & 
     478                  &                + zfv_ups(ji,jj,jl) - zfv_ups(ji  ,jj-1,jl) ) * r1_e1e2t(ji,jj) 
     479               IF( ll_clem ) THEN 
     480                  IF( ll_gurvan ) THEN 
     481                     zt_ups(ji,jj,jl) = ( pt (ji,jj,jl) + pdt * ztra ) * tmask(ji,jj,1) 
     482                  ELSE 
     483                     zt_ups(ji,jj,jl) = ( pt (ji,jj,jl) + pdt * ztra + ( pt(ji,jj,jl) * pdt * ( pu(ji,jj) - pu(ji-1,jj) )   & 
     484                        &                                            +   pt(ji,jj,jl) * pdt * ( pv(ji,jj) - pv(ji,jj-1) ) ) & 
     485                        &                                              * r1_e1e2t(ji,jj) * (1.-pamsk) ) * tmask(ji,jj,1) 
     486                  ENDIF 
    443487               ELSE 
    444                   zt_ups(ji,jj) = ( pt (ji,jj) + pdt * ztra + ( pt(ji,jj) * pdt * ( pu(ji,jj) - pu(ji-1,jj) )   & 
    445                      &                                      +   pt(ji,jj) * pdt * ( pv(ji,jj) - pv(ji,jj-1) ) ) & 
    446                      &                                        * r1_e1e2t(ji,jj) * (1.-pamsk) ) * tmask(ji,jj,1) 
     488                  zt_ups(ji,jj,jl) = ( ptc(ji,jj,jl) + pdt * ztra ) * tmask(ji,jj,1) 
    447489               ENDIF 
    448             ELSE 
    449                zt_ups(ji,jj) = ( ptc(ji,jj) + pdt * ztra ) * tmask(ji,jj,1) 
    450             ENDIF 
    451 !!            IF( ji==26 .AND. jj==86) THEN 
    452 !!               WRITE(numout,*) '**************************' 
    453 !!               WRITE(numout,*) 'zt upstream',zt_ups(ji,jj) 
    454 !!            ENDIF 
     490               !!            IF( ji==26 .AND. jj==86) THEN 
     491               !!               WRITE(numout,*) '**************************' 
     492               !!               WRITE(numout,*) 'zt upstream',zt_ups(ji,jj) 
     493               !!            ENDIF 
     494            END DO 
    455495         END DO 
    456496      END DO 
    457       CALL lbc_lnk( zt_ups, 'T', 1. ) 
     497      CALL lbc_lnk( 'icedyn_adv_umx', zt_ups, 'T', 1. ) 
    458498 
    459499      ! High order (_ho) fluxes  
     
    476516         ! final trend with corrected fluxes 
    477517         ! ------------------------------------ 
    478          DO jj = 2, jpjm1 
    479             DO ji = fs_2, fs_jpim1 
    480                IF( ll_gurvan ) THEN 
    481                   ztra       = - ( zfu_ho(ji,jj) - zfu_ho(ji-1,jj) + zfv_ho(ji,jj) - zfv_ho(ji,jj-1) ) * r1_e1e2t(ji,jj)  
    482                ELSE 
    483                   ztra       = ( - ( zfu_ho(ji,jj) - zfu_ho(ji-1,jj) + zfv_ho(ji,jj) - zfv_ho(ji,jj-1) )  &  
    484                      &           + ( pt(ji,jj) * ( pu(ji,jj) - pu(ji-1,jj) ) * (1.-pamsk) ) & 
    485                      &           + ( pt(ji,jj) * ( pv(ji,jj) - pv(ji,jj-1) ) * (1.-pamsk) ) ) * r1_e1e2t(ji,jj) 
    486                ENDIF 
    487                pt(ji,jj) = ( pt(ji,jj) + pdt * ztra ) * tmask(ji,jj,1) 
    488  
    489                IF( pt(ji,jj) < -epsi20 ) THEN 
    490                   WRITE(numout,*) 'T<0 ',pt(ji,jj) 
    491                ENDIF 
    492                 
    493                IF( pt(ji,jj) < 0._wp .AND. pt(ji,jj) >= -epsi20 )   pt(ji,jj) = 0._wp 
    494                 
    495 !!               IF( ji==26 .AND. jj==86) THEN 
    496 !!                  WRITE(numout,*) 'zt high order',pt(ji,jj) 
    497 !!               ENDIF 
    498             END DO 
    499          END DO 
    500          CALL lbc_lnk( pt, 'T',  1. ) 
     518         DO jl = 1, jpl 
     519            DO jj = 2, jpjm1 
     520               DO ji = fs_2, fs_jpim1 
     521                  IF( ll_gurvan ) THEN 
     522                     ztra       = - ( zfu_ho(ji,jj,jl) - zfu_ho(ji-1,jj,jl) + zfv_ho(ji,jj,jl) - zfv_ho(ji,jj-1,jl) ) * r1_e1e2t(ji,jj)  
     523                  ELSE 
     524                     ztra       = ( - ( zfu_ho(ji,jj,jl) - zfu_ho(ji-1,jj,jl) + zfv_ho(ji,jj,jl) - zfv_ho(ji,jj-1,jl) )  &  
     525                        &           + ( pt(ji,jj,jl) * ( pu(ji,jj) - pu(ji-1,jj) ) * (1.-pamsk) ) & 
     526                        &           + ( pt(ji,jj,jl) * ( pv(ji,jj) - pv(ji,jj-1) ) * (1.-pamsk) ) ) * r1_e1e2t(ji,jj) 
     527                  ENDIF 
     528                  pt(ji,jj,jl) = ( pt(ji,jj,jl) + pdt * ztra ) * tmask(ji,jj,1) 
     529                   
     530                  IF( pt(ji,jj,jl) < -epsi20 ) THEN 
     531                     WRITE(numout,*) 'T<0 ',pt(ji,jj,jl) 
     532                  ENDIF 
     533                   
     534                  IF( pt(ji,jj,jl) < 0._wp .AND. pt(ji,jj,jl) >= -epsi20 )   pt(ji,jj,jl) = 0._wp 
     535                   
     536                  !!               IF( ji==26 .AND. jj==86) THEN 
     537                  !!                  WRITE(numout,*) 'zt high order',pt(ji,jj) 
     538                  !!               ENDIF 
     539               END DO 
     540            END DO 
     541         END DO 
     542         CALL lbc_lnk( 'icedyn_adv_umx', pt, 'T',  1. ) 
    501543      ENDIF 
    502544    
     
    505547      IF( ll_clem ) THEN 
    506548         IF( pamsk == 0. ) THEN 
    507             DO jj = 1, jpjm1 
    508                DO ji = 1, fs_jpim1 
    509                   IF( ABS( puc(ji,jj) ) > 0._wp .AND. ABS( pu(ji,jj) ) > 0._wp ) THEN 
    510                      zfu_ho (ji,jj) = zfu_ho (ji,jj) * puc(ji,jj) / pu(ji,jj) 
    511                      zfu_ups(ji,jj) = zfu_ups(ji,jj) * puc(ji,jj) / pu(ji,jj) 
    512                   ELSE 
    513                      zfu_ho (ji,jj) = 0._wp 
    514                      zfu_ups(ji,jj) = 0._wp 
    515                   ENDIF 
    516                   ! 
    517                   IF( ABS( pvc(ji,jj) ) > 0._wp .AND. ABS( pv(ji,jj) ) > 0._wp ) THEN 
    518                      zfv_ho (ji,jj) = zfv_ho (ji,jj) * pvc(ji,jj) / pv(ji,jj) 
    519                      zfv_ups(ji,jj) = zfv_ups(ji,jj) * pvc(ji,jj) / pv(ji,jj) 
    520                   ELSE 
    521                      zfv_ho (ji,jj) = 0._wp   
    522                      zfv_ups(ji,jj) = 0._wp   
    523                   ENDIF 
    524                ENDDO 
    525             ENDDO 
     549            DO jl = 1, jpl 
     550               DO jj = 1, jpjm1 
     551                  DO ji = 1, fs_jpim1 
     552                     IF( ABS( puc(ji,jj,jl) ) > 0._wp .AND. ABS( pu(ji,jj) ) > 0._wp ) THEN 
     553                        zfu_ho (ji,jj,jl) = zfu_ho (ji,jj,jl) * puc(ji,jj,jl) / pu(ji,jj) 
     554                        zfu_ups(ji,jj,jl) = zfu_ups(ji,jj,jl) * puc(ji,jj,jl) / pu(ji,jj) 
     555                     ELSE 
     556                        zfu_ho (ji,jj,jl) = 0._wp 
     557                        zfu_ups(ji,jj,jl) = 0._wp 
     558                     ENDIF 
     559                     ! 
     560                     IF( ABS( pvc(ji,jj,jl) ) > 0._wp .AND. ABS( pv(ji,jj) ) > 0._wp ) THEN 
     561                        zfv_ho (ji,jj,jl) = zfv_ho (ji,jj,jl) * pvc(ji,jj,jl) / pv(ji,jj) 
     562                        zfv_ups(ji,jj,jl) = zfv_ups(ji,jj,jl) * pvc(ji,jj,jl) / pv(ji,jj) 
     563                     ELSE 
     564                        zfv_ho (ji,jj,jl) = 0._wp   
     565                        zfv_ups(ji,jj,jl) = 0._wp   
     566                     ENDIF 
     567                  END DO 
     568               END DO 
     569            END DO 
    526570         ENDIF 
    527571      ENDIF 
    528572 
    529573      IF( ll_zeroup5 ) THEN 
    530          DO jj = 2, jpjm1 
    531             DO ji = 2, fs_jpim1   ! vector opt. 
    532                zpt(ji,jj) = ( ptc(ji,jj) - ( zfu_ho(ji,jj) - zfu_ho(ji-1,jj) ) * pdt * r1_e1e2t(ji,jj)  & 
    533                   &                      - ( zfv_ho(ji,jj) - zfv_ho(ji,jj-1) ) * pdt * r1_e1e2t(ji,jj)  ) * tmask(ji,jj,1) 
    534                IF( zpt(ji,jj) < 0. ) THEN 
    535                   zfu_ho(ji,jj)   = zfu_ups(ji,jj) 
    536                   zfu_ho(ji-1,jj) = zfu_ups(ji-1,jj) 
    537                   zfv_ho(ji,jj)   = zfv_ups(ji,jj) 
    538                   zfv_ho(ji,jj-1) = zfv_ups(ji,jj-1) 
    539                ENDIF 
    540             END DO 
    541          END DO 
    542          CALL lbc_lnk_multi( zfu_ho, 'U',  -1., zfv_ho, 'V',  -1. ) 
     574         DO jl = 1, jpl 
     575            DO jj = 2, jpjm1 
     576               DO ji = 2, fs_jpim1   ! vector opt. 
     577                  zpt(ji,jj,jl) = ( ptc(ji,jj,jl) - ( zfu_ho(ji,jj,jl) - zfu_ho(ji-1,jj,jl) ) * pdt * r1_e1e2t(ji,jj)  & 
     578                     &                            - ( zfv_ho(ji,jj,jl) - zfv_ho(ji,jj-1,jl) ) * pdt * r1_e1e2t(ji,jj)  ) * tmask(ji,jj,1) 
     579                  IF( zpt(ji,jj,jl) < 0. ) THEN 
     580                     zfu_ho(ji  ,jj,jl) = zfu_ups(ji  ,jj,jl) 
     581                     zfu_ho(ji-1,jj,jl) = zfu_ups(ji-1,jj,jl) 
     582                     zfv_ho(ji  ,jj,jl) = zfv_ups(ji  ,jj,jl) 
     583                     zfv_ho(ji,jj-1,jl) = zfv_ups(ji,jj-1,jl) 
     584                  ENDIF 
     585               END DO 
     586            END DO 
     587         END DO 
     588         CALL lbc_lnk_multi( 'icedyn_adv_umx', zfu_ho, 'U',  -1., zfv_ho, 'V',  -1. ) 
    543589      ENDIF 
    544590 
     
    546592      ! ---------------------------- 
    547593      IF( PRESENT( pua_ho ) ) THEN 
    548          DO jj = 1, jpjm1 
    549             DO ji = 1, fs_jpim1 
    550                pua_ho(ji,jj) = zfu_ho(ji,jj) 
    551                pva_ho(ji,jj) = zfv_ho(ji,jj) 
     594         DO jl = 1, jpl 
     595            DO jj = 1, jpjm1 
     596               DO ji = 1, fs_jpim1 
     597                  pua_ho(ji,jj,jl) = zfu_ho(ji,jj,jl) 
     598                  pva_ho(ji,jj,jl) = zfv_ho(ji,jj,jl) 
     599               END DO 
    552600            END DO 
    553601         END DO 
     
    558606         ! final trend with corrected fluxes 
    559607         ! ------------------------------------ 
    560          DO jj = 2, jpjm1 
    561             DO ji = fs_2, fs_jpim1  
    562                ztra = - ( zfu_ho(ji,jj) - zfu_ho(ji-1,jj) + zfv_ho(ji,jj) - zfv_ho(ji,jj-1) ) * r1_e1e2t(ji,jj) * pdt   
    563  
    564                ptc(ji,jj) = ( ptc(ji,jj) + ztra ) * tmask(ji,jj,1) 
    565                               
    566 !!               IF( ji==26 .AND. jj==86) THEN 
    567 !!                  WRITE(numout,*) 'ztc high order',ptc(ji,jj) 
    568 !!               ENDIF 
    569                 
    570             END DO 
    571          END DO 
    572          CALL lbc_lnk( ptc, 'T',  1. ) 
     608         DO jl = 1, jpl 
     609            DO jj = 2, jpjm1 
     610               DO ji = fs_2, fs_jpim1  
     611                  ztra = - ( zfu_ho(ji,jj,jl) - zfu_ho(ji-1,jj,jl) + zfv_ho(ji,jj,jl) - zfv_ho(ji,jj-1,jl) ) * r1_e1e2t(ji,jj) * pdt   
     612                   
     613                  ptc(ji,jj,jl) = ( ptc(ji,jj,jl) + ztra ) * tmask(ji,jj,1) 
     614                   
     615                  !!               IF( ji==26 .AND. jj==86) THEN 
     616                  !!                  WRITE(numout,*) 'ztc high order',ptc(ji,jj) 
     617                  !!               ENDIF 
     618                   
     619               END DO 
     620            END DO 
     621         END DO 
     622         CALL lbc_lnk( 'icedyn_adv_umx', ptc, 'T',  1. ) 
    573623      ENDIF 
    574624       
     
    593643      INTEGER                     , INTENT(in   ) ::   kt               ! number of iteration 
    594644      REAL(wp)                    , INTENT(in   ) ::   pdt              ! tracer time-step 
    595       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   pt               ! tracer fields 
    596       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   pu, pv           ! 2 ice velocity components 
    597       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   puc, pvc         ! 2 ice velocity * A components 
    598       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   ptc              ! tracer content at before time step  
    599       REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) ::   pfu_ho, pfv_ho   ! high order fluxes  
    600       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   pt_ups           ! upstream guess of tracer content  
    601       REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   pfu_ups, pfv_ups ! upstream fluxes  
    602       ! 
    603       INTEGER  ::   ji, jj    ! dummy loop indices 
     645      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pt               ! tracer fields 
     646      REAL(wp), DIMENSION(:,:  ), INTENT(in   ) ::   pu, pv           ! 2 ice velocity components 
     647      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   puc, pvc         ! 2 ice velocity * A components 
     648      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   ptc              ! tracer content at before time step  
     649      REAL(wp), DIMENSION(jpi,jpj,jpl), INTENT(  out) ::   pfu_ho, pfv_ho   ! high order fluxes  
     650      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pt_ups           ! upstream guess of tracer content  
     651      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pfu_ups, pfv_ups ! upstream fluxes  
     652      ! 
     653      INTEGER  ::   ji, jj, jl    ! dummy loop indices 
    604654      LOGICAL  ::   ll_xy = .TRUE. 
    605       REAL(wp), DIMENSION(jpi,jpj) ::   zzt 
     655      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   zzt 
    606656      !!---------------------------------------------------------------------- 
    607657      ! 
    608658      IF( .NOT.ll_xy ) THEN   !-- no alternate directions --! 
    609659         ! 
    610          DO jj = 1, jpjm1 
    611             DO ji = 1, fs_jpim1 
    612                IF( ll_clem ) THEN 
    613                   pfu_ho(ji,jj) = 0.5 * pu(ji,jj) * ( pt(ji,jj) + pt(ji+1,jj) ) 
    614                   pfv_ho(ji,jj) = 0.5 * pv(ji,jj) * ( pt(ji,jj) + pt(ji,jj+1) ) 
    615                ELSE 
    616                   pfu_ho(ji,jj) = 0.5 * puc(ji,jj) * ( pt(ji,jj) + pt(ji+1,jj) ) 
    617                   pfv_ho(ji,jj) = 0.5 * pvc(ji,jj) * ( pt(ji,jj) + pt(ji,jj+1) ) 
    618                ENDIF 
     660         DO jl = 1, jpl 
     661            DO jj = 1, jpjm1 
     662               DO ji = 1, fs_jpim1 
     663                  IF( ll_clem ) THEN 
     664                     pfu_ho(ji,jj,jl) = 0.5 * pu(ji,jj) * ( pt(ji,jj,jl) + pt(ji+1,jj,jl) ) 
     665                     pfv_ho(ji,jj,jl) = 0.5 * pv(ji,jj) * ( pt(ji,jj,jl) + pt(ji,jj+1,jl) ) 
     666                  ELSE 
     667                     pfu_ho(ji,jj,jl) = 0.5 * puc(ji,jj,jl) * ( pt(ji,jj,jl) + pt(ji+1,jj,jl) ) 
     668                     pfv_ho(ji,jj,jl) = 0.5 * pvc(ji,jj,jl) * ( pt(ji,jj,jl) + pt(ji,jj+1,jl) ) 
     669                  ENDIF 
     670               END DO 
    619671            END DO 
    620672         END DO 
     
    638690            ! 
    639691            ! flux in x-direction 
    640             DO jj = 1, jpjm1 
    641                DO ji = 1, fs_jpim1 
    642                   IF( ll_clem ) THEN 
    643                      pfu_ho(ji,jj) = 0.5 * pu(ji,jj) * ( pt(ji,jj) + pt(ji+1,jj) ) 
    644                   ELSE 
    645                      pfu_ho(ji,jj) = 0.5 * puc(ji,jj) * ( pt(ji,jj) + pt(ji+1,jj) ) 
    646                   ENDIF 
     692            DO jl = 1, jpl 
     693               DO jj = 1, jpjm1 
     694                  DO ji = 1, fs_jpim1 
     695                     IF( ll_clem ) THEN 
     696                        pfu_ho(ji,jj,jl) = 0.5 * pu(ji,jj) * ( pt(ji,jj,jl) + pt(ji+1,jj,jl) ) 
     697                     ELSE 
     698                        pfu_ho(ji,jj,jl) = 0.5 * puc(ji,jj,jl) * ( pt(ji,jj,jl) + pt(ji+1,jj,jl) ) 
     699                     ENDIF 
     700                  END DO 
    647701               END DO 
    648702            END DO 
     
    651705 
    652706            ! first guess of tracer content from u-flux 
    653             DO jj = 2, jpjm1 
    654                DO ji = fs_2, fs_jpim1   ! vector opt. 
    655                   IF( ll_clem ) THEN 
    656                      zzt(ji,jj) = ( pt(ji,jj) - ( pfu_ho(ji,jj) - pfu_ho(ji-1,jj) ) * pdt * r1_e1e2t(ji,jj)        & 
    657                            &                  + pt(ji,jj) * pdt * ( pu(ji,jj) - pu(ji-1,jj) ) * r1_e1e2t(ji,jj) * (1.-pamsk) ) & 
     707            DO jl = 1, jpl 
     708               DO jj = 2, jpjm1 
     709                  DO ji = fs_2, fs_jpim1   ! vector opt. 
     710                     IF( ll_clem ) THEN 
     711                        zzt(ji,jj,jl) = ( pt(ji,jj,jl) - ( pfu_ho(ji,jj,jl) - pfu_ho(ji-1,jj,jl) ) * pdt * r1_e1e2t(ji,jj)        & 
     712                           &            + pt(ji,jj,jl) * pdt * ( pu(ji,jj) - pu(ji-1,jj) ) * r1_e1e2t(ji,jj) * (1.-pamsk) ) & 
    658713                           &         * tmask(ji,jj,1) 
    659                   ELSE                      
    660                      zzt(ji,jj) = ( ptc(ji,jj) - ( pfu_ho(ji,jj) - pfu_ho(ji-1,jj) ) * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 
    661                   ENDIF 
    662                END DO 
    663             END DO 
    664             CALL lbc_lnk( zzt, 'T', 1. ) 
     714                     ELSE                      
     715                        zzt(ji,jj,jl) = ( ptc(ji,jj,jl) - ( pfu_ho(ji,jj,jl) - pfu_ho(ji-1,jj,jl) ) * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 
     716                     ENDIF 
     717                  END DO 
     718               END DO 
     719            END DO 
     720            CALL lbc_lnk( 'icedyn_adv_umx', zzt, 'T', 1. ) 
    665721 
    666722            ! flux in y-direction 
    667             DO jj = 1, jpjm1 
    668                DO ji = 1, fs_jpim1 
    669                   IF( ll_clem ) THEN 
    670                      pfv_ho(ji,jj) = 0.5 * pv(ji,jj) * ( zzt(ji,jj) + zzt(ji,jj+1) ) 
    671                   ELSE                      
    672                      pfv_ho(ji,jj) = 0.5 * pvc(ji,jj) * ( zzt(ji,jj) + zzt(ji,jj+1) ) 
    673                   ENDIF 
     723            DO jl = 1, jpl 
     724               DO jj = 1, jpjm1 
     725                  DO ji = 1, fs_jpim1 
     726                     IF( ll_clem ) THEN 
     727                        pfv_ho(ji,jj,jl) = 0.5 * pv(ji,jj) * ( zzt(ji,jj,jl) + zzt(ji,jj+1,jl) ) 
     728                     ELSE                      
     729                        pfv_ho(ji,jj,jl) = 0.5 * pvc(ji,jj,jl) * ( zzt(ji,jj,jl) + zzt(ji,jj+1,jl) ) 
     730                     ENDIF 
     731                  END DO 
    674732               END DO 
    675733            END DO 
     
    680738            ! 
    681739            ! flux in y-direction 
    682             DO jj = 1, jpjm1 
    683                DO ji = 1, fs_jpim1 
    684                   IF( ll_clem ) THEN 
    685                      pfv_ho(ji,jj) = 0.5 * pv(ji,jj) * ( pt(ji,jj) + pt(ji,jj+1) ) 
    686                   ELSE                      
    687                      pfv_ho(ji,jj) = 0.5 * pvc(ji,jj) * ( pt(ji,jj) + pt(ji,jj+1) ) 
    688                   ENDIF 
     740            DO jl = 1, jpl 
     741               DO jj = 1, jpjm1 
     742                  DO ji = 1, fs_jpim1 
     743                     IF( ll_clem ) THEN 
     744                        pfv_ho(ji,jj,jl) = 0.5 * pv(ji,jj) * ( pt(ji,jj,jl) + pt(ji,jj+1,jl) ) 
     745                     ELSE                      
     746                        pfv_ho(ji,jj,jl) = 0.5 * pvc(ji,jj,jl) * ( pt(ji,jj,jl) + pt(ji,jj+1,jl) ) 
     747                     ENDIF 
     748                  END DO 
    689749               END DO 
    690750            END DO 
     
    693753            ! 
    694754            ! first guess of tracer content from v-flux 
    695             DO jj = 2, jpjm1 
    696                DO ji = fs_2, fs_jpim1   ! vector opt. 
    697                   IF( ll_clem ) THEN 
    698                      zzt(ji,jj) = ( pt(ji,jj) - ( pfv_ho(ji,jj) - pfv_ho(ji,jj-1) ) * pdt * r1_e1e2t(ji,jj) & 
    699                         &                     + pt(ji,jj) * pdt * ( pv(ji,jj) - pv(ji,jj-1) ) * r1_e1e2t(ji,jj) * (1.-pamsk) ) & 
    700                         &         * tmask(ji,jj,1) 
    701                   ELSE 
    702                      zzt(ji,jj) = ( ptc(ji,jj) - ( pfv_ho(ji,jj) - pfv_ho(ji,jj-1) ) * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 
    703                   ENDIF 
    704                END DO 
    705             END DO 
    706             CALL lbc_lnk( zzt, 'T', 1. ) 
     755            DO jl = 1, jpl 
     756               DO jj = 2, jpjm1 
     757                  DO ji = fs_2, fs_jpim1   ! vector opt. 
     758                     IF( ll_clem ) THEN 
     759                        zzt(ji,jj,jl) = ( pt(ji,jj,jl) - ( pfv_ho(ji,jj,jl) - pfv_ho(ji,jj-1,jl) ) * pdt * r1_e1e2t(ji,jj) & 
     760                           &                     + pt(ji,jj,jl) * pdt * ( pv(ji,jj) - pv(ji,jj-1) ) * r1_e1e2t(ji,jj) * (1.-pamsk) ) & 
     761                           &         * tmask(ji,jj,1) 
     762                     ELSE 
     763                        zzt(ji,jj,jl) = ( ptc(ji,jj,jl) - ( pfv_ho(ji,jj,jl) - pfv_ho(ji,jj-1,jl) ) * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 
     764                     ENDIF 
     765                  END DO 
     766               END DO 
     767            END DO 
     768            CALL lbc_lnk( 'icedyn_adv_umx', zzt, 'T', 1. ) 
    707769            ! 
    708770            ! flux in x-direction 
    709             DO jj = 1, jpjm1 
    710                DO ji = 1, fs_jpim1 
    711                   IF( ll_clem ) THEN 
    712                      pfu_ho(ji,jj) = 0.5 * pu(ji,jj) * ( zzt(ji,jj) + zzt(ji+1,jj) ) 
    713                   ELSE 
    714                      pfu_ho(ji,jj) = 0.5 * puc(ji,jj) * ( zzt(ji,jj) + zzt(ji+1,jj) ) 
    715                   ENDIF 
     771            DO jl = 1, jpl 
     772               DO jj = 1, jpjm1 
     773                  DO ji = 1, fs_jpim1 
     774                     IF( ll_clem ) THEN 
     775                        pfu_ho(ji,jj,jl) = 0.5 * pu(ji,jj) * ( zzt(ji,jj,jl) + zzt(ji+1,jj,jl) ) 
     776                     ELSE 
     777                        pfu_ho(ji,jj,jl) = 0.5 * puc(ji,jj,jl) * ( zzt(ji,jj,jl) + zzt(ji+1,jj,jl) ) 
     778                     ENDIF 
     779                  END DO 
    716780               END DO 
    717781            END DO 
     
    749813      INTEGER                     , INTENT(in   ) ::   kt               ! number of iteration 
    750814      REAL(wp)                    , INTENT(in   ) ::   pdt              ! tracer time-step 
    751       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   pt               ! tracer fields 
    752       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   pu, pv           ! 2 ice velocity components 
    753       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   puc, pvc         ! 2 ice velocity * A components 
    754       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   pubox, pvbox     ! upstream velocity 
    755       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   ptc              ! tracer content at before time step  
    756       REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) ::   pt_u, pt_v       ! tracer at u- and v-points  
    757       REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) ::   pfu_ho, pfv_ho   ! high order fluxes  
    758       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   pt_ups           ! upstream guess of tracer content  
    759       REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   pfu_ups, pfv_ups ! upstream fluxes  
    760       ! 
    761       INTEGER  ::   ji, jj    ! dummy loop indices 
     815      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pt               ! tracer fields 
     816      REAL(wp), DIMENSION(:,:  ), INTENT(in   ) ::   pu, pv           ! 2 ice velocity components 
     817      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   puc, pvc         ! 2 ice velocity * A components 
     818      REAL(wp), DIMENSION(:,:  ), INTENT(in   ) ::   pubox, pvbox     ! upstream velocity 
     819      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   ptc              ! tracer content at before time step  
     820      REAL(wp), DIMENSION(jpi,jpj,jpl), INTENT(  out) ::   pt_u, pt_v       ! tracer at u- and v-points  
     821      REAL(wp), DIMENSION(jpi,jpj,jpl), INTENT(  out) ::   pfu_ho, pfv_ho   ! high order fluxes  
     822      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pt_ups           ! upstream guess of tracer content  
     823      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pfu_ups, pfv_ups ! upstream fluxes  
     824      ! 
     825      INTEGER  ::   ji, jj, jl    ! dummy loop indices 
    762826      REAL(wp) ::   ztra 
    763       REAL(wp), DIMENSION(jpi,jpj) ::   zzt, zzfu_ho, zzfv_ho 
     827      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   zzt, zzfu_ho, zzfv_ho 
    764828      !!---------------------------------------------------------------------- 
    765829      ! 
     
    776840 
    777841            ! first guess of tracer content from u-flux 
    778             DO jj = 2, jpjm1 
    779                DO ji = fs_2, fs_jpim1   ! vector opt. 
    780                   IF( ll_clem ) THEN 
     842            DO jl = 1, jpl 
     843               DO jj = 2, jpjm1 
     844                  DO ji = fs_2, fs_jpim1   ! vector opt. 
     845                     IF( ll_clem ) THEN 
     846                        IF( ll_gurvan ) THEN 
     847                           zzt(ji,jj,jl) = ( pt(ji,jj,jl) - ( pfu_ho(ji,jj,jl) - pfu_ho(ji-1,jj,jl) ) * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 
     848                        ELSE 
     849                           zzt(ji,jj,jl) = ( pt(ji,jj,jl) - ( pfu_ho(ji,jj,jl) - pfu_ho(ji-1,jj,jl) ) * pdt * r1_e1e2t(ji,jj)  & 
     850                              &            + pt(ji,jj,jl) * pdt * ( pu(ji,jj) - pu(ji-1,jj) ) * r1_e1e2t(ji,jj) * (1.-pamsk) & 
     851                              &         ) * tmask(ji,jj,1) 
     852                        ENDIF 
     853                     ELSE 
     854                        zzt(ji,jj,jl) = ( ptc(ji,jj,jl) - ( pfu_ho(ji,jj,jl) - pfu_ho(ji-1,jj,jl) ) * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 
     855                     ENDIF 
     856                  END DO 
     857               END DO 
     858            END DO 
     859            CALL lbc_lnk( 'icedyn_adv_umx', zzt, 'T', 1. ) 
     860 
     861         ELSE 
     862 
     863            DO jl = 1, jpl 
     864               DO jj = 2, jpjm1 
     865                  DO ji = fs_2, fs_jpim1   ! vector opt. 
    781866                     IF( ll_gurvan ) THEN 
    782                         zzt(ji,jj) = ( pt(ji,jj) - ( pfu_ho(ji,jj) - pfu_ho(ji-1,jj) ) * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 
     867                        zzt(ji,jj,jl) = pt(ji,jj,jl) - pubox(ji,jj   ) * pdt * ( pt_u(ji,jj,jl) - pt_u(ji-1,jj,jl) ) * r1_e1t(ji,jj)  & 
     868                           &                         - pt   (ji,jj,jl) * pdt * ( pu  (ji,jj) - pu  (ji-1,jj) ) * r1_e1e2t(ji,jj) 
    783869                     ELSE 
    784                         zzt(ji,jj) = ( pt(ji,jj) - ( pfu_ho(ji,jj) - pfu_ho(ji-1,jj) ) * pdt * r1_e1e2t(ji,jj)  & 
    785                            &                     + pt(ji,jj) * pdt * ( pu(ji,jj) - pu(ji-1,jj) ) * r1_e1e2t(ji,jj) * (1.-pamsk) & 
    786                            &         ) * tmask(ji,jj,1) 
    787                      ENDIF 
    788                   ELSE 
    789                      zzt(ji,jj) = ( ptc(ji,jj) - ( pfu_ho(ji,jj) - pfu_ho(ji-1,jj) ) * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 
    790                   ENDIF 
    791                END DO 
    792             END DO 
    793             CALL lbc_lnk( zzt, 'T', 1. ) 
    794  
    795          ELSE 
    796  
    797             DO jj = 2, jpjm1 
    798                DO ji = fs_2, fs_jpim1   ! vector opt. 
    799                   IF( ll_gurvan ) THEN 
    800                      zzt(ji,jj) = pt(ji,jj) - pubox(ji,jj) * pdt * ( pt_u(ji,jj) - pt_u(ji-1,jj) ) * r1_e1t(ji,jj)  & 
    801                         &                   - pt   (ji,jj) * pdt * ( pu  (ji,jj) - pu  (ji-1,jj) ) * r1_e1e2t(ji,jj) 
    802                   ELSE 
    803                      zzt(ji,jj) = pt(ji,jj) - pubox(ji,jj) * pdt * ( pt_u(ji,jj) - pt_u(ji-1,jj) ) * r1_e1t(ji,jj)  & 
    804                         &                   - pt   (ji,jj) * pdt * ( pu  (ji,jj) - pu  (ji-1,jj) ) * r1_e1e2t(ji,jj) * pamsk 
    805                   ENDIF 
    806                   zzt(ji,jj) = zzt(ji,jj) * tmask(ji,jj,1) 
    807                END DO 
    808             END DO 
    809             CALL lbc_lnk( zzt, 'T', 1. ) 
     870                        zzt(ji,jj,jl) = pt(ji,jj,jl) - pubox(ji,jj   ) * pdt * ( pt_u(ji,jj,jl) - pt_u(ji-1,jj,jl) ) * r1_e1t(ji,jj)  & 
     871                           &                         - pt   (ji,jj,jl) * pdt * ( pu  (ji,jj) - pu  (ji-1,jj) ) * r1_e1e2t(ji,jj) * pamsk 
     872                     ENDIF 
     873                     zzt(ji,jj,jl) = zzt(ji,jj,jl) * tmask(ji,jj,1) 
     874                  END DO 
     875               END DO 
     876            END DO 
     877            CALL lbc_lnk( 'icedyn_adv_umx', zzt, 'T', 1. ) 
    810878         ENDIF 
    811879         ! 
     
    832900             
    833901            ! first guess of tracer content from v-flux  
    834             DO jj = 2, jpjm1 
    835                DO ji = fs_2, fs_jpim1   ! vector opt. 
    836                   IF( ll_clem ) THEN 
    837                      IF( ll_gurvan ) THEN 
    838                         zzt(ji,jj) = ( pt(ji,jj) - ( pfv_ho(ji,jj) - pfv_ho(ji,jj-1) ) * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 
     902            DO jl = 1, jpl 
     903               DO jj = 2, jpjm1 
     904                  DO ji = fs_2, fs_jpim1   ! vector opt. 
     905                     IF( ll_clem ) THEN 
     906                        IF( ll_gurvan ) THEN 
     907                           zzt(ji,jj,jl) = ( pt(ji,jj,jl) - ( pfv_ho(ji,jj,jl) - pfv_ho(ji,jj-1,jl) ) * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 
     908                        ELSE 
     909                           zzt(ji,jj,jl) = ( pt(ji,jj,jl) - ( pfv_ho(ji,jj,jl) - pfv_ho(ji,jj-1,jl) ) * pdt * r1_e1e2t(ji,jj) & 
     910                              &            + pt(ji,jj,jl) * pdt * ( pv(ji,jj) - pv(ji,jj-1) ) * r1_e1e2t(ji,jj) * (1.-pamsk) & 
     911                              &         ) * tmask(ji,jj,1) 
     912                        ENDIF 
    839913                     ELSE 
    840                         zzt(ji,jj) = ( pt(ji,jj) - ( pfv_ho(ji,jj) - pfv_ho(ji,jj-1) ) * pdt * r1_e1e2t(ji,jj) & 
    841                            &                     + pt(ji,jj) * pdt * ( pv(ji,jj) - pv(ji,jj-1) ) * r1_e1e2t(ji,jj) * (1.-pamsk) & 
    842                            &         ) * tmask(ji,jj,1) 
    843                      ENDIF 
    844                   ELSE 
    845                      zzt(ji,jj) = ( ptc(ji,jj) - ( pfv_ho(ji,jj) - pfv_ho(ji,jj-1) ) * pdt * r1_e1e2t(ji,jj) ) & 
    846                         &         * tmask(ji,jj,1) 
    847                   ENDIF 
    848                 END DO 
    849             END DO 
    850             CALL lbc_lnk( zzt, 'T', 1. ) 
     914                        zzt(ji,jj,jl) = ( ptc(ji,jj,jl) - ( pfv_ho(ji,jj,jl) - pfv_ho(ji,jj-1,jl) ) * pdt * r1_e1e2t(ji,jj) ) & 
     915                           &         * tmask(ji,jj,1) 
     916                     ENDIF 
     917                  END DO 
     918               END DO 
     919            END DO 
     920            CALL lbc_lnk( 'icedyn_adv_umx', zzt, 'T', 1. ) 
    851921             
    852922         ELSE 
    853923             
    854             DO jj = 2, jpjm1 
    855                DO ji = fs_2, fs_jpim1 
    856                   IF( ll_gurvan ) THEN 
    857                      zzt(ji,jj) = pt(ji,jj) - pvbox(ji,jj) * pdt * ( pt_v(ji,jj) - pt_v(ji,jj-1) ) * r1_e2t(ji,jj)  & 
    858                         &                   - pt   (ji,jj) * pdt * ( pv  (ji,jj) - pv  (ji,jj-1) ) * r1_e1e2t(ji,jj) 
    859                   ELSE 
    860                      zzt(ji,jj) = pt(ji,jj) - pvbox(ji,jj) * pdt * ( pt_v(ji,jj) - pt_v(ji,jj-1) ) * r1_e2t(ji,jj)  & 
    861                         &                   - pt   (ji,jj) * pdt * ( pv  (ji,jj) - pv  (ji,jj-1) ) * r1_e1e2t(ji,jj) * pamsk 
    862                   ENDIF 
    863                   zzt(ji,jj) = zzt(ji,jj) * tmask(ji,jj,1) 
    864                END DO 
    865             END DO 
    866             CALL lbc_lnk( zzt, 'T', 1. ) 
     924            DO jl = 1, jpl 
     925               DO jj = 2, jpjm1 
     926                  DO ji = fs_2, fs_jpim1 
     927                     IF( ll_gurvan ) THEN 
     928                        zzt(ji,jj,jl) = pt(ji,jj,jl) - pvbox(ji,jj   ) * pdt * ( pt_v(ji,jj,jl) - pt_v(ji,jj-1,jl) ) * r1_e2t(ji,jj)  & 
     929                           &                         - pt   (ji,jj,jl) * pdt * ( pv  (ji,jj) - pv  (ji,jj-1) ) * r1_e1e2t(ji,jj) 
     930                     ELSE 
     931                        zzt(ji,jj,jl) = pt(ji,jj,jl) - pvbox(ji,jj   ) * pdt * ( pt_v(ji,jj,jl) - pt_v(ji,jj-1,jl) ) * r1_e2t(ji,jj)  & 
     932                           &                         - pt   (ji,jj,jl) * pdt * ( pv  (ji,jj) - pv  (ji,jj-1) ) * r1_e1e2t(ji,jj) * pamsk 
     933                     ENDIF 
     934                     zzt(ji,jj,jl) = zzt(ji,jj,jl) * tmask(ji,jj,1) 
     935                  END DO 
     936               END DO 
     937            END DO 
     938            CALL lbc_lnk( 'icedyn_adv_umx', zzt, 'T', 1. ) 
    867939         ENDIF 
    868940         ! 
     
    889961            ENDIF 
    890962         ELSE 
    891             zzfu_ho(:,:) = pfu_ho(:,:) 
    892             zzfv_ho(:,:) = pfv_ho(:,:) 
     963            zzfu_ho(:,:,:) = pfu_ho(:,:,:) 
     964            zzfv_ho(:,:,:) = pfv_ho(:,:,:) 
    893965            ! 1st iteration of nonosc (limit the flux with the upstream solution) 
    894966            IF( ll_clem ) THEN 
     
    898970            ENDIF 
    899971            ! guess after content field with high order 
    900             DO jj = 2, jpjm1 
    901                DO ji = fs_2, fs_jpim1 
    902                   ztra       = - ( zzfu_ho(ji,jj) - zzfu_ho(ji-1,jj) + zzfv_ho(ji,jj) - zzfv_ho(ji,jj-1) ) * r1_e1e2t(ji,jj) 
    903                   zzt(ji,jj) =   ( ptc(ji,jj) + pdt * ztra ) * tmask(ji,jj,1) 
    904                END DO 
    905             END DO 
    906             CALL lbc_lnk( zzt, 'T', 1. ) 
     972            DO jl = 1, jpl 
     973               DO jj = 2, jpjm1 
     974                  DO ji = fs_2, fs_jpim1 
     975                     ztra          = - ( zzfu_ho(ji,jj,jl) - zzfu_ho(ji-1,jj,jl) + zzfv_ho(ji,jj,jl) - zzfv_ho(ji,jj-1,jl) ) * r1_e1e2t(ji,jj) 
     976                     zzt(ji,jj,jl) =   ( ptc(ji,jj,jl) + pdt * ztra ) * tmask(ji,jj,1) 
     977                  END DO 
     978               END DO 
     979            END DO 
     980            CALL lbc_lnk( 'icedyn_adv_umx', zzt, 'T', 1. ) 
    907981            ! 2nd iteration of nonosc (limit the flux with the limited high order solution) 
    908982            IF( ll_clem ) THEN 
     
    9301004      INTEGER                     , INTENT(in   ) ::   kn_umx    ! order of the scheme (1-5=UM or 20=CEN2) 
    9311005      REAL(wp)                    , INTENT(in   ) ::   pdt       ! tracer time-step 
    932       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   pu        ! ice i-velocity component 
    933       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   puc       ! ice i-velocity * A component 
    934       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   pt        ! tracer fields 
    935       REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) ::   pt_u      ! tracer at u-point  
    936       REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) ::   pfu_ho    ! high order flux  
    937       ! 
    938       INTEGER  ::   ji, jj             ! dummy loop indices 
     1006      REAL(wp), DIMENSION(:,:  ), INTENT(in   ) ::   pu        ! ice i-velocity component 
     1007      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   puc       ! ice i-velocity * A component 
     1008      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pt        ! tracer fields 
     1009      REAL(wp), DIMENSION(jpi,jpj,jpl), INTENT(  out) ::   pt_u      ! tracer at u-point  
     1010      REAL(wp), DIMENSION(jpi,jpj,jpl), INTENT(  out) ::   pfu_ho    ! high order flux  
     1011      ! 
     1012      INTEGER  ::   ji, jj, jl             ! dummy loop indices 
    9391013      REAL(wp) ::   zcu, zdx2, zdx4    !   -      - 
    940       REAL(wp), DIMENSION(jpi,jpj) ::   ztu1, ztu2, ztu3, ztu4 
     1014      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   ztu1, ztu2, ztu3, ztu4 
    9411015      !!---------------------------------------------------------------------- 
    9421016      ! 
    9431017      !                                                     !--  Laplacian in i-direction  --! 
    944       DO jj = 2, jpjm1         ! First derivative (gradient) 
    945          DO ji = 1, fs_jpim1 
    946             ztu1(ji,jj) = ( pt(ji+1,jj) - pt(ji,jj) ) * r1_e1u(ji,jj) * umask(ji,jj,1) 
    947          END DO 
    948          !                     ! Second derivative (Laplacian) 
    949          DO ji = fs_2, fs_jpim1 
    950             ztu2(ji,jj) = ( ztu1(ji,jj) - ztu1(ji-1,jj) ) * r1_e1t(ji,jj) 
     1018      DO jl = 1, jpl 
     1019         DO jj = 2, jpjm1         ! First derivative (gradient) 
     1020            DO ji = 1, fs_jpim1 
     1021               ztu1(ji,jj,jl) = ( pt(ji+1,jj,jl) - pt(ji,jj,jl) ) * r1_e1u(ji,jj) * umask(ji,jj,1) 
     1022            END DO 
     1023            !                     ! Second derivative (Laplacian) 
     1024            DO ji = fs_2, fs_jpim1 
     1025               ztu2(ji,jj,jl) = ( ztu1(ji,jj,jl) - ztu1(ji-1,jj,jl) ) * r1_e1t(ji,jj) 
     1026            END DO 
    9511027         END DO 
    9521028      END DO 
    953       CALL lbc_lnk( ztu2, 'T', 1. ) 
     1029      CALL lbc_lnk( 'icedyn_adv_umx', ztu2, 'T', 1. ) 
    9541030      ! 
    9551031      !                                                     !--  BiLaplacian in i-direction  --! 
    956       DO jj = 2, jpjm1         ! Third derivative 
    957          DO ji = 1, fs_jpim1 
    958             ztu3(ji,jj) = ( ztu2(ji+1,jj) - ztu2(ji,jj) ) * r1_e1u(ji,jj) * umask(ji,jj,1) 
    959          END DO 
    960          !                     ! Fourth derivative 
    961          DO ji = fs_2, fs_jpim1 
    962             ztu4(ji,jj) = ( ztu3(ji,jj) - ztu3(ji-1,jj) ) * r1_e1t(ji,jj) 
     1032      DO jl = 1, jpl 
     1033         DO jj = 2, jpjm1         ! Third derivative 
     1034            DO ji = 1, fs_jpim1 
     1035               ztu3(ji,jj,jl) = ( ztu2(ji+1,jj,jl) - ztu2(ji,jj,jl) ) * r1_e1u(ji,jj) * umask(ji,jj,1) 
     1036            END DO 
     1037            !                     ! Fourth derivative 
     1038            DO ji = fs_2, fs_jpim1 
     1039               ztu4(ji,jj,jl) = ( ztu3(ji,jj,jl) - ztu3(ji-1,jj,jl) ) * r1_e1t(ji,jj) 
     1040            END DO 
    9631041         END DO 
    9641042      END DO 
    965       CALL lbc_lnk( ztu4, 'T', 1. ) 
     1043      CALL lbc_lnk( 'icedyn_adv_umx', ztu4, 'T', 1. ) 
    9661044      ! 
    9671045      ! 
     
    9701048      CASE( 1 )                                                   !==  1st order central TIM  ==! (Eq. 21) 
    9711049         !         
    972          DO jj = 1, jpjm1 
    973             DO ji = 1, fs_jpim1   ! vector opt. 
    974                pt_u(ji,jj) = 0.5_wp * umask(ji,jj,1) * (                              pt(ji+1,jj) + pt(ji,jj)   & 
    975                   &                                    - SIGN( 1._wp, pu(ji,jj) ) * ( pt(ji+1,jj) - pt(ji,jj) ) ) 
     1050         DO jl = 1, jpl 
     1051            DO jj = 1, jpjm1 
     1052               DO ji = 1, fs_jpim1   ! vector opt. 
     1053                  pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * (                           pt(ji+1,jj,jl) + pt(ji,jj,jl)   & 
     1054                     &                                    - SIGN( 1._wp, pu(ji,jj) ) * ( pt(ji+1,jj,jl) - pt(ji,jj,jl) ) ) 
     1055               END DO 
    9761056            END DO 
    9771057         END DO 
     
    9791059      CASE( 2 )                                                   !==  2nd order central TIM  ==! (Eq. 23) 
    9801060         ! 
    981          DO jj = 1, jpjm1 
    982             DO ji = 1, fs_jpim1   ! vector opt. 
    983                zcu  = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj) 
    984                pt_u(ji,jj) = 0.5_wp * umask(ji,jj,1) * (                                   pt(ji+1,jj) + pt(ji,jj)   & 
    985                   &                                               -              zcu   * ( pt(ji+1,jj) - pt(ji,jj) ) )  
     1061         DO jl = 1, jpl 
     1062            DO jj = 1, jpjm1 
     1063               DO ji = 1, fs_jpim1   ! vector opt. 
     1064                  zcu  = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj) 
     1065                  pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * (                                pt(ji+1,jj,jl) + pt(ji,jj,jl)   & 
     1066                     &                                               -              zcu   * ( pt(ji+1,jj,jl) - pt(ji,jj,jl) ) )  
     1067               END DO 
    9861068            END DO 
    9871069         END DO 
     
    9891071      CASE( 3 )                                                   !==  3rd order central TIM  ==! (Eq. 24) 
    9901072         ! 
    991          DO jj = 1, jpjm1 
    992             DO ji = 1, fs_jpim1   ! vector opt. 
    993                zcu  = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj) 
    994                zdx2 = e1u(ji,jj) * e1u(ji,jj) 
     1073         DO jl = 1, jpl 
     1074            DO jj = 1, jpjm1 
     1075               DO ji = 1, fs_jpim1   ! vector opt. 
     1076                  zcu  = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj) 
     1077                  zdx2 = e1u(ji,jj) * e1u(ji,jj) 
    9951078!!rachid       zdx2 = e1u(ji,jj) * e1t(ji,jj) 
    996                pt_u(ji,jj) = 0.5_wp * umask(ji,jj,1) * (         (                         pt  (ji+1,jj) + pt  (ji,jj)        & 
    997                   &                                               -              zcu   * ( pt  (ji+1,jj) - pt  (ji,jj) )  )   & 
    998                   &        + z1_6 * zdx2 * ( zcu*zcu - 1._wp ) * (                         ztu2(ji+1,jj) + ztu2(ji,jj)        & 
    999                   &                                               - SIGN( 1._wp, zcu ) * ( ztu2(ji+1,jj) - ztu2(ji,jj) )  )   ) 
     1079                  pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * (         (                      pt  (ji+1,jj,jl) + pt  (ji,jj,jl)        & 
     1080                     &                                               -              zcu   * ( pt  (ji+1,jj,jl) - pt  (ji,jj,jl) )  )   & 
     1081                     &        + z1_6 * zdx2 * ( zcu*zcu - 1._wp ) * (                         ztu2(ji+1,jj,jl) + ztu2(ji,jj,jl)        & 
     1082                     &                                               - SIGN( 1._wp, zcu ) * ( ztu2(ji+1,jj,jl) - ztu2(ji,jj,jl) )  )   ) 
     1083               END DO 
    10001084            END DO 
    10011085         END DO 
     
    10031087      CASE( 4 )                                                   !==  4th order central TIM  ==! (Eq. 27) 
    10041088         ! 
    1005          DO jj = 1, jpjm1 
    1006             DO ji = 1, fs_jpim1   ! vector opt. 
    1007                zcu  = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj) 
    1008                zdx2 = e1u(ji,jj) * e1u(ji,jj) 
     1089         DO jl = 1, jpl 
     1090            DO jj = 1, jpjm1 
     1091               DO ji = 1, fs_jpim1   ! vector opt. 
     1092                  zcu  = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj) 
     1093                  zdx2 = e1u(ji,jj) * e1u(ji,jj) 
    10091094!!rachid       zdx2 = e1u(ji,jj) * e1t(ji,jj) 
    1010                pt_u(ji,jj) = 0.5_wp * umask(ji,jj,1) * (         (                   pt  (ji+1,jj) + pt  (ji,jj)        & 
    1011                   &                                               -          zcu * ( pt  (ji+1,jj) - pt  (ji,jj) )  )   & 
    1012                   &        + z1_6 * zdx2 * ( zcu*zcu - 1._wp ) * (                   ztu2(ji+1,jj) + ztu2(ji,jj)        & 
    1013                   &                                               - 0.5_wp * zcu * ( ztu2(ji+1,jj) - ztu2(ji,jj) )  )   ) 
     1095                  pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * (         (                pt  (ji+1,jj,jl) + pt  (ji,jj,jl)        & 
     1096                     &                                               -          zcu * ( pt  (ji+1,jj,jl) - pt  (ji,jj,jl) )  )   & 
     1097                     &        + z1_6 * zdx2 * ( zcu*zcu - 1._wp ) * (                   ztu2(ji+1,jj,jl) + ztu2(ji,jj,jl)        & 
     1098                     &                                               - 0.5_wp * zcu * ( ztu2(ji+1,jj,jl) - ztu2(ji,jj,jl) )  )   ) 
     1099               END DO 
    10141100            END DO 
    10151101         END DO 
     
    10171103      CASE( 5 )                                                   !==  5th order central TIM  ==! (Eq. 29) 
    10181104         ! 
    1019          DO jj = 1, jpjm1 
    1020             DO ji = 1, fs_jpim1   ! vector opt. 
    1021                zcu  = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj) 
    1022                zdx2 = e1u(ji,jj) * e1u(ji,jj) 
    1023 !!rachid       zdx2 = e1u(ji,jj) * e1t(ji,jj) 
    1024                zdx4 = zdx2 * zdx2 
    1025                pt_u(ji,jj) = 0.5_wp * umask(ji,jj,1) * (               (                   pt  (ji+1,jj) + pt  (ji,jj)       & 
    1026                   &                                                     -          zcu * ( pt  (ji+1,jj) - pt  (ji,jj) ) )   & 
    1027                   &        + z1_6   * zdx2 * ( zcu*zcu - 1._wp ) *     (                   ztu2(ji+1,jj) + ztu2(ji,jj)       & 
    1028                   &                                                     - 0.5_wp * zcu * ( ztu2(ji+1,jj) - ztu2(ji,jj) ) )   & 
    1029                   &        + z1_120 * zdx4 * ( zcu*zcu - 1._wp ) * ( zcu*zcu - 4._wp ) * ( ztu4(ji+1,jj) + ztu4(ji,jj)       & 
    1030                   &                                               - SIGN( 1._wp, zcu ) * ( ztu4(ji+1,jj) - ztu4(ji,jj) ) ) ) 
     1105         DO jl = 1, jpl 
     1106            DO jj = 1, jpjm1 
     1107               DO ji = 1, fs_jpim1   ! vector opt. 
     1108                  zcu  = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj) 
     1109                  zdx2 = e1u(ji,jj) * e1u(ji,jj) 
     1110                  !!rachid       zdx2 = e1u(ji,jj) * e1t(ji,jj) 
     1111                  zdx4 = zdx2 * zdx2 
     1112                  pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * (            (                   pt  (ji+1,jj,jl) + pt  (ji,jj,jl)       & 
     1113                     &                                                     -          zcu * ( pt  (ji+1,jj,jl) - pt  (ji,jj,jl) ) )   & 
     1114                     &        + z1_6   * zdx2 * ( zcu*zcu - 1._wp ) *     (                   ztu2(ji+1,jj,jl) + ztu2(ji,jj,jl)       & 
     1115                     &                                                     - 0.5_wp * zcu * ( ztu2(ji+1,jj,jl) - ztu2(ji,jj,jl) ) )   & 
     1116                     &        + z1_120 * zdx4 * ( zcu*zcu - 1._wp ) * ( zcu*zcu - 4._wp ) * ( ztu4(ji+1,jj,jl) + ztu4(ji,jj,jl)       & 
     1117                     &                                               - SIGN( 1._wp, zcu ) * ( ztu4(ji+1,jj,jl) - ztu4(ji,jj,jl) ) ) ) 
     1118               END DO 
    10311119            END DO 
    10321120         END DO 
     
    10351123      !                                                     !-- High order flux in i-direction  --! 
    10361124      IF( ll_neg ) THEN 
     1125         DO jl = 1, jpl 
     1126            DO jj = 1, jpjm1 
     1127               DO ji = 1, fs_jpim1 
     1128                  IF( pt_u(ji,jj,jl) < 0._wp ) THEN 
     1129                     pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * (                           pt(ji+1,jj,jl) + pt(ji,jj,jl)   & 
     1130                        &                                    - SIGN( 1._wp, pu(ji,jj) ) * ( pt(ji+1,jj,jl) - pt(ji,jj,jl) ) ) 
     1131                  ENDIF 
     1132               END DO 
     1133            END DO 
     1134         END DO 
     1135      ENDIF 
     1136 
     1137      DO jl = 1, jpl 
    10371138         DO jj = 1, jpjm1 
    1038             DO ji = 1, fs_jpim1 
    1039                IF( pt_u(ji,jj) < 0._wp ) THEN 
    1040                   pt_u(ji,jj) = 0.5_wp * umask(ji,jj,1) * (                              pt(ji+1,jj) + pt(ji,jj)   & 
    1041                      &                                    - SIGN( 1._wp, pu(ji,jj) ) * ( pt(ji+1,jj) - pt(ji,jj) ) ) 
     1139            DO ji = 1, fs_jpim1   ! vector opt. 
     1140               IF( ll_clem ) THEN 
     1141                  pfu_ho(ji,jj,jl) = pu(ji,jj) * pt_u(ji,jj,jl) 
     1142               ELSE 
     1143                  pfu_ho(ji,jj,jl) = puc(ji,jj,jl) * pt_u(ji,jj,jl) 
    10421144               ENDIF 
    10431145            END DO 
    1044          END DO 
    1045       ENDIF 
    1046  
    1047       DO jj = 1, jpjm1 
    1048          DO ji = 1, fs_jpim1   ! vector opt. 
    1049             IF( ll_clem ) THEN 
    1050                pfu_ho(ji,jj) = pu(ji,jj) * pt_u(ji,jj) 
    1051             ELSE 
    1052                pfu_ho(ji,jj) = puc(ji,jj) * pt_u(ji,jj) 
    1053             ENDIF 
    10541146         END DO 
    10551147      END DO 
     
    10711163      INTEGER                     , INTENT(in   ) ::   kn_umx    ! order of the scheme (1-5=UM or 20=CEN2) 
    10721164      REAL(wp)                    , INTENT(in   ) ::   pdt       ! tracer time-step 
    1073       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   pv        ! ice j-velocity component 
    1074       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   pvc       ! ice j-velocity*A component 
    1075       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   pt        ! tracer fields 
    1076       REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) ::   pt_v      ! tracer at v-point  
    1077       REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) ::   pfv_ho    ! high order flux  
    1078       ! 
    1079       INTEGER  ::   ji, jj       ! dummy loop indices 
     1165      REAL(wp), DIMENSION(:,:  ), INTENT(in   ) ::   pv        ! ice j-velocity component 
     1166      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pvc       ! ice j-velocity*A component 
     1167      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pt        ! tracer fields 
     1168      REAL(wp), DIMENSION(jpi,jpj,jpl), INTENT(  out) ::   pt_v      ! tracer at v-point  
     1169      REAL(wp), DIMENSION(jpi,jpj,jpl), INTENT(  out) ::   pfv_ho    ! high order flux  
     1170      ! 
     1171      INTEGER  ::   ji, jj, jl       ! dummy loop indices 
    10801172      REAL(wp) ::   zcv, zdy2, zdy4    !   -      - 
    1081       REAL(wp), DIMENSION(jpi,jpj) ::   ztv1, ztv2, ztv3, ztv4 
     1173      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   ztv1, ztv2, ztv3, ztv4 
    10821174      !!---------------------------------------------------------------------- 
    10831175      ! 
    10841176      !                                                     !--  Laplacian in j-direction  --! 
    1085       DO jj = 1, jpjm1         ! First derivative (gradient) 
    1086          DO ji = fs_2, fs_jpim1 
    1087             ztv1(ji,jj) = ( pt(ji,jj+1) - pt(ji,jj) ) * r1_e2v(ji,jj) * vmask(ji,jj,1) 
     1177      DO jl = 1, jpl 
     1178         DO jj = 1, jpjm1         ! First derivative (gradient) 
     1179            DO ji = fs_2, fs_jpim1 
     1180               ztv1(ji,jj,jl) = ( pt(ji,jj+1,jl) - pt(ji,jj,jl) ) * r1_e2v(ji,jj) * vmask(ji,jj,1) 
     1181            END DO 
     1182         END DO 
     1183         DO jj = 2, jpjm1         ! Second derivative (Laplacian) 
     1184            DO ji = fs_2, fs_jpim1 
     1185               ztv2(ji,jj,jl) = ( ztv1(ji,jj,jl) - ztv1(ji,jj-1,jl) ) * r1_e2t(ji,jj) 
     1186            END DO 
    10881187         END DO 
    10891188      END DO 
    1090       DO jj = 2, jpjm1         ! Second derivative (Laplacian) 
    1091          DO ji = fs_2, fs_jpim1 
    1092             ztv2(ji,jj) = ( ztv1(ji,jj) - ztv1(ji,jj-1) ) * r1_e2t(ji,jj) 
     1189      CALL lbc_lnk( 'icedyn_adv_umx', ztv2, 'T', 1. ) 
     1190      ! 
     1191      !                                                     !--  BiLaplacian in j-direction  --! 
     1192      DO jl = 1, jpl 
     1193         DO jj = 1, jpjm1         ! First derivative 
     1194            DO ji = fs_2, fs_jpim1 
     1195               ztv3(ji,jj,jl) = ( ztv2(ji,jj+1,jl) - ztv2(ji,jj,jl) ) * r1_e2v(ji,jj) * vmask(ji,jj,1) 
     1196            END DO 
     1197         END DO 
     1198         DO jj = 2, jpjm1         ! Second derivative 
     1199            DO ji = fs_2, fs_jpim1 
     1200               ztv4(ji,jj,jl) = ( ztv3(ji,jj,jl) - ztv3(ji,jj-1,jl) ) * r1_e2t(ji,jj) 
     1201            END DO 
    10931202         END DO 
    10941203      END DO 
    1095       CALL lbc_lnk( ztv2, 'T', 1. ) 
    1096       ! 
    1097       !                                                     !--  BiLaplacian in j-direction  --! 
    1098       DO jj = 1, jpjm1         ! First derivative 
    1099          DO ji = fs_2, fs_jpim1 
    1100             ztv3(ji,jj) = ( ztv2(ji,jj+1) - ztv2(ji,jj) ) * r1_e2v(ji,jj) * vmask(ji,jj,1) 
    1101          END DO 
    1102       END DO 
    1103       DO jj = 2, jpjm1         ! Second derivative 
    1104          DO ji = fs_2, fs_jpim1 
    1105             ztv4(ji,jj) = ( ztv3(ji,jj) - ztv3(ji,jj-1) ) * r1_e2t(ji,jj) 
    1106          END DO 
    1107       END DO 
    1108       CALL lbc_lnk( ztv4, 'T', 1. ) 
     1204      CALL lbc_lnk( 'icedyn_adv_umx', ztv4, 'T', 1. ) 
    11091205      ! 
    11101206      ! 
    11111207      SELECT CASE (kn_umx ) 
    1112       ! 
     1208         ! 
    11131209      CASE( 1 )                                                !==  1st order central TIM  ==! (Eq. 21) 
    1114          DO jj = 1, jpjm1 
    1115             DO ji = 1, fs_jpim1 
    1116                pt_v(ji,jj) = 0.5_wp * vmask(ji,jj,1) * (                             ( pt(ji,jj+1) + pt(ji,jj) )  & 
    1117                   &                                     - SIGN( 1._wp, pv(ji,jj) ) * ( pt(ji,jj+1) - pt(ji,jj) ) ) 
     1210         DO jl = 1, jpl 
     1211            DO jj = 1, jpjm1 
     1212               DO ji = 1, fs_jpim1 
     1213                  pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * (                          ( pt(ji,jj+1,jl) + pt(ji,jj,jl) )  & 
     1214                     &                                     - SIGN( 1._wp, pv(ji,jj) ) * ( pt(ji,jj+1,jl) - pt(ji,jj,jl) ) ) 
     1215               END DO 
    11181216            END DO 
    11191217         END DO 
    11201218         ! 
    11211219      CASE( 2 )                                                !==  2nd order central TIM  ==! (Eq. 23) 
    1122          DO jj = 1, jpjm1 
    1123             DO ji = 1, fs_jpim1 
    1124                zcv  = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj) 
    1125                pt_v(ji,jj) = 0.5_wp * vmask(ji,jj,1) * (        ( pt(ji,jj+1) + pt(ji,jj) )  & 
    1126                   &                                     - zcv * ( pt(ji,jj+1) - pt(ji,jj) ) ) 
    1127             END DO 
    1128          END DO 
    1129          CALL lbc_lnk( pt_v, 'V',  1. ) 
     1220         DO jl = 1, jpl 
     1221            DO jj = 1, jpjm1 
     1222               DO ji = 1, fs_jpim1 
     1223                  zcv  = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj) 
     1224                  pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * (     ( pt(ji,jj+1,jl) + pt(ji,jj,jl) )  & 
     1225                     &                                     - zcv * ( pt(ji,jj+1,jl) - pt(ji,jj,jl) ) ) 
     1226               END DO 
     1227            END DO 
     1228         END DO 
     1229         CALL lbc_lnk( 'icedyn_adv_umx', pt_v, 'V',  1. ) 
    11301230         ! 
    11311231      CASE( 3 )                                                !==  3rd order central TIM  ==! (Eq. 24) 
    1132          DO jj = 1, jpjm1 
    1133             DO ji = 1, fs_jpim1 
    1134                zcv  = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj) 
    1135                zdy2 = e2v(ji,jj) * e2v(ji,jj) 
     1232         DO jl = 1, jpl 
     1233            DO jj = 1, jpjm1 
     1234               DO ji = 1, fs_jpim1 
     1235                  zcv  = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj) 
     1236                  zdy2 = e2v(ji,jj) * e2v(ji,jj) 
    11361237!!rachid       zdy2 = e2v(ji,jj) * e2t(ji,jj) 
    1137                pt_v(ji,jj) = 0.5_wp * vmask(ji,jj,1) * (                                 ( pt  (ji,jj+1) + pt  (ji,jj)       & 
    1138                   &                                     -                        zcv   * ( pt  (ji,jj+1) - pt  (ji,jj) ) )   & 
    1139                   &        + z1_6 * zdy2 * ( zcv*zcv - 1._wp ) * (                         ztv2(ji,jj+1) + ztv2(ji,jj)       & 
    1140                   &                                               - SIGN( 1._wp, zcv ) * ( ztv2(ji,jj+1) - ztv2(ji,jj) ) ) ) 
     1238                  pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * (                              ( pt  (ji,jj+1,jl) + pt  (ji,jj,jl)       & 
     1239                     &                                     -                        zcv   * ( pt  (ji,jj+1,jl) - pt  (ji,jj,jl) ) )   & 
     1240                     &        + z1_6 * zdy2 * ( zcv*zcv - 1._wp ) * (                         ztv2(ji,jj+1,jl) + ztv2(ji,jj,jl)       & 
     1241                     &                                               - SIGN( 1._wp, zcv ) * ( ztv2(ji,jj+1,jl) - ztv2(ji,jj,jl) ) ) ) 
     1242               END DO 
    11411243            END DO 
    11421244         END DO 
    11431245         ! 
    11441246      CASE( 4 )                                                !==  4th order central TIM  ==! (Eq. 27) 
    1145          DO jj = 1, jpjm1 
    1146             DO ji = 1, fs_jpim1 
    1147                zcv  = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj) 
    1148                zdy2 = e2v(ji,jj) * e2v(ji,jj) 
     1247         DO jl = 1, jpl 
     1248            DO jj = 1, jpjm1 
     1249               DO ji = 1, fs_jpim1 
     1250                  zcv  = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj) 
     1251                  zdy2 = e2v(ji,jj) * e2v(ji,jj) 
    11491252!!rachid       zdy2 = e2v(ji,jj) * e2t(ji,jj) 
    1150                pt_v(ji,jj) = 0.5_wp * vmask(ji,jj,1) * (                           ( pt  (ji,jj+1) + pt  (ji,jj)       & 
    1151                   &                                               -          zcv * ( pt  (ji,jj+1) - pt  (ji,jj) ) )   & 
    1152                   &        + z1_6 * zdy2 * ( zcv*zcv - 1._wp ) * (                   ztv2(ji,jj+1) + ztv2(ji,jj)       & 
    1153                   &                                               - 0.5_wp * zcv * ( ztv2(ji,jj+1) - ztv2(ji,jj) ) ) ) 
     1253                  pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * (                        ( pt  (ji,jj+1,jl) + pt  (ji,jj,jl)       & 
     1254                     &                                               -          zcv * ( pt  (ji,jj+1,jl) - pt  (ji,jj,jl) ) )   & 
     1255                     &        + z1_6 * zdy2 * ( zcv*zcv - 1._wp ) * (                   ztv2(ji,jj+1,jl) + ztv2(ji,jj,jl)       & 
     1256                     &                                               - 0.5_wp * zcv * ( ztv2(ji,jj+1,jl) - ztv2(ji,jj,jl) ) ) ) 
     1257               END DO 
    11541258            END DO 
    11551259         END DO 
    11561260         ! 
    11571261      CASE( 5 )                                                !==  5th order central TIM  ==! (Eq. 29) 
    1158          DO jj = 1, jpjm1 
    1159             DO ji = 1, fs_jpim1 
    1160                zcv  = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj) 
    1161                zdy2 = e2v(ji,jj) * e2v(ji,jj) 
     1262         DO jl = 1, jpl 
     1263            DO jj = 1, jpjm1 
     1264               DO ji = 1, fs_jpim1 
     1265                  zcv  = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj) 
     1266                  zdy2 = e2v(ji,jj) * e2v(ji,jj) 
    11621267!!rachid       zdy2 = e2v(ji,jj) * e2t(ji,jj) 
    1163                zdy4 = zdy2 * zdy2 
    1164                pt_v(ji,jj) = 0.5_wp * vmask(ji,jj,1) * (                                 ( pt  (ji,jj+1) + pt  (ji,jj)      & 
    1165                   &                                                     -          zcv * ( pt  (ji,jj+1) - pt  (ji,jj) ) )  & 
    1166                   &        + z1_6   * zdy2 * ( zcv*zcv - 1._wp ) *     (                   ztv2(ji,jj+1) + ztv2(ji,jj)      & 
    1167                   &                                                     - 0.5_wp * zcv * ( ztv2(ji,jj+1) - ztv2(ji,jj) ) )  & 
    1168                   &        + z1_120 * zdy4 * ( zcv*zcv - 1._wp ) * ( zcv*zcv - 4._wp ) * ( ztv4(ji,jj+1) + ztv4(ji,jj)      & 
    1169                   &                                               - SIGN( 1._wp, zcv ) * ( ztv4(ji,jj+1) - ztv4(ji,jj) ) ) ) 
     1268                  zdy4 = zdy2 * zdy2 
     1269                  pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * (                              ( pt  (ji,jj+1,jl) + pt  (ji,jj,jl)      & 
     1270                     &                                                     -          zcv * ( pt  (ji,jj+1,jl) - pt  (ji,jj,jl) ) )  & 
     1271                     &        + z1_6   * zdy2 * ( zcv*zcv - 1._wp ) *     (                   ztv2(ji,jj+1,jl) + ztv2(ji,jj,jl)      & 
     1272                     &                                                     - 0.5_wp * zcv * ( ztv2(ji,jj+1,jl) - ztv2(ji,jj,jl) ) )  & 
     1273                     &        + z1_120 * zdy4 * ( zcv*zcv - 1._wp ) * ( zcv*zcv - 4._wp ) * ( ztv4(ji,jj+1,jl) + ztv4(ji,jj,jl)      & 
     1274                     &                                               - SIGN( 1._wp, zcv ) * ( ztv4(ji,jj+1,jl) - ztv4(ji,jj,jl) ) ) ) 
     1275               END DO 
    11701276            END DO 
    11711277         END DO 
     
    11741280      !                                                     !-- High order flux in j-direction  --! 
    11751281      IF( ll_neg ) THEN 
     1282         DO jl = 1, jpl 
     1283            DO jj = 1, jpjm1 
     1284               DO ji = 1, fs_jpim1 
     1285                  IF( pt_v(ji,jj,jl) < 0._wp ) THEN 
     1286                     pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * (                          ( pt(ji,jj+1,jl) + pt(ji,jj,jl) )  & 
     1287                        &                                     - SIGN( 1._wp, pv(ji,jj) ) * ( pt(ji,jj+1,jl) - pt(ji,jj,jl) ) ) 
     1288                  ENDIF 
     1289               END DO 
     1290            END DO 
     1291         END DO 
     1292      ENDIF 
     1293 
     1294      DO jl = 1, jpl 
    11761295         DO jj = 1, jpjm1 
    1177             DO ji = 1, fs_jpim1 
    1178                IF( pt_v(ji,jj) < 0._wp ) THEN 
    1179                   pt_v(ji,jj) = 0.5_wp * vmask(ji,jj,1) * (                             ( pt(ji,jj+1) + pt(ji,jj) )  & 
    1180                      &                                     - SIGN( 1._wp, pv(ji,jj) ) * ( pt(ji,jj+1) - pt(ji,jj) ) ) 
     1296            DO ji = 1, fs_jpim1   ! vector opt. 
     1297               IF( ll_clem ) THEN 
     1298                  pfv_ho(ji,jj,jl) = pv(ji,jj) * pt_v(ji,jj,jl) 
     1299               ELSE 
     1300                  pfv_ho(ji,jj,jl) = pvc(ji,jj,jl) * pt_v(ji,jj,jl) 
    11811301               ENDIF 
    11821302            END DO 
    1183          END DO 
    1184       ENDIF 
    1185  
    1186       DO jj = 1, jpjm1 
    1187          DO ji = 1, fs_jpim1   ! vector opt. 
    1188             IF( ll_clem ) THEN 
    1189                pfv_ho(ji,jj) = pv(ji,jj) * pt_v(ji,jj) 
    1190             ELSE 
    1191                pfv_ho(ji,jj) = pvc(ji,jj) * pt_v(ji,jj) 
    1192             ENDIF 
    11931303         END DO 
    11941304      END DO 
     
    12121322      REAL(wp)                     , INTENT(in   ) ::   pamsk            ! advection of concentration (1) or other tracers (0) 
    12131323      REAL(wp)                     , INTENT(in   ) ::   pdt              ! tracer time-step 
    1214       REAL(wp), DIMENSION (jpi,jpj), INTENT(in   ) ::   pu               ! ice i-velocity => u*e2 
    1215       REAL(wp), DIMENSION (jpi,jpj), INTENT(in   ) ::   puc              ! ice i-velocity *A => u*e2*a 
    1216       REAL(wp), DIMENSION (jpi,jpj), INTENT(in   ) ::   pv               ! ice j-velocity => v*e1 
    1217       REAL(wp), DIMENSION (jpi,jpj), INTENT(in   ) ::   pvc              ! ice j-velocity *A => v*e1*a 
    1218       REAL(wp), DIMENSION (jpi,jpj), INTENT(in   ) ::   ptc, pt, pt_low  ! before field & upstream guess of after field 
    1219       REAL(wp), DIMENSION (jpi,jpj), INTENT(inout) ::   pfv_low, pfu_low ! upstream flux 
    1220       REAL(wp), DIMENSION (jpi,jpj), INTENT(inout) ::   pfv_ho, pfu_ho   ! monotonic flux 
    1221       ! 
    1222       INTEGER  ::   ji, jj    ! dummy loop indices 
     1324      REAL(wp), DIMENSION (:,:  ), INTENT(in   ) ::   pu               ! ice i-velocity => u*e2 
     1325      REAL(wp), DIMENSION (:,:,:), INTENT(in   ) ::   puc              ! ice i-velocity *A => u*e2*a 
     1326      REAL(wp), DIMENSION (:,:  ), INTENT(in   ) ::   pv               ! ice j-velocity => v*e1 
     1327      REAL(wp), DIMENSION (:,:,:), INTENT(in   ) ::   pvc              ! ice j-velocity *A => v*e1*a 
     1328      REAL(wp), DIMENSION (:,:,:), INTENT(in   ) ::   ptc, pt, pt_low  ! before field & upstream guess of after field 
     1329      REAL(wp), DIMENSION (:,:,:), INTENT(inout) ::   pfv_low, pfu_low ! upstream flux 
     1330      REAL(wp), DIMENSION (:,:,:), INTENT(inout) ::   pfv_ho, pfu_ho   ! monotonic flux 
     1331      ! 
     1332      INTEGER  ::   ji, jj, jl    ! dummy loop indices 
    12231333      REAL(wp) ::   zpos, zneg, zbig, zsml, z1_dt, zpos2, zneg2   ! local scalars 
    12241334      REAL(wp) ::   zau, zbu, zcu, zav, zbv, zcv, zup, zdo, zsign, zcoef        !   -      - 
    1225       REAL(wp), DIMENSION(jpi,jpj) :: zbetup, zbetdo, zbup, zbdo, zti_low, ztj_low, zzt 
     1335      REAL(wp), DIMENSION(jpi,jpj    ) :: zbup, zbdo 
     1336      REAL(wp), DIMENSION(jpi,jpj,jpl) :: zbetup, zbetdo, zti_low, ztj_low, zzt 
    12261337      !!---------------------------------------------------------------------- 
    12271338      zbig = 1.e+40_wp 
    12281339      zsml = epsi20 
    1229  
     1340       
    12301341      IF( ll_zeroup2 ) THEN 
    1231          DO jj = 1, jpjm1 
    1232             DO ji = 1, fs_jpim1   ! vector opt. 
    1233                IF( amaxu(ji,jj) == 0._wp )   pfu_ho(ji,jj) = 0._wp 
    1234                IF( amaxv(ji,jj) == 0._wp )   pfv_ho(ji,jj) = 0._wp 
     1342         DO jl = 1, jpl 
     1343            DO jj = 1, jpjm1 
     1344               DO ji = 1, fs_jpim1   ! vector opt. 
     1345                  IF( amaxu(ji,jj,jl) == 0._wp )   pfu_ho(ji,jj,jl) = 0._wp 
     1346                  IF( amaxv(ji,jj,jl) == 0._wp )   pfv_ho(ji,jj,jl) = 0._wp 
     1347               END DO 
    12351348            END DO 
    12361349         END DO 
    12371350      ENDIF 
    1238        
     1351 
    12391352      IF( ll_zeroup4 ) THEN 
    1240          DO jj = 1, jpjm1 
    1241             DO ji = 1, fs_jpim1   ! vector opt. 
    1242                IF( pfu_low(ji,jj) == 0._wp )   pfu_ho(ji,jj) = 0._wp 
    1243                IF( pfv_low(ji,jj) == 0._wp )   pfv_ho(ji,jj) = 0._wp 
     1353         DO jl = 1, jpl 
     1354            DO jj = 1, jpjm1 
     1355               DO ji = 1, fs_jpim1   ! vector opt. 
     1356                  IF( pfu_low(ji,jj,jl) == 0._wp )   pfu_ho(ji,jj,jl) = 0._wp 
     1357                  IF( pfv_low(ji,jj,jl) == 0._wp )   pfv_ho(ji,jj,jl) = 0._wp 
     1358               END DO 
    12441359            END DO 
    12451360         END DO 
     
    12481363 
    12491364      IF( ll_zeroup1 ) THEN 
    1250          DO jj = 2, jpjm1 
    1251             DO ji = fs_2, fs_jpim1 
    1252                IF( ll_gurvan ) THEN 
    1253                   zzt(ji,jj) = ( pt(ji,jj) - ( pfu_ho(ji,jj) - pfu_ho(ji-1,jj) ) * pdt * r1_e1e2t(ji,jj)  & 
    1254                      &                     - ( pfv_ho(ji,jj) - pfv_ho(ji,jj-1) ) * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 
    1255                ELSE 
    1256                   zzt(ji,jj) = ( pt(ji,jj) - ( pfu_ho(ji,jj) - pfu_ho(ji-1,jj) ) * pdt * r1_e1e2t(ji,jj)  & 
    1257                      &                     - ( pfv_ho(ji,jj) - pfv_ho(ji,jj-1) ) * pdt * r1_e1e2t(ji,jj)  & 
    1258                      &                     + pt(ji,jj) * pdt * ( pu(ji,jj) - pu(ji-1,jj) ) * r1_e1e2t(ji,jj) * (1.-pamsk) & 
    1259                      &                     + pt(ji,jj) * pdt * ( pv(ji,jj) - pv(ji,jj-1) ) * r1_e1e2t(ji,jj) * (1.-pamsk) & 
    1260                      &         ) * tmask(ji,jj,1) 
    1261                ENDIF 
    1262                IF( zzt(ji,jj) < 0._wp ) THEN 
    1263                   pfu_ho(ji,jj)   = pfu_low(ji,jj) 
    1264                   pfv_ho(ji,jj)   = pfv_low(ji,jj) 
    1265                   WRITE(numout,*) '*** 1 negative high order zzt ***',ji,jj,zzt(ji,jj) 
    1266                ENDIF 
    1267 !!               IF( ji==26 .AND. jj==86) THEN 
    1268 !!                  WRITE(numout,*) 'zzt high order',zzt(ji,jj) 
    1269 !!                  WRITE(numout,*) 'pfu_ho',(pfu_ho(ji,jj)) * r1_e1e2t(ji,jj) * pdt 
    1270 !!                  WRITE(numout,*) 'pfv_ho',(pfv_ho(ji,jj)) * r1_e1e2t(ji,jj) * pdt 
    1271 !!                  WRITE(numout,*) 'pfu_hom1',(pfu_ho(ji-1,jj)) * r1_e1e2t(ji,jj) * pdt 
    1272 !!                  WRITE(numout,*) 'pfv_hom1',(pfv_ho(ji,jj-1)) * r1_e1e2t(ji,jj) * pdt 
    1273 !!               ENDIF 
    1274                IF( ll_gurvan ) THEN 
    1275                   zzt(ji,jj) = ( pt(ji,jj) - ( pfu_ho(ji,jj) - pfu_ho(ji-1,jj) ) * pdt * r1_e1e2t(ji,jj)  & 
    1276                      &                     - ( pfv_ho(ji,jj) - pfv_ho(ji,jj-1) ) * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 
    1277                ELSE 
    1278                   zzt(ji,jj) = ( pt(ji,jj) - ( pfu_ho(ji,jj) - pfu_ho(ji-1,jj) ) * pdt * r1_e1e2t(ji,jj)  & 
    1279                      &                     - ( pfv_ho(ji,jj) - pfv_ho(ji,jj-1) ) * pdt * r1_e1e2t(ji,jj)  & 
    1280                      &                     + pt(ji,jj) * pdt * ( pu(ji,jj) - pu(ji-1,jj) ) * r1_e1e2t(ji,jj) * (1.-pamsk) & 
    1281                      &                     + pt(ji,jj) * pdt * ( pv(ji,jj) - pv(ji,jj-1) ) * r1_e1e2t(ji,jj) * (1.-pamsk) & 
    1282                      &         ) * tmask(ji,jj,1) 
    1283                ENDIF 
    1284                IF( zzt(ji,jj) < 0._wp ) THEN 
    1285                   pfu_ho(ji-1,jj) = pfu_low(ji-1,jj) 
    1286                   pfv_ho(ji,jj-1) = pfv_low(ji,jj-1) 
    1287                   WRITE(numout,*) '*** 2 negative high order zzt ***',ji,jj,zzt(ji,jj) 
    1288                ENDIF 
    1289                IF( ll_gurvan ) THEN 
    1290                   zzt(ji,jj) = ( pt(ji,jj) - ( pfu_ho(ji,jj) - pfu_ho(ji-1,jj) ) * pdt * r1_e1e2t(ji,jj)  & 
    1291                      &                     - ( pfv_ho(ji,jj) - pfv_ho(ji,jj-1) ) * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 
    1292                ELSE 
    1293                   zzt(ji,jj) = ( pt(ji,jj) - ( pfu_ho(ji,jj) - pfu_ho(ji-1,jj) ) * pdt * r1_e1e2t(ji,jj)  & 
    1294                      &                     - ( pfv_ho(ji,jj) - pfv_ho(ji,jj-1) ) * pdt * r1_e1e2t(ji,jj)  & 
    1295                      &                     + pt(ji,jj) * pdt * ( pu(ji,jj) - pu(ji-1,jj) ) * r1_e1e2t(ji,jj) * (1.-pamsk) & 
    1296                      &                     + pt(ji,jj) * pdt * ( pv(ji,jj) - pv(ji,jj-1) ) * r1_e1e2t(ji,jj) * (1.-pamsk) & 
    1297                      &         ) * tmask(ji,jj,1) 
    1298                ENDIF 
    1299                IF( zzt(ji,jj) < 0._wp ) THEN 
    1300                   WRITE(numout,*) '*** 3 negative high order zzt ***',ji,jj,zzt(ji,jj) 
    1301                ENDIF 
    1302             END DO 
    1303          END DO 
    1304          CALL lbc_lnk_multi( pfu_ho, 'U', -1., pfv_ho, 'V', -1. ) 
     1365         DO jl = 1, jpl 
     1366            DO jj = 2, jpjm1 
     1367               DO ji = fs_2, fs_jpim1 
     1368                  IF( ll_gurvan ) THEN 
     1369                     zzt(ji,jj,jl) = ( pt(ji,jj,jl) - ( pfu_ho(ji,jj,jl) - pfu_ho(ji-1,jj,jl) ) * pdt * r1_e1e2t(ji,jj)  & 
     1370                        &                           - ( pfv_ho(ji,jj,jl) - pfv_ho(ji,jj-1,jl) ) * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 
     1371                  ELSE 
     1372                     zzt(ji,jj,jl) = ( pt(ji,jj,jl) - ( pfu_ho(ji,jj,jl) - pfu_ho(ji-1,jj,jl) ) * pdt * r1_e1e2t(ji,jj)  & 
     1373                        &                           - ( pfv_ho(ji,jj,jl) - pfv_ho(ji,jj-1,jl) ) * pdt * r1_e1e2t(ji,jj)  & 
     1374                        &                     + pt(ji,jj,jl) * pdt * ( pu(ji,jj) - pu(ji-1,jj) ) * r1_e1e2t(ji,jj) * (1.-pamsk) & 
     1375                        &                     + pt(ji,jj,jl) * pdt * ( pv(ji,jj) - pv(ji,jj-1) ) * r1_e1e2t(ji,jj) * (1.-pamsk) & 
     1376                        &         ) * tmask(ji,jj,1) 
     1377                  ENDIF 
     1378                  IF( zzt(ji,jj,jl) < 0._wp ) THEN 
     1379                     pfu_ho(ji,jj,jl)   = pfu_low(ji,jj,jl) 
     1380                     pfv_ho(ji,jj,jl)   = pfv_low(ji,jj,jl) 
     1381                     WRITE(numout,*) '*** 1 negative high order zzt ***',ji,jj,zzt(ji,jj,jl) 
     1382                  ENDIF 
     1383                  !!               IF( ji==26 .AND. jj==86) THEN 
     1384                  !!                  WRITE(numout,*) 'zzt high order',zzt(ji,jj) 
     1385                  !!                  WRITE(numout,*) 'pfu_ho',(pfu_ho(ji,jj,jl)) * r1_e1e2t(ji,jj) * pdt 
     1386                  !!                  WRITE(numout,*) 'pfv_ho',(pfv_ho(ji,jj,jl)) * r1_e1e2t(ji,jj) * pdt 
     1387                  !!                  WRITE(numout,*) 'pfu_hom1',(pfu_ho(ji-1,jj,jl)) * r1_e1e2t(ji,jj) * pdt 
     1388                  !!                  WRITE(numout,*) 'pfv_hom1',(pfv_ho(ji,jj-1,jl)) * r1_e1e2t(ji,jj) * pdt 
     1389                  !!               ENDIF 
     1390                  IF( ll_gurvan ) THEN 
     1391                     zzt(ji,jj,jl) = ( pt(ji,jj,jl) - ( pfu_ho(ji,jj,jl) - pfu_ho(ji-1,jj,jl) ) * pdt * r1_e1e2t(ji,jj)  & 
     1392                        &                           - ( pfv_ho(ji,jj,jl) - pfv_ho(ji,jj-1,jl) ) * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 
     1393                  ELSE 
     1394                     zzt(ji,jj,jl) = ( pt(ji,jj,jl) - ( pfu_ho(ji,jj,jl) - pfu_ho(ji-1,jj,jl) ) * pdt * r1_e1e2t(ji,jj)  & 
     1395                        &                           - ( pfv_ho(ji,jj,jl) - pfv_ho(ji,jj-1,jl) ) * pdt * r1_e1e2t(ji,jj)  & 
     1396                        &                     + pt(ji,jj,jl) * pdt * ( pu(ji,jj) - pu(ji-1,jj) ) * r1_e1e2t(ji,jj) * (1.-pamsk) & 
     1397                        &                     + pt(ji,jj,jl) * pdt * ( pv(ji,jj) - pv(ji,jj-1) ) * r1_e1e2t(ji,jj) * (1.-pamsk) & 
     1398                        &         ) * tmask(ji,jj,1) 
     1399                  ENDIF 
     1400                  IF( zzt(ji,jj,jl) < 0._wp ) THEN 
     1401                     pfu_ho(ji-1,jj,jl) = pfu_low(ji-1,jj,jl) 
     1402                     pfv_ho(ji,jj-1,jl) = pfv_low(ji,jj-1,jl) 
     1403                     WRITE(numout,*) '*** 2 negative high order zzt ***',ji,jj,zzt(ji,jj,jl) 
     1404                  ENDIF 
     1405                  IF( ll_gurvan ) THEN 
     1406                     zzt(ji,jj,jl) = ( pt(ji,jj,jl) - ( pfu_ho(ji,jj,jl) - pfu_ho(ji-1,jj,jl) ) * pdt * r1_e1e2t(ji,jj)  & 
     1407                        &                           - ( pfv_ho(ji,jj,jl) - pfv_ho(ji,jj-1,jl) ) * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 
     1408                  ELSE 
     1409                     zzt(ji,jj,jl) = ( pt(ji,jj,jl) - ( pfu_ho(ji,jj,jl) - pfu_ho(ji-1,jj,jl) ) * pdt * r1_e1e2t(ji,jj)  & 
     1410                        &                           - ( pfv_ho(ji,jj,jl) - pfv_ho(ji,jj-1,jl) ) * pdt * r1_e1e2t(ji,jj)  & 
     1411                        &                     + pt(ji,jj,jl) * pdt * ( pu(ji,jj) - pu(ji-1,jj) ) * r1_e1e2t(ji,jj) * (1.-pamsk) & 
     1412                        &                     + pt(ji,jj,jl) * pdt * ( pv(ji,jj) - pv(ji,jj-1) ) * r1_e1e2t(ji,jj) * (1.-pamsk) & 
     1413                        &         ) * tmask(ji,jj,1) 
     1414                  ENDIF 
     1415                  IF( zzt(ji,jj,jl) < 0._wp ) THEN 
     1416                     WRITE(numout,*) '*** 3 negative high order zzt ***',ji,jj,zzt(ji,jj,jl) 
     1417                  ENDIF 
     1418               END DO 
     1419            END DO 
     1420         END DO 
     1421         CALL lbc_lnk_multi( 'icedyn_adv_umx', pfu_ho, 'U', -1., pfv_ho, 'V', -1. ) 
    13051422      ENDIF 
    13061423 
     
    13081425      ! antidiffusive flux : high order minus low order 
    13091426      ! -------------------------------------------------- 
    1310       DO jj = 1, jpjm1 
    1311          DO ji = 1, fs_jpim1   ! vector opt. 
    1312             pfu_ho(ji,jj) = pfu_ho(ji,jj) - pfu_low(ji,jj) 
    1313             pfv_ho(ji,jj) = pfv_ho(ji,jj) - pfv_low(ji,jj) 
    1314           END DO 
     1427      DO jl = 1, jpl 
     1428         DO jj = 1, jpjm1 
     1429            DO ji = 1, fs_jpim1   ! vector opt. 
     1430               pfu_ho(ji,jj,jl) = pfu_ho(ji,jj,jl) - pfu_low(ji,jj,jl) 
     1431               pfv_ho(ji,jj,jl) = pfv_ho(ji,jj,jl) - pfv_low(ji,jj,jl) 
     1432            END DO 
     1433         END DO 
    13151434      END DO 
    13161435 
     
    13251444      IF( ll_prelimiter_zalesak ) THEN 
    13261445          
    1327          DO jj = 2, jpjm1 
    1328             DO ji = fs_2, fs_jpim1  
    1329                zti_low(ji,jj)= pt_low(ji+1,jj  ) 
    1330                ztj_low(ji,jj)= pt_low(ji  ,jj+1) 
    1331             END DO 
    1332          END DO 
    1333          CALL lbc_lnk_multi( zti_low, 'T', 1., ztj_low, 'T', 1. ) 
     1446         DO jl = 1, jpl 
     1447            DO jj = 2, jpjm1 
     1448               DO ji = fs_2, fs_jpim1  
     1449                  zti_low(ji,jj,jl)= pt_low(ji+1,jj  ,jl) 
     1450                  ztj_low(ji,jj,jl)= pt_low(ji  ,jj+1,jl) 
     1451               END DO 
     1452            END DO 
     1453         END DO 
     1454         CALL lbc_lnk_multi( 'icedyn_adv_umx', zti_low, 'T', 1., ztj_low, 'T', 1. ) 
    13341455 
    13351456         !! this does not work ?? 
     
    13531474         !!            END DO             
    13541475 
    1355          DO jj = 2, jpjm1 
    1356             DO ji = fs_2, fs_jpim1 
    1357                IF ( pfu_ho(ji,jj) * ( pt_low(ji+1,jj) - pt_low(ji,jj) ) <= 0. .AND.  & 
    1358                   & pfv_ho(ji,jj) * ( pt_low(ji,jj+1) - pt_low(ji,jj) ) <= 0. ) THEN 
    1359                   ! 
    1360                   IF(  pfu_ho(ji,jj) * ( zti_low(ji+1,jj) - zti_low(ji,jj) ) <= 0 .AND.  & 
    1361                      & pfv_ho(ji,jj) * ( ztj_low(ji,jj+1) - ztj_low(ji,jj) ) <= 0)  pfu_ho(ji,jj)=0. ; pfv_ho(ji,jj)=0. 
    1362                   ! 
    1363                   IF(  pfu_ho(ji,jj) * ( pt_low(ji  ,jj) - pt_low(ji-1,jj) ) <= 0 .AND.  & 
    1364                      & pfv_ho(ji,jj) * ( pt_low(ji  ,jj) - pt_low(ji,jj-1) ) <= 0)  pfu_ho(ji,jj)=0. ; pfv_ho(ji,jj)=0. 
    1365                   ! 
    1366                ENDIF 
    1367             END DO 
    1368          END DO 
    1369          CALL lbc_lnk_multi( pfu_ho, 'U', -1., pfv_ho, 'V', -1. )   ! lateral boundary cond. 
     1476         DO jl = 1, jpl 
     1477            DO jj = 2, jpjm1 
     1478               DO ji = fs_2, fs_jpim1 
     1479                  IF ( pfu_ho(ji,jj,jl) * ( pt_low(ji+1,jj,jl) - pt_low(ji,jj,jl) ) <= 0. .AND.  & 
     1480                     & pfv_ho(ji,jj,jl) * ( pt_low(ji,jj+1,jl) - pt_low(ji,jj,jl) ) <= 0. ) THEN 
     1481                     ! 
     1482                     IF(  pfu_ho(ji,jj,jl) * ( zti_low(ji+1,jj,jl) - zti_low(ji,jj,jl) ) <= 0 .AND.  & 
     1483                        & pfv_ho(ji,jj,jl) * ( ztj_low(ji,jj+1,jl) - ztj_low(ji,jj,jl) ) <= 0)  pfu_ho(ji,jj,jl)=0. ; pfv_ho(ji,jj,jl)=0. 
     1484                     ! 
     1485                     IF(  pfu_ho(ji,jj,jl) * ( pt_low(ji  ,jj,jl) - pt_low(ji-1,jj,jl) ) <= 0 .AND.  & 
     1486                        & pfv_ho(ji,jj,jl) * ( pt_low(ji  ,jj,jl) - pt_low(ji,jj-1,jl) ) <= 0)  pfu_ho(ji,jj,jl)=0. ; pfv_ho(ji,jj,jl)=0. 
     1487                     ! 
     1488                  ENDIF 
     1489               END DO 
     1490            END DO 
     1491         END DO 
     1492         CALL lbc_lnk_multi( 'icedyn_adv_umx', pfu_ho, 'U', -1., pfv_ho, 'V', -1. )   ! lateral boundary cond. 
    13701493 
    13711494      ELSEIF( ll_prelimiter_devore ) THEN 
    1372          DO jj = 2, jpjm1 
    1373             DO ji = fs_2, fs_jpim1  
    1374                zti_low(ji,jj)= pt_low(ji+1,jj  ) 
    1375                ztj_low(ji,jj)= pt_low(ji  ,jj+1) 
    1376             END DO 
    1377          END DO 
    1378          CALL lbc_lnk_multi( zti_low, 'T', 1., ztj_low, 'T', 1. ) 
     1495         DO jl = 1, jpl 
     1496            DO jj = 2, jpjm1 
     1497               DO ji = fs_2, fs_jpim1  
     1498                  zti_low(ji,jj,jl)= pt_low(ji+1,jj  ,jl) 
     1499                  ztj_low(ji,jj,jl)= pt_low(ji  ,jj+1,jl) 
     1500               END DO 
     1501            END DO 
     1502         END DO 
     1503         CALL lbc_lnk_multi( 'icedyn_adv_umx', zti_low, 'T', 1., ztj_low, 'T', 1. ) 
    13791504 
    13801505         z1_dt = 1._wp / pdt 
    1381          DO jj = 2, jpjm1 
    1382             DO ji = fs_2, fs_jpim1 
    1383                zsign = SIGN( 1., pt_low(ji+1,jj) - pt_low(ji,jj) ) 
    1384                pfu_ho(ji,jj) =  zsign * MAX( 0. , MIN( ABS(pfu_ho(ji,jj)) , & 
    1385                   &                          zsign * ( pt_low (ji  ,jj) - pt_low (ji-1,jj) ) * e1e2t(ji  ,jj) * z1_dt , & 
    1386                   &                          zsign * ( zti_low(ji+1,jj) - zti_low(ji  ,jj) ) * e1e2t(ji+1,jj) * z1_dt ) ) 
    1387  
    1388                zsign = SIGN( 1., pt_low(ji,jj+1) - pt_low(ji,jj) ) 
    1389                pfv_ho(ji,jj) =  zsign * MAX( 0. , MIN( ABS(pfv_ho(ji,jj)) , & 
    1390                   &                          zsign * ( pt_low (ji,jj  ) - pt_low (ji,jj-1) ) * e1e2t(ji,jj  ) * z1_dt , & 
    1391                   &                          zsign * ( ztj_low(ji,jj+1) - ztj_low(ji,jj  ) ) * e1e2t(ji,jj+1) * z1_dt ) ) 
    1392             END DO 
    1393          END DO 
    1394          CALL lbc_lnk_multi( pfu_ho, 'U', -1., pfv_ho, 'V', -1. )   ! lateral boundary cond. 
    1395              
     1506         DO jl = 1, jpl 
     1507            DO jj = 2, jpjm1 
     1508               DO ji = fs_2, fs_jpim1 
     1509                  zsign = SIGN( 1., pt_low(ji+1,jj,jl) - pt_low(ji,jj,jl) ) 
     1510                  pfu_ho(ji,jj,jl) =  zsign * MAX( 0. , MIN( ABS(pfu_ho(ji,jj,jl)) , & 
     1511                     &                          zsign * ( pt_low (ji  ,jj,jl) - pt_low (ji-1,jj,jl) ) * e1e2t(ji  ,jj) * z1_dt , & 
     1512                     &                          zsign * ( zti_low(ji+1,jj,jl) - zti_low(ji  ,jj,jl) ) * e1e2t(ji+1,jj) * z1_dt ) ) 
     1513 
     1514                  zsign = SIGN( 1., pt_low(ji,jj+1,jl) - pt_low(ji,jj,jl) ) 
     1515                  pfv_ho(ji,jj,jl) =  zsign * MAX( 0. , MIN( ABS(pfv_ho(ji,jj,jl)) , & 
     1516                     &                          zsign * ( pt_low (ji,jj  ,jl) - pt_low (ji,jj-1,jl) ) * e1e2t(ji,jj  ) * z1_dt , & 
     1517                     &                          zsign * ( ztj_low(ji,jj+1,jl) - ztj_low(ji,jj  ,jl) ) * e1e2t(ji,jj+1) * z1_dt ) ) 
     1518               END DO 
     1519            END DO 
     1520         END DO 
     1521         CALL lbc_lnk_multi( 'icedyn_adv_umx', pfu_ho, 'U', -1., pfv_ho, 'V', -1. )   ! lateral boundary cond. 
     1522 
    13961523      ENDIF 
    1397           
    1398        
     1524 
     1525 
    13991526      ! Search local extrema 
    14001527      ! -------------------- 
    14011528      ! max/min of pt & pt_low with large negative/positive value (-/+zbig) outside ice cover 
    1402       DO jj = 1, jpj 
    1403          DO ji = 1, jpi 
    1404             IF    ( pt(ji,jj) <= 0._wp .AND. pt_low(ji,jj) <= 0._wp ) THEN 
    1405                zbup(ji,jj) = -zbig 
    1406                zbdo(ji,jj) =  zbig 
    1407             ELSEIF( pt(ji,jj) <= 0._wp .AND. pt_low(ji,jj) > 0._wp ) THEN 
    1408                zbup(ji,jj) = pt_low(ji,jj) 
    1409                zbdo(ji,jj) = pt_low(ji,jj) 
    1410             ELSEIF( pt(ji,jj) > 0._wp .AND. pt_low(ji,jj) <= 0._wp ) THEN 
    1411                zbup(ji,jj) = pt(ji,jj) 
    1412                zbdo(ji,jj) = pt(ji,jj) 
    1413             ELSE 
    1414                zbup(ji,jj) = MAX( pt(ji,jj) , pt_low(ji,jj) ) 
    1415                zbdo(ji,jj) = MIN( pt(ji,jj) , pt_low(ji,jj) ) 
    1416             ENDIF 
    1417          END DO 
    1418       END DO 
    1419  
    1420   
    14211529      z1_dt = 1._wp / pdt 
    1422       DO jj = 2, jpjm1 
    1423          DO ji = fs_2, fs_jpim1   ! vector opt. 
    1424             ! 
    1425             IF( .NOT. ll_9points ) THEN 
    1426             zup  = MAX( zbup(ji,jj), zbup(ji-1,jj  ), zbup(ji+1,jj  ), zbup(ji  ,jj-1), zbup(ji  ,jj+1) )  ! search max/min in neighbourhood 
    1427             zdo  = MIN( zbdo(ji,jj), zbdo(ji-1,jj  ), zbdo(ji+1,jj  ), zbdo(ji  ,jj-1), zbdo(ji  ,jj+1) ) 
    1428             ! 
    1429             ELSE 
    1430             zup  = MAX( zbup(ji,jj), zbup(ji-1,jj  ), zbup(ji+1,jj  ), zbup(ji  ,jj-1), zbup(ji  ,jj+1), &  ! search max/min in neighbourhood 
    1431                &                     zbup(ji-1,jj-1), zbup(ji+1,jj+1), zbup(ji+1,jj-1), zbup(ji-1,jj+1)  ) 
    1432             zdo  = MIN( zbdo(ji,jj), zbdo(ji-1,jj  ), zbdo(ji+1,jj  ), zbdo(ji  ,jj-1), zbdo(ji  ,jj+1), & 
    1433                &                     zbdo(ji-1,jj-1), zbdo(ji+1,jj+1), zbdo(ji+1,jj-1), zbdo(ji-1,jj+1)  ) 
    1434             ENDIF 
    1435             ! 
    1436             zpos = MAX( 0., pfu_ho(ji-1,jj) ) - MIN( 0., pfu_ho(ji  ,jj) ) &  ! positive/negative part of the flux 
    1437                & + MAX( 0., pfv_ho(ji,jj-1) ) - MIN( 0., pfv_ho(ji,jj  ) ) 
    1438             zneg = MAX( 0., pfu_ho(ji  ,jj) ) - MIN( 0., pfu_ho(ji-1,jj) ) & 
    1439                & + MAX( 0., pfv_ho(ji,jj  ) ) - MIN( 0., pfv_ho(ji,jj-1) ) 
    1440             ! 
    1441             IF( ll_HgradU .AND. .NOT.ll_gurvan ) THEN 
    1442                zneg2 = (   pt(ji,jj) * MAX( 0., pu(ji,jj) - pu(ji-1,jj) ) + pt(ji,jj) * MAX( 0., pv(ji,jj) - pv(ji,jj-1) ) & 
    1443                   &    ) * ( 1. - pamsk ) 
    1444                zpos2 = ( - pt(ji,jj) * MIN( 0., pu(ji,jj) - pu(ji-1,jj) ) - pt(ji,jj) * MIN( 0., pv(ji,jj) - pv(ji,jj-1) ) & 
    1445                   &    ) * ( 1. - pamsk ) 
    1446             ELSE 
    1447                zneg2 = 0. ; zpos2 = 0. 
    1448             ENDIF 
    1449             ! 
    1450             !                                  ! up & down beta terms 
    1451             IF( (zpos+zpos2) > 0. ) THEN ; zbetup(ji,jj) = MAX( 0._wp, zup - pt_low(ji,jj) ) / (zpos+zpos2) * e1e2t(ji,jj) * z1_dt 
    1452             ELSE                         ; zbetup(ji,jj) = 0. ! zbig 
    1453             ENDIF 
    1454             ! 
    1455             IF( (zneg+zneg2) > 0. ) THEN ; zbetdo(ji,jj) = MAX( 0._wp, pt_low(ji,jj) - zdo ) / (zneg+zneg2) * e1e2t(ji,jj) * z1_dt 
    1456             ELSE                         ; zbetdo(ji,jj) = 0. ! zbig 
    1457             ENDIF 
    1458             ! 
    1459             ! if all the points are outside ice cover 
    1460             IF( zup == -zbig )   zbetup(ji,jj) = 0. ! zbig 
    1461             IF( zdo ==  zbig )   zbetdo(ji,jj) = 0. ! zbig             
    1462             ! 
     1530      DO jl = 1, jpl 
     1531          
     1532         DO jj = 1, jpj 
     1533            DO ji = 1, jpi 
     1534               IF    ( pt(ji,jj,jl) <= 0._wp .AND. pt_low(ji,jj,jl) <= 0._wp ) THEN 
     1535                  zbup(ji,jj) = -zbig 
     1536                  zbdo(ji,jj) =  zbig 
     1537               ELSEIF( pt(ji,jj,jl) <= 0._wp .AND. pt_low(ji,jj,jl) > 0._wp ) THEN 
     1538                  zbup(ji,jj) = pt_low(ji,jj,jl) 
     1539                  zbdo(ji,jj) = pt_low(ji,jj,jl) 
     1540               ELSEIF( pt(ji,jj,jl) > 0._wp .AND. pt_low(ji,jj,jl) <= 0._wp ) THEN 
     1541                  zbup(ji,jj) = pt(ji,jj,jl) 
     1542                  zbdo(ji,jj) = pt(ji,jj,jl) 
     1543               ELSE 
     1544                  zbup(ji,jj) = MAX( pt(ji,jj,jl) , pt_low(ji,jj,jl) ) 
     1545                  zbdo(ji,jj) = MIN( pt(ji,jj,jl) , pt_low(ji,jj,jl) ) 
     1546               ENDIF 
     1547            END DO 
     1548         END DO 
     1549 
     1550         DO jj = 2, jpjm1 
     1551            DO ji = fs_2, fs_jpim1   ! vector opt. 
     1552               ! 
     1553               IF( .NOT. ll_9points ) THEN 
     1554                  zup  = MAX( zbup(ji,jj), zbup(ji-1,jj  ), zbup(ji+1,jj  ), zbup(ji  ,jj-1), zbup(ji  ,jj+1) )  ! search max/min in neighbourhood 
     1555                  zdo  = MIN( zbdo(ji,jj), zbdo(ji-1,jj  ), zbdo(ji+1,jj  ), zbdo(ji  ,jj-1), zbdo(ji  ,jj+1) ) 
     1556                  ! 
     1557               ELSE 
     1558                  zup  = MAX( zbup(ji,jj), zbup(ji-1,jj  ), zbup(ji+1,jj  ), zbup(ji  ,jj-1), zbup(ji  ,jj+1), &  ! search max/min in neighbourhood 
     1559                     &                     zbup(ji-1,jj-1), zbup(ji+1,jj+1), zbup(ji+1,jj-1), zbup(ji-1,jj+1)  ) 
     1560                  zdo  = MIN( zbdo(ji,jj), zbdo(ji-1,jj  ), zbdo(ji+1,jj  ), zbdo(ji  ,jj-1), zbdo(ji  ,jj+1), & 
     1561                     &                     zbdo(ji-1,jj-1), zbdo(ji+1,jj+1), zbdo(ji+1,jj-1), zbdo(ji-1,jj+1)  ) 
     1562               ENDIF 
     1563               ! 
     1564               zpos = MAX( 0., pfu_ho(ji-1,jj,jl) ) - MIN( 0., pfu_ho(ji  ,jj,jl) ) &  ! positive/negative part of the flux 
     1565                  & + MAX( 0., pfv_ho(ji,jj-1,jl) ) - MIN( 0., pfv_ho(ji,jj  ,jl) ) 
     1566               zneg = MAX( 0., pfu_ho(ji  ,jj,jl) ) - MIN( 0., pfu_ho(ji-1,jj,jl) ) & 
     1567                  & + MAX( 0., pfv_ho(ji,jj  ,jl) ) - MIN( 0., pfv_ho(ji,jj-1,jl) ) 
     1568               ! 
     1569               IF( ll_HgradU .AND. .NOT.ll_gurvan ) THEN 
     1570                  zneg2 = (   pt(ji,jj,jl) * MAX( 0., pu(ji,jj) - pu(ji-1,jj) ) + pt(ji,jj,jl) * MAX( 0., pv(ji,jj) - pv(ji,jj-1) ) & 
     1571                     &    ) * ( 1. - pamsk ) 
     1572                  zpos2 = ( - pt(ji,jj,jl) * MIN( 0., pu(ji,jj) - pu(ji-1,jj) ) - pt(ji,jj,jl) * MIN( 0., pv(ji,jj) - pv(ji,jj-1) ) & 
     1573                     &    ) * ( 1. - pamsk ) 
     1574               ELSE 
     1575                  zneg2 = 0. ; zpos2 = 0. 
     1576               ENDIF 
     1577               ! 
     1578               !                                  ! up & down beta terms 
     1579               IF( (zpos+zpos2) > 0. ) THEN ; zbetup(ji,jj,jl) = MAX( 0._wp, zup - pt_low(ji,jj,jl) ) / (zpos+zpos2) * e1e2t(ji,jj) * z1_dt 
     1580               ELSE                         ; zbetup(ji,jj,jl) = 0. ! zbig 
     1581               ENDIF 
     1582               ! 
     1583               IF( (zneg+zneg2) > 0. ) THEN ; zbetdo(ji,jj,jl) = MAX( 0._wp, pt_low(ji,jj,jl) - zdo ) / (zneg+zneg2) * e1e2t(ji,jj) * z1_dt 
     1584               ELSE                         ; zbetdo(ji,jj,jl) = 0. ! zbig 
     1585               ENDIF 
     1586               ! 
     1587               ! if all the points are outside ice cover 
     1588               IF( zup == -zbig )   zbetup(ji,jj,jl) = 0. ! zbig 
     1589               IF( zdo ==  zbig )   zbetdo(ji,jj,jl) = 0. ! zbig             
     1590               ! 
    14631591 
    14641592!!            IF( ji==26 .AND. jj==86) THEN 
     
    14891617!            ENDIF 
    14901618            ! 
     1619            END DO 
    14911620         END DO 
    14921621      END DO 
    1493       CALL lbc_lnk_multi( zbetup, 'T', 1., zbetdo, 'T', 1. )   ! lateral boundary cond. (unchanged sign) 
     1622      CALL lbc_lnk_multi( 'icedyn_adv_umx', zbetup, 'T', 1., zbetdo, 'T', 1. )   ! lateral boundary cond. (unchanged sign) 
    14941623 
    14951624       
    14961625      ! monotonic flux in the y direction 
    14971626      ! --------------------------------- 
    1498       DO jj = 1, jpjm1 
    1499          DO ji = 1, fs_jpim1   ! vector opt. 
    1500             zau = MIN( 1._wp , zbetdo(ji,jj) , zbetup(ji+1,jj) ) 
    1501             zbu = MIN( 1._wp , zbetup(ji,jj) , zbetdo(ji+1,jj) ) 
    1502             zcu = 0.5  + SIGN( 0.5 , pfu_ho(ji,jj) ) 
    1503             ! 
    1504             zcoef = ( zcu * zau + ( 1._wp - zcu ) * zbu ) 
    1505              
    1506             pfu_ho(ji,jj) = pfu_ho(ji,jj) * zcoef + pfu_low(ji,jj) 
     1627      DO jl = 1, jpl 
     1628         DO jj = 1, jpjm1 
     1629            DO ji = 1, fs_jpim1   ! vector opt. 
     1630               zau = MIN( 1._wp , zbetdo(ji,jj,jl) , zbetup(ji+1,jj,jl) ) 
     1631               zbu = MIN( 1._wp , zbetup(ji,jj,jl) , zbetdo(ji+1,jj,jl) ) 
     1632               zcu = 0.5  + SIGN( 0.5 , pfu_ho(ji,jj,jl) ) 
     1633               ! 
     1634               zcoef = ( zcu * zau + ( 1._wp - zcu ) * zbu ) 
     1635 
     1636               pfu_ho(ji,jj,jl) = pfu_ho(ji,jj,jl) * zcoef + pfu_low(ji,jj,jl) 
    15071637 
    15081638!!            IF( ji==26 .AND. jj==86) THEN 
    15091639!!               WRITE(numout,*) 'coefU',zcoef 
    1510 !!               WRITE(numout,*) 'pfu_ho',(pfu_ho(ji,jj)) * r1_e1e2t(ji,jj) * pdt 
    1511 !!               WRITE(numout,*) 'pfu_hom1',(pfu_ho(ji-1,jj)) * r1_e1e2t(ji,jj) * pdt 
     1640!!               WRITE(numout,*) 'pfu_ho',(pfu_ho(ji,jj,jl)) * r1_e1e2t(ji,jj) * pdt 
     1641!!               WRITE(numout,*) 'pfu_hom1',(pfu_ho(ji-1,jj,jl)) * r1_e1e2t(ji,jj) * pdt 
    15121642!!            ENDIF 
    15131643 
    1514          END DO 
    1515       END DO 
    1516  
    1517       DO jj = 1, jpjm1 
    1518          DO ji = 1, fs_jpim1   ! vector opt. 
    1519             zav = MIN( 1._wp , zbetdo(ji,jj) , zbetup(ji,jj+1) ) 
    1520             zbv = MIN( 1._wp , zbetup(ji,jj) , zbetdo(ji,jj+1) ) 
    1521             zcv = 0.5  + SIGN( 0.5 , pfv_ho(ji,jj) ) 
    1522             ! 
    1523             zcoef = ( zcv * zav + ( 1._wp - zcv ) * zbv ) 
    1524              
    1525             pfv_ho(ji,jj) = pfv_ho(ji,jj) * zcoef + pfv_low(ji,jj) 
     1644            END DO 
     1645         END DO 
     1646 
     1647         DO jj = 1, jpjm1 
     1648            DO ji = 1, fs_jpim1   ! vector opt. 
     1649               zav = MIN( 1._wp , zbetdo(ji,jj,jl) , zbetup(ji,jj+1,jl) ) 
     1650               zbv = MIN( 1._wp , zbetup(ji,jj,jl) , zbetdo(ji,jj+1,jl) ) 
     1651               zcv = 0.5  + SIGN( 0.5 , pfv_ho(ji,jj,jl) ) 
     1652               ! 
     1653               zcoef = ( zcv * zav + ( 1._wp - zcv ) * zbv ) 
     1654 
     1655               pfv_ho(ji,jj,jl) = pfv_ho(ji,jj,jl) * zcoef + pfv_low(ji,jj,jl) 
    15261656 
    15271657!!            IF( ji==26 .AND. jj==86) THEN 
    15281658!!               WRITE(numout,*) 'coefV',zcoef 
    1529 !!               WRITE(numout,*) 'pfv_ho',(pfv_ho(ji,jj)) * r1_e1e2t(ji,jj) * pdt 
    1530 !!               WRITE(numout,*) 'pfv_hom1',(pfv_ho(ji,jj-1)) * r1_e1e2t(ji,jj) * pdt 
     1659!!               WRITE(numout,*) 'pfv_ho',(pfv_ho(ji,jj,jl)) * r1_e1e2t(ji,jj) * pdt 
     1660!!               WRITE(numout,*) 'pfv_hom1',(pfv_ho(ji,jj-1,jl)) * r1_e1e2t(ji,jj) * pdt 
    15311661!!            ENDIF 
    1532          END DO 
     1662            END DO 
     1663         END DO 
     1664 
     1665         ! clem test 
     1666         DO jj = 2, jpjm1 
     1667            DO ji = 2, fs_jpim1   ! vector opt. 
     1668               IF( ll_gurvan ) THEN 
     1669                  zzt(ji,jj,jl) = ( pt(ji,jj,jl) - ( pfu_ho(ji,jj,jl) - pfu_ho(ji-1,jj,jl) ) * pdt * r1_e1e2t(ji,jj)  & 
     1670                     &                           - ( pfv_ho(ji,jj,jl) - pfv_ho(ji,jj-1,jl) ) * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 
     1671               ELSE 
     1672                  zzt(ji,jj,jl) = ( pt(ji,jj,jl) - ( pfu_ho(ji,jj,jl) - pfu_ho(ji-1,jj,jl) ) * pdt * r1_e1e2t(ji,jj)  & 
     1673                     &                           - ( pfv_ho(ji,jj,jl) - pfv_ho(ji,jj-1,jl) ) * pdt * r1_e1e2t(ji,jj)  & 
     1674                     &                     + pt(ji,jj,jl) * pdt * ( pu(ji,jj) - pu(ji-1,jj) ) * r1_e1e2t(ji,jj) * (1.-pamsk) & 
     1675                     &                     + pt(ji,jj,jl) * pdt * ( pv(ji,jj) - pv(ji,jj-1) ) * r1_e1e2t(ji,jj) * (1.-pamsk) & 
     1676                     &         ) * tmask(ji,jj,1) 
     1677               ENDIF 
     1678               IF( zzt(ji,jj,jl) < -epsi20 ) THEN 
     1679                  WRITE(numout,*) 'T<0 nonosc',zzt(ji,jj,jl) 
     1680               ENDIF 
     1681            END DO 
     1682         END DO 
     1683 
    15331684      END DO 
    15341685 
    1535       ! clem test 
    1536       DO jj = 2, jpjm1 
    1537          DO ji = 2, fs_jpim1   ! vector opt. 
    1538             IF( ll_gurvan ) THEN 
    1539                zzt(ji,jj) = ( pt(ji,jj) - ( pfu_ho(ji,jj) - pfu_ho(ji-1,jj) ) * pdt * r1_e1e2t(ji,jj)  & 
    1540                   &                     - ( pfv_ho(ji,jj) - pfv_ho(ji,jj-1) ) * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 
    1541             ELSE 
    1542                zzt(ji,jj) = ( pt(ji,jj) - ( pfu_ho(ji,jj) - pfu_ho(ji-1,jj) ) * pdt * r1_e1e2t(ji,jj)  & 
    1543                   &                     - ( pfv_ho(ji,jj) - pfv_ho(ji,jj-1) ) * pdt * r1_e1e2t(ji,jj)  & 
    1544                   &                     + pt(ji,jj) * pdt * ( pu(ji,jj) - pu(ji-1,jj) ) * r1_e1e2t(ji,jj) * (1.-pamsk) & 
    1545                   &                     + pt(ji,jj) * pdt * ( pv(ji,jj) - pv(ji,jj-1) ) * r1_e1e2t(ji,jj) * (1.-pamsk) & 
    1546                   &         ) * tmask(ji,jj,1) 
    1547             ENDIF 
    1548             IF( zzt(ji,jj) < -epsi20 ) THEN 
    1549                WRITE(numout,*) 'T<0 nonosc',zzt(ji,jj) 
    1550             ENDIF 
    1551          END DO 
    1552       END DO 
    1553        
    15541686      ! 
    15551687      ! 
     
    15621694      !! **  Purpose :   compute flux limiter  
    15631695      !!---------------------------------------------------------------------- 
    1564       REAL(wp)                     , INTENT(in   )           ::   pdt          ! tracer time-step 
    1565       REAL(wp), DIMENSION (jpi,jpj), INTENT(in   )           ::   pu           ! ice i-velocity => u*e2 
    1566       REAL(wp), DIMENSION (jpi,jpj), INTENT(in   )           ::   puc          ! ice i-velocity *A => u*e2*a 
    1567       REAL(wp), DIMENSION (jpi,jpj), INTENT(in   )           ::   pt           ! ice tracer 
    1568       REAL(wp), DIMENSION (jpi,jpj), INTENT(inout)           ::   pfu_ho       ! high order flux 
    1569       REAL(wp), DIMENSION (jpi,jpj), INTENT(in   ), OPTIONAL ::   pfu_ups      ! upstream flux 
     1696      REAL(wp)                   , INTENT(in   )           ::   pdt          ! tracer time-step 
     1697      REAL(wp), DIMENSION (:,:  ), INTENT(in   )           ::   pu           ! ice i-velocity => u*e2 
     1698      REAL(wp), DIMENSION (:,:,:), INTENT(in   )           ::   puc          ! ice i-velocity *A => u*e2*a 
     1699      REAL(wp), DIMENSION (:,:,:), INTENT(in   )           ::   pt           ! ice tracer 
     1700      REAL(wp), DIMENSION (:,:,:), INTENT(inout)           ::   pfu_ho       ! high order flux 
     1701      REAL(wp), DIMENSION (:,:,:), INTENT(in   ), OPTIONAL ::   pfu_ups      ! upstream flux 
    15701702      ! 
    15711703      REAL(wp) ::   Cr, Rjm, Rj, Rjp, uCFL, zpsi, zh3, zlimiter, Rr 
    1572       INTEGER  ::   ji, jj    ! dummy loop indices 
    1573       REAL(wp), DIMENSION (jpi,jpj) ::   zslpx       ! tracer slopes  
    1574       !!---------------------------------------------------------------------- 
    1575       ! 
    1576       DO jj = 2, jpjm1 
    1577          DO ji = fs_2, fs_jpim1   ! vector opt. 
    1578             zslpx(ji,jj) = ( pt(ji+1,jj) - pt(ji,jj) ) * umask(ji,jj,1) 
     1704      INTEGER  ::   ji, jj, jl    ! dummy loop indices 
     1705      REAL(wp), DIMENSION (jpi,jpj,jpl) ::   zslpx       ! tracer slopes  
     1706      !!---------------------------------------------------------------------- 
     1707      ! 
     1708      DO jl = 1, jpl 
     1709         DO jj = 2, jpjm1 
     1710            DO ji = fs_2, fs_jpim1   ! vector opt. 
     1711               zslpx(ji,jj,jl) = ( pt(ji+1,jj,jl) - pt(ji,jj,jl) ) * umask(ji,jj,1) 
     1712            END DO 
    15791713         END DO 
    15801714      END DO 
    1581       CALL lbc_lnk( zslpx, 'U', -1.)   ! lateral boundary cond. 
     1715      CALL lbc_lnk( 'icedyn_adv_umx', zslpx, 'U', -1.)   ! lateral boundary cond. 
    15821716       
    1583       DO jj = 2, jpjm1 
    1584          DO ji = fs_2, fs_jpim1   ! vector opt. 
    1585             uCFL = pdt * ABS( pu(ji,jj) ) * r1_e1e2t(ji,jj) 
    1586  
    1587             Rjm = zslpx(ji-1,jj) 
    1588             Rj  = zslpx(ji  ,jj) 
    1589             Rjp = zslpx(ji+1,jj) 
    1590  
    1591             IF( PRESENT(pfu_ups) ) THEN 
    1592  
    1593                IF( pu(ji,jj) > 0. ) THEN   ;   Rr = Rjm 
    1594                ELSE                        ;   Rr = Rjp 
     1717      DO jl = 1, jpl 
     1718         DO jj = 2, jpjm1 
     1719            DO ji = fs_2, fs_jpim1   ! vector opt. 
     1720               uCFL = pdt * ABS( pu(ji,jj) ) * r1_e1e2t(ji,jj) 
     1721                
     1722               Rjm = zslpx(ji-1,jj,jl) 
     1723               Rj  = zslpx(ji  ,jj,jl) 
     1724               Rjp = zslpx(ji+1,jj,jl) 
     1725 
     1726               IF( PRESENT(pfu_ups) ) THEN 
     1727 
     1728                  IF( pu(ji,jj) > 0. ) THEN   ;   Rr = Rjm 
     1729                  ELSE                        ;   Rr = Rjp 
     1730                  ENDIF 
     1731 
     1732                  zh3 = pfu_ho(ji,jj,jl) - pfu_ups(ji,jj,jl)      
     1733                  IF( Rj > 0. ) THEN 
     1734                     zlimiter =  MAX( 0., MIN( zh3, MAX(-Rr * 0.5 * ABS(pu(ji,jj)),  & 
     1735                        &        MIN( 2. * Rr * 0.5 * ABS(pu(ji,jj)),  zh3,  1.5 * Rj * 0.5 * ABS(pu(ji,jj)) ) ) ) ) 
     1736                  ELSE 
     1737                     zlimiter = -MAX( 0., MIN(-zh3, MAX( Rr * 0.5 * ABS(pu(ji,jj)),  & 
     1738                        &        MIN(-2. * Rr * 0.5 * ABS(pu(ji,jj)), -zh3, -1.5 * Rj * 0.5 * ABS(pu(ji,jj)) ) ) ) ) 
     1739                  ENDIF 
     1740                  pfu_ho(ji,jj,jl) = pfu_ups(ji,jj,jl) + zlimiter 
     1741 
     1742               ELSE 
     1743                  IF( Rj /= 0. ) THEN 
     1744                     IF( pu(ji,jj) > 0. ) THEN   ;   Cr = Rjm / Rj 
     1745                     ELSE                        ;   Cr = Rjp / Rj 
     1746                     ENDIF 
     1747                  ELSE 
     1748                     Cr = 0. 
     1749                     !IF( pu(ji,jj) > 0. ) THEN   ;   Cr = Rjm * 1.e20 
     1750                     !ELSE                        ;   Cr = Rjp * 1.e20 
     1751                     !ENDIF 
     1752                  ENDIF 
     1753 
     1754                  ! -- superbee -- 
     1755                  zpsi = MAX( 0., MAX( MIN(1.,2.*Cr), MIN(2.,Cr) ) ) 
     1756                  ! -- van albada 2 -- 
     1757                  !!zpsi = 2.*Cr / (Cr*Cr+1.) 
     1758 
     1759                  ! -- sweby (with beta=1) -- 
     1760                  !!zpsi = MAX( 0., MAX( MIN(1.,1.*Cr), MIN(1.,Cr) ) ) 
     1761                  ! -- van Leer -- 
     1762                  !!zpsi = ( Cr + ABS(Cr) ) / ( 1. + ABS(Cr) ) 
     1763                  ! -- ospre -- 
     1764                  !!zpsi = 1.5 * ( Cr*Cr + Cr ) / ( Cr*Cr + Cr + 1. ) 
     1765                  ! -- koren -- 
     1766                  !!zpsi = MAX( 0., MIN( 2.*Cr, MIN( (1.+2*Cr)/3., 2. ) ) ) 
     1767                  ! -- charm -- 
     1768                  !IF( Cr > 0. ) THEN   ;   zpsi = Cr * (3.*Cr + 1.) / ( (Cr + 1.) * (Cr + 1.) ) 
     1769                  !ELSE                 ;   zpsi = 0. 
     1770                  !ENDIF 
     1771                  ! -- van albada 1 -- 
     1772                  !!zpsi = (Cr*Cr + Cr) / (Cr*Cr +1) 
     1773                  ! -- smart -- 
     1774                  !!zpsi = MAX( 0., MIN( 2.*Cr, MIN( 0.25+0.75*Cr, 4. ) ) ) 
     1775                  ! -- umist -- 
     1776                  !!zpsi = MAX( 0., MIN( 2.*Cr, MIN( 0.25+0.75*Cr, MIN(0.75+0.25*Cr, 2. ) ) ) ) 
     1777 
     1778                  ! high order flux corrected by the limiter 
     1779                  pfu_ho(ji,jj,jl) = pfu_ho(ji,jj,jl) - ABS( pu(ji,jj) ) * ( (1.-zpsi) + uCFL*zpsi ) * Rj * 0.5 
     1780 
    15951781               ENDIF 
    1596  
    1597                zh3 = pfu_ho(ji,jj) - pfu_ups(ji,jj)      
    1598                IF( Rj > 0. ) THEN 
    1599                   zlimiter =  MAX( 0., MIN( zh3, MAX(-Rr * 0.5 * ABS(puc(ji,jj)),  & 
    1600                      &        MIN( 2. * Rr * 0.5 * ABS(puc(ji,jj)),  zh3,  1.5 * Rj * 0.5 * ABS(puc(ji,jj)) ) ) ) ) 
    1601                ELSE 
    1602                   zlimiter = -MAX( 0., MIN(-zh3, MAX( Rr * 0.5 * ABS(puc(ji,jj)),  & 
    1603                      &        MIN(-2. * Rr * 0.5 * ABS(puc(ji,jj)), -zh3, -1.5 * Rj * 0.5 * ABS(puc(ji,jj)) ) ) ) ) 
    1604                ENDIF 
    1605                pfu_ho(ji,jj) = pfu_ups(ji,jj) + zlimiter 
    1606                 
    1607             ELSE 
    1608                IF( Rj /= 0. ) THEN 
    1609                   IF( pu(ji,jj) > 0. ) THEN   ;   Cr = Rjm / Rj 
    1610                   ELSE                        ;   Cr = Rjp / Rj 
    1611                   ENDIF 
    1612                ELSE 
    1613                   Cr = 0. 
    1614                   !IF( pu(ji,jj) > 0. ) THEN   ;   Cr = Rjm * 1.e20 
    1615                   !ELSE                        ;   Cr = Rjp * 1.e20 
    1616                   !ENDIF 
    1617                ENDIF 
    1618                 
    1619                ! -- superbee -- 
    1620                zpsi = MAX( 0., MAX( MIN(1.,2.*Cr), MIN(2.,Cr) ) ) 
    1621                ! -- van albada 2 -- 
    1622                !!zpsi = 2.*Cr / (Cr*Cr+1.) 
    1623  
    1624                ! -- sweby (with beta=1) -- 
    1625                !!zpsi = MAX( 0., MAX( MIN(1.,1.*Cr), MIN(1.,Cr) ) ) 
    1626                ! -- van Leer -- 
    1627                !!zpsi = ( Cr + ABS(Cr) ) / ( 1. + ABS(Cr) ) 
    1628                ! -- ospre -- 
    1629                !!zpsi = 1.5 * ( Cr*Cr + Cr ) / ( Cr*Cr + Cr + 1. ) 
    1630                ! -- koren -- 
    1631                !!zpsi = MAX( 0., MIN( 2.*Cr, MIN( (1.+2*Cr)/3., 2. ) ) ) 
    1632                ! -- charm -- 
    1633                !IF( Cr > 0. ) THEN   ;   zpsi = Cr * (3.*Cr + 1.) / ( (Cr + 1.) * (Cr + 1.) ) 
    1634                !ELSE                 ;   zpsi = 0. 
    1635                !ENDIF 
    1636                ! -- van albada 1 -- 
    1637                !!zpsi = (Cr*Cr + Cr) / (Cr*Cr +1) 
    1638                ! -- smart -- 
    1639                !!zpsi = MAX( 0., MIN( 2.*Cr, MIN( 0.25+0.75*Cr, 4. ) ) ) 
    1640                ! -- umist -- 
    1641                !!zpsi = MAX( 0., MIN( 2.*Cr, MIN( 0.25+0.75*Cr, MIN(0.75+0.25*Cr, 2. ) ) ) ) 
    1642  
    1643                ! high order flux corrected by the limiter 
    1644                pfu_ho(ji,jj) = pfu_ho(ji,jj) - ABS( puc(ji,jj) ) * ( (1.-zpsi) + uCFL*zpsi ) * Rj * 0.5 
    1645  
    1646             ENDIF 
     1782            END DO 
    16471783         END DO 
    16481784      END DO 
    1649       CALL lbc_lnk( pfu_ho, 'U', -1.)   ! lateral boundary cond. 
     1785      CALL lbc_lnk( 'icedyn_adv_umx', pfu_ho, 'U', -1.)   ! lateral boundary cond. 
    16501786      ! 
    16511787   END SUBROUTINE limiter_x 
     
    16571793      !! **  Purpose :   compute flux limiter  
    16581794      !!---------------------------------------------------------------------- 
    1659       REAL(wp)                     , INTENT(in   )           ::   pdt          ! tracer time-step 
    1660       REAL(wp), DIMENSION (jpi,jpj), INTENT(in   )           ::   pv           ! ice i-velocity => u*e2 
    1661       REAL(wp), DIMENSION (jpi,jpj), INTENT(in   )           ::   pvc          ! ice i-velocity *A => u*e2*a 
    1662       REAL(wp), DIMENSION (jpi,jpj), INTENT(in   )           ::   pt           ! ice tracer 
    1663       REAL(wp), DIMENSION (jpi,jpj), INTENT(inout)           ::   pfv_ho       ! high order flux 
    1664       REAL(wp), DIMENSION (jpi,jpj), INTENT(in   ), OPTIONAL ::   pfv_ups      ! upstream flux 
     1795      REAL(wp)                   , INTENT(in   )           ::   pdt          ! tracer time-step 
     1796      REAL(wp), DIMENSION (:,:  ), INTENT(in   )           ::   pv           ! ice i-velocity => u*e2 
     1797      REAL(wp), DIMENSION (:,:,:), INTENT(in   )           ::   pvc          ! ice i-velocity *A => u*e2*a 
     1798      REAL(wp), DIMENSION (:,:,:), INTENT(in   )           ::   pt           ! ice tracer 
     1799      REAL(wp), DIMENSION (:,:,:), INTENT(inout)           ::   pfv_ho       ! high order flux 
     1800      REAL(wp), DIMENSION (:,:,:), INTENT(in   ), OPTIONAL ::   pfv_ups      ! upstream flux 
    16651801      ! 
    16661802      REAL(wp) ::   Cr, Rjm, Rj, Rjp, vCFL, zpsi, zh3, zlimiter, Rr 
    1667       INTEGER  ::   ji, jj    ! dummy loop indices 
    1668       REAL(wp), DIMENSION (jpi,jpj) ::   zslpy       ! tracer slopes  
    1669       !!---------------------------------------------------------------------- 
    1670       ! 
    1671       DO jj = 2, jpjm1 
    1672          DO ji = fs_2, fs_jpim1   ! vector opt. 
    1673             zslpy(ji,jj) = ( pt(ji,jj+1) - pt(ji,jj) ) * vmask(ji,jj,1) 
     1803      INTEGER  ::   ji, jj, jl    ! dummy loop indices 
     1804      REAL(wp), DIMENSION (jpi,jpj,jpl) ::   zslpy       ! tracer slopes  
     1805      !!---------------------------------------------------------------------- 
     1806      ! 
     1807      DO jl = 1, jpl 
     1808         DO jj = 2, jpjm1 
     1809            DO ji = fs_2, fs_jpim1   ! vector opt. 
     1810               zslpy(ji,jj,jl) = ( pt(ji,jj+1,jl) - pt(ji,jj,jl) ) * vmask(ji,jj,1) 
     1811            END DO 
    16741812         END DO 
    16751813      END DO 
    1676       CALL lbc_lnk( zslpy, 'V', -1.)   ! lateral boundary cond. 
    1677        
    1678       DO jj = 2, jpjm1 
    1679          DO ji = fs_2, fs_jpim1   ! vector opt. 
    1680             vCFL = pdt * ABS( pv(ji,jj) ) * r1_e1e2t(ji,jj) 
    1681  
    1682             Rjm = zslpy(ji,jj-1) 
    1683             Rj  = zslpy(ji,jj  ) 
    1684             Rjp = zslpy(ji,jj+1) 
    1685  
    1686             IF( PRESENT(pfv_ups) ) THEN 
    1687  
    1688                IF( pv(ji,jj) > 0. ) THEN   ;   Rr = Rjm 
    1689                ELSE                        ;   Rr = Rjp 
     1814      CALL lbc_lnk( 'icedyn_adv_umx', zslpy, 'V', -1.)   ! lateral boundary cond. 
     1815 
     1816      DO jl = 1, jpl 
     1817         DO jj = 2, jpjm1 
     1818            DO ji = fs_2, fs_jpim1   ! vector opt. 
     1819               vCFL = pdt * ABS( pv(ji,jj) ) * r1_e1e2t(ji,jj) 
     1820 
     1821               Rjm = zslpy(ji,jj-1,jl) 
     1822               Rj  = zslpy(ji,jj  ,jl) 
     1823               Rjp = zslpy(ji,jj+1,jl) 
     1824 
     1825               IF( PRESENT(pfv_ups) ) THEN 
     1826 
     1827                  IF( pv(ji,jj) > 0. ) THEN   ;   Rr = Rjm 
     1828                  ELSE                        ;   Rr = Rjp 
     1829                  ENDIF 
     1830 
     1831                  zh3 = pfv_ho(ji,jj,jl) - pfv_ups(ji,jj,jl)      
     1832                  IF( Rj > 0. ) THEN 
     1833                     zlimiter =  MAX( 0., MIN( zh3, MAX(-Rr * 0.5 * ABS(pv(ji,jj)),  & 
     1834                        &        MIN( 2. * Rr * 0.5 * ABS(pv(ji,jj)),  zh3,  1.5 * Rj * 0.5 * ABS(pv(ji,jj)) ) ) ) ) 
     1835                  ELSE 
     1836                     zlimiter = -MAX( 0., MIN(-zh3, MAX( Rr * 0.5 * ABS(pv(ji,jj)),  & 
     1837                        &        MIN(-2. * Rr * 0.5 * ABS(pv(ji,jj)), -zh3, -1.5 * Rj * 0.5 * ABS(pv(ji,jj)) ) ) ) ) 
     1838                  ENDIF 
     1839                  pfv_ho(ji,jj,jl) = pfv_ups(ji,jj,jl) + zlimiter 
     1840 
     1841               ELSE 
     1842 
     1843                  IF( Rj /= 0. ) THEN 
     1844                     IF( pv(ji,jj) > 0. ) THEN   ;   Cr = Rjm / Rj 
     1845                     ELSE                        ;   Cr = Rjp / Rj 
     1846                     ENDIF 
     1847                  ELSE 
     1848                     Cr = 0. 
     1849                     !IF( pv(ji,jj) > 0. ) THEN   ;   Cr = Rjm * 1.e20 
     1850                     !ELSE                        ;   Cr = Rjp * 1.e20 
     1851                     !ENDIF 
     1852                  ENDIF 
     1853 
     1854                  ! -- superbee -- 
     1855                  zpsi = MAX( 0., MAX( MIN(1.,2.*Cr), MIN(2.,Cr) ) ) 
     1856                  ! -- van albada 2 -- 
     1857                  !!zpsi = 2.*Cr / (Cr*Cr+1.) 
     1858 
     1859                  ! -- sweby (with beta=1) -- 
     1860                  !!zpsi = MAX( 0., MAX( MIN(1.,1.*Cr), MIN(1.,Cr) ) ) 
     1861                  ! -- van Leer -- 
     1862                  !!zpsi = ( Cr + ABS(Cr) ) / ( 1. + ABS(Cr) ) 
     1863                  ! -- ospre -- 
     1864                  !!zpsi = 1.5 * ( Cr*Cr + Cr ) / ( Cr*Cr + Cr + 1. ) 
     1865                  ! -- koren -- 
     1866                  !!zpsi = MAX( 0., MIN( 2.*Cr, MIN( (1.+2*Cr)/3., 2. ) ) ) 
     1867                  ! -- charm -- 
     1868                  !IF( Cr > 0. ) THEN   ;   zpsi = Cr * (3.*Cr + 1.) / ( (Cr + 1.) * (Cr + 1.) ) 
     1869                  !ELSE                 ;   zpsi = 0. 
     1870                  !ENDIF 
     1871                  ! -- van albada 1 -- 
     1872                  !!zpsi = (Cr*Cr + Cr) / (Cr*Cr +1) 
     1873                  ! -- smart -- 
     1874                  !!zpsi = MAX( 0., MIN( 2.*Cr, MIN( 0.25+0.75*Cr, 4. ) ) ) 
     1875                  ! -- umist -- 
     1876                  !!zpsi = MAX( 0., MIN( 2.*Cr, MIN( 0.25+0.75*Cr, MIN(0.75+0.25*Cr, 2. ) ) ) ) 
     1877 
     1878                  ! high order flux corrected by the limiter 
     1879                  pfv_ho(ji,jj,jl) = pfv_ho(ji,jj,jl) - ABS( pv(ji,jj) ) * ( (1.-zpsi) + vCFL*zpsi ) * Rj * 0.5 
     1880 
    16901881               ENDIF 
    1691  
    1692                zh3 = pfv_ho(ji,jj) - pfv_ups(ji,jj)      
    1693                IF( Rj > 0. ) THEN 
    1694                   zlimiter =  MAX( 0., MIN( zh3, MAX(-Rr * 0.5 * ABS(pvc(ji,jj)),  & 
    1695                      &        MIN( 2. * Rr * 0.5 * ABS(pvc(ji,jj)),  zh3,  1.5 * Rj * 0.5 * ABS(pvc(ji,jj)) ) ) ) ) 
    1696                ELSE 
    1697                   zlimiter = -MAX( 0., MIN(-zh3, MAX( Rr * 0.5 * ABS(pvc(ji,jj)),  & 
    1698                      &        MIN(-2. * Rr * 0.5 * ABS(pvc(ji,jj)), -zh3, -1.5 * Rj * 0.5 * ABS(pvc(ji,jj)) ) ) ) ) 
    1699                ENDIF 
    1700                pfv_ho(ji,jj) = pfv_ups(ji,jj) + zlimiter 
    1701  
    1702             ELSE 
    1703  
    1704                IF( Rj /= 0. ) THEN 
    1705                   IF( pv(ji,jj) > 0. ) THEN   ;   Cr = Rjm / Rj 
    1706                   ELSE                        ;   Cr = Rjp / Rj 
    1707                   ENDIF 
    1708                ELSE 
    1709                   Cr = 0. 
    1710                   !IF( pv(ji,jj) > 0. ) THEN   ;   Cr = Rjm * 1.e20 
    1711                   !ELSE                        ;   Cr = Rjp * 1.e20 
    1712                   !ENDIF 
    1713                ENDIF 
    1714  
    1715                ! -- superbee -- 
    1716                zpsi = MAX( 0., MAX( MIN(1.,2.*Cr), MIN(2.,Cr) ) ) 
    1717                ! -- van albada 2 -- 
    1718                !!zpsi = 2.*Cr / (Cr*Cr+1.) 
    1719  
    1720                ! -- sweby (with beta=1) -- 
    1721                !!zpsi = MAX( 0., MAX( MIN(1.,1.*Cr), MIN(1.,Cr) ) ) 
    1722                ! -- van Leer -- 
    1723                !!zpsi = ( Cr + ABS(Cr) ) / ( 1. + ABS(Cr) ) 
    1724                ! -- ospre -- 
    1725                !!zpsi = 1.5 * ( Cr*Cr + Cr ) / ( Cr*Cr + Cr + 1. ) 
    1726                ! -- koren -- 
    1727                !!zpsi = MAX( 0., MIN( 2.*Cr, MIN( (1.+2*Cr)/3., 2. ) ) ) 
    1728                ! -- charm -- 
    1729                !IF( Cr > 0. ) THEN   ;   zpsi = Cr * (3.*Cr + 1.) / ( (Cr + 1.) * (Cr + 1.) ) 
    1730                !ELSE                 ;   zpsi = 0. 
    1731                !ENDIF 
    1732                ! -- van albada 1 -- 
    1733                !!zpsi = (Cr*Cr + Cr) / (Cr*Cr +1) 
    1734                ! -- smart -- 
    1735                !!zpsi = MAX( 0., MIN( 2.*Cr, MIN( 0.25+0.75*Cr, 4. ) ) ) 
    1736                ! -- umist -- 
    1737                !!zpsi = MAX( 0., MIN( 2.*Cr, MIN( 0.25+0.75*Cr, MIN(0.75+0.25*Cr, 2. ) ) ) ) 
    1738  
    1739                ! high order flux corrected by the limiter 
    1740                pfv_ho(ji,jj) = pfv_ho(ji,jj) - ABS( pvc(ji,jj) ) * ( (1.-zpsi) + vCFL*zpsi ) * Rj * 0.5 
    1741  
    1742             ENDIF 
     1882            END DO 
    17431883         END DO 
    17441884      END DO 
    1745       CALL lbc_lnk( pfv_ho, 'V', -1.)   ! lateral boundary cond. 
     1885      CALL lbc_lnk( 'icedyn_adv_umx', pfv_ho, 'V', -1.)   ! lateral boundary cond. 
    17461886      ! 
    17471887   END SUBROUTINE limiter_y 
  • NEMO/trunk/src/ICE/icedyn_rdgrft.F90

    r10413 r10425  
    9191         &      ze_i_2d(jpij,nlay_i,jpl), ze_s_2d(jpij,nlay_s,jpl), STAT=ice_dyn_rdgrft_alloc ) 
    9292 
    93       IF( lk_mpp                    )   CALL mpp_sum ( ice_dyn_rdgrft_alloc ) 
    94       IF( ice_dyn_rdgrft_alloc /= 0 )   CALL ctl_warn( 'ice_dyn_rdgrft_alloc: failed to allocate arrays' ) 
     93      CALL mpp_sum ( 'icedyn_rdgrft', ice_dyn_rdgrft_alloc ) 
     94      IF( ice_dyn_rdgrft_alloc /= 0 )   CALL ctl_stop( 'STOP',  'ice_dyn_rdgrft_alloc: failed to allocate arrays' ) 
    9595      ! 
    9696   END FUNCTION ice_dyn_rdgrft_alloc 
     
    269269            ! 
    270270            iter = iter + 1 
    271             IF( iter  >  jp_itermax )    CALL ctl_warn( 'icedyn_rdgrft: non-converging ridging scheme' ) 
     271            IF( iter  >  jp_itermax )    CALL ctl_stop( 'STOP',  'icedyn_rdgrft: non-converging ridging scheme' ) 
    272272            ! 
    273273         END DO 
     
    793793            END DO 
    794794         END DO 
    795          CALL lbc_lnk( strength, 'T', 1. ) 
     795         CALL lbc_lnk( 'icedyn_rdgrft', strength, 'T', 1. ) 
    796796         ! 
    797797      CASE( 2 )               !--- Temporal smoothing 
     
    814814            END DO 
    815815         END DO 
    816          CALL lbc_lnk( strength, 'T', 1. ) 
     816         CALL lbc_lnk( 'icedyn_rdgrft', strength, 'T', 1. ) 
    817817         ! 
    818818      END SELECT 
  • NEMO/trunk/src/ICE/icedyn_rhg_evp.F90

    r10415 r10425  
    146146      REAL(wp), DIMENSION(jpi,jpj) ::   zds                             ! shear 
    147147      REAL(wp), DIMENSION(jpi,jpj) ::   zs1, zs2, zs12                  ! stress tensor components 
    148       REAL(wp), DIMENSION(jpi,jpj) ::   zu_ice, zv_ice, zresr           ! check convergence 
     148!!$      REAL(wp), DIMENSION(jpi,jpj) ::   zu_ice, zv_ice, zresr           ! check convergence 
    149149      REAL(wp), DIMENSION(jpi,jpj) ::   zsshdyn                         ! array used for the calculation of ice surface slope: 
    150150      !                                                                 !    ocean surface (ssh_m) if ice is not embedded 
     
    193193         END DO 
    194194      END DO 
    195       CALL lbc_lnk( zfmask, 'F', 1._wp ) 
     195      CALL lbc_lnk( 'icedyn_rhg_evp', zfmask, 'F', 1._wp ) 
    196196 
    197197      ! Lateral boundary conditions on velocity (modify zfmask) 
     
    220220         ENDIF 
    221221      END DO 
    222       CALL lbc_lnk( zfmask, 'F', 1._wp ) 
     222      CALL lbc_lnk( 'icedyn_rhg_evp', zfmask, 'F', 1._wp ) 
    223223 
    224224      !------------------------------------------------------------------------------! 
     
    322322         END DO 
    323323      END DO 
    324       CALL lbc_lnk_multi( zmf, 'T', 1., zdt_m, 'T', 1. ) 
     324      CALL lbc_lnk_multi( 'icedyn_rhg_evp', zmf, 'T', 1., zdt_m, 'T', 1. ) 
    325325      ! 
    326326      !                                  !== Landfast ice parameterization ==! 
     
    343343            END DO 
    344344         END DO 
    345          CALL lbc_lnk( tau_icebfr(:,:), 'T', 1. ) 
     345         CALL lbc_lnk( 'icedyn_rhg_evp', tau_icebfr(:,:), 'T', 1. ) 
    346346         ! 
    347347      ELSEIF( ln_landfast_home ) THEN          !-- Home made 
     
    370370      DO jter = 1 , nn_nevp                           !    loop over jter    ! 
    371371         !                                            !----------------------!         
    372          IF(ln_ctl) THEN   ! Convergence test 
    373             DO jj = 1, jpjm1 
    374                zu_ice(:,jj) = u_ice(:,jj) ! velocity at previous time step 
    375                zv_ice(:,jj) = v_ice(:,jj) 
    376             END DO 
    377          ENDIF 
     372         l_full_nf_update = jter == nn_nevp   ! false: disable full North fold update (performances) for iter = 1 to nn_nevp-1 
     373         ! 
     374!!$         IF(ln_ctl) THEN   ! Convergence test 
     375!!$            DO jj = 1, jpjm1 
     376!!$               zu_ice(:,jj) = u_ice(:,jj) ! velocity at previous time step 
     377!!$               zv_ice(:,jj) = v_ice(:,jj) 
     378!!$            END DO 
     379!!$         ENDIF 
    378380 
    379381         ! --- divergence, tension & shear (Appendix B of Hunke & Dukowicz, 2002) --- ! 
     
    388390            END DO 
    389391         END DO 
    390          CALL lbc_lnk( zds, 'F', 1. ) 
     392         CALL lbc_lnk( 'icedyn_rhg_evp', zds, 'F', 1. ) 
    391393 
    392394         DO jj = 2, jpj    ! loop to jpi,jpj to avoid making a communication for zs1,zs2,zs12 
     
    432434            END DO 
    433435         END DO 
    434          CALL lbc_lnk( zp_delt, 'T', 1. ) 
     436         CALL lbc_lnk( 'icedyn_rhg_evp', zp_delt, 'T', 1. ) 
    435437 
    436438         DO jj = 1, jpjm1 
     
    527529               END DO 
    528530            END DO 
    529             CALL lbc_lnk( v_ice, 'V', -1. ) 
     531            CALL lbc_lnk( 'icedyn_rhg_evp', v_ice, 'V', -1. ) 
    530532            ! 
    531533#if defined key_agrif 
     
    575577               END DO 
    576578            END DO 
    577             CALL lbc_lnk( u_ice, 'U', -1. ) 
     579            CALL lbc_lnk( 'icedyn_rhg_evp', u_ice, 'U', -1. ) 
    578580            ! 
    579581#if defined key_agrif 
     
    625627               END DO 
    626628            END DO 
    627             CALL lbc_lnk( u_ice, 'U', -1. ) 
     629            CALL lbc_lnk( 'icedyn_rhg_evp', u_ice, 'U', -1. ) 
    628630            ! 
    629631#if defined key_agrif 
     
    673675               END DO 
    674676            END DO 
    675             CALL lbc_lnk( v_ice, 'V', -1. ) 
     677            CALL lbc_lnk( 'icedyn_rhg_evp', v_ice, 'V', -1. ) 
    676678            ! 
    677679#if defined key_agrif 
     
    682684            ! 
    683685         ENDIF 
    684           
    685          IF(ln_ctl) THEN   ! Convergence test 
    686             DO jj = 2 , jpjm1 
    687                zresr(:,jj) = MAX( ABS( u_ice(:,jj) - zu_ice(:,jj) ), ABS( v_ice(:,jj) - zv_ice(:,jj) ) ) 
    688             END DO 
    689             zresm = MAXVAL( zresr( 1:jpi, 2:jpjm1 ) ) 
    690             IF( lk_mpp )   CALL mpp_max( zresm )   ! max over the global domain 
    691          ENDIF 
     686 
     687!!$         IF(ln_ctl) THEN   ! Convergence test 
     688!!$            DO jj = 2 , jpjm1 
     689!!$               zresr(:,jj) = MAX( ABS( u_ice(:,jj) - zu_ice(:,jj) ), ABS( v_ice(:,jj) - zv_ice(:,jj) ) ) 
     690!!$            END DO 
     691!!$            zresm = MAXVAL( zresr( 1:jpi, 2:jpjm1 ) ) 
     692!!$            CALL mpp_max( 'icedyn_rhg_evp', zresm )   ! max over the global domain 
     693!!$         ENDIF 
    692694         ! 
    693695         !                                                ! ==================== ! 
     
    738740         END DO 
    739741      END DO 
    740       CALL lbc_lnk_multi( pshear_i, 'T', 1., pdivu_i, 'T', 1., pdelta_i, 'T', 1. ) 
     742      CALL lbc_lnk_multi( 'icedyn_rhg_evp', pshear_i, 'T', 1., pdivu_i, 'T', 1., pdelta_i, 'T', 1. ) 
    741743       
    742744      ! --- Store the stress tensor for the next time step --- ! 
    743       CALL lbc_lnk_multi( zs1, 'T', 1., zs2, 'T', 1., zs12, 'F', 1. ) 
     745      CALL lbc_lnk_multi( 'icedyn_rhg_evp', zs1, 'T', 1., zs2, 'T', 1., zs12, 'F', 1. ) 
    744746      pstress1_i (:,:) = zs1 (:,:) 
    745747      pstress2_i (:,:) = zs2 (:,:) 
     
    785787            END DO 
    786788         END DO 
    787          CALL lbc_lnk_multi( zsig1, 'T', 1., zsig2, 'T', 1., zsig3, 'T', 1. ) 
     789         CALL lbc_lnk_multi( 'icedyn_rhg_evp', zsig1, 'T', 1., zsig2, 'T', 1., zsig3, 'T', 1. ) 
    788790         ! 
    789791         IF( iom_use('isig1') )   CALL iom_put( "isig1" , zsig1 ) 
     
    842844         END DO 
    843845          
    844          CALL lbc_lnk_multi( zdiag_sig1   , 'T',  1., zdiag_sig2   , 'T',  1.,   & 
     846         CALL lbc_lnk_multi( 'icedyn_rhg_evp', zdiag_sig1   , 'T',  1., zdiag_sig2   , 'T',  1.,   & 
    845847            &                zdiag_dssh_dx, 'U', -1., zdiag_dssh_dy, 'V', -1.,   & 
    846848            &                zdiag_corstrx, 'U', -1., zdiag_corstry, 'V', -1.,   &  
    847849            &                zdiag_intstrx, 'U', -1., zdiag_intstry, 'V', -1.    ) 
    848850                   
    849          CALL lbc_lnk_multi( zdiag_utau_oi  , 'U', -1., zdiag_vtau_oi  , 'V', -1.,   & 
     851         CALL lbc_lnk_multi( 'icedyn_rhg_evp', zdiag_utau_oi  , 'U', -1., zdiag_vtau_oi  , 'V', -1.,   & 
    850852            &                zdiag_xmtrp_ice, 'U', -1., zdiag_xmtrp_snw, 'U', -1.,   & 
    851853            &                zdiag_xatrp    , 'U', -1., zdiag_ymtrp_ice, 'V', -1.,   & 
  • NEMO/trunk/src/ICE/iceforcing.F90

    r10069 r10425  
    8383            END DO 
    8484         END DO 
    85          CALL lbc_lnk_multi( utau_ice, 'U', -1., vtau_ice, 'V', -1. ) 
     85         CALL lbc_lnk_multi( 'iceforcing', utau_ice, 'U', -1., vtau_ice, 'V', -1. ) 
    8686      ENDIF 
    8787      ! 
  • NEMO/trunk/src/ICE/iceistate.F90

    r10413 r10425  
    414414      u_ice (:,:) = 0._wp 
    415415      v_ice (:,:) = 0._wp 
     416      ! fields needed for ice_dyn_adv_umx 
     417      l_split_advumx(1) = .FALSE. 
    416418      ! 
    417419      !---------------------------------------------- 
     
    483485!!clem: output of initial state should be written here but it is impossible because 
    484486!!      the ocean and ice are in the same file 
    485 !!      CALL dia_wri_state( 'output.init', nit000 ) 
     487!!      CALL dia_wri_state( 'output.init' ) 
    486488      ! 
    487489   END SUBROUTINE ice_istate 
  • NEMO/trunk/src/ICE/icerst.F90

    r10069 r10425  
    6969            IF(lwp) THEN 
    7070               WRITE(numout,*) 
    71                SELECT CASE ( jprstlib ) 
    72                CASE DEFAULT 
    73                   WRITE(numout,*) '             open ice restart NetCDF file: ',TRIM(clpath)//clname 
    74                END SELECT 
     71               WRITE(numout,*) '             open ice restart NetCDF file: ',TRIM(clpath)//clname 
    7572               IF( kt == nitrst - 2*nn_fsbc + 1 ) THEN 
    7673                  WRITE(numout,*) '             kt = nitrst - 2*nn_fsbc + 1 = ', kt,' date= ', ndastp 
     
    8077            ENDIF 
    8178            ! 
    82             CALL iom_open( TRIM(clpath)//TRIM(clname), numriw, ldwrt = .TRUE., kiolib = jprstlib, kdlev = jpl ) 
     79            CALL iom_open( TRIM(clpath)//TRIM(clname), numriw, ldwrt = .TRUE., kdlev = jpl ) 
    8380            lrst_ice = .TRUE. 
    8481         ENDIF 
     
    9895      INTEGER, INTENT(in) ::   kt     ! number of iteration 
    9996      !! 
    100       INTEGER ::   jk ,jl   ! dummy loop indices 
     97      INTEGER ::   jk    ! dummy loop indices 
    10198      INTEGER ::   iter 
    10299      CHARACTER(len=25) ::   znam 
     
    118115      CALL iom_rstput( iter, nitrst, numriw, 'nn_fsbc', REAL( nn_fsbc, wp ) )      ! time-step  
    119116      CALL iom_rstput( iter, nitrst, numriw, 'kt_ice' , REAL( iter   , wp ) )      ! date 
     117      CALL iom_delay_rst( 'WRITE', 'ICE', numriw )   ! save only ice delayed global communication variables 
    120118 
    121119      ! Prognostic variables 
     
    169167      !! ** purpose  :   read restart file 
    170168      !!---------------------------------------------------------------------- 
    171       INTEGER           ::   jk, jl 
     169      INTEGER           ::   jk 
    172170      LOGICAL           ::   llok 
    173171      INTEGER           ::   id1            ! local integer 
    174       INTEGER           ::   jlibalt = jprstlib 
    175172      CHARACTER(len=25) ::   znam 
    176173      CHARACTER(len=2)  ::   zchar, zchar1 
     
    185182      ENDIF 
    186183 
    187       CALL iom_open ( TRIM(cn_icerst_indir)//'/'//cn_icerst_in, numrir, kiolib = jprstlib, kdlev = jpl ) 
     184      CALL iom_open ( TRIM(cn_icerst_indir)//'/'//cn_icerst_in, numrir, kdlev = jpl ) 
    188185 
    189186      CALL iom_get( numrir, 'nn_fsbc', zfice ) 
     
    236233      CALL iom_get( numrir, jpdom_autoglo, 'u_ice', u_ice ) 
    237234      CALL iom_get( numrir, jpdom_autoglo, 'v_ice', v_ice ) 
     235 
     236      CALL iom_delay_rst( 'READ', 'ICE', numrir )   ! read only ice delayed global communication variables 
     237 
    238238      ! fields needed for Met Office (Jules) coupling 
    239239      IF( ln_cpl ) THEN 
  • NEMO/trunk/src/ICE/icestp.F90

    r10415 r10425  
    241241      ierr = ierr + ice1D_alloc      ()      ! thermodynamics 
    242242      ! 
    243       IF( lk_mpp    )   CALL mpp_sum( ierr ) 
     243      CALL mpp_sum( 'icestp', ierr ) 
    244244      IF( ierr /= 0 )   CALL ctl_stop('STOP', 'ice_init : unable to allocate ice arrays') 
    245245      ! 
  • NEMO/trunk/src/ICE/icethd.F90

    r10069 r10425  
    126126         END DO 
    127127      ENDIF 
    128       CALL lbc_lnk( zfric, 'T',  1. ) 
     128      CALL lbc_lnk( 'icethd', zfric, 'T',  1. ) 
    129129      ! 
    130130      !--------------------------------------------------------------------! 
     
    212212         END DO 
    213213 
    214          IF( lk_mpp )         CALL mpp_ini_ice( npti , numout ) 
    215  
    216214         IF( npti > 0 ) THEN  ! If there is no ice, do nothing. 
    217215            !                                                                 
     
    250248            !                                                       ! --- & Move to 2D arrays --- ! 
    251249            ! 
    252             IF( lk_mpp )      CALL mpp_comm_free( ncomm_ice ) !RB necessary ?? 
    253250         ENDIF 
    254251         ! 
  • NEMO/trunk/src/ICE/icethd_do.F90

    r10069 r10425  
    189189         END DO  
    190190         !  
    191          CALL lbc_lnk_multi( zvrel, 'T', 1., ht_i_new, 'T', 1.  ) 
     191         CALL lbc_lnk_multi( 'icethd_do', zvrel, 'T', 1., ht_i_new, 'T', 1.  ) 
    192192 
    193193      ENDIF 
  • NEMO/trunk/src/ICE/icethd_zdf_bl99.F90

    r10069 r10425  
    8383      INTEGER, DIMENSION(jpij) ::   jm_min    ! reference number of top equation 
    8484      INTEGER, DIMENSION(jpij) ::   jm_max    ! reference number of bottom equation 
    85       ! 
     85 
     86      LOGICAL, DIMENSION(jpij) ::   l_T_converged   ! true when T converges (per grid point) 
     87! 
    8688      REAL(wp) ::   zg1s      =  2._wp        ! for the tridiagonal system 
    8789      REAL(wp) ::   zg1       =  2._wp        ! 
     
    113115      REAL(wp), DIMENSION(jpij,nlay_s)     ::   ztsb        ! Temporary temperature in the snow to check the convergence 
    114116      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   ztcond_i    ! Ice thermal conductivity 
     117      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   ztcond_i_cp ! copy 
    115118      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   zradtr_i    ! Radiation transmitted through the ice 
    116119      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   zradab_i    ! Radiation absorbed in the ice 
     
    201204      ! 
    202205      iconv    = 0          ! number of iterations 
    203       zdti_max = 1000._wp   ! maximal value of error on all points 
    204       ! 
     206      ! 
     207      l_T_converged(:) = .FALSE. 
    205208      !                                                          !============================! 
    206       DO WHILE ( zdti_max > zdti_bnd .AND. iconv < iconv_max )   ! Iterative procedure begins ! 
     209      ! Convergence calculated until all sub-domain grid points have converged 
     210      ! Calculations keep going for all grid points until sub-domain convergence (vectorisation optimisation) 
     211      ! but values are not taken into account (results independant of MPI partitioning) 
     212      ! 
     213      DO WHILE ( ( .NOT. ALL (l_T_converged(1:npti)) ) .AND. iconv < iconv_max )   ! Iterative procedure begins ! 
    207214         !                                                       !============================! 
    208215         iconv = iconv + 1 
     
    217224            ! 
    218225            DO ji = 1, npti 
    219                ztcond_i(ji,0)      = rcnd_i + zbeta * sz_i_1d(ji,1)      / MIN( -epsi10, t_i_1d(ji,1) - rt0 ) 
    220                ztcond_i(ji,nlay_i) = rcnd_i + zbeta * sz_i_1d(ji,nlay_i) / MIN( -epsi10, t_bo_1d(ji)  - rt0 ) 
     226               ztcond_i_cp(ji,0)      = rcnd_i + zbeta * sz_i_1d(ji,1)      / MIN( -epsi10, t_i_1d(ji,1) - rt0 ) 
     227               ztcond_i_cp(ji,nlay_i) = rcnd_i + zbeta * sz_i_1d(ji,nlay_i) / MIN( -epsi10, t_bo_1d(ji)  - rt0 ) 
    221228            END DO 
    222229            DO jk = 1, nlay_i-1 
    223230               DO ji = 1, npti 
    224                   ztcond_i(ji,jk) = rcnd_i + zbeta * 0.5_wp * ( sz_i_1d(ji,jk) + sz_i_1d(ji,jk+1) ) /  & 
    225                      &                       MIN( -epsi10, 0.5_wp * (t_i_1d(ji,jk) + t_i_1d(ji,jk+1)) - rt0 ) 
     231                  ztcond_i_cp(ji,jk) = rcnd_i + zbeta * 0.5_wp * ( sz_i_1d(ji,jk) + sz_i_1d(ji,jk+1) ) /  & 
     232                     &                         MIN( -epsi10, 0.5_wp * (t_i_1d(ji,jk) + t_i_1d(ji,jk+1)) - rt0 ) 
    226233               END DO 
    227234            END DO 
     
    230237            ! 
    231238            DO ji = 1, npti 
    232                ztcond_i(ji,0)      = rcnd_i + 0.09_wp  *  sz_i_1d(ji,1)      / MIN( -epsi10, t_i_1d(ji,1) - rt0 )  & 
    233                   &                         - 0.011_wp * ( t_i_1d(ji,1) - rt0 ) 
    234                ztcond_i(ji,nlay_i) = rcnd_i + 0.09_wp  *  sz_i_1d(ji,nlay_i) / MIN( -epsi10, t_bo_1d(ji)  - rt0 )  & 
    235                   &                         - 0.011_wp * ( t_bo_1d(ji) - rt0 ) 
     239               ztcond_i_cp(ji,0)      = rcnd_i + 0.09_wp  *  sz_i_1d(ji,1)      / MIN( -epsi10, t_i_1d(ji,1) - rt0 )  & 
     240                  &                           - 0.011_wp * ( t_i_1d(ji,1) - rt0 ) 
     241               ztcond_i_cp(ji,nlay_i) = rcnd_i + 0.09_wp  *  sz_i_1d(ji,nlay_i) / MIN( -epsi10, t_bo_1d(ji)  - rt0 )  & 
     242                  &                           - 0.011_wp * ( t_bo_1d(ji) - rt0 ) 
    236243            END DO 
    237244            DO jk = 1, nlay_i-1 
    238245               DO ji = 1, npti 
    239                   ztcond_i(ji,jk) = rcnd_i + 0.09_wp  *   0.5_wp * ( sz_i_1d(ji,jk) + sz_i_1d(ji,jk+1) ) /        & 
    240                      &                      MIN( -epsi10, 0.5_wp * ( t_i_1d (ji,jk) + t_i_1d (ji,jk+1) ) - rt0 )  & 
    241                      &                     - 0.011_wp * ( 0.5_wp * ( t_i_1d (ji,jk) + t_i_1d (ji,jk+1) ) - rt0 ) 
     246                  ztcond_i_cp(ji,jk) = rcnd_i + 0.09_wp  *   0.5_wp * ( sz_i_1d(ji,jk) + sz_i_1d(ji,jk+1) ) /        & 
     247                     &                        MIN( -epsi10, 0.5_wp * ( t_i_1d (ji,jk) + t_i_1d (ji,jk+1) ) - rt0 )  & 
     248                     &                       - 0.011_wp * ( 0.5_wp * ( t_i_1d (ji,jk) + t_i_1d (ji,jk+1) ) - rt0 ) 
    242249               END DO 
    243250            END DO 
    244251            ! 
    245252         ENDIF 
    246          ztcond_i(1:npti,:) = MAX( zkimin, ztcond_i(1:npti,:) )         
     253 
     254         ! Variable used after iterations 
     255         ! Value must be frozen after convergence for MPP independance reason 
     256         DO ji = 1, npti 
     257            IF ( .NOT. l_T_converged(ji) ) & 
     258               ztcond_i(ji,:) = MAX( zkimin, ztcond_i_cp(ji,:) )         
     259         END DO 
    247260         ! 
    248261         !--- G(he) : enhancement of thermal conductivity in mono-category case 
     
    270283         !----------------- 
    271284         !--- Snow 
     285         ! Variable used after iterations 
     286         ! Value must be frozen after convergence for MPP independance reason 
    272287         DO jk = 0, nlay_s-1 
    273288            DO ji = 1, npti 
    274                zkappa_s(ji,jk) = zghe(ji) * rn_cnd_s * z1_h_s(ji) 
     289               IF ( .NOT. l_T_converged(ji) ) & 
     290                  zkappa_s(ji,jk) = zghe(ji) * rn_cnd_s * z1_h_s(ji) 
    275291            END DO 
    276292         END DO 
    277293         DO ji = 1, npti   ! Snow-ice interface 
    278             zfac = 0.5_wp * ( ztcond_i(ji,0) * zh_s(ji) + rn_cnd_s * zh_i(ji) ) 
    279             IF( zfac > epsi10 ) THEN 
    280                zkappa_s(ji,nlay_s) = zghe(ji) * rn_cnd_s * ztcond_i(ji,0) / zfac 
    281             ELSE 
    282                zkappa_s(ji,nlay_s) = 0._wp 
     294            IF ( .NOT. l_T_converged(ji) ) THEN 
     295               zfac = 0.5_wp * ( ztcond_i(ji,0) * zh_s(ji) + rn_cnd_s * zh_i(ji) ) 
     296               IF( zfac > epsi10 ) THEN 
     297                  zkappa_s(ji,nlay_s) = zghe(ji) * rn_cnd_s * ztcond_i(ji,0) / zfac 
     298               ELSE 
     299                  zkappa_s(ji,nlay_s) = 0._wp 
     300               ENDIF 
    283301            ENDIF 
    284302         END DO 
    285303 
    286304         !--- Ice 
     305         ! Variable used after iterations 
     306         ! Value must be frozen after convergence for MPP independance reason 
    287307         DO jk = 0, nlay_i 
    288308            DO ji = 1, npti 
    289                zkappa_i(ji,jk) = zghe(ji) * ztcond_i(ji,jk) * z1_h_i(ji) 
     309               IF ( .NOT. l_T_converged(ji) ) & 
     310                  zkappa_i(ji,jk) = zghe(ji) * ztcond_i(ji,jk) * z1_h_i(ji) 
    290311            END DO 
    291312         END DO 
    292313         DO ji = 1, npti   ! Snow-ice interface 
    293             zkappa_i(ji,0) = zkappa_s(ji,nlay_s) * isnow(ji) + zkappa_i(ji,0) * ( 1._wp - isnow(ji) ) 
     314            IF ( .NOT. l_T_converged(ji) ) & 
     315               zkappa_i(ji,0) = zkappa_s(ji,nlay_s) * isnow(ji) + zkappa_i(ji,0) * ( 1._wp - isnow(ji) ) 
    294316         END DO 
    295317         ! 
     
    326348            ! update of the non solar flux according to the update in T_su 
    327349            DO ji = 1, npti 
    328                qns_ice_1d(ji) = qns_ice_1d(ji) + dqns_ice_1d(ji) * ( t_su_1d(ji) - ztsub(ji) ) 
     350               ! Variable used after iterations 
     351               ! Value must be frozen after convergence for MPP independance reason 
     352               IF ( .NOT. l_T_converged(ji) ) & 
     353                  qns_ice_1d(ji) = qns_ice_1d(ji) + dqns_ice_1d(ji) * ( t_su_1d(ji) - ztsub(ji) ) 
    329354            END DO 
    330355 
     
    496521            ! ice temperatures 
    497522            DO ji = 1, npti 
    498                t_i_1d(ji,nlay_i) = zindtbis(ji,jm_max(ji)) / zdiagbis(ji,jm_max(ji)) 
     523               ! Variable used after iterations 
     524               ! Value must be frozen after convergence for MPP independance reason 
     525               IF ( .NOT. l_T_converged(ji) ) & 
     526                  t_i_1d(ji,nlay_i) = zindtbis(ji,jm_max(ji)) / zdiagbis(ji,jm_max(ji)) 
    499527            END DO 
    500528 
     
    502530               DO ji = 1, npti 
    503531                  jk = jm - nlay_s - 1 
    504                   t_i_1d(ji,jk) = ( zindtbis(ji,jm) - ztrid(ji,jm,3) * t_i_1d(ji,jk+1) ) / zdiagbis(ji,jm) 
     532                  IF ( .NOT. l_T_converged(ji) ) & 
     533                     t_i_1d(ji,jk) = ( zindtbis(ji,jm) - ztrid(ji,jm,3) * t_i_1d(ji,jk+1) ) / zdiagbis(ji,jm) 
    505534               END DO 
    506535            END DO 
    507536 
    508537            DO ji = 1, npti 
    509                ! snow temperatures       
    510                IF( h_s_1d(ji) > 0._wp ) THEN 
    511                   t_s_1d(ji,nlay_s) = ( zindtbis(ji,nlay_s+1) - ztrid(ji,nlay_s+1,3) * t_i_1d(ji,1) ) / zdiagbis(ji,nlay_s+1) 
    512                ENDIF 
    513                ! surface temperature 
    514                ztsub(ji) = t_su_1d(ji) 
    515                IF( t_su_1d(ji) < rt0 ) THEN 
    516                   t_su_1d(ji) = ( zindtbis(ji,jm_min(ji)) - ztrid(ji,jm_min(ji),3) *  & 
    517                      &          ( isnow(ji) * t_s_1d(ji,1) + ( 1._wp - isnow(ji) ) * t_i_1d(ji,1) ) ) / zdiagbis(ji,jm_min(ji)) 
     538               ! Variables used after iterations 
     539               ! Value must be frozen after convergence for MPP independance reason 
     540               IF ( .NOT. l_T_converged(ji) ) THEN 
     541                  ! snow temperatures       
     542                  IF( h_s_1d(ji) > 0._wp ) THEN 
     543                     t_s_1d(ji,nlay_s) = ( zindtbis(ji,nlay_s+1) - ztrid(ji,nlay_s+1,3) * t_i_1d(ji,1) ) / zdiagbis(ji,nlay_s+1) 
     544                  ENDIF 
     545                  ! surface temperature 
     546                  ztsub(ji) = t_su_1d(ji) 
     547                  IF( t_su_1d(ji) < rt0 ) THEN 
     548                     t_su_1d(ji) = ( zindtbis(ji,jm_min(ji)) - ztrid(ji,jm_min(ji),3) *  & 
     549                        &          ( isnow(ji) * t_s_1d(ji,1) + ( 1._wp - isnow(ji) ) * t_i_1d(ji,1) ) ) / zdiagbis(ji,jm_min(ji)) 
     550                  ENDIF 
    518551               ENDIF 
    519552            END DO 
     
    524557            ! check that nowhere it has started to melt 
    525558            ! zdti_max is a measure of error, it has to be under zdti_bnd 
    526             zdti_max = 0._wp 
    527             DO ji = 1, npti 
    528                t_su_1d(ji) = MAX( MIN( t_su_1d(ji) , rt0 ) , rt0 - 100._wp ) 
    529                zdti_max    = MAX( zdti_max, ABS( t_su_1d(ji) - ztsub(ji) ) )      
    530             END DO 
    531  
    532             DO jk = 1, nlay_s 
    533                DO ji = 1, npti 
    534                   t_s_1d(ji,jk) = MAX( MIN( t_s_1d(ji,jk), rt0 ), rt0 - 100._wp ) 
    535                   zdti_max      = MAX( zdti_max, ABS( t_s_1d(ji,jk) - ztsb(ji,jk) ) ) 
    536                END DO 
    537             END DO 
    538  
    539             DO jk = 1, nlay_i 
    540                DO ji = 1, npti 
    541                   ztmelts       = -rTmlt * sz_i_1d(ji,jk) + rt0  
    542                   t_i_1d(ji,jk) =  MAX( MIN( t_i_1d(ji,jk), ztmelts ), rt0 - 100._wp ) 
    543                   zdti_max      =  MAX( zdti_max, ABS( t_i_1d(ji,jk) - ztib(ji,jk) ) ) 
    544                END DO 
    545             END DO 
    546  
    547             ! Compute spatial maximum over all errors 
    548             ! note that this could be optimized substantially by iterating only the non-converging points 
    549             IF( lk_mpp ) CALL mpp_max( zdti_max, kcom=ncomm_ice ) 
    550          ! 
     559 
     560            DO ji = 1, npti 
     561 
     562               zdti_max = 0._wp 
     563 
     564               IF ( .NOT. l_T_converged(ji) ) THEN 
     565                  t_su_1d(ji) = MAX( MIN( t_su_1d(ji) , rt0 ) , rt0 - 100._wp ) 
     566                  zdti_max    = MAX( zdti_max, ABS( t_su_1d(ji) - ztsub(ji) ) ) 
     567 
     568                  t_s_1d(ji,1:nlay_s) = MAX( MIN( t_s_1d(ji,1:nlay_s), rt0 ), rt0 - 100._wp ) 
     569                  zdti_max = MAX ( zdti_max , MAXVAL( ABS( t_s_1d(ji,1:nlay_s) - ztsb(ji,1:nlay_s) ) ) ) 
     570 
     571                  DO jk = 1, nlay_i 
     572                     ztmelts       = -rTmlt * sz_i_1d(ji,jk) + rt0 
     573                     t_i_1d(ji,jk) =  MAX( MIN( t_i_1d(ji,jk), ztmelts ), rt0 - 100._wp ) 
     574                     zdti_max      =  MAX( zdti_max, ABS( t_i_1d(ji,jk) - ztib(ji,jk) ) ) 
     575                  END DO 
     576 
     577                  IF ( zdti_max < zdti_bnd ) l_T_converged(ji) = .TRUE. 
     578 
     579               ENDIF 
     580 
     581            END DO 
     582 
    551583         !----------------------------------------! 
    552584         !                                        ! 
     
    670702             
    671703            ! ice temperatures 
    672            DO ji = 1, npti 
    673                t_i_1d(ji,nlay_i) = zindtbis(ji,jm_max(ji)) / zdiagbis(ji,jm_max(ji)) 
     704            DO ji = 1, npti 
     705               ! Variable used after iterations 
     706               ! Value must be frozen after convergence for MPP independance reason 
     707               IF ( .NOT. l_T_converged(ji) ) & 
     708                  t_i_1d(ji,nlay_i) = zindtbis(ji,jm_max(ji)) / zdiagbis(ji,jm_max(ji)) 
    674709            END DO 
    675710 
    676711            DO jm = nlay_i + nlay_s, nlay_s + 2, -1 
    677712               DO ji = 1, npti 
    678                   jk = jm - nlay_s - 1 
    679                   t_i_1d(ji,jk) = ( zindtbis(ji,jm) - ztrid(ji,jm,3) * t_i_1d(ji,jk+1) ) / zdiagbis(ji,jm) 
     713                  IF ( .NOT. l_T_converged(ji) ) THEN 
     714                     jk = jm - nlay_s - 1 
     715                     t_i_1d(ji,jk) = ( zindtbis(ji,jm) - ztrid(ji,jm,3) * t_i_1d(ji,jk+1) ) / zdiagbis(ji,jm) 
     716                  ENDIF 
    680717               END DO 
    681718            END DO 
     
    683720            ! snow temperatures       
    684721            DO ji = 1, npti 
    685                IF( h_s_1d(ji) > 0._wp ) THEN 
    686                   t_s_1d(ji,nlay_s) = ( zindtbis(ji,nlay_s+1) - ztrid(ji,nlay_s+1,3) * t_i_1d(ji,1) ) / zdiagbis(ji,nlay_s+1) 
     722               ! Variable used after iterations 
     723               ! Value must be frozen after convergence for MPP independance reason 
     724               IF ( .NOT. l_T_converged(ji) ) THEN 
     725                  IF( h_s_1d(ji) > 0._wp ) THEN 
     726                     t_s_1d(ji,nlay_s) = ( zindtbis(ji,nlay_s+1) - ztrid(ji,nlay_s+1,3) * t_i_1d(ji,1) ) / zdiagbis(ji,nlay_s+1) 
     727                  ENDIF 
    687728               ENDIF 
    688729            END DO 
     
    693734            ! check that nowhere it has started to melt 
    694735            ! zdti_max is a measure of error, it has to be under zdti_bnd 
    695             zdti_max = 0._wp 
    696  
    697             DO jk = 1, nlay_s 
    698                DO ji = 1, npti 
    699                   t_s_1d(ji,jk) = MAX( MIN( t_s_1d(ji,jk), rt0 ), rt0 - 100._wp ) 
    700                   zdti_max = MAX( zdti_max, ABS( t_s_1d(ji,jk) - ztsb(ji,jk) ) ) 
    701                END DO 
    702             END DO 
    703              
    704             DO jk = 1, nlay_i 
    705                DO ji = 1, npti 
    706                   ztmelts       = -rTmlt * sz_i_1d(ji,jk) + rt0  
    707                   t_i_1d(ji,jk) =  MAX( MIN( t_i_1d(ji,jk), ztmelts ), rt0 - 100._wp ) 
    708                   zdti_max      =  MAX( zdti_max, ABS( t_i_1d(ji,jk) - ztib(ji,jk) ) ) 
    709                END DO 
    710             END DO 
    711  
    712             ! Compute spatial maximum over all errors 
    713             ! note that this could be optimized substantially by iterating only the non-converging points 
    714             IF( lk_mpp )   CALL mpp_max( zdti_max, kcom=ncomm_ice ) 
     736 
     737            DO ji = 1, npti 
     738 
     739               zdti_max = 0._wp 
     740 
     741               IF ( .NOT. l_T_converged(ji) ) THEN 
     742                  ! t_s 
     743                  t_s_1d(ji,1:nlay_s) = MAX( MIN( t_s_1d(ji,1:nlay_s), rt0 ), rt0 - 100._wp ) 
     744                  zdti_max = MAX ( zdti_max , MAXVAL( ABS( t_s_1d(ji,1:nlay_s) - ztsb(ji,1:nlay_s) ) ) ) 
     745                  ! t_i 
     746                  DO jk = 0, nlay_i 
     747                     ztmelts       = -rTmlt * sz_i_1d(ji,jk) + rt0  
     748                     t_i_1d(ji,jk) =  MAX( MIN( t_i_1d(ji,jk), ztmelts ), rt0 - 100._wp ) 
     749                     zdti_max      =  MAX ( zdti_max, ABS( t_i_1d(ji,jk) - ztib(ji,jk) ) ) 
     750                  END DO 
     751 
     752                  IF ( zdti_max < zdti_bnd ) l_T_converged(ji) = .TRUE. 
     753 
     754               ENDIF 
     755 
     756            END DO 
    715757 
    716758         ENDIF ! k_jules 
  • NEMO/trunk/src/ICE/iceupdate.F90

    r10069 r10425  
    5959      ALLOCATE( utau_oce(jpi,jpj), vtau_oce(jpi,jpj), tmod_io(jpi,jpj), STAT=ice_update_alloc ) 
    6060      ! 
    61       IF( lk_mpp                )   CALL mpp_sum( ice_update_alloc ) 
    62       IF( ice_update_alloc /= 0 )   CALL ctl_warn('ice_update_alloc: failed to allocate arrays') 
     61      CALL mpp_sum( 'iceupdate', ice_update_alloc ) 
     62      IF( ice_update_alloc /= 0 )   CALL ctl_stop( 'STOP', 'ice_update_alloc: failed to allocate arrays' ) 
    6363      ! 
    6464   END FUNCTION ice_update_alloc 
     
    350350            END DO 
    351351         END DO 
    352          CALL lbc_lnk_multi( taum, 'T', 1., tmod_io, 'T', 1. ) 
     352         CALL lbc_lnk_multi( 'iceupdate', taum, 'T', 1., tmod_io, 'T', 1. ) 
    353353         ! 
    354354         utau_oce(:,:) = utau(:,:)                    !* save the air-ocean stresses at ice time-step 
     
    374374         END DO 
    375375      END DO 
    376       CALL lbc_lnk_multi( utau, 'U', -1., vtau, 'V', -1. )   ! lateral boundary condition 
     376      CALL lbc_lnk_multi( 'iceupdate', utau, 'U', -1., vtau, 'V', -1. )   ! lateral boundary condition 
    377377      ! 
    378378      IF( ln_timing )   CALL timing_stop('ice_update_tau') 
  • NEMO/trunk/src/ICE/icewri.F90

    r10413 r10425  
    141141           END DO 
    142142         END DO 
    143          CALL lbc_lnk( z2d, 'T', 1. ) 
     143         CALL lbc_lnk( 'icewri', z2d, 'T', 1. ) 
    144144         IF( iom_use('icevel') )   CALL iom_put( "icevel" , z2d ) 
    145145 
     
    191191         ELSEWHERE               ;   zmsk00(:,:) = 0. 
    192192         END WHERE  
    193          zdiag_area_nh = glob_sum( at_i(:,:) * zmsk00(:,:) * e1e2t(:,:) ) 
    194          zdiag_volu_nh = glob_sum( vt_i(:,:) * zmsk00(:,:) * e1e2t(:,:) ) 
     193         zdiag_area_nh = glob_sum( 'icewri', at_i(:,:) * zmsk00(:,:) * e1e2t(:,:) ) 
     194         zdiag_volu_nh = glob_sum( 'icewri', vt_i(:,:) * zmsk00(:,:) * e1e2t(:,:) ) 
    195195         ! 
    196196         WHERE( ff_t > 0._wp .AND. at_i > 0.15 )   ; zmsk00(:,:) = 1.0e-12 
    197197         ELSEWHERE                                 ; zmsk00(:,:) = 0. 
    198198         END WHERE  
    199          zdiag_extt_nh = glob_sum( zmsk00(:,:) * e1e2t(:,:) ) 
     199         zdiag_extt_nh = glob_sum( 'icewri', zmsk00(:,:) * e1e2t(:,:) ) 
    200200         ! 
    201201         IF( iom_use('NH_icearea') )   CALL iom_put( "NH_icearea" ,  zdiag_area_nh ) 
     
    210210         ELSEWHERE            ; zmsk00(:,:) = 0. 
    211211         END WHERE  
    212          zdiag_area_sh = glob_sum( at_i(:,:) * zmsk00(:,:) * e1e2t(:,:) )  
    213          zdiag_volu_sh = glob_sum( vt_i(:,:) * zmsk00(:,:) * e1e2t(:,:) ) 
     212         zdiag_area_sh = glob_sum( 'icewri', at_i(:,:) * zmsk00(:,:) * e1e2t(:,:) )  
     213         zdiag_volu_sh = glob_sum( 'icewri', vt_i(:,:) * zmsk00(:,:) * e1e2t(:,:) ) 
    214214         ! 
    215215         WHERE( ff_t < 0._wp .AND. at_i > 0.15 ); zmsk00(:,:) = 1.0e-12 
    216216         ELSEWHERE                              ; zmsk00(:,:) = 0. 
    217217         END WHERE  
    218          zdiag_extt_sh = glob_sum( zmsk00(:,:) * e1e2t(:,:) ) 
     218         zdiag_extt_sh = glob_sum( 'icewri', zmsk00(:,:) * e1e2t(:,:) ) 
    219219         ! 
    220220         IF( iom_use('SH_icearea') ) CALL iom_put( "SH_icearea", zdiag_area_sh ) 
     
    234234 
    235235  
    236    SUBROUTINE ice_wri_state( kt, kid, kh_i ) 
     236   SUBROUTINE ice_wri_state( kid ) 
    237237      !!--------------------------------------------------------------------- 
    238238      !!                 ***  ROUTINE ice_wri_state  *** 
     
    245245      !! History :   4.0  !  2013-06  (C. Rousset) 
    246246      !!---------------------------------------------------------------------- 
    247       INTEGER, INTENT( in ) ::   kt               ! ocean time-step index 
    248       INTEGER, INTENT( in ) ::   kid , kh_i 
    249       INTEGER               ::   nz_i, jl 
    250       REAL(wp), DIMENSION(jpl) ::   jcat 
     247      INTEGER, INTENT( in ) ::   kid  
    251248      !!---------------------------------------------------------------------- 
    252249      ! 
    253       DO jl = 1, jpl 
    254          jcat(jl) = REAL(jl) 
    255       END DO 
    256        
    257       CALL histvert( kid, "ncatice", "Ice Categories","", jpl, jcat, nz_i, "up") 
    258  
    259       CALL histdef( kid, "sithic", "Ice thickness"          , "m"      , jpi,jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
    260       CALL histdef( kid, "siconc", "Ice concentration"      , "%"      , jpi,jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
    261       CALL histdef( kid, "sitemp", "Ice temperature"        , "C"      , jpi,jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
    262       CALL histdef( kid, "sivelu", "i-Ice speed "           , "m/s"    , jpi,jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
    263       CALL histdef( kid, "sivelv", "j-Ice speed "           , "m/s"    , jpi,jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )  
    264       CALL histdef( kid, "sistru", "i-Wind stress over ice" , "Pa"     , jpi,jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
    265       CALL histdef( kid, "sistrv", "j-Wind stress over ice" , "Pa"     , jpi,jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )  
    266       CALL histdef( kid, "sisflx", "Solar flx over ocean"   , "W/m2"   , jpi,jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )  
    267       CALL histdef( kid, "sinflx", "NonSolar flx over ocean", "W/m2"   , jpi,jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
    268       CALL histdef( kid, "snwpre", "Snow precipitation"     , "kg/m2/s", jpi,jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )  
    269       CALL histdef( kid, "sisali", "Ice salinity"           , "PSU"    , jpi,jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )  
    270       CALL histdef( kid, "sivolu", "Ice volume"             , "m"      , jpi,jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )  
    271       CALL histdef( kid, "sidive", "Ice divergence"         , "10-8s-1", jpi,jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )  
    272       CALL histdef( kid, "si_amp", "Melt pond fraction"     , "%"      , jpi,jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
    273       CALL histdef( kid, "si_vmp", "Melt pond volume"       ,  "m"     , jpi,jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
    274       ! 
    275       CALL histdef( kid, "sithicat", "Ice thickness"        , "m"      , jpi,jpj, kh_i, jpl, 1, jpl, nz_i, 32, "inst(x)", rdt, rdt ) 
    276       CALL histdef( kid, "siconcat", "Ice concentration"    , "%"      , jpi,jpj, kh_i, jpl, 1, jpl, nz_i, 32, "inst(x)", rdt, rdt ) 
    277       CALL histdef( kid, "sisalcat", "Ice salinity"         , ""       , jpi,jpj, kh_i, jpl, 1, jpl, nz_i, 32, "inst(x)", rdt, rdt ) 
    278       CALL histdef( kid, "snthicat", "Snw thickness"        , "m"      , jpi,jpj, kh_i, jpl, 1, jpl, nz_i, 32, "inst(x)", rdt, rdt ) 
    279  
    280       CALL histend( kid, snc4set )   ! end of the file definition 
    281  
    282       CALL histwrite( kid, "sithic", kt, hm_i          , jpi*jpj, (/1/) )     
    283       CALL histwrite( kid, "siconc", kt, at_i          , jpi*jpj, (/1/) ) 
    284       CALL histwrite( kid, "sitemp", kt, tm_i - rt0    , jpi*jpj, (/1/) ) 
    285       CALL histwrite( kid, "sivelu", kt, u_ice         , jpi*jpj, (/1/) ) 
    286       CALL histwrite( kid, "sivelv", kt, v_ice         , jpi*jpj, (/1/) ) 
    287       CALL histwrite( kid, "sistru", kt, utau_ice      , jpi*jpj, (/1/) ) 
    288       CALL histwrite( kid, "sistrv", kt, vtau_ice      , jpi*jpj, (/1/) ) 
    289       CALL histwrite( kid, "sisflx", kt, qsr           , jpi*jpj, (/1/) ) 
    290       CALL histwrite( kid, "sinflx", kt, qns           , jpi*jpj, (/1/) ) 
    291       CALL histwrite( kid, "snwpre", kt, sprecip       , jpi*jpj, (/1/) ) 
    292       CALL histwrite( kid, "sisali", kt, sm_i          , jpi*jpj, (/1/) ) 
    293       CALL histwrite( kid, "sivolu", kt, vt_i          , jpi*jpj, (/1/) ) 
    294       CALL histwrite( kid, "sidive", kt, divu_i*1.0e8  , jpi*jpj, (/1/) ) 
    295       CALL histwrite( kid, "si_amp", kt, at_ip         , jpi*jpj, (/1/) ) 
    296       CALL histwrite( kid, "si_vmp", kt, vt_ip         , jpi*jpj, (/1/) ) 
    297       ! 
    298       CALL histwrite( kid, "sithicat", kt, h_i         , jpi*jpj*jpl, (/1/) )     
    299       CALL histwrite( kid, "siconcat", kt, a_i         , jpi*jpj*jpl, (/1/) )     
    300       CALL histwrite( kid, "sisalcat", kt, s_i         , jpi*jpj*jpl, (/1/) )     
    301       CALL histwrite( kid, "snthicat", kt, h_s         , jpi*jpj*jpl, (/1/) )     
    302  
    303       !! The file is closed in dia_wri_state (ocean routine) 
    304       !! CALL histclo( kid ) 
    305       ! 
     250      !! The file is open in dia_wri_state (ocean routine) 
     251 
     252      CALL iom_rstput( 0, 0, kid, 'sithic', hm_i         )   ! Ice thickness 
     253      CALL iom_rstput( 0, 0, kid, 'siconc', at_i         )   ! Ice concentration 
     254      CALL iom_rstput( 0, 0, kid, 'sitemp', tm_i - rt0   )   ! Ice temperature 
     255      CALL iom_rstput( 0, 0, kid, 'sivelu', u_ice        )   ! i-Ice speed 
     256      CALL iom_rstput( 0, 0, kid, 'sivelv', v_ice        )   ! j-Ice speed 
     257      CALL iom_rstput( 0, 0, kid, 'sistru', utau_ice     )   ! i-Wind stress over ice 
     258      CALL iom_rstput( 0, 0, kid, 'sistrv', vtau_ice     )   ! i-Wind stress over ice 
     259      CALL iom_rstput( 0, 0, kid, 'sisflx', qsr          )   ! Solar flx over ocean 
     260      CALL iom_rstput( 0, 0, kid, 'sinflx', qns          )   ! NonSolar flx over ocean 
     261      CALL iom_rstput( 0, 0, kid, 'snwpre', sprecip      )   ! Snow precipitation 
     262      CALL iom_rstput( 0, 0, kid, 'sisali', sm_i         )   ! Ice salinity 
     263      CALL iom_rstput( 0, 0, kid, 'sivolu', vt_i         )   ! Ice volume 
     264      CALL iom_rstput( 0, 0, kid, 'sidive', divu_i*1.0e8 )   ! Ice divergence 
     265      CALL iom_rstput( 0, 0, kid, 'si_amp', at_ip        )   ! Melt pond fraction 
     266      CALL iom_rstput( 0, 0, kid, 'si_vmp', vt_ip        )   ! Melt pond volume 
     267      CALL iom_rstput( 0, 0, kid, 'sithicat', h_i        )   ! Ice thickness 
     268      CALL iom_rstput( 0, 0, kid, 'siconcat', a_i        )   ! Ice concentration 
     269      CALL iom_rstput( 0, 0, kid, 'sisalcat', s_i        )   ! Ice salinity 
     270      CALL iom_rstput( 0, 0, kid, 'snthicat', h_s        )   ! Snw thickness 
     271 
    306272    END SUBROUTINE ice_wri_state 
    307273 
Note: See TracChangeset for help on using the changeset viewer.