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 12340 for NEMO/branches/2019/dev_r11943_MERGE_2019/src/OCE/DYN/dynatf.F90 – NEMO

Ignore:
Timestamp:
2020-01-27T15:31:53+01:00 (4 years ago)
Author:
acc
Message:

Branch 2019/dev_r11943_MERGE_2019. This commit introduces basic do loop macro
substitution to the 2019 option 1, merge branch. These changes have been SETTE
tested. The only addition is the do_loop_substitute.h90 file in the OCE directory but
the macros defined therein are used throughout the code to replace identifiable, 2D-
and 3D- nested loop opening and closing statements with single-line alternatives. Code
indents are also adjusted accordingly.

The following explanation is taken from comments in the new header file:

This header file contains preprocessor definitions and macros used in the do-loop
substitutions introduced between version 4.0 and 4.2. The primary aim of these macros
is to assist in future applications of tiling to improve performance. This is expected
to be achieved by alternative versions of these macros in selected locations. The
initial introduction of these macros simply replaces all identifiable nested 2D- and
3D-loops with single line statements (and adjusts indenting accordingly). Do loops
are identifiable if they comform to either:

DO jk = ....

DO jj = .... DO jj = ...

DO ji = .... DO ji = ...
. OR .
. .

END DO END DO

END DO END DO

END DO

and white-space variants thereof.

Additionally, only loops with recognised jj and ji loops limits are treated; these are:
Lower limits of 1, 2 or fs_2
Upper limits of jpi, jpim1 or fs_jpim1 (for ji) or jpj, jpjm1 or fs_jpjm1 (for jj)

The macro naming convention takes the form: DO_2D_BT_LR where:

B is the Bottom offset from the PE's inner domain;
T is the Top offset from the PE's inner domain;
L is the Left offset from the PE's inner domain;
R is the Right offset from the PE's inner domain

So, given an inner domain of 2,jpim1 and 2,jpjm1, a typical example would replace:

DO jj = 2, jpj

DO ji = 1, jpim1
.
.

END DO

END DO

with:

DO_2D_01_10
.
.
END_2D

similar conventions apply to the 3D loops macros. jk loop limits are retained
through macro arguments and are not restricted. This includes the possibility of
strides for which an extra set of DO_3DS macros are defined.

In the example definition below the inner PE domain is defined by start indices of
(kIs, kJs) and end indices of (kIe, KJe)

#define DO_2D_00_00 DO jj = kJs, kJe ; DO ji = kIs, kIe
#define END_2D END DO ; END DO

TO DO:


Only conventional nested loops have been identified and replaced by this step. There are constructs such as:

DO jk = 2, jpkm1

z2d(:,:) = z2d(:,:) + e3w(:,:,jk,Kmm) * z3d(:,:,jk) * wmask(:,:,jk)

END DO

which may need to be considered.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r11943_MERGE_2019/src/OCE/DYN/dynatf.F90

    r12236 r12340  
    5959   PUBLIC    dyn_atf   ! routine called by step.F90 
    6060 
     61   !! * Substitutions 
     62#  include "do_loop_substitute.h90" 
    6163   !!---------------------------------------------------------------------- 
    6264   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    180182         IF( ln_linssh ) THEN             ! Fixed volume ! 
    181183            !                             ! =============! 
    182             DO jk = 1, jpkm1                               
    183                DO jj = 1, jpj 
    184                   DO ji = 1, jpi     
    185                      puu(ji,jj,jk,Kmm) = puu(ji,jj,jk,Kmm) + atfp * ( puu(ji,jj,jk,Kbb) - 2._wp * puu(ji,jj,jk,Kmm) + puu(ji,jj,jk,Kaa) ) 
    186                      pvv(ji,jj,jk,Kmm) = pvv(ji,jj,jk,Kmm) + atfp * ( pvv(ji,jj,jk,Kbb) - 2._wp * pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk,Kaa) ) 
    187                   END DO 
    188                END DO 
    189             END DO 
     184            DO_3D_11_11( 1, jpkm1 ) 
     185               puu(ji,jj,jk,Kmm) = puu(ji,jj,jk,Kmm) + atfp * ( puu(ji,jj,jk,Kbb) - 2._wp * puu(ji,jj,jk,Kmm) + puu(ji,jj,jk,Kaa) ) 
     186               pvv(ji,jj,jk,Kmm) = pvv(ji,jj,jk,Kmm) + atfp * ( pvv(ji,jj,jk,Kbb) - 2._wp * pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk,Kaa) ) 
     187            END_3D 
    190188            !                             ! ================! 
    191189         ELSE                             ! Variable volume ! 
     
    205203            IF ( ln_rnf ) THEN 
    206204               IF( ln_rnf_depth ) THEN 
    207                   DO jk = 1, jpkm1 ! Deal with Rivers separately, as can be through depth too 
    208                      DO jj = 1, jpj 
    209                         DO ji = 1, jpi 
    210                            IF( jk <=  nk_rnf(ji,jj)  ) THEN 
    211                                ze3t_f(ji,jj,jk) =   ze3t_f(ji,jj,jk) - zcoef *  ( - rnf_b(ji,jj) + rnf(ji,jj) ) & 
    212                                       &          * ( pe3t(ji,jj,jk,Kmm) / h_rnf(ji,jj) ) * tmask(ji,jj,jk) 
    213                            ENDIF 
    214                         ENDDO 
    215                      ENDDO 
    216                   ENDDO 
     205                  DO_3D_11_11( 1, jpkm1 ) 
     206                     IF( jk <=  nk_rnf(ji,jj)  ) THEN 
     207                         ze3t_f(ji,jj,jk) =   ze3t_f(ji,jj,jk) - zcoef *  ( - rnf_b(ji,jj) + rnf(ji,jj) ) & 
     208                                &          * ( pe3t(ji,jj,jk,Kmm) / h_rnf(ji,jj) ) * tmask(ji,jj,jk) 
     209                     ENDIF 
     210                  END_3D 
    217211               ELSE 
    218212                  ze3t_f(:,:,1) = ze3t_f(:,:,1) - zcoef *  ( -rnf_b(:,:) + rnf(:,:))*tmask(:,:,1) 
     
    232226               CALL dom_vvl_interpol( pe3t(:,:,:,Kmm), pe3u(:,:,:,Kmm), 'U' ) 
    233227               CALL dom_vvl_interpol( pe3t(:,:,:,Kmm), pe3v(:,:,:,Kmm), 'V' ) 
    234                DO jk = 1, jpkm1 
    235                   DO jj = 1, jpj 
    236                      DO ji = 1, jpi 
    237                         puu(ji,jj,jk,Kmm) = puu(ji,jj,jk,Kmm) + atfp * ( puu(ji,jj,jk,Kbb) - 2._wp * puu(ji,jj,jk,Kmm) + puu(ji,jj,jk,Kaa) ) 
    238                         pvv(ji,jj,jk,Kmm) = pvv(ji,jj,jk,Kmm) + atfp * ( pvv(ji,jj,jk,Kbb) - 2._wp * pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk,Kaa) ) 
    239                      END DO 
    240                   END DO 
    241                END DO 
     228               DO_3D_11_11( 1, jpkm1 ) 
     229                  puu(ji,jj,jk,Kmm) = puu(ji,jj,jk,Kmm) + atfp * ( puu(ji,jj,jk,Kbb) - 2._wp * puu(ji,jj,jk,Kmm) + puu(ji,jj,jk,Kaa) ) 
     230                  pvv(ji,jj,jk,Kmm) = pvv(ji,jj,jk,Kmm) + atfp * ( pvv(ji,jj,jk,Kbb) - 2._wp * pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk,Kaa) ) 
     231               END_3D 
    242232               ! 
    243233            ELSE                          ! Asselin filter applied on thickness weighted velocity 
     
    247237               CALL dom_vvl_interpol( pe3t(:,:,:,Kmm), ze3u_f, 'U' ) 
    248238               CALL dom_vvl_interpol( pe3t(:,:,:,Kmm), ze3v_f, 'V' ) 
    249                DO jk = 1, jpkm1 
    250                   DO jj = 1, jpj 
    251                      DO ji = 1, jpi                   
    252                         zue3a = pe3u(ji,jj,jk,Kaa) * puu(ji,jj,jk,Kaa) 
    253                         zve3a = pe3v(ji,jj,jk,Kaa) * pvv(ji,jj,jk,Kaa) 
    254                         zue3n = pe3u(ji,jj,jk,Kmm) * puu(ji,jj,jk,Kmm) 
    255                         zve3n = pe3v(ji,jj,jk,Kmm) * pvv(ji,jj,jk,Kmm) 
    256                         zue3b = pe3u(ji,jj,jk,Kbb) * puu(ji,jj,jk,Kbb) 
    257                         zve3b = pe3v(ji,jj,jk,Kbb) * pvv(ji,jj,jk,Kbb) 
    258                         ! 
    259                         puu(ji,jj,jk,Kmm) = ( zue3n + atfp * ( zue3b - 2._wp * zue3n  + zue3a ) ) / ze3u_f(ji,jj,jk) 
    260                         pvv(ji,jj,jk,Kmm) = ( zve3n + atfp * ( zve3b - 2._wp * zve3n  + zve3a ) ) / ze3v_f(ji,jj,jk) 
    261                      END DO 
    262                   END DO 
    263                END DO 
     239               DO_3D_11_11( 1, jpkm1 ) 
     240                  zue3a = pe3u(ji,jj,jk,Kaa) * puu(ji,jj,jk,Kaa) 
     241                  zve3a = pe3v(ji,jj,jk,Kaa) * pvv(ji,jj,jk,Kaa) 
     242                  zue3n = pe3u(ji,jj,jk,Kmm) * puu(ji,jj,jk,Kmm) 
     243                  zve3n = pe3v(ji,jj,jk,Kmm) * pvv(ji,jj,jk,Kmm) 
     244                  zue3b = pe3u(ji,jj,jk,Kbb) * puu(ji,jj,jk,Kbb) 
     245                  zve3b = pe3v(ji,jj,jk,Kbb) * pvv(ji,jj,jk,Kbb) 
     246                  ! 
     247                  puu(ji,jj,jk,Kmm) = ( zue3n + atfp * ( zue3b - 2._wp * zue3n  + zue3a ) ) / ze3u_f(ji,jj,jk) 
     248                  pvv(ji,jj,jk,Kmm) = ( zve3n + atfp * ( zve3b - 2._wp * zve3n  + zve3a ) ) / ze3v_f(ji,jj,jk) 
     249               END_3D 
    264250               pe3u(:,:,1:jpkm1,Kmm) = ze3u_f(:,:,1:jpkm1)   
    265251               pe3v(:,:,1:jpkm1,Kmm) = ze3v_f(:,:,1:jpkm1) 
Note: See TracChangeset for help on using the changeset viewer.