#if defined show_comments ! These comments are not intended to be retained during preprocessing; i.e. do not define "show_comments" !!---------------------------------------------------------------------- !! NEMO/OCE 4.0 , NEMO Consortium (2018) !! Software governed by the CeCILL license (see ./LICENSE) !!---------------------------------------------------------------------- ! 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 following definitions the inner PE domain is defined by start indices of (_Nis0, Njs0) and end indices of (Nie0, Njs0) ! The following macros are defined just below: _Nis0, Njs0, _Nis1, Njs1, _Nie0, Njs0, _Nie1, Nje1. ! These names are chosen to, hopefully, avoid any future, unintended matches elsewhere in the code. ! !!gm changes ; ! ! -0- fortran code : defined in par_oce.F90 the folowwing valiables : !!# !!# INTEGER, PUBLIC :: Nis0, Nis1, Nis2 !: start I-index (_0: no halo, _1 & _2: 1 & 2-halos) !!# INTEGER, PUBLIC :: Nie0, Nie1, Nie2 !: end I-index (_0: no halo, _1 & _2: 1 & 2-halos) !!# INTEGER, PUBLIC :: Njs0, Njs1, Njs2 !: start J-index (_0: no halo, _1 & _2: 1 & 2-halos) !!# INTEGER, PUBLIC :: Nje0, Nje1, Nje2 !: end J-index (_0: no halo, _1 & _2: 1 & 2-halos) !!# ! -1- fortran code put in mppinit.F90 : !!# just after the futur read of nn_hls in namXXX (to be defined) !!# NB: currently nn_hls is defined as a parameter in par_oce.F90 !!# SUBROUTINE init_do_loop !!# !!---------------------------------------------------------------------- !!# !! *** ROUTINE init_do_loop_indices *** !!# !! !!# !! ** Purpose : set the starting/ending indices of DO-loop !!# !! These indices are used in do_loop_substitute.h90 !!# !!----------------------------------------------------------------------!!# ! !== set the starting/ending indices of DO-loop ==! (used in do_loop_substitute.h90) !!# ! !!# IF( nn_hls == 1 ) THEN !* halo size of 1 !!# ! !!# Nis0 = 2 ; Nis1 = 1 ; Nis2 = Nis1 !!# Njs0 = Nis0 ; Njs1 = Nis1 ; Njs2 = Nis1 !!# ! !!# Nie0 = jpi-1 ; Nje1 = jpi ; Nie2 = Nie1 !!# Nje0 = jpj-1 ; Nje1 = jpj-1 ; Nje2 = Nie1 !!# ! !!# ELSEIF( nn_hls == 2 ) THEN !* halo size of 2 !!# ! !!# Nis0 = 3 ; Nis1 = 2 ; Nis2 = 1 !!# Njs0 = Nis0 ; Njs1 = Nis1 ; Njs2 = Nis2 !!# ! !!# Nie0 = jpi-2 ; Nje1 = jpi-1 ; Nie2 = jpi !!# Nje0 = jpj-2 ; Nje1 = jpj-1 ; Nje2 = jpj !!# ! !!# ELSE !* unexpected halo size !!# CALL ctl_stop( 'STOP', 'ini_mpp: wrong value of halo size : nn_hls= 1 or 2 only !') !!# ENDIF !!# !!# ! !!# END SUBROUTINE init_do_loop ! ! ! -2- in do_loop_substitute becomes : ! #endif ! 2D loops with 1 #define DO_2D_00_00 DO jj = Njs0, Nje0 ; DO ji = Nis0, Nie0 #define DO_2D_00_01 DO jj = Njs0, Nje0 ; DO ji = Nis0, Nie1 #define DO_2D_00_10 DO jj = Njs0, Nje0 ; DO ji = Nis1, Nie0 #define DO_2D_00_11 DO jj = Njs0, Nje0 ; DO ji = Nis1, Nie1 #define DO_2D_01_00 DO jj = Njs0, Nje1 ; DO ji = Nis0, Nie0 #define DO_2D_01_01 DO jj = Njs0, Nje1 ; DO ji = Nis0, Nie1 #define DO_2D_01_10 DO jj = Njs0, Nje1 ; DO ji = Nis1, Nie0 #define DO_2D_01_11 DO jj = Njs0, Nje1 ; DO ji = Nis1, Nie1 #define DO_2D_10_00 DO jj = Njs1, Nje0 ; DO ji = Nis0, Nie0 #define DO_2D_10_01 DO jj = Njs1, Nje0 ; DO ji = Nis0, Nie1 ! not used ? #define DO_2D_10_10 DO jj = Njs1, Nje0 ; DO ji = Nis1, Nie0 #define DO_2D_10_11 DO jj = Njs1, Nje0 ; DO ji = Nis1, Nie1 #define DO_2D_11_00 DO jj = Njs1, Nje1 ; DO ji = Nis0, Nie0 #define DO_2D_11_01 DO jj = Njs1, Nje1 ; DO ji = Nis0, Nie1 #define DO_2D_11_10 DO jj = Njs1, Nje1 ; DO ji = Nis1, Nie0 #define DO_2D_11_11 DO jj = Njs1, Nje1 ; DO ji = Nis1, Nie1 ! 2D loops with 1 following a 2/3D loop with 2 #define DO_2D_00_01nxt2 DO jj = Njs0 , Nje0 ; DO ji = Nis0 , Nie1nxt2 #define DO_2D_00_10nxt2 DO jj = Njs0 , Nje0 ; DO ji = Nis1nxt2, Nie0 #define DO_2D_00_11nxt2 DO jj = Njs0 , Nje0 ; DO ji = Nis1nxt2, Nie1nxt2 #define DO_2D_01_00nxt2 DO jj = Njs0 , Nje1nxt2 ; DO ji = Nis0 , Nie0 #define DO_2D_01_01nxt2 DO jj = Njs0 , Nje1nxt2 ; DO ji = Nis0 , Nie1nxt2 #define DO_2D_01_10nxt2 DO jj = Njs0 , Nje1nxt2 ; DO ji = Nis1nxt2, Nie0 #define DO_2D_01_11nxt2 DO jj = Njs0 , Nje1nxt2 ; DO ji = Nis1nxt2, Nie1nxt2 #define DO_2D_10_00nxt2 DO jj = Njs1nxt2, Nje0 ; DO ji = Nis0 , Nie0 #define DO_2D_10_01nxt2 DO jj = Njs1nxt2, Nje0 ; DO ji = Nis0 , Nie1nxt2 ! not used ? #define DO_2D_10_10nxt2 DO jj = Njs1nxt2, Nje0 ; DO ji = Nis1nxt2, Nie0 #define DO_2D_10_11nxt2 DO jj = Njs1nxt2, Nje0 ; DO ji = Nis1nxt2, Nie1nxt2 #define DO_2D_11_00nxt2 DO jj = Njs1nxt2, Nje1nxt2 ; DO ji = Nis0 , Nie0 #define DO_2D_11_01nxt2 DO jj = Njs1nxt2, Nje1nxt2 ; DO ji = Nis0 , Nie1nxt2 #define DO_2D_11_10nxt2 DO jj = Njs1nxt2, Nje1nxt2 ; DO ji = Nis1nxt2, Nie0 #define DO_2D_11_11nxt2 DO jj = Njs1nxt2, Nje1nxt2 ; DO ji = Nis1nxt2, Nie1nxt2 ! 2D loops with 2 #define DO_2D_11_12 DO jj = Njs1nxt2, Nje1nxt2 ; DO ji = Nis1nxt2, Nie2 #define DO_2D_11_21 DO jj = Njs1nxt2, Nje1nxt2 ; DO ji = Nis2 , Nie1nxt2 #define DO_2D_11_22 DO jj = Njs1nxt2, Nje1nxt2 ; DO ji = Nis2 , Nie2 #define DO_2D_12_11 DO jj = Njs1nxt2, Nje2 ; DO ji = Nis1nxt2, Nie1nxt2 #define DO_2D_12_12 DO jj = Njs1nxt2, Nje2 ; DO ji = Nis1nxt2, Nie2 #define DO_2D_12_21 DO jj = Njs1nxt2, Nje2 ; DO ji = Nis2 , Nie1nxt2 #define DO_2D_12_22 DO jj = Njs1nxt2, Nje2 ; DO ji = Nis2 , Nie2 #define DO_2D_21_11 DO jj = Njs2 , Nje1nxt2 ; DO ji = Nis1nxt2, Nie1nxt2 #define DO_2D_21_12 DO jj = Njs2 , Nje1nxt2 ; DO ji = Nis1nxt2, Nie2 ! not used ? #define DO_2D_21_21 DO jj = Njs2 , Nje1nxt2 ; DO ji = Nis2 , Nie1nxt2 #define DO_2D_21_22 DO jj = Njs2 , Nje1nxt2 ; DO ji = Nis2 , Nie2 #define DO_2D_22_11 DO jj = Njs2 , Nje2 ; DO ji = Nis1nxt2, Nie1nxt2 #define DO_2D_22_12 DO jj = Njs2 , Nje2 ; DO ji = Nis1nxt2, Nie2 #define DO_2D_22_21 DO jj = Njs2 , Nje2 ; DO ji = Nis2 , Nie1nxt2 #define DO_2D_22_22 DO jj = Njs2 , Nje2 ; DO ji = Nis2 , Nie2 ! 3D loops with 1 #define DO_3D_00_00(ks,ke) DO jk = ks, ke ; DO_2D_00_00 #define DO_3D_00_01(ks,ke) DO jk = ks, ke ; DO_2D_00_01 #define DO_3D_00_10(ks,ke) DO jk = ks, ke ; DO_2D_00_10 #define DO_3D_00_11(ks,ke) DO jk = ks, ke ; DO_2D_00_11 #define DO_3D_01_00(ks,ke) DO jk = ks, ke ; DO_2D_01_00 #define DO_3D_01_01(ks,ke) DO jk = ks, ke ; DO_2D_01_01 #define DO_3D_01_10(ks,ke) DO jk = ks, ke ; DO_2D_01_10 #define DO_3D_01_11(ks,ke) DO jk = ks, ke ; DO_2D_01_11 #define DO_3D_10_00(ks,ke) DO jk = ks, ke ; DO_2D_10_00 #define DO_3D_10_01(ks,ke) DO jk = ks, ke ; DO_2D_10_01 #define DO_3D_10_10(ks,ke) DO jk = ks, ke ; DO_2D_10_10 #define DO_3D_10_11(ks,ke) DO jk = ks, ke ; DO_2D_10_11 #define DO_3D_11_00(ks,ke) DO jk = ks, ke ; DO_2D_11_00 #define DO_3D_11_01(ks,ke) DO jk = ks, ke ; DO_2D_11_01 #define DO_3D_11_10(ks,ke) DO jk = ks, ke ; DO_2D_11_10 #define DO_3D_11_11(ks,ke) DO jk = ks, ke ; DO_2D_11_11 ! 3D loops with 1, following a 2/3D loop with 2 #define DO_3D_00_01nxt2(ks,ke) DO jk = ks, ke ; DO_2D_00_01nxt2 #define DO_3D_00_10nxt2(ks,ke) DO jk = ks, ke ; DO_2D_00_10nxt2 #define DO_3D_00_11nxt2(ks,ke) DO jk = ks, ke ; DO_2D_00_11nxt2 #define DO_3D_01_00nxt2(ks,ke) DO jk = ks, ke ; DO_2D_01_00nxt2 #define DO_3D_01_01nxt2(ks,ke) DO jk = ks, ke ; DO_2D_01_01nxt2 #define DO_3D_01_10nxt2(ks,ke) DO jk = ks, ke ; DO_2D_01_10nxt2 #define DO_3D_01_11nxt2(ks,ke) DO jk = ks, ke ; DO_2D_01_11nxt2 #define DO_3D_10_00nxt2(ks,ke) DO jk = ks, ke ; DO_2D_10_00nxt2 #define DO_3D_10_01nxt2(ks,ke) DO jk = ks, ke ; DO_2D_10_01nxt2 #define DO_3D_10_10nxt2(ks,ke) DO jk = ks, ke ; DO_2D_10_10nxt2 #define DO_3D_10_11nxt2(ks,ke) DO jk = ks, ke ; DO_2D_10_11nxt2 #define DO_3D_11_00nxt2(ks,ke) DO jk = ks, ke ; DO_2D_11_00nxt2 #define DO_3D_11_01nxt2(ks,ke) DO jk = ks, ke ; DO_2D_11_01nxt2 #define DO_3D_11_10nxt2(ks,ke) DO jk = ks, ke ; DO_2D_11_10nxt2 #define DO_3D_11_11nxt2(ks,ke) DO jk = ks, ke ; DO_2D_11_11nxt2 ! 3D loops with 2 #define DO_3D_11_12(ks,ke) DO jk = ks, ke ; DO_2D_11_12 #define DO_3D_11_21(ks,ke) DO jk = ks, ke ; DO_2D_11_21 #define DO_3D_11_22(ks,ke) DO jk = ks, ke ; DO_2D_11_22 #define DO_3D_12_11(ks,ke) DO jk = ks, ke ; DO_2D_12_11 #define DO_3D_12_12(ks,ke) DO jk = ks, ke ; DO_2D_12_12 #define DO_3D_12_21(ks,ke) DO jk = ks, ke ; DO_2D_12_21 #define DO_3D_12_22(ks,ke) DO jk = ks, ke ; DO_2D_12_22 #define DO_3D_21_11(ks,ke) DO jk = ks, ke ; DO_2D_21_11 #define DO_3D_21_12(ks,ke) DO jk = ks, ke ; DO_2D_21_12 #define DO_3D_21_21(ks,ke) DO jk = ks, ke ; DO_2D_21_21 #define DO_3D_21_22(ks,ke) DO jk = ks, ke ; DO_2D_21_22 #define DO_3D_22_11(ks,ke) DO jk = ks, ke ; DO_2D_22_11 #define DO_3D_22_12(ks,ke) DO jk = ks, ke ; DO_2D_22_12 #define DO_3D_22_21(ks,ke) DO jk = ks, ke ; DO_2D_22_21 #define DO_3D_22_22(ks,ke) DO jk = ks, ke ; DO_2D_22_22 ! 3D loops with increment with 1 #define DO_3DS_00_00(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_00_00 #define DO_3DS_00_01(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_00_01 #define DO_3DS_00_10(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_00_10 #define DO_3DS_00_11(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_00_11 #define DO_3DS_01_00(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_01_00 #define DO_3DS_01_01(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_01_01 #define DO_3DS_01_10(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_01_10 #define DO_3DS_01_11(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_01_11 #define DO_3DS_10_00(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_10_00 #define DO_3DS_10_01(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_10_01 #define DO_3DS_10_10(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_10_10 #define DO_3DS_10_11(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_10_11 #define DO_3DS_11_00(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_11_00 #define DO_3DS_11_01(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_11_01 #define DO_3DS_11_10(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_11_10 #define DO_3DS_11_11(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_11_11 ! 3D loops with increment with 1, following a 2/3D loop with 2 #define DO_3DS_00_01nxt2(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_00_01nxt2 #define DO_3DS_00_10nxt2(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_00_10nxt2 #define DO_3DS_00_11nxt2(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_00_11nxt2 #define DO_3DS_01_00nxt2(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_01_00nxt2 #define DO_3DS_01_01nxt2(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_01_01nxt2 #define DO_3DS_01_10nxt2(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_01_10nxt2 #define DO_3DS_01_11nxt2(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_01_11nxt2 #define DO_3DS_10_00nxt2(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_10_00nxt2 #define DO_3DS_10_01nxt2(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_10_01nxt2 #define DO_3DS_10_10nxt2(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_10_10nxt2 #define DO_3DS_10_11nxt2(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_10_11nxt2 #define DO_3DS_11_00nxt2(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_11_00nxt2 #define DO_3DS_11_01nxt2(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_11_01nxt2 #define DO_3DS_11_10nxt2(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_11_10nxt2 #define DO_3DS_11_11nxt2(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_11_11nxt2 ! 3D loops with increment with 2 #define DO_3DS_11_12(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_11_12 #define DO_3DS_11_21(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_11_21 #define DO_3DS_11_22(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_11_22 #define DO_3DS_12_11(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_12_11 #define DO_3DS_12_12(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_12_12 #define DO_3DS_12_21(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_12_21 #define DO_3DS_12_22(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_12_22 #define DO_3DS_21_11(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_21_11 #define DO_3DS_21_12(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_21_12 #define DO_3DS_21_21(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_21_21 #define DO_3DS_21_22(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_21_22 #define DO_3DS_22_11(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_22_11 #define DO_3DS_22_12(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_22_12 #define DO_3DS_22_21(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_22_21 #define DO_3DS_22_22(ks,ke,ki) DO jk = ks, ke, ki ; DO_2D_22_22 #define END_2D END DO ; END DO #define END_3D END DO ; END DO ; END DO