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 12760 for NEMO/branches/2020 – NEMO

Changeset 12760 for NEMO/branches/2020


Ignore:
Timestamp:
2020-04-17T08:53:28+02:00 (4 years ago)
Author:
smasson
Message:

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

Location:
NEMO/branches/2020/dev_r12558_HPC-08_epico_Extra_Halo/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/dev_r12558_HPC-08_epico_Extra_Halo/src/OCE/LBC/mppini.F90

    r12586 r12760  
    88   !!            8.0  !  1998-05  (M. Imbard, J. Escobar, L. Colombet )  SHMEM and MPI versions 
    99   !!  NEMO      1.0  !  2004-01  (G. Madec, J.M Molines)  F90 : free form , north fold jpni > 1 
    10    !!            3.4  ! 2011-10  (A. C. Coward, NOCS & J. Donners, PRACE) add mpp_init_nfdcom 
    11    !!            3.   ! 2013-06  (I. Epicoco, S. Mocavero, CMCC) mpp_init_nfdcom: setup avoiding MPI communication  
     10   !!            3.4  ! 2011-10  (A. C. Coward, NOCS & J. Donners, PRACE)  add init_nfdcom 
     11   !!            3.   ! 2013-06  (I. Epicoco, S. Mocavero, CMCC)  init_nfdcom: setup avoiding MPI communication  
    1212   !!            4.0  !  2016-06  (G. Madec)  use domain configuration file instead of bathymetry file 
    1313   !!            4.0  !  2017-06  (J.M. Molines, T. Lovato) merge of mppini and mppini_2 
     
    1515 
    1616   !!---------------------------------------------------------------------- 
    17    !!  mpp_init          : Lay out the global domain over processors with/without land processor elimination 
    18    !!  mpp_init_mask     : Read global bathymetric information to facilitate land suppression 
    19    !!  mpp_init_ioipsl   : IOIPSL initialization in mpp  
    20    !!  mpp_init_partition: Calculate MPP domain decomposition 
    21    !!  factorise         : Calculate the factors of the no. of MPI processes 
    22    !!  mpp_init_nfdcom   : Setup for north fold exchanges with explicit point-to-point messaging 
     17   !!  mpp_init       : Lay out the global domain over processors with/without land processor elimination 
     18   !!      init_ioipsl: IOIPSL initialization in mpp  
     19   !!      init_nfdcom: Setup for north fold exchanges with explicit point-to-point messaging 
     20   !!      init_doloop: set the starting/ending indices of DO-loop used in do_loop_substitute  
    2321   !!---------------------------------------------------------------------- 
    2422   USE dom_oce        ! ocean space and time domain 
     
    3432   PRIVATE 
    3533 
    36    PUBLIC mpp_init       ! called by opa.F90 
    37  
    38    INTEGER :: numbot = -1  ! 'bottom_level' local logical unit 
    39    INTEGER :: numbdy = -1  ! 'bdy_msk'      local logical unit 
     34   PUBLIC   mpp_init   ! called by opa.F90 
     35 
     36   INTEGER ::   numbot = -1   ! 'bottom_level' local logical unit 
     37   INTEGER ::   numbdy = -1   ! 'bdy_msk'      local logical unit 
    4038    
    4139   !!---------------------------------------------------------------------- 
     
    6664      jpj    = jpjglo 
    6765      jpk    = jpkglo 
    68       jpim1  = jpi-1                                            ! inner domain indices 
    69       jpjm1  = jpj-1                                            !   "           " 
    70       jpkm1  = MAX( 1, jpk-1 )                                  !   "           " 
     66      jpim1  = jpi-1                         ! inner domain indices 
     67      jpjm1  = jpj-1                         !   "           " 
     68      jpkm1  = MAX( 1, jpk-1 )               !   "           " 
     69      ! 
     70      CALL init_doloop                       ! set start/end indices or do-loop depending on the halo width value (nn_hls)  
     71      ! 
    7172      jpij   = jpi*jpj 
    7273      jpni   = 1 
     
    591592      jpi = nlci 
    592593      jpj = nlcj 
    593       jpk = jpkglo                                             ! third dim 
     594      jpk = jpkglo                              ! third dim 
    594595#if defined key_agrif 
    595596      ! simple trick to use same vertical grid as parent but different number of levels:  
     
    598599!!$      IF(.NOT.Agrif_Root())   jpkglo = Agrif_Parent( jpkglo ) 
    599600#endif 
    600       jpim1 = jpi-1                                            ! inner domain indices 
    601       jpjm1 = jpj-1                                            !   "           " 
    602       jpkm1 = MAX( 1, jpk-1 )                                  !   "           " 
    603       jpij  = jpi*jpj                                          !  jpi x j 
     601      ! 
     602      CALL init_doloop                          ! set start/end indices of do-loop, depending on the halo width value (nn_hls)  
     603      ! 
     604      jpim1 = jpi-1                             ! inner domain indices 
     605      jpjm1 = jpj-1                             !   "           " 
     606      jpkm1 = MAX( 1, jpk-1 )                   !   "           " 
     607      jpij  = jpi*jpj                           !  jpi x j 
    604608      DO jproc = 1, jpnij 
    605609         ii = iin(jproc) 
     
    691695      ENDIF 
    692696      ! 
    693       CALL mpp_init_ioipsl       ! Prepare NetCDF output file (if necessary) 
     697      CALL init_ioipsl       ! Prepare NetCDF output file (if necessary) 
    694698      !       
    695699      IF (( jperio >= 3 .AND. jperio <= 6 .AND. jpni > 1 ).AND.( ln_nnogather )) THEN 
    696          CALL mpp_init_nfdcom     ! northfold neighbour lists 
     700         CALL init_nfdcom     ! northfold neighbour lists 
    697701         IF (llwrtlay) THEN 
    698702            WRITE(inum,*) 
     
    11651169 
    11661170 
    1167    SUBROUTINE mpp_init_ioipsl 
    1168       !!---------------------------------------------------------------------- 
    1169       !!                  ***  ROUTINE mpp_init_ioipsl  *** 
     1171   SUBROUTINE init_ioipsl 
     1172      !!---------------------------------------------------------------------- 
     1173      !!                  ***  ROUTINE init_ioipsl  *** 
    11701174      !! 
    11711175      !! ** Purpose :    
     
    12001204      IF(lwp) THEN 
    12011205          WRITE(numout,*) 
    1202           WRITE(numout,*) 'mpp_init_ioipsl :   iloc  = ', iloc (1), iloc (2) 
     1206          WRITE(numout,*) 'mpp init_ioipsl :   iloc  = ', iloc (1), iloc (2) 
    12031207          WRITE(numout,*) '~~~~~~~~~~~~~~~     iabsf = ', iabsf(1), iabsf(2) 
    12041208          WRITE(numout,*) '                    ihals = ', ihals(1), ihals(2) 
     
    12081212      CALL flio_dom_set ( jpnij, nproc, idid, iglo, iloc, iabsf, iabsl, ihals, ihale, 'BOX', nidom) 
    12091213      ! 
    1210    END SUBROUTINE mpp_init_ioipsl   
    1211  
    1212  
    1213    SUBROUTINE mpp_init_nfdcom 
    1214       !!---------------------------------------------------------------------- 
    1215       !!                     ***  ROUTINE  mpp_init_nfdcom  *** 
     1214   END SUBROUTINE init_ioipsl   
     1215 
     1216 
     1217   SUBROUTINE init_nfdcom 
     1218      !!---------------------------------------------------------------------- 
     1219      !!                     ***  ROUTINE  init_nfdcom  *** 
    12161220      !! ** Purpose :   Setup for north fold exchanges with explicit  
    12171221      !!                point-to-point messaging 
     
    12631267      l_north_nogather = .TRUE. 
    12641268      ! 
    1265    END SUBROUTINE mpp_init_nfdcom 
    1266  
     1269   END SUBROUTINE init_nfdcom 
    12671270 
    12681271#endif 
    12691272 
     1273   SUBROUTINE init_doloop 
     1274      !!---------------------------------------------------------------------- 
     1275      !!                  ***  ROUTINE init_doloop  *** 
     1276      !! 
     1277      !! ** Purpose :   set the starting/ending indices of DO-loop 
     1278      !!              These indices are used in do_loop_substitute.h90 
     1279      !!---------------------------------------------------------------------- 
     1280      ! 
     1281      IF(     nn_hls == 1 ) THEN          !* halo size of 1 
     1282         ! 
     1283         nIs_0 =   2     ;   nIs_1 =   1     ;   nIs_1nxt2 = nIs_0   ;   nIs_2 = nIs_1 
     1284         nJs_0 =   2     ;   nJs_1 =   1     ;   nJs_1nxt2 = nJs_0   ;   nJs_2 = nJs_1 
     1285         !                                    
     1286         nIe_0 = jpi-1   ;   nIe_1 = jpi     ;   nIe_1nxt2 = nIe_0   ;   nIe_2 = nIe_1 
     1287         nJe_0 = jpj-1   ;   nJe_1 = jpj     ;   nJe_1nxt2 = nJe_0   ;   nJe_2 = nJe_1 
     1288         ! 
     1289      ELSEIF( nn_hls == 2 ) THEN          !* halo size of 2 
     1290         ! 
     1291         nIs_0 =   3     ;   nIs_1 =   2     ;   nIs_1nxt2 = nIs_1   ;   nIs_2 =   1 
     1292         nJs_0 =   3     ;   nJs_1 =   2     ;   nJs_1nxt2 = nJs_1   ;   nJs_2 =   1 
     1293         !                                                               
     1294         nIe_0 = jpi-2   ;   nIe_1 = jpi-1   ;   nIe_1nxt2 = nIe_1   ;   nIe_2 = jpi 
     1295         nJe_0 = jpj-2   ;   nJe_1 = jpj-1   ;   nJe_1nxt2 = nJe_1   ;   nJe_2 = jpj 
     1296         ! 
     1297      ELSE                                !* unexpected halo size 
     1298         CALL ctl_stop( 'STOP', 'ini_mpp:  wrong value of halo size : nn_hls= 1 or 2 only !') 
     1299      ENDIF 
     1300      ! 
     1301   END SUBROUTINE init_doloop 
     1302    
    12701303   !!====================================================================== 
    12711304END MODULE mppini 
  • NEMO/branches/2020/dev_r12558_HPC-08_epico_Extra_Halo/src/OCE/do_loop_substitute.h90

    r12719 r12760  
    5050! includes the possibility of strides for which an extra set of DO_3DS macros are defined. 
    5151! 
    52 ! In the following definitions the inner PE domain is defined by start indices of (___kIs_, __kJs_) and end indices of (__kIe_, __kJe_) 
    53 ! The following macros are defined just below: ___kIs_, __kJs_, ___kIsm1_, __kJsm1_, ___kIe_, __kJe_, ___kIep1_, __kJep1_.  
     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.  
    5454! These names are chosen to, hopefully, avoid any future, unintended matches elsewhere in the code. 
    5555! 
     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!  
    56101#endif 
    57 #define __kIs_     2 
    58 #define __kJs_     2 
    59 #define __kIsm1_   1 
    60 #define __kJsm1_   1 
    61  
    62 #define __kIe_     jpi-1 
    63 #define __kJe_     jpj-1 
    64 #define __kIep1_   jpi 
    65 #define __kJep1_   jpj 
    66  
    67 #define DO_2D_00_00   DO jj = __kJs_, __kJe_   ;   DO ji = __kIs_, __kIe_ 
    68 #define DO_2D_00_01   DO jj = __kJs_, __kJe_   ;   DO ji = __kIs_, __kIep1_ 
    69 #define DO_2D_00_10   DO jj = __kJs_, __kJe_   ;   DO ji = __kIsm1_, __kIe_ 
    70 #define DO_2D_00_11   DO jj = __kJs_, __kJe_   ;   DO ji = __kIsm1_, __kIep1_ 
    71   
    72 #define DO_2D_01_00   DO jj = __kJs_, __kJep1_   ;   DO ji = __kIs_, __kIe_ 
    73 #define DO_2D_01_01   DO jj = __kJs_, __kJep1_   ;   DO ji = __kIs_, __kIep1_ 
    74 #define DO_2D_01_10   DO jj = __kJs_, __kJep1_   ;   DO ji = __kIsm1_, __kIe_ 
    75 #define DO_2D_01_11   DO jj = __kJs_, __kJep1_   ;   DO ji = __kIsm1_, __kIep1_ 
    76   
    77 #define DO_2D_10_00   DO jj = __kJsm1_, __kJe_   ;   DO ji = __kIs_, __kIe_ 
    78 #define DO_2D_10_10   DO jj = __kJsm1_, __kJe_   ;   DO ji = __kIsm1_, __kIe_ 
    79 #define DO_2D_10_11   DO jj = __kJsm1_, __kJe_   ;   DO ji = __kIsm1_, __kIep1_ 
    80   
    81 #define DO_2D_11_00   DO jj = __kJsm1_, __kJep1_   ;   DO ji = __kIs_, __kIe_ 
    82 #define DO_2D_11_01   DO jj = __kJsm1_, __kJep1_   ;   DO ji = __kIs_, __kIep1_ 
    83 #define DO_2D_11_10   DO jj = __kJsm1_, __kJep1_   ;   DO ji = __kIsm1_, __kIe_ 
    84 #define DO_2D_11_11   DO jj = __kJsm1_, __kJep1_   ;   DO ji = __kIsm1_, __kIep1_ 
    85  
    86 #define DO_3D_00_00(ks,ke)   DO jk = ks, ke   ;   DO_2D_00_00 
    87 #define DO_3D_00_10(ks,ke)   DO jk = ks, ke   ;   DO_2D_00_10 
    88   
    89 #define DO_3D_01_01(ks,ke)   DO jk = ks, ke   ;   DO_2D_01_01 
    90   
    91 #define DO_3D_10_00(ks,ke)   DO jk = ks, ke   ;   DO_2D_10_00 
    92 #define DO_3D_10_10(ks,ke)   DO jk = ks, ke   ;   DO_2D_10_10 
    93 #define DO_3D_10_11(ks,ke)   DO jk = ks, ke   ;   DO_2D_10_11 
    94   
    95 #define DO_3D_11_11(ks,ke)   DO jk = ks, ke   ;   DO_2D_11_11 
    96  
    97 #define DO_3DS_00_00(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_00_00 
    98 #define DO_3DS_01_01(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_01_01 
    99 #define DO_3DS_10_10(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_10_10 
    100 #define DO_3DS_11_11(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_11_11 
    101  
     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                                 
    102295#define END_2D   END DO   ;   END DO 
    103296#define END_3D   END DO   ;   END DO   ;   END DO 
  • NEMO/branches/2020/dev_r12558_HPC-08_epico_Extra_Halo/src/OCE/par_oce.F90

    r12719 r12760  
    7878   INTEGER, PUBLIC, PARAMETER ::   jpr2di = 0   !: number of columns for extra outer halo  
    7979   INTEGER, PUBLIC, PARAMETER ::   jpr2dj = 0   !: number of rows    for extra outer halo  
    80    INTEGER, PUBLIC            ::   nn_hls       !: halo width (applies to both rows and columns) 
     80 
     81   ! halo with and starting/inding DO-loop indices 
     82   INTEGER, PUBLIC ::   nn_hls   !: halo width (applies to both rows and columns) 
     83   INTEGER, PUBLIC ::   nIs_0, nIs_1, nIs_1nxt2, nIs_2   !: start I-index (_0: without halo, _1 or _2: with 1 or 2 halos) 
     84   INTEGER, PUBLIC ::   nIe_0, nIe_1, nIe_1nxt2, nIe_2   !: end   I-index (_0: without halo, _1 or _2: with 1 or 2 halos) 
     85   INTEGER, PUBLIC ::   nJs_0, nJs_1, nJs_1nxt2, nJs_2   !: start J-index (_0: without halo, _1 or _2: with 1 or 2 halos) 
     86   INTEGER, PUBLIC ::   nJe_0, nJe_1, nJe_1nxt2, nJe_2   !: end   J-index (_0: without halo, _1 or _2: with 1 or 2 halos) 
    8187 
    8288   !!---------------------------------------------------------------------- 
  • NEMO/branches/2020/dev_r12558_HPC-08_epico_Extra_Halo/src/TOP/oce_trc.F90

    r12489 r12760  
    1818   USE par_oce , ONLY :   jp_tem   =>   jp_tem     !: indice for temperature 
    1919   USE par_oce , ONLY :   jp_sal   =>   jp_sal     !: indice for salinity 
     20   USE par_oce , ONLY :   nn_hls   =>   nn_hls     !:  
     21   USE par_oce , ONLY :   nIs_0    =>   nIs_0      !:  
     22   USE par_oce , ONLY :   nJs_0    =>   nJs_0      !:  
     23   USE par_oce , ONLY :   nIe_0    =>   nIe_0      !:  
     24   USE par_oce , ONLY :   nJe_0    =>   nJe_0      !:  
     25   USE par_oce , ONLY :   nIs_1    =>   nIs_1      !:  
     26   USE par_oce , ONLY :   nJs_1    =>   nJs_1      !:  
     27   USE par_oce , ONLY :   nIe_1    =>   nIe_1      !:  
     28   USE par_oce , ONLY :   nJe_1    =>   nJe_1      !:  
     29   USE par_oce , ONLY :   nIs_1nxt2    =>   nIs_1nxt2      !:  
     30   USE par_oce , ONLY :   nJs_1nxt2    =>   nJs_1nxt2      !:  
     31   USE par_oce , ONLY :   nIe_1nxt2    =>   nIe_1nxt2      !:  
     32   USE par_oce , ONLY :   nJe_1nxt2    =>   nJe_1nxt2      !:  
     33   USE par_oce , ONLY :   nIs_2    =>   nIs_2      !:  
     34   USE par_oce , ONLY :   nJs_2    =>   nJs_2      !:  
     35   USE par_oce , ONLY :   nIe_2    =>   nIe_2      !:  
     36   USE par_oce , ONLY :   nJe_2    =>   nJe_2      !:  
    2037 
    2138   USE in_out_manager                           !* IO manager * 
Note: See TracChangeset for help on using the changeset viewer.