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 14349 – NEMO

Changeset 14349


Ignore:
Timestamp:
2021-01-27T14:57:31+01:00 (3 years ago)
Author:
smasson
Message:

dev_r14312_MPI_Interface: further simplifications of lbclk and lbcnfd, #2598

Location:
NEMO/branches/2021/dev_r14312_MPI_Interface
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2021/dev_r14312_MPI_Interface/src/OCE/LBC/lbc_lnk_call_generic.h90

    r14338 r14349  
    11#if defined DIM_2d 
    2 #   define XD      2d 
    3 #   define DIMS1   :,: 
    4 #   define DIMS2   :,:,1,1 
     2#   define XD     2d 
     3#   define DIMS   :,: 
     4#   define ISZ3   1  
     5#   define ISZ4   1    
    56#endif 
    67#if defined DIM_3d 
    7 #   define XD      3d 
    8 #   define DIMS1   :,:,: 
    9 #   define DIMS2   :,:,:,1 
     8#   define XD     3d 
     9#   define DIMS   :,:,: 
     10#   define ISZ3   SIZE(ptab, dim=3) 
     11#   define ISZ4   1 
    1012#endif 
    1113#if defined DIM_4d 
    12 #   define XD      4d 
    13 #   define DIMS1   :,:,:,: 
    14 #   define DIMS2   :,:,:,: 
     14#   define XD     4d 
     15#   define DIMS   :,:,:,: 
     16#   define ISZ3   SIZE(ptab, dim=3) 
     17#   define ISZ4   SIZE(ptab, dim=4) 
    1518#endif 
    1619 
     
    2427      !!--------------------------------------------------------------------- 
    2528      CHARACTER(len=*)     ,                   INTENT(in   ) ::   cdname  ! name of the calling subroutine 
    26       REAL(PRECISION), DIMENSION(DIMS1)          , TARGET, INTENT(inout) ::   pt1        ! arrays on which the lbc is applied 
    27       REAL(PRECISION), DIMENSION(DIMS1), OPTIONAL, TARGET, INTENT(inout) ::   pt2 , pt3 , pt4 , pt5 , pt6 , pt7 , pt8 , pt9, & 
     29      REAL(PRECISION), DIMENSION(DIMS)          , TARGET, CONTIGUOUS, INTENT(inout) ::   pt1        ! arrays on which the lbc is applied 
     30      REAL(PRECISION), DIMENSION(DIMS), OPTIONAL, TARGET, CONTIGUOUS, INTENT(inout) ::   pt2 , pt3 , pt4 , pt5 , pt6 , pt7 , pt8 , pt9, & 
    2831         &                                                                    pt10, pt11, pt12, pt13, pt14, pt15, pt16 
    2932      CHARACTER(len=1)                       , INTENT(in   ) ::   cdna1   ! nature of pt2D. array grid-points 
     
    3942      !! 
    4043      INTEGER                          ::   kfld        ! number of elements that will be attributed 
    41       TYPE(PTR_/**/XD/**/_/**/PRECISION), DIMENSION(16) ::   ptab_ptr    ! pointer array 
     44      TYPE(PTR_4d_/**/PRECISION), DIMENSION(16) ::   ptab_ptr    ! pointer array 
    4245      CHARACTER(len=1) , DIMENSION(16) ::   cdna_ptr    ! nature of ptab_ptr grid-points 
    4346      REAL(PRECISION)  , DIMENSION(16) ::   psgn_ptr    ! sign used across the north fold boundary 
     
    6568      IF( PRESENT(psgn15) )   CALL load_ptr_/**/XD/**/_/**/PRECISION( pt15, cdna15, psgn15, ptab_ptr, cdna_ptr, psgn_ptr, kfld ) 
    6669      IF( PRESENT(psgn16) )   CALL load_ptr_/**/XD/**/_/**/PRECISION( pt16, cdna16, psgn16, ptab_ptr, cdna_ptr, psgn_ptr, kfld ) 
    67       ! 
     70      !      
    6871      IF( nn_comm == 1 ) THEN  
    6972         CALL lbc_lnk_pt2pt(   cdname, ptab_ptr, cdna_ptr, psgn_ptr, kfld, kfillmode, pfillval, lsend, lrecv ) 
     
    7780   SUBROUTINE load_ptr_/**/XD/**/_/**/PRECISION( ptab, cdna, psgn, ptab_ptr, cdna_ptr, psgn_ptr, kfld ) 
    7881      !!--------------------------------------------------------------------- 
    79       REAL(PRECISION), DIMENSION(DIMS1), TARGET, INTENT(inout) ::   ptab       ! arrays on which the lbc is applied 
     82      REAL(PRECISION), DIMENSION(DIMS), TARGET, INTENT(inout), CONTIGUOUS ::   ptab       ! arrays on which the lbc is applied 
    8083      CHARACTER(len=1)              , INTENT(in   ) ::   cdna       ! nature of pt2d array grid-points 
    8184      REAL(PRECISION)               , INTENT(in   ) ::   psgn       ! sign used across the north fold boundary 
    82       TYPE(PTR_/**/XD/**/_/**/PRECISION), DIMENSION(:), INTENT(inout) ::   ptab_ptr   ! array of pointers 
     85      TYPE(PTR_4d_/**/PRECISION), DIMENSION(:), INTENT(inout) ::   ptab_ptr   ! array of pointers 
    8386      CHARACTER(len=1), DIMENSION(:), INTENT(inout) ::   cdna_ptr   ! nature of pt2d_array array grid-points 
    8487      REAL(PRECISION) , DIMENSION(:), INTENT(inout) ::   psgn_ptr   ! sign used across the north fold boundary 
     
    8790      ! 
    8891      kfld                    =  kfld + 1 
    89       ptab_ptr(kfld)%pt/**/XD => ptab 
     92      ptab_ptr(kfld)%pt4d(1:SIZE(ptab, dim=1),1:SIZE(ptab, dim=2),1:ISZ3,1:ISZ4) => ptab 
    9093      cdna_ptr(kfld)          =  cdna 
    9194      psgn_ptr(kfld)          =  psgn 
     
    9497 
    9598#undef XD 
    96 #undef DIMS1 
    97 #undef DIMS2 
     99#undef DIMS 
     100#undef ISZ3 
     101#undef ISZ4 
  • NEMO/branches/2021/dev_r14312_MPI_Interface/src/OCE/LBC/lbc_lnk_neicoll_generic.h90

    r14344 r14349  
    1 #if defined DIM_2d 
    2 #   define XD                       2d 
    3 #   define ARRAY_IN(i,j,k,l,f)      ptab(f)%pt2d(i,j) 
    4 #   define K_SIZE(ptab)             1 
    5 #   define L_SIZE(ptab)             1 
    6 #endif 
    7 #if defined DIM_3d 
    8 #   define XD                       3d 
    9 #   define ARRAY_IN(i,j,k,l,f)      ptab(f)%pt3d(i,j,k) 
    10 #   define K_SIZE(ptab)             SIZE(ptab(1)%pt3d,3) 
    11 #   define L_SIZE(ptab)             1 
    12 #endif 
    13 #if defined DIM_4d 
    14 #   define XD                       4d 
    15 #   define ARRAY_IN(i,j,k,l,f)      ptab(f)%pt4d(i,j,k,l) 
    16 #   define K_SIZE(ptab)             SIZE(ptab(1)%pt4d,3) 
    17 #   define L_SIZE(ptab)             SIZE(ptab(1)%pt4d,4) 
    18 #endif 
    19 #define    F_SIZE(ptab)             kfld 
    20  
    21    SUBROUTINE lbc_lnk_neicoll_/**/XD/**/_/**/PRECISION( cdname, ptab, cd_nat, psgn, kfld, kfillmode, pfillval, lsend, lrecv, ncsten ) 
     1 
     2   SUBROUTINE lbc_lnk_neicoll_/**/PRECISION( cdname, ptab, cd_nat, psgn, kfld, kfillmode, pfillval, lsend, lrecv, ncsten ) 
    223      CHARACTER(len=*)              , INTENT(in   ) ::   cdname      ! name of the calling subroutine 
    23       TYPE(PTR_/**/XD/**/_/**/PRECISION),  DIMENSION(:), INTENT(inout) ::   ptab        ! pointer of arrays on which apply the b.c. 
     4      TYPE(PTR_4d_/**/PRECISION),  DIMENSION(:), INTENT(inout) ::   ptab        ! pointer of arrays on which apply the b.c. 
    245      CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   cd_nat      ! nature of array grid-points 
    256      REAL(PRECISION),  DIMENSION(:), INTENT(in   ) ::   psgn        ! sign used across the north fold boundary 
     
    5233      LOGICAL  ::   ll_IdoNFold 
    5334      !!---------------------------------------------------------------------- 
    54 #if defined PRINT_CAUTION 
    55       ! 
    56       ! ================================================================================== ! 
    57       ! CAUTION: semi-column notation is often impossible because of the cpp preprocessing ! 
    58       ! ================================================================================== ! 
    59       ! 
    60 #endif 
    6135      ! 
    6236      ! ----------------------------------------- ! 
     
    6438      ! ----------------------------------------- ! 
    6539      ! 
    66       ipk = K_SIZE(ptab)   ! 3rd dimension 
    67       ipl = L_SIZE(ptab)   ! 4th    - 
    68       ipf = F_SIZE(ptab)   ! 5th    -      use in "multi" case (array of pointers) 
     40      ipk = SIZE(ptab(1)%pt4d,3) 
     41      ipl = SIZE(ptab(1)%pt4d,4) 
     42      ipf = kfld 
    6943      ! 
    7044      IF( narea == 1 .AND. numcom == -1 ) CALL mpp_report( cdname, ipk, ipl, ipf, ld_lbc = .TRUE. ) 
     
    162136      ALLOCATE( zsnd(SUM(icounts)), zrcv(SUM(icountr)) ) 
    163137 
    164       ! fill sending buffer with ARRAY_IN 
     138      ! fill sending buffer with ptab(jf)%pt4d 
    165139      idx = 1 
    166140      DO jn = 1, 8 
     
    169143            ishtj = ishtsj(jn) 
    170144            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    171                zsnd(idx) = ARRAY_IN(ishti+ji,ishtj+jj,jk,jl,jf) 
     145               zsnd(idx) = ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) 
    172146               idx = idx + 1 
    173147            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO 
     
    195169         CASE ( jpfillmpi   )                 ! fill with data received by MPI 
    196170            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    197                ARRAY_IN(ishti+ji,ishtj+jj,jk,jl,jf) = zrcv(idx) 
     171               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = zrcv(idx) 
    198172               idx = idx + 1 
    199173            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO 
     
    202176            ishtj2 = ishtpj(jn) 
    203177            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    204                ARRAY_IN(ishti+ji,ishtj+jj,jk,jl,jf) = ARRAY_IN(ishti2+ji,ishtj2+jj,jk,jl,jf) 
     178               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl) 
    205179            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO 
    206180         CASE ( jpfillcopy  )                 ! filling with inner domain values 
     
    208182            ishtj2 = ishtsj(jn) 
    209183            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    210                ARRAY_IN(ishti+ji,ishtj+jj,jk,jl,jf) = ARRAY_IN(ishti2+ji,ishtj2+jj,jk,jl,jf) 
     184               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl) 
    211185            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO 
    212186         CASE ( jpfillcst   )                 ! filling with constant value 
    213187            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    214                ARRAY_IN(ishti+ji,ishtj+jj,jk,jl,jf) = zland 
     188               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = zland 
    215189            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO 
    216190         END SELECT 
     
    227201            ishtj2 = ishtrj(jn)   ! use j- shift recv location: use ew-perio -> ok as filling of the south and north halos now done 
    228202            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    229                ARRAY_IN(ishti+ji,ishtj+jj,jk,jl,jf) = ARRAY_IN(ishti2+ji,ishtj2+jj,jk,jl,jf) 
     203               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl) 
    230204            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO 
    231205         ENDIF 
     
    236210            ishtj2 = ishtpj(jn)   ! use j- shift periodicity 
    237211            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    238                ARRAY_IN(ishti+ji,ishtj+jj,jk,jl,jf) = ARRAY_IN(ishti2+ji,ishtj2+jj,jk,jl,jf) 
     212               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl) 
    239213            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO 
    240214         ENDIF 
     
    251225      ENDIF 
    252226      ! 
    253    END SUBROUTINE lbc_lnk_neicoll_/**/XD/**/_/**/PRECISION 
    254  
    255 #undef XD 
    256 #undef ARRAY_IN 
    257 #undef K_SIZE 
    258 #undef L_SIZE 
    259 #undef F_SIZE 
     227   END SUBROUTINE lbc_lnk_neicoll_/**/PRECISION 
     228 
  • NEMO/branches/2021/dev_r14312_MPI_Interface/src/OCE/LBC/lbc_lnk_pt2pt_generic.h90

    r14343 r14349  
    1 #if defined DIM_2d 
    2 #   define XD                       2d 
    3 #   define ARRAY_IN(i,j,k,l,f)      ptab(f)%pt2d(i,j) 
    4 #   define K_SIZE(ptab)             1 
    5 #   define L_SIZE(ptab)             1 
    6 #endif 
    7 #if defined DIM_3d 
    8 #   define XD                       3d 
    9 #   define ARRAY_IN(i,j,k,l,f)      ptab(f)%pt3d(i,j,k) 
    10 #   define K_SIZE(ptab)             SIZE(ptab(1)%pt3d,3) 
    11 #   define L_SIZE(ptab)             1 
    12 #endif 
    13 #if defined DIM_4d 
    14 #   define XD                       4d 
    15 #   define ARRAY_IN(i,j,k,l,f)      ptab(f)%pt4d(i,j,k,l) 
    16 #   define K_SIZE(ptab)             SIZE(ptab(1)%pt4d,3) 
    17 #   define L_SIZE(ptab)             SIZE(ptab(1)%pt4d,4) 
    18 #endif 
    19 #define    F_SIZE(ptab)             kfld 
    201 
    21    SUBROUTINE lbc_lnk_pt2pt_/**/XD/**/_/**/PRECISION( cdname, ptab, cd_nat, psgn, kfld, kfillmode, pfillval, lsend, lrecv ) 
     2   SUBROUTINE lbc_lnk_pt2pt_/**/PRECISION( cdname, ptab, cd_nat, psgn, kfld, kfillmode, pfillval, lsend, lrecv ) 
    223      CHARACTER(len=*)              , INTENT(in   ) ::   cdname      ! name of the calling subroutine 
    23       TYPE(PTR_/**/XD/**/_/**/PRECISION),  DIMENSION(:), INTENT(inout) ::   ptab        ! pointer of arrays on which apply the b.c. 
     4      TYPE(PTR_4d_/**/PRECISION),  DIMENSION(:), INTENT(inout) ::   ptab        ! pointer of arrays on which apply the b.c. 
    245      CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   cd_nat      ! nature of array grid-points 
    256      REAL(PRECISION),  DIMENSION(:), INTENT(in   ) ::   psgn        ! sign used across the north fold boundary 
     
    4526      LOGICAL  ::   ll_IdoNFold 
    4627      !!---------------------------------------------------------------------- 
    47 #if defined PRINT_CAUTION 
    48       ! 
    49       ! ================================================================================== ! 
    50       ! CAUTION: semi-column notation is often impossible because of the cpp preprocessing ! 
    51       ! ================================================================================== ! 
    52       ! 
    53 #endif 
    5428      ! 
    5529      ! ----------------------------------------- ! 
     
    5731      ! ----------------------------------------- ! 
    5832      ! 
    59       ipk = K_SIZE(ptab)   ! 3rd dimension 
    60       ipl = L_SIZE(ptab)   ! 4th    - 
    61       ipf = F_SIZE(ptab)   ! 5th    -      use in "multi" case (array of pointers) 
     33      ipk = SIZE(ptab(1)%pt4d,3) 
     34      ipl = SIZE(ptab(1)%pt4d,4) 
     35      ipf = kfld 
    6236      ! 
    6337      IF( narea == 1 .AND. numcom == -1 ) CALL mpp_report( cdname, ipk, ipl, ipf, ld_lbc = .TRUE. ) 
     
    148122            ishtj = ishtsj(jn) 
    149123            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    150                zsnd(idxs) = ARRAY_IN(ishti+ji,ishtj+jj,jk,jl,jf) 
     124               zsnd(idxs) = ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) 
    151125               idxs = idxs + 1 
    152126            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO 
     
    184158         CASE ( jpfillmpi   )                 ! fill with data received by MPI 
    185159            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    186                ARRAY_IN(ishti+ji,ishtj+jj,jk,jl,jf) = zrcv(idxr) 
     160               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = zrcv(idxr) 
    187161               idxr = idxr + 1 
    188162            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO 
     
    191165            ishtj2 = ishtpj(jn) 
    192166            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    193                ARRAY_IN(ishti+ji,ishtj+jj,jk,jl,jf) = ARRAY_IN(ishti2+ji,ishtj2+jj,jk,jl,jf) 
     167               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl) 
    194168            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO 
    195169         CASE ( jpfillcopy  )                 ! filling with inner domain values 
     
    197171            ishtj2 = ishtsj(jn) 
    198172            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    199                ARRAY_IN(ishti+ji,ishtj+jj,jk,jl,jf) = ARRAY_IN(ishti2+ji,ishtj2+jj,jk,jl,jf) 
     173               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl) 
    200174            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO 
    201175         CASE ( jpfillcst   )                 ! filling with constant value 
    202176            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    203                ARRAY_IN(ishti+ji,ishtj+jj,jk,jl,jf) = zland 
     177               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = zland 
    204178            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO 
    205179         END SELECT 
     
    227201            ishtj = ishtsj(jn) 
    228202            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    229                zsnd(idxs) = ARRAY_IN(ishti+ji,ishtj+jj,jk,jl,jf) 
     203               zsnd(idxs) = ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) 
    230204               idxs = idxs + 1 
    231205            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO 
     
    261235         CASE ( jpfillmpi   )                 ! fill with data received by MPI 
    262236            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    263                ARRAY_IN(ishti+ji,ishtj+jj,jk,jl,jf) = zrcv(idxr) 
     237               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = zrcv(idxr) 
    264238               idxr = idxr + 1 
    265239            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO 
     
    268242            ishtj2 = ishtpj(jn) 
    269243            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    270                ARRAY_IN(ishti+ji,ishtj+jj,jk,jl,jf) = ARRAY_IN(ishti2+ji,ishtj2+jj,jk,jl,jf) 
     244               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl) 
    271245            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO 
    272246         CASE ( jpfillcopy  )                 ! filling with inner domain values 
     
    274248            ishtj2 = ishtsj(jn) 
    275249            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    276                ARRAY_IN(ishti+ji,ishtj+jj,jk,jl,jf) = ARRAY_IN(ishti2+ji,ishtj2+jj,jk,jl,jf) 
     250               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl) 
    277251            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO 
    278252         CASE ( jpfillcst   )                 ! filling with constant value 
    279253            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    280                ARRAY_IN(ishti+ji,ishtj+jj,jk,jl,jf) = zland 
     254               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = zland 
    281255            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO 
    282256         END SELECT 
     
    290264      DEALLOCATE( zsnd, zrcv ) 
    291265      ! 
    292    END SUBROUTINE lbc_lnk_pt2pt_/**/XD/**/_/**/PRECISION 
     266   END SUBROUTINE lbc_lnk_pt2pt_/**/PRECISION 
    293267 
    294 #undef XD 
    295 #undef ARRAY_IN 
    296 #undef K_SIZE 
    297 #undef L_SIZE 
    298 #undef F_SIZE 
  • NEMO/branches/2021/dev_r14312_MPI_Interface/src/OCE/LBC/lbc_nfd_ext_generic.h90

    r14338 r14349  
    1 #if defined DIM_2d 
    2 #   define XD                    2d 
    3 #   define ARRAY_IN(i,j,k,l,f)   ptab(i,j) 
    4 #   define K_SIZE(ptab)          1 
    5 #   define L_SIZE(ptab)          1 
    6 #else 
    7 === NOT CODED === 
    8 #endif 
    9 #define    F_SIZE(ptab)          1 
    101 
    11    SUBROUTINE lbc_nfd_ext_/**/XD/**/_/**/PRECISION( ptab, cd_nat, psgn, kextj ) 
     2   SUBROUTINE lbc_nfd_ext_/**/PRECISION( ptab, cd_nat, psgn, kextj ) 
    123      !!---------------------------------------------------------------------- 
    134      REAL(PRECISION), DIMENSION(:,1-kextj:),INTENT(inout) ::   ptab 
     
    156      REAL(PRECISION),  INTENT(in   ) ::   psgn        ! sign used across the north fold boundary 
    167      INTEGER,          INTENT(in   ) ::   kextj       ! extra halo width at north fold 
    17 !!      INTEGER                       , INTENT(in   ) ::   kextj       ! extra halo width at north fold, declared before its use in ptab 
    188      ! 
    19       INTEGER  ::    ji,  jj,  jk,  jl, jh,  jf   ! dummy loop indices 
    20       INTEGER  ::   ipi, ipj, ipk, ipl,     ipf   ! dimension of the input array 
     9      INTEGER  ::    ji,  jj,  jh   ! dummy loop indices 
     10      INTEGER  ::   ipj 
    2111      INTEGER  ::   ijt, iju, ipjm1 
    2212      !!---------------------------------------------------------------------- 
    23       ! 
    24       ipk = K_SIZE(ptab)   ! 3rd dimension 
    25       ipl = L_SIZE(ptab)   ! 4th    - 
    26       ipf = F_SIZE(ptab)   ! 5th    -      use in "multi" case (array of pointers) 
    2713      ! 
    2814      SELECT CASE ( jpni ) 
     
    3218      ! 
    3319      ipjm1 = ipj-1 
     20      ! 
     21      IF( c_NFtype == 'T' ) THEN            ! *  North fold  T-point pivot 
     22         ! 
     23         SELECT CASE ( cd_nat  ) 
     24         CASE ( 'T' , 'W' )                         ! T-, W-point 
     25            DO jh = 0, kextj 
     26               DO ji = 2, jpiglo 
     27                  ijt = jpiglo-ji+2 
     28                  ptab(ji,ipj+jh) = psgn * ptab(ijt,ipj-2-jh) 
     29               END DO 
     30               ptab(1,ipj+jh) = psgn * ptab(3,ipj-2-jh) 
     31            END DO 
     32            DO ji = jpiglo/2+1, jpiglo 
     33               ijt = jpiglo-ji+2 
     34               ptab(ji,ipjm1) = psgn * ptab(ijt,ipjm1) 
     35            END DO 
     36         CASE ( 'U' )                               ! U-point 
     37            DO jh = 0, kextj 
     38               DO ji = 2, jpiglo-1 
     39                  iju = jpiglo-ji+1 
     40                  ptab(ji,ipj+jh) = psgn * ptab(iju,ipj-2-jh) 
     41               END DO 
     42               ptab(   1  ,ipj+jh) = psgn * ptab(    2   ,ipj-2-jh) 
     43               ptab(jpiglo,ipj+jh) = psgn * ptab(jpiglo-1,ipj-2-jh)  
     44            END DO 
     45            DO ji = jpiglo/2, jpiglo-1 
     46               iju = jpiglo-ji+1 
     47               ptab(ji,ipjm1) = psgn * ptab(iju,ipjm1) 
     48            END DO 
     49         CASE ( 'V' )                               ! V-point 
     50            DO jh = 0, kextj 
     51               DO ji = 2, jpiglo 
     52                  ijt = jpiglo-ji+2 
     53                  ptab(ji,ipj-1+jh) = psgn * ptab(ijt,ipj-2-jh) 
     54                  ptab(ji,ipj+jh  ) = psgn * ptab(ijt,ipj-3-jh) 
     55               END DO 
     56               ptab(1,ipj+jh) = psgn * ptab(3,ipj-3-jh)  
     57            END DO 
     58         CASE ( 'F' )                               ! F-point 
     59            DO jh = 0, kextj 
     60               DO ji = 1, jpiglo-1 
     61                  iju = jpiglo-ji+1 
     62                  ptab(ji,ipj-1+jh) = psgn * ptab(iju,ipj-2-jh) 
     63                  ptab(ji,ipj+jh  ) = psgn * ptab(iju,ipj-3-jh) 
     64               END DO 
     65            END DO 
     66            DO jh = 0, kextj 
     67               ptab(   1  ,ipj+jh) = psgn * ptab(    2   ,ipj-3-jh) 
     68               ptab(jpiglo,ipj+jh) = psgn * ptab(jpiglo-1,ipj-3-jh) 
     69            END DO 
     70         END SELECT 
     71         ! 
     72      ENDIF   ! c_NFtype == 'T' 
     73      ! 
     74      IF( c_NFtype == 'F' ) THEN            ! *  North fold  F-point pivot 
     75         ! 
     76         SELECT CASE ( cd_nat  ) 
     77         CASE ( 'T' , 'W' )                         ! T-, W-point 
     78            DO jh = 0, kextj 
     79               DO ji = 1, jpiglo 
     80                  ijt = jpiglo-ji+1 
     81                  ptab(ji,ipj+jh) = psgn * ptab(ijt,ipj-1-jh) 
     82               END DO 
     83            END DO 
     84         CASE ( 'U' )                               ! U-point 
     85            DO jh = 0, kextj 
     86               DO ji = 1, jpiglo-1 
     87                  iju = jpiglo-ji 
     88                  ptab(ji,ipj+jh) = psgn * ptab(iju,ipj-1-jh) 
     89               END DO 
     90               ptab(jpiglo,ipj+jh) = psgn * ptab(jpiglo-2,ipj-1-jh) 
     91            END DO 
     92         CASE ( 'V' )                               ! V-point 
     93            DO jh = 0, kextj 
     94               DO ji = 1, jpiglo 
     95                  ijt = jpiglo-ji+1 
     96                  ptab(ji,ipj+jh) = psgn * ptab(ijt,ipj-2-jh) 
     97               END DO 
     98            END DO 
     99            DO ji = jpiglo/2+1, jpiglo 
     100               ijt = jpiglo-ji+1 
     101               ptab(ji,ipjm1) = psgn * ptab(ijt,ipjm1) 
     102            END DO 
     103         CASE ( 'F' )                               ! F-point 
     104            DO jh = 0, kextj 
     105               DO ji = 1, jpiglo-1 
     106                  iju = jpiglo-ji 
     107                  ptab(ji,ipj+jh  ) = psgn * ptab(iju,ipj-2-jh) 
     108               END DO 
     109               ptab(jpiglo,ipj+jh) = psgn * ptab(jpiglo-2,ipj-2-jh) 
     110            END DO 
     111            DO ji = jpiglo/2+1, jpiglo-1 
     112               iju = jpiglo-ji 
     113               ptab(ji,ipjm1) = psgn * ptab(iju,ipjm1) 
     114            END DO 
     115         END SELECT 
     116         ! 
     117      ENDIF   ! c_NFtype == 'F' 
     118      ! 
     119   END SUBROUTINE lbc_nfd_ext_/**/PRECISION 
    34120 
    35       ! 
    36       DO jf = 1, ipf                      ! Loop on the number of arrays to be treated 
    37          ! 
    38          IF( c_NFtype == 'T' ) THEN            ! *  North fold  T-point pivot 
    39             ! 
    40             SELECT CASE ( cd_nat  ) 
    41             CASE ( 'T' , 'W' )                         ! T-, W-point 
    42                DO jh = 0, kextj 
    43                   DO ji = 2, jpiglo 
    44                      ijt = jpiglo-ji+2 
    45                      ARRAY_IN(ji,ipj+jh,:,:,jf) = psgn * ARRAY_IN(ijt,ipj-2-jh,:,:,jf) 
    46                   END DO 
    47                   ARRAY_IN(1,ipj+jh,:,:,jf) = psgn * ARRAY_IN(3,ipj-2-jh,:,:,jf) 
    48                END DO 
    49                DO ji = jpiglo/2+1, jpiglo 
    50                   ijt = jpiglo-ji+2 
    51                   ARRAY_IN(ji,ipjm1,:,:,jf) = psgn * ARRAY_IN(ijt,ipjm1,:,:,jf) 
    52                END DO 
    53             CASE ( 'U' )                               ! U-point 
    54                DO jh = 0, kextj 
    55                   DO ji = 2, jpiglo-1 
    56                      iju = jpiglo-ji+1 
    57                      ARRAY_IN(ji,ipj+jh,:,:,jf) = psgn * ARRAY_IN(iju,ipj-2-jh,:,:,jf) 
    58                   END DO 
    59                  ARRAY_IN(   1  ,ipj+jh,:,:,jf) = psgn * ARRAY_IN(    2   ,ipj-2-jh,:,:,jf) 
    60                  ARRAY_IN(jpiglo,ipj+jh,:,:,jf) = psgn * ARRAY_IN(jpiglo-1,ipj-2-jh,:,:,jf)  
    61                END DO 
    62                DO ji = jpiglo/2, jpiglo-1 
    63                   iju = jpiglo-ji+1 
    64                   ARRAY_IN(ji,ipjm1,:,:,jf) = psgn * ARRAY_IN(iju,ipjm1,:,:,jf) 
    65                END DO 
    66             CASE ( 'V' )                               ! V-point 
    67                DO jh = 0, kextj 
    68                   DO ji = 2, jpiglo 
    69                      ijt = jpiglo-ji+2 
    70                      ARRAY_IN(ji,ipj-1+jh,:,:,jf) = psgn * ARRAY_IN(ijt,ipj-2-jh,:,:,jf) 
    71                      ARRAY_IN(ji,ipj+jh  ,:,:,jf) = psgn * ARRAY_IN(ijt,ipj-3-jh,:,:,jf) 
    72                   END DO 
    73                   ARRAY_IN(1,ipj+jh,:,:,jf) = psgn * ARRAY_IN(3,ipj-3-jh,:,:,jf)  
    74                END DO 
    75             CASE ( 'F' )                               ! F-point 
    76                DO jh = 0, kextj 
    77                   DO ji = 1, jpiglo-1 
    78                      iju = jpiglo-ji+1 
    79                      ARRAY_IN(ji,ipj-1+jh,:,:,jf) = psgn * ARRAY_IN(iju,ipj-2-jh,:,:,jf) 
    80                      ARRAY_IN(ji,ipj+jh  ,:,:,jf) = psgn * ARRAY_IN(iju,ipj-3-jh,:,:,jf) 
    81                   END DO 
    82                END DO 
    83                DO jh = 0, kextj 
    84                   ARRAY_IN(   1  ,ipj+jh,:,:,jf) = psgn * ARRAY_IN(    2   ,ipj-3-jh,:,:,jf) 
    85                   ARRAY_IN(jpiglo,ipj+jh,:,:,jf) = psgn * ARRAY_IN(jpiglo-1,ipj-3-jh,:,:,jf) 
    86                END DO 
    87             END SELECT 
    88             ! 
    89          ENDIF   ! c_NFtype == 'T' 
    90          ! 
    91          IF( c_NFtype == 'F' ) THEN            ! *  North fold  F-point pivot 
    92             ! 
    93             SELECT CASE ( cd_nat  ) 
    94             CASE ( 'T' , 'W' )                         ! T-, W-point 
    95                DO jh = 0, kextj 
    96                   DO ji = 1, jpiglo 
    97                      ijt = jpiglo-ji+1 
    98                      ARRAY_IN(ji,ipj+jh,:,:,jf) = psgn * ARRAY_IN(ijt,ipj-1-jh,:,:,jf) 
    99                   END DO 
    100                END DO 
    101             CASE ( 'U' )                               ! U-point 
    102                DO jh = 0, kextj 
    103                   DO ji = 1, jpiglo-1 
    104                      iju = jpiglo-ji 
    105                      ARRAY_IN(ji,ipj+jh,:,:,jf) = psgn * ARRAY_IN(iju,ipj-1-jh,:,:,jf) 
    106                   END DO 
    107                   ARRAY_IN(jpiglo,ipj+jh,:,:,jf) = psgn * ARRAY_IN(jpiglo-2,ipj-1-jh,:,:,jf) 
    108                END DO 
    109             CASE ( 'V' )                               ! V-point 
    110                DO jh = 0, kextj 
    111                   DO ji = 1, jpiglo 
    112                      ijt = jpiglo-ji+1 
    113                      ARRAY_IN(ji,ipj+jh,:,:,jf) = psgn * ARRAY_IN(ijt,ipj-2-jh,:,:,jf) 
    114                   END DO 
    115                END DO 
    116                DO ji = jpiglo/2+1, jpiglo 
    117                   ijt = jpiglo-ji+1 
    118                   ARRAY_IN(ji,ipjm1,:,:,jf) = psgn * ARRAY_IN(ijt,ipjm1,:,:,jf) 
    119                END DO 
    120             CASE ( 'F' )                               ! F-point 
    121                DO jh = 0, kextj 
    122                   DO ji = 1, jpiglo-1 
    123                      iju = jpiglo-ji 
    124                      ARRAY_IN(ji,ipj+jh  ,:,:,jf) = psgn * ARRAY_IN(iju,ipj-2-jh,:,:,jf) 
    125                   END DO 
    126                   ARRAY_IN(jpiglo,ipj+jh,:,:,jf) = psgn * ARRAY_IN(jpiglo-2,ipj-2-jh,:,:,jf) 
    127                END DO 
    128                DO ji = jpiglo/2+1, jpiglo-1 
    129                   iju = jpiglo-ji 
    130                   ARRAY_IN(ji,ipjm1,:,:,jf) = psgn * ARRAY_IN(iju,ipjm1,:,:,jf) 
    131                END DO 
    132             END SELECT 
    133             ! 
    134          ENDIF   ! c_NFtype == 'F' 
    135          ! 
    136       END DO 
    137       ! 
    138    END SUBROUTINE lbc_nfd_ext_/**/XD/**/_/**/PRECISION 
    139  
    140 #undef XD 
    141 #undef ARRAY_IN 
    142 #undef K_SIZE 
    143 #undef L_SIZE 
    144 #undef F_SIZE 
  • NEMO/branches/2021/dev_r14312_MPI_Interface/src/OCE/LBC/lbc_nfd_generic.h90

    r14338 r14349  
    1 #if defined DIM_2d 
    2 #   define XD                       2d 
    3 #   define ARRAY_IN(i,j,k,l,f)      ptab(f)%pt2d(i,j) 
    4 #   define J_SIZE(ptab)             SIZE(ptab(1)%pt2d,2) 
    5 #   define K_SIZE(ptab)             1 
    6 #   define L_SIZE(ptab)             1 
    7 #endif 
    8 #if defined DIM_3d 
    9 #   define XD                       3d 
    10 #   define ARRAY_IN(i,j,k,l,f)      ptab(f)%pt3d(i,j,k) 
    11 #   define J_SIZE(ptab)             SIZE(ptab(1)%pt3d,2) 
    12 #   define K_SIZE(ptab)             SIZE(ptab(1)%pt3d,3) 
    13 #   define L_SIZE(ptab)             1 
    14 #endif 
    15 #if defined DIM_4d 
    16 #   define XD                       4d 
    17 #   define ARRAY_IN(i,j,k,l,f)      ptab(f)%pt4d(i,j,k,l) 
    18 #   define J_SIZE(ptab)             SIZE(ptab(1)%pt4d,2) 
    19 #   define K_SIZE(ptab)             SIZE(ptab(1)%pt4d,3) 
    20 #   define L_SIZE(ptab)             SIZE(ptab(1)%pt4d,4) 
    21 #endif 
    22 #define    F_SIZE(ptab)             kfld 
    231 
    24    SUBROUTINE lbc_nfd_/**/XD/**/_/**/PRECISION( ptab, cd_nat, psgn, kfld ) 
    25       TYPE(PTR_/**/XD/**/_/**/PRECISION),  DIMENSION(:), INTENT(inout) ::   ptab        ! pointer of arrays on which apply the b.c. 
     2   SUBROUTINE lbc_nfd_/**/PRECISION( ptab, cd_nat, psgn, kfld ) 
     3      TYPE(PTR_4d_/**/PRECISION),  DIMENSION(:), INTENT(inout) ::   ptab        ! pointer of arrays on which apply the b.c. 
    264      CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   cd_nat      ! nature of array grid-points 
    275      REAL(PRECISION),  DIMENSION(:), INTENT(in   ) ::   psgn        ! sign used across the north fold boundary 
     
    3311      !!---------------------------------------------------------------------- 
    3412      ! 
    35       ipj = J_SIZE(ptab)   ! 2nd dimension 
    36       ipk = K_SIZE(ptab)   ! 3rd    - 
    37       ipl = L_SIZE(ptab)   ! 4th    - 
    38       ipf = F_SIZE(ptab)   ! 5th    -      use in "multi" case (array of pointers) 
     13      ipj = SIZE(ptab(1)%pt4d,2) 
     14      ipk = SIZE(ptab(1)%pt4d,3) 
     15      ipl = SIZE(ptab(1)%pt4d,4) 
     16      ipf = kfld 
    3917      ! 
    4018      DO jf = 1, ipf                      ! Loop on the number of arrays to be treated 
     
    5432                        ii1 =                ji          ! ends at: nn_hls 
    5533                        ii2 = 2*nn_hls + 2 - ji          ! ends at: 2*nn_hls + 2 - nn_hls = nn_hls + 2 
    56                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     34                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    5735                     END DO 
    5836                     DO ji = 1, 1                 ! point nn_hls+1 
    5937                        ii1 = nn_hls + ji 
    6038                        ii2 = ii1 
    61                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     39                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    6240                     END DO 
    6341                     DO ji = 1, Ni0glo - 1        ! points from nn_hls+2 to jpiglo - nn_hls   (note: Ni0glo = jpiglo - 2*nn_hls) 
    6442                        ii1 = 2 + nn_hls      + ji - 1   ! ends at: 2 + nn_hls + jpiglo - 2*nn_hls - 1 - 1 = jpiglo - nn_hls 
    6543                        ii2 = jpiglo - nn_hls - ji + 1   ! ends at: jpiglo - nn_hls - ( jpiglo - 2*nn_hls - 1 ) + 1 = nn_hls + 2 
    66                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     44                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    6745                     END DO 
    6846                     DO ji = 1, 1                 ! point jpiglo - nn_hls + 1 
    6947                        ii1 = jpiglo - nn_hls + ji 
    7048                        ii2 =          nn_hls + ji 
    71                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     49                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    7250                     END DO 
    7351                     DO ji = 1, nn_hls-1          ! last nn_hls-1 points 
    7452                        ii1 = jpiglo - nn_hls + 1 + ji   ! ends at: jpiglo - nn_hls + 1 + nn_hls - 1 = jpiglo 
    7553                        ii2 = jpiglo - nn_hls + 1 - ji   ! ends at: jpiglo - nn_hls + 1 - nn_hls + 1 = jpiglo - 2*nn_hls + 2 
    76                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     54                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    7755                     END DO 
    7856                  END DO 
     
    8664                        ii1 = jpiglo/2 + ji + 1          ! ends at: jpiglo/2 + (jpiglo/2 - nn_hls - 1) + 1 = jpiglo - nn_hls 
    8765                        ii2 = jpiglo/2 - ji + 1          ! ends at: jpiglo/2 - (jpiglo/2 - nn_hls - 1) + 1 = nn_hls + 2 
    88                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     66                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    8967                     END DO 
    9068                     DO ji = 1, nn_hls            ! first nn_hls points: redo them just in case (if e-w periodocity already done) 
     
    9270                        ii1 =                ji          ! ends at: nn_hls 
    9371                        ii2 = 2*nn_hls + 2 - ji          ! ends at: 2*nn_hls + 2 - nn_hls = nn_hls + 2 
    94                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     72                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    9573                     END DO 
    9674                     !                            ! last nn_hls-1 points: have been / will done by e-w periodicity  
     
    10987                        ii1 =                ji          ! ends at: nn_hls 
    11088                        ii2 = 2*nn_hls + 1 - ji          ! ends at: 2*nn_hls + 1 - nn_hls = nn_hls + 1 
    111                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     89                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    11290                     END DO 
    11391                     DO ji = 1, Ni0glo            ! points from nn_hls to jpiglo - nn_hls   (note: Ni0glo = jpiglo - 2*nn_hls) 
    11492                        ii1 = nn_hls          + ji       ! ends at: nn_hls + jpiglo - 2*nn_hls = jpiglo - nn_hls 
    11593                        ii2 = jpiglo - nn_hls - ji + 1   ! ends at: jpiglo - nn_hls - ( jpiglo - 2*nn_hls ) + 1 = nn_hls + 1 
    116                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     94                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    11795                     END DO 
    11896                     DO ji = 1, nn_hls            ! last nn_hls points 
    11997                        ii1 = jpiglo - nn_hls + ji       ! ends at: jpiglo - nn_hls + nn_hls = jpiglo 
    12098                        ii2 = jpiglo - nn_hls + 1 - ji   ! ends at: jpiglo - nn_hls + 1 - nn_hls = jpiglo - 2*nn_hls + 1 
    121                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     99                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    122100                     END DO 
    123101                  END DO 
     
    131109                        ii1 = jpiglo/2 + ji              ! ends at: jpiglo/2 + (jpiglo/2 - nn_hls) = jpiglo - nn_hls 
    132110                        ii2 = jpiglo/2 - ji + 1          ! ends at: jpiglo/2 - (jpiglo/2 - nn_hls) + 1 = nn_hls + 1 
    133                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     111                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    134112                     END DO 
    135113                     DO ji = 1, nn_hls            ! first nn_hls points: redo them just in case (if e-w periodocity already done) 
     
    137115                        ii1 =                ji          ! ends at: nn_hls 
    138116                        ii2 = 2*nn_hls + 1 - ji          ! ends at: 2*nn_hls + 1 - nn_hls = nn_hls + 1 
    139                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     117                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    140118                     END DO 
    141119                     !                            ! last nn_hls-1 points: have been / will done by e-w periodicity  
     
    154132                        ii1 =                ji          ! ends at: nn_hls 
    155133                        ii2 = 2*nn_hls + 2 - ji          ! ends at: 2*nn_hls + 2 - nn_hls = nn_hls + 2 
    156                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     134                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    157135                     END DO 
    158136                     DO ji = 1, 1                 ! point nn_hls+1 
    159137                        ii1 = nn_hls + ji 
    160138                        ii2 = ii1 
    161                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     139                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    162140                     END DO 
    163141                     DO ji = 1, Ni0glo - 1        ! points from nn_hls+2 to jpiglo - nn_hls   (note: Ni0glo = jpiglo - 2*nn_hls) 
    164142                        ii1 = 2 + nn_hls      + ji - 1   ! ends at: 2 + nn_hls + jpiglo - 2*nn_hls - 1 - 1 = jpiglo - nn_hls 
    165143                        ii2 = jpiglo - nn_hls - ji + 1   ! ends at: jpiglo - nn_hls - ( jpiglo - 2*nn_hls - 1 ) + 1 = nn_hls + 2 
    166                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     144                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    167145                     END DO 
    168146                     DO ji = 1, 1                 ! point jpiglo - nn_hls + 1 
    169147                        ii1 = jpiglo - nn_hls + ji 
    170148                        ii2 =          nn_hls + ji 
    171                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     149                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    172150                     END DO 
    173151                     DO ji = 1, nn_hls-1          ! last nn_hls-1 points 
    174152                        ii1 = jpiglo - nn_hls + 1 + ji   ! ends at: jpiglo - nn_hls + 1 + nn_hls - 1 = jpiglo 
    175153                        ii2 = jpiglo - nn_hls + 1 - ji   ! ends at: jpiglo - nn_hls + 1 - nn_hls + 1 = jpiglo - 2*nn_hls + 2 
    176                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     154                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    177155                     END DO 
    178156                  END DO 
     
    190168                        ii1 =                ji          ! ends at: nn_hls 
    191169                        ii2 = 2*nn_hls + 1 - ji          ! ends at: 2*nn_hls + 1 - nn_hls = nn_hls + 1 
    192                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     170                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    193171                     END DO 
    194172                     DO ji = 1, Ni0glo            ! points from nn_hls to jpiglo - nn_hls   (note: Ni0glo = jpiglo - 2*nn_hls) 
    195173                        ii1 = nn_hls          + ji       ! ends at: nn_hls + jpiglo - 2*nn_hls = jpiglo - nn_hls 
    196174                        ii2 = jpiglo - nn_hls - ji + 1   ! ends at: jpiglo - nn_hls - ( jpiglo - 2*nn_hls ) + 1 = nn_hls + 1 
    197                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     175                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    198176                     END DO 
    199177                     DO ji = 1, nn_hls            ! last nn_hls points 
    200178                        ii1 = jpiglo - nn_hls + ji       ! ends at: jpiglo - nn_hls + nn_hls = jpiglo 
    201179                        ii2 = jpiglo - nn_hls + 1 - ji   ! ends at: jpiglo - nn_hls + 1 - nn_hls = jpiglo - 2*nn_hls + 1 
    202                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     180                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    203181                     END DO 
    204182                  END DO 
     
    223201                        ii1 = jpiglo/2 + ji 
    224202                        ii2 = jpiglo/2 - ji + 1 
    225                         ARRAY_IN(ii1,ij1,jk,jl,jf) =              ARRAY_IN(ii2,ij2,jk,jl,jf)   ! Warning: pb with sign... 
     203                        ptab(jf)%pt4d(ii1,ij1,jk,jl) =              ptab(jf)%pt4d(ii2,ij2,jk,jl)   ! Warning: pb with sign... 
    226204                     END DO 
    227205                     DO ji = 1, 1            ! points jpiglo - nn_hls 
    228206                        ii1 = jpiglo - nn_hls + ji - 1 
    229207                        ii2 =          nn_hls + ji 
    230                         ARRAY_IN(ii1,ij1,jk,jl,jf) =              ARRAY_IN(ii2,ij2,jk,jl,jf)   ! Warning: pb with sign... 
     208                        ptab(jf)%pt4d(ii1,ij1,jk,jl) =              ptab(jf)%pt4d(ii2,ij2,jk,jl)   ! Warning: pb with sign... 
    231209                     END DO 
    232210                     DO ji = 1, 1            ! point nn_hls: redo it just in case (if e-w periodocity already done) 
     
    234212                        ii1 = nn_hls + ji - 1 
    235213                        ii2 = nn_hls + ji 
    236                         ARRAY_IN(ii1,ij1,jk,jl,jf) =              ARRAY_IN(ii2,ij2,jk,jl,jf)   ! Warning: pb with sign... 
     214                        ptab(jf)%pt4d(ii1,ij1,jk,jl) =              ptab(jf)%pt4d(ii2,ij2,jk,jl)   ! Warning: pb with sign... 
    237215                     END DO 
    238216                  END DO 
     
    246224                        ii1 =                ji          ! ends at: nn_hls 
    247225                        ii2 = 2*nn_hls + 1 - ji          ! ends at: 2*nn_hls + 1 - nn_hls = nn_hls + 1 
    248                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     226                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    249227                     END DO 
    250228                     DO ji = 1, Ni0glo            ! points from nn_hls to jpiglo - nn_hls   (note: Ni0glo = jpiglo - 2*nn_hls) 
    251229                        ii1 = nn_hls          + ji       ! ends at: nn_hls + jpiglo - 2*nn_hls = jpiglo - nn_hls 
    252230                        ii2 = jpiglo - nn_hls - ji + 1   ! ends at: jpiglo - nn_hls - ( jpiglo - 2*nn_hls ) + 1 = nn_hls + 1 
    253                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     231                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    254232                     END DO 
    255233                     DO ji = 1, nn_hls            ! last nn_hls points 
    256234                        ii1 = jpiglo - nn_hls + ji       ! ends at: jpiglo - nn_hls + nn_hls = jpiglo 
    257235                        ii2 = jpiglo - nn_hls + 1 - ji   ! ends at: jpiglo - nn_hls + 1 - nn_hls = jpiglo - 2*nn_hls + 1 
    258                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     236                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    259237                     END DO 
    260238                  END DO 
     
    272250                        ii1 =            ji              ! ends at: nn_hls-1 
    273251                        ii2 = 2*nn_hls - ji              ! ends at: 2*nn_hls - ( nn_hls - 1 ) = nn_hls + 1 
    274                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     252                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    275253                     END DO 
    276254                     DO ji = 1, 1                 ! point nn_hls 
    277255                        ii1 = nn_hls + ji - 1 
    278256                        ii2 = jpiglo - ii1 
    279                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     257                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    280258                     END DO 
    281259                     DO ji = 1, Ni0glo - 1        ! points from nn_hls+1 to jpiglo - nn_hls - 1  (note: Ni0glo = jpiglo - 2*nn_hls) 
    282260                        ii1 =          nn_hls + ji       ! ends at: nn_hls + ( jpiglo - 2*nn_hls - 1 ) = jpiglo - nn_hls - 1 
    283261                        ii2 = jpiglo - nn_hls - ji       ! ends at: jpiglo - nn_hls - ( jpiglo - 2*nn_hls - 1 ) = nn_hls + 1 
    284                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     262                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    285263                     END DO 
    286264                     DO ji = 1, 1                 ! point jpiglo - nn_hls 
    287265                        ii1 = jpiglo - nn_hls + ji - 1 
    288266                        ii2 = ii1 
    289                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     267                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    290268                     END DO 
    291269                     DO ji = 1, nn_hls            ! last nn_hls points 
    292270                        ii1 = jpiglo - nn_hls + ji       ! ends at: jpiglo - nn_hls + nn_hls = jpiglo 
    293271                        ii2 = jpiglo - nn_hls - ji       ! ends at: jpiglo - nn_hls - nn_hls = jpiglo - 2*nn_hls 
    294                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     272                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    295273                     END DO 
    296274                  END DO 
     
    308286                        ii1 =                ji          ! ends at: nn_hls 
    309287                        ii2 = 2*nn_hls + 1 - ji          ! ends at: 2*nn_hls + 1 - nn_hls = nn_hls + 1 
    310                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     288                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    311289                     END DO 
    312290                     DO ji = 1, Ni0glo            ! points from nn_hls to jpiglo - nn_hls   (note: Ni0glo = jpiglo - 2*nn_hls) 
    313291                        ii1 = nn_hls          + ji       ! ends at: nn_hls + jpiglo - 2*nn_hls = jpiglo - nn_hls 
    314292                        ii2 = jpiglo - nn_hls - ji + 1   ! ends at: jpiglo - nn_hls - ( jpiglo - 2*nn_hls ) + 1 = nn_hls + 1 
    315                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     293                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    316294                     END DO 
    317295                     DO ji = 1, nn_hls            ! last nn_hls points 
    318296                        ii1 = jpiglo - nn_hls + ji       ! ends at: jpiglo - nn_hls + nn_hls = jpiglo 
    319297                        ii2 = jpiglo - nn_hls + 1 - ji   ! ends at: jpiglo - nn_hls + 1 - nn_hls = jpiglo - 2*nn_hls + 1 
    320                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     298                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    321299                     END DO 
    322300                  END DO    
     
    330308                        ii1 = jpiglo/2 + ji              ! ends at: jpiglo/2 + (jpiglo/2 - nn_hls) = jpiglo - nn_hls 
    331309                        ii2 = jpiglo/2 - ji + 1          ! ends at: jpiglo/2 - (jpiglo/2 - nn_hls) + 1 = nn_hls + 1 
    332                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     310                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    333311                     END DO 
    334312                     DO ji = 1, nn_hls            ! first nn_hls points: redo them just in case (if e-w periodocity already done) 
     
    336314                        ii1 =                ji          ! ends at: nn_hls 
    337315                        ii2 = 2*nn_hls + 1 - ji          ! ends at: 2*nn_hls + 1 - nn_hls = nn_hls + 1 
    338                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     316                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    339317                     END DO 
    340318                     !                            ! last nn_hls points: have been / will done by e-w periodicity  
     
    353331                        ii1 =            ji              ! ends at: nn_hls-1 
    354332                        ii2 = 2*nn_hls - ji              ! ends at: 2*nn_hls - ( nn_hls - 1 ) = nn_hls + 1 
    355                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     333                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    356334                     END DO 
    357335                     DO ji = 1, 1                 ! point nn_hls 
    358336                        ii1 = nn_hls + ji - 1 
    359337                        ii2 = jpiglo - ii1 
    360                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     338                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    361339                     END DO 
    362340                     DO ji = 1, Ni0glo - 1        ! points from nn_hls+1 to jpiglo - nn_hls - 1  (note: Ni0glo = jpiglo - 2*nn_hls) 
    363341                        ii1 =          nn_hls + ji       ! ends at: nn_hls + ( jpiglo - 2*nn_hls - 1 ) = jpiglo - nn_hls - 1 
    364342                        ii2 = jpiglo - nn_hls - ji       ! ends at: jpiglo - nn_hls - ( jpiglo - 2*nn_hls - 1 ) = nn_hls + 1 
    365                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     343                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    366344                     END DO 
    367345                     DO ji = 1, 1                 ! point jpiglo - nn_hls 
    368346                        ii1 = jpiglo - nn_hls + ji - 1 
    369347                        ii2 = ii1 
    370                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     348                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    371349                     END DO 
    372350                     DO ji = 1, nn_hls            ! last nn_hls points 
    373351                        ii1 = jpiglo - nn_hls + ji       ! ends at: jpiglo - nn_hls + nn_hls = jpiglo 
    374352                        ii2 = jpiglo - nn_hls - ji       ! ends at: jpiglo - nn_hls - nn_hls = jpiglo - 2*nn_hls 
    375                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     353                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    376354                     END DO 
    377355                  END DO    
     
    385363                        ii1 = jpiglo/2 + ji              ! ends at: jpiglo/2 + (jpiglo/2 - nn_hls) = jpiglo - nn_hls 
    386364                        ii2 = jpiglo/2 - ji              ! ends at: jpiglo/2 - (jpiglo/2 - nn_hls - 1 ) = nn_hls + 1 
    387                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     365                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    388366                     END DO 
    389367                     DO ji = 1, nn_hls-1          ! first nn_hls-1 points: redo them just in case (if e-w periodocity already done) 
     
    391369                        ii1 =            ji              ! ends at: nn_hls 
    392370                        ii2 = 2*nn_hls - ji              ! ends at: 2*nn_hls - ( nn_hls - 1 ) = nn_hls + 1 
    393                         ARRAY_IN(ii1,ij1,jk,jl,jf) = psgn(jf) * ARRAY_IN(ii2,ij2,jk,jl,jf) 
     371                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    394372                     END DO 
    395373                     !                            ! last nn_hls points: have been / will done by e-w periodicity  
     
    403381      END DO   ! ipf 
    404382      ! 
    405    END SUBROUTINE lbc_nfd_/**/XD/**/_/**/PRECISION 
     383   END SUBROUTINE lbc_nfd_/**/PRECISION 
    406384 
    407 #undef XD 
    408 #undef ARRAY_IN 
    409 #undef J_SIZE 
    410 #undef K_SIZE 
    411 #undef L_SIZE 
    412 #undef F_SIZE 
  • NEMO/branches/2021/dev_r14312_MPI_Interface/src/OCE/LBC/lbc_nfd_nogather_generic.h90

    r14343 r14349  
    1 #if defined DIM_2d 
    2 #   define XD                       2d 
    3 #   define DIMS_IN                  :,: 
    4 #   define ARRAY_IN(i,j,k,l)        ptab(i,j) 
    5 #   define K_SIZE(ptab)             1 
    6 #   define L_SIZE(ptab)             1 
    7 #endif 
    8 #if defined DIM_3d 
    9 #   define XD                       3d 
    10 #   define DIMS_IN                  :,:,: 
    11 #   define ARRAY_IN(i,j,k,l)        ptab(i,j,k) 
    12 #   define K_SIZE(ptab)             SIZE(ptab,3) 
    13 #   define L_SIZE(ptab)             1 
    14 #endif 
    15 #if defined DIM_4d 
    16 #   define XD                       4d 
    17 #   define DIMS_IN                  :,:,:,: 
    18 #   define ARRAY_IN(i,j,k,l)        ptab(i,j,k,l) 
    19 #   define K_SIZE(ptab)             SIZE(ptab,3) 
    20 #   define L_SIZE(ptab)             SIZE(ptab,4) 
    21 #endif 
    221 
    23    SUBROUTINE lbc_nfd_nogather_/**/XD/**/_/**/PRECISION( ptab, ptab2, cd_nat, psgn ) 
     2   SUBROUTINE lbc_nfd_nogather_/**/PRECISION( ptab, ptab2, cd_nat, psgn ) 
    243      !!---------------------------------------------------------------------- 
    254      !! 
     
    287      !! 
    298      !!---------------------------------------------------------------------- 
    30       REAL(PRECISION),  DIMENSION(DIMS_IN), INTENT(inout) :: ptab          !  
    31       REAL(PRECISION),  DIMENSION(:,:,:,:), INTENT(inout) :: ptab2          !  
    32       CHARACTER(len=1), INTENT(in   ) ::   cd_nat      ! nature of array grid-points 
    33       REAL(PRECISION), INTENT(in   ) ::   psgn        ! sign used across the north fold boundary 
     9      REAL(PRECISION),  DIMENSION(:,:,:,:), INTENT(inout) ::   ptab        !  
     10      REAL(PRECISION),  DIMENSION(:,:,:,:), INTENT(inout) ::   ptab2       !  
     11      CHARACTER(len=1)                    , INTENT(in   ) ::   cd_nat      ! nature of array grid-points 
     12      REAL(PRECISION)                     , INTENT(in   ) ::   psgn        ! sign used across the north fold boundary 
    3413      ! 
    3514      INTEGER  ::    ji,  jj, jk,  jn,  jl, jh       ! dummy loop indices 
     
    3817      LOGICAL  ::   l_fast_exchanges 
    3918      !!---------------------------------------------------------------------- 
    40       ipk = K_SIZE(ptab)   ! 3rd dimension of output array 
    41       ipl = L_SIZE(ptab)   ! 4th    - 
     19      ipk = SIZE(ptab,3) 
     20      ipl = SIZE(ptab,4) 
    4221      ! 
    4322      ! 2nd dimension determines exchange speed 
    4423      l_fast_exchanges = SIZE(ptab2,2) == 1 
     24      ! 
     25      IF( c_NFtype == 'T' ) THEN          ! *  North fold  T-point pivot 
    4526         ! 
    46          IF( c_NFtype == 'T' ) THEN          ! *  North fold  T-point pivot 
    47             ! 
    48             SELECT CASE ( cd_nat ) 
    49             ! 
    50             CASE ( 'T' , 'W' )                         ! T-, W-point 
    51                IF ( nimpp /= 1 ) THEN  ;  startloop = 1  
    52                ELSE                    ;  startloop = 1 + nn_hls 
    53                ENDIF 
    54                ! 
    55                DO jl = 1, ipl; DO jk = 1, ipk 
    56                     DO jj = 1, nn_hls 
    57                        ijj = jpj -jj +1 
     27         SELECT CASE ( cd_nat ) 
     28            ! 
     29         CASE ( 'T' , 'W' )                         ! T-, W-point 
     30            IF ( nimpp /= 1 ) THEN  ;  startloop = 1  
     31            ELSE                    ;  startloop = 1 + nn_hls 
     32            ENDIF 
     33            ! 
     34            DO jl = 1, ipl; DO jk = 1, ipk 
     35               DO jj = 1, nn_hls 
     36                  ijj = jpj -jj +1 
     37                  DO ji = startloop, jpi 
     38                     ijt = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 4 
     39                     ptab(ji,ijj,jk,jl) = psgn * ptab2(ijt,jj,jk,jl) 
     40                  END DO 
     41               END DO 
     42            END DO; END DO 
     43            IF( nimpp == 1 ) THEN 
     44               DO jl = 1, ipl; DO jk = 1, ipk 
     45                  DO jj = 1, nn_hls 
     46                     ijj = jpj -jj +1 
     47                     DO ii = 0, nn_hls-1 
     48                        ptab(ii+1,ijj,jk,jl) = psgn * ptab(2*nn_hls-ii+1,jpj-2*nn_hls+jj-1,jk,jl) 
     49                     END DO 
     50                  END DO 
     51               END DO; END DO 
     52            ENDIF 
     53            ! 
     54            IF ( .NOT. l_fast_exchanges ) THEN 
     55               IF( nimpp >= Ni0glo/2+2 ) THEN 
     56                  startloop = 1 
     57               ELSEIF( nimpp+jpi-1 >= Ni0glo/2+2 .AND. nimpp < Ni0glo/2+2 ) THEN 
     58                  startloop = Ni0glo/2+2 - nimpp + nn_hls 
     59               ELSE 
     60                  startloop = jpi + 1 
     61               ENDIF 
     62               IF( startloop <= jpi ) THEN 
     63                  DO jl = 1, ipl; DO jk = 1, ipk 
    5864                     DO ji = startloop, jpi 
    59                      ijt = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 4 
    60                         ARRAY_IN(ji,ijj,jk,jl) = psgn * ptab2(ijt,jj,jk,jl) 
    61                      END DO 
    62                   END DO 
    63                END DO; END DO 
    64                IF( nimpp == 1 ) THEN 
    65                   DO jl = 1, ipl; DO jk = 1, ipk 
    66                      DO jj = 1, nn_hls 
    67                      ijj = jpj -jj +1 
    68                      DO ii = 0, nn_hls-1 
    69                         ARRAY_IN(ii+1,ijj,jk,jl) = psgn * ARRAY_IN(2*nn_hls-ii+1,jpj-2*nn_hls+jj-1,jk,jl) 
    70                      END DO 
     65                        ijt  = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 4 
     66                        jia  = ji + nimpp - 1 
     67                        ijta = jpiglo - jia + 2 
     68                        IF( ijta >= startloop+nimpp-1 .AND. ijta < jia ) THEN 
     69                           ptab(ji,jpj-nn_hls,jk,jl) = psgn * ptab(ijta-nimpp+nn_hls,jpj-nn_hls,jk,jl) 
     70                        ELSE 
     71                           ptab(ji,jpj-nn_hls,jk,jl) = psgn * ptab2(ijt,nn_hls+1,jk,jl) 
     72                        ENDIF 
    7173                     END DO 
    7274                  END DO; END DO 
    73                ENDIF               
    74                ! 
    75                IF ( .NOT. l_fast_exchanges ) THEN 
    76                   IF( nimpp >= Ni0glo/2+2 ) THEN 
    77                      startloop = 1 
    78                   ELSEIF( nimpp+jpi-1 >= Ni0glo/2+2 .AND. nimpp < Ni0glo/2+2 ) THEN 
    79                      startloop = Ni0glo/2+2 - nimpp + nn_hls 
    80                   ELSE 
    81                      startloop = jpi + 1 
    82                   ENDIF 
    83                   IF( startloop <= jpi ) THEN 
    84                      DO jl = 1, ipl; DO jk = 1, ipk 
    85                         DO ji = startloop, jpi 
    86                            ijt  = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 4 
    87                            jia  = ji + nimpp - 1 
    88                            ijta = jpiglo - jia + 2 
    89                            IF( ijta >= startloop+nimpp-1 .AND. ijta < jia ) THEN 
    90                               ARRAY_IN(ji,jpj-nn_hls,jk,jl) = psgn * ARRAY_IN(ijta-nimpp+nn_hls,jpj-nn_hls,jk,jl) 
    91                            ELSE 
    92                               ARRAY_IN(ji,jpj-nn_hls,jk,jl) = psgn * ptab2(ijt,nn_hls+1,jk,jl) 
    93                            ENDIF 
    94                         END DO 
    95                      END DO; END DO 
    96                   ENDIF 
    97                ENDIF 
    98             CASE ( 'U' )                                     ! U-point 
     75               ENDIF 
     76            ENDIF 
     77         CASE ( 'U' )                                     ! U-point 
     78            IF( nimpp + jpi - 1 /= jpiglo ) THEN 
     79               endloop = jpi 
     80            ELSE 
     81               endloop = jpi - nn_hls 
     82            ENDIF 
     83            DO jl = 1, ipl; DO jk = 1, ipk 
     84               DO jj = 1, nn_hls 
     85                  ijj = jpj -jj +1 
     86                  DO ji = 1, endloop 
     87                     iju = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 3 
     88                     ptab(ji,ijj,jk,jl) = psgn * ptab2(iju,jj,jk,jl) 
     89                  END DO 
     90               END DO 
     91            END DO; END DO 
     92            IF (nimpp .eq. 1) THEN 
     93               DO jj = 1, nn_hls 
     94                  ijj = jpj -jj +1 
     95                  DO ii = 0, nn_hls-1 
     96                     ptab(ii+1,ijj,:,:) = psgn * ptab(2*nn_hls-ii,jpj-2*nn_hls+jj-1,:,:) 
     97                  END DO 
     98               END DO 
     99            ENDIF 
     100            IF((nimpp + jpi - 1) .eq. jpiglo) THEN 
     101               DO jj = 1, nn_hls 
     102                  ijj = jpj -jj +1 
     103                  DO ii = 1, nn_hls 
     104                     ptab(jpi-ii+1,ijj,:,:) = psgn * ptab(jpi-2*nn_hls+ii,jpj-2*nn_hls+jj-1,:,:) 
     105                  END DO 
     106               END DO 
     107            ENDIF 
     108            ! 
     109            IF ( .NOT. l_fast_exchanges ) THEN 
    99110               IF( nimpp + jpi - 1 /= jpiglo ) THEN 
    100111                  endloop = jpi 
     
    102113                  endloop = jpi - nn_hls 
    103114               ENDIF 
    104                DO jl = 1, ipl; DO jk = 1, ipk 
    105         DO jj = 1, nn_hls 
    106               ijj = jpj -jj +1 
    107                      DO ji = 1, endloop 
    108                         iju = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 3 
    109                         ARRAY_IN(ji,ijj,jk,jl) = psgn * ptab2(iju,jj,jk,jl) 
    110                      END DO 
    111                   END DO 
    112                END DO; END DO 
    113                IF (nimpp .eq. 1) THEN 
    114         DO jj = 1, nn_hls 
    115            ijj = jpj -jj +1 
    116            DO ii = 0, nn_hls-1 
    117          ARRAY_IN(ii+1,ijj,:,:) = psgn * ARRAY_IN(2*nn_hls-ii,jpj-2*nn_hls+jj-1,:,:) 
    118            END DO 
    119                   END DO 
    120                ENDIF 
    121                IF((nimpp + jpi - 1) .eq. jpiglo) THEN 
    122                   DO jj = 1, nn_hls 
    123                        ijj = jpj -jj +1 
    124          DO ii = 1, nn_hls 
    125                ARRAY_IN(jpi-ii+1,ijj,:,:) = psgn * ARRAY_IN(jpi-2*nn_hls+ii,jpj-2*nn_hls+jj-1,:,:) 
    126          END DO 
    127         END DO 
    128                ENDIF 
    129                ! 
    130                IF ( .NOT. l_fast_exchanges ) THEN 
    131                   IF( nimpp + jpi - 1 /= jpiglo ) THEN 
    132                      endloop = jpi 
    133                   ELSE 
    134                      endloop = jpi - nn_hls 
    135                   ENDIF 
    136                   IF( nimpp >= Ni0glo/2+1 ) THEN 
    137                      startloop = nn_hls 
    138                   ELSEIF( ( nimpp + jpi - 1 >= Ni0glo/2+1 ) .AND. ( nimpp < Ni0glo/2+1 ) ) THEN 
    139                      startloop = Ni0glo/2+1 - nimpp + nn_hls  
    140                   ELSE 
    141                      startloop = endloop + 1 
    142                   ENDIF 
    143                   IF( startloop <= endloop ) THEN 
     115               IF( nimpp >= Ni0glo/2+1 ) THEN 
     116                  startloop = nn_hls 
     117               ELSEIF( ( nimpp + jpi - 1 >= Ni0glo/2+1 ) .AND. ( nimpp < Ni0glo/2+1 ) ) THEN 
     118                  startloop = Ni0glo/2+1 - nimpp + nn_hls  
     119               ELSE 
     120                  startloop = endloop + 1 
     121               ENDIF 
     122               IF( startloop <= endloop ) THEN 
    144123                  DO jl = 1, ipl; DO jk = 1, ipk 
    145124                     DO ji = startloop, endloop 
     
    148127                        ijua = jpiglo - jia + 1  
    149128                        IF( ijua >= startloop+nimpp-1 .AND. ijua < jia ) THEN 
    150                            ARRAY_IN(ji,jpj-nn_hls,jk,jl) = psgn * ARRAY_IN(ijua-nimpp+1,jpj-nn_hls,jk,jl) 
     129                           ptab(ji,jpj-nn_hls,jk,jl) = psgn * ptab(ijua-nimpp+1,jpj-nn_hls,jk,jl) 
    151130                        ELSE 
    152                            ARRAY_IN(ji,jpj-nn_hls,jk,jl) = psgn * ptab2(iju,nn_hls+1,jk,jl) 
     131                           ptab(ji,jpj-nn_hls,jk,jl) = psgn * ptab2(iju,nn_hls+1,jk,jl) 
    153132                        ENDIF 
    154133                     END DO 
    155134                  END DO; END DO 
    156                   ENDIF 
    157                ENDIF 
    158                ! 
    159             CASE ( 'V' )                                     ! V-point 
    160                IF( nimpp /= 1 ) THEN 
    161                  startloop = 1  
    162                ELSE 
    163                  startloop = 1 + nn_hls 
    164                ENDIF 
     135               ENDIF 
     136            ENDIF 
     137            ! 
     138         CASE ( 'V' )                                     ! V-point 
     139            IF( nimpp /= 1 ) THEN 
     140               startloop = 1  
     141            ELSE 
     142               startloop = 1 + nn_hls 
     143            ENDIF 
     144            IF ( .NOT. l_fast_exchanges ) THEN 
     145               DO jl = 1, ipl; DO jk = 1, ipk 
     146                  DO jj = 2, nn_hls+1 
     147                     ijj = jpj -jj +1 
     148                     DO ji = startloop, jpi 
     149                        ijt=jpiglo - ji - nimpp - nfimpp(isendto(1)) + 4 
     150                        ptab(ji,ijj,jk,jl) = psgn * ptab2(ijt,jj,jk,jl) 
     151                     END DO 
     152                  END DO 
     153               END DO; END DO 
     154            ENDIF 
     155            DO jl = 1, ipl; DO jk = 1, ipk 
     156               DO ji = startloop, jpi 
     157                  ijt=jpiglo - ji - nimpp - nfimpp(isendto(1)) + 4 
     158                  ptab(ji,jpj,jk,jl) = psgn * ptab2(ijt,1,jk,jl) 
     159               END DO 
     160            END DO; END DO 
     161            IF (nimpp .eq. 1) THEN 
     162               DO jj = 1, nn_hls 
     163                  ijj = jpj-jj+1 
     164                  DO ii = 0, nn_hls-1 
     165                     ptab(ii+1,ijj,:,:) = psgn * ptab(2*nn_hls-ii+1,jpj-2*nn_hls+jj-1,:,:) 
     166                  END DO 
     167               END DO 
     168            ENDIF 
     169         CASE ( 'F' )                                     ! F-point 
     170            IF( nimpp + jpi - 1 /= jpiglo ) THEN 
     171               endloop = jpi 
     172            ELSE 
     173               endloop = jpi - nn_hls 
     174            ENDIF 
     175            IF ( .NOT. l_fast_exchanges ) THEN 
     176               DO jl = 1, ipl; DO jk = 1, ipk 
     177                  DO jj = 2, nn_hls+1 
     178                     ijj = jpj -jj +1 
     179                     DO ji = 1, endloop 
     180                        iju = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 3 
     181                        ptab(ji,ijj,jk,jl) = psgn * ptab2(iju,jj,jk,jl) 
     182                     END DO 
     183                  END DO 
     184               END DO; END DO 
     185            ENDIF 
     186            DO jl = 1, ipl; DO jk = 1, ipk 
     187               DO ji = 1, endloop 
     188                  iju = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 3 
     189                  ptab(ji,jpj,jk,jl) = psgn * ptab2(iju,1,jk,jl) 
     190               END DO 
     191            END DO; END DO 
     192            IF (nimpp .eq. 1) THEN                
     193               DO ii = 1, nn_hls 
     194                  ptab(ii,jpj,:,:) = psgn * ptab(2*nn_hls-ii,jpj-2*nn_hls-1,:,:) 
     195               END DO 
    165196               IF ( .NOT. l_fast_exchanges ) THEN 
     197                  DO jj = 1, nn_hls 
     198                     ijj = jpj -jj 
     199                     DO ii = 0, nn_hls-1 
     200                        ptab(ii+1,ijj,:,:) = psgn * ptab(2*nn_hls-ii,jpj-2*nn_hls+jj-1,:,:) 
     201                     END DO 
     202                  END DO 
     203               ENDIF 
     204            ENDIF 
     205            IF((nimpp + jpi - 1 ) .eq. jpiglo) THEN 
     206               DO ii = 1, nn_hls 
     207                  ptab(jpi-ii+1,jpj,:,:) = psgn * ptab(jpi-2*nn_hls+ii,jpj-2*nn_hls-1,:,:) 
     208               END DO 
     209               IF ( .NOT. l_fast_exchanges ) THEN 
     210                  DO jj = 1, nn_hls 
     211                     ijj = jpj -jj 
     212                     DO ii = 1, nn_hls 
     213                        ptab(jpi-ii+1,ijj,:,:) = psgn * ptab(jpi-2*nn_hls+ii,jpj-2*nn_hls+jj-1,:,:) 
     214                     END DO 
     215                  END DO 
     216               ENDIF 
     217            ENDIF 
     218            ! 
     219         END SELECT 
     220         ! 
     221      ENDIF   ! c_NFtype == 'T' 
     222      ! 
     223      IF( c_NFtype == 'F' ) THEN           ! *  North fold  F-point pivot 
     224         ! 
     225         SELECT CASE ( cd_nat ) 
     226         CASE ( 'T' , 'W' )                               ! T-, W-point 
     227            DO jl = 1, ipl; DO jk = 1, ipk 
     228               DO jj = 1, nn_hls 
     229                  ijj = jpj-jj+1 
     230                  DO ji = 1, jpi 
     231                     ijt = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 3 
     232                     ptab(ji,ijj,jk,jl) = psgn * ptab2(ijt,jj,jk,jl) 
     233                  END DO 
     234               END DO 
     235            END DO; END DO 
     236            ! 
     237         CASE ( 'U' )                                     ! U-point 
     238            IF( nimpp + jpi - 1 /= jpiglo ) THEN 
     239               endloop = jpi 
     240            ELSE 
     241               endloop = jpi - nn_hls 
     242            ENDIF 
     243            DO jl = 1, ipl; DO jk = 1, ipk 
     244               DO jj = 1, nn_hls 
     245                  ijj = jpj-jj+1 
     246                  DO ji = 1, endloop 
     247                     iju = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 2 
     248                     ptab(ji,ijj,jk,jl) = psgn * ptab2(iju,jj,jk,jl) 
     249                  END DO 
     250               END DO 
     251            END DO; END DO 
     252            IF(nimpp + jpi - 1 .eq. jpiglo) THEN 
     253               DO jl = 1, ipl; DO jk = 1, ipk 
     254                  DO jj = 1, nn_hls 
     255                     ijj = jpj-jj+1 
     256                     DO ii = 1, nn_hls 
     257                        iij = jpi-ii+1 
     258                        ptab(iij,ijj,jk,jl) = psgn * ptab(jpi-2*nn_hls+ii-1,jpj-2*nn_hls+jj,jk,jl) 
     259                     END DO 
     260                  END DO 
     261               END DO; END DO 
     262            ENDIF 
     263            ! 
     264         CASE ( 'V' )                                     ! V-point 
     265            DO jl = 1, ipl; DO jk = 1, ipk 
     266               DO jj = 1, nn_hls 
     267                  ijj = jpj -jj +1 
     268                  DO ji = 1, jpi 
     269                     ijt = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 3 
     270                     ptab(ji,ijj,jk,jl) = psgn * ptab2(ijt,jj,jk,jl) 
     271                  END DO 
     272               END DO 
     273            END DO; END DO 
     274 
     275            IF ( .NOT. l_fast_exchanges ) THEN 
     276               IF( nimpp >= Ni0glo/2+2 ) THEN 
     277                  startloop = 1 
     278               ELSEIF( nimpp+jpi-1 >= Ni0glo/2+2 .AND. nimpp < Ni0glo/2+2 ) THEN 
     279                  startloop = Ni0glo/2+2 - nimpp + nn_hls 
     280               ELSE 
     281                  startloop = jpi + 1 
     282               ENDIF 
     283               IF( startloop <= jpi ) THEN 
    166284                  DO jl = 1, ipl; DO jk = 1, ipk 
    167                        DO jj = 2, nn_hls+1 
    168                      ijj = jpj -jj +1 
    169                         DO ji = startloop, jpi 
    170                            ijt=jpiglo - ji - nimpp - nfimpp(isendto(1)) + 4 
    171                            ARRAY_IN(ji,ijj,jk,jl) = psgn * ptab2(ijt,jj,jk,jl) 
    172                         END DO 
    173                     END DO 
     285                     DO ji = startloop, jpi 
     286                        ijt = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 3 
     287                        ptab(ji,jpj-nn_hls,jk,jl) = psgn * ptab2(ijt,nn_hls+1,jk,jl) 
     288                     END DO 
    174289                  END DO; END DO 
    175290               ENDIF 
    176                DO jl = 1, ipl; DO jk = 1, ipk 
    177                   DO ji = startloop, jpi 
    178                      ijt=jpiglo - ji - nimpp - nfimpp(isendto(1)) + 4 
    179                      ARRAY_IN(ji,jpj,jk,jl) = psgn * ptab2(ijt,1,jk,jl) 
    180                   END DO 
    181                END DO; END DO 
    182                IF (nimpp .eq. 1) THEN 
    183         DO jj = 1, nn_hls 
    184                        ijj = jpj-jj+1 
    185                        DO ii = 0, nn_hls-1 
    186                         ARRAY_IN(ii+1,ijj,:,:) = psgn * ARRAY_IN(2*nn_hls-ii+1,jpj-2*nn_hls+jj-1,:,:) 
    187            END DO 
    188         END DO 
    189                ENDIF 
    190             CASE ( 'F' )                                     ! F-point 
     291            ENDIF 
     292            ! 
     293         CASE ( 'F' )                               ! F-point 
     294            IF( nimpp + jpi - 1 /= jpiglo ) THEN 
     295               endloop = jpi 
     296            ELSE 
     297               endloop = jpi - nn_hls 
     298            ENDIF 
     299            DO jl = 1, ipl; DO jk = 1, ipk 
     300               DO jj = 1, nn_hls 
     301                  ijj = jpj -jj +1 
     302                  DO ji = 1, endloop 
     303                     iju = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 2 
     304                     ptab(ji,ijj ,jk,jl) = psgn * ptab2(iju,jj,jk,jl) 
     305                  END DO 
     306               END DO 
     307            END DO; END DO 
     308            IF((nimpp + jpi - 1) .eq. jpiglo) THEN 
     309               DO jl = 1, ipl; DO jk = 1, ipk 
     310                  DO jj = 1, nn_hls 
     311                     ijj = jpj -jj +1 
     312                     DO ii = 1, nn_hls 
     313                        iij = jpi -ii+1 
     314                        ptab(iij,ijj,jk,jl) = psgn * ptab(jpi-2*nn_hls+ii-1,jpj-2*nn_hls+jj-1,jk,jl) 
     315                     END DO 
     316                  END DO 
     317               END DO; END DO 
     318            ENDIF 
     319            ! 
     320            IF ( .NOT. l_fast_exchanges ) THEN 
    191321               IF( nimpp + jpi - 1 /= jpiglo ) THEN 
    192322                  endloop = jpi 
     
    194324                  endloop = jpi - nn_hls 
    195325               ENDIF 
    196                IF ( .NOT. l_fast_exchanges ) THEN 
     326               IF( nimpp >= Ni0glo/2+2 ) THEN 
     327                  startloop = 1  
     328               ELSEIF( nimpp+jpi-1 >= Ni0glo/2+2 .AND. nimpp < Ni0glo/2+2 ) THEN 
     329                  startloop = Ni0glo/2+2 - nimpp + nn_hls 
     330               ELSE 
     331                  startloop = endloop + 1 
     332               ENDIF 
     333               IF( startloop <= endloop ) THEN 
    197334                  DO jl = 1, ipl; DO jk = 1, ipk 
    198                        DO jj = 2, nn_hls+1 
    199                      ijj = jpj -jj +1 
    200                         DO ji = 1, endloop 
    201                            iju = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 3 
    202                            ARRAY_IN(ji,ijj,jk,jl) = psgn * ptab2(iju,jj,jk,jl) 
    203                         END DO 
    204                     END DO 
     335                     DO ji = startloop, endloop 
     336                        iju = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 2 
     337                        ptab(ji,jpj-nn_hls,jk,jl) = psgn * ptab2(iju,nn_hls+1,jk,jl) 
     338                     END DO 
    205339                  END DO; END DO 
    206340               ENDIF 
    207                DO jl = 1, ipl; DO jk = 1, ipk 
    208                   DO ji = 1, endloop 
    209                      iju = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 3 
    210                      ARRAY_IN(ji,jpj,jk,jl) = psgn * ptab2(iju,1,jk,jl) 
    211                   END DO 
    212                END DO; END DO 
    213       IF (nimpp .eq. 1) THEN                
    214          DO ii = 1, nn_hls 
    215                  ARRAY_IN(ii,jpj,:,:) = psgn * ARRAY_IN(2*nn_hls-ii,jpj-2*nn_hls-1,:,:) 
    216          END DO 
    217          IF ( .NOT. l_fast_exchanges ) THEN 
    218             DO jj = 1, nn_hls 
    219                       ijj = jpj -jj 
    220                       DO ii = 0, nn_hls-1 
    221                          ARRAY_IN(ii+1,ijj,:,:) = psgn * ARRAY_IN(2*nn_hls-ii,jpj-2*nn_hls+jj-1,:,:) 
    222                    END DO 
    223                       END DO 
    224                      ENDIF 
    225       ENDIF 
    226       IF((nimpp + jpi - 1 ) .eq. jpiglo) THEN 
    227                    DO ii = 1, nn_hls 
    228                  ARRAY_IN(jpi-ii+1,jpj,:,:) = psgn * ARRAY_IN(jpi-2*nn_hls+ii,jpj-2*nn_hls-1,:,:) 
    229          END DO 
    230          IF ( .NOT. l_fast_exchanges ) THEN 
    231             DO jj = 1, nn_hls 
    232                            ijj = jpj -jj 
    233                       DO ii = 1, nn_hls 
    234                          ARRAY_IN(jpi-ii+1,ijj,:,:) = psgn * ARRAY_IN(jpi-2*nn_hls+ii,jpj-2*nn_hls+jj-1,:,:) 
    235                          END DO 
    236                       END DO 
    237                      ENDIF 
    238                   ENDIF 
    239                   ! 
    240             END SELECT 
    241             ! 
    242          ENDIF   ! c_NFtype == 'T' 
     341            ENDIF 
     342            ! 
     343         END SELECT 
    243344         ! 
    244          IF( c_NFtype == 'F' ) THEN           ! *  North fold  F-point pivot 
    245             ! 
    246             SELECT CASE ( cd_nat ) 
    247             CASE ( 'T' , 'W' )                               ! T-, W-point 
    248                DO jl = 1, ipl; DO jk = 1, ipk 
    249         DO jj = 1, nn_hls 
    250            ijj = jpj-jj+1 
    251            DO ji = 1, jpi 
    252                         ijt = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 3 
    253                         ARRAY_IN(ji,ijj,jk,jl) = psgn * ptab2(ijt,jj,jk,jl) 
    254                      END DO 
    255         END DO 
    256                END DO; END DO 
    257                ! 
    258             CASE ( 'U' )                                     ! U-point 
    259                IF( nimpp + jpi - 1 /= jpiglo ) THEN 
    260                   endloop = jpi 
    261                ELSE 
    262                   endloop = jpi - nn_hls 
    263                ENDIF 
    264                DO jl = 1, ipl; DO jk = 1, ipk 
    265         DO jj = 1, nn_hls 
    266            ijj = jpj-jj+1 
    267                      DO ji = 1, endloop 
    268                         iju = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 2 
    269                         ARRAY_IN(ji,ijj,jk,jl) = psgn * ptab2(iju,jj,jk,jl) 
    270                      END DO 
    271                   END DO 
    272                END DO; END DO 
    273                IF(nimpp + jpi - 1 .eq. jpiglo) THEN 
    274                   DO jl = 1, ipl; DO jk = 1, ipk 
    275                      DO jj = 1, nn_hls 
    276                           ijj = jpj-jj+1 
    277                         DO ii = 1, nn_hls 
    278             iij = jpi-ii+1 
    279                            ARRAY_IN(iij,ijj,jk,jl) = psgn * ARRAY_IN(jpi-2*nn_hls+ii-1,jpj-2*nn_hls+jj,jk,jl) 
    280                         END DO 
    281                      END DO 
    282                   END DO; END DO 
    283                ENDIF 
    284                ! 
    285             CASE ( 'V' )                                     ! V-point 
    286                DO jl = 1, ipl; DO jk = 1, ipk 
    287         DO jj = 1, nn_hls 
    288            ijj = jpj -jj +1 
    289                      DO ji = 1, jpi 
    290                         ijt = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 3 
    291                         ARRAY_IN(ji,ijj,jk,jl) = psgn * ptab2(ijt,jj,jk,jl) 
    292                      END DO 
    293                   END DO 
    294                END DO; END DO 
     345      ENDIF   ! c_NFtype == 'F' 
     346      ! 
     347   END SUBROUTINE lbc_nfd_nogather_/**/PRECISION 
    295348 
    296                IF ( .NOT. l_fast_exchanges ) THEN 
    297                   IF( nimpp >= Ni0glo/2+2 ) THEN 
    298                      startloop = 1 
    299                   ELSEIF( nimpp+jpi-1 >= Ni0glo/2+2 .AND. nimpp < Ni0glo/2+2 ) THEN 
    300                      startloop = Ni0glo/2+2 - nimpp + nn_hls 
    301                   ELSE 
    302                      startloop = jpi + 1 
    303                   ENDIF 
    304                   IF( startloop <= jpi ) THEN 
    305                   DO jl = 1, ipl; DO jk = 1, ipk 
    306                         DO ji = startloop, jpi 
    307                         ijt = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 3 
    308                            ARRAY_IN(ji,jpj-nn_hls,jk,jl) = psgn * ptab2(ijt,nn_hls+1,jk,jl) 
    309                         END DO 
    310                   END DO; END DO 
    311                   ENDIF 
    312                ENDIF 
    313                ! 
    314             CASE ( 'F' )                               ! F-point 
    315                IF( nimpp + jpi - 1 /= jpiglo ) THEN 
    316                   endloop = jpi 
    317                ELSE 
    318                   endloop = jpi - nn_hls 
    319                ENDIF 
    320                DO jl = 1, ipl; DO jk = 1, ipk 
    321         DO jj = 1, nn_hls 
    322           ijj = jpj -jj +1 
    323                     DO ji = 1, endloop 
    324                        iju = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 2 
    325                        ARRAY_IN(ji,ijj ,jk,jl) = psgn * ptab2(iju,jj,jk,jl) 
    326                      END DO 
    327                   END DO 
    328                END DO; END DO 
    329                IF((nimpp + jpi - 1) .eq. jpiglo) THEN 
    330                   DO jl = 1, ipl; DO jk = 1, ipk 
    331                      DO jj = 1, nn_hls 
    332                         ijj = jpj -jj +1 
    333                         DO ii = 1, nn_hls 
    334             iij = jpi -ii+1 
    335                            ARRAY_IN(iij,ijj,jk,jl) = psgn * ARRAY_IN(jpi-2*nn_hls+ii-1,jpj-2*nn_hls+jj-1,jk,jl) 
    336                         END DO 
    337                      END DO 
    338                   END DO; END DO 
    339                ENDIF 
    340                ! 
    341                IF ( .NOT. l_fast_exchanges ) THEN 
    342                   IF( nimpp + jpi - 1 /= jpiglo ) THEN 
    343                      endloop = jpi 
    344                   ELSE 
    345                      endloop = jpi - nn_hls 
    346                   ENDIF 
    347                   IF( nimpp >= Ni0glo/2+2 ) THEN 
    348                      startloop = 1  
    349                   ELSEIF( nimpp+jpi-1 >= Ni0glo/2+2 .AND. nimpp < Ni0glo/2+2 ) THEN 
    350                      startloop = Ni0glo/2+2 - nimpp + nn_hls 
    351                   ELSE 
    352                      startloop = endloop + 1 
    353                   ENDIF 
    354                   IF( startloop <= endloop ) THEN 
    355                      DO jl = 1, ipl; DO jk = 1, ipk 
    356                         DO ji = startloop, endloop 
    357                            iju = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 2 
    358                            ARRAY_IN(ji,jpj-nn_hls,jk,jl) = psgn * ptab2(iju,nn_hls+1,jk,jl) 
    359                         END DO 
    360                      END DO; END DO 
    361                   ENDIF 
    362                ENDIF 
    363                ! 
    364             END SELECT 
    365             ! 
    366          ENDIF   ! c_NFtype == 'F' 
    367          ! 
    368    END SUBROUTINE lbc_nfd_nogather_/**/XD/**/_/**/PRECISION 
    369  
    370 #undef XD 
    371 #undef DIMS_IN 
    372 #undef ARRAY_IN 
    373 #undef K_SIZE 
    374 #undef L_SIZE 
  • NEMO/branches/2021/dev_r14312_MPI_Interface/src/OCE/LBC/lbclnk.F90

    r14338 r14349  
    3636 
    3737   INTERFACE lbc_lnk_pt2pt 
    38       MODULE PROCEDURE   lbc_lnk_pt2pt_2d_sp , lbc_lnk_pt2pt_3d_sp , lbc_lnk_pt2pt_4d_sp 
    39       MODULE PROCEDURE   lbc_lnk_pt2pt_2d_dp , lbc_lnk_pt2pt_3d_dp , lbc_lnk_pt2pt_4d_dp 
     38      MODULE PROCEDURE   lbc_lnk_pt2pt_sp, lbc_lnk_pt2pt_dp 
    4039   END INTERFACE 
    4140 
    4241   INTERFACE lbc_lnk_neicoll 
    43       MODULE PROCEDURE   lbc_lnk_neicoll_2d_sp , lbc_lnk_neicoll_3d_sp , lbc_lnk_neicoll_4d_sp 
    44       MODULE PROCEDURE   lbc_lnk_neicoll_2d_dp , lbc_lnk_neicoll_3d_dp , lbc_lnk_neicoll_4d_dp 
     42      MODULE PROCEDURE   lbc_lnk_neicoll_sp ,lbc_lnk_neicoll_dp 
    4543   END INTERFACE 
    4644   ! 
     
    111109   ! 
    112110   !!---------------------------------------------------------------------- 
    113    !!                   ***  lbc_lnk_pt2pt_[234]d_[sd]p  *** 
    114    !!                  ***  lbc_lnk_neicoll_[234]d_[sd]p  *** 
     111   !!                   ***  lbc_lnk_pt2pt_[sd]p  *** 
     112   !!                  ***  lbc_lnk_neicoll_[sd]p  *** 
    115113   !! 
    116114   !!   * Argument : dummy argument use in lbc_lnk_... routines 
     
    127125   !! 
    128126#define PRECISION sp 
    129 # define MPI_TYPE MPI_REAL 
    130 # define DIM_2d 
    131 #    include "lbc_lnk_pt2pt_generic.h90" 
    132 #    include "lbc_lnk_neicoll_generic.h90" 
    133 # undef DIM_2d 
    134 # define DIM_3d 
    135 #    include "lbc_lnk_pt2pt_generic.h90" 
    136 #    include "lbc_lnk_neicoll_generic.h90" 
    137 # undef DIM_3d 
    138 # define DIM_4d 
    139 #    include "lbc_lnk_pt2pt_generic.h90" 
    140 #    include "lbc_lnk_neicoll_generic.h90" 
    141 # undef DIM_4d 
    142 # undef MPI_TYPE 
     127#  define MPI_TYPE MPI_REAL 
     128#  include "lbc_lnk_pt2pt_generic.h90" 
     129#  include "lbc_lnk_neicoll_generic.h90" 
     130#  undef MPI_TYPE 
    143131#undef PRECISION 
    144132   !! 
     
    146134   !! 
    147135#define PRECISION dp 
    148 # define MPI_TYPE MPI_DOUBLE_PRECISION 
    149 # define DIM_2d 
    150 #    include "lbc_lnk_pt2pt_generic.h90" 
    151 #    include "lbc_lnk_neicoll_generic.h90" 
    152 # undef DIM_2d 
    153 # define DIM_3d 
    154 #    include "lbc_lnk_pt2pt_generic.h90" 
    155 #    include "lbc_lnk_neicoll_generic.h90" 
    156 # undef DIM_3d 
    157 # define DIM_4d 
    158 #    include "lbc_lnk_pt2pt_generic.h90" 
    159 #    include "lbc_lnk_neicoll_generic.h90" 
    160 # undef DIM_4d 
    161 # undef MPI_TYPE 
     136#  define MPI_TYPE MPI_DOUBLE_PRECISION 
     137#  include "lbc_lnk_pt2pt_generic.h90" 
     138#  include "lbc_lnk_neicoll_generic.h90" 
     139#  undef MPI_TYPE 
    162140#undef PRECISION 
    163141 
  • NEMO/branches/2021/dev_r14312_MPI_Interface/src/OCE/LBC/lbcnfd.F90

    r14338 r14349  
    2828   PRIVATE 
    2929 
    30    INTERFACE lbc_nfd   ! called by mpp_nfd, lbc_lnk_pt2pt, lbc_lnk_neicoll 
    31       MODULE PROCEDURE   lbc_nfd_2d_sp, lbc_nfd_ext_2d_sp, lbc_nfd_3d_sp, lbc_nfd_4d_sp 
    32       MODULE PROCEDURE   lbc_nfd_2d_dp, lbc_nfd_ext_2d_dp, lbc_nfd_3d_dp, lbc_nfd_4d_dp 
     30   INTERFACE lbc_nfd            ! called by mpp_nfd, lbc_lnk_pt2pt or lbc_lnk_neicoll 
     31      MODULE PROCEDURE   lbc_nfd_sp, lbc_nfd_ext_sp 
     32      MODULE PROCEDURE   lbc_nfd_dp, lbc_nfd_ext_dp 
     33   END INTERFACE 
     34 
     35   INTERFACE mpp_nfd            ! called by lbc_lnk_pt2pt or lbc_lnk_neicoll 
     36      MODULE PROCEDURE   mpp_nfd_sp, mpp_nfd_dp 
    3337   END INTERFACE 
    3438 
    3539   INTERFACE lbc_nfd_nogather   ! called by mpp_nfd 
    36       MODULE PROCEDURE   lbc_nfd_nogather_2d_sp, lbc_nfd_nogather_3d_sp, lbc_nfd_nogather_4d_sp 
    37       MODULE PROCEDURE   lbc_nfd_nogather_2d_dp, lbc_nfd_nogather_3d_dp, lbc_nfd_nogather_4d_dp 
    38    END INTERFACE 
    39  
    40    INTERFACE mpp_nfd 
    41       MODULE PROCEDURE   mpp_nfd_2d_sp, mpp_nfd_3d_sp, mpp_nfd_4d_sp 
    42       MODULE PROCEDURE   mpp_nfd_2d_dp, mpp_nfd_3d_dp, mpp_nfd_4d_dp 
     40      MODULE PROCEDURE   lbc_nfd_nogather_sp, lbc_nfd_nogather_dp 
    4341   END INTERFACE 
    4442    
     
    6058 
    6159   !!---------------------------------------------------------------------- 
    62    !!                   ***  routine lbc_nfd_[234]d_[sd]p  *** 
    63    !!               ***  routine lbc_nfd_nogather_[234]d_[sd]p  *** 
    64    !!                   ***  routine lbc_nfd_ext_2d_[sd]p  *** 
     60   !!                   ***  routine lbc_nfd_[sd]p  *** 
     61   !!               ***  routine lbc_nfd_nogather_[sd]p  *** 
     62   !!                   ***  routine lbc_nfd_ext_[sd]p  *** 
    6563   !!---------------------------------------------------------------------- 
    6664   !! 
     
    7674   ! 
    7775#define PRECISION sp 
    78 # define DIM_2d 
    79 #    include "lbc_nfd_generic.h90" 
    80 #    include "lbc_nfd_nogather_generic.h90" 
    81 #    include "lbc_nfd_ext_generic.h90" 
    82 # undef DIM_2d 
    83 # define DIM_3d 
    84 #    include "lbc_nfd_generic.h90" 
    85 #    include "lbc_nfd_nogather_generic.h90" 
    86 # undef DIM_3d 
    87 # define DIM_4d 
    88 #    include "lbc_nfd_generic.h90" 
    89 #    include "lbc_nfd_nogather_generic.h90" 
    90 # undef DIM_4d 
     76#  include "lbc_nfd_generic.h90" 
     77#  include "lbc_nfd_nogather_generic.h90" 
     78#  include "lbc_nfd_ext_generic.h90" 
    9179#undef PRECISION 
    9280   ! 
     
    9482   ! 
    9583#define PRECISION dp 
    96 # define DIM_2d 
    97 #    include "lbc_nfd_generic.h90" 
    98 #    include "lbc_nfd_nogather_generic.h90" 
    99 #    include "lbc_nfd_ext_generic.h90" 
    100 # undef DIM_2d 
    101 # define DIM_3d 
    102 #    include "lbc_nfd_generic.h90" 
    103 #    include "lbc_nfd_nogather_generic.h90" 
    104 # undef DIM_3d 
    105 # define DIM_4d 
    106 #    include "lbc_nfd_generic.h90" 
    107 #    include "lbc_nfd_nogather_generic.h90" 
    108 # undef DIM_4d 
     84#  include "lbc_nfd_generic.h90" 
     85#  include "lbc_nfd_nogather_generic.h90" 
     86#  include "lbc_nfd_ext_generic.h90" 
    10987#undef PRECISION 
    11088 
     
    11290   ! 
    11391   !!---------------------------------------------------------------------- 
    114    !!                   ***  routine mpp_nfd_(2,3,4)d  *** 
     92   !!                   ***  routine mpp_nfd_[sd]p  *** 
    11593   !! 
    11694   !!   * Argument : dummy argument use in mpp_nfd_... routines 
     
    126104   !! 
    127105#define PRECISION sp 
    128 # define MPI_TYPE MPI_REAL 
    129 # define DIM_2d 
    130 #    include "mpp_nfd_generic.h90" 
    131 # undef DIM_2d 
    132 # define DIM_3d 
    133 #    include "mpp_nfd_generic.h90" 
    134 # undef DIM_3d 
    135 # define DIM_4d 
    136 #    include "mpp_nfd_generic.h90" 
    137 # undef DIM_4d 
    138 # undef MPI_TYPE 
     106#  define MPI_TYPE MPI_REAL 
     107#  include "mpp_nfd_generic.h90" 
     108#  undef MPI_TYPE 
    139109#undef PRECISION 
    140110   !! 
     
    142112   !! 
    143113#define PRECISION dp 
    144 # define MPI_TYPE MPI_DOUBLE_PRECISION 
    145 # define DIM_2d 
    146 #    include "mpp_nfd_generic.h90" 
    147 # undef DIM_2d 
    148 # define DIM_3d 
    149 #    include "mpp_nfd_generic.h90" 
    150 # undef DIM_3d 
    151 # define DIM_4d 
    152 #    include "mpp_nfd_generic.h90" 
    153 # undef DIM_4d 
    154 # undef MPI_TYPE 
     114#  define MPI_TYPE MPI_DOUBLE_PRECISION 
     115#  include "mpp_nfd_generic.h90" 
     116#  undef MPI_TYPE 
    155117#undef PRECISION 
    156118 
  • NEMO/branches/2021/dev_r14312_MPI_Interface/src/OCE/LBC/lib_mpp.F90

    r14338 r14349  
    110110   END INTERFACE 
    111111 
    112    TYPE, PUBLIC ::   PTR_2D_sp   !: array of 2D pointers (used in lbclnk and lbcnfd) 
    113       REAL(sp), DIMENSION (:,:)    , POINTER ::   pt2d 
    114    END TYPE PTR_2D_sp 
    115    TYPE, PUBLIC ::   PTR_3D_sp   !: array of 3D pointers (used in lbclnk and lbcnfd) 
    116       REAL(sp), DIMENSION (:,:,:)  , POINTER ::   pt3d 
    117    END TYPE PTR_3D_sp 
    118112   TYPE, PUBLIC ::   PTR_4D_sp   !: array of 4D pointers (used in lbclnk and lbcnfd) 
    119113      REAL(sp), DIMENSION (:,:,:,:), POINTER ::   pt4d 
    120114   END TYPE PTR_4D_sp 
    121115 
    122    TYPE, PUBLIC ::   PTR_2D_dp   !: array of 2D pointers (used in lbclnk and lbcnfd) 
    123       REAL(dp), DIMENSION (:,:)    , POINTER ::   pt2d 
    124    END TYPE PTR_2D_dp 
    125    TYPE, PUBLIC ::   PTR_3D_dp   !: array of 3D pointers (used in lbclnk and lbcnfd) 
    126       REAL(dp), DIMENSION (:,:,:)  , POINTER ::   pt3d 
    127    END TYPE PTR_3D_dp 
    128116   TYPE, PUBLIC ::   PTR_4D_dp   !: array of 4D pointers (used in lbclnk and lbcnfd) 
    129117      REAL(dp), DIMENSION (:,:,:,:), POINTER ::   pt4d 
  • NEMO/branches/2021/dev_r14312_MPI_Interface/src/OCE/LBC/mpp_nfd_generic.h90

    r14338 r14349  
    1 #if defined DIM_2d 
    2 #   define XD                       2d 
    3 #   define ARRAY_IN(i,j,k,l,f)      ptab(f)%pt2d(i,j) 
    4 #   define ARRAY_LOCAL(i,j,k,l,f)   zptr(f)%pt4d(i,j,1:1,1:1) 
    5 #   define K_SIZE(ptab)             1 
    6 #   define L_SIZE(ptab)             1 
    7 #endif 
    8 #if defined DIM_3d 
    9 #   define XD                       3d 
    10 #   define ARRAY_IN(i,j,k,l,f)      ptab(f)%pt3d(i,j,k) 
    11 #   define ARRAY_LOCAL(i,j,k,l,f)   zptr(f)%pt4d(i,j,k,1:1) 
    12 #   define K_SIZE(ptab)             SIZE(ptab(1)%pt3d,3) 
    13 #   define L_SIZE(ptab)             1 
    14 #endif 
    15 #if defined DIM_4d 
    16 #   define XD                       4d 
    17 #   define ARRAY_IN(i,j,k,l,f)      ptab(f)%pt4d(i,j,k,l) 
    18 #   define ARRAY_LOCAL(i,j,k,l,f)   zptr(f)%pt4d(i,j,k,l) 
    19 #   define K_SIZE(ptab)             SIZE(ptab(1)%pt4d,3) 
    20 #   define L_SIZE(ptab)             SIZE(ptab(1)%pt4d,4) 
    21 #endif 
    22 #define    F_SIZE(ptab)             kfld 
    231 
    24    SUBROUTINE mpp_nfd_/**/XD/**/_/**/PRECISION( ptab, cd_nat, psgn, kfillmode, pfillval, kfld ) 
    25       TYPE(PTR_/**/XD/**/_/**/PRECISION),  DIMENSION(:), INTENT(inout) ::   ptab        ! pointer of arrays on which apply the b.c. 
     2   SUBROUTINE mpp_nfd_/**/PRECISION( ptab, cd_nat, psgn, kfillmode, pfillval, kfld ) 
     3      TYPE(PTR_4d_/**/PRECISION),  DIMENSION(:), INTENT(inout) ::   ptab        ! pointer of arrays on which apply the b.c. 
    264      CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   cd_nat      ! nature of array grid-points 
    275      REAL(PRECISION),  DIMENSION(:), INTENT(in   ) ::   psgn        ! sign used across the north fold boundary 
     
    5230      !!---------------------------------------------------------------------- 
    5331      ! 
    54       ipk = K_SIZE(ptab)   ! 3rd dimension 
    55       ipl = L_SIZE(ptab)   ! 4th    - 
    56       ipf = F_SIZE(ptab)   ! 5th    -      use in "multi" case (array of pointers) 
     32      ipk = SIZE(ptab(1)%pt4d,3) 
     33      ipl = SIZE(ptab(1)%pt4d,4) 
     34      ipf = kfld 
    5735      ! 
    5836      IF( ln_nnogather ) THEN      !==  no allgather exchanges  ==! 
     
    129107               ij2 = jj_s(jj,jf) 
    130108               DO ji = 1, jpi 
    131                   ztabb(ji,ij1,jk,jl) = ARRAY_IN(ji,ij2,jk,jl,jf) 
     109                  ztabb(ji,ij1,jk,jl) = ptab(jf)%pt4d(ji,ij2,jk,jl) 
    132110               END DO 
    133111               DO ji = jpi+1, jpimax 
     
    177155                        ij2 = jj_s(jj,jf) 
    178156                        DO ji = iis0, iie0 
    179                            ztabr(impp+ji,ij1,jk,jl) = ARRAY_IN(Nis0,ij2,jk,jl,jf)   ! chose to take the 1st iner domain point 
     157                           ztabr(impp+ji,ij1,jk,jl) = ptab(jf)%pt4d(Nis0,ij2,jk,jl)   ! chose to take the 1st iner domain point 
    180158                        END DO 
    181159                     END DO 
     
    198176                     ij2 = jj_s(jj,jf) 
    199177                     DO ji = iis0, iie0 
    200                         ztabr(impp+ji,ij1,jk,jl) = ARRAY_IN(ji,ij2,jk,jl,jf) 
     178                        ztabr(impp+ji,ij1,jk,jl) = ptab(jf)%pt4d(ji,ij2,jk,jl) 
    201179                     END DO 
    202180                  END DO 
     
    227205            ij1 = jj_b(       1 ,jf) 
    228206            ij2 = jj_b(ipj_s(jf),jf) 
    229             CALL lbc_nfd_nogather( ARRAY_IN(:,:,:,:,jf), ztabr(:,ij1:ij2,:,:), cd_nat(jf), psgn(jf) ) 
     207            CALL lbc_nfd_nogather( ptab(jf)%pt4d(:,:,:,:), ztabr(:,ij1:ij2,:,:), cd_nat(jf), psgn(jf) ) 
    230208         END DO 
    231209         ! 
     
    256234               DO ji = 1, Ni_0 
    257235                  ii2 = Nis0 - 1 + ji                       ! inner domain: Nis0 to Nie0 
    258                   znorthloc(ji,jj,jk,jl,jf) = ARRAY_IN(ii2,ij2,jk,jl,jf) 
     236                  znorthloc(ji,jj,jk,jl,jf) = ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    259237               END DO 
    260238               DO ji = Ni_0+1, i0max 
     
    293271                        DO ji = 1, ipi 
    294272                           ii1 = impp + nn_hls + ji - 1          ! corresponds to mig(nn_hls + ji) but for subdomain iproc 
    295                            ztabglo(jf)%pt4d(ii1,jj,jk,jl) = ARRAY_IN(Nis0,ij2,jk,jl,jf)   ! chose to take the 1st iner domain point 
     273                           ztabglo(jf)%pt4d(ii1,jj,jk,jl) = ptab(jf)%pt4d(Nis0,ij2,jk,jl) ! chose to take the 1st inner domain point 
    296274                        END DO 
    297275                     END DO 
     
    340318               DO ji= 1, jpi 
    341319                  ii2 = mig(ji) 
    342                   ARRAY_IN(ji,ij1,jk,jl,jf) = ztabglo(jf)%pt4d(ii2,ij2,jk,jl) 
     320                  ptab(jf)%pt4d(ji,ij1,jk,jl) = ztabglo(jf)%pt4d(ii2,ij2,jk,jl) 
    343321               END DO 
    344322            END DO 
     
    352330      ENDIF   ! l_north_nogather 
    353331      ! 
    354    END SUBROUTINE mpp_nfd_/**/XD/**/_/**/PRECISION 
     332   END SUBROUTINE mpp_nfd_/**/PRECISION 
    355333 
    356 #undef XD 
    357 #undef ARRAY_IN 
    358 #undef ARRAY_LOCAL 
    359 #undef K_SIZE 
    360 #undef L_SIZE 
    361 #undef F_SIZE 
  • NEMO/branches/2021/dev_r14312_MPI_Interface/tests/TSUNAMI/MY_SRC/usrdef_sbc.F90

    r14225 r14349  
    33   !!                       ***  MODULE  usrdef_sbc  *** 
    44   !!  
    5    !!                      ===  CANAL configuration  === 
     5   !!                      ===  TSUNAMI configuration  === 
    66   !! 
    77   !! User defined :   surface forcing of a user configuration 
     
    4444      !!              condition, i.e. the momentum, heat and freshwater fluxes. 
    4545      !! 
    46       !! ** Method  :   all 0 fields, for CANAL case 
     46      !! ** Method  :   all 0 fields, for TSUNAMI case 
    4747      !!                CAUTION : never mask the surface stress field ! 
    4848      !! 
     
    5757      IF( kt == nit000 ) THEN 
    5858         ! 
    59          IF(lwp) WRITE(numout,*)' usr_sbc : EW_CANAL case: surface forcing' 
     59         IF(lwp) WRITE(numout,*)' usr_sbc : TSUNAMI case: surface forcing' 
    6060         IF(lwp) WRITE(numout,*)' ~~~~~~~~~~~   vtau = taum = wndm = qns = qsr = emp = sfx = 0' 
    6161         ! 
Note: See TracChangeset for help on using the changeset viewer.