New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 15574 for NEMO/branches/2021/dev_r14318_RK3_stage1/src/OCE/TRA/traldf_iso.F90 – NEMO

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

#2605 #2715 trunk merged into dev_r14318_RK3_stage1

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

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2021/dev_r14318_RK3_stage1

    • Property svn:externals
      •  

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

    r15512 r15574  
    132132      INTEGER  ::  ji, jj, jk, jn   ! dummy loop indices 
    133133      INTEGER  ::  ikt 
    134       INTEGER  ::  ierr             ! local integer 
     134      INTEGER  ::  ierr, iij        ! local integer 
    135135      REAL(wp) ::  zmsku, zahu_w, zabe1, zcof1, zcoef3   ! local scalars 
    136136      REAL(wp) ::  zmskv, zahv_w, zabe2, zcof2, zcoef4   !   -      - 
     
    141141      ! 
    142142      IF( kpass == 1 .AND. kt == kit000 )  THEN 
    143          IF( ntile == 0 .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     143         IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
    144144            IF(lwp) WRITE(numout,*) 
    145145            IF(lwp) WRITE(numout,*) 'tra_ldf_iso : rotated laplacian diffusion operator on ', cdtype 
     
    147147         ENDIF 
    148148         ! 
    149          DO_3D( 0, 0, 0, 0, 1, jpk ) 
     149         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 
    150150            akz     (ji,jj,jk) = 0._wp 
    151151            ah_wslp2(ji,jj,jk) = 0._wp 
     
    153153      ENDIF 
    154154      ! 
    155       IF( ntile == 0 .OR. ntile == 1 )  THEN                           ! Do only on the first tile 
     155      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                           ! Do only on the first tile 
    156156         l_hst = .FALSE. 
    157157         l_ptr = .FALSE. 
     
    161161      ENDIF 
    162162      ! 
     163      ! Define pt_rhs halo points for multi-point haloes in bilaplacian case 
     164      IF( nldf_tra == np_blp_i .AND. kpass == 1 ) THEN ; iij = nn_hls 
     165      ELSE                                             ; iij = 1 
     166      ENDIF 
     167 
    163168      ! 
    164169      IF( kpass == 1 ) THEN   ;   zsign =  1._wp      ! bilaplacian operator require a minus sign (eddy diffusivity >0) 
     
    172177      IF( kpass == 1 ) THEN                  !==  first pass only  ==! 
    173178         ! 
    174          DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     179         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 
    175180            ! 
    176181            zmsku = wmask(ji,jj,jk) / MAX(   umask(ji  ,jj,jk-1) + umask(ji-1,jj,jk)          & 
     
    179184               &                           + vmask(ji,jj-1,jk-1) + vmask(ji,jj  ,jk) , 1._wp  ) 
    180185               ! 
    181             zahu_w = (   pahu(ji  ,jj,jk-1) + pahu(ji-1,jj,jk)    & 
    182                &       + pahu(ji-1,jj,jk-1) + pahu(ji  ,jj,jk)  ) * zmsku 
    183             zahv_w = (   pahv(ji,jj  ,jk-1) + pahv(ji,jj-1,jk)    & 
    184                &       + pahv(ji,jj-1,jk-1) + pahv(ji,jj  ,jk)  ) * zmskv 
     186            ! round brackets added to fix the order of floating point operations 
     187            ! needed to ensure halo 1 - halo 2 compatibility 
     188            zahu_w = ( (  pahu(ji  ,jj,jk-1) + pahu(ji-1,jj,jk)                    & 
     189               &       )                                                           & ! bracket for halo 1 - halo 2 compatibility 
     190               &       + ( pahu(ji-1,jj,jk-1) + pahu(ji  ,jj,jk)                   & 
     191               &         )                                                         & ! bracket for halo 1 - halo 2 compatibility 
     192               &     ) * zmsku 
     193            zahv_w = ( (  pahv(ji,jj  ,jk-1) + pahv(ji,jj-1,jk)                    & 
     194               &       )                                                           & ! bracket for halo 1 - halo 2 compatibility 
     195               &       + ( pahv(ji,jj-1,jk-1) + pahv(ji,jj  ,jk)                   & 
     196               &         )                                                         & ! bracket for halo 1 - halo 2 compatibility 
     197               &     ) * zmskv 
    185198               ! 
    186199            ah_wslp2(ji,jj,jk) = zahu_w * wslpi(ji,jj,jk) * wslpi(ji,jj,jk)   & 
     
    189202         ! 
    190203         IF( ln_traldf_msc ) THEN                ! stabilizing vertical diffusivity coefficient 
    191             DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     204            DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 
     205               ! round brackets added to fix the order of floating point operations 
     206               ! needed to ensure halo 1 - halo 2 compatibility 
    192207               akz(ji,jj,jk) = 0.25_wp * (                                                                     & 
    193                   &              ( pahu(ji  ,jj,jk) + pahu(ji  ,jj,jk-1) ) / ( e1u(ji  ,jj) * e1u(ji  ,jj) )   & 
     208                  &            ( ( pahu(ji  ,jj,jk) + pahu(ji  ,jj,jk-1) ) / ( e1u(ji  ,jj) * e1u(ji  ,jj) )   & 
    194209                  &            + ( pahu(ji-1,jj,jk) + pahu(ji-1,jj,jk-1) ) / ( e1u(ji-1,jj) * e1u(ji-1,jj) )   & 
    195                   &            + ( pahv(ji,jj  ,jk) + pahv(ji,jj  ,jk-1) ) / ( e2v(ji,jj  ) * e2v(ji,jj  ) )   & 
    196                   &            + ( pahv(ji,jj-1,jk) + pahv(ji,jj-1,jk-1) ) / ( e2v(ji,jj-1) * e2v(ji,jj-1) )   ) 
     210                  &            )                                                                               & ! bracket for halo 1 - halo 2 compatibility 
     211                  &            + ( ( pahv(ji,jj  ,jk) + pahv(ji,jj  ,jk-1) ) / ( e2v(ji,jj  ) * e2v(ji,jj  ) ) & 
     212                  &              + ( pahv(ji,jj-1,jk) + pahv(ji,jj-1,jk-1) ) / ( e2v(ji,jj-1) * e2v(ji,jj-1) ) & 
     213                  &              )                                                                             & ! bracket for halo 1 - halo 2 compatibility 
     214                  &                      ) 
    197215            END_3D 
    198216            ! 
    199217            IF( ln_traldf_blp ) THEN                ! bilaplacian operator 
    200                DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     218               DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 
    201219                  akz(ji,jj,jk) = 16._wp   & 
    202220                     &   * ah_wslp2   (ji,jj,jk)   & 
     
    206224               END_3D 
    207225            ELSEIF( ln_traldf_lap ) THEN              ! laplacian operator 
    208                DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     226               DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 
    209227                  ze3w_2 = e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) 
    210228                  zcoef0 = rDt * (  akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ze3w_2  ) 
     
    214232           ! 
    215233         ELSE                                    ! 33 flux set to zero with akz=ah_wslp2 ==>> computed in full implicit 
    216             DO_3D( 0, 0, 0, 0, 1, jpk ) 
     234            DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 
    217235               akz(ji,jj,jk) = ah_wslp2(ji,jj,jk) 
    218236            END_3D 
     
    227245         !!   I - masked horizontal derivative 
    228246         !!---------------------------------------------------------------------- 
    229 !!gm : bug.... why (x,:,:)?   (1,jpj,:) and (jpi,1,:) should be sufficient.... 
    230          zdit (ntsi-nn_hls,:,:) = 0._wp     ;     zdit (ntei+nn_hls,:,:) = 0._wp 
    231          zdjt (ntsi-nn_hls,:,:) = 0._wp     ;     zdjt (ntei+nn_hls,:,:) = 0._wp 
    232          !!end 
     247         zdit(:,:,:) = 0._wp 
     248         zdjt(:,:,:) = 0._wp 
    233249 
    234250         ! Horizontal tracer gradient 
    235          DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 
     251         DO_3D( iij, iij-1, iij, iij-1, 1, jpkm1 ) 
    236252            zdit(ji,jj,jk) = ( pt(ji+1,jj  ,jk,jn) - pt(ji,jj,jk,jn) ) * umask(ji,jj,jk) 
    237253            zdjt(ji,jj,jk) = ( pt(ji  ,jj+1,jk,jn) - pt(ji,jj,jk,jn) ) * vmask(ji,jj,jk) 
    238254         END_3D 
    239255         IF( ln_zps ) THEN      ! botton and surface ocean correction of the horizontal gradient 
    240             DO_2D( 1, 0, 1, 0 )           ! bottom correction (partial bottom cell) 
     256            DO_2D( iij, iij-1, iij, iij-1 )            ! bottom correction (partial bottom cell) 
    241257               zdit(ji,jj,mbku(ji,jj)) = pgu(ji,jj,jn) 
    242258               zdjt(ji,jj,mbkv(ji,jj)) = pgv(ji,jj,jn) 
    243259            END_2D 
    244260            IF( ln_isfcav ) THEN      ! first wet level beneath a cavity 
    245                DO_2D( 1, 0, 1, 0 ) 
     261               DO_2D( iij, iij-1, iij, iij-1 ) 
    246262                  IF( miku(ji,jj) > 1 )   zdit(ji,jj,miku(ji,jj)) = pgui(ji,jj,jn) 
    247263                  IF( mikv(ji,jj) > 1 )   zdjt(ji,jj,mikv(ji,jj)) = pgvi(ji,jj,jn) 
     
    256272         DO jk = 1, jpkm1                                 ! Horizontal slab 
    257273            ! 
    258             DO_2D( 1, 1, 1, 1 ) 
     274            DO_2D( iij, iij, iij, iij ) 
    259275               !                             !== Vertical tracer gradient 
    260276               zdk1t(ji,jj) = ( pt(ji,jj,jk,jn) - pt(ji,jj,jk+1,jn) ) * wmask(ji,jj,jk+1)     ! level jk+1 
     
    265281            END_2D 
    266282            ! 
    267             DO_2D( 1, 0, 1, 0 )           !==  Horizontal fluxes 
     283            DO_2D( iij, iij-1, iij, iij-1 )           !==  Horizontal fluxes 
    268284               zabe1 = pahu(ji,jj,jk) * e2_e1u(ji,jj) * e3u(ji,jj,jk,Kmm) 
    269285               zabe2 = pahv(ji,jj,jk) * e1_e2v(ji,jj) * e3v(ji,jj,jk,Kmm) 
     
    278294               zcof2 = - pahv(ji,jj,jk) * e1v(ji,jj) * vslp(ji,jj,jk) * zmskv 
    279295               ! 
    280                zftu(ji,jj,jk ) = (  zabe1 * zdit(ji,jj,jk)   & 
    281                   &               + zcof1 * (  zdkt (ji+1,jj) + zdk1t(ji,jj)      & 
    282                   &                          + zdk1t(ji+1,jj) + zdkt (ji,jj)  )  ) * umask(ji,jj,jk) 
    283                zftv(ji,jj,jk) = (  zabe2 * zdjt(ji,jj,jk)   & 
    284                   &               + zcof2 * (  zdkt (ji,jj+1) + zdk1t(ji,jj)      & 
    285                   &                          + zdk1t(ji,jj+1) + zdkt (ji,jj)  )  ) * vmask(ji,jj,jk) 
     296               ! round brackets added to fix the order of floating point operations 
     297               ! needed to ensure halo 1 - halo 2 compatibility 
     298               zftu(ji,jj,jk ) = (  zabe1 * zdit(ji,jj,jk)                       & 
     299                  &               + zcof1 * ( ( zdkt (ji+1,jj) + zdk1t(ji,jj)    & 
     300                  &                           )                                  & ! bracket for halo 1 - halo 2 compatibility 
     301                  &                         + ( zdk1t(ji+1,jj) + zdkt (ji,jj)    & 
     302                  &                           )                                  & ! bracket for halo 1 - halo 2 compatibility 
     303                  &                         ) ) * umask(ji,jj,jk) 
     304               zftv(ji,jj,jk) = (  zabe2 * zdjt(ji,jj,jk)                        & 
     305                  &              + zcof2 * ( ( zdkt (ji,jj+1) + zdk1t(ji,jj)     & 
     306                  &                           )                                  & ! bracket for halo 1 - halo 2 compatibility 
     307                  &                         + ( zdk1t(ji,jj+1) + zdkt (ji,jj)    & 
     308                  &                           )                                  & ! bracket for halo 1 - halo 2 compatibility 
     309                  &                         ) ) * vmask(ji,jj,jk) 
    286310            END_2D 
    287311            ! 
    288             DO_2D( 0, 0, 0, 0 )           !== horizontal divergence and add to pta 
    289                pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn)    & 
    290                   &       + zsign * (  zftu(ji,jj,jk) - zftu(ji-1,jj,jk) + zftv(ji,jj,jk) - zftv(ji,jj-1,jk)  )   & 
    291                   &                                              * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 
     312            DO_2D( iij-1, iij-1, iij-1, iij-1 )           !== horizontal divergence and add to pta 
     313               ! round brackets added to fix the order of floating point operations 
     314               ! needed to ensure halo 1 - halo 2 compatibility 
     315               pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn)                         & 
     316                  &       + zsign * ( ( zftu(ji,jj,jk) - zftu(ji-1,jj,jk)        & 
     317                  &                   )                                          & ! bracket for halo 1 - halo 2 compatibility 
     318                  &                 + ( zftv(ji,jj,jk) - zftv(ji,jj-1,jk)        & 
     319                  &                   )                                          & ! bracket for halo 1 - halo 2 compatibility 
     320                  &                 ) * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 
    292321            END_2D 
    293322         END DO                                        !   End of slab 
     
    302331         ztfw(:,:, 1 ) = 0._wp      ;      ztfw(:,:,jpk) = 0._wp 
    303332 
    304          DO_3D( 0, 0, 0, 0, 2, jpkm1 )    ! interior (2=<jk=<jpk-1) 
     333         DO_3D( iij-1, iij-1, iij-1, iij-1, 2, jpkm1 )    ! interior (2=<jk=<jpk-1) 
    305334            ! 
    306335            zmsku = wmask(ji,jj,jk) / MAX(   umask(ji  ,jj,jk-1) + umask(ji-1,jj,jk)          & 
     
    317346            zcoef4 = - zahv_w * e1t(ji,jj) * zmskv * wslpj (ji,jj,jk) 
    318347            ! 
    319             ztfw(ji,jj,jk) = zcoef3 * (   zdit(ji  ,jj  ,jk-1) + zdit(ji-1,jj  ,jk)      & 
    320                &                        + zdit(ji-1,jj  ,jk-1) + zdit(ji  ,jj  ,jk)  )   & 
    321                &           + zcoef4 * (   zdjt(ji  ,jj  ,jk-1) + zdjt(ji  ,jj-1,jk)      & 
    322                &                        + zdjt(ji  ,jj-1,jk-1) + zdjt(ji  ,jj  ,jk)  ) 
     348            ! round brackets added to fix the order of floating point operations 
     349            ! needed to ensure halo 1 - halo 2 compatibility 
     350            ztfw(ji,jj,jk) = zcoef3 * ( ( zdit(ji  ,jj  ,jk-1) + zdit(ji-1,jj  ,jk)    & 
     351                  &                     )                                              & ! bracket for halo 1 - halo 2 compatibility 
     352                  &                   + ( zdit(ji-1,jj  ,jk-1) + zdit(ji  ,jj  ,jk)    & 
     353                  &                     )                                              & ! bracket for halo 1 - halo 2 compatibility 
     354                  &                   )                                                & 
     355                  &        + zcoef4 * ( ( zdjt(ji  ,jj  ,jk-1) + zdjt(ji  ,jj-1,jk)    & 
     356                  &                     )                                              & ! bracket for halo 1 - halo 2 compatibility 
     357                  &                   + ( zdjt(ji  ,jj-1,jk-1) + zdjt(ji  ,jj  ,jk)    & 
     358                  &                     )                                              & ! bracket for halo 1 - halo 2 compatibility 
     359                  &                   ) 
    323360         END_3D 
    324361         !                                !==  add the vertical 33 flux  ==! 
    325362         IF( ln_traldf_lap ) THEN               ! laplacian case: eddy coef = ah_wslp2 - akz 
    326             DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     363            DO_3D( iij-1, iij-1, iij-1, iij-1, 2, jpkm1 ) 
    327364               ztfw(ji,jj,jk) = ztfw(ji,jj,jk) + e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * wmask(ji,jj,jk)   & 
    328365                  &                            * ( ah_wslp2(ji,jj,jk) - akz(ji,jj,jk) )               & 
     
    333370            SELECT CASE( kpass ) 
    334371            CASE(  1  )                            ! 1st pass : eddy coef = ah_wslp2 
    335                DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     372               DO_3D( iij-1, iij-1, iij-1, iij-1, 2, jpkm1 ) 
    336373                  ztfw(ji,jj,jk) =   & 
    337374                     &  ztfw(ji,jj,jk) + ah_wslp2(ji,jj,jk) * e1e2t(ji,jj)   & 
     
    347384         ENDIF 
    348385         ! 
    349          DO_3D( 0, 0, 0, 0, 1, jpkm1 )    !==  Divergence of vertical fluxes added to pta  ==! 
     386         DO_3D( iij-1, iij-1, iij-1, iij-1, 1, jpkm1 )    !==  Divergence of vertical fluxes added to pta  ==! 
    350387            pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + zsign * (  ztfw (ji,jj,jk) - ztfw(ji,jj,jk+1)  ) * r1_e1e2t(ji,jj)   & 
    351388               &                                             / e3t(ji,jj,jk,Kmm) 
Note: See TracChangeset for help on using the changeset viewer.