Ignore:
Timestamp:
2020-07-10T20:24:21+02:00 (4 months ago)
Author:
acc
Message:

Replace do-loop macros in the trunk with alternative forms with greater flexibility for extra halo applications. This alters a lot of routines but does not change any behaviour or results. do_loop_substitute.h90 is greatly simplified by this change. SETTE results are identical to those with the previous revision

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/trunk/src/OCE/do_loop_substitute.h90

    r13286 r13295  
    4747!   END_2D 
    4848!  
    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. 
     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. 
    5152! 
    52 ! In the following definitions the inner PE domain is defined by start indices of (_Nis0, Njs0) and end indices of (Nie0, Njs0) 
    53 ! The following macros are defined just below: _Nis0, Njs0, _Nis1, Njs1, _Nie0, Njs0, _Nie1, Nje1.  
    54 ! These names are chosen to, hopefully, avoid any future, unintended matches elsewhere in the code. 
     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: 
    5555! 
    56 !!gm changes ; 
    57 ! 
    58 ! -0- fortran code : defined in par_oce.F90 the folowwing valiables : 
    59 !!#  
    60 !!#    INTEGER, PUBLIC ::   Nis0, Nis1, Nis2   !: start I-index (_0: no halo, _1 & _2: 1 & 2-halos) 
    61 !!#    INTEGER, PUBLIC ::   Nie0, Nie1, Nie2   !: end   I-index (_0: no halo, _1 & _2: 1 & 2-halos) 
    62 !!#    INTEGER, PUBLIC ::   Njs0, Njs1, Njs2   !: start J-index (_0: no halo, _1 & _2: 1 & 2-halos) 
    63 !!#    INTEGER, PUBLIC ::   Nje0, Nje1, Nje2   !: 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 !!#         Nis0 =   2     ;   Nis1 =   1     ;   Nis2 = Nis1 
    79 !!#         Njs0 = Nis0    ;   Njs1 = Nis1    ;   Njs2 = Nis1 
    80 !!#         ! 
    81 !!#         Nie0 = jpi-1   ;   Nje1 = jpi     ;   Nie2 = Nie1 
    82 !!#         Nje0 = jpj-1   ;   Nje1 = jpj-1   ;   Nje2 = Nie1 
    83 !!#         ! 
    84 !!#      ELSEIF( nn_hls == 2 ) THEN          !* halo size of 2 
    85 !!#         ! 
    86 !!#         Nis0 =   3     ;   Nis1 =   2     ;   Nis2 =   1 
    87 !!#         Njs0 = Nis0    ;   Njs1 = Nis1    ;   Njs2 = Nis2 
    88 !!#         ! 
    89 !!#         Nie0 = jpi-2   ;   Nje1 = jpi-1   ;   Nie2 = jpi 
    90 !!#         Nje0 = jpj-2   ;   Nje1 = jpj-1   ;   Nje2 = 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 : 
     56! Nis0 =   1 + nn_hls     Njs0 =   1 + nn_hls 
     57! Nie0 = jpi - nn_hls     Nje0 = jpj - nn_hls 
    10058!  
    10159#endif 
    10260 
    103 ! 2D loops with 1 
     61#define DO_2D(B, T, L, R) DO jj = Njs0-(B), Nje0+(T)   ;   DO ji = Nis0-(L), Nie0+(R) 
    10462 
    105 #define DO_2D_00_00   DO jj = Njs0, Nje0   ;   DO ji = Nis0, Nie0 
    106 #define DO_2D_00_01   DO jj = Njs0, Nje0   ;   DO ji = Nis0, Nie1 
    107 #define DO_2D_00_10   DO jj = Njs0, Nje0   ;   DO ji = Nis1, Nie0 
    108 #define DO_2D_00_11   DO jj = Njs0, Nje0   ;   DO ji = Nis1, Nie1 
    109   
    110 #define DO_2D_01_00   DO jj = Njs0, Nje1   ;   DO ji = Nis0, Nie0 
    111 #define DO_2D_01_01   DO jj = Njs0, Nje1   ;   DO ji = Nis0, Nie1 
    112 #define DO_2D_01_10   DO jj = Njs0, Nje1   ;   DO ji = Nis1, Nie0 
    113 #define DO_2D_01_11   DO jj = Njs0, Nje1   ;   DO ji = Nis1, Nie1 
    114   
    115 #define DO_2D_10_00   DO jj = Njs1, Nje0   ;   DO ji = Nis0, Nie0 
    116 #define DO_2D_10_01   DO jj = Njs1, Nje0   ;   DO ji = Nis0, Nie1   ! not used ? 
    117 #define DO_2D_10_10   DO jj = Njs1, Nje0   ;   DO ji = Nis1, Nie0 
    118 #define DO_2D_10_11   DO jj = Njs1, Nje0   ;   DO ji = Nis1, Nie1 
    119   
    120 #define DO_2D_11_00   DO jj = Njs1, Nje1   ;   DO ji = Nis0, Nie0 
    121 #define DO_2D_11_01   DO jj = Njs1, Nje1   ;   DO ji = Nis0, Nie1 
    122 #define DO_2D_11_10   DO jj = Njs1, Nje1   ;   DO ji = Nis1, Nie0 
    123 #define DO_2D_11_11   DO jj = Njs1, Nje1   ;   DO ji = Nis1, Nie1 
     63#define DO_3D(B, T, L, R, ks, ke) DO jk = ks, ke   ;   DO_2D(B, T, L, R) 
    12464 
    125 ! 2D loops with 1 following a 2/3D loop with 2 
     65#define DO_3DS(B, T, L, R, ks, ke, ki) DO jk = ks, ke, ki   ;   DO_2D(B, T, L, R) 
    12666 
    127 #define DO_2D_00_01nxt2   DO jj = Njs0    , Nje0       ;   DO ji = Nis0    , Nie1nxt2 
    128 #define DO_2D_00_10nxt2   DO jj = Njs0    , Nje0       ;   DO ji = Nis1nxt2, Nie0 
    129 #define DO_2D_00_11nxt2   DO jj = Njs0    , Nje0       ;   DO ji = Nis1nxt2, Nie1nxt2 
    130  
    131 #define DO_2D_01_00nxt2   DO jj = Njs0    , Nje1nxt2   ;   DO ji = Nis0    , Nie0 
    132 #define DO_2D_01_01nxt2   DO jj = Njs0    , Nje1nxt2   ;   DO ji = Nis0    , Nie1nxt2 
    133 #define DO_2D_01_10nxt2   DO jj = Njs0    , Nje1nxt2   ;   DO ji = Nis1nxt2, Nie0 
    134 #define DO_2D_01_11nxt2   DO jj = Njs0    , Nje1nxt2   ;   DO ji = Nis1nxt2, Nie1nxt2 
    135  
    136 #define DO_2D_10_00nxt2   DO jj = Njs1nxt2, Nje0       ;   DO ji = Nis0    , Nie0 
    137 #define DO_2D_10_01nxt2   DO jj = Njs1nxt2, Nje0       ;   DO ji = Nis0    , Nie1nxt2   ! not used ? 
    138 #define DO_2D_10_10nxt2   DO jj = Njs1nxt2, Nje0       ;   DO ji = Nis1nxt2, Nie0 
    139 #define DO_2D_10_11nxt2   DO jj = Njs1nxt2, Nje0       ;   DO ji = Nis1nxt2, Nie1nxt2 
    140  
    141 #define DO_2D_11_00nxt2   DO jj = Njs1nxt2, Nje1nxt2   ;   DO ji = Nis0    , Nie0 
    142 #define DO_2D_11_01nxt2   DO jj = Njs1nxt2, Nje1nxt2   ;   DO ji = Nis0    , Nie1nxt2 
    143 #define DO_2D_11_10nxt2   DO jj = Njs1nxt2, Nje1nxt2   ;   DO ji = Nis1nxt2, Nie0 
    144 #define DO_2D_11_11nxt2   DO jj = Njs1nxt2, Nje1nxt2   ;   DO ji = Nis1nxt2, Nie1nxt2 
    145  
    146 ! 2D loops with 2 
    147  
    148 #define DO_2D_11_12   DO jj = Njs1nxt2, Nje1nxt2   ;   DO ji = Nis1nxt2, Nie2 
    149 #define DO_2D_11_21   DO jj = Njs1nxt2, Nje1nxt2   ;   DO ji = Nis2    , Nie1nxt2 
    150 #define DO_2D_11_22   DO jj = Njs1nxt2, Nje1nxt2   ;   DO ji = Nis2    , Nie2 
    151  
    152 #define DO_2D_12_11   DO jj = Njs1nxt2, Nje2       ;   DO ji = Nis1nxt2, Nie1nxt2 
    153 #define DO_2D_12_12   DO jj = Njs1nxt2, Nje2       ;   DO ji = Nis1nxt2, Nie2 
    154 #define DO_2D_12_21   DO jj = Njs1nxt2, Nje2       ;   DO ji = Nis2    , Nie1nxt2 
    155 #define DO_2D_12_22   DO jj = Njs1nxt2, Nje2       ;   DO ji = Nis2    , Nie2 
    156   
    157 #define DO_2D_21_11   DO jj = Njs2    , Nje1nxt2   ;   DO ji = Nis1nxt2, Nie1nxt2 
    158 #define DO_2D_21_12   DO jj = Njs2    , Nje1nxt2   ;   DO ji = Nis1nxt2, Nie2        ! not used ? 
    159 #define DO_2D_21_21   DO jj = Njs2    , Nje1nxt2   ;   DO ji = Nis2    , Nie1nxt2 
    160 #define DO_2D_21_22   DO jj = Njs2    , Nje1nxt2   ;   DO ji = Nis2    , Nie2 
    161                                       
    162 #define DO_2D_22_11   DO jj = Njs2    , Nje2       ;   DO ji = Nis1nxt2, Nie1nxt2 
    163 #define DO_2D_22_12   DO jj = Njs2    , Nje2       ;   DO ji = Nis1nxt2, Nie2 
    164 #define DO_2D_22_21   DO jj = Njs2    , Nje2       ;   DO ji = Nis2    , Nie1nxt2 
    165 #define DO_2D_22_22   DO jj = Njs2    , Nje2       ;   DO ji = Nis2    , Nie2 
    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                                  
    29567#define END_2D   END DO   ;   END DO 
    29668#define END_3D   END DO   ;   END DO   ;   END DO 
Note: See TracChangeset for help on using the changeset viewer.