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 14834 for NEMO/trunk/src/OCE/DYN – NEMO

Ignore:
Timestamp:
2021-05-11T11:24:44+02:00 (3 years ago)
Author:
hadcv
Message:

#2600: Merge in dev_r14273_HPC-02_Daley_Tiling

Location:
NEMO/trunk/src/OCE/DYN
Files:
15 edited
2 copied

Legend:

Unmodified
Added
Removed
  • NEMO/trunk/src/OCE/DYN/divhor.F90

    r14820 r14834  
    6464      ! 
    6565      INTEGER  ::   ji, jj, jk    ! dummy loop indices 
    66       REAL(wp) ::   zraur, zdep   ! local scalars 
    67       REAL(wp), DIMENSION(jpi,jpj) :: ztmp 
    6866      !!---------------------------------------------------------------------- 
    6967      ! 
     
    7169      ! 
    7270      IF( kt == nit000 ) THEN 
    73          IF(lwp) WRITE(numout,*) 
    74          IF(lwp) WRITE(numout,*) 'div_hor : horizontal velocity divergence ' 
    75          IF(lwp) WRITE(numout,*) '~~~~~~~   ' 
    76          hdiv(:,:,:) = 0._wp    ! initialize hdiv for the halos at the first time step 
     71         IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     72            IF(lwp) WRITE(numout,*) 
     73            IF(lwp) WRITE(numout,*) 'div_hor : horizontal velocity divergence ' 
     74            IF(lwp) WRITE(numout,*) '~~~~~~~   ' 
     75         ENDIF 
     76         DO_3D_OVR( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk ) 
     77            hdiv(ji,jj,jk) = 0._wp    ! initialize hdiv for the halos at the first time step 
     78         END_3D 
    7779      ENDIF 
    7880      ! 
    79       DO_3D( 0, 0, 0, 0, 1, jpkm1 )                                    !==  Horizontal divergence  ==! 
     81      DO_3D_OVR( nn_hls-1, nn_hls, nn_hls-1, nn_hls, 1, jpkm1 )                                    !==  Horizontal divergence  ==! 
    8082         ! round brackets added to fix the order of floating point operations 
    8183         ! needed to ensure halo 1 - halo 2 compatibility 
     
    8486            &                )                                                             & ! bracket for halo 1 - halo 2 compatibility 
    8587            &              + ( e1v(ji,jj  ) * e3v(ji,jj  ,jk,Kmm) * vv(ji,jj  ,jk,Kmm)     & 
    86             &                - e1v(ji,jj-1) * e3v(ji,jj-1,jk,Kmm) * vv(ji,jj-1,jk,Kmm)     &  
     88            &                - e1v(ji,jj-1) * e3v(ji,jj-1,jk,Kmm) * vv(ji,jj-1,jk,Kmm)     & 
    8789            &                )                                                             & ! bracket for halo 1 - halo 2 compatibility 
    8890            &             )  * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 
     
    9597      !  
    9698#endif 
    97       ! 
    9899      IF( ln_isf )                      CALL isf_hdiv( kt, Kmm, hdiv )           !==  ice shelf         ==!   (update hdiv field) 
    99100      ! 
    100       CALL lbc_lnk( 'divhor', hdiv, 'T', 1.0_wp )   !   (no sign change) 
     101      IF (nn_hls==1) CALL lbc_lnk( 'divhor', hdiv, 'T', 1.0_wp )   !   (no sign change) 
    101102      ! 
    102103      IF( ln_timing )   CALL timing_stop('div_hor') 
  • NEMO/trunk/src/OCE/DYN/dynadv_cen2.F90

    r13497 r14834  
    5252      ! 
    5353      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    54       REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zfu_t, zfu_f, zfu_uw, zfu 
    55       REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zfv_t, zfv_f, zfv_vw, zfv, zfw 
     54      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::  zfu_t, zfu_f, zfu_uw, zfu 
     55      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::  zfv_t, zfv_f, zfv_vw, zfv, zfw 
    5656      !!---------------------------------------------------------------------- 
    5757      ! 
    58       IF( kt == nit000 .AND. lwp ) THEN 
    59          WRITE(numout,*) 
    60          WRITE(numout,*) 'dyn_adv_cen2 : 2nd order flux form momentum advection' 
    61          WRITE(numout,*) '~~~~~~~~~~~~' 
     58      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     59         IF( kt == nit000 .AND. lwp ) THEN 
     60            WRITE(numout,*) 
     61            WRITE(numout,*) 'dyn_adv_cen2 : 2nd order flux form momentum advection' 
     62            WRITE(numout,*) '~~~~~~~~~~~~' 
     63         ENDIF 
    6264      ENDIF 
    6365      ! 
     
    7072      ! 
    7173      DO jk = 1, jpkm1                    ! horizontal transport 
    72          zfu(:,:,jk) = 0.25_wp * e2u(:,:) * e3u(:,:,jk,Kmm) * puu(:,:,jk,Kmm) 
    73          zfv(:,:,jk) = 0.25_wp * e1v(:,:) * e3v(:,:,jk,Kmm) * pvv(:,:,jk,Kmm) 
     74         DO_2D( 1, 1, 1, 1 ) 
     75            zfu(ji,jj,jk) = 0.25_wp * e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * puu(ji,jj,jk,Kmm) 
     76            zfv(ji,jj,jk) = 0.25_wp * e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * pvv(ji,jj,jk,Kmm) 
     77         END_2D 
    7478         DO_2D( 1, 0, 1, 0 )              ! horizontal momentum fluxes (at T- and F-point) 
    7579            zfu_t(ji+1,jj  ,jk) = ( zfu(ji,jj,jk) + zfu(ji+1,jj,jk) ) * ( puu(ji,jj,jk,Kmm) + puu(ji+1,jj  ,jk,Kmm) ) 
  • NEMO/trunk/src/OCE/DYN/dynadv_ubs.F90

    r14820 r14834  
    7575      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    7676      REAL(wp) ::   zui, zvj, zfuj, zfvi, zl_u, zl_v   ! local scalars 
    77       REAL(wp), DIMENSION(jpi,jpj,jpk)   ::   zfu_t, zfu_f, zfu_uw, zfu 
    78       REAL(wp), DIMENSION(jpi,jpj,jpk)   ::   zfv_t, zfv_f, zfv_vw, zfv, zfw 
    79       REAL(wp), DIMENSION(jpi,jpj,jpk,2) ::   zlu_uu, zlu_uv 
    80       REAL(wp), DIMENSION(jpi,jpj,jpk,2) ::   zlv_vv, zlv_vu 
     77      REAL(wp), DIMENSION(A2D(nn_hls),jpk)   ::   zfu_t, zfu_f, zfu_uw, zfu 
     78      REAL(wp), DIMENSION(A2D(nn_hls),jpk)   ::   zfv_t, zfv_f, zfv_vw, zfv, zfw 
     79      REAL(wp), DIMENSION(A2D(nn_hls),jpk,2) ::   zlu_uu, zlu_uv 
     80      REAL(wp), DIMENSION(A2D(nn_hls),jpk,2) ::   zlv_vv, zlv_vu 
    8181      !!---------------------------------------------------------------------- 
    8282      ! 
    83       IF( kt == nit000 ) THEN 
    84          IF(lwp) WRITE(numout,*) 
    85          IF(lwp) WRITE(numout,*) 'dyn_adv_ubs : UBS flux form momentum advection' 
    86          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     83      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     84         IF( kt == nit000 ) THEN 
     85            IF(lwp) WRITE(numout,*) 
     86            IF(lwp) WRITE(numout,*) 'dyn_adv_ubs : UBS flux form momentum advection' 
     87            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     88         ENDIF 
    8789      ENDIF 
    8890      ! 
     
    105107         !                                   ! =========================== ! 
    106108         !                                         ! horizontal volume fluxes 
    107          zfu(:,:,jk) = e2u(:,:) * e3u(:,:,jk,Kmm) * puu(:,:,jk,Kmm) 
    108          zfv(:,:,jk) = e1v(:,:) * e3v(:,:,jk,Kmm) * pvv(:,:,jk,Kmm) 
     109         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
     110            zfu(ji,jj,jk) = e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * puu(ji,jj,jk,Kmm) 
     111            zfv(ji,jj,jk) = e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * pvv(ji,jj,jk,Kmm) 
     112         END_2D 
    109113         !             
    110          DO_2D( 0, 0, 0, 0 )                       ! laplacian 
     114         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )                       ! laplacian 
    111115            ! round brackets added to fix the order of floating point operations 
    112116            ! needed to ensure halo 1 - halo 2 compatibility 
    113             zlu_uu(ji,jj,jk,1) = ( (puu (ji+1,jj  ,jk,Kbb) - puu (ji  ,jj  ,jk,Kbb)) +                         & 
    114                &                   (puu (ji-1,jj  ,jk,Kbb) - puu (ji  ,jj  ,jk,Kbb)) ) * umask(ji  ,jj  ,jk) 
    115             zlv_vv(ji,jj,jk,1) = ( (pvv (ji  ,jj+1,jk,Kbb) - pvv (ji  ,jj  ,jk,Kbb)) +                         & 
    116                &                   (pvv (ji  ,jj-1,jk,Kbb) - pvv (ji  ,jj  ,jk,Kbb)) ) * vmask(ji  ,jj  ,jk) 
    117             zlu_uv(ji,jj,jk,1) = ( puu (ji  ,jj+1,jk,Kbb) - puu (ji  ,jj  ,jk,Kbb) ) * fmask(ji  ,jj  ,jk)   & 
    118                &               - ( puu (ji  ,jj  ,jk,Kbb) - puu (ji  ,jj-1,jk,Kbb) ) * fmask(ji  ,jj-1,jk) 
    119             zlv_vu(ji,jj,jk,1) = ( pvv (ji+1,jj  ,jk,Kbb) - pvv (ji  ,jj  ,jk,Kbb) ) * fmask(ji  ,jj  ,jk)   & 
    120                &               - ( pvv (ji  ,jj  ,jk,Kbb) - pvv (ji-1,jj  ,jk,Kbb) ) * fmask(ji-1,jj  ,jk) 
    121             ! 
    122             zlu_uu(ji,jj,jk,2) = ( (zfu(ji+1,jj  ,jk) - zfu(ji  ,jj  ,jk)) +                                   & 
    123                &                   (zfu(ji-1,jj  ,jk) - zfu(ji  ,jj  ,jk)) ) * umask(ji  ,jj  ,jk) 
    124             zlv_vv(ji,jj,jk,2) = ( (zfv(ji  ,jj+1,jk) - zfv(ji  ,jj  ,jk)) +                                   & 
    125                &                   (zfv(ji  ,jj-1,jk) - zfv(ji  ,jj  ,jk)) ) * vmask(ji  ,jj  ,jk) 
    126             zlu_uv(ji,jj,jk,2) = ( zfu(ji  ,jj+1,jk) - zfu(ji  ,jj  ,jk) ) * fmask(ji  ,jj  ,jk)   & 
    127                &               - ( zfu(ji  ,jj  ,jk) - zfu(ji  ,jj-1,jk) ) * fmask(ji  ,jj-1,jk) 
    128             zlv_vu(ji,jj,jk,2) = ( zfv(ji+1,jj  ,jk) - zfv(ji  ,jj  ,jk) ) * fmask(ji  ,jj  ,jk)   & 
    129                &               - ( zfv(ji  ,jj  ,jk) - zfv(ji-1,jj  ,jk) ) * fmask(ji-1,jj  ,jk) 
     117            zlu_uu(ji,jj,jk,1) = ( ( puu (ji+1,jj  ,jk,Kbb) - puu (ji  ,jj  ,jk,Kbb) & 
     118               &                   )                                                 & ! bracket for halo 1 - halo 2 compatibility 
     119               &                 + ( puu (ji-1,jj  ,jk,Kbb) - puu (ji  ,jj  ,jk,Kbb) & 
     120               &                   )                                                 & ! bracket for halo 1 - halo 2 compatibility 
     121               &                 ) * umask(ji  ,jj  ,jk) 
     122            zlv_vv(ji,jj,jk,1) = ( ( pvv (ji  ,jj+1,jk,Kbb) - pvv (ji  ,jj  ,jk,Kbb) & 
     123               &                   )                                                 & ! bracket for halo 1 - halo 2 compatibility 
     124               &                 + ( pvv (ji  ,jj-1,jk,Kbb) - pvv (ji  ,jj  ,jk,Kbb) & 
     125               &                   )                                                 & ! bracket for halo 1 - halo 2 compatibility 
     126               &                 ) * vmask(ji  ,jj  ,jk) 
     127            zlu_uv(ji,jj,jk,1) = (  puu (ji  ,jj+1,jk,Kbb) - puu (ji  ,jj  ,jk,Kbb)  ) * fmask(ji  ,jj  ,jk)   & 
     128               &               - (  puu (ji  ,jj  ,jk,Kbb) - puu (ji  ,jj-1,jk,Kbb)  ) * fmask(ji  ,jj-1,jk) 
     129            zlv_vu(ji,jj,jk,1) = (  pvv (ji+1,jj  ,jk,Kbb) - pvv (ji  ,jj  ,jk,Kbb)  ) * fmask(ji  ,jj  ,jk)   & 
     130               &               - (  pvv (ji  ,jj  ,jk,Kbb) - pvv (ji-1,jj  ,jk,Kbb)  ) * fmask(ji-1,jj  ,jk) 
     131            ! 
     132            ! round brackets added to fix the order of floating point operations 
     133            ! needed to ensure halo 1 - halo 2 compatibility 
     134            zlu_uu(ji,jj,jk,2) = ( ( zfu(ji+1,jj  ,jk) - zfu(ji  ,jj  ,jk)           & 
     135               &                   )                                                 & ! bracket for halo 1 - halo 2 compatibility 
     136               &                 + ( zfu(ji-1,jj  ,jk) - zfu(ji  ,jj  ,jk)           & 
     137               &                   )                                                 & ! bracket for halo 1 - halo 2 compatibility 
     138               &                 ) * umask(ji  ,jj  ,jk) 
     139            zlv_vv(ji,jj,jk,2) = ( ( zfv(ji  ,jj+1,jk) - zfv(ji  ,jj  ,jk)           & 
     140               &                   )                                                 & ! bracket for halo 1 - halo 2 compatibility 
     141               &                 + ( zfv(ji  ,jj-1,jk) - zfv(ji  ,jj  ,jk)           & 
     142               &                   )                                                 & ! bracket for halo 1 - halo 2 compatibility 
     143               &                 ) * vmask(ji  ,jj  ,jk) 
     144            zlu_uv(ji,jj,jk,2) = (  zfu(ji  ,jj+1,jk) - zfu(ji  ,jj  ,jk)  ) * fmask(ji  ,jj  ,jk)             & 
     145               &               - (  zfu(ji  ,jj  ,jk) - zfu(ji  ,jj-1,jk)  ) * fmask(ji  ,jj-1,jk) 
     146            zlv_vu(ji,jj,jk,2) = (  zfv(ji+1,jj  ,jk) - zfv(ji  ,jj  ,jk)  ) * fmask(ji  ,jj  ,jk)             & 
     147               &               - (  zfv(ji  ,jj  ,jk) - zfv(ji-1,jj  ,jk)  ) * fmask(ji-1,jj  ,jk) 
    130148         END_2D 
    131149      END DO 
    132       CALL lbc_lnk( 'dynadv_ubs', zlu_uu(:,:,:,1), 'U', -1.0_wp , zlu_uv(:,:,:,1), 'U', -1.0_wp,  & 
    133          &                        zlu_uu(:,:,:,2), 'U', -1.0_wp , zlu_uv(:,:,:,2), 'U', -1.0_wp,  & 
    134          &                        zlv_vv(:,:,:,1), 'V', -1.0_wp , zlv_vu(:,:,:,1), 'V', -1.0_wp,  & 
    135          &                        zlv_vv(:,:,:,2), 'V', -1.0_wp , zlv_vu(:,:,:,2), 'V', -1.0_wp   ) 
     150      IF( nn_hls == 1 ) CALL lbc_lnk( 'dynadv_ubs', zlu_uu(:,:,:,1), 'U', -1.0_wp , zlu_uv(:,:,:,1), 'U', -1.0_wp,  & 
     151                                              &   zlu_uu(:,:,:,2), 'U', -1.0_wp , zlu_uv(:,:,:,2), 'U', -1.0_wp,  & 
     152                                              &   zlv_vv(:,:,:,1), 'V', -1.0_wp , zlv_vu(:,:,:,1), 'V', -1.0_wp,  & 
     153                                              &   zlv_vv(:,:,:,2), 'V', -1.0_wp , zlv_vu(:,:,:,2), 'V', -1.0_wp   ) 
    136154      ! 
    137155      !                                      ! ====================== ! 
     
    139157      DO jk = 1, jpkm1                       ! ====================== ! 
    140158         !                                         ! horizontal volume fluxes 
    141          zfu(:,:,jk) = 0.25_wp * e2u(:,:) * e3u(:,:,jk,Kmm) * puu(:,:,jk,Kmm) 
    142          zfv(:,:,jk) = 0.25_wp * e1v(:,:) * e3v(:,:,jk,Kmm) * pvv(:,:,jk,Kmm) 
     159         DO_2D( 1, 1, 1, 1 ) 
     160            zfu(ji,jj,jk) = 0.25_wp * e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * puu(ji,jj,jk,Kmm) 
     161            zfv(ji,jj,jk) = 0.25_wp * e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * pvv(ji,jj,jk,Kmm) 
     162         END_2D 
    143163         ! 
    144164         DO_2D( 1, 0, 1, 0 )                       ! horizontal momentum fluxes at T- and F-point 
  • NEMO/trunk/src/OCE/DYN/dynatf.F90

    r14433 r14834  
    201201         IF( ln_linssh ) THEN             ! Fixed volume ! 
    202202            !                             ! =============! 
    203             DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
     203            DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 ) 
    204204               puu(ji,jj,jk,Kmm) = puu(ji,jj,jk,Kmm) + rn_atfp * ( puu(ji,jj,jk,Kbb) - 2._wp * puu(ji,jj,jk,Kmm) + puu(ji,jj,jk,Kaa) ) 
    205205               pvv(ji,jj,jk,Kmm) = pvv(ji,jj,jk,Kmm) + rn_atfp * ( pvv(ji,jj,jk,Kbb) - 2._wp * pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk,Kaa) ) 
     
    237237               CALL dom_vvl_interpol( pe3t(:,:,:,Kmm), pe3u(:,:,:,Kmm), 'U' ) 
    238238               CALL dom_vvl_interpol( pe3t(:,:,:,Kmm), pe3v(:,:,:,Kmm), 'V' ) 
    239                DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
     239               DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 ) 
    240240                  puu(ji,jj,jk,Kmm) = puu(ji,jj,jk,Kmm) + rn_atfp * ( puu(ji,jj,jk,Kbb) - 2._wp * puu(ji,jj,jk,Kmm) + puu(ji,jj,jk,Kaa) ) 
    241241                  pvv(ji,jj,jk,Kmm) = pvv(ji,jj,jk,Kmm) + rn_atfp * ( pvv(ji,jj,jk,Kbb) - 2._wp * pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk,Kaa) ) 
     
    248248               CALL dom_vvl_interpol( pe3t(:,:,:,Kmm), ze3u_f, 'U' ) 
    249249               CALL dom_vvl_interpol( pe3t(:,:,:,Kmm), ze3v_f, 'V' ) 
    250                DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
     250               DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 ) 
    251251                  zue3a = pe3u(ji,jj,jk,Kaa) * puu(ji,jj,jk,Kaa) 
    252252                  zve3a = pe3v(ji,jj,jk,Kaa) * pvv(ji,jj,jk,Kaa) 
     
    285285      ENDIF ! .NOT. l_1st_euler 
    286286      ! 
     287      ! This is needed for dyn_ldf_blp to be restartable 
     288      IF( nn_hls == 2 ) CALL lbc_lnk( 'dynatf', puu(:,:,:,Kmm), 'U', -1.0_wp, pvv(:,:,:,Kmm), 'V', -1.0_wp ) 
    287289      ! Set "now" and "before" barotropic velocities for next time step: 
    288290      ! JC: Would be more clever to swap variables than to make a full vertical 
  • NEMO/trunk/src/OCE/DYN/dynatf_qco.F90

    r14475 r14834  
    139139         IF( ln_linssh ) THEN             ! Fixed volume ! 
    140140            !                             ! =============! 
    141             DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
     141            DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 ) 
    142142               puu(ji,jj,jk,Kmm) = puu(ji,jj,jk,Kmm) + rn_atfp * ( puu(ji,jj,jk,Kbb) - 2._wp * puu(ji,jj,jk,Kmm) + puu(ji,jj,jk,Kaa) ) 
    143143               pvv(ji,jj,jk,Kmm) = pvv(ji,jj,jk,Kmm) + rn_atfp * ( pvv(ji,jj,jk,Kbb) - 2._wp * pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk,Kaa) ) 
     
    149149            IF( ln_dynadv_vec ) THEN      ! Asselin filter applied on velocity 
    150150               ! Before filtered scale factor at (u/v)-points 
    151                DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
     151               DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 ) 
    152152                  puu(ji,jj,jk,Kmm) = puu(ji,jj,jk,Kmm) + rn_atfp * ( puu(ji,jj,jk,Kbb) - 2._wp * puu(ji,jj,jk,Kmm) + puu(ji,jj,jk,Kaa) ) 
    153153                  pvv(ji,jj,jk,Kmm) = pvv(ji,jj,jk,Kmm) + rn_atfp * ( pvv(ji,jj,jk,Kbb) - 2._wp * pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk,Kaa) ) 
     
    156156            ELSE                          ! Asselin filter applied on thickness weighted velocity 
    157157               ! 
    158                DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
     158               DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 ) 
    159159                  zue3a = ( 1._wp + r3u(ji,jj,Kaa) * umask(ji,jj,jk) ) * puu(ji,jj,jk,Kaa) 
    160160                  zve3a = ( 1._wp + r3v(ji,jj,Kaa) * vmask(ji,jj,jk) ) * pvv(ji,jj,jk,Kaa) 
     
    195195      ENDIF ! .NOT. l_1st_euler 
    196196      ! 
     197      ! This is needed for dyn_ldf_blp to be restartable 
     198      IF( nn_hls == 2 ) CALL lbc_lnk( 'dynatfqco', puu(:,:,:,Kmm), 'U', -1.0_wp, pvv(:,:,:,Kmm), 'V', -1.0_wp ) 
     199 
    197200      ! Set "now" and "before" barotropic velocities for next time step: 
    198201      ! JC: Would be more clever to swap variables than to make a full vertical 
  • NEMO/trunk/src/OCE/DYN/dynhpg.F90

    r14433 r14834  
    266266      INTEGER  ::   ji, jj, jk       ! dummy loop indices 
    267267      REAL(wp) ::   zcoef0, zcoef1   ! temporary scalars 
    268       REAL(wp), DIMENSION(jpi,jpj) ::  zhpi, zhpj 
    269       !!---------------------------------------------------------------------- 
    270       ! 
    271       IF( kt == nit000 ) THEN 
    272          IF(lwp) WRITE(numout,*) 
    273          IF(lwp) WRITE(numout,*) 'dyn:hpg_zco : hydrostatic pressure gradient trend' 
    274          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   z-coordinate case ' 
     268      REAL(wp), DIMENSION(A2D(nn_hls)) ::  zhpi, zhpj 
     269      !!---------------------------------------------------------------------- 
     270      ! 
     271      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     272         IF( kt == nit000 ) THEN 
     273            IF(lwp) WRITE(numout,*) 
     274            IF(lwp) WRITE(numout,*) 'dyn:hpg_zco : hydrostatic pressure gradient trend' 
     275            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   z-coordinate case ' 
     276         ENDIF 
    275277      ENDIF 
    276278      ! 
     
    318320      INTEGER  ::   iku, ikv                         ! temporary integers 
    319321      REAL(wp) ::   zcoef0, zcoef1, zcoef2, zcoef3   ! temporary scalars 
    320       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zhpi, zhpj 
    321       REAL(wp), DIMENSION(jpi,jpj,jpts)   :: zgtsu, zgtsv 
    322       REAL(wp), DIMENSION(jpi,jpj)     :: zgru, zgrv 
    323       !!---------------------------------------------------------------------- 
    324       ! 
    325       IF( kt == nit000 ) THEN 
    326          IF(lwp) WRITE(numout,*) 
    327          IF(lwp) WRITE(numout,*) 'dyn:hpg_zps : hydrostatic pressure gradient trend' 
    328          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   z-coordinate with partial steps - vector optimization' 
     322      REAL(wp), DIMENSION(A2D(nn_hls),jpk ) :: zhpi, zhpj 
     323      REAL(wp), DIMENSION(A2D(nn_hls),jpts) :: zgtsu, zgtsv 
     324      REAL(wp), DIMENSION(A2D(nn_hls)     ) :: zgru, zgrv 
     325      !!---------------------------------------------------------------------- 
     326      ! 
     327      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     328         IF( kt == nit000 ) THEN 
     329            IF(lwp) WRITE(numout,*) 
     330            IF(lwp) WRITE(numout,*) 'dyn:hpg_zps : hydrostatic pressure gradient trend' 
     331            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   z-coordinate with partial steps - vector optimization' 
     332         ENDIF 
    329333      ENDIF 
    330334 
     
    410414      REAL(wp) ::   zcoef0, zuap, zvap, ztmp       ! local scalars 
    411415      LOGICAL  ::   ll_tmp1, ll_tmp2               ! local logical variables 
    412       REAL(wp), DIMENSION(jpi,jpj,jpk)      ::   zhpi, zhpj 
     416      REAL(wp), DIMENSION(A2D(nn_hls),jpk)  ::   zhpi, zhpj 
    413417      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zcpx, zcpy   !W/D pressure filter 
    414418      !!---------------------------------------------------------------------- 
    415419      ! 
    416       IF( ln_wd_il ) ALLOCATE(zcpx(jpi,jpj), zcpy(jpi,jpj)) 
    417       ! 
    418       IF( kt == nit000 ) THEN 
    419          IF(lwp) WRITE(numout,*) 
    420          IF(lwp) WRITE(numout,*) 'dyn:hpg_sco : hydrostatic pressure gradient trend' 
    421          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   s-coordinate case, OCE original scheme used' 
     420      IF( ln_wd_il ) ALLOCATE(zcpx(A2D(nn_hls)), zcpy(A2D(nn_hls))) 
     421      ! 
     422      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     423         IF( kt == nit000 ) THEN 
     424            IF(lwp) WRITE(numout,*) 
     425            IF(lwp) WRITE(numout,*) 'dyn:hpg_sco : hydrostatic pressure gradient trend' 
     426            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   s-coordinate case, OCE original scheme used' 
     427         ENDIF 
    422428      ENDIF 
    423429      ! 
     
    462468          END IF 
    463469        END_2D 
    464         CALL lbc_lnk( 'dynhpg', zcpx, 'U', 1.0_wp, zcpy, 'V', 1.0_wp ) 
    465470      END IF 
    466471      ! 
     
    548553      REAL(wp) ::   ze3w, ze3wi1, ze3wj1   ! local scalars 
    549554      REAL(wp) ::   zcoef0, zuap, zvap     !   -      - 
    550       REAL(wp), DIMENSION(jpi,jpj,jpk ) ::  zhpi, zhpj 
    551       REAL(wp), DIMENSION(jpi,jpj,jpts) ::  zts_top 
    552       REAL(wp), DIMENSION(jpi,jpj)      ::  zrhdtop_oce 
     555      REAL(wp), DIMENSION(A2D(nn_hls),jpk ) ::  zhpi, zhpj 
     556      REAL(wp), DIMENSION(A2D(nn_hls),jpts) ::  zts_top 
     557      REAL(wp), DIMENSION(A2D(nn_hls))      ::  zrhdtop_oce 
    553558      !!---------------------------------------------------------------------- 
    554559      ! 
     
    560565      ! compute rhd at the ice/oce interface (ocean side) 
    561566      ! usefull to reduce residual current in the test case ISOMIP with no melting 
    562       DO ji = 1, jpi 
    563         DO jj = 1, jpj 
    564           ikt = mikt(ji,jj) 
    565           zts_top(ji,jj,1) = ts(ji,jj,ikt,1,Kmm) 
    566           zts_top(ji,jj,2) = ts(ji,jj,ikt,2,Kmm) 
    567         END DO 
    568       END DO 
     567      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
     568         ikt = mikt(ji,jj) 
     569         zts_top(ji,jj,1) = ts(ji,jj,ikt,1,Kmm) 
     570         zts_top(ji,jj,2) = ts(ji,jj,ikt,2,Kmm) 
     571      END_2D 
    569572      CALL eos( zts_top, risfdep, zrhdtop_oce ) 
    570573 
     
    636639      INTEGER  ::   iktb, iktt          ! jk indices at tracer points for top and bottom points  
    637640      REAL(wp) ::   zcoef0, zep, cffw   ! temporary scalars 
    638       REAL(wp) ::   z_grav_10, z1_12 
     641      REAL(wp) ::   z_grav_10, z1_12, z1_cff 
    639642      REAL(wp) ::   cffu, cffx          !    "         " 
    640643      REAL(wp) ::   cffv, cffy          !    "         " 
    641644      LOGICAL  ::   ll_tmp1, ll_tmp2    ! local logical variables 
    642       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zhpi, zhpj 
    643   
    644       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zdzx, zdzy, zdzz                          ! Primitive grid differences ('delta_xyz') 
    645       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zdz_i, zdz_j, zdz_k                       ! Harmonic average of primitive grid differences ('d_xyz') 
    646       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zdrhox, zdrhoy, zdrhoz                    ! Primitive rho differences ('delta_rho') 
    647       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zdrho_i, zdrho_j, zdrho_k                 ! Harmonic average of primitive rho differences ('d_rho') 
    648       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   z_rho_i, z_rho_j, z_rho_k                 ! Face intergrals 
    649       REAL(wp), DIMENSION(jpi,jpj)     ::   zz_dz_i, zz_dz_j, zz_drho_i, zz_drho_j    ! temporary arrays  
     645      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zhpi, zhpj 
     646 
     647      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zdzx, zdzy, zdzz                          ! Primitive grid differences ('delta_xyz') 
     648      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zdz_i, zdz_j, zdz_k                       ! Harmonic average of primitive grid differences ('d_xyz') 
     649      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zdrhox, zdrhoy, zdrhoz                    ! Primitive rho differences ('delta_rho') 
     650      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zdrho_i, zdrho_j, zdrho_k                 ! Harmonic average of primitive rho differences ('d_rho') 
     651      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   z_rho_i, z_rho_j, z_rho_k                 ! Face intergrals 
     652      REAL(wp), DIMENSION(A2D(nn_hls))     ::   zz_dz_i, zz_dz_j, zz_drho_i, zz_drho_j    ! temporary arrays 
    650653      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zcpx, zcpy   !W/D pressure filter 
    651654      !!---------------------------------------------------------------------- 
    652655      ! 
    653656      IF( ln_wd_il ) THEN 
    654          ALLOCATE( zcpx(jpi,jpj) , zcpy(jpi,jpj) ) 
     657         ALLOCATE( zcpx(A2D(nn_hls)) , zcpy(A2D(nn_hls)) ) 
    655658        DO_2D( 0, 0, 0, 0 ) 
    656659          ll_tmp1 = MIN(  ssh(ji,jj,Kmm)              ,  ssh(ji+1,jj,Kmm) ) >                & 
     
    689692          END IF 
    690693        END_2D 
    691         CALL lbc_lnk( 'dynhpg', zcpx, 'U', 1.0_wp, zcpy, 'V', 1.0_wp ) 
    692694      END IF 
    693695 
    694       IF( kt == nit000 ) THEN 
    695          IF(lwp) WRITE(numout,*) 
    696          IF(lwp) WRITE(numout,*) 'dyn:hpg_djc : hydrostatic pressure gradient trend' 
    697          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   s-coordinate case, density Jacobian with cubic polynomial scheme' 
     696      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     697         IF( kt == nit000 ) THEN 
     698            IF(lwp) WRITE(numout,*) 
     699            IF(lwp) WRITE(numout,*) 'dyn:hpg_djc : hydrostatic pressure gradient trend' 
     700            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   s-coordinate case, density Jacobian with cubic polynomial scheme' 
     701         ENDIF 
    698702      ENDIF 
    699703 
     
    723727      zdz_k  (:,:,:) = 0._wp 
    724728 
    725       DO_3D( 1, 1, 1, 1, 2, jpk-2 )  
    726          cffw = 2._wp * zdrhoz(ji  ,jj  ,jk) * zdrhoz(ji,jj,jk+1) 
    727          IF( cffw > zep) THEN 
    728             zdrho_k(ji,jj,jk) = cffw / ( zdrhoz(ji,jj,jk) + zdrhoz(ji,jj,jk+1) ) 
    729          ENDIF 
     729      DO_3D( 1, 1, 1, 1, 2, jpk-2 ) 
     730         cffw = MAX( 2._wp * zdrhoz(ji,jj,jk) * zdrhoz(ji,jj,jk+1), 0._wp ) 
     731         z1_cff = zdrhoz(ji,jj,jk) + zdrhoz(ji,jj,jk+1) 
     732         zdrho_k(ji,jj,jk) = cffw / SIGN( MAX( ABS(z1_cff), zep ), z1_cff ) 
    730733         zdz_k(ji,jj,jk) = 2._wp *   zdzz(ji,jj,jk) * zdzz(ji,jj,jk+1)   & 
    731734            &                  / ( zdzz(ji,jj,jk) + zdzz(ji,jj,jk+1) ) 
     
    737740 
    738741! mb for sea-ice shelves we will need to re-write this upper boundary condition in the same form as the lower boundary condition 
    739       zdrho_k(:,:,1) = aco_bc_vrt * ( rhd    (:,:,2) - rhd    (:,:,1) ) - bco_bc_vrt * zdrho_k(:,:,2) 
    740       zdz_k  (:,:,1) = aco_bc_vrt * (-gde3w(:,:,2) + gde3w(:,:,1) ) - bco_bc_vrt * zdz_k  (:,:,2) 
     742      DO_2D( 1, 1, 1, 1 ) 
     743         zdrho_k(ji,jj,1) = aco_bc_vrt * ( rhd  (ji,jj,2) - rhd  (ji,jj,1) ) - bco_bc_vrt * zdrho_k(ji,jj,2) 
     744         zdz_k  (ji,jj,1) = aco_bc_vrt * (-gde3w(ji,jj,2) + gde3w(ji,jj,1) ) - bco_bc_vrt * zdz_k  (ji,jj,2) 
     745      END_2D 
    741746 
    742747      DO_2D( 1, 1, 1, 1 ) 
     
    785790      !  5. compute and store elementary horizontal differences in provisional arrays  
    786791      !---------------------------------------------------------------------------------------- 
    787  
    788       DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 
    789          zdrhox(ji,jj,jk) =   rhd    (ji+1,jj  ,jk) - rhd    (ji,jj,jk  ) 
    790          zdzx  (ji,jj,jk) = - gde3w(ji+1,jj  ,jk) + gde3w(ji,jj,jk  ) 
    791          zdrhoy(ji,jj,jk) =   rhd    (ji  ,jj+1,jk) - rhd    (ji,jj,jk  ) 
    792          zdzy  (ji,jj,jk) = - gde3w(ji  ,jj+1,jk) + gde3w(ji,jj,jk  ) 
    793       END_3D 
    794  
    795       CALL lbc_lnk( 'dynhpg', zdrhox, 'U', 1., zdzx, 'U', 1., zdrhoy, 'V', 1., zdzy, 'V', 1. )  
     792      zdrhox(:,:,:) = 0._wp 
     793      zdzx  (:,:,:) = 0._wp 
     794      zdrhoy(:,:,:) = 0._wp 
     795      zdzy  (:,:,:) = 0._wp 
     796 
     797      DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) 
     798         zdrhox(ji,jj,jk) = rhd  (ji+1,jj  ,jk) - rhd  (ji  ,jj  ,jk) 
     799         zdzx  (ji,jj,jk) = gde3w(ji  ,jj  ,jk) - gde3w(ji+1,jj  ,jk) 
     800         zdrhoy(ji,jj,jk) = rhd  (ji  ,jj+1,jk) - rhd  (ji  ,jj  ,jk) 
     801         zdzy  (ji,jj,jk) = gde3w(ji  ,jj  ,jk) - gde3w(ji  ,jj+1,jk) 
     802      END_3D 
     803 
     804      IF( nn_hls == 1 ) CALL lbc_lnk( 'dynhpg', zdrhox, 'U', -1._wp, zdzx, 'U', -1._wp, zdrhoy, 'V', -1._wp, zdzy, 'V', -1._wp ) 
    796805 
    797806      !------------------------------------------------------------------------- 
     
    800809 
    801810      DO_3D( 0, 1, 0, 1, 1, jpkm1 ) 
    802          cffu = 2._wp * zdrhox(ji-1,jj  ,jk) * zdrhox(ji,jj,jk  ) 
    803          IF( cffu > zep ) THEN 
    804             zdrho_i(ji,jj,jk) = cffu / ( zdrhox(ji-1,jj,jk) + zdrhox(ji,jj,jk) ) 
    805          ELSE 
    806             zdrho_i(ji,jj,jk ) = 0._wp 
    807          ENDIF 
    808  
    809          cffx = 2._wp * zdzx  (ji-1,jj  ,jk) * zdzx  (ji,jj,jk  ) 
    810          IF( cffx > zep ) THEN 
    811             zdz_i(ji,jj,jk) = cffx / ( zdzx(ji-1,jj,jk) + zdzx(ji,jj,jk) ) 
    812          ELSE 
    813             zdz_i(ji,jj,jk) = 0._wp 
    814          ENDIF 
    815  
    816          cffv = 2._wp * zdrhoy(ji  ,jj-1,jk) * zdrhoy(ji,jj,jk  ) 
    817          IF( cffv > zep ) THEN 
    818             zdrho_j(ji,jj,jk) = cffv / ( zdrhoy(ji,jj-1,jk) + zdrhoy(ji,jj,jk) ) 
    819          ELSE 
    820             zdrho_j(ji,jj,jk) = 0._wp 
    821          ENDIF 
    822  
    823          cffy = 2._wp * zdzy  (ji  ,jj-1,jk) * zdzy  (ji,jj,jk  ) 
    824          IF( cffy > zep ) THEN 
    825             zdz_j(ji,jj,jk) = cffy / ( zdzy(ji,jj-1,jk) + zdzy(ji,jj,jk) ) 
    826          ELSE 
    827             zdz_j(ji,jj,jk) = 0._wp 
    828          ENDIF 
     811         cffu = MAX( 2._wp * zdrhox(ji-1,jj,jk) * zdrhox(ji,jj,jk), 0._wp ) 
     812         z1_cff = zdrhox(ji-1,jj,jk) + zdrhox(ji,jj,jk) 
     813         zdrho_i(ji,jj,jk) = cffu / SIGN( MAX( ABS(z1_cff), zep ), z1_cff ) 
     814 
     815         cffx = MAX( 2._wp * zdzx(ji-1,jj,jk)   * zdzx(ji,jj,jk), 0._wp ) 
     816         z1_cff = zdzx(ji-1,jj,jk)   + zdzx(ji,jj,jk) 
     817         zdz_i(ji,jj,jk)   = cffx / SIGN( MAX( ABS(z1_cff), zep ), z1_cff ) 
     818 
     819         cffv = MAX( 2._wp * zdrhoy(ji,jj-1,jk) * zdrhoy(ji,jj,jk), 0._wp ) 
     820         z1_cff = zdrhoy(ji,jj-1,jk) + zdrhoy(ji,jj,jk) 
     821         zdrho_j(ji,jj,jk) = cffv / SIGN( MAX( ABS(z1_cff), zep ), z1_cff ) 
     822 
     823         cffy = MAX( 2._wp * zdzy(ji,jj-1,jk)   * zdzy(ji,jj,jk), 0._wp ) 
     824         z1_cff = zdzy(ji,jj-1,jk)   + zdzy(ji,jj,jk) 
     825         zdz_j(ji,jj,jk)   = cffy / SIGN( MAX( ABS(z1_cff), zep ), z1_cff ) 
    829826      END_3D 
    830827       
     
    840837         zz_drho_j(:,:) = zdrho_j(:,:,jk) 
    841838         zz_dz_j  (:,:) = zdz_j  (:,:,jk) 
    842          DO_2D( 0, 1, 0, 1) 
    843             ! Walls coming from left: should check from 2 to jpi-1 (and jpj=2-jpj) 
    844             IF (ji < jpi) THEN 
    845                IF ( umask(ji,jj,jk) > 0.5_wp .AND. umask(ji-1,jj,jk) < 0.5_wp .AND. umask(ji+1,jj,jk) > 0.5_wp)  THEN   
    846                   zz_drho_i(ji,jj) = aco_bc_hor * ( rhd    (ji+1,jj,jk) - rhd    (ji,jj,jk) ) - bco_bc_hor * zdrho_i(ji+1,jj,jk)  
    847                   zz_dz_i  (ji,jj) = aco_bc_hor * (-gde3w(ji+1,jj,jk) + gde3w(ji,jj,jk) ) - bco_bc_hor * zdz_i  (ji+1,jj,jk) 
    848                END IF 
     839         ! Walls coming from left: should check from 2 to jpi-1 (and jpj=2-jpj) 
     840         DO_2D( 0, 0, 0, 1 ) 
     841            IF ( umask(ji,jj,jk) > 0.5_wp .AND. umask(ji-1,jj,jk) < 0.5_wp .AND. umask(ji+1,jj,jk) > 0.5_wp)  THEN 
     842               zz_drho_i(ji,jj) = aco_bc_hor * ( rhd    (ji+1,jj,jk) - rhd    (ji,jj,jk) ) - bco_bc_hor * zdrho_i(ji+1,jj,jk) 
     843               zz_dz_i  (ji,jj) = aco_bc_hor * (-gde3w(ji+1,jj,jk) + gde3w(ji,jj,jk) ) - bco_bc_hor * zdz_i  (ji+1,jj,jk) 
    849844            END IF 
    850             ! Walls coming from right: should check from 3 to jpi (and jpj=2-jpj) 
    851             IF (ji > 2) THEN 
    852                IF ( umask(ji,jj,jk) < 0.5_wp .AND. umask(ji-1,jj,jk) > 0.5_wp .AND. umask(ji-2,jj,jk) > 0.5_wp) THEN 
    853                   zz_drho_i(ji,jj) = aco_bc_hor * ( rhd    (ji,jj,jk) - rhd    (ji-1,jj,jk) ) - bco_bc_hor * zdrho_i(ji-1,jj,jk)   
    854                   zz_dz_i  (ji,jj) = aco_bc_hor * (-gde3w(ji,jj,jk) + gde3w(ji-1,jj,jk) ) - bco_bc_hor * zdz_i  (ji-1,jj,jk) 
    855                END IF 
     845         END_2D 
     846         ! Walls coming from right: should check from 3 to jpi (and jpj=2-jpj) 
     847         DO_2D( -1, 1, 0, 1 ) 
     848            IF ( umask(ji,jj,jk) < 0.5_wp .AND. umask(ji-1,jj,jk) > 0.5_wp .AND. umask(ji-2,jj,jk) > 0.5_wp) THEN 
     849               zz_drho_i(ji,jj) = aco_bc_hor * ( rhd    (ji,jj,jk) - rhd    (ji-1,jj,jk) ) - bco_bc_hor * zdrho_i(ji-1,jj,jk) 
     850               zz_dz_i  (ji,jj) = aco_bc_hor * (-gde3w(ji,jj,jk) + gde3w(ji-1,jj,jk) ) - bco_bc_hor * zdz_i  (ji-1,jj,jk) 
    856851            END IF 
    857             ! Walls coming from left: should check from 2 to jpj-1 (and jpi=2-jpi) 
    858             IF (jj < jpj) THEN 
    859                IF ( vmask(ji,jj,jk) > 0.5_wp .AND. vmask(ji,jj-1,jk) < 0.5_wp .AND. vmask(ji,jj+1,jk) > 0.5_wp)  THEN 
    860                   zz_drho_j(ji,jj) = aco_bc_hor * ( rhd    (ji,jj+1,jk) - rhd    (ji,jj,jk) ) - bco_bc_hor * zdrho_j(ji,jj+1,jk) 
    861                   zz_dz_j  (ji,jj) = aco_bc_hor * (-gde3w(ji,jj+1,jk) + gde3w(ji,jj,jk) ) - bco_bc_hor * zdz_j  (ji,jj+1,jk) 
    862                END IF 
    863             END IF  
    864             ! Walls coming from right: should check from 3 to jpj (and jpi=2-jpi) 
    865             IF (jj > 2) THEN 
    866                IF ( vmask(ji,jj,jk) < 0.5_wp .AND. vmask(ji,jj-1,jk) > 0.5_wp .AND. vmask(ji,jj-2,jk) > 0.5_wp) THEN  
    867                   zz_drho_j(ji,jj) = aco_bc_hor * ( rhd    (ji,jj,jk) - rhd    (ji,jj-1,jk) ) - bco_bc_hor * zdrho_j(ji,jj-1,jk)  
    868                   zz_dz_j  (ji,jj) = aco_bc_hor * (-gde3w(ji,jj,jk) + gde3w(ji,jj-1,jk) ) - bco_bc_hor * zdz_j  (ji,jj-1,jk) 
    869                END IF 
     852         END_2D 
     853         ! Walls coming from left: should check from 2 to jpj-1 (and jpi=2-jpi) 
     854         DO_2D( 0, 1, 0, 0 ) 
     855            IF ( vmask(ji,jj,jk) > 0.5_wp .AND. vmask(ji,jj-1,jk) < 0.5_wp .AND. vmask(ji,jj+1,jk) > 0.5_wp)  THEN 
     856               zz_drho_j(ji,jj) = aco_bc_hor * ( rhd    (ji,jj+1,jk) - rhd    (ji,jj,jk) ) - bco_bc_hor * zdrho_j(ji,jj+1,jk) 
     857               zz_dz_j  (ji,jj) = aco_bc_hor * (-gde3w(ji,jj+1,jk) + gde3w(ji,jj,jk) ) - bco_bc_hor * zdz_j  (ji,jj+1,jk) 
     858            END IF 
     859         END_2D 
     860         ! Walls coming from right: should check from 3 to jpj (and jpi=2-jpi) 
     861         DO_2D( 0, 1, -1, 1 ) 
     862            IF ( vmask(ji,jj,jk) < 0.5_wp .AND. vmask(ji,jj-1,jk) > 0.5_wp .AND. vmask(ji,jj-2,jk) > 0.5_wp) THEN 
     863               zz_drho_j(ji,jj) = aco_bc_hor * ( rhd    (ji,jj,jk) - rhd    (ji,jj-1,jk) ) - bco_bc_hor * zdrho_j(ji,jj-1,jk) 
     864               zz_dz_j  (ji,jj) = aco_bc_hor * (-gde3w(ji,jj,jk) + gde3w(ji,jj-1,jk) ) - bco_bc_hor * zdz_j  (ji,jj-1,jk) 
    870865            END IF 
    871866         END_2D 
     
    974969      REAL(wp) :: zrhdt1 
    975970      REAL(wp) :: zdpdx1, zdpdx2, zdpdy1, zdpdy2 
    976       REAL(wp), DIMENSION(jpi,jpj)     ::   zpgu, zpgv   ! 2D workspace 
    977       REAL(wp), DIMENSION(jpi,jpj)     ::   zsshu_n, zsshv_n 
    978       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zdept, zrhh 
    979       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp 
     971      REAL(wp), DIMENSION(A2D(nn_hls))     ::   zpgu, zpgv   ! 2D workspace 
     972      REAL(wp), DIMENSION(A2D(nn_hls))     ::   zsshu_n, zsshv_n 
     973      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zdept, zrhh 
     974      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp 
    980975      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zcpx, zcpy   !W/D pressure filter 
    981976      !!---------------------------------------------------------------------- 
    982977      ! 
    983       IF( kt == nit000 ) THEN 
    984          IF(lwp) WRITE(numout,*) 
    985          IF(lwp) WRITE(numout,*) 'dyn:hpg_prj : hydrostatic pressure gradient trend' 
    986          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   s-coordinate case, cubic spline pressure Jacobian' 
     978      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     979         IF( kt == nit000 ) THEN 
     980            IF(lwp) WRITE(numout,*) 
     981            IF(lwp) WRITE(numout,*) 'dyn:hpg_prj : hydrostatic pressure gradient trend' 
     982            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   s-coordinate case, cubic spline pressure Jacobian' 
     983         ENDIF 
    987984      ENDIF 
    988985 
     
    1001998      ! 
    1002999      IF( ln_wd_il ) THEN 
    1003          ALLOCATE( zcpx(jpi,jpj) , zcpy(jpi,jpj) ) 
     1000         ALLOCATE( zcpx(A2D(nn_hls)) , zcpy(A2D(nn_hls)) ) 
    10041001         DO_2D( 0, 0, 0, 0 ) 
    1005           ll_tmp1 = MIN(  ssh(ji,jj,Kmm)              ,  ssh(ji+1,jj,Kmm) ) >                & 
    1006                &    MAX( -ht_0(ji,jj)              , -ht_0(ji+1,jj) ) .AND.            & 
    1007                &    MAX(  ssh(ji,jj,Kmm) + ht_0(ji,jj),  ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) )  & 
    1008                &                                                      > rn_wdmin1 + rn_wdmin2 
    1009           ll_tmp2 = ( ABS( ssh(ji,jj,Kmm)             -  ssh(ji+1,jj,Kmm) ) > 1.E-12 ) .AND. (         & 
    1010                &    MAX(   ssh(ji,jj,Kmm)             ,  ssh(ji+1,jj,Kmm) ) >                & 
    1011                &    MAX(  -ht_0(ji,jj)             , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
    1012  
    1013           IF(ll_tmp1) THEN 
    1014             zcpx(ji,jj) = 1.0_wp 
    1015           ELSE IF(ll_tmp2) THEN 
    1016             ! no worries about  ssh(ji+1,jj,Kmm) -  ssh(ji  ,jj,Kmm) = 0, it won't happen ! here 
    1017             zcpx(ji,jj) = ABS( (ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 
    1018                         &    / (ssh(ji+1,jj,Kmm) -  ssh(ji  ,jj,Kmm)) ) 
    1019             
    1020              zcpx(ji,jj) = max(min( zcpx(ji,jj) , 1.0_wp),0.0_wp) 
    1021           ELSE 
    1022             zcpx(ji,jj) = 0._wp 
    1023           END IF 
    1024     
    1025           ll_tmp1 = MIN(  ssh(ji,jj,Kmm)              ,  ssh(ji,jj+1,Kmm) ) >                & 
    1026                &    MAX( -ht_0(ji,jj)              , -ht_0(ji,jj+1) ) .AND.            & 
    1027                &    MAX(  ssh(ji,jj,Kmm) + ht_0(ji,jj),  ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) )  & 
    1028                &                                                      > rn_wdmin1 + rn_wdmin2 
    1029           ll_tmp2 = ( ABS( ssh(ji,jj,Kmm)             -  ssh(ji,jj+1,Kmm) ) > 1.E-12 ) .AND. (      & 
    1030                &    MAX(   ssh(ji,jj,Kmm)             ,  ssh(ji,jj+1,Kmm) ) >                & 
    1031                &    MAX(  -ht_0(ji,jj)             , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
    1032  
    1033           IF(ll_tmp1) THEN 
    1034             zcpy(ji,jj) = 1.0_wp 
    1035           ELSE IF(ll_tmp2) THEN 
    1036             ! no worries about  ssh(ji,jj+1,Kmm) -  ssh(ji,jj  ,Kmm) = 0, it won't happen ! here 
    1037             zcpy(ji,jj) = ABS( (ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 
    1038                         &    / (ssh(ji,jj+1,Kmm) - ssh(ji,jj  ,Kmm)) ) 
    1039              zcpy(ji,jj) = max(min( zcpy(ji,jj) , 1.0_wp),0.0_wp) 
    1040  
     1002            ll_tmp1 = MIN(   ssh(ji,jj,Kmm)              ,   ssh(ji+1,jj,Kmm)                 ) >       & 
     1003               &      MAX( -ht_0(ji,jj)                  , -ht_0(ji+1,jj)                     ) .AND.   & 
     1004               &      MAX(   ssh(ji,jj,Kmm) + ht_0(ji,jj),   ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) ) >       & 
     1005               &      rn_wdmin1 + rn_wdmin2 
     1006            ll_tmp2 = ( ABS(   ssh(ji,jj,Kmm) -   ssh(ji+1,jj,Kmm) ) > 1.E-12 ) .AND.                   & 
     1007               &      ( MAX(   ssh(ji,jj,Kmm) ,   ssh(ji+1,jj,Kmm) ) >                                  & 
     1008               &        MAX( -ht_0(ji,jj)     , -ht_0(ji+1,jj)     ) + rn_wdmin1 + rn_wdmin2 ) 
     1009 
     1010            IF(ll_tmp1) THEN 
     1011               zcpx(ji,jj) = 1.0_wp 
     1012            ELSE IF(ll_tmp2) THEN 
     1013               ! no worries about  ssh(ji+1,jj,Kmm) -  ssh(ji  ,jj,Kmm) = 0, it won't happen ! here 
     1014               zcpx(ji,jj) = ABS( (ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 
     1015                           &    / (ssh(ji+1,jj,Kmm) -  ssh(ji  ,jj,Kmm)) ) 
     1016               zcpx(ji,jj) = MAX(MIN( zcpx(ji,jj) , 1.0_wp),0.0_wp) 
     1017            ELSE 
     1018               zcpx(ji,jj) = 0._wp 
     1019            END IF 
     1020 
     1021            ll_tmp1 = MIN(   ssh(ji,jj,Kmm)              ,   ssh(ji,jj+1,Kmm)                 ) >       & 
     1022               &      MAX( -ht_0(ji,jj)                  , -ht_0(ji,jj+1)                     ) .AND.   & 
     1023               &      MAX(   ssh(ji,jj,Kmm) + ht_0(ji,jj),   ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) ) >       & 
     1024               &      rn_wdmin1 + rn_wdmin2 
     1025            ll_tmp2 = ( ABS(   ssh(ji,jj,Kmm) -   ssh(ji,jj+1,Kmm) ) > 1.E-12 ) .AND.                   & 
     1026               &      ( MAX(   ssh(ji,jj,Kmm) ,   ssh(ji,jj+1,Kmm) ) >                                  & 
     1027               &        MAX( -ht_0(ji,jj)     , -ht_0(ji,jj+1)     ) + rn_wdmin1 + rn_wdmin2 ) 
     1028 
     1029            IF(ll_tmp1) THEN 
     1030               zcpy(ji,jj) = 1.0_wp 
     1031            ELSE IF(ll_tmp2) THEN 
     1032               ! no worries about  ssh(ji,jj+1,Kmm) -  ssh(ji,jj  ,Kmm) = 0, it won't happen ! here 
     1033               zcpy(ji,jj) = ABS( (ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 
     1034                           &    / (ssh(ji,jj+1,Kmm) -  ssh(ji,jj  ,Kmm)) ) 
     1035               zcpy(ji,jj) = MAX(MIN( zcpy(ji,jj) , 1.0_wp),0.0_wp) 
    10411036            ELSE 
    10421037               zcpy(ji,jj) = 0._wp 
    10431038            ENDIF 
    10441039         END_2D 
    1045          CALL lbc_lnk( 'dynhpg', zcpx, 'U', 1.0_wp, zcpy, 'V', 1.0_wp ) 
    10461040      ENDIF 
    10471041 
    10481042      ! Clean 3-D work arrays 
    10491043      zhpi(:,:,:) = 0._wp 
    1050       zrhh(:,:,:) = rhd(:,:,:) 
     1044      zrhh(:,:,:) = rhd(A2D(nn_hls),:) 
    10511045 
    10521046      ! Preparing vertical density profile "zrhh(:,:,:)" for hybrid-sco coordinate 
    10531047      DO_2D( 1, 1, 1, 1 ) 
    1054        jk = mbkt(ji,jj) 
    1055        IF(     jk <=  1   ) THEN   ;   zrhh(ji,jj,    :   ) = 0._wp 
    1056        ELSEIF( jk ==  2   ) THEN   ;   zrhh(ji,jj,jk+1:jpk) = rhd(ji,jj,jk) 
    1057        ELSEIF( jk < jpkm1 ) THEN 
    1058           DO jkk = jk+1, jpk 
    1059              zrhh(ji,jj,jkk) = interp1(gde3w(ji,jj,jkk  ), gde3w(ji,jj,jkk-1),   & 
    1060                 &                      gde3w(ji,jj,jkk-2), zrhh (ji,jj,jkk-1), zrhh(ji,jj,jkk-2)) 
    1061           END DO 
    1062        ENDIF 
     1048         jk = mbkt(ji,jj) 
     1049         IF(     jk <=  1   ) THEN   ;   zrhh(ji,jj,    :   ) = 0._wp 
     1050         ELSEIF( jk ==  2   ) THEN   ;   zrhh(ji,jj,jk+1:jpk) = rhd(ji,jj,jk) 
     1051         ELSEIF( jk < jpkm1 ) THEN 
     1052            DO jkk = jk+1, jpk 
     1053               zrhh(ji,jj,jkk) = interp1(gde3w(ji,jj,jkk  ), gde3w(ji,jj,jkk-1),   & 
     1054                  &                      gde3w(ji,jj,jkk-2), zrhh (ji,jj,jkk-1), zrhh(ji,jj,jkk-2)) 
     1055            END DO 
     1056         ENDIF 
    10631057      END_2D 
    10641058 
     
    10821076      ! Integrate the hydrostatic pressure "zhpi(:,:,:)" at "T(ji,jj,1)" 
    10831077      DO_2D( 0, 1, 0, 1 ) 
    1084        zrhdt1 = zrhh(ji,jj,1) - interp3( zdept(ji,jj,1), asp(ji,jj,1), bsp(ji,jj,1),  & 
    1085           &                                              csp(ji,jj,1), dsp(ji,jj,1) ) * 0.25_wp * e3w(ji,jj,1,Kmm) 
    1086  
    1087        ! assuming linear profile across the top half surface layer 
    1088        zhpi(ji,jj,1) =  0.5_wp * e3w(ji,jj,1,Kmm) * zrhdt1 
     1078         zrhdt1 = zrhh(ji,jj,1) - interp3( zdept(ji,jj,1), asp(ji,jj,1), bsp(ji,jj,1),  & 
     1079            &                                              csp(ji,jj,1), dsp(ji,jj,1) ) * 0.25_wp * e3w(ji,jj,1,Kmm) 
     1080 
     1081         ! assuming linear profile across the top half surface layer 
     1082         zhpi(ji,jj,1) =  0.5_wp * e3w(ji,jj,1,Kmm) * zrhdt1 
    10891083      END_2D 
    10901084 
    10911085      ! Calculate the pressure "zhpi(:,:,:)" at "T(ji,jj,2:jpkm1)" 
    10921086      DO_3D( 0, 1, 0, 1, 2, jpkm1 ) 
    1093       zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) +                                  & 
    1094          &             integ_spline( zdept(ji,jj,jk-1), zdept(ji,jj,jk),   & 
    1095          &                           asp  (ji,jj,jk-1), bsp  (ji,jj,jk-1), & 
    1096          &                           csp  (ji,jj,jk-1), dsp  (ji,jj,jk-1)  ) 
     1087         zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) +                                  & 
     1088            &             integ_spline( zdept(ji,jj,jk-1), zdept(ji,jj,jk),   & 
     1089            &                           asp  (ji,jj,jk-1), bsp  (ji,jj,jk-1), & 
     1090            &                           csp  (ji,jj,jk-1), dsp  (ji,jj,jk-1)  ) 
    10971091      END_3D 
    10981092 
     
    11071101!                         & r1_e1e2v(ji,jj) * vmask(ji,jj,1) * 0.5_wp  
    11081102!!gm not this: 
    1109        zsshu_n(ji,jj) = (e1e2u(ji,jj) * ssh(ji,jj,Kmm) + e1e2u(ji+1, jj) * ssh(ji+1,jj,Kmm)) * & 
    1110                       & r1_e1e2u(ji,jj) * umask(ji,jj,1) * 0.5_wp  
    1111        zsshv_n(ji,jj) = (e1e2v(ji,jj) * ssh(ji,jj,Kmm) + e1e2v(ji+1, jj) * ssh(ji,jj+1,Kmm)) * & 
    1112                       & r1_e1e2v(ji,jj) * vmask(ji,jj,1) * 0.5_wp  
    1113       END_2D 
    1114  
    1115       CALL lbc_lnk ('dynhpg', zsshu_n, 'U', 1.0_wp, zsshv_n, 'V', 1.0_wp ) 
     1103         zsshu_n(ji,jj) = (e1e2u(ji,jj) * ssh(ji,jj,Kmm) + e1e2u(ji+1, jj) * ssh(ji+1,jj,Kmm)) * & 
     1104                        & r1_e1e2u(ji,jj) * umask(ji,jj,1) * 0.5_wp 
     1105         zsshv_n(ji,jj) = (e1e2v(ji,jj) * ssh(ji,jj,Kmm) + e1e2v(ji+1, jj) * ssh(ji,jj+1,Kmm)) * & 
     1106                        & r1_e1e2v(ji,jj) * vmask(ji,jj,1) * 0.5_wp 
     1107      END_2D 
    11161108 
    11171109      DO_2D( 0, 0, 0, 0 ) 
    1118        zu(ji,jj,1) = - ( e3u(ji,jj,1,Kmm) - zsshu_n(ji,jj) )  
    1119        zv(ji,jj,1) = - ( e3v(ji,jj,1,Kmm) - zsshv_n(ji,jj) ) 
     1110         zu(ji,jj,1) = - ( e3u(ji,jj,1,Kmm) - zsshu_n(ji,jj) ) 
     1111         zv(ji,jj,1) = - ( e3v(ji,jj,1,Kmm) - zsshv_n(ji,jj) ) 
    11201112      END_2D 
    11211113 
    11221114      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
    1123       zu(ji,jj,jk) = zu(ji,jj,jk-1) - e3u(ji,jj,jk,Kmm) 
    1124       zv(ji,jj,jk) = zv(ji,jj,jk-1) - e3v(ji,jj,jk,Kmm) 
     1115         zu(ji,jj,jk) = zu(ji,jj,jk-1) - e3u(ji,jj,jk,Kmm) 
     1116         zv(ji,jj,jk) = zv(ji,jj,jk-1) - e3v(ji,jj,jk,Kmm) 
    11251117      END_3D 
    11261118 
    11271119      DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
    1128       zu(ji,jj,jk) = zu(ji,jj,jk) + 0.5_wp * e3u(ji,jj,jk,Kmm) 
    1129       zv(ji,jj,jk) = zv(ji,jj,jk) + 0.5_wp * e3v(ji,jj,jk,Kmm) 
     1120         zu(ji,jj,jk) = zu(ji,jj,jk) + 0.5_wp * e3u(ji,jj,jk,Kmm) 
     1121         zv(ji,jj,jk) = zv(ji,jj,jk) + 0.5_wp * e3v(ji,jj,jk,Kmm) 
    11301122      END_3D 
    11311123 
    11321124      DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
    1133       zu(ji,jj,jk) = MIN(  zu(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) )  ) 
    1134       zu(ji,jj,jk) = MAX(  zu(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) )  ) 
    1135       zv(ji,jj,jk) = MIN(  zv(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) )  ) 
    1136       zv(ji,jj,jk) = MAX(  zv(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) )  ) 
     1125         zu(ji,jj,jk) = MIN(  zu(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) )  ) 
     1126         zu(ji,jj,jk) = MAX(  zu(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) )  ) 
     1127         zv(ji,jj,jk) = MIN(  zv(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) )  ) 
     1128         zv(ji,jj,jk) = MAX(  zv(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) )  ) 
    11371129      END_3D 
    11381130 
    11391131 
    11401132      DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
    1141       zpwes = 0._wp; zpwed = 0._wp 
    1142       zpnss = 0._wp; zpnsd = 0._wp 
    1143       zuijk = zu(ji,jj,jk) 
    1144       zvijk = zv(ji,jj,jk) 
    1145  
    1146       !!!!!     for u equation 
    1147       IF( jk <= mbku(ji,jj) ) THEN 
    1148          IF( -zdept(ji+1,jj,jk) >= -zdept(ji,jj,jk) ) THEN 
    1149            jis = ji + 1; jid = ji 
    1150          ELSE 
    1151            jis = ji;     jid = ji +1 
     1133         zpwes = 0._wp; zpwed = 0._wp 
     1134         zpnss = 0._wp; zpnsd = 0._wp 
     1135         zuijk = zu(ji,jj,jk) 
     1136         zvijk = zv(ji,jj,jk) 
     1137 
     1138         !!!!!     for u equation 
     1139         IF( jk <= mbku(ji,jj) ) THEN 
     1140            IF( -zdept(ji+1,jj,jk) >= -zdept(ji,jj,jk) ) THEN 
     1141              jis = ji + 1; jid = ji 
     1142            ELSE 
     1143              jis = ji;     jid = ji +1 
     1144            ENDIF 
     1145 
     1146            ! integrate the pressure on the shallow side 
     1147            jk1 = jk 
     1148            DO WHILE ( -zdept(jis,jj,jk1) > zuijk ) 
     1149               IF( jk1 == mbku(ji,jj) ) THEN 
     1150                  zuijk = -zdept(jis,jj,jk1) 
     1151                  EXIT 
     1152               ENDIF 
     1153               zdeps = MIN(zdept(jis,jj,jk1+1), -zuijk) 
     1154               zpwes = zpwes +                                      & 
     1155                  integ_spline(zdept(jis,jj,jk1), zdeps,            & 
     1156                                 asp(jis,jj,jk1), bsp(jis,jj,jk1),  & 
     1157                                 csp(jis,jj,jk1), dsp(jis,jj,jk1)) 
     1158               jk1 = jk1 + 1 
     1159            END DO 
     1160 
     1161            ! integrate the pressure on the deep side 
     1162            jk1 = jk 
     1163            DO WHILE ( -zdept(jid,jj,jk1) < zuijk ) 
     1164               IF( jk1 == 1 ) THEN 
     1165                  zdeps = zdept(jid,jj,1) + MIN(zuijk, ssh(jid,jj,Kmm)*znad) 
     1166                  zrhdt1 = zrhh(jid,jj,1) - interp3(zdept(jid,jj,1), asp(jid,jj,1), & 
     1167                                                    bsp(jid,jj,1)  , csp(jid,jj,1), & 
     1168                                                    dsp(jid,jj,1)) * zdeps 
     1169                  zpwed  = zpwed + 0.5_wp * (zrhh(jid,jj,1) + zrhdt1) * zdeps 
     1170                  EXIT 
     1171               ENDIF 
     1172               zdeps = MAX(zdept(jid,jj,jk1-1), -zuijk) 
     1173               zpwed = zpwed +                                        & 
     1174                  integ_spline(zdeps,             zdept(jid,jj,jk1),  & 
     1175                               asp(jid,jj,jk1-1), bsp(jid,jj,jk1-1),  & 
     1176                               csp(jid,jj,jk1-1), dsp(jid,jj,jk1-1) ) 
     1177               jk1 = jk1 - 1 
     1178            END DO 
     1179 
     1180            ! update the momentum trends in u direction 
     1181            zdpdx1 = zcoef0 * r1_e1u(ji,jj) * ( zhpi(ji+1,jj,jk) - zhpi(ji,jj,jk) ) 
     1182            IF( .NOT.ln_linssh ) THEN 
     1183               zdpdx2 = zcoef0 * r1_e1u(ji,jj) * & 
     1184                  &    ( REAL(jis-jid, wp) * (zpwes + zpwed) + (ssh(ji+1,jj,Kmm)-ssh(ji,jj,Kmm)) ) 
     1185            ELSE 
     1186               zdpdx2 = zcoef0 * r1_e1u(ji,jj) * REAL(jis-jid, wp) * (zpwes + zpwed) 
     1187            ENDIF 
     1188            IF( ln_wd_il ) THEN 
     1189               zdpdx1 = zdpdx1 * zcpx(ji,jj) * wdrampu(ji,jj) 
     1190               zdpdx2 = zdpdx2 * zcpx(ji,jj) * wdrampu(ji,jj) 
     1191            ENDIF 
     1192            puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + (zdpdx1 + zdpdx2 - zpgu(ji,jj)) * umask(ji,jj,jk) 
    11521193         ENDIF 
    11531194 
    1154          ! integrate the pressure on the shallow side 
    1155          jk1 = jk 
    1156          DO WHILE ( -zdept(jis,jj,jk1) > zuijk ) 
    1157            IF( jk1 == mbku(ji,jj) ) THEN 
    1158              zuijk = -zdept(jis,jj,jk1) 
    1159              EXIT 
    1160            ENDIF 
    1161            zdeps = MIN(zdept(jis,jj,jk1+1), -zuijk) 
    1162            zpwes = zpwes +                                    & 
    1163                 integ_spline(zdept(jis,jj,jk1), zdeps,            & 
    1164                        asp(jis,jj,jk1),    bsp(jis,jj,jk1), & 
    1165                        csp(jis,jj,jk1),    dsp(jis,jj,jk1)) 
    1166            jk1 = jk1 + 1 
    1167          END DO 
    1168  
    1169          ! integrate the pressure on the deep side 
    1170          jk1 = jk 
    1171          DO WHILE ( -zdept(jid,jj,jk1) < zuijk ) 
    1172            IF( jk1 == 1 ) THEN 
    1173              zdeps = zdept(jid,jj,1) + MIN(zuijk, ssh(jid,jj,Kmm)*znad) 
    1174              zrhdt1 = zrhh(jid,jj,1) - interp3(zdept(jid,jj,1), asp(jid,jj,1), & 
    1175                                                bsp(jid,jj,1),   csp(jid,jj,1), & 
    1176                                                dsp(jid,jj,1)) * zdeps 
    1177              zpwed  = zpwed + 0.5_wp * (zrhh(jid,jj,1) + zrhdt1) * zdeps 
    1178              EXIT 
    1179            ENDIF 
    1180            zdeps = MAX(zdept(jid,jj,jk1-1), -zuijk) 
    1181            zpwed = zpwed +                                        & 
    1182                   integ_spline(zdeps,              zdept(jid,jj,jk1), & 
    1183                          asp(jid,jj,jk1-1), bsp(jid,jj,jk1-1),  & 
    1184                          csp(jid,jj,jk1-1), dsp(jid,jj,jk1-1) ) 
    1185            jk1 = jk1 - 1 
    1186          END DO 
    1187  
    1188          ! update the momentum trends in u direction 
    1189  
    1190          zdpdx1 = zcoef0 * r1_e1u(ji,jj) * ( zhpi(ji+1,jj,jk) - zhpi(ji,jj,jk) ) 
    1191          IF( .NOT.ln_linssh ) THEN 
    1192            zdpdx2 = zcoef0 * r1_e1u(ji,jj) * & 
    1193               &    ( REAL(jis-jid, wp) * (zpwes + zpwed) + (ssh(ji+1,jj,Kmm)-ssh(ji,jj,Kmm)) ) 
    1194           ELSE 
    1195            zdpdx2 = zcoef0 * r1_e1u(ji,jj) * REAL(jis-jid, wp) * (zpwes + zpwed) 
     1195         !!!!!     for v equation 
     1196         IF( jk <= mbkv(ji,jj) ) THEN 
     1197            IF( -zdept(ji,jj+1,jk) >= -zdept(ji,jj,jk) ) THEN 
     1198               jjs = jj + 1; jjd = jj 
     1199            ELSE 
     1200               jjs = jj    ; jjd = jj + 1 
     1201            ENDIF 
     1202 
     1203            ! integrate the pressure on the shallow side 
     1204            jk1 = jk 
     1205            DO WHILE ( -zdept(ji,jjs,jk1) > zvijk ) 
     1206               IF( jk1 == mbkv(ji,jj) ) THEN 
     1207                  zvijk = -zdept(ji,jjs,jk1) 
     1208                  EXIT 
     1209               ENDIF 
     1210               zdeps = MIN(zdept(ji,jjs,jk1+1), -zvijk) 
     1211               zpnss = zpnss +                                       & 
     1212                  integ_spline(zdept(ji,jjs,jk1), zdeps,             & 
     1213                               asp(ji,jjs,jk1),   bsp(ji,jjs,jk1),   & 
     1214                               csp(ji,jjs,jk1),   dsp(ji,jjs,jk1) ) 
     1215              jk1 = jk1 + 1 
     1216            END DO 
     1217 
     1218            ! integrate the pressure on the deep side 
     1219            jk1 = jk 
     1220            DO WHILE ( -zdept(ji,jjd,jk1) < zvijk ) 
     1221               IF( jk1 == 1 ) THEN 
     1222                  zdeps = zdept(ji,jjd,1) + MIN(zvijk, ssh(ji,jjd,Kmm)*znad) 
     1223                  zrhdt1 = zrhh(ji,jjd,1) - interp3(zdept(ji,jjd,1), asp(ji,jjd,1), & 
     1224                                                    bsp(ji,jjd,1)  , csp(ji,jjd,1), & 
     1225                                                    dsp(ji,jjd,1) ) * zdeps 
     1226                  zpnsd  = zpnsd + 0.5_wp * (zrhh(ji,jjd,1) + zrhdt1) * zdeps 
     1227                  EXIT 
     1228               ENDIF 
     1229               zdeps = MAX(zdept(ji,jjd,jk1-1), -zvijk) 
     1230               zpnsd = zpnsd +                                        & 
     1231                  integ_spline(zdeps,             zdept(ji,jjd,jk1),  & 
     1232                               asp(ji,jjd,jk1-1), bsp(ji,jjd,jk1-1),  & 
     1233                               csp(ji,jjd,jk1-1), dsp(ji,jjd,jk1-1) ) 
     1234               jk1 = jk1 - 1 
     1235            END DO 
     1236 
     1237            ! update the momentum trends in v direction 
     1238            zdpdy1 = zcoef0 * r1_e2v(ji,jj) * ( zhpi(ji,jj+1,jk) - zhpi(ji,jj,jk) ) 
     1239            IF( .NOT.ln_linssh ) THEN 
     1240               zdpdy2 = zcoef0 * r1_e2v(ji,jj) * & 
     1241                       ( REAL(jjs-jjd, wp) * (zpnss + zpnsd) + (ssh(ji,jj+1,Kmm)-ssh(ji,jj,Kmm)) ) 
     1242            ELSE 
     1243               zdpdy2 = zcoef0 * r1_e2v(ji,jj) * REAL(jjs-jjd, wp) * (zpnss + zpnsd ) 
     1244            ENDIF 
     1245            IF( ln_wd_il ) THEN 
     1246               zdpdy1 = zdpdy1 * zcpy(ji,jj) * wdrampv(ji,jj) 
     1247               zdpdy2 = zdpdy2 * zcpy(ji,jj) * wdrampv(ji,jj) 
     1248            ENDIF 
     1249 
     1250            pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + (zdpdy1 + zdpdy2 - zpgv(ji,jj)) * vmask(ji,jj,jk) 
    11961251         ENDIF 
    1197          IF( ln_wd_il ) THEN 
    1198             zdpdx1 = zdpdx1 * zcpx(ji,jj) * wdrampu(ji,jj) 
    1199             zdpdx2 = zdpdx2 * zcpx(ji,jj) * wdrampu(ji,jj) 
    1200          ENDIF 
    1201          puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + (zdpdx1 + zdpdx2 - zpgu(ji,jj)) * umask(ji,jj,jk)  
    1202       ENDIF 
    1203  
    1204       !!!!!     for v equation 
    1205       IF( jk <= mbkv(ji,jj) ) THEN 
    1206          IF( -zdept(ji,jj+1,jk) >= -zdept(ji,jj,jk) ) THEN 
    1207            jjs = jj + 1; jjd = jj 
    1208          ELSE 
    1209            jjs = jj    ; jjd = jj + 1 
    1210          ENDIF 
    1211  
    1212          ! integrate the pressure on the shallow side 
    1213          jk1 = jk 
    1214          DO WHILE ( -zdept(ji,jjs,jk1) > zvijk ) 
    1215            IF( jk1 == mbkv(ji,jj) ) THEN 
    1216              zvijk = -zdept(ji,jjs,jk1) 
    1217              EXIT 
    1218            ENDIF 
    1219            zdeps = MIN(zdept(ji,jjs,jk1+1), -zvijk) 
    1220            zpnss = zpnss +                                      & 
    1221                   integ_spline(zdept(ji,jjs,jk1), zdeps,            & 
    1222                          asp(ji,jjs,jk1),    bsp(ji,jjs,jk1), & 
    1223                          csp(ji,jjs,jk1),    dsp(ji,jjs,jk1) ) 
    1224            jk1 = jk1 + 1 
    1225          END DO 
    1226  
    1227          ! integrate the pressure on the deep side 
    1228          jk1 = jk 
    1229          DO WHILE ( -zdept(ji,jjd,jk1) < zvijk ) 
    1230            IF( jk1 == 1 ) THEN 
    1231              zdeps = zdept(ji,jjd,1) + MIN(zvijk, ssh(ji,jjd,Kmm)*znad) 
    1232              zrhdt1 = zrhh(ji,jjd,1) - interp3(zdept(ji,jjd,1), asp(ji,jjd,1), & 
    1233                                                bsp(ji,jjd,1),   csp(ji,jjd,1), & 
    1234                                                dsp(ji,jjd,1) ) * zdeps 
    1235              zpnsd  = zpnsd + 0.5_wp * (zrhh(ji,jjd,1) + zrhdt1) * zdeps 
    1236              EXIT 
    1237            ENDIF 
    1238            zdeps = MAX(zdept(ji,jjd,jk1-1), -zvijk) 
    1239            zpnsd = zpnsd +                                        & 
    1240                   integ_spline(zdeps,              zdept(ji,jjd,jk1), & 
    1241                          asp(ji,jjd,jk1-1), bsp(ji,jjd,jk1-1), & 
    1242                          csp(ji,jjd,jk1-1), dsp(ji,jjd,jk1-1) ) 
    1243            jk1 = jk1 - 1 
    1244          END DO 
    1245  
    1246  
    1247          ! update the momentum trends in v direction 
    1248  
    1249          zdpdy1 = zcoef0 * r1_e2v(ji,jj) * ( zhpi(ji,jj+1,jk) - zhpi(ji,jj,jk) ) 
    1250          IF( .NOT.ln_linssh ) THEN 
    1251             zdpdy2 = zcoef0 * r1_e2v(ji,jj) * & 
    1252                     ( REAL(jjs-jjd, wp) * (zpnss + zpnsd) + (ssh(ji,jj+1,Kmm)-ssh(ji,jj,Kmm)) ) 
    1253          ELSE 
    1254             zdpdy2 = zcoef0 * r1_e2v(ji,jj) * REAL(jjs-jjd, wp) * (zpnss + zpnsd ) 
    1255          ENDIF 
    1256          IF( ln_wd_il ) THEN 
    1257             zdpdy1 = zdpdy1 * zcpy(ji,jj) * wdrampv(ji,jj)  
    1258             zdpdy2 = zdpdy2 * zcpy(ji,jj) * wdrampv(ji,jj)  
    1259          ENDIF 
    1260  
    1261          pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + (zdpdy1 + zdpdy2 - zpgv(ji,jj)) * vmask(ji,jj,jk) 
    1262       ENDIF 
    12631252         ! 
    12641253      END_3D 
     
    12791268      !! Reference: CJC Kruger, Constrained Cubic Spline Interpoltation 
    12801269      !!---------------------------------------------------------------------- 
    1281       REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   fsp, xsp           ! value and coordinate 
    1282       REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   asp, bsp, csp, dsp ! coefficients of the interpoated function 
    1283       INTEGER                   , INTENT(in   ) ::   polynomial_type    ! 1: cubic spline   ;   2: Linear 
     1270      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in   ) ::   fsp, xsp           ! value and coordinate 
     1271      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(  out) ::   asp, bsp, csp, dsp ! coefficients of the interpoated function 
     1272      INTEGER                             , INTENT(in   ) ::   polynomial_type    ! 1: cubic spline   ;   2: Linear 
    12841273      ! 
    12851274      INTEGER  ::   ji, jj, jk                 ! dummy loop indices 
    1286       INTEGER  ::   jpi, jpj, jpkm1 
    12871275      REAL(wp) ::   zdf1, zdf2, zddf1, zddf2, ztmp1, ztmp2, zdxtmp 
    12881276      REAL(wp) ::   zdxtmp1, zdxtmp2, zalpha 
    1289       REAL(wp) ::   zdf(size(fsp,3)) 
    1290       !!---------------------------------------------------------------------- 
    1291       ! 
    1292 !!gm  WHAT !!!!!   THIS IS VERY DANGEROUS !!!!!   
    1293       jpi   = size(fsp,1) 
    1294       jpj   = size(fsp,2) 
    1295       jpkm1 = MAX( 1, size(fsp,3) - 1 ) 
     1277      REAL(wp) ::   zdf(jpk) 
     1278      !!---------------------------------------------------------------------- 
    12961279      ! 
    12971280      IF (polynomial_type == 1) THEN     ! Constrained Cubic Spline 
    1298          DO ji = 1, jpi 
    1299             DO jj = 1, jpj 
    1300            !!Fritsch&Butland's method, 1984 (preferred, but more computation) 
    1301            !    DO jk = 2, jpkm1-1 
    1302            !       zdxtmp1 = xsp(ji,jj,jk)   - xsp(ji,jj,jk-1) 
    1303            !       zdxtmp2 = xsp(ji,jj,jk+1) - xsp(ji,jj,jk) 
    1304            !       zdf1    = ( fsp(ji,jj,jk)   - fsp(ji,jj,jk-1) ) / zdxtmp1 
    1305            !       zdf2    = ( fsp(ji,jj,jk+1) - fsp(ji,jj,jk)   ) / zdxtmp2 
    1306            ! 
    1307            !       zalpha = ( zdxtmp1 + 2._wp * zdxtmp2 ) / ( zdxtmp1 + zdxtmp2 ) / 3._wp 
    1308            ! 
    1309            !       IF(zdf1 * zdf2 <= 0._wp) THEN 
    1310            !           zdf(jk) = 0._wp 
    1311            !       ELSE 
    1312            !         zdf(jk) = zdf1 * zdf2 / ( ( 1._wp - zalpha ) * zdf1 + zalpha * zdf2 ) 
    1313            !       ENDIF 
    1314            !    END DO 
    1315  
    1316            !!Simply geometric average 
    1317                DO jk = 2, jpkm1-1 
    1318                   zdf1 = (fsp(ji,jj,jk  ) - fsp(ji,jj,jk-1)) / (xsp(ji,jj,jk  ) - xsp(ji,jj,jk-1)) 
    1319                   zdf2 = (fsp(ji,jj,jk+1) - fsp(ji,jj,jk  )) / (xsp(ji,jj,jk+1) - xsp(ji,jj,jk  )) 
    1320  
    1321                   IF(zdf1 * zdf2 <= 0._wp) THEN 
    1322                      zdf(jk) = 0._wp 
    1323                   ELSE 
    1324                      zdf(jk) = 2._wp * zdf1 * zdf2 / (zdf1 + zdf2) 
    1325                   ENDIF 
    1326                END DO 
    1327  
    1328                zdf(1)     = 1.5_wp * ( fsp(ji,jj,2) - fsp(ji,jj,1) ) / & 
    1329                           &          ( xsp(ji,jj,2) - xsp(ji,jj,1) )           -  0.5_wp * zdf(2) 
    1330                zdf(jpkm1) = 1.5_wp * ( fsp(ji,jj,jpkm1) - fsp(ji,jj,jpkm1-1) ) / & 
    1331                           &          ( xsp(ji,jj,jpkm1) - xsp(ji,jj,jpkm1-1) ) - 0.5_wp * zdf(jpkm1 - 1) 
    1332  
    1333                DO jk = 1, jpkm1 - 1 
    1334                  zdxtmp = xsp(ji,jj,jk+1) - xsp(ji,jj,jk) 
    1335                  ztmp1  = (zdf(jk+1) + 2._wp * zdf(jk)) / zdxtmp 
    1336                  ztmp2  =  6._wp * (fsp(ji,jj,jk+1) - fsp(ji,jj,jk)) / zdxtmp / zdxtmp 
    1337                  zddf1  = -2._wp * ztmp1 + ztmp2 
    1338                  ztmp1  = (2._wp * zdf(jk+1) + zdf(jk)) / zdxtmp 
    1339                  zddf2  =  2._wp * ztmp1 - ztmp2 
    1340  
    1341                  dsp(ji,jj,jk) = (zddf2 - zddf1) / 6._wp / zdxtmp 
    1342                  csp(ji,jj,jk) = ( xsp(ji,jj,jk+1) * zddf1 - xsp(ji,jj,jk)*zddf2 ) / 2._wp / zdxtmp 
    1343                  bsp(ji,jj,jk) = ( fsp(ji,jj,jk+1) - fsp(ji,jj,jk) ) / zdxtmp - & 
    1344                                & csp(ji,jj,jk) * ( xsp(ji,jj,jk+1) + xsp(ji,jj,jk) ) - & 
    1345                                & dsp(ji,jj,jk) * ((xsp(ji,jj,jk+1) + xsp(ji,jj,jk))**2 - & 
    1346                                &                   xsp(ji,jj,jk+1) * xsp(ji,jj,jk)) 
    1347                  asp(ji,jj,jk) = fsp(ji,jj,jk) - xsp(ji,jj,jk) * (bsp(ji,jj,jk) + & 
    1348                                &                (xsp(ji,jj,jk) * (csp(ji,jj,jk) + & 
    1349                                &                 dsp(ji,jj,jk) * xsp(ji,jj,jk)))) 
    1350                END DO 
     1281         DO_2D( 1, 1, 1, 1 ) 
     1282            !!Fritsch&Butland's method, 1984 (preferred, but more computation) 
     1283            !    DO jk = 2, jpkm1-1 
     1284            !       zdxtmp1 = xsp(ji,jj,jk)   - xsp(ji,jj,jk-1) 
     1285            !       zdxtmp2 = xsp(ji,jj,jk+1) - xsp(ji,jj,jk) 
     1286            !       zdf1    = ( fsp(ji,jj,jk)   - fsp(ji,jj,jk-1) ) / zdxtmp1 
     1287            !       zdf2    = ( fsp(ji,jj,jk+1) - fsp(ji,jj,jk)   ) / zdxtmp2 
     1288            ! 
     1289            !       zalpha = ( zdxtmp1 + 2._wp * zdxtmp2 ) / ( zdxtmp1 + zdxtmp2 ) / 3._wp 
     1290            ! 
     1291            !       IF(zdf1 * zdf2 <= 0._wp) THEN 
     1292            !           zdf(jk) = 0._wp 
     1293            !       ELSE 
     1294            !         zdf(jk) = zdf1 * zdf2 / ( ( 1._wp - zalpha ) * zdf1 + zalpha * zdf2 ) 
     1295            !       ENDIF 
     1296            !    END DO 
     1297 
     1298            !!Simply geometric average 
     1299            DO jk = 2, jpk-2 
     1300               zdf1 = (fsp(ji,jj,jk  ) - fsp(ji,jj,jk-1)) / (xsp(ji,jj,jk  ) - xsp(ji,jj,jk-1)) 
     1301               zdf2 = (fsp(ji,jj,jk+1) - fsp(ji,jj,jk  )) / (xsp(ji,jj,jk+1) - xsp(ji,jj,jk  )) 
     1302 
     1303               IF(zdf1 * zdf2 <= 0._wp) THEN 
     1304                  zdf(jk) = 0._wp 
     1305               ELSE 
     1306                  zdf(jk) = 2._wp * zdf1 * zdf2 / (zdf1 + zdf2) 
     1307               ENDIF 
    13511308            END DO 
    1352          END DO 
     1309 
     1310            zdf(1)     = 1.5_wp * ( fsp(ji,jj,2) - fsp(ji,jj,1) ) / & 
     1311                       &          ( xsp(ji,jj,2) - xsp(ji,jj,1) )           -  0.5_wp * zdf(2) 
     1312            zdf(jpkm1) = 1.5_wp * ( fsp(ji,jj,jpkm1) - fsp(ji,jj,jpkm1-1) ) / & 
     1313                       &          ( xsp(ji,jj,jpkm1) - xsp(ji,jj,jpkm1-1) ) - 0.5_wp * zdf(jpk - 2) 
     1314 
     1315            DO jk = 1, jpk-2 
     1316               zdxtmp = xsp(ji,jj,jk+1) - xsp(ji,jj,jk) 
     1317               ztmp1  = (zdf(jk+1) + 2._wp * zdf(jk)) / zdxtmp 
     1318               ztmp2  =  6._wp * (fsp(ji,jj,jk+1) - fsp(ji,jj,jk)) / zdxtmp / zdxtmp 
     1319               zddf1  = -2._wp * ztmp1 + ztmp2 
     1320               ztmp1  = (2._wp * zdf(jk+1) + zdf(jk)) / zdxtmp 
     1321               zddf2  =  2._wp * ztmp1 - ztmp2 
     1322 
     1323               dsp(ji,jj,jk) = (zddf2 - zddf1) / 6._wp / zdxtmp 
     1324               csp(ji,jj,jk) = ( xsp(ji,jj,jk+1) * zddf1 - xsp(ji,jj,jk)*zddf2 ) / 2._wp / zdxtmp 
     1325               bsp(ji,jj,jk) = ( fsp(ji,jj,jk+1) - fsp(ji,jj,jk) ) / zdxtmp - & 
     1326                             & csp(ji,jj,jk) * ( xsp(ji,jj,jk+1) + xsp(ji,jj,jk) ) - & 
     1327                             & dsp(ji,jj,jk) * ((xsp(ji,jj,jk+1) + xsp(ji,jj,jk))**2 - & 
     1328                             &                   xsp(ji,jj,jk+1) * xsp(ji,jj,jk)) 
     1329               asp(ji,jj,jk) = fsp(ji,jj,jk) - xsp(ji,jj,jk) * (bsp(ji,jj,jk) + & 
     1330                             &                (xsp(ji,jj,jk) * (csp(ji,jj,jk) + & 
     1331                             &                 dsp(ji,jj,jk) * xsp(ji,jj,jk)))) 
     1332            END DO 
     1333         END_2D 
    13531334 
    13541335      ELSEIF ( polynomial_type == 2 ) THEN     ! Linear 
    1355          DO ji = 1, jpi 
    1356             DO jj = 1, jpj 
    1357                DO jk = 1, jpkm1-1 
    1358                   zdxtmp =xsp(ji,jj,jk+1) - xsp(ji,jj,jk) 
    1359                   ztmp1 = fsp(ji,jj,jk+1) - fsp(ji,jj,jk) 
    1360  
    1361                   dsp(ji,jj,jk) = 0._wp 
    1362                   csp(ji,jj,jk) = 0._wp 
    1363                   bsp(ji,jj,jk) = ztmp1 / zdxtmp 
    1364                   asp(ji,jj,jk) = fsp(ji,jj,jk) - bsp(ji,jj,jk) * xsp(ji,jj,jk) 
    1365                END DO 
    1366             END DO 
    1367          END DO 
     1336         DO_3D( 1, 1, 1, 1, 1, jpk-2 ) 
     1337            zdxtmp =xsp(ji,jj,jk+1) - xsp(ji,jj,jk) 
     1338            ztmp1 = fsp(ji,jj,jk+1) - fsp(ji,jj,jk) 
     1339 
     1340            dsp(ji,jj,jk) = 0._wp 
     1341            csp(ji,jj,jk) = 0._wp 
     1342            bsp(ji,jj,jk) = ztmp1 / zdxtmp 
     1343            asp(ji,jj,jk) = fsp(ji,jj,jk) - bsp(ji,jj,jk) * xsp(ji,jj,jk) 
     1344         END_3D 
    13681345         ! 
    13691346      ELSE 
  • NEMO/trunk/src/OCE/DYN/dynkeg.F90

    r14820 r14834  
    7878      INTEGER  ::   ji, jj, jk             ! dummy loop indices 
    7979      REAL(wp) ::   zu, zv                   ! local scalars 
    80       REAL(wp), DIMENSION(jpi,jpj,jpk)        ::   zhke 
     80      REAL(wp), DIMENSION(A2D(nn_hls),jpk)    ::   zhke 
    8181      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdu, ztrdv  
    8282      !!---------------------------------------------------------------------- 
     
    8484      IF( ln_timing )   CALL timing_start('dyn_keg') 
    8585      ! 
    86       IF( kt == nit000 ) THEN 
    87          IF(lwp) WRITE(numout,*) 
    88          IF(lwp) WRITE(numout,*) 'dyn_keg : kinetic energy gradient trend, scheme number=', kscheme 
    89          IF(lwp) WRITE(numout,*) '~~~~~~~' 
     86      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     87         IF( kt == nit000 ) THEN 
     88            IF(lwp) WRITE(numout,*) 
     89            IF(lwp) WRITE(numout,*) 'dyn_keg : kinetic energy gradient trend, scheme number=', kscheme 
     90            IF(lwp) WRITE(numout,*) '~~~~~~~' 
     91         ENDIF 
    9092      ENDIF 
    9193 
     
    109111         END_3D 
    110112      CASE ( nkeg_HW )                          !--  Hollingsworth scheme  --! 
    111          DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     113         DO_3D( 0, nn_hls-1, 0, nn_hls-1, 1, jpkm1 ) 
    112114            ! round brackets added to fix the order of floating point operations 
    113115            ! needed to ensure halo 1 - halo 2 compatibility 
     
    121123               &         + pvv(ji  ,jj  ,jk,Kmm) * pvv(ji  ,jj  ,jk,Kmm) )  & 
    122124               &  +      ( ( pvv(ji-1,jj-1,jk,Kmm) + pvv(ji+1,jj-1,jk,Kmm) ) * ( pvv(ji-1,jj-1,jk,Kmm) + pvv(ji+1,jj-1,jk,Kmm) )  & 
    123                &  +        ( pvv(ji-1,jj  ,jk,Kmm) + pvv(ji+1,jj  ,jk,Kmm) ) * ( pvv(ji-1,jj  ,jk,Kmm) + pvv(ji+1,jj  ,jk,Kmm) )  &  
     125               &  +        ( pvv(ji-1,jj  ,jk,Kmm) + pvv(ji+1,jj  ,jk,Kmm) ) * ( pvv(ji-1,jj  ,jk,Kmm) + pvv(ji+1,jj  ,jk,Kmm) )  & 
    124126               &         )                                                               ! bracket for halo 1 - halo 2 compatibility 
    125127            zhke(ji,jj,jk) = r1_48 * ( zv + zu ) 
    126128         END_3D 
    127          CALL lbc_lnk( 'dynkeg', zhke, 'T', 1.0_wp ) 
     129         IF (nn_hls==1) CALL lbc_lnk( 'dynkeg', zhke, 'T', 1.0_wp ) 
    128130         ! 
    129131      END SELECT  
  • NEMO/trunk/src/OCE/DYN/dynldf_iso.F90

    r14433 r14834  
    2828   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    2929   USE prtctl          ! Print control 
     30#if defined key_loop_fusion 
     31   USE dynldf_iso_lf, ONLY: dyn_ldf_iso_lf   ! lateral mixing - loop fusion version (dyn_ldf_iso routine ) 
     32#endif 
    3033 
    3134   IMPLICIT NONE 
     
    3639 
    3740   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   akzu, akzv   !: vertical component of rotated lateral viscosity 
    38     
    39    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: zfuw, zdiu, zdju, zdj1u   ! 2D workspace (dyn_ldf_iso)  
    40    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: zfvw, zdiv, zdjv, zdj1v   !  -      - 
    4141 
    4242   !! * Substitutions 
     
    5454      !!                  ***  ROUTINE dyn_ldf_iso_alloc  *** 
    5555      !!---------------------------------------------------------------------- 
    56       ALLOCATE( akzu(jpi,jpj,jpk) , zfuw(jpi,jpk) , zdiu(jpi,jpk) , zdju(jpi,jpk) , zdj1u(jpi,jpk) ,     &  
    57          &      akzv(jpi,jpj,jpk) , zfvw(jpi,jpk) , zdiv(jpi,jpk) , zdjv(jpi,jpk) , zdj1v(jpi,jpk) , STAT=dyn_ldf_iso_alloc ) 
    58          ! 
    59       IF( dyn_ldf_iso_alloc /= 0 )   CALL ctl_warn('dyn_ldf_iso_alloc: array allocate failed.') 
     56      dyn_ldf_iso_alloc = 0 
     57      IF( .NOT. ALLOCATED( akzu ) ) THEN 
     58         ALLOCATE( akzu(jpi,jpj,jpk), akzv(jpi,jpj,jpk), STAT=dyn_ldf_iso_alloc ) 
     59            ! 
     60         IF( dyn_ldf_iso_alloc /= 0 )   CALL ctl_warn('dyn_ldf_iso_alloc: array allocate failed.') 
     61      ENDIF 
    6062   END FUNCTION dyn_ldf_iso_alloc 
    6163 
     
    112114      REAL(wp) ::   zabe2, zmskf, zmkf, zvav, zvwslpi, zvwslpj   !   -      - 
    113115      REAL(wp) ::   zcof0, zcof1, zcof2, zcof3, zcof4, zaht_0    !   -      - 
    114       REAL(wp), DIMENSION(jpi,jpj) ::   ziut, zivf, zdku, zdk1u  ! 2D workspace 
    115       REAL(wp), DIMENSION(jpi,jpj) ::   zjuf, zjvt, zdkv, zdk1v  !  -      - 
     116      REAL(wp), DIMENSION(A2D(nn_hls))      ::   ziut, zivf, zdku, zdk1u  ! 2D workspace 
     117      REAL(wp), DIMENSION(A2D(nn_hls))      ::   zjuf, zjvt, zdkv, zdk1v  !  -      - 
     118      REAL(wp), DIMENSION(A1Di(nn_hls),jpk) ::   zfuw, zdiu, zdju, zdj1u  !  -      - 
     119      REAL(wp), DIMENSION(A1Di(nn_hls),jpk) ::   zfvw, zdiv, zdjv, zdj1v  !  -      - 
    116120      !!---------------------------------------------------------------------- 
    117121      ! 
    118       IF( kt == nit000 ) THEN 
    119          IF(lwp) WRITE(numout,*) 
    120          IF(lwp) WRITE(numout,*) 'dyn_ldf_iso : iso-neutral laplacian diffusive operator or ' 
    121          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   s-coordinate horizontal diffusive operator' 
    122          !                                      ! allocate dyn_ldf_bilap arrays 
    123          IF( dyn_ldf_iso_alloc() /= 0 )   CALL ctl_stop('STOP', 'dyn_ldf_iso: failed to allocate arrays') 
     122#if defined key_loop_fusion 
     123      CALL dyn_ldf_iso_lf( kt, Kbb, Kmm, puu, pvv, Krhs    ) 
     124#else 
     125 
     126      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     127         IF( kt == nit000 ) THEN 
     128            IF(lwp) WRITE(numout,*) 
     129            IF(lwp) WRITE(numout,*) 'dyn_ldf_iso : iso-neutral laplacian diffusive operator or ' 
     130            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   s-coordinate horizontal diffusive operator' 
     131            !                                      ! allocate dyn_ldf_iso arrays 
     132            IF( dyn_ldf_iso_alloc() /= 0 )   CALL ctl_stop('STOP', 'dyn_ldf_iso: failed to allocate arrays') 
     133         ENDIF 
    124134      ENDIF 
    125135 
     
    128138      IF( ln_dynldf_hor .AND. ln_traldf_iso ) THEN 
    129139         ! 
    130          DO_3D( 0, 0, 0, 0, 1, jpk )      ! set the slopes of iso-level 
     140         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )      ! set the slopes of iso-level 
    131141            uslp (ji,jj,jk) = - ( gdept(ji+1,jj,jk,Kbb) - gdept(ji ,jj ,jk,Kbb) ) * r1_e1u(ji,jj) * umask(ji,jj,jk) 
    132142            vslp (ji,jj,jk) = - ( gdept(ji,jj+1,jk,Kbb) - gdept(ji ,jj ,jk,Kbb) ) * r1_e2v(ji,jj) * vmask(ji,jj,jk) 
     
    135145         END_3D 
    136146         ! Lateral boundary conditions on the slopes 
    137          CALL lbc_lnk( 'dynldf_iso', uslp , 'U', -1.0_wp, vslp , 'V', -1.0_wp, wslpi, 'W', -1.0_wp, wslpj, 'W', -1.0_wp ) 
     147         IF (nn_hls == 1) CALL lbc_lnk( 'dynldf_iso', uslp , 'U', -1.0_wp, vslp , 'V', -1.0_wp, wslpi, 'W', -1.0_wp, wslpj, 'W', -1.0_wp ) 
    138148         ! 
    139        ENDIF 
     149      ENDIF 
    140150          
    141151      zaht_0 = 0.5_wp * rn_Ud * rn_Ld                  ! aht_0 from namtra_ldf = zaht_max 
     
    150160         !                             zdkv(jk=1)=zdkv(jk=2) 
    151161 
    152          zdk1u(:,:) = ( puu(:,:,jk,Kbb) -puu(:,:,jk+1,Kbb) ) * umask(:,:,jk+1) 
    153          zdk1v(:,:) = ( pvv(:,:,jk,Kbb) -pvv(:,:,jk+1,Kbb) ) * vmask(:,:,jk+1) 
     162         DO_2D( 1, 1, 1, 1 ) 
     163            zdk1u(ji,jj) = ( puu(ji,jj,jk,Kbb) -puu(ji,jj,jk+1,Kbb) ) * umask(ji,jj,jk+1) 
     164            zdk1v(ji,jj) = ( pvv(ji,jj,jk,Kbb) -pvv(ji,jj,jk+1,Kbb) ) * vmask(ji,jj,jk+1) 
     165         END_2D 
    154166 
    155167         IF( jk == 1 ) THEN 
     
    157169            zdkv(:,:) = zdk1v(:,:) 
    158170         ELSE 
    159             zdku(:,:) = ( puu(:,:,jk-1,Kbb) - puu(:,:,jk,Kbb) ) * umask(:,:,jk) 
    160             zdkv(:,:) = ( pvv(:,:,jk-1,Kbb) - pvv(:,:,jk,Kbb) ) * vmask(:,:,jk) 
     171            DO_2D( 1, 1, 1, 1 ) 
     172               zdku(ji,jj) = ( puu(ji,jj,jk-1,Kbb) - puu(ji,jj,jk,Kbb) ) * umask(ji,jj,jk) 
     173               zdkv(ji,jj) = ( pvv(ji,jj,jk-1,Kbb) - pvv(ji,jj,jk,Kbb) ) * vmask(ji,jj,jk) 
     174            END_2D 
    161175         ENDIF 
    162176 
     
    286300 
    287301      !                                                ! =============== 
    288       DO jj = 2, jpjm1                                 !  Vertical slab 
     302      DO jj = ntsj, ntej                               !  Vertical slab 
    289303         !                                             ! =============== 
    290304 
     
    299313 
    300314         DO jk = 1, jpk 
    301             DO ji = 2, jpi 
     315            DO ji = ntsi, ntei + nn_hls 
    302316               ! i-gradient of u at jj 
    303317               zdiu (ji,jk) = tmask(ji,jj  ,jk) * ( puu(ji,jj  ,jk,Kbb) - puu(ji-1,jj  ,jk,Kbb) ) 
     
    311325         END DO 
    312326         DO jk = 1, jpk 
    313             DO ji = 1, jpim1 
     327            DO ji = ntsi - nn_hls, ntei 
    314328               ! i-gradient of v at jj 
    315329               zdiv (ji,jk) = fmask(ji,jj  ,jk) * ( pvv(ji+1,jj,jk,Kbb) - pvv(ji  ,jj  ,jk,Kbb) ) 
     
    322336 
    323337         ! Surface and bottom vertical fluxes set to zero 
    324          DO ji = 1, jpi 
     338         DO ji = ntsi - nn_hls, ntei + nn_hls 
    325339            zfuw(ji, 1 ) = 0.e0 
    326340            zfvw(ji, 1 ) = 0.e0 
     
    331345         ! interior (2=<jk=<jpk-1) on U field 
    332346         DO jk = 2, jpkm1 
    333             DO ji = 2, jpim1 
     347            DO ji = ntsi, ntei 
    334348               zcof0 = 0.5_wp * zaht_0 * umask(ji,jj,jk) 
    335349               ! 
     
    357371         ! interior (2=<jk=<jpk-1) on V field 
    358372         DO jk = 2, jpkm1 
    359             DO ji = 2, jpim1 
     373            DO ji = ntsi, ntei 
    360374               zcof0 = 0.5_wp * zaht_0 * vmask(ji,jj,jk) 
    361375               ! 
     
    385399         ! ------------------------------------------------------------------- 
    386400         DO jk = 1, jpkm1 
    387             DO ji = 2, jpim1 
     401            DO ji = ntsi, ntei 
    388402               puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + ( zfuw(ji,jk) - zfuw(ji,jk+1) ) * r1_e1e2u(ji,jj)   & 
    389403                  &               / e3u(ji,jj,jk,Kmm) 
     
    395409      END DO                                           !   End of slab 
    396410      !                                                ! =============== 
     411#endif 
    397412   END SUBROUTINE dyn_ldf_iso 
    398413 
  • NEMO/trunk/src/OCE/DYN/dynldf_lap_blp.F90

    r14433 r14834  
    1414   USE oce            ! ocean dynamics and tracers 
    1515   USE dom_oce        ! ocean space and time domain 
     16   USE domutl, ONLY : is_tile 
    1617   USE ldfdyn         ! lateral diffusion: eddy viscosity coef. 
    1718   USE ldfslp         ! iso-neutral slopes  
     
    2122   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    2223   USE lib_mpp 
    23     
     24#if defined key_loop_fusion 
     25   USE dynldf_lap_blp_lf 
     26#endif 
     27 
    2428   IMPLICIT NONE 
    2529   PRIVATE 
     
    3943 
    4044   SUBROUTINE dyn_ldf_lap( kt, Kbb, Kmm, pu, pv, pu_rhs, pv_rhs, kpass ) 
     45      !! 
     46      INTEGER                   , INTENT(in   ) ::   kt               ! ocean time-step index 
     47      INTEGER                   , INTENT(in   ) ::   Kbb, Kmm         ! ocean time level indices 
     48      INTEGER                   , INTENT(in   ) ::   kpass            ! =1/2 first or second passage 
     49      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pu, pv           ! before velocity  [m/s] 
     50      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pu_rhs, pv_rhs   ! velocity trend   [m/s2] 
     51      !! 
     52#if defined key_loop_fusion 
     53      CALL dyn_ldf_lap_lf( kt, Kbb, Kmm, pu, pv, pu_rhs, pv_rhs, kpass ) 
     54#else 
     55      CALL dyn_ldf_lap_t( kt, Kbb, Kmm, pu, pv, is_tile(pu), pu_rhs, pv_rhs, is_tile(pu_rhs), kpass ) 
     56#endif 
     57 
     58   END SUBROUTINE dyn_ldf_lap 
     59 
     60 
     61   SUBROUTINE dyn_ldf_lap_t( kt, Kbb, Kmm, pu, pv, ktuv, pu_rhs, pv_rhs, ktuv_rhs, kpass ) 
    4162      !!---------------------------------------------------------------------- 
    4263      !!                     ***  ROUTINE dyn_ldf_lap  *** 
     
    5273      !! Reference : S.Griffies, R.Hallberg 2000 Mon.Wea.Rev., DOI:/  
    5374      !!---------------------------------------------------------------------- 
    54       INTEGER                         , INTENT(in   ) ::   kt         ! ocean time-step index 
    55       INTEGER                         , INTENT(in   ) ::   Kbb, Kmm   ! ocean time level indices 
    56       INTEGER                         , INTENT(in   ) ::   kpass      ! =1/2 first or second passage 
    57       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pu, pv     ! before velocity  [m/s] 
    58       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu_rhs, pv_rhs   ! velocity trend   [m/s2] 
     75      INTEGER                                 , INTENT(in   ) ::   kt               ! ocean time-step index 
     76      INTEGER                                 , INTENT(in   ) ::   Kbb, Kmm         ! ocean time level indices 
     77      INTEGER                                 , INTENT(in   ) ::   kpass            ! =1/2 first or second passage 
     78      INTEGER                                 , INTENT(in   ) ::   ktuv, ktuv_rhs 
     79      REAL(wp), DIMENSION(A2D_T(ktuv)    ,JPK), INTENT(in   ) ::   pu, pv           ! before velocity  [m/s] 
     80      REAL(wp), DIMENSION(A2D_T(ktuv_rhs),JPK), INTENT(inout) ::   pu_rhs, pv_rhs   ! velocity trend   [m/s2] 
    5981      ! 
    6082      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     83      INTEGER  ::   iij 
    6184      REAL(wp) ::   zsign        ! local scalars 
    6285      REAL(wp) ::   zua, zva     ! local scalars 
     
    6588      !!---------------------------------------------------------------------- 
    6689      ! 
    67       IF( kt == nit000 .AND. lwp ) THEN 
    68          WRITE(numout,*) 
    69          WRITE(numout,*) 'dyn_ldf : iso-level harmonic (laplacian) operator, pass=', kpass 
    70          WRITE(numout,*) '~~~~~~~ ' 
     90      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     91         IF( kt == nit000 .AND. lwp ) THEN 
     92            WRITE(numout,*) 
     93            WRITE(numout,*) 'dyn_ldf : iso-level harmonic (laplacian) operator, pass=', kpass 
     94            WRITE(numout,*) '~~~~~~~ ' 
     95         ENDIF 
     96      ENDIF 
     97      ! 
     98      ! Define pu_rhs/pv_rhs halo points for multi-point haloes in bilaplacian case 
     99      IF( nldf_dyn == np_blp .AND. kpass == 1 ) THEN ; iij = nn_hls 
     100      ELSE                                           ; iij = 1 
    71101      ENDIF 
    72102      ! 
     
    79109      CASE ( np_typ_rot )       !==  Vorticity-Divergence operator  ==! 
    80110         ! 
    81          ALLOCATE( zcur(jpi,jpj) , zdiv(jpi,jpj) ) 
     111         ALLOCATE( zcur(A2D(nn_hls)) , zdiv(A2D(nn_hls)) ) 
    82112         ! 
    83113         DO jk = 1, jpkm1                                 ! Horizontal slab 
    84114            ! 
    85             DO_2D( 0, 1, 0, 1 ) 
     115            DO_2D( iij-1, iij, iij-1, iij ) 
    86116               !                                      ! ahm * e3 * curl  (computed from 1 to jpim1/jpjm1) 
    87117               zcur(ji-1,jj-1) = ahmf(ji-1,jj-1,jk) * e3f(ji-1,jj-1,jk) * r1_e1e2f(ji-1,jj-1)       &   ! ahmf already * by fmask 
     
    94124            END_2D 
    95125            ! 
    96             DO_2D( 0, 0, 0, 0 )                       ! - curl( curl) + grad( div ) 
     126            DO_2D( iij-1, iij-1, iij-1, iij-1 )   ! - curl( curl) + grad( div ) 
    97127               pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zsign * umask(ji,jj,jk) * (    &    ! * by umask is mandatory for dyn_ldf_blp use 
    98128                  &              - ( zcur(ji  ,jj) - zcur(ji,jj-1) ) * r1_e2u(ji,jj) / e3u(ji,jj,jk,Kmm)   & 
     
    110140      CASE ( np_typ_sym )       !==  Symmetric operator  ==! 
    111141         ! 
    112          ALLOCATE( zten(jpi,jpj) , zshe(jpi,jpj) ) 
     142         ALLOCATE( zten(A2D(nn_hls)) , zshe(A2D(nn_hls)) ) 
    113143         ! 
    114144         DO jk = 1, jpkm1                                 ! Horizontal slab 
    115145            ! 
    116             DO_2D( 0, 1, 0, 1 ) 
     146            DO_2D( iij-1, iij, iij-1, iij ) 
    117147               !                                      ! shearing stress component (F-point)   NB : ahmf has already been multiplied by fmask 
    118148               zshe(ji-1,jj-1) = ahmf(ji-1,jj-1,jk)                                                              & 
     
    129159            END_2D 
    130160            ! 
    131             DO_2D( 0, 0, 0, 0 ) 
     161            DO_2D( iij-1, iij-1, iij-1, iij-1 ) 
    132162               pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zsign * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,Kmm)                               & 
    133163                  &    * (   (   zten(ji+1,jj  ) * e2t(ji+1,jj  )*e2t(ji+1,jj  ) * e3t(ji+1,jj  ,jk,Kmm)                       & 
     
    150180      END SELECT 
    151181      ! 
    152    END SUBROUTINE dyn_ldf_lap 
     182   END SUBROUTINE dyn_ldf_lap_t 
    153183 
    154184 
     
    171201      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu_rhs, pv_rhs   ! momentum trend 
    172202      ! 
    173       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zulap, zvlap   ! laplacian at u- and v-point 
    174       !!---------------------------------------------------------------------- 
    175       ! 
    176       IF( kt == nit000 )  THEN 
    177          IF(lwp) WRITE(numout,*) 
    178          IF(lwp) WRITE(numout,*) 'dyn_ldf_blp : bilaplacian operator momentum ' 
    179          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~' 
     203      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zulap, zvlap   ! laplacian at u- and v-point 
     204      !!---------------------------------------------------------------------- 
     205      ! 
     206#if defined key_loop_fusion 
     207      CALL dyn_ldf_blp_lf( kt, Kbb, Kmm, pu, pv, pu_rhs, pv_rhs ) 
     208#else 
     209      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     210         IF( kt == nit000 )  THEN 
     211            IF(lwp) WRITE(numout,*) 
     212            IF(lwp) WRITE(numout,*) 'dyn_ldf_blp : bilaplacian operator momentum ' 
     213            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~' 
     214         ENDIF 
    180215      ENDIF 
    181216      ! 
     
    185220      CALL dyn_ldf_lap( kt, Kbb, Kmm, pu, pv, zulap, zvlap, 1 )   ! rotated laplacian applied to pt (output in zlap,Kbb) 
    186221      ! 
    187       CALL lbc_lnk( 'dynldf_lap_blp', zulap, 'U', -1.0_wp, zvlap, 'V', -1.0_wp )             ! Lateral boundary conditions 
     222      IF (nn_hls==1) CALL lbc_lnk( 'dynldf_lap_blp', zulap, 'U', -1.0_wp, zvlap, 'V', -1.0_wp )             ! Lateral boundary conditions 
    188223      ! 
    189224      CALL dyn_ldf_lap( kt, Kbb, Kmm, zulap, zvlap, pu_rhs, pv_rhs, 2 )   ! rotated laplacian applied to zlap (output in pt(:,:,:,:,Krhs)) 
    190225      ! 
     226#endif 
    191227   END SUBROUTINE dyn_ldf_blp 
    192228 
  • NEMO/trunk/src/OCE/DYN/dynspg_ts.F90

    r14433 r14834  
    730730      IF (ln_bt_fw) THEN 
    731731         IF( .NOT.( kt == nit000 .AND. l_1st_euler ) ) THEN 
    732             DO_2D( 1, 1, 1, 1 ) 
     732            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
    733733               zun_save = un_adv(ji,jj) 
    734734               zvn_save = vn_adv(ji,jj) 
  • NEMO/trunk/src/OCE/DYN/dynvor.F90

    r14820 r14834  
    240240      INTEGER  ::   ji, jj, jk           ! dummy loop indices 
    241241      REAL(wp) ::   zx1, zy1, zx2, zy2   ! local scalars 
    242       REAL(wp), DIMENSION(jpi,jpj)     ::   zwx, zwy, zwt   ! 2D workspace 
    243       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   zwz      ! 3D workspace, jpkm1 -> avoid lbc_lnk on jpk that is not defined 
    244       !!---------------------------------------------------------------------- 
    245       ! 
    246       IF( kt == nit000 ) THEN 
    247          IF(lwp) WRITE(numout,*) 
    248          IF(lwp) WRITE(numout,*) 'dyn:vor_enT : vorticity term: t-point energy conserving scheme' 
    249          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     242      REAL(wp), DIMENSION(A2D(nn_hls))        ::   zwx, zwy, zwt   ! 2D workspace 
     243      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   zwz             ! 3D workspace, jpkm1 -> avoid lbc_lnk on jpk that is not defined 
     244      !!---------------------------------------------------------------------- 
     245      ! 
     246      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     247         IF( kt == nit000 ) THEN 
     248            IF(lwp) WRITE(numout,*) 
     249            IF(lwp) WRITE(numout,*) 'dyn:vor_enT : vorticity term: t-point energy conserving scheme' 
     250            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     251         ENDIF 
    250252      ENDIF 
    251253      ! 
     
    254256      ! 
    255257      CASE ( np_RVO , np_CRV )                  !* relative vorticity at f-point is used 
    256          ALLOCATE( zwz(jpi,jpj,jpk) ) 
     258         ALLOCATE( zwz(A2D(nn_hls),jpk) ) 
    257259         DO jk = 1, jpkm1                                ! Horizontal slab 
    258             DO_2D( 1, 0, 1, 0 ) 
     260            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    259261               zwz(ji,jj,jk) = (  e2v(ji+1,jj) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk)  & 
    260262                  &             - e1u(ji,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)  ) * r1_e1e2f(ji,jj) 
    261263            END_2D 
    262264            IF( ln_dynvor_msk ) THEN                     ! mask relative vorticity 
    263                DO_2D( 1, 0, 1, 0 ) 
     265               DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    264266                  zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) 
    265267               END_2D 
    266268            ENDIF 
    267269         END DO 
    268          CALL lbc_lnk( 'dynvor', zwz, 'F', 1.0_wp ) 
     270         IF (nn_hls==1) CALL lbc_lnk( 'dynvor', zwz, 'F', 1.0_wp ) 
    269271         ! 
    270272      END SELECT 
     
    277279         ! 
    278280         CASE ( np_COR )                           !* Coriolis (planetary vorticity) 
    279             zwt(:,:) = ff_t(:,:) * e1e2t(:,:)*e3t(:,:,jk,Kmm) 
     281            DO_2D( 0, 1, 0, 1 ) 
     282               zwt(ji,jj) = ff_t(ji,jj) * e1e2t(ji,jj)*e3t(ji,jj,jk,Kmm) 
     283            END_2D 
    280284         CASE ( np_RVO )                           !* relative vorticity 
    281285            DO_2D( 0, 1, 0, 1 ) 
     
    356360      INTEGER  ::   ji, jj, jk           ! dummy loop indices 
    357361      REAL(wp) ::   zx1, zy1, zx2, zy2, ze3f, zmsk   ! local scalars 
    358       REAL(wp), DIMENSION(jpi,jpj) ::   zwx, zwy, zwz   ! 2D workspace 
    359       !!---------------------------------------------------------------------- 
    360       ! 
    361       IF( kt == nit000 ) THEN 
    362          IF(lwp) WRITE(numout,*) 
    363          IF(lwp) WRITE(numout,*) 'dyn:vor_ene : vorticity term: energy conserving scheme' 
    364          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     362      REAL(wp), DIMENSION(A2D(nn_hls)) ::   zwx, zwy, zwz   ! 2D workspace 
     363      !!---------------------------------------------------------------------- 
     364      ! 
     365      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     366         IF( kt == nit000 ) THEN 
     367            IF(lwp) WRITE(numout,*) 
     368            IF(lwp) WRITE(numout,*) 'dyn:vor_ene : vorticity term: energy conserving scheme' 
     369            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     370         ENDIF 
    365371      ENDIF 
    366372      ! 
     
    371377         SELECT CASE( kvor )                 !==  vorticity considered  ==! 
    372378         CASE ( np_COR )                           !* Coriolis (planetary vorticity) 
    373             zwz(:,:) = ff_f(:,:) 
     379            DO_2D( 1, 0, 1, 0 ) 
     380               zwz(ji,jj) = ff_f(ji,jj) 
     381            END_2D 
    374382         CASE ( np_RVO )                           !* relative vorticity 
    375383            DO_2D( 1, 0, 1, 0 ) 
     
    437445#endif 
    438446         !                                   !==  horizontal fluxes  ==! 
    439          zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 
    440          zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 
     447         DO_2D( 1, 1, 1, 1 ) 
     448            zwx(ji,jj) = e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * pu(ji,jj,jk) 
     449            zwy(ji,jj) = e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * pv(ji,jj,jk) 
     450         END_2D 
    441451         ! 
    442452         !                                   !==  compute and add the vorticity term trend  =! 
     
    483493      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    484494      REAL(wp) ::   zuav, zvau, ze3f, zmsk   ! local scalars 
    485       REAL(wp), DIMENSION(jpi,jpj) ::   zwx, zwy, zwz, zww   ! 2D workspace 
    486       !!---------------------------------------------------------------------- 
    487       ! 
    488       IF( kt == nit000 ) THEN 
    489          IF(lwp) WRITE(numout,*) 
    490          IF(lwp) WRITE(numout,*) 'dyn:vor_ens : vorticity term: enstrophy conserving scheme' 
    491          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     495      REAL(wp), DIMENSION(A2D(nn_hls)) ::   zwx, zwy, zwz   ! 2D workspace 
     496      !!---------------------------------------------------------------------- 
     497      ! 
     498      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     499         IF( kt == nit000 ) THEN 
     500            IF(lwp) WRITE(numout,*) 
     501            IF(lwp) WRITE(numout,*) 'dyn:vor_ens : vorticity term: enstrophy conserving scheme' 
     502            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     503         ENDIF 
    492504      ENDIF 
    493505      !                                                ! =============== 
     
    497509         SELECT CASE( kvor )                 !==  vorticity considered  ==! 
    498510         CASE ( np_COR )                           !* Coriolis (planetary vorticity) 
    499             zwz(:,:) = ff_f(:,:) 
     511            DO_2D( 1, 0, 1, 0 ) 
     512               zwz(ji,jj) = ff_f(ji,jj) 
     513            END_2D 
    500514         CASE ( np_RVO )                           !* relative vorticity 
    501515            DO_2D( 1, 0, 1, 0 ) 
     
    564578#endif 
    565579         !                                   !==  horizontal fluxes  ==! 
    566          zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 
    567          zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 
     580         DO_2D( 1, 1, 1, 1 ) 
     581            zwx(ji,jj) = e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * pu(ji,jj,jk) 
     582            zwy(ji,jj) = e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * pv(ji,jj,jk) 
     583         END_2D 
    568584         ! 
    569585         !                                   !==  compute and add the vorticity term trend  =! 
     
    609625      REAL(wp) ::   zua, zva     ! local scalars 
    610626      REAL(wp) ::   zmsk, ze3f   ! local scalars 
    611       REAL(wp), DIMENSION(jpi,jpj)       ::   zwx , zwy , z1_e3f 
    612       REAL(wp), DIMENSION(jpi,jpj)       ::   ztnw, ztne, ztsw, ztse 
    613       REAL(wp), DIMENSION(jpi,jpj,jpkm1) ::   zwz   ! 3D workspace, jpkm1 -> jpkm1 -> avoid lbc_lnk on jpk that is not defined 
    614       !!---------------------------------------------------------------------- 
    615       ! 
    616       IF( kt == nit000 ) THEN 
    617          IF(lwp) WRITE(numout,*) 
    618          IF(lwp) WRITE(numout,*) 'dyn:vor_een : vorticity term: energy and enstrophy conserving scheme' 
    619          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     627      REAL(wp), DIMENSION(A2D(nn_hls))       ::   z1_e3f 
     628#if defined key_loop_fusion 
     629      REAL(wp) ::   ztne, ztnw, ztnw_ip1, ztse, ztse_jp1, ztsw_jp1, ztsw_ip1 
     630      REAL(wp) ::   zwx, zwx_im1, zwx_jp1, zwx_im1_jp1 
     631      REAL(wp) ::   zwy, zwy_ip1, zwy_jm1, zwy_ip1_jm1 
     632#else 
     633      REAL(wp), DIMENSION(A2D(nn_hls))       ::   zwx , zwy 
     634      REAL(wp), DIMENSION(A2D(nn_hls))       ::   ztnw, ztne, ztsw, ztse 
     635#endif 
     636      REAL(wp), DIMENSION(A2D(nn_hls),jpkm1) ::   zwz   ! 3D workspace, jpkm1 -> jpkm1 -> avoid lbc_lnk on jpk that is not defined 
     637      !!---------------------------------------------------------------------- 
     638      ! 
     639      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     640         IF( kt == nit000 ) THEN 
     641            IF(lwp) WRITE(numout,*) 
     642            IF(lwp) WRITE(numout,*) 'dyn:vor_een : vorticity term: energy and enstrophy conserving scheme' 
     643            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     644         ENDIF 
    620645      ENDIF 
    621646      ! 
     
    625650         ! 
    626651#if defined key_qco   ||   defined key_linssh 
    627          DO_2D( 1, 0, 1, 0 )                 ! == reciprocal of e3 at F-point (key_qco) 
     652         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )                 ! == reciprocal of e3 at F-point (key_qco) 
    628653            z1_e3f(ji,jj) = 1._wp / e3f_vor(ji,jj,jk) 
    629654         END_2D 
     
    631656         SELECT CASE( nn_e3f_typ )           ! == reciprocal of e3 at F-point 
    632657         CASE ( 0 )                                   ! original formulation  (masked averaging of e3t divided by 4) 
    633             DO_2D( 1, 0, 1, 0 ) 
     658            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    634659               ! round brackets added to fix the order of floating point operations 
    635660               ! needed to ensure halo 1 - halo 2 compatibility 
     
    643668            END_2D 
    644669         CASE ( 1 )                                   ! new formulation  (masked averaging of e3t divided by the sum of mask) 
    645             DO_2D( 1, 0, 1, 0 ) 
     670            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    646671               ! round brackets added to fix the order of floating point operations 
    647672               ! needed to ensure halo 1 - halo 2 compatibility 
     
    662687         ! 
    663688         CASE ( np_COR )                           !* Coriolis (planetary vorticity) 
    664             DO_2D( 1, 0, 1, 0 ) 
     689            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    665690               zwz(ji,jj,jk) = ff_f(ji,jj) * z1_e3f(ji,jj) 
    666691            END_2D 
    667692         CASE ( np_RVO )                           !* relative vorticity 
    668             DO_2D( 1, 0, 1, 0 ) 
     693            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    669694               zwz(ji,jj,jk) = ( e2v(ji+1,jj  ) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk)  & 
    670695                  &            - e1u(ji  ,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)  ) * r1_e1e2f(ji,jj)*z1_e3f(ji,jj) 
    671696            END_2D 
    672697            IF( ln_dynvor_msk ) THEN                     ! mask the relative vorticity 
    673                DO_2D( 1, 0, 1, 0 ) 
     698               DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    674699                  zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) 
    675700               END_2D 
    676701            ENDIF 
    677702         CASE ( np_MET )                           !* metric term 
    678             DO_2D( 1, 0, 1, 0 ) 
     703            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    679704               zwz(ji,jj,jk) = (   ( pv(ji+1,jj,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   & 
    680705                  &              - ( pu(ji,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj)   ) * z1_e3f(ji,jj) 
    681706            END_2D 
    682707         CASE ( np_CRV )                           !* Coriolis + relative vorticity 
    683             DO_2D( 1, 0, 1, 0 ) 
    684                ! round brackets added to fix the order of floating point operations 
    685                ! needed to ensure halo 1 - halo 2 compatibility 
     708            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     709            ! round brackets added to fix the order of floating point operations 
     710            ! needed to ensure halo 1 - halo 2 compatibility 
    686711               zwz(ji,jj,jk) = (  ff_f(ji,jj) + ( ( e2v(ji+1,jj  ) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk)      & 
    687712                  &                               )                                                                  & ! bracket for halo 1 - halo 2 compatibility 
    688                   &                             - ( e1u(ji  ,jj+1) * pu(ji,jj+1,jk) - e1u(ji,jj) * pu(ji,jj,jk)      &  
     713                  &                             - ( e1u(ji  ,jj+1) * pu(ji,jj+1,jk) - e1u(ji,jj) * pu(ji,jj,jk)      & 
    689714                  &                               )                                                                  & ! bracket for halo 1 - halo 2 compatibility 
    690715                  &                             ) * r1_e1e2f(ji,jj)   ) * z1_e3f(ji,jj) 
    691716            END_2D 
    692717            IF( ln_dynvor_msk ) THEN                     ! mask the relative vorticity 
    693                DO_2D( 1, 0, 1, 0 ) 
     718               DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    694719                  zwz(ji,jj,jk) = ( zwz(ji,jj,jk) - ff_f(ji,jj) ) * fmask(ji,jj,jk) + ff_f(ji,jj) 
    695720               END_2D 
    696721            ENDIF 
    697722         CASE ( np_CME )                           !* Coriolis + metric 
    698             DO_2D( 1, 0, 1, 0 ) 
     723            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    699724               zwz(ji,jj,jk) = (   ff_f(ji,jj) + ( pv(ji+1,jj  ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   & 
    700725                  &                            - ( pu(ji  ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj)   ) * z1_e3f(ji,jj) 
     
    707732      !                                                ! =============== 
    708733      ! 
    709       CALL lbc_lnk( 'dynvor', zwz, 'F', 1.0_wp ) 
    710       ! 
    711       !                                                ! =============== 
    712       DO jk = 1, jpkm1                                 ! Horizontal slab 
    713          !                                             ! =============== 
    714          ! 
     734      IF (nn_hls==1) CALL lbc_lnk( 'dynvor', zwz, 'F', 1.0_wp ) 
     735      ! 
     736      !                                                ! =============== 
     737      !                                                ! Horizontal slab 
     738      !                                                ! =============== 
     739#if defined key_loop_fusion 
     740      DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
    715741         !                                   !==  horizontal fluxes  ==! 
    716          zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 
    717          zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 
     742         zwx         = e2u(ji  ,jj  ) * e3u(ji  ,jj  ,jk,Kmm) * pu(ji  ,jj  ,jk) 
     743         zwx_im1     = e2u(ji-1,jj  ) * e3u(ji-1,jj  ,jk,Kmm) * pu(ji-1,jj  ,jk) 
     744         zwx_jp1     = e2u(ji  ,jj+1) * e3u(ji  ,jj+1,jk,Kmm) * pu(ji  ,jj+1,jk) 
     745         zwx_im1_jp1 = e2u(ji-1,jj+1) * e3u(ji-1,jj+1,jk,Kmm) * pu(ji-1,jj+1,jk) 
     746         zwy         = e1v(ji  ,jj  ) * e3v(ji  ,jj  ,jk,Kmm) * pv(ji  ,jj  ,jk) 
     747         zwy_ip1     = e1v(ji+1,jj  ) * e3v(ji+1,jj  ,jk,Kmm) * pv(ji+1,jj  ,jk) 
     748         zwy_jm1     = e1v(ji  ,jj-1) * e3v(ji  ,jj-1,jk,Kmm) * pv(ji  ,jj-1,jk) 
     749         zwy_ip1_jm1 = e1v(ji+1,jj-1) * e3v(ji+1,jj-1,jk,Kmm) * pv(ji+1,jj-1,jk) 
     750         !                                   !==  compute and add the vorticity term trend  =! 
     751         ztne     = zwz(ji-1,jj  ,jk) + zwz(ji  ,jj  ,jk) + zwz(ji  ,jj-1,jk) 
     752         ztnw     = zwz(ji-1,jj-1,jk) + zwz(ji-1,jj  ,jk) + zwz(ji  ,jj  ,jk) 
     753         ztnw_ip1 = zwz(ji  ,jj-1,jk) + zwz(ji  ,jj  ,jk) + zwz(ji+1,jj  ,jk) 
     754         ztse     = zwz(ji  ,jj  ,jk) + zwz(ji  ,jj-1,jk) + zwz(ji-1,jj-1,jk) 
     755         ztse_jp1 = zwz(ji  ,jj+1,jk) + zwz(ji  ,jj  ,jk) + zwz(ji-1,jj  ,jk) 
     756         ztsw_jp1 = zwz(ji  ,jj  ,jk) + zwz(ji-1,jj  ,jk) + zwz(ji-1,jj+1,jk) 
     757         ztsw_ip1 = zwz(ji+1,jj-1,jk) + zwz(ji  ,jj-1,jk) + zwz(ji  ,jj  ,jk) 
     758         ! 
     759         zua = + r1_12 * r1_e1u(ji,jj) * (  ztne * zwy + ztnw_ip1 * zwy_ip1   & 
     760            &                             + ztse * zwy_jm1 + ztsw_ip1 * zwy_ip1_jm1 ) 
     761         zva = - r1_12 * r1_e2v(ji,jj) * (  ztsw_jp1 * zwx_im1_jp1 + ztse_jp1 * zwx_jp1   & 
     762            &                             + ztnw * zwx_im1 + ztne * zwx ) 
     763         pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zua 
     764         pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zva 
     765      END_3D 
     766#else 
     767      DO jk = 1, jpkm1 
     768         ! 
     769         !                                   !==  horizontal fluxes  ==! 
     770         DO_2D( 1, 1, 1, 1 ) 
     771            zwx(ji,jj) = e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * pu(ji,jj,jk) 
     772            zwy(ji,jj) = e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * pv(ji,jj,jk) 
     773         END_2D 
    718774         ! 
    719775         !                                   !==  compute and add the vorticity term trend  =! 
     
    733789            pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zva 
    734790         END_2D 
    735          !                                             ! =============== 
    736       END DO                                           !   End of slab 
     791      END DO 
     792#endif 
     793         !                                             ! =============== 
     794         !                                             !   End of slab 
    737795      !                                                ! =============== 
    738796   END SUBROUTINE vor_een 
     
    766824      REAL(wp) ::   zua, zva       ! local scalars 
    767825      REAL(wp) ::   zmsk, z1_e3t   ! local scalars 
    768       REAL(wp), DIMENSION(jpi,jpj)       ::   zwx , zwy 
    769       REAL(wp), DIMENSION(jpi,jpj)       ::   ztnw, ztne, ztsw, ztse 
    770       REAL(wp), DIMENSION(jpi,jpj,jpkm1) ::   zwz   ! 3D workspace, avoid lbc_lnk on jpk that is not defined 
    771       !!---------------------------------------------------------------------- 
    772       ! 
    773       IF( kt == nit000 ) THEN 
    774          IF(lwp) WRITE(numout,*) 
    775          IF(lwp) WRITE(numout,*) 'dyn:vor_eeT : vorticity term: energy and enstrophy conserving scheme' 
    776          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     826      REAL(wp), DIMENSION(A2D(nn_hls))       ::   zwx , zwy 
     827      REAL(wp), DIMENSION(A2D(nn_hls))       ::   ztnw, ztne, ztsw, ztse 
     828      REAL(wp), DIMENSION(A2D(nn_hls),jpkm1) ::   zwz   ! 3D workspace, avoid lbc_lnk on jpk that is not defined 
     829      !!---------------------------------------------------------------------- 
     830      ! 
     831      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     832         IF( kt == nit000 ) THEN 
     833            IF(lwp) WRITE(numout,*) 
     834            IF(lwp) WRITE(numout,*) 'dyn:vor_eeT : vorticity term: energy and enstrophy conserving scheme' 
     835            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     836         ENDIF 
    777837      ENDIF 
    778838      ! 
     
    784844         SELECT CASE( kvor )                 !==  vorticity considered  ==! 
    785845         CASE ( np_COR )                           !* Coriolis (planetary vorticity) 
    786             DO_2D( 1, 0, 1, 0 ) 
     846            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    787847               zwz(ji,jj,jk) = ff_f(ji,jj) 
    788848            END_2D 
    789849         CASE ( np_RVO )                           !* relative vorticity 
    790             DO_2D( 1, 0, 1, 0 ) 
     850            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    791851               ! round brackets added to fix the order of floating point operations 
    792852               ! needed to ensure halo 1 - halo 2 compatibility 
     
    796856            END_2D 
    797857            IF( ln_dynvor_msk ) THEN                     ! mask the relative vorticity 
    798                DO_2D( 1, 0, 1, 0 ) 
     858               DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    799859                  zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) 
    800860               END_2D 
    801861            ENDIF 
    802862         CASE ( np_MET )                           !* metric term 
    803             DO_2D( 1, 0, 1, 0 ) 
     863            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    804864               zwz(ji,jj,jk) = ( pv(ji+1,jj  ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   & 
    805865                  &          - ( pu(ji  ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 
    806866            END_2D 
    807867         CASE ( np_CRV )                           !* Coriolis + relative vorticity 
    808             DO_2D( 1, 0, 1, 0 ) 
     868            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    809869               ! round brackets added to fix the order of floating point operations 
    810870               ! needed to ensure halo 1 - halo 2 compatibility 
    811871               zwz(ji,jj,jk) = (  ff_f(ji,jj) + (  (e2v(ji+1,jj  ) * pv(ji+1,jj  ,jk) - e2v(ji,jj) * pv(ji,jj,jk))    & 
    812872                  &                              - (e1u(ji  ,jj+1) * pu(ji  ,jj+1,jk) - e1u(ji,jj) * pu(ji,jj,jk))  ) & 
    813                   &                         * r1_e1e2f(ji,jj)    ) 
     873                  &                           * r1_e1e2f(ji,jj)    ) 
    814874            END_2D 
    815875            IF( ln_dynvor_msk ) THEN                     ! mask the relative vorticity 
    816                DO_2D( 1, 0, 1, 0 ) 
     876               DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    817877                  zwz(ji,jj,jk) = ( zwz(ji,jj,jk) - ff_f(ji,jj) ) * fmask(ji,jj,jk) + ff_f(ji,jj) 
    818878               END_2D 
    819879            ENDIF 
    820880         CASE ( np_CME )                           !* Coriolis + metric 
    821             DO_2D( 1, 0, 1, 0 ) 
     881            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    822882               zwz(ji,jj,jk) = ff_f(ji,jj) + ( pv(ji+1,jj  ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   & 
    823883                  &                        - ( pu(ji  ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 
     
    831891      !                                                ! =============== 
    832892      ! 
    833       CALL lbc_lnk( 'dynvor', zwz, 'F', 1.0_wp ) 
     893      IF (nn_hls==1) CALL lbc_lnk( 'dynvor', zwz, 'F', 1.0_wp ) 
    834894      ! 
    835895      !                                                ! =============== 
     
    838898         ! 
    839899         !                                   !==  horizontal fluxes  ==! 
    840          zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 
    841          zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 
     900         DO_2D( 1, 1, 1, 1 ) 
     901            zwx(ji,jj) = e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * pu(ji,jj,jk) 
     902            zwy(ji,jj) = e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * pv(ji,jj,jk) 
     903         END_2D 
    842904         ! 
    843905         !                                   !==  compute and add the vorticity term trend  =! 
  • NEMO/trunk/src/OCE/DYN/dynzad.F90

    r14072 r14834  
    6060      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    6161      REAL(wp) ::   zua, zva     ! local scalars 
    62       REAL(wp), DIMENSION(jpi,jpj)     ::   zww 
    63       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zwuw, zwvw 
     62      REAL(wp), DIMENSION(A2D(nn_hls))     ::   zww 
     63      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zwuw, zwvw 
    6464      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdu, ztrdv 
    6565      !!---------------------------------------------------------------------- 
     
    6767      IF( ln_timing )   CALL timing_start('dyn_zad') 
    6868      ! 
    69       IF( kt == nit000 ) THEN 
    70          IF(lwp) WRITE(numout,*) 
    71          IF(lwp) WRITE(numout,*) 'dyn_zad : 2nd order vertical advection scheme' 
     69      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     70         IF( kt == nit000 ) THEN 
     71            IF(lwp) WRITE(numout,*) 
     72            IF(lwp) WRITE(numout,*) 'dyn_zad : 2nd order vertical advection scheme' 
     73         ENDIF 
    7274      ENDIF 
    7375 
     
    7981 
    8082      DO jk = 2, jpkm1                ! Vertical momentum advection at level w and u- and v- vertical 
    81          DO_2D( 0, 1, 0, 1 )              ! vertical fluxes 
    82           IF( ln_vortex_force ) THEN 
    83             zww(ji,jj) = 0.25_wp * e1e2t(ji,jj) * ( ww(ji,jj,jk) + wsd(ji,jj,jk) ) 
    84           ELSE 
    85             zww(ji,jj) = 0.25_wp * e1e2t(ji,jj) * ww(ji,jj,jk) 
    86           ENDIF 
    87          END_2D 
     83         IF( ln_vortex_force ) THEN       ! vertical fluxes 
     84            DO_2D( 0, 1, 0, 1 ) 
     85               zww(ji,jj) = 0.25_wp * e1e2t(ji,jj) * ( ww(ji,jj,jk) + wsd(ji,jj,jk) ) 
     86            END_2D 
     87         ELSE 
     88            DO_2D( 0, 1, 0, 1 ) 
     89               zww(ji,jj) = 0.25_wp * e1e2t(ji,jj) * ww(ji,jj,jk) 
     90            END_2D 
     91         ENDIF 
    8892         DO_2D( 0, 0, 0, 0 )              ! vertical momentum advection at w-point 
    8993            zwuw(ji,jj,jk) = ( zww(ji+1,jj  ) + zww(ji,jj) ) * ( puu(ji,jj,jk-1,Kmm) - puu(ji,jj,jk,Kmm) ) 
  • NEMO/trunk/src/OCE/DYN/dynzdf.F90

    r13497 r14834  
    1919   USE zdfdrg         ! vertical physics: top/bottom drag coef. 
    2020   USE dynadv    ,ONLY: ln_dynadv_vec    ! dynamics: advection form 
     21#if defined key_loop_fusion 
     22   USE dynldf_iso_lf,ONLY: akzu, akzv       ! dynamics: vertical component of rotated lateral mixing  
     23#else 
    2124   USE dynldf_iso,ONLY: akzu, akzv       ! dynamics: vertical component of rotated lateral mixing  
     25#endif 
    2226   USE ldfdyn         ! lateral diffusion: eddy viscosity coef. and type of operator 
    2327   USE trd_oce        ! trends: ocean variables 
     
    7882      REAL(wp) ::   zWui, zWvi         !   -      - 
    7983      REAL(wp) ::   zWus, zWvs         !   -      - 
    80       REAL(wp), DIMENSION(jpi,jpj,jpk)        ::  zwi, zwd, zws   ! 3D workspace  
     84      REAL(wp), DIMENSION(A2D(nn_hls),jpk)        ::  zwi, zwd, zws   ! 3D workspace 
    8185      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdu, ztrdv   !  -      - 
    8286      !!--------------------------------------------------------------------- 
     
    8488      IF( ln_timing )   CALL timing_start('dyn_zdf') 
    8589      ! 
    86       IF( kt == nit000 ) THEN       !* initialization 
    87          IF(lwp) WRITE(numout,*) 
    88          IF(lwp) WRITE(numout,*) 'dyn_zdf_imp : vertical momentum diffusion implicit operator' 
    89          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ ' 
    90          ! 
    91          If( ln_linssh ) THEN   ;    r_vvl = 0._wp    ! non-linear free surface indicator 
    92          ELSE                   ;    r_vvl = 1._wp 
     90      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     91         IF( kt == nit000 ) THEN       !* initialization 
     92            IF(lwp) WRITE(numout,*) 
     93            IF(lwp) WRITE(numout,*) 'dyn_zdf_imp : vertical momentum diffusion implicit operator' 
     94            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ ' 
     95            ! 
     96            If( ln_linssh ) THEN   ;    r_vvl = 0._wp    ! non-linear free surface indicator 
     97            ELSE                   ;    r_vvl = 1._wp 
     98            ENDIF 
    9399         ENDIF 
    94100      ENDIF 
  • NEMO/trunk/src/OCE/DYN/sshwzv.F90

    r14205 r14834  
    7878      REAL(wp), DIMENSION(jpi,jpj,jpt), INTENT(inout) ::   pssh           ! sea-surface height 
    7979      !  
    80       INTEGER  ::   jk      ! dummy loop index 
     80      INTEGER  ::   ji, jj, jk      ! dummy loop index 
    8181      REAL(wp) ::   zcoef   ! local scalar 
    8282      REAL(wp), DIMENSION(jpi,jpj) ::   zhdiv   ! 2D workspace 
     
    103103      ! 
    104104      zhdiv(:,:) = 0._wp 
    105       DO jk = 1, jpkm1                                 ! Horizontal divergence of barotropic transports 
    106         zhdiv(:,:) = zhdiv(:,:) + e3t(:,:,jk,Kmm) * hdiv(:,:,jk) 
    107       END DO 
     105      DO_3D( 1, nn_hls, 1, nn_hls, 1, jpkm1 )                                 ! Horizontal divergence of barotropic transports 
     106        zhdiv(ji,jj) = zhdiv(ji,jj) + e3t(ji,jj,jk,Kmm) * hdiv(ji,jj,jk) 
     107      END_3D 
    108108      !                                                ! Sea surface elevation time stepping 
    109109      ! In time-split case we need a first guess of the ssh after (using the baroclinic timestep) in order to 
    110110      ! compute the vertical velocity which can be used to compute the non-linear terms of the momentum equations. 
    111111      !  
    112       pssh(:,:,Kaa) = (  pssh(:,:,Kbb) - rDt * ( zcoef * ( emp_b(:,:) + emp(:,:) ) + zhdiv(:,:) )  ) * ssmask(:,:) 
     112      DO_2D_OVR( 1, nn_hls, 1, nn_hls )                ! Loop bounds limited by hdiv definition in div_hor 
     113         pssh(ji,jj,Kaa) = (  pssh(ji,jj,Kbb) - rDt * ( zcoef * ( emp_b(ji,jj) + emp(ji,jj) ) + zhdiv(ji,jj) )  ) * ssmask(ji,jj) 
     114      END_2D 
     115      ! pssh must be defined everywhere (true for dyn_spg_ts, not for dyn_spg_exp) 
     116      IF ( .NOT. ln_dynspg_ts .AND. nn_hls == 2 ) CALL lbc_lnk( 'sshwzv', pssh(:,:,Kaa), 'T', 1.0_wp ) 
    113117      ! 
    114118#if defined key_agrif 
     
    119123      IF ( .NOT.ln_dynspg_ts ) THEN 
    120124         IF( ln_bdy ) THEN 
    121             CALL lbc_lnk( 'sshwzv', pssh(:,:,Kaa), 'T', 1.0_wp )    ! Not sure that's necessary 
     125            IF (nn_hls==1) CALL lbc_lnk( 'sshwzv', pssh(:,:,Kaa), 'T', 1.0_wp )    ! Not sure that's necessary 
    122126            CALL bdy_ssh( pssh(:,:,Kaa) )             ! Duplicate sea level across open boundaries 
    123127         ENDIF 
     
    178182            ! horizontal divergence of thickness diffusion transport ( velocity multiplied by e3t) 
    179183            ! - ML - note: computation already done in dom_vvl_sf_nxt. Could be optimized (not critical and clearer this way) 
    180             DO_2D( 0, 0, 0, 0 ) 
     184            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    181185               zhdiv(ji,jj,jk) = r1_e1e2t(ji,jj) * ( un_td(ji,jj,jk) - un_td(ji-1,jj,jk) + vn_td(ji,jj,jk) - vn_td(ji,jj-1,jk) ) 
    182186            END_2D 
    183187         END DO 
    184          CALL lbc_lnk('sshwzv', zhdiv, 'T', 1.0_wp)  ! - ML - Perhaps not necessary: not used for horizontal "connexions" 
     188         IF (nn_hls==1) CALL lbc_lnk('sshwzv', zhdiv, 'T', 1.0_wp)  ! - ML - Perhaps not necessary: not used for horizontal "connexions" 
    185189         !                             ! Is it problematic to have a wrong vertical velocity in boundary cells? 
    186190         !                             ! Same question holds for hdiv. Perhaps just for security 
    187          DO jk = jpkm1, 1, -1                       ! integrate from the bottom the hor. divergence 
     191         DO_3DS( 1, 1, 1, 1, jpkm1, 1, -1 )         ! integrate from the bottom the hor. divergence 
    188192            ! computation of w 
    189             pww(:,:,jk) = pww(:,:,jk+1) - (   e3t(:,:,jk,Kmm) * hdiv(:,:,jk)   & 
    190                &                            +                  zhdiv(:,:,jk)   & 
    191                &                            + r1_Dt * (  e3t(:,:,jk,Kaa)       & 
    192                &                                       - e3t(:,:,jk,Kbb) )   ) * tmask(:,:,jk) 
    193          END DO 
     193            pww(ji,jj,jk) = pww(ji,jj,jk+1) - (   e3t(ji,jj,jk,Kmm) * hdiv(ji,jj,jk)   & 
     194               &                                  +                  zhdiv(ji,jj,jk)   & 
     195               &                                  + r1_Dt * (  e3t(ji,jj,jk,Kaa)       & 
     196               &                                             - e3t(ji,jj,jk,Kbb) )   ) * tmask(ji,jj,jk) 
     197         END_3D 
    194198         !          IF( ln_vvl_layer ) pww(:,:,:) = 0.e0 
    195199         DEALLOCATE( zhdiv )  
     
    197201      ELSEIF( ln_linssh )   THEN                      !==  linear free surface cases  ==! 
    198202         !                                            !=================================! 
    199          DO jk = jpkm1, 1, -1                               ! integrate from the bottom the hor. divergence 
    200             pww(:,:,jk) = pww(:,:,jk+1) - (  e3t(:,:,jk,Kmm) * hdiv(:,:,jk)  ) * tmask(:,:,jk) 
    201          END DO 
     203         DO_3DS( 1, 1, 1, 1, jpkm1, 1, -1 )                 ! integrate from the bottom the hor. divergence 
     204            pww(ji,jj,jk) = pww(ji,jj,jk+1) - (  e3t(ji,jj,jk,Kmm) * hdiv(ji,jj,jk)  ) * tmask(ji,jj,jk) 
     205         END_3D 
    202206         !                                            !==========================================! 
    203207      ELSE                                            !==  Quasi-Eulerian vertical coordinate  ==!   ('key_qco') 
    204208         !                                            !==========================================! 
    205          DO jk = jpkm1, 1, -1                               ! integrate from the bottom the hor. divergence 
    206             pww(:,:,jk) = pww(:,:,jk+1) - (  e3t(:,:,jk,Kmm) * hdiv(:,:,jk)                 & 
    207                &                            + r1_Dt * (  e3t(:,:,jk,Kaa)        & 
    208                &                                       - e3t(:,:,jk,Kbb)  )   ) * tmask(:,:,jk) 
    209          END DO 
     209         DO_3DS( 1, 1, 1, 1, jpkm1, 1, -1 )                 ! integrate from the bottom the hor. divergence 
     210            pww(ji,jj,jk) = pww(ji,jj,jk+1) - (  e3t(ji,jj,jk,Kmm) * hdiv(ji,jj,jk)    & 
     211               &                                 + r1_Dt * (  e3t(ji,jj,jk,Kaa)        & 
     212               &                                            - e3t(ji,jj,jk,Kbb)  )   ) * tmask(ji,jj,jk) 
     213         END_3D 
    210214      ENDIF 
    211215 
     
    357361      zdt = 2._wp * rn_Dt                            ! 2*rn_Dt and not rDt (for restartability) 
    358362      IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN 
    359          DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     363         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) 
    360364            z1_e3t = 1._wp / e3t(ji,jj,jk,Kmm) 
    361365            Cu_adv(ji,jj,jk) =   zdt *                                                         & 
     
    374378         END_3D 
    375379      ELSE 
    376          DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     380         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) 
    377381            z1_e3t = 1._wp / e3t(ji,jj,jk,Kmm) 
    378382            Cu_adv(ji,jj,jk) =   zdt *                                                      & 
     
    387391         END_3D 
    388392      ENDIF 
    389       CALL lbc_lnk( 'sshwzv', Cu_adv, 'T', 1.0_wp ) 
     393      IF (nn_hls==1) CALL lbc_lnk( 'sshwzv', Cu_adv, 'T', 1.0_wp ) 
    390394      ! 
    391395      CALL iom_put("Courant",Cu_adv) 
    392396      ! 
    393397      IF( MAXVAL( Cu_adv(:,:,:) ) > Cu_min ) THEN       ! Quick check if any breaches anywhere 
    394          DO_3DS( 1, 1, 1, 1, jpkm1, 2, -1 )             ! or scan Courant criterion and partition ! w where necessary 
     398         DO_3DS( nn_hls, nn_hls, nn_hls, nn_hls, jpkm1, 2, -1 )             ! or scan Courant criterion and partition ! w where necessary 
    395399            ! 
    396400            zCu = MAX( Cu_adv(ji,jj,jk) , Cu_adv(ji,jj,jk-1) ) 
  • NEMO/trunk/src/OCE/DYN/wet_dry.F90

    r14433 r14834  
    117117         IF( ierr /= 0 ) CALL ctl_stop('STOP', 'wad_init : Array allocation error') 
    118118      ENDIF 
     119 
     120      IF( ln_tile .AND. ln_wd_il ) CALL ctl_warn('Tiling has not been tested with ln_wd_il = T') 
    119121      ! 
    120122   END SUBROUTINE wad_init 
Note: See TracChangeset for help on using the changeset viewer.