source: NEMO/branches/2020/dev_r12558_HPC-08_epico_Extra_Halo/src/OCE/do_loop_substitute.h90 @ 12760

Last change on this file since 12760 was 12760, checked in by smasson, 7 months ago

Extra_Halo: update do_loop_substitute for nn_hls=2, see #2366

File size: 15.5 KB
Line 
1#if defined show_comments
2! These comments are not intended to be retained during preprocessing; i.e. do not define "show_comments"
3!!----------------------------------------------------------------------
4!! NEMO/OCE 4.0 , NEMO Consortium (2018)
5!! Software governed by the CeCILL license (see ./LICENSE)
6!!----------------------------------------------------------------------
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
10! locations. The initial introduction of these macros simply replaces all identifiable nested 2D- and 3D-loops
11! with single line statements (and adjusts indenting accordingly). Do loops are identifiable if they comform
12! to either:
13!                                       DO jk = ....
14!   DO jj = ....                           DO jj = ...
15!      DO ji = ....                           DO ji = ...
16!         .                   OR                 . 
17!         .                                      .
18!     END DO                                  END DO
19!   END DO                                 END DO
20!                                       END DO
21! and white-space variants thereof.
22!
23! Additionally, only loops with recognised jj and ji loops limits are treated; these are:
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!
27! The macro naming convention takes the form: DO_2D_BT_LR where:
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
37!         .
38!         .
39!      END DO
40!   END DO
41!
42! with:
43!
44!   DO_2D_01_10
45!      .
46!      .
47!   END_2D
48!
49! similar conventions apply to the 3D loops macros. jk loop limits are retained through macro arguments and are not restricted. This
50! includes the possibility of strides for which an extra set of DO_3DS macros are defined.
51!
52! In the following definitions the inner PE domain is defined by start indices of (_nIs_0, nJs_0) and end indices of (nIe_0, nJs_0)
53! The following macros are defined just below: _nIs_0, nJs_0, _nIs_1, nJs_1, _nIe_0, nJs_0, _nIe_1, nJe_1.
54! These names are chosen to, hopefully, avoid any future, unintended matches elsewhere in the code.
55!
56!!gm changes ;
57!
58! -0- fortran code : defined in par_oce.F90 the folowwing valiables :
59!!#
60!!#    INTEGER, PUBLIC ::   nIs_0, nIs_1, nIs_2   !: start I-index (_0: no halo, _1 & _2: 1 & 2-halos)
61!!#    INTEGER, PUBLIC ::   nIe_0, nIe_1, nIe_2   !: end   I-index (_0: no halo, _1 & _2: 1 & 2-halos)
62!!#    INTEGER, PUBLIC ::   nJs_0, nJs_1, nJs_2   !: start J-index (_0: no halo, _1 & _2: 1 & 2-halos)
63!!#    INTEGER, PUBLIC ::   nJe_0, nJe_1, nJe_2   !: end   J-index (_0: no halo, _1 & _2: 1 & 2-halos)
64!!#
65! -1- fortran code  put in  mppinit.F90 :   
66!!#            just after the futur read of nn_hls in namXXX (to be defined)
67!!#            NB: currently nn_hls is defined as a parameter in par_oce.F90
68!!#   SUBROUTINE init_do_loop
69!!#      !!----------------------------------------------------------------------
70!!#      !!                  ***  ROUTINE init_do_loop_indices  ***
71!!#      !!
72!!#      !! ** Purpose :   set the starting/ending indices of DO-loop
73!!#      !!              These indices are used in do_loop_substitute.h90
74!!#      !!----------------------------------------------------------------------!!# !                             !==  set the starting/ending indices of DO-loop  ==!   (used in do_loop_substitute.h90)
75!!#      !
76!!#      IF(     nn_hls == 1 ) THEN          !* halo size of 1
77!!#         !
78!!#         nIs_0 =   2     ;   nIs_1 =   1     ;   nIs_2 = nIs_1
79!!#         nJs_0 = nIs_0   ;   nJs_1 = nIs_1   ;   nJs_2 = nIs_1
80!!#         !
81!!#         nIe_0 = jpi-1   ;   nJe_1 = jpi     ;   nIe_2 = nIe_1
82!!#         nJe_0 = jpj-1   ;   nJe_1 = jpj-1   ;   nJe_2 = nIe_1
83!!#         !
84!!#      ELSEIF( nn_hls == 2 ) THEN          !* halo size of 2
85!!#         !
86!!#         nIs_0 =   3     ;   nIs_1 =   2     ;   nIs_2 =   1
87!!#         nJs_0 = nIs_0   ;   nJs_1 = nIs_1   ;   nJs_2 = nIs_2
88!!#         !
89!!#         nIe_0 = jpi-2   ;   nJe_1 = jpi-1   ;   nIe_2 = jpi
90!!#         nJe_0 = jpj-2   ;   nJe_1 = jpj-1   ;   nJe_2 = jpj
91!!#         !
92!!#      ELSE                                !* unexpected halo size
93!!#         CALL ctl_stop( 'STOP', 'ini_mpp:  wrong value of halo size : nn_hls= 1 or 2 only !')
94!!#      ENDIF
95!!#
96!!#      !
97!!#   END SUBROUTINE init_do_loop
98!
99!  ! -2- in do_loop_substitute becomes :
100!
101#endif
102
103! 2D loops with 1
104
105#define DO_2D_00_00   DO jj = nJs_0, nJe_0   ;   DO ji = nIs_0, nIe_0
106#define DO_2D_00_01   DO jj = nJs_0, nJe_0   ;   DO ji = nIs_0, nIe_1
107#define DO_2D_00_10   DO jj = nJs_0, nJe_0   ;   DO ji = nIs_1, nIe_0
108#define DO_2D_00_11   DO jj = nJs_0, nJe_0   ;   DO ji = nIs_1, nIe_1
109 
110#define DO_2D_01_00   DO jj = nJs_0, nJe_1   ;   DO ji = nIs_0, nIe_0
111#define DO_2D_01_01   DO jj = nJs_0, nJe_1   ;   DO ji = nIs_0, nIe_1
112#define DO_2D_01_10   DO jj = nJs_0, nJe_1   ;   DO ji = nIs_1, nIe_0
113#define DO_2D_01_11   DO jj = nJs_0, nJe_1   ;   DO ji = nIs_1, nIe_1
114 
115#define DO_2D_10_00   DO jj = nJs_1, nJe_0   ;   DO ji = nIs_0, nIe_0
116#define DO_2D_10_01   DO jj = nJs_1, nJe_0   ;   DO ji = nIs_0, nIe_1   ! not used ?
117#define DO_2D_10_10   DO jj = nJs_1, nJe_0   ;   DO ji = nIs_1, nIe_0
118#define DO_2D_10_11   DO jj = nJs_1, nJe_0   ;   DO ji = nIs_1, nIe_1
119 
120#define DO_2D_11_00   DO jj = nJs_1, nJe_1   ;   DO ji = nIs_0, nIe_0
121#define DO_2D_11_01   DO jj = nJs_1, nJe_1   ;   DO ji = nIs_0, nIe_1
122#define DO_2D_11_10   DO jj = nJs_1, nJe_1   ;   DO ji = nIs_1, nIe_0
123#define DO_2D_11_11   DO jj = nJs_1, nJe_1   ;   DO ji = nIs_1, nIe_1
124
125! 2D loops with 1 following a 2/3D loop with 2
126
127#define DO_2D_00_01nxt2   DO jj = nJs_0    , nJe_0       ;   DO ji = nIs_0    , nIe_1nxt2
128#define DO_2D_00_10nxt2   DO jj = nJs_0    , nJe_0       ;   DO ji = nIs_1nxt2, nIe_0
129#define DO_2D_00_11nxt2   DO jj = nJs_0    , nJe_0       ;   DO ji = nIs_1nxt2, nIe_1nxt2
130
131#define DO_2D_01_00nxt2   DO jj = nJs_0    , nJe_1nxt2   ;   DO ji = nIs_0    , nIe_0
132#define DO_2D_01_01nxt2   DO jj = nJs_0    , nJe_1nxt2   ;   DO ji = nIs_0    , nIe_1nxt2
133#define DO_2D_01_10nxt2   DO jj = nJs_0    , nJe_1nxt2   ;   DO ji = nIs_1nxt2, nIe_0
134#define DO_2D_01_11nxt2   DO jj = nJs_0    , nJe_1nxt2   ;   DO ji = nIs_1nxt2, nIe_1nxt2
135
136#define DO_2D_10_00nxt2   DO jj = nJs_1nxt2, nJe_0       ;   DO ji = nIs_0    , nIe_0
137#define DO_2D_10_01nxt2   DO jj = nJs_1nxt2, nJe_0       ;   DO ji = nIs_0    , nIe_1nxt2   ! not used ?
138#define DO_2D_10_10nxt2   DO jj = nJs_1nxt2, nJe_0       ;   DO ji = nIs_1nxt2, nIe_0
139#define DO_2D_10_11nxt2   DO jj = nJs_1nxt2, nJe_0       ;   DO ji = nIs_1nxt2, nIe_1nxt2
140
141#define DO_2D_11_00nxt2   DO jj = nJs_1nxt2, nJe_1nxt2   ;   DO ji = nIs_0    , nIe_0
142#define DO_2D_11_01nxt2   DO jj = nJs_1nxt2, nJe_1nxt2   ;   DO ji = nIs_0    , nIe_1nxt2
143#define DO_2D_11_10nxt2   DO jj = nJs_1nxt2, nJe_1nxt2   ;   DO ji = nIs_1nxt2, nIe_0
144#define DO_2D_11_11nxt2   DO jj = nJs_1nxt2, nJe_1nxt2   ;   DO ji = nIs_1nxt2, nIe_1nxt2
145
146! 2D loops with 2
147
148#define DO_2D_11_12   DO jj = nJs_1nxt2, nJe_1nxt2   ;   DO ji = nIs_1nxt2, nIe_2
149#define DO_2D_11_21   DO jj = nJs_1nxt2, nJe_1nxt2   ;   DO ji = nIs_2    , nIe_1nxt2
150#define DO_2D_11_22   DO jj = nJs_1nxt2, nJe_1nxt2   ;   DO ji = nIs_2    , nIe_2
151
152#define DO_2D_12_11   DO jj = nJs_1nxt2, nJe_2       ;   DO ji = nIs_1nxt2, nIe_1nxt2
153#define DO_2D_12_12   DO jj = nJs_1nxt2, nJe_2       ;   DO ji = nIs_1nxt2, nIe_2
154#define DO_2D_12_21   DO jj = nJs_1nxt2, nJe_2       ;   DO ji = nIs_2    , nIe_1nxt2
155#define DO_2D_12_22   DO jj = nJs_1nxt2, nJe_2       ;   DO ji = nIs_2    , nIe_2
156 
157#define DO_2D_21_11   DO jj = nJs_2    , nJe_1nxt2   ;   DO ji = nIs_1nxt2, nIe_1nxt2
158#define DO_2D_21_12   DO jj = nJs_2    , nJe_1nxt2   ;   DO ji = nIs_1nxt2, nIe_2        ! not used ?
159#define DO_2D_21_21   DO jj = nJs_2    , nJe_1nxt2   ;   DO ji = nIs_2    , nIe_1nxt2
160#define DO_2D_21_22   DO jj = nJs_2    , nJe_1nxt2   ;   DO ji = nIs_2    , nIe_2
161                                     
162#define DO_2D_22_11   DO jj = nJs_2    , nJe_2       ;   DO ji = nIs_1nxt2, nIe_1nxt2
163#define DO_2D_22_12   DO jj = nJs_2    , nJe_2       ;   DO ji = nIs_1nxt2, nIe_2
164#define DO_2D_22_21   DO jj = nJs_2    , nJe_2       ;   DO ji = nIs_2    , nIe_1nxt2
165#define DO_2D_22_22   DO jj = nJs_2    , nJe_2       ;   DO ji = nIs_2    , nIe_2
166
167! 3D loops with 1
168
169#define DO_3D_00_00(ks,ke)   DO jk = ks, ke   ;   DO_2D_00_00   
170#define DO_3D_00_01(ks,ke)   DO jk = ks, ke   ;   DO_2D_00_01   
171#define DO_3D_00_10(ks,ke)   DO jk = ks, ke   ;   DO_2D_00_10   
172#define DO_3D_00_11(ks,ke)   DO jk = ks, ke   ;   DO_2D_00_11   
173
174#define DO_3D_01_00(ks,ke)   DO jk = ks, ke   ;   DO_2D_01_00   
175#define DO_3D_01_01(ks,ke)   DO jk = ks, ke   ;   DO_2D_01_01   
176#define DO_3D_01_10(ks,ke)   DO jk = ks, ke   ;   DO_2D_01_10   
177#define DO_3D_01_11(ks,ke)   DO jk = ks, ke   ;   DO_2D_01_11   
178
179#define DO_3D_10_00(ks,ke)   DO jk = ks, ke   ;   DO_2D_10_00   
180#define DO_3D_10_01(ks,ke)   DO jk = ks, ke   ;   DO_2D_10_01   
181#define DO_3D_10_10(ks,ke)   DO jk = ks, ke   ;   DO_2D_10_10   
182#define DO_3D_10_11(ks,ke)   DO jk = ks, ke   ;   DO_2D_10_11   
183
184#define DO_3D_11_00(ks,ke)   DO jk = ks, ke   ;   DO_2D_11_00   
185#define DO_3D_11_01(ks,ke)   DO jk = ks, ke   ;   DO_2D_11_01   
186#define DO_3D_11_10(ks,ke)   DO jk = ks, ke   ;   DO_2D_11_10   
187#define DO_3D_11_11(ks,ke)   DO jk = ks, ke   ;   DO_2D_11_11   
188
189! 3D loops with 1, following a 2/3D loop with 2
190
191#define DO_3D_00_01nxt2(ks,ke)   DO jk = ks, ke   ;   DO_2D_00_01nxt2   
192#define DO_3D_00_10nxt2(ks,ke)   DO jk = ks, ke   ;   DO_2D_00_10nxt2   
193#define DO_3D_00_11nxt2(ks,ke)   DO jk = ks, ke   ;   DO_2D_00_11nxt2   
194
195#define DO_3D_01_00nxt2(ks,ke)   DO jk = ks, ke   ;   DO_2D_01_00nxt2   
196#define DO_3D_01_01nxt2(ks,ke)   DO jk = ks, ke   ;   DO_2D_01_01nxt2   
197#define DO_3D_01_10nxt2(ks,ke)   DO jk = ks, ke   ;   DO_2D_01_10nxt2   
198#define DO_3D_01_11nxt2(ks,ke)   DO jk = ks, ke   ;   DO_2D_01_11nxt2   
199
200#define DO_3D_10_00nxt2(ks,ke)   DO jk = ks, ke   ;   DO_2D_10_00nxt2   
201#define DO_3D_10_01nxt2(ks,ke)   DO jk = ks, ke   ;   DO_2D_10_01nxt2   
202#define DO_3D_10_10nxt2(ks,ke)   DO jk = ks, ke   ;   DO_2D_10_10nxt2   
203#define DO_3D_10_11nxt2(ks,ke)   DO jk = ks, ke   ;   DO_2D_10_11nxt2   
204
205#define DO_3D_11_00nxt2(ks,ke)   DO jk = ks, ke   ;   DO_2D_11_00nxt2   
206#define DO_3D_11_01nxt2(ks,ke)   DO jk = ks, ke   ;   DO_2D_11_01nxt2   
207#define DO_3D_11_10nxt2(ks,ke)   DO jk = ks, ke   ;   DO_2D_11_10nxt2   
208#define DO_3D_11_11nxt2(ks,ke)   DO jk = ks, ke   ;   DO_2D_11_11nxt2   
209
210! 3D loops with 2
211
212#define DO_3D_11_12(ks,ke)   DO jk = ks, ke   ;   DO_2D_11_12   
213#define DO_3D_11_21(ks,ke)   DO jk = ks, ke   ;   DO_2D_11_21   
214#define DO_3D_11_22(ks,ke)   DO jk = ks, ke   ;   DO_2D_11_22   
215
216#define DO_3D_12_11(ks,ke)   DO jk = ks, ke   ;   DO_2D_12_11   
217#define DO_3D_12_12(ks,ke)   DO jk = ks, ke   ;   DO_2D_12_12   
218#define DO_3D_12_21(ks,ke)   DO jk = ks, ke   ;   DO_2D_12_21   
219#define DO_3D_12_22(ks,ke)   DO jk = ks, ke   ;   DO_2D_12_22   
220
221#define DO_3D_21_11(ks,ke)   DO jk = ks, ke   ;   DO_2D_21_11   
222#define DO_3D_21_12(ks,ke)   DO jk = ks, ke   ;   DO_2D_21_12   
223#define DO_3D_21_21(ks,ke)   DO jk = ks, ke   ;   DO_2D_21_21   
224#define DO_3D_21_22(ks,ke)   DO jk = ks, ke   ;   DO_2D_21_22   
225
226#define DO_3D_22_11(ks,ke)   DO jk = ks, ke   ;   DO_2D_22_11   
227#define DO_3D_22_12(ks,ke)   DO jk = ks, ke   ;   DO_2D_22_12   
228#define DO_3D_22_21(ks,ke)   DO jk = ks, ke   ;   DO_2D_22_21   
229#define DO_3D_22_22(ks,ke)   DO jk = ks, ke   ;   DO_2D_22_22   
230                               
231! 3D loops with increment with 1
232
233#define DO_3DS_00_00(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_00_00   
234#define DO_3DS_00_01(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_00_01   
235#define DO_3DS_00_10(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_00_10   
236#define DO_3DS_00_11(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_00_11   
237
238#define DO_3DS_01_00(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_01_00   
239#define DO_3DS_01_01(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_01_01   
240#define DO_3DS_01_10(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_01_10   
241#define DO_3DS_01_11(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_01_11   
242
243#define DO_3DS_10_00(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_10_00   
244#define DO_3DS_10_01(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_10_01   
245#define DO_3DS_10_10(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_10_10   
246#define DO_3DS_10_11(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_10_11   
247
248#define DO_3DS_11_00(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_11_00   
249#define DO_3DS_11_01(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_11_01   
250#define DO_3DS_11_10(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_11_10   
251#define DO_3DS_11_11(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_11_11   
252                               
253! 3D loops with increment with 1, following a 2/3D loop with 2
254
255#define DO_3DS_00_01nxt2(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_00_01nxt2   
256#define DO_3DS_00_10nxt2(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_00_10nxt2   
257#define DO_3DS_00_11nxt2(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_00_11nxt2   
258
259#define DO_3DS_01_00nxt2(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_01_00nxt2   
260#define DO_3DS_01_01nxt2(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_01_01nxt2   
261#define DO_3DS_01_10nxt2(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_01_10nxt2   
262#define DO_3DS_01_11nxt2(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_01_11nxt2   
263
264#define DO_3DS_10_00nxt2(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_10_00nxt2   
265#define DO_3DS_10_01nxt2(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_10_01nxt2   
266#define DO_3DS_10_10nxt2(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_10_10nxt2   
267#define DO_3DS_10_11nxt2(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_10_11nxt2   
268
269#define DO_3DS_11_00nxt2(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_11_00nxt2   
270#define DO_3DS_11_01nxt2(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_11_01nxt2   
271#define DO_3DS_11_10nxt2(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_11_10nxt2   
272#define DO_3DS_11_11nxt2(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_11_11nxt2   
273
274! 3D loops with increment with 2
275
276#define DO_3DS_11_12(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_11_12   
277#define DO_3DS_11_21(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_11_21   
278#define DO_3DS_11_22(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_11_22   
279
280#define DO_3DS_12_11(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_12_11   
281#define DO_3DS_12_12(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_12_12   
282#define DO_3DS_12_21(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_12_21   
283#define DO_3DS_12_22(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_12_22   
284
285#define DO_3DS_21_11(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_21_11   
286#define DO_3DS_21_12(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_21_12   
287#define DO_3DS_21_21(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_21_21   
288#define DO_3DS_21_22(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_21_22   
289
290#define DO_3DS_22_11(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_22_11   
291#define DO_3DS_22_12(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_22_12   
292#define DO_3DS_22_21(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_22_21   
293#define DO_3DS_22_22(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_22_22   
294                               
295#define END_2D   END DO   ;   END DO
296#define END_3D   END DO   ;   END DO   ;   END DO
Note: See TracBrowser for help on using the repository browser.