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

Changeset 14363


Ignore:
Timestamp:
2021-02-01T08:34:52+01:00 (3 years ago)
Author:
smasson
Message:

dev_r14312_MPI_Interface: suppress communications involving only land points, #2598

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

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2021/dev_r14312_MPI_Interface/src/OCE/BDY/bdyini.F90

    r14338 r14363  
    573573               ! check if point has to be sent     to   a neighbour 
    574574               ! W neighbour and on the inner left  side 
    575                IF( ii == 2     .AND. mpinei(jpwe) > -1 )   lsend_bdy(ib_bdy,igrd,jpwe,ir) = .TRUE. 
     575               IF( ii == 2     .AND. mpiSnei(nn_hls,jpwe) > -1 )   lsend_bdy(ib_bdy,igrd,jpwe,ir) = .TRUE. 
    576576               ! E neighbour and on the inner right side 
    577                IF( ii == jpi-1 .AND. mpinei(jpea) > -1 )   lsend_bdy(ib_bdy,igrd,jpea,ir) = .TRUE. 
     577               IF( ii == jpi-1 .AND. mpiSnei(nn_hls,jpea) > -1 )   lsend_bdy(ib_bdy,igrd,jpea,ir) = .TRUE. 
    578578               ! S neighbour and on the inner down side 
    579                IF( ij == 2     .AND. mpinei(jpso) > -1 )   lsend_bdy(ib_bdy,igrd,jpso,ir) = .TRUE. 
     579               IF( ij == 2     .AND. mpiSnei(nn_hls,jpso) > -1 )   lsend_bdy(ib_bdy,igrd,jpso,ir) = .TRUE. 
    580580               ! N neighbour and on the inner up   side 
    581                IF( ij == jpj-1 .AND. mpinei(jpno) > -1 )   lsend_bdy(ib_bdy,igrd,jpno,ir) = .TRUE. 
     581               IF( ij == jpj-1 .AND. mpiSnei(nn_hls,jpno) > -1 )   lsend_bdy(ib_bdy,igrd,jpno,ir) = .TRUE. 
    582582               ! 
    583583               ! check if point has to be received from a neighbour 
    584584               ! W neighbour and on the outter left  side 
    585                IF( ii == 1     .AND. mpinei(jpwe) > -1 )   lrecv_bdy(ib_bdy,igrd,jpwe,ir) = .TRUE. 
     585               IF( ii == 1     .AND. mpiRnei(nn_hls,jpwe) > -1 )   lrecv_bdy(ib_bdy,igrd,jpwe,ir) = .TRUE. 
    586586               ! E neighbour and on the outter right side 
    587                IF( ii == jpi   .AND. mpinei(jpea) > -1 )   lrecv_bdy(ib_bdy,igrd,jpea,ir) = .TRUE. 
     587               IF( ii == jpi   .AND. mpiRnei(nn_hls,jpea) > -1 )   lrecv_bdy(ib_bdy,igrd,jpea,ir) = .TRUE. 
    588588               ! S neighbour and on the outter down side 
    589                IF( ij == 1     .AND. mpinei(jpso) > -1 )   lrecv_bdy(ib_bdy,igrd,jpso,ir) = .TRUE. 
     589               IF( ij == 1     .AND. mpiRnei(nn_hls,jpso) > -1 )   lrecv_bdy(ib_bdy,igrd,jpso,ir) = .TRUE. 
    590590               ! N neighbour and on the outter up   side 
    591                IF( ij == jpj   .AND. mpinei(jpno) > -1 )   lrecv_bdy(ib_bdy,igrd,jpno,ir) = .TRUE. 
     591               IF( ij == jpj   .AND. mpiRnei(nn_hls,jpno) > -1 )   lrecv_bdy(ib_bdy,igrd,jpno,ir) = .TRUE. 
    592592               ! 
    593593            END DO 
     
    746746               ! :     |  x:o    |    neighbour limited by ... would need o    |    o:x  |     : 
    747747               ! :.....|_._:_____|   (1) W neighbour         E neighbour (2)   |_____:_._|.....: 
    748                IF( ii==2     .AND. mpinei(jpwe) > -1 .AND. & 
     748               IF( ii==2     .AND. mpiSnei(nn_hls,jpwe) > -1 .AND. & 
    749749                  & ( iibi==3     .OR. ii1==3     .OR. ii2==3     .OR. ii3==3    ) )   lsend_bdyint(ib_bdy,igrd,jpwe,ir) = .TRUE. 
    750                IF( ii==jpi-1 .AND. mpinei(jpea) > -1 .AND. & 
     750               IF( ii==jpi-1 .AND. mpiSnei(nn_hls,jpea) > -1 .AND. & 
    751751                  & ( iibi==jpi-2 .OR. ii1==jpi-2 .OR. ii2==jpi-2 .OR. ii3==jpi-2) )   lsend_bdyint(ib_bdy,igrd,jpea,ir) = .TRUE. 
    752                IF( ii==2     .AND. mpinei(jpwe) > -1            .AND. iibe==3     )   lsend_bdyext(ib_bdy,igrd,jpwe,ir) = .TRUE. 
    753                IF( ii==jpi-1 .AND. mpinei(jpea) > -1            .AND. iibe==jpi-2 )   lsend_bdyext(ib_bdy,igrd,jpea,ir) = .TRUE. 
     752               IF( ii==2     .AND. mpiSnei(nn_hls,jpwe) > -1 .AND. iibe==3     )   lsend_bdyext(ib_bdy,igrd,jpwe,ir) = .TRUE. 
     753               IF( ii==jpi-1 .AND. mpiSnei(nn_hls,jpea) > -1 .AND. iibe==jpi-2 )   lsend_bdyext(ib_bdy,igrd,jpea,ir) = .TRUE. 
    754754               ! 
    755755               ! search neighbour in the north/south direction    
     
    766766               !   |  |¨¨¨¨x¨¨¨¨|   neighbour limited by ... would need o     |  |....x....| 
    767767               !      :_________:  (3) S neighbour          N neighbour (4)   v  |    o    |    
    768                IF( ij==2     .AND. mpinei(jpso) > -1 .AND. & 
     768               IF( ij==2     .AND. mpiSnei(nn_hls,jpso) > -1 .AND. & 
    769769                  & ( ijbi==3     .OR. ij1==3     .OR. ij2==3     .OR. ij3==3    ) )   lsend_bdyint(ib_bdy,igrd,jpso,ir) = .TRUE. 
    770                IF( ij==jpj-1 .AND. mpinei(jpno) > -1 .AND. & 
     770               IF( ij==jpj-1 .AND. mpiSnei(nn_hls,jpno) > -1 .AND. & 
    771771                  & ( ijbi==jpj-2 .OR. ij1==jpj-2 .OR. ij2==jpj-2 .OR. ij3==jpj-2) )   lsend_bdyint(ib_bdy,igrd,jpno,ir) = .TRUE. 
    772                IF( ij==2     .AND. mpinei(jpso) > -1            .AND. ijbe==3     )   lsend_bdyext(ib_bdy,igrd,jpso,ir) = .TRUE. 
    773                IF( ij==jpj-1 .AND. mpinei(jpno) > -1            .AND. ijbe==jpj-2 )   lsend_bdyext(ib_bdy,igrd,jpno,ir) = .TRUE. 
     772               IF( ij==2     .AND. mpiSnei(nn_hls,jpso) > -1 .AND. ijbe==3     )   lsend_bdyext(ib_bdy,igrd,jpso,ir) = .TRUE. 
     773               IF( ij==jpj-1 .AND. mpiSnei(nn_hls,jpno) > -1 .AND. ijbe==jpj-2 )   lsend_bdyext(ib_bdy,igrd,jpno,ir) = .TRUE. 
    774774            END DO 
    775775         END DO 
  • NEMO/branches/2021/dev_r14312_MPI_Interface/src/OCE/LBC/lbc_lnk_call_generic.h90

    r14349 r14363  
    2424      &                   , pt9 , cdna9 , psgn9 , pt10, cdna10, psgn10, pt11, cdna11, psgn11, pt12, cdna12, psgn12  & 
    2525      &                   , pt13, cdna13, psgn13, pt14, cdna14, psgn14, pt15, cdna15, psgn15, pt16, cdna16, psgn16  & 
    26       &                   , kfillmode, pfillval, lsend, lrecv, ncsten ) 
     26      &                   , kfillmode, pfillval, khls, lsend, lrecv, ncsten ) 
    2727      !!--------------------------------------------------------------------- 
    2828      CHARACTER(len=*)     ,                   INTENT(in   ) ::   cdname  ! name of the calling subroutine 
     
    3838      INTEGER              , OPTIONAL        , INTENT(in   ) ::   kfillmode   ! filling method for halo over land (default = constant) 
    3939      REAL(PRECISION)      , OPTIONAL        , INTENT(in   ) ::   pfillval    ! background value (used at closed boundaries) 
     40      INTEGER              , OPTIONAL        , INTENT(in   ) ::   khls        ! halo size, default = nn_hls 
    4041      LOGICAL, DIMENSION(4), OPTIONAL        , INTENT(in   ) ::   lsend, lrecv   ! indicate how communications are to be carried out 
    4142      LOGICAL              , OPTIONAL        , INTENT(in   ) ::   ncsten 
     
    7071      !      
    7172      IF( nn_comm == 1 ) THEN  
    72          CALL lbc_lnk_pt2pt(   cdname, ptab_ptr, cdna_ptr, psgn_ptr, kfld, kfillmode, pfillval, lsend, lrecv ) 
     73         CALL lbc_lnk_pt2pt(   cdname, ptab_ptr, cdna_ptr, psgn_ptr, kfld, kfillmode, pfillval, khls, lsend, lrecv ) 
    7374      ELSE 
    74          CALL lbc_lnk_neicoll( cdname, ptab_ptr, cdna_ptr, psgn_ptr, kfld, kfillmode, pfillval, lsend, lrecv, ncsten ) 
     75         CALL lbc_lnk_neicoll( cdname, ptab_ptr, cdna_ptr, psgn_ptr, kfld, kfillmode, pfillval, khls, lsend, lrecv, ncsten ) 
    7576      ENDIF 
    7677      ! 
  • NEMO/branches/2021/dev_r14312_MPI_Interface/src/OCE/LBC/lbc_lnk_neicoll_generic.h90

    r14349 r14363  
    11 
    2    SUBROUTINE lbc_lnk_neicoll_/**/PRECISION( cdname, ptab, cd_nat, psgn, kfld, kfillmode, pfillval, lsend, lrecv, ncsten ) 
     2   SUBROUTINE lbc_lnk_neicoll_/**/PRECISION( cdname, ptab, cd_nat, psgn, kfld, kfillmode, pfillval, khls, lsend, lrecv, ncsten ) 
    33      CHARACTER(len=*)              , INTENT(in   ) ::   cdname      ! name of the calling subroutine 
    44      TYPE(PTR_4d_/**/PRECISION),  DIMENSION(:), INTENT(inout) ::   ptab        ! pointer of arrays on which apply the b.c. 
     
    88      INTEGER ,             OPTIONAL, INTENT(in   ) ::   kfillmode   ! filling method for halo over land (default = constant) 
    99      REAL(PRECISION),      OPTIONAL, INTENT(in   ) ::   pfillval    ! background value (used at closed boundaries) 
     10      INTEGER ,             OPTIONAL, INTENT(in   ) ::   khls        ! halo size, default = nn_hls 
    1011      LOGICAL, DIMENSION(4),OPTIONAL, INTENT(in   ) ::   lsend, lrecv  ! communication with other 4 proc 
    1112      LOGICAL,              OPTIONAL, INTENT(in   ) ::   ncsten      ! 5-point or 9-point stencil 
    1213      ! 
    13       INTEGER  ::   ji, jj, jk, jl, jf, jn      ! dummy loop indices 
    14       INTEGER  ::   ipk, ipl, ipf                                     ! dimension of the input array 
     14      INTEGER  ::    ji,  jj,  jk , jl, jf, jn      ! dummy loop indices 
     15      INTEGER  ::   ipi, ipj, ipk, ipl, ipf          ! dimension of the input array 
    1516      INTEGER  ::   ip0i, ip1i, im0i, im1i 
    1617      INTEGER  ::   ip0j, ip1j, im0j, im1j 
     
    1819      INTEGER  ::   iszs, iszr 
    1920      INTEGER  ::   ierr 
    20       INTEGER  ::   idx 
     21      INTEGER  ::   ihls, idx 
    2122      INTEGER  ::   impi_nc 
    2223      INTEGER  ::   ifill_nfd 
    2324      INTEGER, DIMENSION(4)  ::   iwewe, issnn 
    24       INTEGER, DIMENSION(8)  ::   isizei, ishtsi, ishtri, ishtpi 
    25       INTEGER, DIMENSION(8)  ::   isizej, ishtsj, ishtrj, ishtpj 
     25      INTEGER, DIMENSION(8)  ::   isizei, ishtSi, ishtRi, ishtPi 
     26      INTEGER, DIMENSION(8)  ::   isizej, ishtSj, ishtRj, ishtPj 
    2627      INTEGER, DIMENSION(8)  ::   ifill, iszall 
    2728      INTEGER, DIMENSION(:), ALLOCATABLE  ::   icounts, icountr    ! number of elements to be sent/received 
     
    3839      ! ----------------------------------------- ! 
    3940      ! 
     41      ipi = SIZE(ptab(1)%pt4d,1) 
     42      ipj = SIZE(ptab(1)%pt4d,2) 
    4043      ipk = SIZE(ptab(1)%pt4d,3) 
    4144      ipl = SIZE(ptab(1)%pt4d,4) 
     
    4649      ! take care of optional parameters 
    4750      ! 
    48       llncall = .TRUE.  
     51      ihls = nn_hls       ! default definition 
     52      IF( PRESENT( khls ) )   ihls = khls 
     53      IF( ihls > n_hlsmax ) THEN 
     54         WRITE(ctmp1,*) TRIM(cdname), '  is calling lbc_lnk with khls > n_hlsmax : ', khls, '>', n_hlsmax 
     55         CALL ctl_stop( 'STOP', ctmp1 ) 
     56      ENDIF 
     57      IF( ipi /= Ni_0+2*ihls ) THEN 
     58         WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk with an input array which does not match ihls along i: ', ipi, ihls, Ni_0 
     59         CALL ctl_stop( 'STOP', ctmp1 ) 
     60      ENDIF 
     61      IF( ipj /= Nj_0+2*ihls ) THEN 
     62         WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk with an input array which does not match ihls along j:', ipj, ihls , Nj_0 
     63         CALL ctl_stop( 'STOP', ctmp1 ) 
     64      ENDIF 
     65      ! 
     66      llncall = .TRUE.    ! default definition 
    4967      IF( PRESENT(ncsten) ) llncall = ncsten 
    5068      ! 
    51       impi_nc = mpi_nc_com4 
    52       IF(llncall)   impi_nc = mpi_nc_com8 
     69      impi_nc = mpi_nc_com4(ihls) 
     70      IF(llncall)   impi_nc = mpi_nc_com8(ihls) 
    5371      ! 
    5472      zland = 0._wp                                     ! land filling value: zero by default 
     
    6078!!$         ---> llsend(:) = lsend(:)   ;   llrecv(:) = lrecv(:) ??? 
    6179      ELSE IF( PRESENT(lsend) .OR.  PRESENT(lrecv) ) THEN 
    62          WRITE(ctmp1,*) ' Routine ', cdname, '  is calling lbc_lnk with only one of the two arguments lsend or lrecv' 
     80         WRITE(ctmp1,*) TRIM(cdname), '  is calling lbc_lnk with only one of the two arguments lsend or lrecv' 
    6381         CALL ctl_stop( 'STOP', ctmp1 ) 
    6482      ELSE                                                  ! default neighbours 
    65          llsend(:) = mpinei(:) >= 0 
     83         llsend(:) = mpiSnei(ihls,:) >= 0 
    6684         IF( .NOT. llncall )   llsend(5:8) = .FALSE.        ! exclude corners 
    67          llrecv(:) = llsend(:) 
     85         llrecv(:) = mpiRnei(ihls,:) >= 0 
     86         IF( .NOT. llncall )   llrecv(5:8) = .FALSE.        ! exclude corners 
    6887      END IF 
    6988      ! 
     
    92111      ! or used for periodocity (p). The localization is defined as "the bottom left corner - 1" in i and j directions. 
    93112      ! This is a shift that will be applied later in the do loops to pick-up the appropriate part of the array 
    94       !                    !                       ________________________ 
    95       ip0i =          0    !          im0j = inner |__|________________|__| 
    96       ip1i =      nn_hls   !   im1j = inner - halo |  |__|__________|__|  | 
    97       im1i = Nie0-nn_hls   !                       |  |  |          |  |  | 
    98       im0i = Nie0          !                       |  |  |          |  |  | 
    99       ip0j =          0    !                       |  |  |          |  |  | 
    100       ip1j =      nn_hls   !                       |  |__|__________|__|  | 
    101       im1j = Nje0-nn_hls   !           ip1j = halo |__|__|__________|__|__| 
    102       im0j = Nje0          !              ip0j = 0 |__|________________|__| 
    103       !                    !                    ip0i ip1i        im1i im0i 
     113      ! 
     114      ! all definitions bellow do not refer to N[ij][se]0 so we can use it with any local value of ihls 
     115      !                   !                       ________________________ 
     116      ip0i =          0   !          im0j = inner |__|________________|__| 
     117      ip1i =       ihls   !   im1j = inner - halo |  |__|__________|__|  | 
     118      im1i = ipi-2*ihls   !                       |  |  |          |  |  | 
     119      im0i = ipi - ihls   !                       |  |  |          |  |  | 
     120      ip0j =          0   !                       |  |  |          |  |  | 
     121      ip1j =       ihls   !                       |  |__|__________|__|  | 
     122      im1j = ipj-2*ihls   !           ip1j = halo |__|__|__________|__|__| 
     123      im0j = ipj - ihls   !              ip0j = 0 |__|________________|__| 
     124      !                   !                    ip0i ip1i        im1i im0i 
    104125      ! 
    105126      iwewe(:) = (/ jpwe,jpea,jpwe,jpea /)   ;   issnn(:) = (/ jpso,jpso,jpno,jpno /) 
    106       !     sides:       west    east   south   north      ;       corners: so-we, so-ea, no-we, no-ea 
    107       isizei(1:4) = (/ nn_hls, nn_hls,   Ni_0,   Ni_0 /)   ;   isizei(5:8) = nn_hls            ! i- count 
    108       isizej(1:4) = (/   Nj_0,   Nj_0, nn_hls, nn_hls /)   ;   isizej(5:8) = nn_hls            ! j- count 
    109       ishtsi(1:4) = (/   ip1i,   im1i,   ip1i,   ip1i /)   ;   ishtsi(5:8) = ishtsi( iwewe )   ! i- shift send data 
    110       ishtsj(1:4) = (/   ip1j,   ip1j,   ip1j,   im1j /)   ;   ishtsj(5:8) = ishtsj( issnn )   ! j- shift send data 
    111       ishtri(1:4) = (/   ip0i,   im0i,   ip1i,   ip1i /)   ;   ishtri(5:8) = ishtri( iwewe )   ! i- shift received data location 
    112       ishtrj(1:4) = (/   ip1j,   ip1j,   ip0j,   im0j /)   ;   ishtrj(5:8) = ishtrj( issnn )   ! j- shift received data location 
    113       ishtpi(1:4) = (/   im1i,   ip1i,   ip1i,   ip1i /)   ;   ishtpi(5:8) = ishtpi( iwewe )   ! i- shift data used for periodicity 
    114       ishtpj(1:4) = (/   ip1j,   ip1j,   im1j,   ip1j /)   ;   ishtpj(5:8) = ishtpj( issnn )   ! j- shift data used for periodicity 
     127      !     sides:     west  east south north      ;   corners: so-we, so-ea, no-we, no-ea 
     128      isizei(1:4) = (/ ihls, ihls, Ni_0, Ni_0 /)   ;   isizei(5:8) = ihls              ! i- count 
     129      isizej(1:4) = (/ Nj_0, Nj_0, ihls, ihls /)   ;   isizej(5:8) = ihls              ! j- count 
     130      ishtSi(1:4) = (/ ip1i, im1i, ip1i, ip1i /)   ;   ishtSi(5:8) = ishtSi( iwewe )   ! i- shift send data 
     131      ishtSj(1:4) = (/ ip1j, ip1j, ip1j, im1j /)   ;   ishtSj(5:8) = ishtSj( issnn )   ! j- shift send data 
     132      ishtRi(1:4) = (/ ip0i, im0i, ip1i, ip1i /)   ;   ishtRi(5:8) = ishtRi( iwewe )   ! i- shift received data location 
     133      ishtRj(1:4) = (/ ip1j, ip1j, ip0j, im0j /)   ;   ishtRj(5:8) = ishtRj( issnn )   ! j- shift received data location 
     134      ishtPi(1:4) = (/ im1i, ip1i, ip1i, ip1i /)   ;   ishtPi(5:8) = ishtPi( iwewe )   ! i- shift data used for periodicity 
     135      ishtPj(1:4) = (/ ip1j, ip1j, im1j, ip1j /)   ;   ishtPj(5:8) = ishtPj( issnn )   ! j- shift data used for periodicity 
    115136      ! 
    116137      ! -------------------------------- ! 
     
    140161      DO jn = 1, 8 
    141162         IF( llsend(jn) ) THEN 
    142             ishti = ishtsi(jn) 
    143             ishtj = ishtsj(jn) 
     163            ishti = ishtSi(jn) 
     164            ishtj = ishtSj(jn) 
    144165            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    145166               zsnd(idx) = ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) 
     
    163184      idx = 1 
    164185      DO jn = 1, 8 
    165          ishti = ishtri(jn) 
    166          ishtj = ishtrj(jn) 
     186         ishti = ishtRi(jn) 
     187         ishtj = ishtRj(jn) 
    167188         SELECT CASE ( ifill(jn) ) 
    168189         CASE ( jpfillnothing )               ! no filling  
     
    173194            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO 
    174195         CASE ( jpfillperio )                 ! use periodicity 
    175             ishti2 = ishtpi(jn) 
    176             ishtj2 = ishtpj(jn) 
     196            ishti2 = ishtPi(jn) 
     197            ishtj2 = ishtPj(jn) 
    177198            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    178199               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl) 
    179200            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO 
    180201         CASE ( jpfillcopy  )                 ! filling with inner domain values 
    181             ishti2 = ishtsi(jn) 
    182             ishtj2 = ishtsj(jn) 
     202            ishti2 = ishtSi(jn) 
     203            ishtj2 = ishtSj(jn) 
    183204            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    184205               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl) 
     
    196217      DO jn = 5, 8 
    197218         IF( .NOT. l_SelfPerio(jn) .AND. l_SelfPerio(jpwe)  ) THEN   ! no bi-perio but ew-perio: corners indirect definition 
    198             ishti  = ishtri(jn) 
    199             ishtj  = ishtrj(jn) 
    200             ishti2 = ishtpi(jn)   ! use i- shift periodicity 
    201             ishtj2 = ishtrj(jn)   ! use j- shift recv location: use ew-perio -> ok as filling of the south and north halos now done 
     219            ishti  = ishtRi(jn) 
     220            ishtj  = ishtRj(jn) 
     221            ishti2 = ishtPi(jn)   ! use i- shift periodicity 
     222            ishtj2 = ishtRj(jn)   ! use j- shift recv location: use ew-perio -> ok as filling of the south and north halos now done 
    202223            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    203224               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl) 
     
    205226         ENDIF 
    206227         IF( .NOT. l_SelfPerio(jn) .AND. l_SelfPerio(jpso)  ) THEN   ! no bi-perio but ns-perio: corners indirect definition 
    207             ishti  = ishtri(jn) 
    208             ishtj  = ishtrj(jn) 
    209             ishti2 = ishtri(jn)   ! use i- shift recv location: use ns-perio -> ok as filling of the west and east halos now done 
    210             ishtj2 = ishtpj(jn)   ! use j- shift periodicity 
     228            ishti  = ishtRi(jn) 
     229            ishtj  = ishtRj(jn) 
     230            ishti2 = ishtRi(jn)   ! use i- shift recv location: use ns-perio -> ok as filling of the west and east halos now done 
     231            ishtj2 = ishtPj(jn)   ! use j- shift periodicity 
    211232            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    212233               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl) 
     
    220241      ! 
    221242      IF( ll_IdoNFold ) THEN 
    222          IF( jpni == 1 )  THEN   ;   CALL lbc_nfd( ptab, cd_nat, psgn                  , ipf )   ! self NFold 
    223          ELSE                    ;   CALL mpp_nfd( ptab, cd_nat, psgn, ifill_nfd, zland, ipf )   ! mpi  NFold 
     243         IF( jpni == 1 )  THEN   ;   CALL lbc_nfd( ptab, cd_nat, psgn                  , ihls, ipf )   ! self NFold 
     244         ELSE                    ;   CALL mpp_nfd( ptab, cd_nat, psgn, ifill_nfd, zland, ihls, ipf )   ! mpi  NFold 
    224245         ENDIF 
    225246      ENDIF 
  • NEMO/branches/2021/dev_r14312_MPI_Interface/src/OCE/LBC/lbc_lnk_pt2pt_generic.h90

    r14349 r14363  
    11 
    2    SUBROUTINE lbc_lnk_pt2pt_/**/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, khls, lsend, lrecv ) 
    33      CHARACTER(len=*)              , INTENT(in   ) ::   cdname      ! name of the calling subroutine 
    44      TYPE(PTR_4d_/**/PRECISION),  DIMENSION(:), INTENT(inout) ::   ptab        ! pointer of arrays on which apply the b.c. 
     
    88      INTEGER ,             OPTIONAL, INTENT(in   ) ::   kfillmode   ! filling method for halo over land (default = constant) 
    99      REAL(PRECISION),      OPTIONAL, INTENT(in   ) ::   pfillval    ! background value (used at closed boundaries) 
     10      INTEGER ,             OPTIONAL, INTENT(in   ) ::   khls        ! halo size, default = nn_hls 
    1011      LOGICAL, DIMENSION(4),OPTIONAL, INTENT(in   ) ::   lsend, lrecv  ! communication with other 4 proc 
    1112      ! 
    12       INTEGER  ::   ji, jj, jk, jl, jf, jn      ! dummy loop indices 
    13       INTEGER  ::   ipk, ipl, ipf      ! dimension of the input array 
     13      INTEGER  ::     ji,   jj,  jk,  jl,  jf, jn     ! dummy loop indices 
     14      INTEGER  ::    ipi,  ipj, ipk, ipl, ipf         ! dimension of the input array 
    1415      INTEGER  ::   ip0i, ip1i, im0i, im1i 
    1516      INTEGER  ::   ip0j, ip1j, im0j, im1j 
    1617      INTEGER  ::   ishti, ishtj, ishti2, ishtj2 
    1718      INTEGER  ::   ifill_nfd, icomm, ierr 
    18       INTEGER  ::   idxs, idxr 
    19       INTEGER, DIMENSION(4)  ::   isizei, ishtsi, ishtri, ishtpi 
    20       INTEGER, DIMENSION(4)  ::   isizej, ishtsj, ishtrj, ishtpj 
    21       INTEGER, DIMENSION(4)  ::   ifill, iszall, ishts, ishtr 
     19      INTEGER  ::   ihls, idxs, idxr 
     20      INTEGER, DIMENSION(4)  ::   isizei, ishtSi, ishtRi, ishtPi 
     21      INTEGER, DIMENSION(4)  ::   isizej, ishtSj, ishtRj, ishtPj 
     22      INTEGER, DIMENSION(4)  ::   ifill, iszall, ishtS, ishtR 
    2223      INTEGER, DIMENSION(4)  ::   ireq  ! mpi_request id 
    2324      REAL(PRECISION) ::   zland 
     
    3132      ! ----------------------------------------- ! 
    3233      ! 
     34      ipi = SIZE(ptab(1)%pt4d,1) 
     35      ipj = SIZE(ptab(1)%pt4d,2) 
    3336      ipk = SIZE(ptab(1)%pt4d,3) 
    3437      ipl = SIZE(ptab(1)%pt4d,4) 
     
    3841      ! 
    3942      ! take care of optional parameters 
     43      ! 
     44      ihls = nn_hls   ! default definition 
     45      IF( PRESENT( khls ) )   ihls = khls 
     46      IF( ihls > n_hlsmax ) THEN 
     47         WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk with khls > n_hlsmax : ', khls, '>', n_hlsmax 
     48         CALL ctl_stop( 'STOP', ctmp1 ) 
     49      ENDIF 
     50      IF( ipi /= Ni_0+2*ihls ) THEN 
     51         WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk with an input array which does not match ihls along i: ', ipi, ihls, Ni_0 
     52         CALL ctl_stop( 'STOP', ctmp1 ) 
     53      ENDIF 
     54      IF( ipj /= Nj_0+2*ihls ) THEN 
     55         WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk with an input array which does not match ihls along j:', ipj, ihls , Nj_0 
     56         CALL ctl_stop( 'STOP', ctmp1 ) 
     57      ENDIF 
    4058      ! 
    4159      zland = 0._wp                                     ! land filling value: zero by default 
     
    4664         llsend(1:4) = lsend(1:4)   ;   llrecv(1:4) = lrecv(1:4) 
    4765      ELSE IF( PRESENT(lsend) .OR.  PRESENT(lrecv) ) THEN 
    48          WRITE(ctmp1,*) ' Routine ', cdname, ' is calling lbc_lnk with only one of the two arguments lsend or lrecv' 
     66         WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk with only one of the two arguments lsend or lrecv' 
    4967         CALL ctl_stop( 'STOP', ctmp1 ) 
    5068      ELSE                                                  ! default neighbours 
    51          llsend(1:4) = mpinei(1:4) >= 0 
    52          llrecv(:) = llsend(:) 
     69         llsend(:) = mpiSnei(ihls,1:4) >= 0 
     70         llrecv(:) = mpiRnei(ihls,1:4) >= 0 
    5371      END IF 
    5472      ! 
     
    7290      ! or used for periodocity (p). The localization is defined as "the bottom left corner - 1" in i and j directions. 
    7391      ! This is a shift that will be applied later in the do loops to pick-up the appropriate part of the array 
    74       !                    !                       ________________________ 
    75       ip0i =          0    !          im0j = inner |__|__|__________|__|__| 
    76       ip1i =      nn_hls   !   im1j = inner - halo |__|__|__________|__|__| 
    77       im1i = Nie0-nn_hls   !                       |  |  |          |  |  | 
    78       im0i = Nie0          !                       |  |  |          |  |  | 
    79       ip0j =          0    !                       |  |  |          |  |  | 
    80       ip1j =      nn_hls   !                       |__|__|__________|__|__| 
    81       im1j = Nje0-nn_hls   !           ip1j = halo |__|__|__________|__|__| 
    82       im0j = Nje0          !              ip0j = 0 |__|__|__________|__|__| 
    83       !                    !                    ip0i ip1i        im1i im0i 
    84       ! 
    85       !     sides:       west    east   south   north 
    86       isizei(1:4) = (/ nn_hls, nn_hls,    jpi,    jpi /)   ! i- count 
    87       isizej(1:4) = (/    jpj,    jpj, nn_hls, nn_hls /)   ! j- count 
    88       ishtsi(1:4) = (/   ip1i,   im1i,   ip0i,   ip0i /)   ! i- shift send data 
    89       ishtsj(1:4) = (/   ip0j,   ip0j,   ip1j,   im1j /)   ! j- shift send data 
    90       ishtri(1:4) = (/   ip0i,   im0i,   ip0i,   ip0i /)   ! i- shift received data location 
    91       ishtrj(1:4) = (/   ip0j,   ip0j,   ip0j,   im0j /)   ! j- shift received data location 
    92       ishtpi(1:4) = (/   im1i,   ip1i,   ip0i,   ip0i /)   ! i- shift data used for periodicity 
    93       ishtpj(1:4) = (/   ip0j,   ip0j,   im1j,   ip1j /)   ! j- shift data used for periodicity 
     92      ! 
     93      ! all definitions bellow do not refer to N[ij][se]0 so we can use it with any local value of ihls 
     94      !                   !                       ________________________ 
     95      ip0i =          0   !          im0j = inner |__|__|__________|__|__| 
     96      ip1i =       ihls   !   im1j = inner - halo |__|__|__________|__|__| 
     97      im1i = ipi-2*ihls   !                       |  |  |          |  |  | 
     98      im0i = ipi - ihls   !                       |  |  |          |  |  | 
     99      ip0j =          0   !                       |  |  |          |  |  | 
     100      ip1j =       ihls   !                       |__|__|__________|__|__| 
     101      im1j = ipj-2*ihls   !           ip1j = halo |__|__|__________|__|__| 
     102      im0j = ipj - ihls   !              ip0j = 0 |__|__|__________|__|__| 
     103      !                   !                    ip0i ip1i        im1i im0i 
     104      ! 
     105      !     sides:     west  east south north 
     106      isizei(1:4) = (/ ihls, ihls,  ipi,  ipi /)   ! i- count 
     107      isizej(1:4) = (/  ipj,  ipj, ihls, ihls /)   ! j- count 
     108      ishtSi(1:4) = (/ ip1i, im1i, ip0i, ip0i /)   ! i- shift send data 
     109      ishtSj(1:4) = (/ ip0j, ip0j, ip1j, im1j /)   ! j- shift send data 
     110      ishtRi(1:4) = (/ ip0i, im0i, ip0i, ip0i /)   ! i- shift received data location 
     111      ishtRj(1:4) = (/ ip0j, ip0j, ip0j, im0j /)   ! j- shift received data location 
     112      ishtPi(1:4) = (/ im1i, ip1i, ip0i, ip0i /)   ! i- shift data used for periodicity 
     113      ishtPj(1:4) = (/ ip0j, ip0j, im1j, ip1j /)   ! j- shift data used for periodicity 
    94114      ! 
    95115      ! -------------------------------- ! 
     
    99119      ireq(:) = MPI_REQUEST_NULL 
    100120      iszall(:) = isizei(:) * isizej(:) * ipk * ipl * ipf 
    101       ishts(1) = 0 
     121      ishtS(1) = 0 
    102122      DO jn = 2,4 
    103          ishts(jn) = ishts(jn-1) + iszall(jn-1) * COUNT( (/llsend(jn-1)/) )   ! with _alltoallv: in units of sendtype 
    104       END DO 
    105       ishtr(1) = 0 
     123         ishtS(jn) = ishtS(jn-1) + iszall(jn-1) * COUNT( (/llsend(jn-1)/) )   ! with _alltoallv: in units of sendtype 
     124      END DO 
     125      ishtR(1) = 0 
    106126      DO jn = 2,4 
    107          ishtr(jn) = ishtr(jn-1) + iszall(jn-1) * COUNT( (/llrecv(jn-1)/) )   ! with _alltoallv: in units of sendtype 
     127         ishtR(jn) = ishtR(jn-1) + iszall(jn-1) * COUNT( (/llrecv(jn-1)/) )   ! with _alltoallv: in units of sendtype 
    108128      END DO 
    109129 
     
    119139      DO jn = 1, 2 
    120140         IF( llsend(jn) ) THEN 
    121             ishti = ishtsi(jn) 
    122             ishtj = ishtsj(jn) 
     141            ishti = ishtSi(jn) 
     142            ishtj = ishtSj(jn) 
    123143            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    124144               zsnd(idxs) = ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) 
     
    134154      ! non-blocking send of the western/eastern side using local temporary arrays 
    135155      jn = jpwe 
    136       IF( llsend(jn) )   CALL MPI_ISEND( zsnd(ishts(jn)+1), iszall(jn), MPI_TYPE, mpinei(jn), 1, icomm, ireq(jn), ierr ) 
     156      IF( llsend(jn) )   CALL MPI_ISEND( zsnd(ishtS(jn)+1), iszall(jn), MPI_TYPE, mpiSnei(ihls,jn), 1, icomm, ireq(jn), ierr ) 
    137157      jn = jpea 
    138       IF( llsend(jn) )   CALL MPI_ISEND( zsnd(ishts(jn)+1), iszall(jn), MPI_TYPE, mpinei(jn), 2, icomm, ireq(jn), ierr ) 
     158      IF( llsend(jn) )   CALL MPI_ISEND( zsnd(ishtS(jn)+1), iszall(jn), MPI_TYPE, mpiSnei(ihls,jn), 2, icomm, ireq(jn), ierr ) 
    139159      ! blocking receive of the western/eastern halo in local temporary arrays 
    140160      jn = jpwe 
    141       IF( llrecv(jn) )   CALL MPI_RECV(  zrcv(ishtr(jn)+1), iszall(jn), MPI_TYPE, mpinei(jn), 2, icomm, MPI_STATUS_IGNORE, ierr ) 
     161      IF( llrecv(jn) )   CALL MPI_RECV(  zrcv(ishtR(jn)+1), iszall(jn), MPI_TYPE, mpiRnei(ihls,jn), 2, icomm, MPI_STATUS_IGNORE, ierr ) 
    142162      jn = jpea 
    143       IF( llrecv(jn) )   CALL MPI_RECV(  zrcv(ishtr(jn)+1), iszall(jn), MPI_TYPE, mpinei(jn), 1, icomm, MPI_STATUS_IGNORE, ierr ) 
     163      IF( llrecv(jn) )   CALL MPI_RECV(  zrcv(ishtR(jn)+1), iszall(jn), MPI_TYPE, mpiRnei(ihls,jn), 1, icomm, MPI_STATUS_IGNORE, ierr ) 
    144164      ! 
    145165      IF( ln_timing ) CALL tic_tac(.FALSE.) 
     
    152172      idxr = 1 
    153173      DO jn = 1, 2 
    154          ishti = ishtri(jn) 
    155          ishtj = ishtrj(jn) 
     174         ishti = ishtRi(jn) 
     175         ishtj = ishtRj(jn) 
    156176         SELECT CASE ( ifill(jn) ) 
    157177         CASE ( jpfillnothing )               ! no filling  
     
    162182            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO 
    163183         CASE ( jpfillperio )                 ! use periodicity 
    164             ishti2 = ishtpi(jn) 
    165             ishtj2 = ishtpj(jn) 
     184            ishti2 = ishtPi(jn) 
     185            ishtj2 = ishtPj(jn) 
    166186            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    167187               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl) 
    168188            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO 
    169189         CASE ( jpfillcopy  )                 ! filling with inner domain values 
    170             ishti2 = ishtsi(jn) 
    171             ishtj2 = ishtsj(jn) 
     190            ishti2 = ishtSi(jn) 
     191            ishtj2 = ishtSj(jn) 
    172192            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    173193               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl) 
     
    187207      ! 
    188208      IF( ll_IdoNFold ) THEN 
    189          IF( jpni == 1 )  THEN   ;   CALL lbc_nfd( ptab, cd_nat, psgn                  , ipf )   ! self NFold 
    190          ELSE                    ;   CALL mpp_nfd( ptab, cd_nat, psgn, ifill_nfd, zland, ipf )   ! mpi  NFold 
     209         IF( jpni == 1 )  THEN   ;   CALL lbc_nfd( ptab, cd_nat, psgn                  , ihls, ipf )   ! self NFold 
     210         ELSE                    ;   CALL mpp_nfd( ptab, cd_nat, psgn, ifill_nfd, zland, ihls, ipf )   ! mpi  NFold 
    191211         ENDIF 
    192212      ENDIF 
     
    198218      DO jn = 3, 4 
    199219         IF( llsend(jn) ) THEN 
    200             ishti = ishtsi(jn) 
    201             ishtj = ishtsj(jn) 
     220            ishti = ishtSi(jn) 
     221            ishtj = ishtSj(jn) 
    202222            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    203223               zsnd(idxs) = ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) 
     
    212232      ! non-blocking send of the western/eastern side using local temporary arrays 
    213233      jn = jpso 
    214       IF( llsend(jn) )   CALL MPI_ISEND( zsnd(ishts(jn)+1), iszall(jn), MPI_TYPE, mpinei(jn), 3, icomm, ireq(jn), ierr ) 
     234      IF( llsend(jn) )   CALL MPI_ISEND( zsnd(ishtS(jn)+1), iszall(jn), MPI_TYPE, mpiSnei(ihls,jn), 3, icomm, ireq(jn), ierr ) 
    215235      jn = jpno 
    216       IF( llsend(jn) )   CALL MPI_ISEND( zsnd(ishts(jn)+1), iszall(jn), MPI_TYPE, mpinei(jn), 4, icomm, ireq(jn), ierr ) 
     236      IF( llsend(jn) )   CALL MPI_ISEND( zsnd(ishtS(jn)+1), iszall(jn), MPI_TYPE, mpiSnei(ihls,jn), 4, icomm, ireq(jn), ierr ) 
    217237      ! blocking receive of the western/eastern halo in local temporary arrays 
    218238      jn = jpso 
    219       IF( llrecv(jn) )   CALL MPI_RECV(  zrcv(ishtr(jn)+1), iszall(jn), MPI_TYPE, mpinei(jn), 4, icomm, MPI_STATUS_IGNORE, ierr ) 
     239      IF( llrecv(jn) )   CALL MPI_RECV(  zrcv(ishtR(jn)+1), iszall(jn), MPI_TYPE, mpiRnei(ihls,jn), 4, icomm, MPI_STATUS_IGNORE, ierr ) 
    220240      jn = jpno 
    221       IF( llrecv(jn) )   CALL MPI_RECV(  zrcv(ishtr(jn)+1), iszall(jn), MPI_TYPE, mpinei(jn), 3, icomm, MPI_STATUS_IGNORE, ierr ) 
     241      IF( llrecv(jn) )   CALL MPI_RECV(  zrcv(ishtR(jn)+1), iszall(jn), MPI_TYPE, mpiRnei(ihls,jn), 3, icomm, MPI_STATUS_IGNORE, ierr ) 
    222242      ! 
    223243      IF( ln_timing ) CALL tic_tac(.FALSE.) 
     
    229249      ! 
    230250      DO jn = 3, 4 
    231          ishti = ishtri(jn) 
    232          ishtj = ishtrj(jn) 
     251         ishti = ishtRi(jn) 
     252         ishtj = ishtRj(jn) 
    233253         SELECT CASE ( ifill(jn) ) 
    234254         CASE ( jpfillnothing )               ! no filling  
     
    239259            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO 
    240260         CASE ( jpfillperio )                 ! use periodicity 
    241             ishti2 = ishtpi(jn) 
    242             ishtj2 = ishtpj(jn) 
     261            ishti2 = ishtPi(jn) 
     262            ishtj2 = ishtPj(jn) 
    243263            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    244264               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl) 
    245265            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO 
    246266         CASE ( jpfillcopy  )                 ! filling with inner domain values 
    247             ishti2 = ishtsi(jn) 
    248             ishtj2 = ishtsj(jn) 
     267            ishti2 = ishtSi(jn) 
     268            ishtj2 = ishtSj(jn) 
    249269            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn) 
    250270               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl) 
  • NEMO/branches/2021/dev_r14312_MPI_Interface/src/OCE/LBC/lbc_nfd_generic.h90

    r14349 r14363  
    11 
    2    SUBROUTINE lbc_nfd_/**/PRECISION( ptab, cd_nat, psgn, kfld ) 
     2   SUBROUTINE lbc_nfd_/**/PRECISION( ptab, cd_nat, psgn, khls, kfld ) 
    33      TYPE(PTR_4d_/**/PRECISION),  DIMENSION(:), INTENT(inout) ::   ptab        ! pointer of arrays on which apply the b.c. 
    44      CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   cd_nat      ! nature of array grid-points 
    55      REAL(PRECISION),  DIMENSION(:), INTENT(in   ) ::   psgn        ! sign used across the north fold boundary 
     6      INTEGER                       , INTENT(in   ) ::   khls        ! halo size, default = nn_hls 
    67      INTEGER                       , INTENT(in   ) ::   kfld        ! number of pt3d arrays 
    78      ! 
    89      INTEGER  ::    ji,  jj,  jk,  jl,  jf   ! dummy loop indices 
    9       INTEGER  ::       ipj, ipk, ipl, ipf   ! dimension of the input array 
     10      INTEGER  ::   ipi, ipj, ipk, ipl, ipf   ! dimension of the input array 
    1011      INTEGER  ::   ii1, ii2, ij1, ij2 
    1112      !!---------------------------------------------------------------------- 
    1213      ! 
     14      ipi = SIZE(ptab(1)%pt4d,1) 
    1315      ipj = SIZE(ptab(1)%pt4d,2) 
    1416      ipk = SIZE(ptab(1)%pt4d,3) 
    1517      ipl = SIZE(ptab(1)%pt4d,4) 
    1618      ipf = kfld 
     19      ! 
     20      IF( ipi /= Ni0glo+2*khls ) THEN 
     21         WRITE(ctmp1,*) 'lbc_nfd input array does not match khls', ipi, khls, Ni0glo 
     22         CALL ctl_stop( 'STOP', ctmp1 ) 
     23      ENDIF 
    1724      ! 
    1825      DO jf = 1, ipf                      ! Loop on the number of arrays to be treated 
     
    2431               DO jl = 1, ipl; DO jk = 1, ipk 
    2532                  ! 
    26                   ! last nn_hls lines (from ipj to ipj-nn_hls+1) : full 
    27                     DO jj = 1, nn_hls 
    28                        ij1 = ipj            - jj + 1       ! ends at: ipj - nn_hls + 1 
    29                      ij2 = ipj - 2*nn_hls + jj - 1       ! ends at: ipj - 2*nn_hls + nn_hls - 1 = ipj - nn_hls - 1 
    30                      ! 
    31                      DO ji = 1, nn_hls            ! first nn_hls points 
    32                         ii1 =                ji          ! ends at: nn_hls 
    33                         ii2 = 2*nn_hls + 2 - ji          ! ends at: 2*nn_hls + 2 - nn_hls = nn_hls + 2 
    34                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    35                      END DO 
    36                      DO ji = 1, 1                 ! point nn_hls+1 
    37                         ii1 = nn_hls + ji 
     33                  ! last khls lines (from ipj to ipj-khls+1) : full 
     34                    DO jj = 1, khls 
     35                       ij1 = ipj          - jj + 1         ! ends at: ipj - khls + 1 
     36                     ij2 = ipj - 2*khls + jj - 1         ! ends at: ipj - 2*khls + khls - 1 = ipj - khls - 1 
     37                     ! 
     38                     DO ji = 1, khls              ! first khls points 
     39                        ii1 =              ji            ! ends at: khls 
     40                        ii2 = 2*khls + 2 - ji            ! ends at: 2*khls + 2 - khls = khls + 2 
     41                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     42                     END DO 
     43                     DO ji = 1, 1                 ! point khls+1 
     44                        ii1 = khls + ji 
    3845                        ii2 = ii1 
    3946                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    4047                     END DO 
    41                      DO ji = 1, Ni0glo - 1        ! points from nn_hls+2 to jpiglo - nn_hls   (note: Ni0glo = jpiglo - 2*nn_hls) 
    42                         ii1 = 2 + nn_hls      + ji - 1   ! ends at: 2 + nn_hls + jpiglo - 2*nn_hls - 1 - 1 = jpiglo - nn_hls 
    43                         ii2 = jpiglo - nn_hls - ji + 1   ! ends at: jpiglo - nn_hls - ( jpiglo - 2*nn_hls - 1 ) + 1 = nn_hls + 2 
    44                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    45                      END DO 
    46                      DO ji = 1, 1                 ! point jpiglo - nn_hls + 1 
    47                         ii1 = jpiglo - nn_hls + ji 
    48                         ii2 =          nn_hls + ji 
    49                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    50                      END DO 
    51                      DO ji = 1, nn_hls-1          ! last nn_hls-1 points 
    52                         ii1 = jpiglo - nn_hls + 1 + ji   ! ends at: jpiglo - nn_hls + 1 + nn_hls - 1 = jpiglo 
    53                         ii2 = jpiglo - nn_hls + 1 - ji   ! ends at: jpiglo - nn_hls + 1 - nn_hls + 1 = jpiglo - 2*nn_hls + 2 
    54                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    55                      END DO 
    56                   END DO 
    57                   ! 
    58                   ! line number ipj-nn_hls : right half 
    59                     DO jj = 1, 1 
    60                      ij1 = ipj - nn_hls 
    61                      ij2 = ij1   ! same line 
    62                      ! 
    63                      DO ji = 1, Ni0glo/2-1        ! points from jpiglo/2+2 to jpiglo - nn_hls   (note: Ni0glo = jpiglo - 2*nn_hls) 
    64                         ii1 = jpiglo/2 + ji + 1          ! ends at: jpiglo/2 + (jpiglo/2 - nn_hls - 1) + 1 = jpiglo - nn_hls 
    65                         ii2 = jpiglo/2 - ji + 1          ! ends at: jpiglo/2 - (jpiglo/2 - nn_hls - 1) + 1 = nn_hls + 2 
    66                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    67                      END DO 
    68                      DO ji = 1, nn_hls            ! first nn_hls points: redo them just in case (if e-w periodocity already done) 
    69                         !                         ! as we just changed points jpiglo-2nn_hls+1 to jpiglo-nn_hls   
    70                         ii1 =                ji          ! ends at: nn_hls 
    71                         ii2 = 2*nn_hls + 2 - ji          ! ends at: 2*nn_hls + 2 - nn_hls = nn_hls + 2 
    72                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    73                      END DO 
    74                      !                            ! last nn_hls-1 points: have been / will done by e-w periodicity  
     48                     DO ji = 1, Ni0glo - 1        ! points from khls+2 to ipi - khls   (note: Ni0glo = ipi - 2*khls) 
     49                        ii1 =   2 + khls + ji - 1        ! ends at: 2 + khls + ipi - 2*khls - 1 - 1 = ipi - khls 
     50                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls - ( ipi - 2*khls - 1 ) + 1 = khls + 2 
     51                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     52                     END DO 
     53                     DO ji = 1, 1                 ! point ipi - khls + 1 
     54                        ii1 = ipi - khls + ji 
     55                        ii2 =          khls + ji 
     56                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     57                     END DO 
     58                     DO ji = 1, khls-1            ! last khls-1 points 
     59                        ii1 = ipi - khls + 1 + ji        ! ends at: ipi - khls + 1 + khls - 1 = ipi 
     60                        ii2 = ipi - khls + 1 - ji        ! ends at: ipi - khls + 1 - khls + 1 = ipi - 2*khls + 2 
     61                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     62                     END DO 
     63                  END DO 
     64                  ! 
     65                  ! line number ipj-khls : right half 
     66                    DO jj = 1, 1 
     67                     ij1 = ipj - khls 
     68                     ij2 = ij1   ! same line 
     69                     ! 
     70                     DO ji = 1, Ni0glo/2-1        ! points from ipi/2+2 to ipi - khls   (note: Ni0glo = ipi - 2*khls) 
     71                        ii1 = ipi/2 + ji + 1             ! ends at: ipi/2 + (ipi/2 - khls - 1) + 1 = ipi - khls 
     72                        ii2 = ipi/2 - ji + 1             ! ends at: ipi/2 - (ipi/2 - khls - 1) + 1 = khls + 2 
     73                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     74                     END DO 
     75                     DO ji = 1, khls              ! first khls points: redo them just in case (if e-w periodocity already done) 
     76                        !                         ! as we just changed points ipi-2khls+1 to ipi-khls   
     77                        ii1 =              ji            ! ends at: khls 
     78                        ii2 = 2*khls + 2 - ji            ! ends at: 2*khls + 2 - khls = khls + 2 
     79                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     80                     END DO 
     81                     !                            ! last khls-1 points: have been / will done by e-w periodicity  
    7582                  END DO 
    7683                  ! 
     
    7986               DO jl = 1, ipl; DO jk = 1, ipk 
    8087                  ! 
    81                   ! last nn_hls lines (from ipj to ipj-nn_hls+1) : full 
    82                     DO jj = 1, nn_hls 
    83                        ij1 = ipj            - jj + 1       ! ends at: ipj - nn_hls + 1 
    84                      ij2 = ipj - 2*nn_hls + jj - 1       ! ends at: ipj - 2*nn_hls + nn_hls - 1 = ipj - nn_hls - 1 
    85                      ! 
    86                      DO ji = 1, nn_hls            ! first nn_hls points 
    87                         ii1 =                ji          ! ends at: nn_hls 
    88                         ii2 = 2*nn_hls + 1 - ji          ! ends at: 2*nn_hls + 1 - nn_hls = nn_hls + 1 
    89                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    90                      END DO 
    91                      DO ji = 1, Ni0glo            ! points from nn_hls to jpiglo - nn_hls   (note: Ni0glo = jpiglo - 2*nn_hls) 
    92                         ii1 = nn_hls          + ji       ! ends at: nn_hls + jpiglo - 2*nn_hls = jpiglo - nn_hls 
    93                         ii2 = jpiglo - nn_hls - ji + 1   ! ends at: jpiglo - nn_hls - ( jpiglo - 2*nn_hls ) + 1 = nn_hls + 1 
    94                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    95                      END DO 
    96                      DO ji = 1, nn_hls            ! last nn_hls points 
    97                         ii1 = jpiglo - nn_hls + ji       ! ends at: jpiglo - nn_hls + nn_hls = jpiglo 
    98                         ii2 = jpiglo - nn_hls + 1 - ji   ! ends at: jpiglo - nn_hls + 1 - nn_hls = jpiglo - 2*nn_hls + 1 
    99                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    100                      END DO 
    101                   END DO 
    102                   ! 
    103                   ! line number ipj-nn_hls : right half 
    104                     DO jj = 1, 1 
    105                      ij1 = ipj - nn_hls 
    106                      ij2 = ij1   ! same line 
    107                      ! 
    108                      DO ji = 1, Ni0glo/2          ! points from jpiglo/2+1 to jpiglo - nn_hls   (note: Ni0glo = jpiglo - 2*nn_hls) 
    109                         ii1 = jpiglo/2 + ji              ! ends at: jpiglo/2 + (jpiglo/2 - nn_hls) = jpiglo - nn_hls 
    110                         ii2 = jpiglo/2 - ji + 1          ! ends at: jpiglo/2 - (jpiglo/2 - nn_hls) + 1 = nn_hls + 1 
    111                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    112                      END DO 
    113                      DO ji = 1, nn_hls            ! first nn_hls points: redo them just in case (if e-w periodocity already done) 
    114                         !                         ! as we just changed points jpiglo-2nn_hls+1 to jpiglo-nn_hls   
    115                         ii1 =                ji          ! ends at: nn_hls 
    116                         ii2 = 2*nn_hls + 1 - ji          ! ends at: 2*nn_hls + 1 - nn_hls = nn_hls + 1 
    117                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    118                      END DO 
    119                      !                            ! last nn_hls-1 points: have been / will done by e-w periodicity  
     88                  ! last khls lines (from ipj to ipj-khls+1) : full 
     89                    DO jj = 1, khls 
     90                       ij1 = ipj          - jj + 1         ! ends at: ipj - khls + 1 
     91                     ij2 = ipj - 2*khls + jj - 1         ! ends at: ipj - 2*khls + khls - 1 = ipj - khls - 1 
     92                     ! 
     93                     DO ji = 1, khls              ! first khls points 
     94                        ii1 =              ji            ! ends at: khls 
     95                        ii2 = 2*khls + 1 - ji            ! ends at: 2*khls + 1 - khls = khls + 1 
     96                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     97                     END DO 
     98                     DO ji = 1, Ni0glo            ! points from khls to ipi - khls   (note: Ni0glo = ipi - 2*khls) 
     99                        ii1 =       khls + ji            ! ends at: khls + ipi - 2*khls = ipi - khls 
     100                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls - ( ipi - 2*khls ) + 1 = khls + 1 
     101                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     102                     END DO 
     103                     DO ji = 1, khls              ! last khls points 
     104                        ii1 = ipi - khls + ji            ! ends at: ipi - khls + khls = ipi 
     105                        ii2 = ipi - khls + 1 - ji        ! ends at: ipi - khls + 1 - khls = ipi - 2*khls + 1 
     106                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     107                     END DO 
     108                  END DO 
     109                  ! 
     110                  ! line number ipj-khls : right half 
     111                    DO jj = 1, 1 
     112                     ij1 = ipj - khls 
     113                     ij2 = ij1   ! same line 
     114                     ! 
     115                     DO ji = 1, Ni0glo/2          ! points from ipi/2+1 to ipi - khls   (note: Ni0glo = ipi - 2*khls) 
     116                        ii1 = ipi/2 + ji                 ! ends at: ipi/2 + (ipi/2 - khls) = ipi - khls 
     117                        ii2 = ipi/2 - ji + 1             ! ends at: ipi/2 - (ipi/2 - khls) + 1 = khls + 1 
     118                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     119                     END DO 
     120                     DO ji = 1, khls              ! first khls points: redo them just in case (if e-w periodocity already done) 
     121                        !                         ! as we just changed points ipi-2khls+1 to ipi-khls   
     122                        ii1 =              ji            ! ends at: khls 
     123                        ii2 = 2*khls + 1 - ji            ! ends at: 2*khls + 1 - khls = khls + 1 
     124                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     125                     END DO 
     126                     !                            ! last khls-1 points: have been / will done by e-w periodicity  
    120127                  END DO 
    121128                  ! 
     
    124131               DO jl = 1, ipl; DO jk = 1, ipk 
    125132                  ! 
    126                   ! last nn_hls+1 lines (from ipj to ipj-nn_hls) : full 
    127                     DO jj = 1, nn_hls+1 
    128                        ij1 = ipj            - jj + 1       ! ends at: ipj - ( nn_hls + 1 ) + 1 = ipj - nn_hls 
    129                      ij2 = ipj - 2*nn_hls + jj - 2       ! ends at: ipj - 2*nn_hls + nn_hls + 1 - 2 = ipj - nn_hls - 1 
    130                      ! 
    131                      DO ji = 1, nn_hls            ! first nn_hls points 
    132                         ii1 =                ji          ! ends at: nn_hls 
    133                         ii2 = 2*nn_hls + 2 - ji          ! ends at: 2*nn_hls + 2 - nn_hls = nn_hls + 2 
    134                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    135                      END DO 
    136                      DO ji = 1, 1                 ! point nn_hls+1 
    137                         ii1 = nn_hls + ji 
     133                  ! last khls+1 lines (from ipj to ipj-khls) : full 
     134                    DO jj = 1, khls+1 
     135                       ij1 = ipj          - jj + 1         ! ends at: ipj - ( khls + 1 ) + 1 = ipj - khls 
     136                     ij2 = ipj - 2*khls + jj - 2         ! ends at: ipj - 2*khls + khls + 1 - 2 = ipj - khls - 1 
     137                     ! 
     138                     DO ji = 1, khls              ! first khls points 
     139                        ii1 =              ji            ! ends at: khls 
     140                        ii2 = 2*khls + 2 - ji            ! ends at: 2*khls + 2 - khls = khls + 2 
     141                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     142                     END DO 
     143                     DO ji = 1, 1                 ! point khls+1 
     144                        ii1 = khls + ji 
    138145                        ii2 = ii1 
    139146                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    140147                     END DO 
    141                      DO ji = 1, Ni0glo - 1        ! points from nn_hls+2 to jpiglo - nn_hls   (note: Ni0glo = jpiglo - 2*nn_hls) 
    142                         ii1 = 2 + nn_hls      + ji - 1   ! ends at: 2 + nn_hls + jpiglo - 2*nn_hls - 1 - 1 = jpiglo - nn_hls 
    143                         ii2 = jpiglo - nn_hls - ji + 1   ! ends at: jpiglo - nn_hls - ( jpiglo - 2*nn_hls - 1 ) + 1 = nn_hls + 2 
    144                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    145                      END DO 
    146                      DO ji = 1, 1                 ! point jpiglo - nn_hls + 1 
    147                         ii1 = jpiglo - nn_hls + ji 
    148                         ii2 =          nn_hls + ji 
    149                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    150                      END DO 
    151                      DO ji = 1, nn_hls-1          ! last nn_hls-1 points 
    152                         ii1 = jpiglo - nn_hls + 1 + ji   ! ends at: jpiglo - nn_hls + 1 + nn_hls - 1 = jpiglo 
    153                         ii2 = jpiglo - nn_hls + 1 - ji   ! ends at: jpiglo - nn_hls + 1 - nn_hls + 1 = jpiglo - 2*nn_hls + 2 
     148                     DO ji = 1, Ni0glo - 1        ! points from khls+2 to ipi - khls   (note: Ni0glo = ipi - 2*khls) 
     149                        ii1 =   2 + khls + ji - 1        ! ends at: 2 + khls + ipi - 2*khls - 1 - 1 = ipi - khls 
     150                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls - ( ipi - 2*khls - 1 ) + 1 = khls + 2 
     151                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     152                     END DO 
     153                     DO ji = 1, 1                 ! point ipi - khls + 1 
     154                        ii1 = ipi - khls + ji 
     155                        ii2 =          khls + ji 
     156                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     157                     END DO 
     158                     DO ji = 1, khls-1            ! last khls-1 points 
     159                        ii1 = ipi - khls + 1 + ji        ! ends at: ipi - khls + 1 + khls - 1 = ipi 
     160                        ii2 = ipi - khls + 1 - ji        ! ends at: ipi - khls + 1 - khls + 1 = ipi - 2*khls + 2 
    154161                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    155162                     END DO 
     
    160167               DO jl = 1, ipl; DO jk = 1, ipk 
    161168                  ! 
    162                   ! last nn_hls+1 lines (from ipj to ipj-nn_hls) : full 
    163                     DO jj = 1, nn_hls+1 
    164                        ij1 = ipj            - jj + 1       ! ends at: ipj - ( nn_hls + 1 ) + 1 = ipj - nn_hls 
    165                      ij2 = ipj - 2*nn_hls + jj - 2       ! ends at: ipj - 2*nn_hls + nn_hls + 1 - 2 = ipj - nn_hls - 1 
    166                      ! 
    167                      DO ji = 1, nn_hls            ! first nn_hls points 
    168                         ii1 =                ji          ! ends at: nn_hls 
    169                         ii2 = 2*nn_hls + 1 - ji          ! ends at: 2*nn_hls + 1 - nn_hls = nn_hls + 1 
    170                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    171                      END DO 
    172                      DO ji = 1, Ni0glo            ! points from nn_hls to jpiglo - nn_hls   (note: Ni0glo = jpiglo - 2*nn_hls) 
    173                         ii1 = nn_hls          + ji       ! ends at: nn_hls + jpiglo - 2*nn_hls = jpiglo - nn_hls 
    174                         ii2 = jpiglo - nn_hls - ji + 1   ! ends at: jpiglo - nn_hls - ( jpiglo - 2*nn_hls ) + 1 = nn_hls + 1 
    175                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    176                      END DO 
    177                      DO ji = 1, nn_hls            ! last nn_hls points 
    178                         ii1 = jpiglo - nn_hls + ji       ! ends at: jpiglo - nn_hls + nn_hls = jpiglo 
    179                         ii2 = jpiglo - nn_hls + 1 - ji   ! ends at: jpiglo - nn_hls + 1 - nn_hls = jpiglo - 2*nn_hls + 1 
     169                  ! last khls+1 lines (from ipj to ipj-khls) : full 
     170                    DO jj = 1, khls+1 
     171                       ij1 = ipj          - jj + 1         ! ends at: ipj - ( khls + 1 ) + 1 = ipj - khls 
     172                     ij2 = ipj - 2*khls + jj - 2         ! ends at: ipj - 2*khls + khls + 1 - 2 = ipj - khls - 1 
     173                     ! 
     174                     DO ji = 1, khls              ! first khls points 
     175                        ii1 =              ji            ! ends at: khls 
     176                        ii2 = 2*khls + 1 - ji            ! ends at: 2*khls + 1 - khls = khls + 1 
     177                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     178                     END DO 
     179                     DO ji = 1, Ni0glo            ! points from khls to ipi - khls   (note: Ni0glo = ipi - 2*khls) 
     180                        ii1 =       khls + ji            ! ends at: khls + ipi - 2*khls = ipi - khls 
     181                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls - ( ipi - 2*khls ) + 1 = khls + 1 
     182                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     183                     END DO 
     184                     DO ji = 1, khls              ! last khls points 
     185                        ii1 = ipi - khls + ji            ! ends at: ipi - khls + khls = ipi 
     186                        ii2 = ipi - khls + 1 - ji        ! ends at: ipi - khls + 1 - khls = ipi - 2*khls + 1 
    180187                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    181188                     END DO 
     
    193200               DO jl = 1, ipl; DO jk = 1, ipk 
    194201                  ! 
    195                   ! first: line number ipj-nn_hls : 3 points 
    196                     DO jj = 1, 1 
    197                      ij1 = ipj - nn_hls 
    198                      ij2 = ij1   ! same line 
    199                      ! 
    200                      DO ji = 1, 1            ! points from jpiglo/2+1 
    201                         ii1 = jpiglo/2 + ji 
    202                         ii2 = jpiglo/2 - ji + 1 
    203                         ptab(jf)%pt4d(ii1,ij1,jk,jl) =              ptab(jf)%pt4d(ii2,ij2,jk,jl)   ! Warning: pb with sign... 
    204                      END DO 
    205                      DO ji = 1, 1            ! points jpiglo - nn_hls 
    206                         ii1 = jpiglo - nn_hls + ji - 1 
    207                         ii2 =          nn_hls + ji 
    208                         ptab(jf)%pt4d(ii1,ij1,jk,jl) =              ptab(jf)%pt4d(ii2,ij2,jk,jl)   ! Warning: pb with sign... 
    209                      END DO 
    210                      DO ji = 1, 1            ! point nn_hls: redo it just in case (if e-w periodocity already done) 
    211                         !                    ! as we just changed point jpiglo - nn_hls 
    212                         ii1 = nn_hls + ji - 1 
    213                         ii2 = nn_hls + ji 
    214                         ptab(jf)%pt4d(ii1,ij1,jk,jl) =              ptab(jf)%pt4d(ii2,ij2,jk,jl)   ! Warning: pb with sign... 
    215                      END DO 
    216                   END DO 
    217                   ! 
    218                   ! Second: last nn_hls lines (from ipj to ipj-nn_hls+1) : full 
    219                     DO jj = 1, nn_hls 
    220                        ij1 = ipj + 1        - jj           ! ends at: ipj + 1 - nn_hls 
    221                      ij2 = ipj - 2*nn_hls + jj           ! ends at: ipj - 2*nn_hls + nn_hls = ipj - nn_hls 
    222                      ! 
    223                      DO ji = 1, nn_hls            ! first nn_hls points 
    224                         ii1 =                ji          ! ends at: nn_hls 
    225                         ii2 = 2*nn_hls + 1 - ji          ! ends at: 2*nn_hls + 1 - nn_hls = nn_hls + 1 
    226                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    227                      END DO 
    228                      DO ji = 1, Ni0glo            ! points from nn_hls to jpiglo - nn_hls   (note: Ni0glo = jpiglo - 2*nn_hls) 
    229                         ii1 = nn_hls          + ji       ! ends at: nn_hls + jpiglo - 2*nn_hls = jpiglo - nn_hls 
    230                         ii2 = jpiglo - nn_hls - ji + 1   ! ends at: jpiglo - nn_hls - ( jpiglo - 2*nn_hls ) + 1 = nn_hls + 1 
    231                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    232                      END DO 
    233                      DO ji = 1, nn_hls            ! last nn_hls points 
    234                         ii1 = jpiglo - nn_hls + ji       ! ends at: jpiglo - nn_hls + nn_hls = jpiglo 
    235                         ii2 = jpiglo - nn_hls + 1 - ji   ! ends at: jpiglo - nn_hls + 1 - nn_hls = jpiglo - 2*nn_hls + 1 
     202                  ! first: line number ipj-khls : 3 points 
     203                    DO jj = 1, 1 
     204                     ij1 = ipj - khls 
     205                     ij2 = ij1   ! same line 
     206                     ! 
     207                     DO ji = 1, 1                 ! points from ipi/2+1 
     208                        ii1 = ipi/2 + ji 
     209                        ii2 = ipi/2 - ji + 1 
     210                        ptab(jf)%pt4d(ii1,ij1,jk,jl) =            ptab(jf)%pt4d(ii2,ij2,jk,jl)   ! Warning: pb with sign... 
     211                     END DO 
     212                     DO ji = 1, 1                 ! points ipi - khls 
     213                        ii1 = ipi - khls + ji - 1 
     214                        ii2 =          khls + ji 
     215                        ptab(jf)%pt4d(ii1,ij1,jk,jl) =            ptab(jf)%pt4d(ii2,ij2,jk,jl)   ! Warning: pb with sign... 
     216                     END DO 
     217                     DO ji = 1, 1                 ! point khls: redo it just in case (if e-w periodocity already done) 
     218                        !                         ! as we just changed point ipi - khls 
     219                        ii1 = khls + ji - 1 
     220                        ii2 = khls + ji 
     221                        ptab(jf)%pt4d(ii1,ij1,jk,jl) =            ptab(jf)%pt4d(ii2,ij2,jk,jl)   ! Warning: pb with sign... 
     222                     END DO 
     223                  END DO 
     224                  ! 
     225                  ! Second: last khls lines (from ipj to ipj-khls+1) : full 
     226                    DO jj = 1, khls 
     227                       ij1 = ipj + 1      - jj             ! ends at: ipj + 1 - khls 
     228                     ij2 = ipj - 2*khls + jj             ! ends at: ipj - 2*khls + khls = ipj - khls 
     229                     ! 
     230                     DO ji = 1, khls              ! first khls points 
     231                        ii1 =              ji            ! ends at: khls 
     232                        ii2 = 2*khls + 1 - ji            ! ends at: 2*khls + 1 - khls = khls + 1 
     233                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     234                     END DO 
     235                     DO ji = 1, Ni0glo            ! points from khls to ipi - khls   (note: Ni0glo = ipi - 2*khls) 
     236                        ii1 =       khls + ji            ! ends at: khls + ipi - 2*khls = ipi - khls 
     237                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls - ( ipi - 2*khls ) + 1 = khls + 1 
     238                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     239                     END DO 
     240                     DO ji = 1, khls              ! last khls points 
     241                        ii1 = ipi - khls + ji            ! ends at: ipi - khls + khls = ipi 
     242                        ii2 = ipi - khls + 1 - ji        ! ends at: ipi - khls + 1 - khls = ipi - 2*khls + 1 
    236243                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    237244                     END DO 
     
    242249               DO jl = 1, ipl; DO jk = 1, ipk 
    243250                  ! 
    244                   ! last nn_hls lines (from ipj to ipj-nn_hls+1) : full 
    245                     DO jj = 1, nn_hls 
    246                        ij1 = ipj + 1        - jj           ! ends at: ipj + 1 - nn_hls 
    247                      ij2 = ipj - 2*nn_hls + jj           ! ends at: ipj - 2*nn_hls + nn_hls = ipj - nn_hls 
    248                      ! 
    249                      DO ji = 1, nn_hls-1          ! first nn_hls-1 points 
    250                         ii1 =            ji              ! ends at: nn_hls-1 
    251                         ii2 = 2*nn_hls - ji              ! ends at: 2*nn_hls - ( nn_hls - 1 ) = nn_hls + 1 
    252                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    253                      END DO 
    254                      DO ji = 1, 1                 ! point nn_hls 
    255                         ii1 = nn_hls + ji - 1 
    256                         ii2 = jpiglo - ii1 
    257                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    258                      END DO 
    259                      DO ji = 1, Ni0glo - 1        ! points from nn_hls+1 to jpiglo - nn_hls - 1  (note: Ni0glo = jpiglo - 2*nn_hls) 
    260                         ii1 =          nn_hls + ji       ! ends at: nn_hls + ( jpiglo - 2*nn_hls - 1 ) = jpiglo - nn_hls - 1 
    261                         ii2 = jpiglo - nn_hls - ji       ! ends at: jpiglo - nn_hls - ( jpiglo - 2*nn_hls - 1 ) = nn_hls + 1 
    262                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    263                      END DO 
    264                      DO ji = 1, 1                 ! point jpiglo - nn_hls 
    265                         ii1 = jpiglo - nn_hls + ji - 1 
     251                  ! last khls lines (from ipj to ipj-khls+1) : full 
     252                    DO jj = 1, khls 
     253                       ij1 = ipj + 1      - jj             ! ends at: ipj + 1 - khls 
     254                     ij2 = ipj - 2*khls + jj             ! ends at: ipj - 2*khls + khls = ipj - khls 
     255                     ! 
     256                     DO ji = 1, khls-1            ! first khls-1 points 
     257                        ii1 =          ji                ! ends at: khls-1 
     258                        ii2 = 2*khls - ji                ! ends at: 2*khls - ( khls - 1 ) = khls + 1 
     259                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     260                     END DO 
     261                     DO ji = 1, 1                 ! point khls 
     262                        ii1 = khls + ji - 1 
     263                        ii2 = ipi - ii1 
     264                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     265                     END DO 
     266                     DO ji = 1, Ni0glo - 1        ! points from khls+1 to ipi - khls - 1  (note: Ni0glo = ipi - 2*khls) 
     267                        ii1 =       khls + ji            ! ends at: khls + ( ipi - 2*khls - 1 ) = ipi - khls - 1 
     268                        ii2 = ipi - khls - ji            ! ends at: ipi - khls - ( ipi - 2*khls - 1 ) = khls + 1 
     269                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     270                     END DO 
     271                     DO ji = 1, 1                 ! point ipi - khls 
     272                        ii1 = ipi - khls + ji - 1 
    266273                        ii2 = ii1 
    267274                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    268275                     END DO 
    269                      DO ji = 1, nn_hls            ! last nn_hls points 
    270                         ii1 = jpiglo - nn_hls + ji       ! ends at: jpiglo - nn_hls + nn_hls = jpiglo 
    271                         ii2 = jpiglo - nn_hls - ji       ! ends at: jpiglo - nn_hls - nn_hls = jpiglo - 2*nn_hls 
     276                     DO ji = 1, khls              ! last khls points 
     277                        ii1 = ipi - khls + ji            ! ends at: ipi - khls + khls = ipi 
     278                        ii2 = ipi - khls - ji            ! ends at: ipi - khls - khls = ipi - 2*khls 
    272279                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    273280                     END DO 
     
    278285               DO jl = 1, ipl; DO jk = 1, ipk 
    279286                  ! 
    280                   ! last nn_hls lines (from ipj to ipj-nn_hls+1) : full 
    281                     DO jj = 1, nn_hls 
    282                        ij1 = ipj            - jj + 1       ! ends at: ipj - nn_hls + 1 
    283                      ij2 = ipj - 2*nn_hls + jj - 1       ! ends at: ipj - 2*nn_hls + nn_hls - 1 = ipj - nn_hls - 1 
    284                      ! 
    285                      DO ji = 1, nn_hls            ! first nn_hls points 
    286                         ii1 =                ji          ! ends at: nn_hls 
    287                         ii2 = 2*nn_hls + 1 - ji          ! ends at: 2*nn_hls + 1 - nn_hls = nn_hls + 1 
    288                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    289                      END DO 
    290                      DO ji = 1, Ni0glo            ! points from nn_hls to jpiglo - nn_hls   (note: Ni0glo = jpiglo - 2*nn_hls) 
    291                         ii1 = nn_hls          + ji       ! ends at: nn_hls + jpiglo - 2*nn_hls = jpiglo - nn_hls 
    292                         ii2 = jpiglo - nn_hls - ji + 1   ! ends at: jpiglo - nn_hls - ( jpiglo - 2*nn_hls ) + 1 = nn_hls + 1 
    293                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    294                      END DO 
    295                      DO ji = 1, nn_hls            ! last nn_hls points 
    296                         ii1 = jpiglo - nn_hls + ji       ! ends at: jpiglo - nn_hls + nn_hls = jpiglo 
    297                         ii2 = jpiglo - nn_hls + 1 - ji   ! ends at: jpiglo - nn_hls + 1 - nn_hls = jpiglo - 2*nn_hls + 1 
     287                  ! last khls lines (from ipj to ipj-khls+1) : full 
     288                    DO jj = 1, khls 
     289                       ij1 = ipj          - jj + 1         ! ends at: ipj - khls + 1 
     290                     ij2 = ipj - 2*khls + jj - 1         ! ends at: ipj - 2*khls + khls - 1 = ipj - khls - 1 
     291                     ! 
     292                     DO ji = 1, khls              ! first khls points 
     293                        ii1 =              ji            ! ends at: khls 
     294                        ii2 = 2*khls + 1 - ji            ! ends at: 2*khls + 1 - khls = khls + 1 
     295                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     296                     END DO 
     297                     DO ji = 1, Ni0glo            ! points from khls to ipi - khls   (note: Ni0glo = ipi - 2*khls) 
     298                        ii1 =       khls + ji          ! ends at: khls + ipi - 2*khls = ipi - khls 
     299                        ii2 = ipi - khls - ji + 1      ! ends at: ipi - khls - ( ipi - 2*khls ) + 1 = khls + 1 
     300                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     301                     END DO 
     302                     DO ji = 1, khls            ! last khls points 
     303                        ii1 = ipi - khls + ji          ! ends at: ipi - khls + khls = ipi 
     304                        ii2 = ipi - khls + 1 - ji      ! ends at: ipi - khls + 1 - khls = ipi - 2*khls + 1 
    298305                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    299306                     END DO 
    300307                  END DO    
    301308                  ! 
    302                   ! line number ipj-nn_hls : right half 
    303                     DO jj = 1, 1 
    304                      ij1 = ipj - nn_hls 
    305                      ij2 = ij1   ! same line 
    306                      ! 
    307                      DO ji = 1, Ni0glo/2          ! points from jpiglo/2+1 to jpiglo - nn_hls   (note: Ni0glo = jpiglo - 2*nn_hls) 
    308                         ii1 = jpiglo/2 + ji              ! ends at: jpiglo/2 + (jpiglo/2 - nn_hls) = jpiglo - nn_hls 
    309                         ii2 = jpiglo/2 - ji + 1          ! ends at: jpiglo/2 - (jpiglo/2 - nn_hls) + 1 = nn_hls + 1 
    310                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    311                      END DO 
    312                      DO ji = 1, nn_hls            ! first nn_hls points: redo them just in case (if e-w periodocity already done) 
    313                         !                         ! as we just changed points jpiglo-2nn_hls+1 to jpiglo-nn_hls   
    314                         ii1 =                ji          ! ends at: nn_hls 
    315                         ii2 = 2*nn_hls + 1 - ji          ! ends at: 2*nn_hls + 1 - nn_hls = nn_hls + 1 
    316                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    317                      END DO 
    318                      !                            ! last nn_hls points: have been / will done by e-w periodicity  
     309                  ! line number ipj-khls : right half 
     310                    DO jj = 1, 1 
     311                     ij1 = ipj - khls 
     312                     ij2 = ij1   ! same line 
     313                     ! 
     314                     DO ji = 1, Ni0glo/2          ! points from ipi/2+1 to ipi - khls   (note: Ni0glo = ipi - 2*khls) 
     315                        ii1 = ipi/2 + ji                 ! ends at: ipi/2 + (ipi/2 - khls) = ipi - khls 
     316                        ii2 = ipi/2 - ji + 1             ! ends at: ipi/2 - (ipi/2 - khls) + 1 = khls + 1 
     317                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     318                     END DO 
     319                     DO ji = 1, khls              ! first khls points: redo them just in case (if e-w periodocity already done) 
     320                        !                         ! as we just changed points ipi-2khls+1 to ipi-khls   
     321                        ii1 =              ji            ! ends at: khls 
     322                        ii2 = 2*khls + 1 - ji            ! ends at: 2*khls + 1 - khls = khls + 1 
     323                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     324                     END DO 
     325                     !                            ! last khls points: have been / will done by e-w periodicity  
    319326                  END DO 
    320327                  ! 
     
    323330               DO jl = 1, ipl; DO jk = 1, ipk 
    324331                  ! 
    325                   ! last nn_hls lines (from ipj to ipj-nn_hls+1) : full 
    326                     DO jj = 1, nn_hls 
    327                        ij1 = ipj            - jj + 1       ! ends at: ipj - nn_hls + 1 
    328                      ij2 = ipj - 2*nn_hls + jj - 1       ! ends at: ipj - 2*nn_hls + nn_hls - 1 = ipj - nn_hls - 1 
    329                      ! 
    330                      DO ji = 1, nn_hls-1          ! first nn_hls-1 points 
    331                         ii1 =            ji              ! ends at: nn_hls-1 
    332                         ii2 = 2*nn_hls - ji              ! ends at: 2*nn_hls - ( nn_hls - 1 ) = nn_hls + 1 
    333                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    334                      END DO 
    335                      DO ji = 1, 1                 ! point nn_hls 
    336                         ii1 = nn_hls + ji - 1 
    337                         ii2 = jpiglo - ii1 
    338                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    339                      END DO 
    340                      DO ji = 1, Ni0glo - 1        ! points from nn_hls+1 to jpiglo - nn_hls - 1  (note: Ni0glo = jpiglo - 2*nn_hls) 
    341                         ii1 =          nn_hls + ji       ! ends at: nn_hls + ( jpiglo - 2*nn_hls - 1 ) = jpiglo - nn_hls - 1 
    342                         ii2 = jpiglo - nn_hls - ji       ! ends at: jpiglo - nn_hls - ( jpiglo - 2*nn_hls - 1 ) = nn_hls + 1 
    343                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    344                      END DO 
    345                      DO ji = 1, 1                 ! point jpiglo - nn_hls 
    346                         ii1 = jpiglo - nn_hls + ji - 1 
     332                  ! last khls lines (from ipj to ipj-khls+1) : full 
     333                    DO jj = 1, khls 
     334                       ij1 = ipj          - jj + 1         ! ends at: ipj - khls + 1 
     335                     ij2 = ipj - 2*khls + jj - 1         ! ends at: ipj - 2*khls + khls - 1 = ipj - khls - 1 
     336                     ! 
     337                     DO ji = 1, khls-1            ! first khls-1 points 
     338                        ii1 =          ji                ! ends at: khls-1 
     339                        ii2 = 2*khls - ji                ! ends at: 2*khls - ( khls - 1 ) = khls + 1 
     340                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     341                     END DO 
     342                     DO ji = 1, 1                 ! point khls 
     343                        ii1 = khls + ji - 1 
     344                        ii2 = ipi - ii1 
     345                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     346                     END DO 
     347                     DO ji = 1, Ni0glo - 1        ! points from khls+1 to ipi - khls - 1  (note: Ni0glo = ipi - 2*khls) 
     348                        ii1 =       khls + ji            ! ends at: khls + ( ipi - 2*khls - 1 ) = ipi - khls - 1 
     349                        ii2 = ipi - khls - ji            ! ends at: ipi - khls - ( ipi - 2*khls - 1 ) = khls + 1 
     350                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     351                     END DO 
     352                     DO ji = 1, 1                 ! point ipi - khls 
     353                        ii1 = ipi - khls + ji - 1 
    347354                        ii2 = ii1 
    348355                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    349356                     END DO 
    350                      DO ji = 1, nn_hls            ! last nn_hls points 
    351                         ii1 = jpiglo - nn_hls + ji       ! ends at: jpiglo - nn_hls + nn_hls = jpiglo 
    352                         ii2 = jpiglo - nn_hls - ji       ! ends at: jpiglo - nn_hls - nn_hls = jpiglo - 2*nn_hls 
     357                     DO ji = 1, khls              ! last khls points 
     358                        ii1 = ipi - khls + ji            ! ends at: ipi - khls + khls = ipi 
     359                        ii2 = ipi - khls - ji            ! ends at: ipi - khls - khls = ipi - 2*khls 
    353360                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    354361                     END DO 
    355362                  END DO    
    356363                  ! 
    357                   ! line number ipj-nn_hls : right half 
    358                     DO jj = 1, 1 
    359                      ij1 = ipj - nn_hls 
    360                      ij2 = ij1   ! same line 
    361                      ! 
    362                      DO ji = 1, Ni0glo/2-1        ! points from jpiglo/2+1 to jpiglo - nn_hls-1  (note: Ni0glo = jpiglo - 2*nn_hls) 
    363                         ii1 = jpiglo/2 + ji              ! ends at: jpiglo/2 + (jpiglo/2 - nn_hls) = jpiglo - nn_hls 
    364                         ii2 = jpiglo/2 - ji              ! ends at: jpiglo/2 - (jpiglo/2 - nn_hls - 1 ) = nn_hls + 1 
    365                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    366                      END DO 
    367                      DO ji = 1, nn_hls-1          ! first nn_hls-1 points: redo them just in case (if e-w periodocity already done) 
    368                         !                         ! as we just changed points jpiglo-2nn_hls+1 to jpiglo-nn_hl-1   
    369                         ii1 =            ji              ! ends at: nn_hls 
    370                         ii2 = 2*nn_hls - ji              ! ends at: 2*nn_hls - ( nn_hls - 1 ) = nn_hls + 1 
    371                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
    372                      END DO 
    373                      !                            ! last nn_hls points: have been / will done by e-w periodicity  
     364                  ! line number ipj-khls : right half 
     365                    DO jj = 1, 1 
     366                     ij1 = ipj - khls 
     367                     ij2 = ij1   ! same line 
     368                     ! 
     369                     DO ji = 1, Ni0glo/2-1        ! points from ipi/2+1 to ipi - khls-1  (note: Ni0glo = ipi - 2*khls) 
     370                        ii1 = ipi/2 + ji                 ! ends at: ipi/2 + (ipi/2 - khls) = ipi - khls 
     371                        ii2 = ipi/2 - ji                 ! ends at: ipi/2 - (ipi/2 - khls - 1 ) = khls + 1 
     372                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     373                     END DO 
     374                     DO ji = 1, khls-1            ! first khls-1 points: redo them just in case (if e-w periodocity already done) 
     375                        !                         ! as we just changed points ipi-2khls+1 to ipi-nn_hl-1   
     376                        ii1 =          ji                ! ends at: khls 
     377                        ii2 = 2*khls - ji                ! ends at: 2*khls - ( khls - 1 ) = khls + 1 
     378                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl) 
     379                     END DO 
     380                     !                            ! last khls points: have been / will done by e-w periodicity  
    374381                  END DO 
    375382                  ! 
  • NEMO/branches/2021/dev_r14312_MPI_Interface/src/OCE/LBC/lbc_nfd_nogather_generic.h90

    r14349 r14363  
    11 
    2    SUBROUTINE lbc_nfd_nogather_/**/PRECISION( ptab, ptab2, cd_nat, psgn ) 
     2   SUBROUTINE lbc_nfd_nogather_/**/PRECISION( ptab, ptab2, cd_nat, psgn, khls ) 
    33      !!---------------------------------------------------------------------- 
    44      !! 
     
    1111      CHARACTER(len=1)                    , INTENT(in   ) ::   cd_nat      ! nature of array grid-points 
    1212      REAL(PRECISION)                     , INTENT(in   ) ::   psgn        ! sign used across the north fold boundary 
     13      INTEGER                             , INTENT(in   ) ::   khls        ! halo size, default = nn_hls 
    1314      ! 
    1415      INTEGER  ::    ji,  jj, jk,  jn,  jl, jh       ! dummy loop indices 
     
    2930         CASE ( 'T' , 'W' )                         ! T-, W-point 
    3031            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 
     32            ELSE                    ;  startloop = 1 + khls 
     33            ENDIF 
     34            ! 
     35            DO jl = 1, ipl; DO jk = 1, ipk 
     36               DO jj = 1, khls 
    3637                  ijj = jpj -jj +1 
    3738                  DO ji = startloop, jpi 
     
    4344            IF( nimpp == 1 ) THEN 
    4445               DO jl = 1, ipl; DO jk = 1, ipk 
    45                   DO jj = 1, nn_hls 
     46                  DO jj = 1, khls 
    4647                     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) 
     48                     DO ii = 0, khls-1 
     49                        ptab(ii+1,ijj,jk,jl) = psgn * ptab(2*khls-ii+1,jpj-2*khls+jj-1,jk,jl) 
    4950                     END DO 
    5051                  END DO 
     
    5657                  startloop = 1 
    5758               ELSEIF( nimpp+jpi-1 >= Ni0glo/2+2 .AND. nimpp < Ni0glo/2+2 ) THEN 
    58                   startloop = Ni0glo/2+2 - nimpp + nn_hls 
     59                  startloop = Ni0glo/2+2 - nimpp + khls 
    5960               ELSE 
    6061                  startloop = jpi + 1 
     
    6768                        ijta = jpiglo - jia + 2 
    6869                        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                           ptab(ji,jpj-khls,jk,jl) = psgn * ptab(ijta-nimpp+khls,jpj-khls,jk,jl) 
    7071                        ELSE 
    71                            ptab(ji,jpj-nn_hls,jk,jl) = psgn * ptab2(ijt,nn_hls+1,jk,jl) 
     72                           ptab(ji,jpj-khls,jk,jl) = psgn * ptab2(ijt,khls+1,jk,jl) 
    7273                        ENDIF 
    7374                     END DO 
     
    7980               endloop = jpi 
    8081            ELSE 
    81                endloop = jpi - nn_hls 
    82             ENDIF 
    83             DO jl = 1, ipl; DO jk = 1, ipk 
    84                DO jj = 1, nn_hls 
     82               endloop = jpi - khls 
     83            ENDIF 
     84            DO jl = 1, ipl; DO jk = 1, ipk 
     85               DO jj = 1, khls 
    8586                  ijj = jpj -jj +1 
    8687                  DO ji = 1, endloop 
     
    9192            END DO; END DO 
    9293            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,:,:) 
     94               DO jj = 1, khls 
     95                  ijj = jpj -jj +1 
     96                  DO ii = 0, khls-1 
     97                     ptab(ii+1,ijj,:,:) = psgn * ptab(2*khls-ii,jpj-2*khls+jj-1,:,:) 
    9798                  END DO 
    9899               END DO 
    99100            ENDIF 
    100101            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,:,:) 
     102               DO jj = 1, khls 
     103                  ijj = jpj -jj +1 
     104                  DO ii = 1, khls 
     105                     ptab(jpi-ii+1,ijj,:,:) = psgn * ptab(jpi-2*khls+ii,jpj-2*khls+jj-1,:,:) 
    105106                  END DO 
    106107               END DO 
     
    111112                  endloop = jpi 
    112113               ELSE 
    113                   endloop = jpi - nn_hls 
     114                  endloop = jpi - khls 
    114115               ENDIF 
    115116               IF( nimpp >= Ni0glo/2+1 ) THEN 
    116                   startloop = nn_hls 
     117                  startloop = khls 
    117118               ELSEIF( ( nimpp + jpi - 1 >= Ni0glo/2+1 ) .AND. ( nimpp < Ni0glo/2+1 ) ) THEN 
    118                   startloop = Ni0glo/2+1 - nimpp + nn_hls  
     119                  startloop = Ni0glo/2+1 - nimpp + khls  
    119120               ELSE 
    120121                  startloop = endloop + 1 
     
    127128                        ijua = jpiglo - jia + 1  
    128129                        IF( ijua >= startloop+nimpp-1 .AND. ijua < jia ) THEN 
    129                            ptab(ji,jpj-nn_hls,jk,jl) = psgn * ptab(ijua-nimpp+1,jpj-nn_hls,jk,jl) 
     130                           ptab(ji,jpj-khls,jk,jl) = psgn * ptab(ijua-nimpp+1,jpj-khls,jk,jl) 
    130131                        ELSE 
    131                            ptab(ji,jpj-nn_hls,jk,jl) = psgn * ptab2(iju,nn_hls+1,jk,jl) 
     132                           ptab(ji,jpj-khls,jk,jl) = psgn * ptab2(iju,khls+1,jk,jl) 
    132133                        ENDIF 
    133134                     END DO 
     
    140141               startloop = 1  
    141142            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 
     143               startloop = 1 + khls 
     144            ENDIF 
     145            IF ( .NOT. l_fast_exchanges ) THEN 
     146               DO jl = 1, ipl; DO jk = 1, ipk 
     147                  DO jj = 2, khls+1 
    147148                     ijj = jpj -jj +1 
    148149                     DO ji = startloop, jpi 
     
    160161            END DO; END DO 
    161162            IF (nimpp .eq. 1) THEN 
    162                DO jj = 1, nn_hls 
     163               DO jj = 1, khls 
    163164                  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,:,:) 
     165                  DO ii = 0, khls-1 
     166                     ptab(ii+1,ijj,:,:) = psgn * ptab(2*khls-ii+1,jpj-2*khls+jj-1,:,:) 
    166167                  END DO 
    167168               END DO 
     
    171172               endloop = jpi 
    172173            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 
     174               endloop = jpi - khls 
     175            ENDIF 
     176            IF ( .NOT. l_fast_exchanges ) THEN 
     177               DO jl = 1, ipl; DO jk = 1, ipk 
     178                  DO jj = 2, khls+1 
    178179                     ijj = jpj -jj +1 
    179180                     DO ji = 1, endloop 
     
    191192            END DO; END DO 
    192193            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,:,:) 
     194               DO ii = 1, khls 
     195                  ptab(ii,jpj,:,:) = psgn * ptab(2*khls-ii,jpj-2*khls-1,:,:) 
    195196               END DO 
    196197               IF ( .NOT. l_fast_exchanges ) THEN 
    197                   DO jj = 1, nn_hls 
     198                  DO jj = 1, khls 
    198199                     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,:,:) 
     200                     DO ii = 0, khls-1 
     201                        ptab(ii+1,ijj,:,:) = psgn * ptab(2*khls-ii,jpj-2*khls+jj-1,:,:) 
    201202                     END DO 
    202203                  END DO 
     
    204205            ENDIF 
    205206            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,:,:) 
     207               DO ii = 1, khls 
     208                  ptab(jpi-ii+1,jpj,:,:) = psgn * ptab(jpi-2*khls+ii,jpj-2*khls-1,:,:) 
    208209               END DO 
    209210               IF ( .NOT. l_fast_exchanges ) THEN 
    210                   DO jj = 1, nn_hls 
     211                  DO jj = 1, khls 
    211212                     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,:,:) 
     213                     DO ii = 1, khls 
     214                        ptab(jpi-ii+1,ijj,:,:) = psgn * ptab(jpi-2*khls+ii,jpj-2*khls+jj-1,:,:) 
    214215                     END DO 
    215216                  END DO 
     
    226227         CASE ( 'T' , 'W' )                               ! T-, W-point 
    227228            DO jl = 1, ipl; DO jk = 1, ipk 
    228                DO jj = 1, nn_hls 
     229               DO jj = 1, khls 
    229230                  ijj = jpj-jj+1 
    230231                  DO ji = 1, jpi 
     
    239240               endloop = jpi 
    240241            ELSE 
    241                endloop = jpi - nn_hls 
    242             ENDIF 
    243             DO jl = 1, ipl; DO jk = 1, ipk 
    244                DO jj = 1, nn_hls 
     242               endloop = jpi - khls 
     243            ENDIF 
     244            DO jl = 1, ipl; DO jk = 1, ipk 
     245               DO jj = 1, khls 
    245246                  ijj = jpj-jj+1 
    246247                  DO ji = 1, endloop 
     
    252253            IF(nimpp + jpi - 1 .eq. jpiglo) THEN 
    253254               DO jl = 1, ipl; DO jk = 1, ipk 
    254                   DO jj = 1, nn_hls 
     255                  DO jj = 1, khls 
    255256                     ijj = jpj-jj+1 
    256                      DO ii = 1, nn_hls 
     257                     DO ii = 1, khls 
    257258                        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                        ptab(iij,ijj,jk,jl) = psgn * ptab(jpi-2*khls+ii-1,jpj-2*khls+jj,jk,jl) 
    259260                     END DO 
    260261                  END DO 
     
    264265         CASE ( 'V' )                                     ! V-point 
    265266            DO jl = 1, ipl; DO jk = 1, ipk 
    266                DO jj = 1, nn_hls 
     267               DO jj = 1, khls 
    267268                  ijj = jpj -jj +1 
    268269                  DO ji = 1, jpi 
     
    277278                  startloop = 1 
    278279               ELSEIF( nimpp+jpi-1 >= Ni0glo/2+2 .AND. nimpp < Ni0glo/2+2 ) THEN 
    279                   startloop = Ni0glo/2+2 - nimpp + nn_hls 
     280                  startloop = Ni0glo/2+2 - nimpp + khls 
    280281               ELSE 
    281282                  startloop = jpi + 1 
     
    285286                     DO ji = startloop, jpi 
    286287                        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                        ptab(ji,jpj-khls,jk,jl) = psgn * ptab2(ijt,khls+1,jk,jl) 
    288289                     END DO 
    289290                  END DO; END DO 
     
    295296               endloop = jpi 
    296297            ELSE 
    297                endloop = jpi - nn_hls 
    298             ENDIF 
    299             DO jl = 1, ipl; DO jk = 1, ipk 
    300                DO jj = 1, nn_hls 
     298               endloop = jpi - khls 
     299            ENDIF 
     300            DO jl = 1, ipl; DO jk = 1, ipk 
     301               DO jj = 1, khls 
    301302                  ijj = jpj -jj +1 
    302303                  DO ji = 1, endloop 
     
    308309            IF((nimpp + jpi - 1) .eq. jpiglo) THEN 
    309310               DO jl = 1, ipl; DO jk = 1, ipk 
    310                   DO jj = 1, nn_hls 
     311                  DO jj = 1, khls 
    311312                     ijj = jpj -jj +1 
    312                      DO ii = 1, nn_hls 
     313                     DO ii = 1, khls 
    313314                        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                        ptab(iij,ijj,jk,jl) = psgn * ptab(jpi-2*khls+ii-1,jpj-2*khls+jj-1,jk,jl) 
    315316                     END DO 
    316317                  END DO 
     
    322323                  endloop = jpi 
    323324               ELSE 
    324                   endloop = jpi - nn_hls 
     325                  endloop = jpi - khls 
    325326               ENDIF 
    326327               IF( nimpp >= Ni0glo/2+2 ) THEN 
    327328                  startloop = 1  
    328329               ELSEIF( nimpp+jpi-1 >= Ni0glo/2+2 .AND. nimpp < Ni0glo/2+2 ) THEN 
    329                   startloop = Ni0glo/2+2 - nimpp + nn_hls 
     330                  startloop = Ni0glo/2+2 - nimpp + khls 
    330331               ELSE 
    331332                  startloop = endloop + 1 
     
    335336                     DO ji = startloop, endloop 
    336337                        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                        ptab(ji,jpj-khls,jk,jl) = psgn * ptab2(iju,khls+1,jk,jl) 
    338339                     END DO 
    339340                  END DO; END DO 
  • NEMO/branches/2021/dev_r14312_MPI_Interface/src/OCE/LBC/lib_mpp.F90

    r14349 r14363  
    139139 
    140140   ! Neighbourgs informations 
    141    INTEGER, DIMENSION(8), PUBLIC ::   mpinei     !: 8-neighbourg MPI indexes (starting at 0, -1 if no neighbourg) 
     141   INTEGER,    PARAMETER, PUBLIC ::   n_hlsmax = 3 
     142   INTEGER, DIMENSION(         8), PUBLIC ::   mpinei      !: 8-neighbourg MPI indexes (starting at 0, -1 if no neighbourg) 
     143   INTEGER, DIMENSION(n_hlsmax,8), PUBLIC ::   mpiSnei     !: 8-neighbourg Send MPI indexes (starting at 0, -1 if no neighbourg) 
     144   INTEGER, DIMENSION(n_hlsmax,8), PUBLIC ::   mpiRnei     !: 8-neighbourg Recv MPI indexes (starting at 0, -1 if no neighbourg) 
    142145   INTEGER,    PARAMETER, PUBLIC ::   jpwe = 1   !: WEst 
    143146   INTEGER,    PARAMETER, PUBLIC ::   jpea = 2   !: EAst 
     
    160163 
    161164   ! variables used for MPI3 neighbourhood collectives 
    162    INTEGER, PUBLIC ::   mpi_nc_com4       ! MPI3 neighbourhood collectives communicator 
    163    INTEGER, PUBLIC ::   mpi_nc_com8       ! MPI3 neighbourhood collectives communicator (with diagionals) 
     165   INTEGER, DIMENSION(n_hlsmax), PUBLIC ::   mpi_nc_com4       ! MPI3 neighbourhood collectives communicator 
     166   INTEGER, DIMENSION(n_hlsmax), PUBLIC ::   mpi_nc_com8       ! MPI3 neighbourhood collectives communicator (with diagionals) 
    164167 
    165168   ! North fold condition in mpp_mpi with jpni > 1 (PUBLIC for TAM) 
     
    11001103 
    11011104    
    1102    SUBROUTINE mpp_ini_nc 
     1105   SUBROUTINE mpp_ini_nc( khls ) 
    11031106      !!---------------------------------------------------------------------- 
    11041107      !!               ***  routine mpp_ini_nc  *** 
     
    11141117      !!         mpi_nc_com8 = MPI3 neighbourhood collectives communicator (with diagonals) 
    11151118      !!---------------------------------------------------------------------- 
    1116       INTEGER, DIMENSION(:), ALLOCATABLE :: inei4, inei8 
    1117       INTEGER :: icnt4, icnt8 
    1118       INTEGER :: ierr 
    1119       LOGICAL, PARAMETER :: ireord = .FALSE. 
     1119      INTEGER,             INTENT(in   ) ::   khls        ! halo size, default = nn_hls 
     1120      ! 
     1121      INTEGER, DIMENSION(:), ALLOCATABLE :: iSnei4, iRnei4, iSnei8, iRnei8 
     1122      INTEGER                            :: iScnt4, iRcnt4, iScnt8, iRcnt8 
     1123      INTEGER                            :: ierr 
     1124      LOGICAL, PARAMETER                 :: ireord = .FALSE. 
    11201125      !!---------------------------------------------------------------------- 
    11211126#if ! defined key_mpi_off && ! defined key_mpi2 
    11221127       
    1123       icnt4 = COUNT( mpinei(1:4) >= 0 ) 
    1124       icnt8 = COUNT( mpinei(1:8) >= 0 ) 
    1125  
    1126       ALLOCATE( inei4(icnt4), inei8(icnt8) )   ! ok if icnt4 or icnt8 = 0 
    1127  
    1128       inei4 = PACK( mpinei(1:4), mask = mpinei(1:4) >= 0 ) 
    1129       inei8 = PACK( mpinei(1:8), mask = mpinei(1:8) >= 0 ) 
    1130  
    1131       CALL MPI_Dist_graph_create_adjacent(mpi_comm_oce, icnt4, inei4, MPI_UNWEIGHTED,   & 
    1132          &                                              icnt4, inei4, MPI_UNWEIGHTED, MPI_INFO_NULL, ireord, mpi_nc_com4, ierr) 
    1133       CALL MPI_Dist_graph_create_adjacent(mpi_comm_oce, icnt8, inei8, MPI_UNWEIGHTED,   & 
    1134          &                                              icnt8, inei8, MPI_UNWEIGHTED, MPI_INFO_NULL, ireord, mpi_nc_com8, ierr) 
    1135  
    1136       DEALLOCATE (inei4, inei8) 
     1128      iScnt4 = COUNT( mpiSnei(khls,1:4) >= 0 ) 
     1129      iRcnt4 = COUNT( mpiRnei(khls,1:4) >= 0 ) 
     1130      iScnt8 = COUNT( mpiSnei(khls,1:8) >= 0 ) 
     1131      iRcnt8 = COUNT( mpiRnei(khls,1:8) >= 0 ) 
     1132 
     1133      ALLOCATE( iSnei4(iScnt4), iRnei4(iRcnt4), iSnei8(iScnt8), iRnei8(iRcnt8) )   ! ok if icnt4 or icnt8 = 0 
     1134 
     1135      iSnei4 = PACK( mpiSnei(khls,1:4), mask = mpiSnei(khls,1:4) >= 0 ) 
     1136      iRnei4 = PACK( mpiRnei(khls,1:4), mask = mpiRnei(khls,1:4) >= 0 ) 
     1137      iSnei8 = PACK( mpiSnei(khls,1:8), mask = mpiSnei(khls,1:8) >= 0 ) 
     1138      iRnei8 = PACK( mpiRnei(khls,1:8), mask = mpiRnei(khls,1:8) >= 0 ) 
     1139 
     1140      CALL MPI_Dist_graph_create_adjacent( mpi_comm_oce, iScnt4, iSnei4, MPI_UNWEIGHTED, iRcnt4, iRnei4, MPI_UNWEIGHTED,   & 
     1141         &                                 MPI_INFO_NULL, ireord, mpi_nc_com4(khls), ierr ) 
     1142      CALL MPI_Dist_graph_create_adjacent( mpi_comm_oce, iScnt8, iSnei8, MPI_UNWEIGHTED, iRcnt8, iRnei8, MPI_UNWEIGHTED,   & 
     1143         &                                 MPI_INFO_NULL, ireord, mpi_nc_com8(khls), ierr) 
     1144 
     1145      DEALLOCATE( iSnei4, iRnei4, iSnei8, iRnei8 ) 
    11371146#endif 
    11381147   END SUBROUTINE mpp_ini_nc 
  • NEMO/branches/2021/dev_r14312_MPI_Interface/src/OCE/LBC/mpp_nfd_generic.h90

    r14349 r14363  
    11 
    2    SUBROUTINE mpp_nfd_/**/PRECISION( ptab, cd_nat, psgn, kfillmode, pfillval, kfld ) 
     2   SUBROUTINE mpp_nfd_/**/PRECISION( ptab, cd_nat, psgn, kfillmode, pfillval, khls, kfld ) 
    33      TYPE(PTR_4d_/**/PRECISION),  DIMENSION(:), INTENT(inout) ::   ptab        ! pointer of arrays on which apply the b.c. 
    44      CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   cd_nat      ! nature of array grid-points 
     
    66      INTEGER                       , INTENT(in   ) ::   kfillmode   ! filling method for halo over land  
    77      REAL(PRECISION)               , INTENT(in   ) ::   pfillval    ! background value (used at closed boundaries) 
     8      INTEGER                       , INTENT(in   ) ::   khls        ! halo size, default = nn_hls 
    89      INTEGER                       , INTENT(in   ) ::   kfld        ! number of pt3d arrays 
    910      ! 
     
    6465         IF( ll_add_line ) THEN 
    6566            DO jf = 1, ipf                      ! Loop over the number of arrays to be processed 
    66                ipj_s(jf) = nn_hls + COUNT( (/ c_NFtype == 'T' .OR. cd_nat(jf) == 'V' .OR. cd_nat(jf) == 'F' /) )  
     67               ipj_s(jf) = khls + COUNT( (/ c_NFtype == 'T' .OR. cd_nat(jf) == 'V' .OR. cd_nat(jf) == 'F' /) )  
    6768            END DO 
    6869         ELSE 
    69             ipj_s(:) = nn_hls 
     70            ipj_s(:) = khls 
    7071         ENDIF 
    7172          
     
    9495               ij1 = ij1 + 1 
    9596               jj_b(jj,jf) = ij1 
    96                jj_s(jj,jf) = jpj - 2*nn_hls + jj - i012 
     97               jj_s(jj,jf) = jpj - 2*khls + jj - i012 
    9798            END DO 
    9899            ! 
     
    137138            ipi   = nfjpi (ipni) 
    138139            ! 
    139             IF( ipni ==   1  ) THEN   ;   iis0 =   1            ! domain  left side: as e-w comm already done -> from 1st column 
    140             ELSE                      ;   iis0 =   1 + nn_hls   ! default: -> from inner domain  
    141             ENDIF 
    142             IF( ipni == jpni ) THEN   ;   iie0 = ipi            ! domain right side: as e-w comm already done -> until last column 
    143             ELSE                      ;   iie0 = ipi - nn_hls   ! default: -> until inner domain  
     140            IF( ipni ==   1  ) THEN   ;   iis0 =   1          ! domain  left side: as e-w comm already done -> from 1st column 
     141            ELSE                      ;   iis0 =   1 + khls   ! default: -> from inner domain  
     142            ENDIF 
     143            IF( ipni == jpni ) THEN   ;   iie0 = ipi          ! domain right side: as e-w comm already done -> until last column 
     144            ELSE                      ;   iie0 = ipi - khls   ! default: -> until inner domain  
    144145            ENDIF 
    145146            impp = nfimpp(ipni) - nfimpp(isendto(1)) 
     
    205206            ij1 = jj_b(       1 ,jf) 
    206207            ij2 = jj_b(ipj_s(jf),jf) 
    207             CALL lbc_nfd_nogather( ptab(jf)%pt4d(:,:,:,:), ztabr(:,ij1:ij2,:,:), cd_nat(jf), psgn(jf) ) 
     208            CALL lbc_nfd_nogather( ptab(jf)%pt4d(:,:,:,:), ztabr(:,ij1:ij2,:,:), cd_nat(jf), psgn(jf), khls ) 
    208209         END DO 
    209210         ! 
     
    221222         ! 
    222223         ! how many lines do we exchange at max? -> ipj    (no further optimizations in this case...) 
    223          ipj =      nn_hls + 2 
     224         ipj =      khls + 2 
    224225         ! how many lines do we     need at max? -> ipj2   (no further optimizations in this case...) 
    225          ipj2 = 2 * nn_hls + 2 
    226          ! 
    227          i0max = jpimax - 2 * nn_hls 
     226         ipj2 = 2 * khls + 2 
     227         ! 
     228         i0max = jpimax - 2 * khls 
    228229         ibuffsize = i0max * ipj * ipk * ipl * ipf 
    229230         ALLOCATE( znorthloc(i0max,ipj,ipk,ipl,ipf), znorthglo(i0max,ipj,ipk,ipl,ipf,ndim_rank_north) ) 
     
    255256         END DO 
    256257         ! 
    257          ! need to fill only the first ipj lines of ztabglo as lbc_nfd don't use the last nn_hls lines 
     258         ! need to fill only the first ipj lines of ztabglo as lbc_nfd don't use the last khls lines 
    258259         ijnr = 0 
    259260         DO jr = 1, jpni                                                        ! recover the global north array 
    260261            iproc = nfproc(jr) 
    261262            impp  = nfimpp(jr) 
    262             ipi   = nfjpi( jr) - 2 * nn_hls                       ! corresponds to Ni_0 but for subdomain iproc 
     263            ipi   = nfjpi( jr) - 2 * khls                       ! corresponds to Ni_0 but for subdomain iproc 
    263264            IF( iproc == -1 ) THEN   ! No neighbour (land proc that was suppressed) 
    264265              ! 
     
    270271                        ij2 = jpj - ipj2 + jj                    ! the first ipj lines of the last ipj2 lines 
    271272                        DO ji = 1, ipi 
    272                            ii1 = impp + nn_hls + ji - 1          ! corresponds to mig(nn_hls + ji) but for subdomain iproc 
     273                           ii1 = impp + khls + ji - 1            ! corresponds to mig(khls + ji) but for subdomain iproc 
    273274                           ztabglo(jf)%pt4d(ii1,jj,jk,jl) = ptab(jf)%pt4d(Nis0,ij2,jk,jl) ! chose to take the 1st inner domain point 
    274275                        END DO 
     
    279280                     DO jj = 1, ipj 
    280281                        DO ji = 1, ipi 
    281                            ii1 = impp + nn_hls + ji - 1          ! corresponds to mig(nn_hls + ji) but for subdomain iproc 
     282                           ii1 = impp + khls + ji - 1            ! corresponds to mig(khls + ji) but for subdomain iproc 
    282283                           ztabglo(jf)%pt4d(ii1,jj,jk,jl) = pfillval 
    283284                        END DO 
     
    291292                  DO jj = 1, ipj 
    292293                     DO ji = 1, ipi 
    293                         ii1 = impp + nn_hls + ji - 1             ! corresponds to mig(nn_hls + ji) but for subdomain iproc 
     294                        ii1 = impp + khls + ji - 1               ! corresponds to mig(khls + ji) but for subdomain iproc 
    294295                        ztabglo(jf)%pt4d(ii1,jj,jk,jl) = znorthglo(ji,jj,jk,jl,jf,ijnr) 
    295296                     END DO 
     
    302303         ! 
    303304         DO jf = 1, ipf 
    304             CALL lbc_nfd( ztabglo(jf:jf), cd_nat(jf:jf), psgn(jf:jf), 1 )   ! North fold boundary condition 
     305            CALL lbc_nfd( ztabglo(jf:jf), cd_nat(jf:jf), psgn(jf:jf), khls, 1 )   ! North fold boundary condition 
    305306            DO jl = 1, ipl   ;   DO jk = 1, ipk                  ! e-w periodicity 
    306                DO jj = 1, nn_hls + 1 
    307                   ij1 = ipj2 - (nn_hls + 1) + jj                 ! need only the last nn_hls + 1 lines until ipj2 
    308                   ztabglo(jf)%pt4d(              1:nn_hls,ij1,jk,jl) = ztabglo(jf)%pt4d(jpiglo-2*nn_hls+1:jpiglo-nn_hls,ij1,jk,jl) 
    309                   ztabglo(jf)%pt4d(jpiglo-nn_hls+1:jpiglo,ij1,jk,jl) = ztabglo(jf)%pt4d(         nn_hls+1:     2*nn_hls,ij1,jk,jl) 
     307               DO jj = 1, khls + 1 
     308                  ij1 = ipj2 - (khls + 1) + jj                   ! need only the last khls + 1 lines until ipj2 
     309                  ztabglo(jf)%pt4d(            1:  khls,ij1,jk,jl) = ztabglo(jf)%pt4d(jpiglo-2*khls+1:jpiglo-khls,ij1,jk,jl) 
     310                  ztabglo(jf)%pt4d(jpiglo-khls+1:jpiglo,ij1,jk,jl) = ztabglo(jf)%pt4d(         khls+1:     2*khls,ij1,jk,jl) 
    310311               END DO 
    311312            END DO   ;   END DO 
     
    313314         ! 
    314315         DO jf = 1, ipf   ;   DO jl = 1, ipl   ;   DO jk = 1, ipk               ! Scatter back to ARRAY_IN 
    315             DO jj = 1, nn_hls + 1 
    316                ij1 = jpj  - (nn_hls + 1) + jj   ! last nn_hls + 1 lines until jpj 
    317                ij2 = ipj2 - (nn_hls + 1) + jj   ! last nn_hls + 1 lines until ipj2 
     316            DO jj = 1, khls + 1 
     317               ij1 = jpj  - (khls + 1) + jj   ! last khls + 1 lines until jpj 
     318               ij2 = ipj2 - (khls + 1) + jj   ! last khls + 1 lines until ipj2 
    318319               DO ji= 1, jpi 
    319320                  ii2 = mig(ji) 
  • NEMO/branches/2021/dev_r14312_MPI_Interface/src/OCE/LBC/mppini.F90

    r14338 r14363  
    121121      !!                    mpinei    : number of neighboring domains (starting at 0, -1 if no neighbourg) 
    122122      !!---------------------------------------------------------------------- 
    123       INTEGER ::   ji, jj, jn, jp 
     123      INTEGER ::   ji, jj, jn, jp, jh 
    124124      INTEGER ::   ii, ij, ii2, ij2 
    125125      INTEGER ::   inijmin   ! number of oce subdomains 
     
    128128      INTEGER ::   ierr, ios 
    129129      INTEGER ::   inbi, inbj, iimax, ijmax, icnt1, icnt2 
     130      INTEGER, DIMENSION(16*n_hlsmax) :: ichanged 
    130131      INTEGER, ALLOCATABLE, DIMENSION(:    ) ::   iin, ijn 
    131132      INTEGER, ALLOCATABLE, DIMENSION(:,:  ) ::   iimppt, ijpi, ipproc 
     
    441442         WRITE(inum,'(a)') '  jpnij jpimax jpjmax    jpk jpiglo jpjglo ( local:   narea    jpi    jpj )' 
    442443         WRITE(inum,'(6i7,a,3i7,a)') jpnij,jpimax,jpjmax,jpk,jpiglo,jpjglo,' ( local: ',narea,jpi,jpj,' )' 
    443          WRITE(inum,'(a)') ' narea    ii    ij   jpi   jpj nimpp njmpp mpiwe mpiea mpiso mpino mpisw mpise mpinw mpine' 
     444         WRITE(inum,*)  
     445         WRITE(inum,       *) '------------------------------------' 
     446         WRITE(inum,'(a,i2)') ' Mapping of the default neighnourgs ' 
     447         WRITE(inum,       *) '------------------------------------' 
     448         WRITE(inum,*)  
     449         WRITE(inum,'(a)') '  rank    ii    ij   jpi   jpj nimpp njmpp mpiwe mpiea mpiso mpino mpisw mpise mpinw mpine' 
    444450         DO jp = 1, jpnij 
    445451            ii = iin(jp) 
    446452            ij = ijn(jp) 
    447             WRITE(inum,'(15i6)')  jp, ii, ij, ijpi(ii,ij), ijpj(ii,ij), iimppt(ii,ij), ijmppt(ii,ij), inei(:,ii,ij) 
     453            WRITE(inum,'(15i6)')  jp-1, ii, ij, ijpi(ii,ij), ijpj(ii,ij), iimppt(ii,ij), ijmppt(ii,ij), inei(:,ii,ij) 
    448454         END DO 
    449455      END IF 
     
    479485      ! set default neighbours 
    480486      mpinei(:) = impi(:,narea) 
     487      DO jh = 1, n_hlsmax 
     488         mpiSnei(jh,:) = impi(:,narea)   ! default definition 
     489         mpiRnei(jh,:) = impi(:,narea) 
     490      END DO 
    481491      ! 
    482492      IF(lwp) THEN 
     
    489499         WRITE(numout,*) '      mpi nei no-we = ', mpinei(jpnw)  , '   mpi nei no-ea = ', mpinei(jpne) 
    490500      ENDIF 
    491       ! 
    492501      !                          ! Prepare mpp north fold 
    493502      ! 
     
    501510            WRITE(numout,*) '   ==>>>   North fold boundary prepared for jpni >1' 
    502511         ENDIF 
    503          IF (llwrtlay) THEN   ! additional prints in layout.dat 
     512         IF (llwrtlay) THEN      ! additional prints in layout.dat 
    504513            WRITE(inum,*) 
    505514            WRITE(inum,*) 
    506             WRITE(inum,*) 'number of subdomains located along the north fold : ', ndim_rank_north 
     515            WRITE(inum,*) 'Number of subdomains located along the north fold : ', ndim_rank_north 
    507516            WRITE(inum,*) 'Rank of the subdomains located along the north fold : ', ndim_rank_north 
    508517            DO jp = 1, ndim_rank_north, 5 
     
    521530      ENDIF 
    522531      ! 
    523       CALL mpp_ini_nc        ! Initialize communicator for neighbourhood collective communications 
    524       ! 
    525       CALL init_ioipsl       ! Prepare NetCDF output file (if necessary) 
     532      CALL mpp_ini_nc(nn_hls)    ! Initialize communicator for neighbourhood collective communications 
     533      DO jh = 1, n_hlsmax 
     534         mpi_nc_com4(jh) = mpi_nc_com4(nn_hls)   ! default definition 
     535         mpi_nc_com8(jh) = mpi_nc_com8(nn_hls) 
     536      END DO 
     537      ! 
     538      CALL init_excl_landpt      ! exclude exchanges which contain only land points 
     539      ! 
     540      ! Save processor layout changes in ascii file 
     541      DO jh = 1, n_hlsmax    ! different halo size 
     542         DO ji = 1, 8 
     543            ichanged(16*(jh-1)  +ji) = COUNT( mpinei(ji:ji) /= mpiSnei(jh,ji:ji) ) 
     544            ichanged(16*(jh-1)+8+ji) = COUNT( mpinei(ji:ji) /= mpiRnei(jh,ji:ji) ) 
     545         END DO 
     546      END DO 
     547      CALL mpp_sum( "mpp_init", ichanged )   ! must be called by all processes 
     548      IF (llwrtlay) THEN 
     549         WRITE(inum,*)  
     550         WRITE(inum,       *) '----------------------------------------------------------------------' 
     551         WRITE(inum,'(a,i2)') ' Mapping of the neighnourgs once excluding comm with only land points ' 
     552         WRITE(inum,       *) '----------------------------------------------------------------------' 
     553         DO jh = 1, n_hlsmax    ! different halo size 
     554            WRITE(inum,*)  
     555            WRITE(inum,'(a,i2)') 'halo size: ', jh 
     556            WRITE(inum,       *) '---------' 
     557            WRITE(inum,'(a)') '  rank    ii    ij mpiwe mpiea mpiso mpino mpisw mpise mpinw mpine' 
     558            WRITE(inum,   '(11i6,a)')  narea-1, iin(narea), ijn(narea),   mpinei(:), ' <- Org' 
     559            WRITE(inum,'(18x,8i6,a,i1,a)')   mpiSnei(jh,:), ' <- Send ', COUNT( mpinei(:) /= mpiSnei(jh,:) ), ' modif' 
     560            WRITE(inum,'(18x,8i6,a,i1,a)')   mpiRnei(jh,:), ' <- Recv ', COUNT( mpinei(:) /= mpiRnei(jh,:) ), ' modif' 
     561            WRITE(inum,*) ' total changes among all mpi tasks:' 
     562            WRITE(inum,*) '       mpiwe mpiea mpiso mpino mpisw mpise mpinw mpine' 
     563            WRITE(inum,'(a,8i6)') ' Send: ', ichanged(jh*16-15:jh*16-8) 
     564            WRITE(inum,'(a,8i6)') ' Recv: ', ichanged(jh*16 -7:jh*16  ) 
     565         END DO 
     566      END IF 
     567      ! 
     568      CALL init_ioipsl           ! Prepare NetCDF output file (if necessary) 
    526569      ! 
    527570      IF (llwrtlay) CLOSE(inum) 
     
    878921         ! 
    879922         ALLOCATE( lloce(Ni0glo, ijsz) )                                     ! allocate the strip 
    880          CALL readbot_strip( ijstr, ijsz, lloce ) 
     923         CALL read_mask( 1, ijstr, Ni0glo, ijsz, lloce ) 
    881924         inboce = COUNT(lloce)                                               ! number of ocean point in the stripe 
    882925         DEALLOCATE(lloce) 
     
    948991            inry = iny - COUNT( (/ iarea == 1, iarea == inbj /) )      ! number of point to read in y-direction 
    949992            isty = 1 + COUNT( (/ iarea == 1 /) )                       ! read from the first or the second line? 
    950             CALL readbot_strip( ijmppt(1,iarea) - 2 + isty, inry, lloce(2:inx-1, isty:inry+isty-1) )   ! read the strip 
     993            CALL read_mask( 1, ijmppt(1,iarea) - 2 + isty, Ni0glo, inry, lloce(2:inx-1, isty:inry+isty-1) )   ! read the strip 
    951994            ! 
    952995            IF( iarea == 1    ) THEN                                   ! the first line was not read 
    953996               IF( l_Jperio ) THEN                                     !   north-south periodocity 
    954                   CALL readbot_strip( Nj0glo, 1, lloce(2:inx-1, 1) )   !   read the last line -> first line of lloce 
     997                  CALL read_mask( 1, Nj0glo, Ni0glo, 1, lloce(2:inx-1, 1) )   !   read the last line -> first line of lloce 
    955998               ELSE 
    956999                  lloce(2:inx-1,  1) = .FALSE.                         !   closed boundary 
     
    9591002            IF( iarea == inbj ) THEN                                   ! the last line was not read 
    9601003               IF( l_Jperio ) THEN                                     !   north-south periodocity 
    961                   CALL readbot_strip( 1, 1, lloce(2:inx-1,iny) )       !      read the first line -> last line of lloce 
     1004                  CALL read_mask( 1, 1, Ni0glo, 1, lloce(2:inx-1,iny) )   !      read the first line -> last line of lloce 
    9621005               ELSEIF( c_NFtype == 'T' ) THEN                          !   north-pole folding T-pivot, T-point 
    9631006                  lloce(2,iny) = lloce(2,iny-2)                        !      here we have 1 halo (even if nn_hls>1) 
     
    10041047 
    10051048 
    1006    SUBROUTINE readbot_strip( kjstr, kjcnt, ldoce ) 
    1007       !!---------------------------------------------------------------------- 
    1008       !!                  ***  ROUTINE readbot_strip  *** 
     1049   SUBROUTINE read_mask( kistr, kjstr, kicnt, kjcnt, ldoce ) 
     1050      !!---------------------------------------------------------------------- 
     1051      !!                  ***  ROUTINE read_mask  *** 
    10091052      !! 
    10101053      !! ** Purpose : Read relevant bathymetric information in order to 
     
    10141057      !! ** Method  : read stipe of size (Ni0glo,...) 
    10151058      !!---------------------------------------------------------------------- 
    1016       INTEGER                         , INTENT(in   ) ::   kjstr       ! starting j position of the reading 
    1017       INTEGER                         , INTENT(in   ) ::   kjcnt       ! number of lines to read 
    1018       LOGICAL, DIMENSION(Ni0glo,kjcnt), INTENT(  out) ::   ldoce       ! ldoce(i,j) = .true. if the point (i,j) is ocean 
    1019       ! 
    1020       INTEGER                           ::   inumsave                ! local logical unit 
    1021       REAL(wp), DIMENSION(Ni0glo,kjcnt) ::   zbot, zbdy 
     1059      INTEGER                        , INTENT(in   ) ::   kistr, kjstr   ! starting i and j position of the reading 
     1060      INTEGER                        , INTENT(in   ) ::   kicnt, kjcnt   ! number of points to read in i and j directions 
     1061      LOGICAL, DIMENSION(kicnt,kjcnt), INTENT(  out) ::   ldoce          ! ldoce(i,j) = .true. if the point (i,j) is ocean 
     1062      ! 
     1063      INTEGER                          ::   inumsave                     ! local logical unit 
     1064      REAL(wp), DIMENSION(kicnt,kjcnt) ::   zbot, zbdy 
    10221065      !!---------------------------------------------------------------------- 
    10231066      ! 
     
    10251068      ! 
    10261069      IF( numbot /= -1 ) THEN 
    1027          CALL iom_get( numbot, jpdom_unknown, 'bottom_level', zbot, kstart = (/1,kjstr/), kcount = (/Ni0glo, kjcnt/) ) 
     1070         CALL iom_get( numbot, jpdom_unknown, 'bottom_level', zbot, kstart = (/kistr,kjstr/), kcount = (/kicnt, kjcnt/) ) 
    10281071      ELSE 
    10291072         zbot(:,:) = 1._wp                      ! put a non-null value 
     
    10311074      ! 
    10321075      IF( numbdy /= -1 ) THEN                   ! Adjust with bdy_msk if it exists 
    1033          CALL iom_get ( numbdy, jpdom_unknown,     'bdy_msk', zbdy, kstart = (/1,kjstr/), kcount = (/Ni0glo, kjcnt/) ) 
     1076         CALL iom_get ( numbdy, jpdom_unknown,     'bdy_msk', zbdy, kstart = (/kistr,kjstr/), kcount = (/kicnt, kjcnt/) ) 
    10341077         zbot(:,:) = zbot(:,:) * zbdy(:,:) 
    10351078      ENDIF 
    10361079      ! 
    1037       ldoce(:,:) = zbot(:,:) > 0._wp 
     1080      ldoce(:,:) = NINT(zbot(:,:)) > 0 
    10381081      numout = inumsave 
    10391082      ! 
    1040    END SUBROUTINE readbot_strip 
     1083   END SUBROUTINE read_mask 
    10411084 
    10421085 
     
    10921135      ! 
    10931136   END SUBROUTINE mpp_getnum 
     1137 
     1138 
     1139   SUBROUTINE init_excl_landpt 
     1140      !!---------------------------------------------------------------------- 
     1141      !!                  ***  ROUTINE   *** 
     1142      !! 
     1143      !! ** Purpose : exclude exchanges which contain only land points 
     1144      !! 
     1145      !! ** Method  : if a send or receive buffer constains only land point we 
     1146      !!              flag off the corresponding communication 
     1147      !!              Warning: this selection depend on the halo size -> loop on halo size 
     1148      !! 
     1149      !!---------------------------------------------------------------------- 
     1150      INTEGER ::   inumsave 
     1151      INTEGER ::   jh 
     1152      INTEGER ::   ipi, ipj 
     1153      INTEGER ::   iiwe, iiea, iist, iisz  
     1154      INTEGER ::   ijso, ijno, ijst, ijsz  
     1155      LOGICAL ::   llsave 
     1156      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zmsk 
     1157      LOGICAL , DIMENSION(Ni_0,Nj_0,1)      ::   lloce 
     1158      !!---------------------------------------------------------------------- 
     1159      ! 
     1160      ! read the land-sea mask on the inner domain 
     1161      CALL read_mask( nimpp, njmpp, Ni_0, Nj_0, lloce(:,:,1) ) 
     1162      ! 
     1163      ! Here we look only at communications excluding the NP folding. 
     1164      ! As lbcnfd not validated if halo size /= nn_hls, we switch if off temporary... 
     1165      llsave = l_IdoNFold 
     1166      l_IdoNFold = .FALSE. 
     1167      ! 
     1168      DO jh = 1, n_hlsmax    ! different halo size 
     1169         ! 
     1170         ipi = Ni_0 + 2*jh   ! local domain size 
     1171         ipj = Nj_0 + 2*jh 
     1172         ! 
     1173         ALLOCATE( zmsk(ipi,ipj) ) 
     1174         zmsk(jh+1:jh+Ni_0,jh+1:jh+Nj_0) = REAL(COUNT(lloce, dim = 3), wp)   ! define inner domain -> need REAL to use lbclnk 
     1175         CALL lbc_lnk('mppini', zmsk, 'T', 1._wp, khls = jh)                 ! fill halos 
     1176         !         
     1177         iiwe = jh   ;   iiea = Ni_0   ! bottom-left corfer - 1 of the sent data 
     1178         ijso = jh   ;   ijno = Nj_0 
     1179         IF( nn_comm == 1 ) THEN  
     1180            iist =  0   ;   iisz = ipi 
     1181            ijst =  0   ;   ijsz = ipj 
     1182         ELSE 
     1183            iist = jh   ;   iisz = Ni_0 
     1184            ijst = jh   ;   ijsz = Nj_0 
     1185         ENDIF 
     1186IF( nn_comm == 1 ) THEN       ! SM: NOT WORKING FOR NEIGHBOURHOOD COLLECTIVE COMMUNICATIONS, I DON'T KNOW WHY...  
     1187         ! do not send if we send only land points 
     1188         IF( NINT(SUM( zmsk(iiwe+1:iiwe+jh  ,ijst+1:ijst+ijsz) )) == 0 )   mpiSnei(jh,jpwe) = -1 
     1189         IF( NINT(SUM( zmsk(iiea+1:iiea+jh  ,ijst+1:ijst+ijsz) )) == 0 )   mpiSnei(jh,jpea) = -1 
     1190         IF( NINT(SUM( zmsk(iist+1:iist+iisz,ijso+1:ijso+jh  ) )) == 0 )   mpiSnei(jh,jpso) = -1 
     1191         IF( NINT(SUM( zmsk(iist+1:iist+iisz,ijno+1:ijno+jh  ) )) == 0 )   mpiSnei(jh,jpno) = -1 
     1192         IF( NINT(SUM( zmsk(iiwe+1:iiwe+jh  ,ijso+1:ijso+jh  ) )) == 0 )   mpiSnei(jh,jpsw) = -1 
     1193         IF( NINT(SUM( zmsk(iiea+1:iiea+jh  ,ijso+1:ijso+jh  ) )) == 0 )   mpiSnei(jh,jpse) = -1 
     1194         IF( NINT(SUM( zmsk(iiwe+1:iiwe+jh  ,ijno+1:ijno+jh  ) )) == 0 )   mpiSnei(jh,jpnw) = -1 
     1195         IF( NINT(SUM( zmsk(iiea+1:iiea+jh  ,ijno+1:ijno+jh  ) )) == 0 )   mpiSnei(jh,jpne) = -1 
     1196         ! 
     1197         iiwe = iiwe-jh   ;   iiea = iiea+jh   ! bottom-left corfer - 1 of the received data 
     1198         ijso = ijso-jh   ;   ijno = ijno+jh 
     1199         ! do not send if we send only land points 
     1200         IF( NINT(SUM( zmsk(iiwe+1:iiwe+jh  ,ijst+1:ijst+ijsz) )) == 0 )   mpiRnei(jh,jpwe) = -1 
     1201         IF( NINT(SUM( zmsk(iiea+1:iiea+jh  ,ijst+1:ijst+ijsz) )) == 0 )   mpiRnei(jh,jpea) = -1 
     1202         IF( NINT(SUM( zmsk(iist+1:iist+iisz,ijso+1:ijso+jh  ) )) == 0 )   mpiRnei(jh,jpso) = -1 
     1203         IF( NINT(SUM( zmsk(iist+1:iist+iisz,ijno+1:ijno+jh  ) )) == 0 )   mpiRnei(jh,jpno) = -1 
     1204         IF( NINT(SUM( zmsk(iiwe+1:iiwe+jh  ,ijso+1:ijso+jh  ) )) == 0 )   mpiRnei(jh,jpsw) = -1 
     1205         IF( NINT(SUM( zmsk(iiea+1:iiea+jh  ,ijso+1:ijso+jh  ) )) == 0 )   mpiRnei(jh,jpse) = -1 
     1206         IF( NINT(SUM( zmsk(iiwe+1:iiwe+jh  ,ijno+1:ijno+jh  ) )) == 0 )   mpiRnei(jh,jpnw) = -1 
     1207         IF( NINT(SUM( zmsk(iiea+1:iiea+jh  ,ijno+1:ijno+jh  ) )) == 0 )   mpiRnei(jh,jpne) = -1 
     1208ENDIF 
     1209         ! 
     1210         DEALLOCATE( zmsk ) 
     1211         ! 
     1212         CALL mpp_ini_nc(jh)    ! Initialize/Update communicator for neighbourhood collective communications 
     1213         ! 
     1214      END DO 
     1215      l_IdoNFold = llsave 
     1216 
     1217   END SUBROUTINE init_excl_landpt 
    10941218 
    10951219 
  • NEMO/branches/2021/dev_r14312_MPI_Interface/src/OCE/SBC/sbcblk.F90

    r14338 r14363  
    501501      !!---------------------------------------------------------------------- 
    502502      REAL(wp), DIMENSION(jpi,jpj) ::   zssq, zcd_du, zsen, zlat, zevp 
    503       REAL(wp) :: ztmp 
     503      REAL(wp) :: ztst 
     504      LOGICAL  :: llerr 
    504505      !!---------------------------------------------------------------------- 
    505506      ! 
     
    512513         IF(lwp) WRITE(numout,*) ' === AGRIF => Sanity/consistence test on air humidity SKIPPED! :( ===' 
    513514#else 
    514          ztmp = SUM(tmask(:,:,1)) ! number of ocean points on local proc domain 
    515          IF( ztmp > 8._wp ) THEN ! test only on proc domains with at least 8 ocean points! 
    516             ztmp = SUM(sf(jp_humi)%fnow(:,:,1)*tmask(:,:,1))/ztmp ! mean humidity over ocean on proc 
     515         ztst = SUM(tmask(:,:,1)) ! number of ocean points on local proc domain 
     516         IF( ztst > 8._wp ) THEN ! test only on proc domains with at least 8 ocean points! 
     517            ztst = SUM(sf(jp_humi)%fnow(:,:,1)*tmask(:,:,1))/ztst ! mean humidity over ocean on proc 
     518            llerr = .FALSE. 
    517519            SELECT CASE( nhumi ) 
    518520            CASE( np_humi_sph ) ! specific humidity => expect: 0. <= something < 0.065 [kg/kg] (0.061 is saturation at 45degC !!!) 
    519                IF(  (ztmp < 0._wp) .OR. (ztmp > 0.065)  ) ztmp = -1._wp 
     521               IF( (ztst <   0._wp) .OR. (ztst > 0.065_wp) )   llerr = .TRUE. 
    520522            CASE( np_humi_dpt ) ! dew-point temperature => expect: 110. <= something < 320. [K] 
    521                IF( (ztmp < 110._wp).OR.(ztmp > 320._wp) ) ztmp = -1._wp 
     523               IF( (ztst < 110._wp) .OR. (ztst >  320._wp) )   llerr = .TRUE. 
    522524            CASE( np_humi_rlh ) ! relative humidity => expect: 0. <= something < 100. [%] 
    523                IF(  (ztmp < 0._wp) .OR.(ztmp > 100._wp) ) ztmp = -1._wp 
     525               IF( (ztst <   0._wp) .OR. (ztst >  100._wp) )   llerr = .TRUE. 
    524526            END SELECT 
    525             IF(ztmp < 0._wp) THEN 
    526                IF (lwp) WRITE(numout,'("   Mean humidity value found on proc #",i6.6," is: ",f10.5)') narea, ztmp 
    527                CALL ctl_stop( 'STOP', 'Something is wrong with air humidity!!!', & 
     527            IF(llerr) THEN 
     528               WRITE(ctmp1,'("   Error on mean humidity value: ",f10.5)') ztst 
     529               CALL ctl_stop( 'STOP', ctmp1, 'Something is wrong with air humidity!!!', & 
    528530                  &   ' ==> check the unit in your input files'       , & 
    529531                  &   ' ==> check consistence of namelist choice: specific? relative? dew-point?', & 
  • NEMO/branches/2021/dev_r14312_MPI_Interface/src/OCE/lib_fortran.F90

    r14314 r14363  
    232232      ! no need for 2nd exchange when nn_hls > 1 
    233233      IF( nn_hls == 1 ) THEN 
    234          IF( mpinei(jpwe) > -1 ) THEN   ! 1st column was changed beacuse of an MPI communication during the previous call to lbc_lnk 
     234         IF( mpiRnei(nn_hls,jpwe) > -1 ) THEN   ! 1st column was changed during the previous call to lbc_lnk 
    235235            IF( MOD(mig(    1), 3) == 1 )   &   ! 1st box start at i=1 -> column 1 to 3 correctly computed locally 
    236236               p2d(    1,:) = p2d(    2,:)      ! previous lbc_lnk corrupted column 1 -> put it back using column 2  
     
    238238               p2d(    2,:) = p2d(    1,:)      !  previous lbc_lnk fix column 1 -> copy it to column 2  
    239239         ENDIF 
    240          IF( mpinei(jpea) > -1 ) THEN 
     240         IF( mpiRnei(nn_hls,jpea) > -1 ) THEN 
    241241            IF( MOD(mig(jpi-2), 3) == 1 )   p2d(  jpi,:) = p2d(jpi-1,:) 
    242242            IF( MOD(mig(jpi-2), 3) == 0 )   p2d(jpi-1,:) = p2d(  jpi,:) 
    243243         ENDIF 
    244          IF( mpinei(jpso) > -1 ) THEN 
     244         IF( mpiRnei(nn_hls,jpso) > -1 ) THEN 
    245245            IF( MOD(mjg(    1), 3) == 1 )   p2d(:,    1) = p2d(:,    2) 
    246246            IF( MOD(mjg(    1), 3) == 2 )   p2d(:,    2) = p2d(:,    1) 
    247247         ENDIF 
    248          IF( mpinei(jpno) > -1 ) THEN 
     248         IF( mpiRnei(nn_hls,jpno) > -1 ) THEN 
    249249            IF( MOD(mjg(jpj-2), 3) == 1 )   p2d(:,  jpj) = p2d(:,jpj-1) 
    250250            IF( MOD(mjg(jpj-2), 3) == 0 )   p2d(:,jpj-1) = p2d(:,  jpj) 
     
    289289      ! no need for 2nd exchange when nn_hls > 1 
    290290      IF( nn_hls == 1 ) THEN 
    291          IF( mpinei(jpwe) > -1 ) THEN   ! 1st column was changed beacuse of an MPI communication during the previous call to lbc_lnk 
     291         IF( mpiRnei(nn_hls,jpwe) > -1 ) THEN    ! 1st column was changed during the previous call to lbc_lnk 
    292292            IF( MOD(mig(    1), 3) == 1 )   &    ! 1st box start at i=1 -> column 1 to 3 correctly computed locally 
    293293               p3d(    1,:,:) = p3d(    2,:,:)   ! previous lbc_lnk corrupted column 1 -> put it back using column 2  
     
    295295               p3d(    2,:,:) = p3d(    1,:,:)   !  previous lbc_lnk fix column 1 -> copy it to column 2  
    296296         ENDIF 
    297          IF( mpinei(jpea) > -1 ) THEN 
     297         IF( mpiRnei(nn_hls,jpea) > -1 ) THEN 
    298298            IF( MOD(mig(jpi-2), 3) == 1 )   p3d(  jpi,:,:) = p3d(jpi-1,:,:) 
    299299            IF( MOD(mig(jpi-2), 3) == 0 )   p3d(jpi-1,:,:) = p3d(  jpi,:,:) 
    300300         ENDIF 
    301          IF( mpinei(jpso) > -1 ) THEN 
     301         IF( mpiRnei(nn_hls,jpso) > -1 ) THEN 
    302302            IF( MOD(mjg(    1), 3) == 1 )   p3d(:,    1,:) = p3d(:,    2,:) 
    303303            IF( MOD(mjg(    1), 3) == 2 )   p3d(:,    2,:) = p3d(:,    1,:) 
    304304         ENDIF 
    305          IF( mpinei(jpno) > -1 ) THEN 
     305         IF( mpiRnei(nn_hls,jpno) > -1 ) THEN 
    306306            IF( MOD(mjg(jpj-2), 3) == 1 )   p3d(:,  jpj,:) = p3d(:,jpj-1,:) 
    307307            IF( MOD(mjg(jpj-2), 3) == 0 )   p3d(:,jpj-1,:) = p3d(:,  jpj,:) 
Note: See TracChangeset for help on using the changeset viewer.