[12353] | 1 | #if defined show_comments |
---|
[12340] | 2 | ! These comments are not intended to be retained during preprocessing; i.e. do not define "show_comments" |
---|
[12341] | 3 | !!---------------------------------------------------------------------- |
---|
| 4 | !! NEMO/OCE 4.0 , NEMO Consortium (2018) |
---|
| 5 | !! Software governed by the CeCILL license (see ./LICENSE) |
---|
| 6 | !!---------------------------------------------------------------------- |
---|
[12340] | 7 | ! This header file contains preprocessor definitions and macros used in the do-loop substitutions introduced |
---|
| 8 | ! between version 4.0 and 4.2. The primary aim of these macros is to assist in future applications of tiling |
---|
| 9 | ! to improve performance. This is expected to be achieved by alternative versions of these macros in selected |
---|
[13296] | 10 | ! locations. The initial introduction of these macros simply replaced all identifiable nested 2D- and 3D-loops |
---|
| 11 | ! with single line statements (and adjusts indenting accordingly). Do loops were identifiable if they comformed |
---|
[12340] | 12 | ! to either: |
---|
| 13 | ! DO jk = .... |
---|
| 14 | ! DO jj = .... DO jj = ... |
---|
| 15 | ! DO ji = .... DO ji = ... |
---|
[12341] | 16 | ! . OR . |
---|
| 17 | ! . . |
---|
[12340] | 18 | ! END DO END DO |
---|
| 19 | ! END DO END DO |
---|
| 20 | ! END DO |
---|
| 21 | ! and white-space variants thereof. |
---|
| 22 | ! |
---|
[13296] | 23 | ! Additionally, only loops with recognised jj and ji loops limits were treated; these were: |
---|
[12340] | 24 | ! Lower limits of 1, 2 or fs_2 |
---|
| 25 | ! Upper limits of jpi, jpim1 or fs_jpim1 (for ji) or jpj, jpjm1 or fs_jpjm1 (for jj) |
---|
| 26 | ! |
---|
[13296] | 27 | ! The macro naming convention takes the form: DO_2D( B, T, L, R) where: |
---|
[12340] | 28 | ! B is the Bottom offset from the PE's inner domain; |
---|
| 29 | ! T is the Top offset from the PE's inner domain; |
---|
| 30 | ! L is the Left offset from the PE's inner domain; |
---|
| 31 | ! R is the Right offset from the PE's inner domain |
---|
| 32 | ! |
---|
| 33 | ! So, given an inner domain of 2,jpim1 and 2,jpjm1, a typical example would replace: |
---|
| 34 | ! |
---|
| 35 | ! DO jj = 2, jpj |
---|
| 36 | ! DO ji = 1, jpim1 |
---|
[12341] | 37 | ! . |
---|
| 38 | ! . |
---|
| 39 | ! END DO |
---|
[12340] | 40 | ! END DO |
---|
| 41 | ! |
---|
| 42 | ! with: |
---|
| 43 | ! |
---|
[13296] | 44 | ! DO_2D( 0, 1, 1, 0 ) |
---|
[12341] | 45 | ! . |
---|
| 46 | ! . |
---|
[12340] | 47 | ! END_2D |
---|
| 48 | ! |
---|
[13295] | 49 | ! similar conventions apply to the 3D loops macros. jk loop limits are retained through macro arguments |
---|
| 50 | ! and are not restricted. This includes the possibility of strides for which an extra set of DO_3DS |
---|
| 51 | ! macros are defined. |
---|
[12340] | 52 | ! |
---|
[13295] | 53 | ! In the following definitions the inner PE domain is defined by start indices of (Nis0, Njs0) and end |
---|
| 54 | ! indices of (Nie0, Nje0) where: |
---|
[12340] | 55 | ! |
---|
[13295] | 56 | ! Nis0 = 1 + nn_hls Njs0 = 1 + nn_hls |
---|
| 57 | ! Nie0 = jpi - nn_hls Nje0 = jpj - nn_hls |
---|
[13286] | 58 | ! |
---|
[12340] | 59 | #endif |
---|
| 60 | |
---|
[13295] | 61 | #define DO_2D(B, T, L, R) DO jj = Njs0-(B), Nje0+(T) ; DO ji = Nis0-(L), Nie0+(R) |
---|
[12340] | 62 | |
---|
[13295] | 63 | #define DO_3D(B, T, L, R, ks, ke) DO jk = ks, ke ; DO_2D(B, T, L, R) |
---|
[12340] | 64 | |
---|
[13295] | 65 | #define DO_3DS(B, T, L, R, ks, ke, ki) DO jk = ks, ke, ki ; DO_2D(B, T, L, R) |
---|
[13286] | 66 | |
---|
[12341] | 67 | #define END_2D END DO ; END DO |
---|
| 68 | #define END_3D END DO ; END DO ; END DO |
---|