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 15574 for NEMO/branches/2021/dev_r14318_RK3_stage1/src/ICE/icedyn_adv_umx.F90 – NEMO

Ignore:
Timestamp:
2021-12-03T20:32:50+01:00 (3 years ago)
Author:
techene
Message:

#2605 #2715 trunk merged into dev_r14318_RK3_stage1

Location:
NEMO/branches/2021/dev_r14318_RK3_stage1
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2021/dev_r14318_RK3_stage1

    • Property svn:externals
      •  

        old new  
        99 
        1010# SETTE 
        11 ^/utils/CI/sette@14244        sette 
         11^/utils/CI/sette@HEAD        sette 
         12 
  • NEMO/branches/2021/dev_r14318_RK3_stage1/src/ICE/icedyn_adv_umx.F90

    r14215 r15574  
    119119      CALL icemax3D( ph_ip, zhip_max) 
    120120      CALL icemax3D( zs_i , zsi_max ) 
    121       CALL lbc_lnk_multi( 'icedyn_adv_umx', zhi_max, 'T', 1._wp, zhs_max, 'T', 1._wp, zhip_max, 'T', 1._wp, zsi_max, 'T', 1._wp ) 
     121      CALL lbc_lnk( 'icedyn_adv_umx', zhi_max, 'T', 1._wp, zhs_max, 'T', 1._wp, zhip_max, 'T', 1._wp, zsi_max, 'T', 1._wp ) 
    122122      ! 
    123123      ! enthalpies 
     
    164164      ! 
    165165      ! --- define velocity for advection: u*grad(H) --- ! 
    166       DO_2D( 0, 0, 0, 0 ) 
     166      DO_2D( nn_hls-1, nn_hls, nn_hls, nn_hls ) 
    167167         IF    ( pu_ice(ji,jj) * pu_ice(ji-1,jj) <= 0._wp ) THEN   ;   zcu_box(ji,jj) = 0._wp 
    168168         ELSEIF( pu_ice(ji,jj)                   >  0._wp ) THEN   ;   zcu_box(ji,jj) = pu_ice(ji-1,jj) 
    169169         ELSE                                                      ;   zcu_box(ji,jj) = pu_ice(ji  ,jj) 
    170170         ENDIF 
    171  
     171      END_2D 
     172      DO_2D( nn_hls, nn_hls, nn_hls-1, nn_hls ) 
    172173         IF    ( pv_ice(ji,jj) * pv_ice(ji,jj-1) <= 0._wp ) THEN   ;   zcv_box(ji,jj) = 0._wp 
    173174         ELSEIF( pv_ice(ji,jj)                   >  0._wp ) THEN   ;   zcv_box(ji,jj) = pv_ice(ji,jj-1) 
     
    204205            IF( .NOT. ALLOCATED(jmsk_small) )   ALLOCATE( jmsk_small(jpi,jpj,jpl) ) 
    205206            DO jl = 1, jpl 
    206                DO_2D( 1, 0, 1, 0 ) 
     207               DO_2D( 1, 0, nn_hls, nn_hls ) 
    207208                  zvi_cen = 0.5_wp * ( pv_i(ji+1,jj,jl) + pv_i(ji,jj,jl) ) 
    208209                  IF( zvi_cen < epsi06) THEN   ;   imsk_small(ji,jj,jl) = 0 
    209210                  ELSE                         ;   imsk_small(ji,jj,jl) = 1   ;   ENDIF 
     211               END_2D 
     212               DO_2D( nn_hls, nn_hls, 1, 0 ) 
    210213                  zvi_cen = 0.5_wp * ( pv_i(ji,jj+1,jl) + pv_i(ji,jj,jl) ) 
    211214                  IF( zvi_cen < epsi06) THEN   ;   jmsk_small(ji,jj,jl) = 0 
     
    360363         ! --- Lateral boundary conditions --- ! 
    361364         IF    ( ( ln_pnd_LEV .OR. ln_pnd_TOPO ) .AND. ln_pnd_lids ) THEN 
    362             CALL lbc_lnk_multi( 'icedyn_adv_umx', pa_i,'T',1._wp, pv_i,'T',1._wp, pv_s,'T',1._wp, psv_i,'T',1._wp, poa_i,'T',1._wp & 
    363                &                                , pa_ip,'T',1._wp, pv_ip,'T',1._wp, pv_il,'T',1._wp ) 
     365            CALL lbc_lnk( 'icedyn_adv_umx', pa_i,'T',1._wp, pv_i,'T',1._wp, pv_s,'T',1._wp, psv_i,'T',1._wp, poa_i,'T',1._wp & 
     366               &                          , pa_ip,'T',1._wp, pv_ip,'T',1._wp, pv_il,'T',1._wp ) 
    364367         ELSEIF( ( ln_pnd_LEV .OR. ln_pnd_TOPO ) .AND. .NOT.ln_pnd_lids ) THEN 
    365             CALL lbc_lnk_multi( 'icedyn_adv_umx', pa_i,'T',1._wp, pv_i,'T',1._wp, pv_s,'T',1._wp, psv_i,'T',1._wp, poa_i,'T',1._wp & 
    366                &                                , pa_ip,'T',1._wp, pv_ip,'T',1._wp ) 
     368            CALL lbc_lnk( 'icedyn_adv_umx', pa_i,'T',1._wp, pv_i,'T',1._wp, pv_s,'T',1._wp, psv_i,'T',1._wp, poa_i,'T',1._wp & 
     369               &                          , pa_ip,'T',1._wp, pv_ip,'T',1._wp ) 
    367370         ELSE 
    368             CALL lbc_lnk_multi( 'icedyn_adv_umx', pa_i,'T',1._wp, pv_i,'T',1._wp, pv_s,'T',1._wp, psv_i,'T',1._wp, poa_i,'T',1._wp ) 
     371            CALL lbc_lnk( 'icedyn_adv_umx', pa_i,'T',1._wp, pv_i,'T',1._wp, pv_s,'T',1._wp, psv_i,'T',1._wp, poa_i,'T',1._wp ) 
    369372         ENDIF 
    370373         CALL lbc_lnk( 'icedyn_adv_umx', pe_i, 'T', 1._wp ) 
     
    583586         ! 
    584587         DO jl = 1, jpl 
    585             DO_2D( 1, 0, 1, 0 ) 
     588            DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 ) 
    586589               pfu_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) 
    587590               pfv_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) 
     
    594597            ! 
    595598            DO jl = 1, jpl              !-- flux in x-direction 
    596                DO_2D( 1, 0, 1, 1 ) 
     599               DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls ) 
    597600                  pfu_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) 
    598601               END_2D 
     
    600603            ! 
    601604            DO jl = 1, jpl              !-- first guess of tracer from u-flux 
    602                DO_2D( 0, 0, 1, 1 ) 
     605               DO_2D( nn_hls-1, nn_hls-1, nn_hls, nn_hls ) 
    603606                  ztra = - ( pfu_ups(ji,jj,jl) - pfu_ups(ji-1,jj,jl) )              & 
    604607                     &   + ( pu     (ji,jj   ) - pu     (ji-1,jj   ) ) * pt(ji,jj,jl) * (1.-pamsk) 
     
    609612            ! 
    610613            DO jl = 1, jpl              !-- flux in y-direction 
    611                DO_2D( 0, 0, 1, 0 ) 
     614               DO_2D( nn_hls-1, nn_hls-1, nn_hls, nn_hls-1 ) 
    612615                  pfv_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) 
    613616               END_2D 
     
    617620            ! 
    618621            DO jl = 1, jpl              !-- flux in y-direction 
    619                DO_2D( 1, 1, 1, 0 ) 
     622               DO_2D( nn_hls, nn_hls, nn_hls, nn_hls-1 ) 
    620623                  pfv_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) 
    621624               END_2D 
     
    623626            ! 
    624627            DO jl = 1, jpl              !-- first guess of tracer from v-flux 
    625                DO_2D( 1, 1, 0, 0 ) 
     628               DO_2D( nn_hls, nn_hls, nn_hls-1, nn_hls-1 ) 
    626629                  ztra = - ( pfv_ups(ji,jj,jl) - pfv_ups(ji,jj-1,jl) )  & 
    627630                     &   + ( pv     (ji,jj   ) - pv     (ji,jj-1   ) ) * pt(ji,jj,jl) * (1.-pamsk) 
     
    632635            ! 
    633636            DO jl = 1, jpl              !-- flux in x-direction 
    634                DO_2D( 1, 0, 0, 0 ) 
     637               DO_2D( nn_hls, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    635638                  pfu_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) 
    636639               END_2D 
     
    642645      ! 
    643646      DO jl = 1, jpl                    !-- after tracer with upstream scheme 
    644          DO_2D( 0, 0, 0, 0 ) 
     647         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    645648            ztra = - (   pfu_ups(ji,jj,jl) - pfu_ups(ji-1,jj  ,jl)   & 
    646649               &       + pfv_ups(ji,jj,jl) - pfv_ups(ji  ,jj-1,jl) ) & 
     
    651654         END_2D 
    652655      END DO 
    653       CALL lbc_lnk( 'icedyn_adv_umx', pt_ups, 'T', 1.0_wp ) 
     656      IF( nn_hls == 1 )   CALL lbc_lnk( 'icedyn_adv_umx', pt_ups, 'T', 1.0_wp ) 
    654657 
    655658   END SUBROUTINE upstream 
     
    681684         ! 
    682685         DO jl = 1, jpl 
    683             DO_2D( 1, 0, 1, 1 ) 
     686            DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls ) 
    684687               pfu_ho(ji,jj,jl) = 0.5_wp * pu(ji,jj) * ( pt(ji,jj,jl) + pt(ji+1,jj  ,jl) ) 
    685688            END_2D 
    686             DO_2D( 1, 1, 1, 0 ) 
     689            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls-1 ) 
    687690               pfv_ho(ji,jj,jl) = 0.5_wp * pv(ji,jj) * ( pt(ji,jj,jl) + pt(ji  ,jj+1,jl) ) 
    688691            END_2D 
     
    701704            ! 
    702705            DO jl = 1, jpl              !-- flux in x-direction 
    703                DO_2D( 1, 0, 1, 1 ) 
     706               DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls ) 
    704707                  pfu_ho(ji,jj,jl) = 0.5_wp * pu(ji,jj) * ( pt(ji,jj,jl) + pt(ji+1,jj,jl) ) 
    705708               END_2D 
     
    708711 
    709712            DO jl = 1, jpl              !-- first guess of tracer from u-flux 
    710                DO_2D( 0, 0, 1, 1 ) 
     713               DO_2D( nn_hls-1, nn_hls-1, nn_hls, nn_hls ) 
    711714                  ztra = - ( pfu_ho(ji,jj,jl) - pfu_ho(ji-1,jj,jl) )              & 
    712715                     &   + ( pu    (ji,jj   ) - pu    (ji-1,jj   ) ) * pt(ji,jj,jl) * (1.-pamsk) 
     
    717720 
    718721            DO jl = 1, jpl              !-- flux in y-direction 
    719                DO_2D( 0, 0, 1, 0 ) 
     722               DO_2D( nn_hls-1, nn_hls-1, nn_hls, nn_hls-1 ) 
    720723                  pfv_ho(ji,jj,jl) = 0.5_wp * pv(ji,jj) * ( zpt(ji,jj,jl) + zpt(ji,jj+1,jl) ) 
    721724               END_2D 
     
    726729            ! 
    727730            DO jl = 1, jpl              !-- flux in y-direction 
    728                DO_2D( 1, 1, 1, 0 ) 
     731               DO_2D( nn_hls, nn_hls, nn_hls, nn_hls-1 ) 
    729732                  pfv_ho(ji,jj,jl) = 0.5_wp * pv(ji,jj) * ( pt(ji,jj,jl) + pt(ji,jj+1,jl) ) 
    730733               END_2D 
     
    733736            ! 
    734737            DO jl = 1, jpl              !-- first guess of tracer from v-flux 
    735                DO_2D( 1, 1, 0, 0 ) 
     738               DO_2D( nn_hls, nn_hls, nn_hls-1, nn_hls-1 ) 
    736739                  ztra = - ( pfv_ho(ji,jj,jl) - pfv_ho(ji,jj-1,jl) )  & 
    737740                     &   + ( pv    (ji,jj   ) - pv    (ji,jj-1   ) ) * pt(ji,jj,jl) * (1.-pamsk) 
     
    742745            ! 
    743746            DO jl = 1, jpl              !-- flux in x-direction 
    744                DO_2D( 1, 0, 0, 0 ) 
     747               DO_2D( nn_hls, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    745748                  pfu_ho(ji,jj,jl) = 0.5_wp * pu(ji,jj) * ( zpt(ji,jj,jl) + zpt(ji+1,jj,jl) ) 
    746749               END_2D 
     
    785788         ! 
    786789         !                                                        !--  ultimate interpolation of pt at u-point  --! 
    787          CALL ultimate_x( pamsk, kn_umx, pdt, pt, pu, zt_u, pfu_ho ) 
     790         CALL ultimate_x( nn_hls, pamsk, kn_umx, pdt, pt, pu, zt_u, pfu_ho ) 
    788791         !                                                        !--  limiter in x --! 
    789792         IF( np_limiter == 2 .OR. np_limiter == 3 )   CALL limiter_x( pdt, pu, pt, pfu_ups, pfu_ho ) 
    790793         !                                                        !--  advective form update in zpt  --! 
    791794         DO jl = 1, jpl 
    792             DO_2D( 0, 0, 0, 0 ) 
     795            DO_2D( 0, 0, nn_hls, nn_hls ) 
    793796               zpt(ji,jj,jl) = ( pt(ji,jj,jl) - (  pubox(ji,jj   ) * ( zt_u(ji,jj,jl) - zt_u(ji-1,jj,jl) ) * r1_e1t  (ji,jj) & 
    794797                  &                              + pt   (ji,jj,jl) * ( pu  (ji,jj   ) - pu  (ji-1,jj   ) ) * r1_e1e2t(ji,jj) & 
     
    797800            END_2D 
    798801         END DO 
    799          CALL lbc_lnk( 'icedyn_adv_umx', zpt, 'T', 1.0_wp ) 
    800802         ! 
    801803         !                                                        !--  ultimate interpolation of pt at v-point  --! 
    802804         IF( ll_hoxy ) THEN 
    803             CALL ultimate_y( pamsk, kn_umx, pdt, zpt, pv, zt_v, pfv_ho ) 
     805            CALL ultimate_y( 0, pamsk, kn_umx, pdt, zpt, pv, zt_v, pfv_ho ) 
    804806         ELSE 
    805             CALL ultimate_y( pamsk, kn_umx, pdt, pt , pv, zt_v, pfv_ho ) 
     807            CALL ultimate_y( 0, pamsk, kn_umx, pdt, pt , pv, zt_v, pfv_ho ) 
    806808         ENDIF 
    807809         !                                                        !--  limiter in y --! 
     
    812814         ! 
    813815         !                                                        !--  ultimate interpolation of pt at v-point  --! 
    814          CALL ultimate_y( pamsk, kn_umx, pdt, pt, pv, zt_v, pfv_ho ) 
     816         CALL ultimate_y( nn_hls, pamsk, kn_umx, pdt, pt, pv, zt_v, pfv_ho ) 
    815817         !                                                        !--  limiter in y --! 
    816818         IF( np_limiter == 2 .OR. np_limiter == 3 )   CALL limiter_y( pdt, pv, pt, pfv_ups, pfv_ho ) 
    817819         !                                                        !--  advective form update in zpt  --! 
    818820         DO jl = 1, jpl 
    819             DO_2D( 0, 0, 0, 0 ) 
     821            DO_2D( nn_hls, nn_hls, 0, 0 ) 
    820822               zpt(ji,jj,jl) = ( pt(ji,jj,jl) - (  pvbox(ji,jj   ) * ( zt_v(ji,jj,jl) - zt_v(ji,jj-1,jl) ) * r1_e2t  (ji,jj) & 
    821823                  &                              + pt   (ji,jj,jl) * ( pv  (ji,jj   ) - pv  (ji,jj-1   ) ) * r1_e1e2t(ji,jj) & 
     
    824826            END_2D 
    825827         END DO 
    826          CALL lbc_lnk( 'icedyn_adv_umx', zpt, 'T', 1.0_wp ) 
    827828         ! 
    828829         !                                                        !--  ultimate interpolation of pt at u-point  --! 
    829830         IF( ll_hoxy ) THEN 
    830             CALL ultimate_x( pamsk, kn_umx, pdt, zpt, pu, zt_u, pfu_ho ) 
     831            CALL ultimate_x( 0, pamsk, kn_umx, pdt, zpt, pu, zt_u, pfu_ho ) 
    831832         ELSE 
    832             CALL ultimate_x( pamsk, kn_umx, pdt, pt , pu, zt_u, pfu_ho ) 
     833            CALL ultimate_x( 0, pamsk, kn_umx, pdt, pt , pu, zt_u, pfu_ho ) 
    833834         ENDIF 
    834835         !                                                        !--  limiter in x --! 
     
    842843 
    843844 
    844    SUBROUTINE ultimate_x( pamsk, kn_umx, pdt, pt, pu, pt_u, pfu_ho ) 
     845   SUBROUTINE ultimate_x( kloop, pamsk, kn_umx, pdt, pt, pu, pt_u, pfu_ho ) 
    845846      !!--------------------------------------------------------------------- 
    846847      !!                    ***  ROUTINE ultimate_x  *** 
     
    852853      !! Reference : Leonard, B.P., 1991, Comput. Methods Appl. Mech. Eng., 88, 17-74. 
    853854      !!---------------------------------------------------------------------- 
     855      INTEGER                         , INTENT(in   ) ::   kloop     ! either 0 or nn_hls depending on the order of the call 
    854856      REAL(wp)                        , INTENT(in   ) ::   pamsk     ! advection of concentration (1) or other tracers (0) 
    855857      INTEGER                         , INTENT(in   ) ::   kn_umx    ! order of the scheme (1-5=UM or 20=CEN2) 
     
    867869      !                                                     !--  Laplacian in i-direction  --! 
    868870      DO jl = 1, jpl 
    869          DO jj = 2, jpjm1         ! First derivative (gradient) 
    870             DO ji = 1, jpim1 
    871                ztu1(ji,jj,jl) = ( pt(ji+1,jj,jl) - pt(ji,jj,jl) ) * r1_e1u(ji,jj) * umask(ji,jj,1) 
    872             END DO 
    873             !                     ! Second derivative (Laplacian) 
    874             DO ji = 2, jpim1 
    875                ztu2(ji,jj,jl) = ( ztu1(ji,jj,jl) - ztu1(ji-1,jj,jl) ) * r1_e1t(ji,jj) 
    876             END DO 
    877          END DO 
    878       END DO 
    879       CALL lbc_lnk( 'icedyn_adv_umx', ztu2, 'T', 1.0_wp ) 
     871         DO_2D( nn_hls, nn_hls-1, kloop, kloop )      ! First derivative (gradient) 
     872            ztu1(ji,jj,jl) = ( pt(ji+1,jj,jl) - pt(ji,jj,jl) ) * r1_e1u(ji,jj) * umask(ji,jj,1) 
     873         END_2D 
     874         DO_2D( nn_hls-1, nn_hls-1, kloop, kloop )    ! Second derivative (Laplacian) 
     875            ztu2(ji,jj,jl) = ( ztu1(ji,jj,jl) - ztu1(ji-1,jj,jl) ) * r1_e1t(ji,jj) 
     876         END_2D 
     877!!$         DO jj = 2, jpjm1         ! First derivative (gradient) 
     878!!$            DO ji = 1, jpim1 
     879!!$               ztu1(ji,jj,jl) = ( pt(ji+1,jj,jl) - pt(ji,jj,jl) ) * r1_e1u(ji,jj) * umask(ji,jj,1) 
     880!!$            END DO 
     881!!$            !                     ! Second derivative (Laplacian) 
     882!!$            DO ji = 2, jpim1 
     883!!$               ztu2(ji,jj,jl) = ( ztu1(ji,jj,jl) - ztu1(ji-1,jj,jl) ) * r1_e1t(ji,jj) 
     884!!$            END DO 
     885!!$         END DO 
     886      END DO 
     887      IF( nn_hls == 1 )   CALL lbc_lnk( 'icedyn_adv_umx', ztu2, 'T', 1.0_wp ) 
    880888      ! 
    881889      !                                                     !--  BiLaplacian in i-direction  --! 
    882890      DO jl = 1, jpl 
    883          DO jj = 2, jpjm1         ! Third derivative 
    884             DO ji = 1, jpim1 
    885                ztu3(ji,jj,jl) = ( ztu2(ji+1,jj,jl) - ztu2(ji,jj,jl) ) * r1_e1u(ji,jj) * umask(ji,jj,1) 
    886             END DO 
    887             !                     ! Fourth derivative 
    888             DO ji = 2, jpim1 
    889                ztu4(ji,jj,jl) = ( ztu3(ji,jj,jl) - ztu3(ji-1,jj,jl) ) * r1_e1t(ji,jj) 
    890             END DO 
    891          END DO 
    892       END DO 
    893       CALL lbc_lnk( 'icedyn_adv_umx', ztu4, 'T', 1.0_wp ) 
     891         DO_2D( 1, 0, kloop, kloop )                  ! Third derivative 
     892            ztu3(ji,jj,jl) = ( ztu2(ji+1,jj,jl) - ztu2(ji,jj,jl) ) * r1_e1u(ji,jj) * umask(ji,jj,1) 
     893         END_2D 
     894         DO_2D( 0, 0, kloop, kloop )                  ! Fourth derivative 
     895            ztu4(ji,jj,jl) = ( ztu3(ji,jj,jl) - ztu3(ji-1,jj,jl) ) * r1_e1t(ji,jj) 
     896         END_2D 
     897!!$         DO jj = 2, jpjm1         ! Third derivative 
     898!!$            DO ji = 1, jpim1 
     899!!$               ztu3(ji,jj,jl) = ( ztu2(ji+1,jj,jl) - ztu2(ji,jj,jl) ) * r1_e1u(ji,jj) * umask(ji,jj,1) 
     900!!$            END DO 
     901!!$            !                     ! Fourth derivative 
     902!!$            DO ji = 2, jpim1 
     903!!$               ztu4(ji,jj,jl) = ( ztu3(ji,jj,jl) - ztu3(ji-1,jj,jl) ) * r1_e1t(ji,jj) 
     904!!$            END DO 
     905!!$         END DO 
     906      END DO 
    894907      ! 
    895908      ! 
     
    899912         ! 
    900913         DO jl = 1, jpl 
    901             DO_2D( 1, 0, 0, 0 ) 
     914            DO_2D( 1, 0, kloop, kloop ) 
    902915               pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * (                                pt(ji+1,jj,jl) + pt(ji,jj,jl)   & 
    903916                  &                                         - SIGN( 1._wp, pu(ji,jj) ) * ( pt(ji+1,jj,jl) - pt(ji,jj,jl) ) ) 
     
    908921         ! 
    909922         DO jl = 1, jpl 
    910             DO_2D( 1, 0, 0, 0 ) 
     923            DO_2D( 1, 0, kloop, kloop ) 
    911924               zcu  = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj) 
    912925               pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * (                                pt(ji+1,jj,jl) + pt(ji,jj,jl)   & 
     
    918931         ! 
    919932         DO jl = 1, jpl 
    920             DO_2D( 1, 0, 0, 0 ) 
     933            DO_2D( 1, 0, kloop, kloop ) 
    921934               zcu  = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj) 
    922935               zdx2 = e1u(ji,jj) * e1u(ji,jj) 
     
    932945         ! 
    933946         DO jl = 1, jpl 
    934             DO_2D( 1, 0, 0, 0 ) 
     947            DO_2D( 1, 0, kloop, kloop ) 
    935948               zcu  = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj) 
    936949               zdx2 = e1u(ji,jj) * e1u(ji,jj) 
     
    945958      CASE( 5 )                                                   !==  5th order central TIM  ==! (Eq. 29) 
    946959         ! 
    947          DO jl = 1, jpl 
    948             DO_2D( 1, 0, 0, 0 ) 
     960         CALL lbc_lnk( 'icedyn_adv_umx', ztu4, 'T', 1.0_wp ) 
     961         ! 
     962         DO jl = 1, jpl 
     963            DO_2D( 1, 0, kloop, kloop ) 
    949964               zcu  = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj) 
    950965               zdx2 = e1u(ji,jj) * e1u(ji,jj) 
     
    967982      IF( ll_neg ) THEN 
    968983         DO jl = 1, jpl 
    969             DO_2D( 1, 0, 0, 0 ) 
     984            DO_2D( 1, 0, kloop, kloop ) 
    970985               IF( pt_u(ji,jj,jl) < 0._wp .OR. ( imsk_small(ji,jj,jl) == 0 .AND. pamsk == 0. ) ) THEN 
    971986                  pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * (                                pt(ji+1,jj,jl) + pt(ji,jj,jl)   & 
     
    9851000 
    9861001 
    987    SUBROUTINE ultimate_y( pamsk, kn_umx, pdt, pt, pv, pt_v, pfv_ho ) 
     1002   SUBROUTINE ultimate_y( kloop, pamsk, kn_umx, pdt, pt, pv, pt_v, pfv_ho ) 
    9881003      !!--------------------------------------------------------------------- 
    9891004      !!                    ***  ROUTINE ultimate_y  *** 
     
    9951010      !! Reference : Leonard, B.P., 1991, Comput. Methods Appl. Mech. Eng., 88, 17-74. 
    9961011      !!---------------------------------------------------------------------- 
     1012      INTEGER                         , INTENT(in   ) ::   kloop     ! either 0 or nn_hls depending on the order of the call 
    9971013      REAL(wp)                        , INTENT(in   ) ::   pamsk     ! advection of concentration (1) or other tracers (0) 
    9981014      INTEGER                         , INTENT(in   ) ::   kn_umx    ! order of the scheme (1-5=UM or 20=CEN2) 
     
    10101026      !                                                     !--  Laplacian in j-direction  --! 
    10111027      DO jl = 1, jpl 
    1012          DO_2D( 0, 0, 1, 0 )         ! First derivative (gradient) 
     1028         DO_2D( kloop, kloop, nn_hls, nn_hls-1 )      ! First derivative (gradient) 
    10131029            ztv1(ji,jj,jl) = ( pt(ji,jj+1,jl) - pt(ji,jj,jl) ) * r1_e2v(ji,jj) * vmask(ji,jj,1) 
    10141030         END_2D 
    1015          DO_2D( 0, 0, 0, 0 )         ! Second derivative (Laplacian) 
     1031         DO_2D( kloop, kloop, nn_hls-1, nn_hls-1 )    ! Second derivative (Laplacian) 
    10161032            ztv2(ji,jj,jl) = ( ztv1(ji,jj,jl) - ztv1(ji,jj-1,jl) ) * r1_e2t(ji,jj) 
    10171033         END_2D 
    10181034      END DO 
    1019       CALL lbc_lnk( 'icedyn_adv_umx', ztv2, 'T', 1.0_wp ) 
     1035      IF( nn_hls == 1 )   CALL lbc_lnk( 'icedyn_adv_umx', ztv2, 'T', 1.0_wp ) 
    10201036      ! 
    10211037      !                                                     !--  BiLaplacian in j-direction  --! 
    10221038      DO jl = 1, jpl 
    1023          DO_2D( 0, 0, 1, 0 )         ! First derivative 
     1039         DO_2D( kloop, kloop, 1, 0 )                  ! Third derivative 
    10241040            ztv3(ji,jj,jl) = ( ztv2(ji,jj+1,jl) - ztv2(ji,jj,jl) ) * r1_e2v(ji,jj) * vmask(ji,jj,1) 
    10251041         END_2D 
    1026          DO_2D( 0, 0, 0, 0 )         ! Second derivative 
     1042         DO_2D( kloop, kloop, 0, 0 )                  ! Fourth derivative 
    10271043            ztv4(ji,jj,jl) = ( ztv3(ji,jj,jl) - ztv3(ji,jj-1,jl) ) * r1_e2t(ji,jj) 
    10281044         END_2D 
    10291045      END DO 
    1030       CALL lbc_lnk( 'icedyn_adv_umx', ztv4, 'T', 1.0_wp ) 
    10311046      ! 
    10321047      ! 
     
    10351050      CASE( 1 )                                                !==  1st order central TIM  ==! (Eq. 21) 
    10361051         DO jl = 1, jpl 
    1037             DO_2D( 0, 0, 1, 0 ) 
     1052            DO_2D( kloop, kloop, 1, 0 ) 
    10381053               pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * (                                pt(ji,jj+1,jl) + pt(ji,jj,jl)   & 
    10391054                  &                                         - SIGN( 1._wp, pv(ji,jj) ) * ( pt(ji,jj+1,jl) - pt(ji,jj,jl) ) ) 
     
    10431058      CASE( 2 )                                                !==  2nd order central TIM  ==! (Eq. 23) 
    10441059         DO jl = 1, jpl 
    1045             DO_2D( 0, 0, 1, 0 ) 
     1060            DO_2D( kloop, kloop, 1, 0 ) 
    10461061               zcv  = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj) 
    10471062               pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * (                                pt(ji,jj+1,jl) + pt(ji,jj,jl)   & 
     
    10521067      CASE( 3 )                                                !==  3rd order central TIM  ==! (Eq. 24) 
    10531068         DO jl = 1, jpl 
    1054             DO_2D( 0, 0, 1, 0 ) 
     1069            DO_2D( kloop, kloop, 1, 0 ) 
    10551070               zcv  = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj) 
    10561071               zdy2 = e2v(ji,jj) * e2v(ji,jj) 
     
    10651080      CASE( 4 )                                                !==  4th order central TIM  ==! (Eq. 27) 
    10661081         DO jl = 1, jpl 
    1067             DO_2D( 0, 0, 1, 0 ) 
     1082            DO_2D( kloop, kloop, 1, 0 ) 
    10681083               zcv  = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj) 
    10691084               zdy2 = e2v(ji,jj) * e2v(ji,jj) 
     
    10771092         ! 
    10781093      CASE( 5 )                                                !==  5th order central TIM  ==! (Eq. 29) 
    1079          DO jl = 1, jpl 
    1080             DO_2D( 0, 0, 1, 0 ) 
     1094         ! 
     1095         CALL lbc_lnk( 'icedyn_adv_umx', ztv4, 'T', 1.0_wp ) 
     1096         ! 
     1097         DO jl = 1, jpl 
     1098            DO_2D( kloop, kloop, 1, 0 ) 
    10811099               zcv  = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj) 
    10821100               zdy2 = e2v(ji,jj) * e2v(ji,jj) 
     
    10991117      IF( ll_neg ) THEN 
    11001118         DO jl = 1, jpl 
    1101             DO_2D( 0, 0, 1, 0 ) 
     1119            DO_2D( kloop, kloop, 1, 0 ) 
    11021120               IF( pt_v(ji,jj,jl) < 0._wp .OR. ( jmsk_small(ji,jj,jl) == 0 .AND. pamsk == 0. ) ) THEN 
    11031121                  pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * (                              ( pt(ji,jj+1,jl) + pt(ji,jj,jl) )  & 
     
    11691187            END_2D 
    11701188         END DO 
    1171          CALL lbc_lnk_multi( 'icedyn_adv_umx', zti_ups, 'T', 1.0_wp, ztj_ups, 'T', 1.0_wp ) 
     1189         CALL lbc_lnk( 'icedyn_adv_umx', zti_ups, 'T', 1.0_wp, ztj_ups, 'T', 1.0_wp ) 
    11721190 
    11731191         DO jl = 1, jpl 
     
    11911209            END_2D 
    11921210         END DO 
    1193          CALL lbc_lnk_multi( 'icedyn_adv_umx', pfu_ho, 'U', -1.0_wp, pfv_ho, 'V', -1.0_wp )   ! lateral boundary cond. 
     1211         CALL lbc_lnk( 'icedyn_adv_umx', pfu_ho, 'U', -1.0_wp, pfv_ho, 'V', -1.0_wp )   ! lateral boundary cond. 
    11941212 
    11951213      ENDIF 
     
    12481266         END_2D 
    12491267      END DO 
    1250       CALL lbc_lnk_multi( 'icedyn_adv_umx', zbetup, 'T', 1.0_wp, zbetdo, 'T', 1.0_wp )   ! lateral boundary cond. (unchanged sign) 
     1268      CALL lbc_lnk( 'icedyn_adv_umx', zbetup, 'T', 1.0_wp, zbetdo, 'T', 1.0_wp )   ! lateral boundary cond. (unchanged sign) 
    12511269 
    12521270 
     
    12991317      ! 
    13001318      DO jl = 1, jpl 
    1301          DO_2D( 0, 0, 0, 0 ) 
     1319         DO_2D( nn_hls, nn_hls-1, 0, 0 ) 
    13021320            zslpx(ji,jj,jl) = ( pt(ji+1,jj,jl) - pt(ji,jj,jl) ) * umask(ji,jj,1) 
    13031321         END_2D 
    13041322      END DO 
    1305       CALL lbc_lnk( 'icedyn_adv_umx', zslpx, 'U', -1.0_wp)   ! lateral boundary cond. 
    1306  
    1307       DO jl = 1, jpl 
    1308          DO_2D( 0, 0, 0, 0 ) 
     1323      IF( nn_hls == 1 )   CALL lbc_lnk( 'icedyn_adv_umx', zslpx, 'U', -1.0_wp)   ! lateral boundary cond. 
     1324 
     1325      DO jl = 1, jpl 
     1326         DO_2D( nn_hls-1, 0, 0, 0 ) 
    13091327            uCFL = pdt * ABS( pu(ji,jj) ) * r1_e1e2t(ji,jj) 
    13101328 
     
    13671385         END_2D 
    13681386      END DO 
    1369       CALL lbc_lnk( 'icedyn_adv_umx', pfu_ho, 'U', -1.0_wp)   ! lateral boundary cond. 
     1387      IF( nn_hls == 1 )   CALL lbc_lnk( 'icedyn_adv_umx', pfu_ho, 'U', -1.0_wp)   ! lateral boundary cond. 
    13701388      ! 
    13711389   END SUBROUTINE limiter_x 
     
    13901408      ! 
    13911409      DO jl = 1, jpl 
    1392          DO_2D( 0, 0, 0, 0 ) 
     1410         DO_2D( 0, 0, nn_hls, nn_hls-1 ) 
    13931411            zslpy(ji,jj,jl) = ( pt(ji,jj+1,jl) - pt(ji,jj,jl) ) * vmask(ji,jj,1) 
    13941412         END_2D 
    13951413      END DO 
    1396       CALL lbc_lnk( 'icedyn_adv_umx', zslpy, 'V', -1.0_wp)   ! lateral boundary cond. 
    1397  
    1398       DO jl = 1, jpl 
    1399          DO_2D( 0, 0, 0, 0 ) 
     1414      IF( nn_hls == 1 )   CALL lbc_lnk( 'icedyn_adv_umx', zslpy, 'V', -1.0_wp)   ! lateral boundary cond. 
     1415 
     1416      DO jl = 1, jpl 
     1417         DO_2D( 0, 0, nn_hls-1, 0 ) 
    14001418            vCFL = pdt * ABS( pv(ji,jj) ) * r1_e1e2t(ji,jj) 
    14011419 
     
    14591477         END_2D 
    14601478      END DO 
    1461       CALL lbc_lnk( 'icedyn_adv_umx', pfv_ho, 'V', -1.0_wp)   ! lateral boundary cond. 
     1479      IF( nn_hls == 1 )   CALL lbc_lnk( 'icedyn_adv_umx', pfv_ho, 'V', -1.0_wp)   ! lateral boundary cond. 
    14621480      ! 
    14631481   END SUBROUTINE limiter_y 
     
    14941512      ! 
    14951513      DO jl = 1, jpl 
    1496          DO_2D( 1, 1, 1, 1 ) 
     1514         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
    14971515            IF ( pv_i(ji,jj,jl) > 0._wp ) THEN 
    14981516               ! 
     
    15411559      !                                           ! -- check e_i/v_i -- ! 
    15421560      DO jl = 1, jpl 
    1543          DO_3D( 1, 1, 1, 1, 1, nlay_i ) 
     1561         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, nlay_i ) 
    15441562            IF ( pv_i(ji,jj,jl) > 0._wp ) THEN 
    15451563               ! if e_i/v_i is larger than the surrounding 9 pts => put the heat excess in the ocean 
     
    15551573      !                                           ! -- check e_s/v_s -- ! 
    15561574      DO jl = 1, jpl 
    1557          DO_3D( 1, 1, 1, 1, 1, nlay_s ) 
     1575         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, nlay_s ) 
    15581576            IF ( pv_s(ji,jj,jl) > 0._wp ) THEN 
    15591577               ! if e_s/v_s is larger than the surrounding 9 pts => put the heat excess in the ocean 
     
    15981616      ! -- check snow load -- ! 
    15991617      DO jl = 1, jpl 
    1600          DO_2D( 1, 1, 1, 1 ) 
     1618         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
    16011619            IF ( pv_i(ji,jj,jl) > 0._wp ) THEN 
    16021620               ! 
     
    16271645      !! ** Purpose :  compute the max of the 9 points around 
    16281646      !!---------------------------------------------------------------------- 
    1629       REAL(wp), DIMENSION(:,:,:)      , INTENT(in ) ::   pice   ! input 
    1630       REAL(wp), DIMENSION(:,:,:)      , INTENT(out) ::   pmax   ! output 
    1631       REAL(wp), DIMENSION(2:jpim1,jpj)              ::   zmax   ! temporary array 
     1647      REAL(wp), DIMENSION(:,:,:), INTENT(in ) ::   pice   ! input 
     1648      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pmax   ! output 
     1649      ! 
     1650      REAL(wp), DIMENSION(Nis0:Nie0) ::   zmax1, zmax2 
     1651      REAL(wp)                       ::   zmax3 
    16321652      INTEGER  ::   ji, jj, jl   ! dummy loop indices 
    16331653      !!---------------------------------------------------------------------- 
    1634       DO jl = 1, jpl 
    1635          DO jj = Njs0-1, Nje0+1 
    1636             DO ji = Nis0, Nie0 
    1637                zmax(ji,jj) = MAX( epsi20, pice(ji,jj,jl), pice(ji-1,jj,jl), pice(ji+1,jj,jl) ) 
    1638             END DO 
    1639          END DO 
    1640          DO jj = Njs0, Nje0 
    1641             DO ji = Nis0, Nie0 
    1642                pmax(ji,jj,jl) = MAX( epsi20, zmax(ji,jj), zmax(ji,jj-1), zmax(ji,jj+1) ) 
    1643             END DO 
    1644          END DO 
     1654      ! basic version: get the max of epsi20 + 9 neighbours 
     1655!!$      DO jl = 1, jpl 
     1656!!$         DO_2D( 0, 0, 0, 0 ) 
     1657!!$            pmax(ji,jj,jl) = MAX( epsi20, pice(ji-1,jj-1,jl), pice(ji,jj-1,jl), pice(ji+1,jj-1,jl),   & 
     1658!!$               &                          pice(ji-1,jj  ,jl), pice(ji,jj  ,jl), pice(ji+1,jj  ,jl),   & 
     1659!!$               &                          pice(ji-1,jj+1,jl), pice(ji,jj+1,jl), pice(ji+1,jj+1,jl) ) 
     1660!!$         END_2D 
     1661!!$      END DO 
     1662      ! optimized version : does a little bit more than 2 max of epsi20 + 3 neighbours 
     1663      DO jl = 1, jpl 
     1664         DO ji = Nis0, Nie0 
     1665            zmax1(ji) = MAX( epsi20, pice(ji,Njs0-1,jl), pice(ji-1,Njs0-1,jl), pice(ji+1,Njs0-1,jl) ) 
     1666            zmax2(ji) = MAX( epsi20, pice(ji,Njs0  ,jl), pice(ji-1,Njs0  ,jl), pice(ji+1,Njs0  ,jl) ) 
     1667         END DO 
     1668         DO_2D( 0, 0, 0, 0 ) 
     1669            zmax3 = MAX( epsi20, pice(ji,jj+1,jl), pice(ji-1,jj+1,jl), pice(ji+1,jj+1,jl) ) 
     1670            pmax(ji,jj,jl) = MAX( epsi20, zmax1(ji), zmax2(ji), zmax3 ) 
     1671            zmax1(ji) = zmax2(ji) 
     1672            zmax2(ji) = zmax3 
     1673         END_2D 
    16451674      END DO 
    16461675   END SUBROUTINE icemax3D 
     
    16511680      !! ** Purpose :  compute the max of the 9 points around 
    16521681      !!---------------------------------------------------------------------- 
    1653       REAL(wp), DIMENSION(:,:,:,:)    , INTENT(in ) ::   pice   ! input 
    1654       REAL(wp), DIMENSION(:,:,:,:)    , INTENT(out) ::   pmax   ! output 
    1655       REAL(wp), DIMENSION(2:jpim1,jpj)              ::   zmax   ! temporary array 
     1682      REAL(wp), DIMENSION(:,:,:,:), INTENT(in ) ::   pice   ! input 
     1683      REAL(wp), DIMENSION(:,:,:,:), INTENT(out) ::   pmax   ! output 
     1684      ! 
     1685      REAL(wp), DIMENSION(Nis0:Nie0) ::   zmax1, zmax2 
     1686      REAL(wp)                       ::   zmax3 
    16561687      INTEGER  ::   jlay, ji, jj, jk, jl   ! dummy loop indices 
    16571688      !!---------------------------------------------------------------------- 
    16581689      jlay = SIZE( pice , 3 )   ! size of input arrays 
     1690      ! basic version: get the max of epsi20 + 9 neighbours 
     1691!!$      DO jl = 1, jpl 
     1692!!$         DO jk = 1, jlay 
     1693!!$            DO_2D( 0, 0, 0, 0 ) 
     1694!!$               pmax(ji,jj,jk,jl) = MAX( epsi20, pice(ji-1,jj-1,jk,jl), pice(ji,jj-1,jk,jl), pice(ji+1,jj-1,jk,jl),   & 
     1695!!$                  &                             pice(ji-1,jj  ,jk,jl), pice(ji,jj  ,jk,jl), pice(ji+1,jj  ,jk,jl),   & 
     1696!!$                  &                             pice(ji-1,jj+1,jk,jl), pice(ji,jj+1,jk,jl), pice(ji+1,jj+1,jk,jl) ) 
     1697!!$            END_2D 
     1698!!$         END DO 
     1699!!$      END DO 
     1700      ! optimized version : does a little bit more than 2 max of epsi20 + 3 neighbours 
    16591701      DO jl = 1, jpl 
    16601702         DO jk = 1, jlay 
    1661             DO jj = Njs0-1, Nje0+1 
    1662                DO ji = Nis0, Nie0 
    1663                   zmax(ji,jj) = MAX( epsi20, pice(ji,jj,jk,jl), pice(ji-1,jj,jk,jl), pice(ji+1,jj,jk,jl) ) 
    1664                END DO 
    1665             END DO 
    1666             DO jj = Njs0, Nje0 
    1667                DO ji = Nis0, Nie0 
    1668                   pmax(ji,jj,jk,jl) = MAX( epsi20, zmax(ji,jj), zmax(ji,jj-1), zmax(ji,jj+1) ) 
    1669                END DO 
    1670             END DO 
     1703            DO ji = Nis0, Nie0 
     1704               zmax1(ji) = MAX( epsi20, pice(ji,Njs0-1,jk,jl), pice(ji-1,Njs0-1,jk,jl), pice(ji+1,Njs0-1,jk,jl) ) 
     1705               zmax2(ji) = MAX( epsi20, pice(ji,Njs0  ,jk,jl), pice(ji-1,Njs0  ,jk,jl), pice(ji+1,Njs0  ,jk,jl) ) 
     1706            END DO 
     1707            DO_2D( 0, 0, 0, 0 ) 
     1708               zmax3 = MAX( epsi20, pice(ji,jj+1,jk,jl), pice(ji-1,jj+1,jk,jl), pice(ji+1,jj+1,jk,jl) ) 
     1709               pmax(ji,jj,jk,jl) = MAX( epsi20, zmax1(ji), zmax2(ji), zmax3 ) 
     1710               zmax1(ji) = zmax2(ji) 
     1711               zmax2(ji) = zmax3 
     1712            END_2D 
    16711713         END DO 
    16721714      END DO 
Note: See TracChangeset for help on using the changeset viewer.