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

Changeset 15014 for NEMO/trunk/src/OCE


Ignore:
Timestamp:
2021-06-17T19:02:04+02:00 (3 years ago)
Author:
smasson
Message:

trunk: simplify F point halo computation, #2693

Location:
NEMO/trunk/src/OCE
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • NEMO/trunk/src/OCE/BDY/bdyini.F90

    r14433 r15014  
    4444   INTEGER, DIMENSION(jp_nseg) ::   jpjnob, jpindt, jpinft, npckgn   ! 
    4545   INTEGER, DIMENSION(jp_nseg) ::   jpjsob, jpisdt, jpisft, npckgs   ! 
     46    
     47   !! * Substitutions 
     48#  include "do_loop_substitute.h90" 
    4649   !!---------------------------------------------------------------------- 
    4750   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    140143      !! ** Input   :  bdy_init.nc, input file for unstructured open boundaries 
    141144      !!----------------------------------------------------------------------       
     145      INTEGER  ::   ji, jj                                 ! dummy loop indices 
    142146      INTEGER  ::   ib_bdy, ii, ij, igrd, ib, ir, iseg     ! dummy loop indices 
    143147      INTEGER  ::   icount, icountr, icountr0, ibr_max     ! local integers 
     
    630634      ! For the flagu/flagv calculation below we require a version of fmask without 
    631635      ! the land boundary condition (shlat) included: 
    632       DO ij = 1, jpjm1 
    633          DO ii = 1, jpim1 
    634             zfmask(ii,ij) =  ztmask(ii,ij  ) * ztmask(ii+1,ij  )   & 
    635                &           * ztmask(ii,ij+1) * ztmask(ii+1,ij+1) 
    636          END DO 
    637       END DO 
     636      DO_2D( 0, 0, 0, 0 ) 
     637         zfmask(ji,jj) =  ztmask(ji,jj  ) * ztmask(ji+1,jj  )   & 
     638            &           * ztmask(ji,jj+1) * ztmask(ji+1,jj+1) 
     639      END_2D 
    638640      CALL lbc_lnk( 'bdyini', zfmask, 'F', 1.0_wp ) 
    639641 
     
    646648 
    647649      ! Derive mask on U and V grid from mask on T grid 
    648       DO ij = 1, jpjm1 
    649          DO ii = 1, jpim1 
    650             bdyumask(ii,ij) = bdytmask(ii,ij) * bdytmask(ii+1,ij  ) 
    651             bdyvmask(ii,ij) = bdytmask(ii,ij) * bdytmask(ii  ,ij+1)   
    652          END DO 
    653       END DO 
     650      DO_2D( 0, 0, 0, 0 ) 
     651            bdyumask(ji,jj) = bdytmask(ji,jj) * bdytmask(ji+1,jj  ) 
     652            bdyvmask(ji,jj) = bdytmask(ji,jj) * bdytmask(ji  ,jj+1)   
     653      END_2D 
    654654      CALL lbc_lnk( 'bdyini', bdyumask, 'U', 1.0_wp , bdyvmask, 'V', 1.0_wp )   ! Lateral boundary cond.  
    655655 
     
    687687 
    688688      ! Recompute zfmask 
    689       DO ij = 1, jpjm1 
    690          DO ii = 1, jpim1 
    691             zfmask(ii,ij) =  ztmask(ii,ij  ) * ztmask(ii+1,ij  )   & 
    692                &           * ztmask(ii,ij+1) * ztmask(ii+1,ij+1) 
    693          END DO 
    694       END DO 
     689      DO_2D( 0, 0, 0, 0 ) 
     690         zfmask(ji,jj) =  ztmask(ji,jj  ) * ztmask(ji+1,jj  )   & 
     691            &           * ztmask(ji,jj+1) * ztmask(ji+1,jj+1) 
     692      END_2D 
    695693      CALL lbc_lnk( 'bdyini', zfmask, 'F', 1.0_wp ) 
    696694 
  • NEMO/trunk/src/OCE/DOM/domain.F90

    r14834 r15014  
    148148      END DO 
    149149      ! 
    150       DO jk = 1, jpkm1 
    151          hf_0(1:jpim1,:) = hf_0(1:jpim1,:) + e3f_0(1:jpim1,:,jk)*vmask(1:jpim1,:,jk)*vmask(2:jpi,:,jk) 
    152       END DO 
     150      DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     151         hf_0(ji,jj) = hf_0(ji,jj) + e3f_0(ji,jj,jk)*vmask(ji,jj,jk)*vmask(ji+1,jj,jk) 
     152      END_3D 
    153153      CALL lbc_lnk('domain', hf_0, 'F', 1._wp) 
    154154      ! 
  • NEMO/trunk/src/OCE/DOM/dommsk.F90

    r14433 r15014  
    182182      ssfmask(:,:) = MAXVAL( fmask(:,:,:), DIM=3 ) 
    183183      IF( lk_SWE ) THEN      ! Shallow Water Eq. case : redefine ssfmask 
    184          DO_2D( 0,0, 0,0 ) 
     184         DO_2D( 0, 0, 0, 0 ) 
    185185            ssfmask(ji,jj) = MAX(  ssmask(ji,jj+1), ssmask(ji+1,jj+1),  &  
    186186               &                   ssmask(ji,jj  ), ssmask(ji+1,jj  )   ) 
     
    202202      ! Lateral boundary conditions on velocity (modify fmask) 
    203203      ! ---------------------------------------   
    204       IF( rn_shlat /= 0 ) THEN      ! Not free-slip lateral boundary condition 
     204      IF( rn_shlat /= 0._wp ) THEN      ! Not free-slip lateral boundary condition 
    205205         ! 
    206          DO jk = 1, jpk 
    207             DO_2D( 0, 0, 0, 0 ) 
    208                IF( fmask(ji,jj,jk) == 0._wp ) THEN 
    209                   fmask(ji,jj,jk) = rn_shlat * MIN( 1._wp , MAX( umask(ji,jj,jk), umask(ji,jj+1,jk), & 
    210                      &                                           vmask(ji,jj,jk), vmask(ji+1,jj,jk) ) ) 
    211                ENDIF 
    212             END_2D 
    213             DO jj = 2, jpjm1 
    214                IF( fmask(1,jj,jk) == 0._wp ) THEN 
    215                   fmask(1  ,jj,jk) = rn_shlat * MIN( 1._wp , MAX( vmask(2,jj,jk), umask(1,jj+1,jk), umask(1,jj,jk) ) ) 
    216                ENDIF 
    217                IF( fmask(jpi,jj,jk) == 0._wp ) THEN 
    218                   fmask(jpi,jj,jk) = rn_shlat * MIN( 1._wp , MAX( umask(jpi,jj+1,jk), vmask(jpim1,jj,jk), umask(jpi,jj-1,jk) ) ) 
    219                ENDIF 
    220             END DO          
    221             DO ji = 2, jpim1 
    222                IF( fmask(ji,1,jk) == 0._wp ) THEN 
    223                   fmask(ji, 1 ,jk) = rn_shlat * MIN( 1._wp , MAX( vmask(ji+1,1,jk), umask(ji,2,jk), vmask(ji,1,jk) ) ) 
    224                ENDIF 
    225                IF( fmask(ji,jpj,jk) == 0._wp ) THEN 
    226                   fmask(ji,jpj,jk) = rn_shlat * MIN( 1._wp , MAX( vmask(ji+1,jpj,jk), vmask(ji-1,jpj,jk), umask(ji,jpjm1,jk) ) ) 
    227                ENDIF 
    228             END DO 
    229          END DO 
    230          ! 
     206         DO_3D( 0, 0, 0, 0, 1, jpk ) 
     207            IF( fmask(ji,jj,jk) == 0._wp ) THEN 
     208               fmask(ji,jj,jk) = rn_shlat * MIN( 1._wp , MAX( umask(ji,jj,jk), umask(ji,jj+1,jk), & 
     209                  &                                           vmask(ji,jj,jk), vmask(ji+1,jj,jk) ) ) 
     210            ENDIF 
     211         END_3D 
    231212         CALL lbc_lnk( 'dommsk', fmask, 'F', 1._wp )      ! Lateral boundary conditions on fmask 
    232213         ! 
  • NEMO/trunk/src/OCE/DOM/domqco.F90

    r14834 r15014  
    184184         !                                ! no 'key_qcoTest_FluxForm' : surface weighted ssh average 
    185185 
    186       DO_2D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )                               ! start from 1 since lbc_lnk('F') doesn't update the 1st row/line 
     186      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    187187         ! round brackets added to fix the order of floating point operations 
    188188         ! needed to ensure halo 1 - halo 2 compatibility 
     
    197197!!st         ELSE                                      !- Flux Form   (simple averaging) 
    198198#else 
    199       DO_2D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1 ) 
     199      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    200200         ! round brackets added to fix the order of floating point operations 
    201201         ! needed to ensure halo 1 - halo 2 compatibility 
    202202         pr3f(ji,jj) = 0.25_wp * ( ( pssh(ji,jj  ) + pssh(ji+1,jj  ) ) & 
    203             &                     + ( pssh(ji,jj+1) + pssh(ji+1,jj+1)  & 
     203            &                    + ( pssh(ji,jj+1) + pssh(ji+1,jj+1)   & 
    204204            &                       )                                  & ! bracket for halo 1 - halo 2 compatibility 
    205205            &                    ) * r1_hf_0(ji,jj) 
  • NEMO/trunk/src/OCE/DOM/domvvl.F90

    r14834 r15014  
    713713         ! 
    714714      CASE( 'F' )                   !* from U-point to F-point : hor. surface weighted mean 
    715          DO_3D( 1, 0, 1, 0, 1, jpk ) 
     715         DO_3D( 0, 0, 0, 0, 1, jpk ) 
    716716            pe3_out(ji,jj,jk) = 0.5_wp * (  umask(ji,jj,jk) * umask(ji,jj+1,jk) * (1.0_wp - zlnwd) + zlnwd ) & 
    717717               &                       *    r1_e1e2f(ji,jj)                                                  & 
  • NEMO/trunk/src/OCE/DOM/domzgr.F90

    r14433 r15014  
    340340      !                                    ! N.B.  top     k-index of W-level = mikt 
    341341      !                                    !       bottom  k-index of W-level = mbkt+1 
    342       DO_2D( 1, 0, 1, 0 ) 
     342      DO_2D( 0, 0, 0, 0 ) 
    343343         miku(ji,jj) = MAX(  mikt(ji+1,jj  ) , mikt(ji,jj)  ) 
    344344         mikv(ji,jj) = MAX(  mikt(ji  ,jj+1) , mikt(ji,jj)  ) 
     
    349349      END_2D 
    350350      ! converte into REAL to use lbc_lnk ; impose a min value of 1 as a zero can be set in lbclnk  
    351       zk(:,:) = REAL( miku(:,:), wp )   ;   CALL lbc_lnk( 'domzgr', zk, 'U', 1.0_wp )   ;   miku(:,:) = MAX( NINT( zk(:,:) ), 1 ) 
    352       zk(:,:) = REAL( mikv(:,:), wp )   ;   CALL lbc_lnk( 'domzgr', zk, 'V', 1.0_wp )   ;   mikv(:,:) = MAX( NINT( zk(:,:) ), 1 ) 
    353       zk(:,:) = REAL( mikf(:,:), wp )   ;   CALL lbc_lnk( 'domzgr', zk, 'F', 1.0_wp )   ;   mikf(:,:) = MAX( NINT( zk(:,:) ), 1 ) 
    354       ! 
    355       zk(:,:) = REAL( mbku(:,:), wp )   ;   CALL lbc_lnk( 'domzgr', zk, 'U', 1.0_wp )   ;   mbku(:,:) = MAX( NINT( zk(:,:) ), 1 ) 
    356       zk(:,:) = REAL( mbkv(:,:), wp )   ;   CALL lbc_lnk( 'domzgr', zk, 'V', 1.0_wp )   ;   mbkv(:,:) = MAX( NINT( zk(:,:) ), 1 ) 
     351      DO_2D( 0, 0, 0, 0 ) 
     352         zk(ji,jj) = REAL( miku(ji,jj), wp ) 
     353      END_2D 
     354      CALL lbc_lnk( 'domzgr', zk, 'U', 1.0_wp ) 
     355      miku(:,:) = MAX( NINT( zk(:,:) ), 1 ) 
     356 
     357      DO_2D( 0, 0, 0, 0 ) 
     358         zk(ji,jj) = REAL( mikv(ji,jj), wp ) 
     359      END_2D 
     360      CALL lbc_lnk( 'domzgr', zk, 'V', 1.0_wp ) 
     361      mikv(:,:) = MAX( NINT( zk(:,:) ), 1 ) 
     362       
     363      DO_2D( 0, 0, 0, 0 ) 
     364         zk(ji,jj) = REAL( mikf(ji,jj), wp ) 
     365      END_2D 
     366      CALL lbc_lnk( 'domzgr', zk, 'F', 1.0_wp ) 
     367      mikf(:,:) = MAX( NINT( zk(:,:) ), 1 ) 
     368      ! 
     369      DO_2D( 0, 0, 0, 0 ) 
     370         zk(ji,jj) = REAL( mbku(ji,jj), wp ) 
     371      END_2D 
     372      CALL lbc_lnk( 'domzgr', zk, 'U', 1.0_wp ) 
     373      mbku(:,:) = MAX( NINT( zk(:,:) ), 1 ) 
     374       
     375      DO_2D( 0, 0, 0, 0 ) 
     376         zk(ji,jj) = REAL( mbkv(ji,jj), wp ) 
     377      END_2D 
     378      CALL lbc_lnk( 'domzgr', zk, 'V', 1.0_wp ) 
     379      mbkv(:,:) = MAX( NINT( zk(:,:) ), 1 ) 
    357380      ! 
    358381   END SUBROUTINE zgr_top_bot 
  • NEMO/trunk/src/OCE/LDF/ldfc1d_c2d.F90

    r14834 r15014  
    8080            pah1(:,:,jk) = pahs1(:,:) * (  zratio + zc * ( 1._wp + TANH( - ( gdept_0(:,:,jk) - zh ) * zw) )  ) 
    8181         END DO 
    82          DO_3DS( 1, 0, 1, 0, jpkm1, 1, -1 )  ! pah2 at F-point (zdep2 is an approximation in zps-coord.) 
     82         DO_3DS( 0, 0, 0, 0, jpkm1, 1, -1 )  ! pah2 at F-point (zdep2 is an approximation in zps-coord.) 
    8383            zdep2 = (  gdept_0(ji,jj+1,jk) + gdept_0(ji+1,jj+1,jk)   & 
    8484               &     + gdept_0(ji,jj  ,jk) + gdept_0(ji+1,jj  ,jk)  ) * r1_4 
     
    8888         ! 
    8989      CASE( 'TRA' )                     ! U- and V-points (zdep1 & 2 are an approximation in zps-coord.) 
    90          DO_3DS( 1, 0, 1, 0, jpkm1, 1, -1 ) 
     90         DO_3DS( 0, 0, 0, 0, jpkm1, 1, -1 ) 
    9191            zdep1 = (  gdept_0(ji,jj,jk) + gdept_0(ji+1,jj,jk)  ) * 0.5_wp 
    9292            zdep2 = (  gdept_0(ji,jj,jk) + gdept_0(ji,jj+1,jk)  ) * 0.5_wp 
  • NEMO/trunk/src/OCE/LDF/ldfdyn.F90

    r14433 r15014  
    385385                  zu2pv2_ij    = uu(ji  ,jj  ,jk,Kbb) * uu(ji  ,jj  ,jk,Kbb) + vv(ji  ,jj  ,jk,Kbb) * vv(ji  ,jj  ,jk,Kbb) 
    386386                  zu2pv2_ij_m1 = uu(ji-1,jj  ,jk,Kbb) * uu(ji-1,jj  ,jk,Kbb) + vv(ji  ,jj-1,jk,Kbb) * vv(ji  ,jj-1,jk,Kbb) 
     387                  zu2pv2_ij_p1 = uu(ji  ,jj+1,jk,Kbb) * uu(ji  ,jj+1,jk,Kbb) + vv(ji+1,jj  ,jk,Kbb) * vv(ji+1,jj  ,jk,Kbb) 
    387388                  zemax = MAX( e1t(ji,jj) , e2t(ji,jj) ) 
    388389                  ahmt(ji,jj,jk) = SQRT( (zu2pv2_ij + zu2pv2_ij_m1) * r1_288 ) * zemax * tmask(ji,jj,jk)      ! 288= 12*12 * 2 
    389                END_2D 
    390                DO_2D( 1, 0, 1, 0 ) 
    391                   zu2pv2_ij_p1 = uu(ji  ,jj+1,jk, Kbb) * uu(ji  ,jj+1,jk, Kbb) + vv(ji+1,jj  ,jk, Kbb) * vv(ji+1,jj  ,jk, Kbb) 
    392                   zu2pv2_ij    = uu(ji  ,jj  ,jk, Kbb) * uu(ji  ,jj  ,jk, Kbb) + vv(ji  ,jj  ,jk, Kbb) * vv(ji  ,jj  ,jk, Kbb) 
    393390                  zemax = MAX( e1f(ji,jj) , e2f(ji,jj) ) 
    394391                  ahmf(ji,jj,jk) = SQRT( (zu2pv2_ij + zu2pv2_ij_p1) * r1_288 ) * zemax * fmask(ji,jj,jk)      ! 288= 12*12 * 2 
     
    400397                  zu2pv2_ij    = uu(ji  ,jj  ,jk,Kbb) * uu(ji  ,jj  ,jk,Kbb) + vv(ji  ,jj  ,jk,Kbb) * vv(ji  ,jj  ,jk,Kbb) 
    401398                  zu2pv2_ij_m1 = uu(ji-1,jj  ,jk,Kbb) * uu(ji-1,jj  ,jk,Kbb) + vv(ji  ,jj-1,jk,Kbb) * vv(ji  ,jj-1,jk,Kbb) 
     399                  zu2pv2_ij_p1 = uu(ji  ,jj+1,jk,Kbb) * uu(ji  ,jj+1,jk,Kbb) + vv(ji+1,jj  ,jk,Kbb) * vv(ji+1,jj  ,jk,Kbb) 
    402400                  zemax = MAX( e1t(ji,jj) , e2t(ji,jj) ) 
    403401                  ahmt(ji,jj,jk) = SQRT(  SQRT( (zu2pv2_ij + zu2pv2_ij_m1) * r1_288 ) * zemax  ) * zemax * tmask(ji,jj,jk) 
    404                END_2D 
    405                DO_2D( 1, 0, 1, 0 ) 
    406                   zu2pv2_ij_p1 = uu(ji  ,jj+1,jk, Kbb) * uu(ji  ,jj+1,jk, Kbb) + vv(ji+1,jj  ,jk, Kbb) * vv(ji+1,jj  ,jk, Kbb) 
    407                   zu2pv2_ij    = uu(ji  ,jj  ,jk, Kbb) * uu(ji  ,jj  ,jk, Kbb) + vv(ji  ,jj  ,jk, Kbb) * vv(ji  ,jj  ,jk, Kbb) 
    408402                  zemax = MAX( e1f(ji,jj) , e2f(ji,jj) ) 
    409403                  ahmf(ji,jj,jk) = SQRT(  SQRT( (zu2pv2_ij + zu2pv2_ij_p1) * r1_288 ) * zemax  ) * zemax * fmask(ji,jj,jk) 
     
    487481               DO_2D( 0, 0, 0, 0 ) 
    488482                  ahmt(ji,jj,jk) = SQRT( r1_8 * esqt(ji,jj) * ahmt(ji,jj,jk) ) 
    489                END_2D 
    490                DO_2D( 1, 0, 1, 0 ) 
    491483                  ahmf(ji,jj,jk) = SQRT( r1_8 * esqf(ji,jj) * ahmf(ji,jj,jk) ) 
    492484               END_2D 
Note: See TracChangeset for help on using the changeset viewer.