Skip to content
Snippets Groups Projects
lbc_nfd_generic.h90 24.1 KiB
Newer Older
SUBROUTINE lbc_nfd_/**/PRECISION( ptab, cd_nat, psgn, khls, kfld )
Guillaume Samson's avatar
Guillaume Samson committed
      TYPE(PTR_4d_/**/PRECISION),  DIMENSION(:), INTENT(inout) ::   ptab        ! pointer of arrays on which apply the b.c.
      CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   cd_nat      ! nature of array grid-points
      REAL(PRECISION),  DIMENSION(:), INTENT(in   ) ::   psgn        ! sign used across the north fold boundary
      INTEGER                       , INTENT(in   ) ::   khls        ! halo size, default = nn_hls
      INTEGER                       , INTENT(in   ) ::   kfld        ! number of pt3d arrays
      !
      INTEGER  ::    ji,  jj,  jk,  jl,  jf   ! dummy loop indices
      INTEGER  ::   ipi, ipj, ipk, ipl, ipf   ! dimension of the input array
      INTEGER  ::   ii1, ii2, ij1, ij2
      !!----------------------------------------------------------------------
      !
      ipi = SIZE(ptab(1)%pt4d,1)
      ipj = SIZE(ptab(1)%pt4d,2)
      ipk = SIZE(ptab(1)%pt4d,3)
      ipl = SIZE(ptab(1)%pt4d,4)
      ipf = kfld
      !
      IF( ipi /= Ni0glo+2*khls ) THEN
         WRITE(ctmp1,*) 'lbc_nfd input array does not match khls', ipi, khls, Ni0glo
         CALL ctl_stop( 'STOP', ctmp1 )
      ENDIF
      !
      DO jf = 1, ipf                      ! Loop on the number of arrays to be treated
         !
         IF( c_NFtype == 'T' ) THEN            ! *  North fold  T-point pivot
            !
            SELECT CASE ( cd_nat(jf) )
            CASE ( 'T' , 'W' )                         ! T-, W-point
               DO jl = 1, ipl   ;   DO jk = 1, ipk
                  !
                  ! last khls lines (from ipj to ipj-khls+1) : full
               	  DO jj = 1, khls
               	     ij1 = ipj          - jj + 1         ! ends at: ipj - khls + 1
                     ij2 = ipj - 2*khls + jj - 1         ! ends at: ipj - 2*khls + khls - 1 = ipj - khls - 1
                     !
                     DO ji = 1, khls              ! first khls points
                        ii1 =              ji            ! ends at: khls
                        ii2 = 2*khls + 2 - ji            ! ends at: 2*khls + 2 - khls = khls + 2
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, 1                 ! point khls+1
                        ii1 = khls + ji
                        ii2 = ii1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, Ni0glo - 1        ! points from khls+2 to ipi - khls   (note: Ni0glo = ipi - 2*khls)
                        ii1 =   2 + khls + ji - 1        ! ends at: 2 + khls + ipi - 2*khls - 1 - 1 = ipi - khls
                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls - ( ipi - 2*khls - 1 ) + 1 = khls + 2
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, 1                 ! point ipi - khls + 1
                        ii1 = ipi - khls + ji
                        ii2 =       khls + ji
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, khls-1            ! last khls-1 points
                        ii1 = ipi - khls + 1 + ji        ! ends at: ipi - khls + 1 + khls - 1 = ipi
                        ii2 = ipi - khls + 1 - ji        ! ends at: ipi - khls + 1 - khls + 1 = ipi - 2*khls + 2
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                  END DO
                  !
                  ! line number ipj-khls : right half
               	  DO jj = 1, 1
                     ij1 = ipj - khls
                     ij2 = ij1   ! same line
                     !
                     DO ji = 1, Ni0glo/2-1        ! points from ipi/2+2 to ipi - khls   (note: Ni0glo = ipi - 2*khls)
                        ii1 = ipi/2 + ji + 1             ! ends at: ipi/2 + (ipi/2 - khls - 1) + 1 = ipi - khls
                        ii2 = ipi/2 - ji + 1             ! ends at: ipi/2 - (ipi/2 - khls - 1) + 1 = khls + 2
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, khls              ! first khls points: redo them just in case (if e-w periodocity already done)
                        !                         ! as we just changed points ipi-2khls+1 to ipi-khls  
                        ii1 =              ji            ! ends at: khls
                        ii2 = 2*khls + 2 - ji            ! ends at: 2*khls + 2 - khls = khls + 2
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     !                            ! last khls-1 points: have been / will done by e-w periodicity 
                  END DO
                  !
               END DO; END DO
            CASE ( 'U' )                               ! U-point
               DO jl = 1, ipl   ;   DO jk = 1, ipk
                  !
                  ! last khls lines (from ipj to ipj-khls+1) : full
               	  DO jj = 1, khls
               	     ij1 = ipj          - jj + 1         ! ends at: ipj - khls + 1
                     ij2 = ipj - 2*khls + jj - 1         ! ends at: ipj - 2*khls + khls - 1 = ipj - khls - 1
                     !
                     DO ji = 1, khls              ! first khls points
                        ii1 =              ji            ! ends at: khls
                        ii2 = 2*khls + 1 - ji            ! ends at: 2*khls + 1 - khls = khls + 1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, Ni0glo            ! points from khls to ipi - khls   (note: Ni0glo = ipi - 2*khls)
                        ii1 =       khls + ji            ! ends at: khls + ipi - 2*khls = ipi - khls
                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls - ( ipi - 2*khls ) + 1 = khls + 1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, khls              ! last khls points
                        ii1 = ipi - khls + ji            ! ends at: ipi - khls + khls = ipi
                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls + 1 - khls = ipi - 2*khls + 1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                  END DO
                  !
                  ! line number ipj-khls : right half
               	  DO jj = 1, 1
                     ij1 = ipj - khls
                     ij2 = ij1   ! same line
                     !
                     DO ji = 1, Ni0glo/2          ! points from ipi/2+1 to ipi - khls   (note: Ni0glo = ipi - 2*khls)
                        ii1 = ipi/2 + ji                 ! ends at: ipi/2 + (ipi/2 - khls) = ipi - khls
                        ii2 = ipi/2 - ji + 1             ! ends at: ipi/2 - (ipi/2 - khls) + 1 = khls + 1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, khls              ! first khls points: redo them just in case (if e-w periodocity already done)
                        !                         ! as we just changed points ipi-2khls+1 to ipi-khls  
                        ii1 =              ji            ! ends at: khls
                        ii2 = 2*khls + 1 - ji            ! ends at: 2*khls + 1 - khls = khls + 1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     !                            ! last khls-1 points: have been / will done by e-w periodicity 
                  END DO
                  !
               END DO; END DO
            CASE ( 'V' )                               ! V-point
               DO jl = 1, ipl   ;   DO jk = 1, ipk
                  !
                  ! last khls+1 lines (from ipj to ipj-khls) : full
               	  DO jj = 1, khls+1
               	     ij1 = ipj          - jj + 1         ! ends at: ipj - ( khls + 1 ) + 1 = ipj - khls
                     ij2 = ipj - 2*khls + jj - 2         ! ends at: ipj - 2*khls + khls + 1 - 2 = ipj - khls - 1
                     !
                     DO ji = 1, khls              ! first khls points
                        ii1 =              ji            ! ends at: khls
                        ii2 = 2*khls + 2 - ji            ! ends at: 2*khls + 2 - khls = khls + 2
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, 1                 ! point khls+1
                        ii1 = khls + ji
                        ii2 = ii1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, Ni0glo - 1        ! points from khls+2 to ipi - khls   (note: Ni0glo = ipi - 2*khls)
                        ii1 =   2 + khls + ji - 1        ! ends at: 2 + khls + ipi - 2*khls - 1 - 1 = ipi - khls
                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls - ( ipi - 2*khls - 1 ) + 1 = khls + 2
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, 1                 ! point ipi - khls + 1
                        ii1 = ipi - khls + ji
                        ii2 =       khls + ji
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, khls-1            ! last khls-1 points
                        ii1 = ipi - khls + 1 + ji        ! ends at: ipi - khls + 1 + khls - 1 = ipi
                        ii2 = ipi - khls + 1 - ji        ! ends at: ipi - khls + 1 - khls + 1 = ipi - 2*khls + 2
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                  END DO
                  !
               END DO; END DO
            CASE ( 'F' )                               ! F-point
               DO jl = 1, ipl   ;   DO jk = 1, ipk
                  !
                  ! last khls+1 lines (from ipj to ipj-khls) : full
               	  DO jj = 1, khls+1
               	     ij1 = ipj          - jj + 1         ! ends at: ipj - ( khls + 1 ) + 1 = ipj - khls
                     ij2 = ipj - 2*khls + jj - 2         ! ends at: ipj - 2*khls + khls + 1 - 2 = ipj - khls - 1
                     !
                     DO ji = 1, khls              ! first khls points
                        ii1 =              ji            ! ends at: khls
                        ii2 = 2*khls + 1 - ji            ! ends at: 2*khls + 1 - khls = khls + 1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, Ni0glo            ! points from khls to ipi - khls   (note: Ni0glo = ipi - 2*khls)
                        ii1 =       khls + ji            ! ends at: khls + ipi - 2*khls = ipi - khls
                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls - ( ipi - 2*khls ) + 1 = khls + 1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, khls              ! last khls points
                        ii1 = ipi - khls + ji            ! ends at: ipi - khls + khls = ipi
                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls + 1 - khls = ipi - 2*khls + 1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                  END DO
                  !
               END DO; END DO
            END SELECT   ! cd_nat(jf)
            !
         ENDIF   ! c_NFtype == 'T'
         !
         IF( c_NFtype == 'F' ) THEN            ! *  North fold  F-point pivot
            !
            SELECT CASE ( cd_nat(jf) )
            CASE ( 'T' , 'W' )                         ! T-, W-point
               DO jl = 1, ipl   ;   DO jk = 1, ipk
                  !
                  ! first: line number ipj-khls : 3 points
               	  DO jj = 1, 1
                     ij1 = ipj - khls
                     ij2 = ij1   ! same line
                     !
                     DO ji = 1, 1                 ! points from ipi/2+1
                        ii1 = ipi/2 + ji
                        ii2 = ipi/2 - ji + 1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) =            ptab(jf)%pt4d(ii2,ij2,jk,jl)   ! Warning: pb with sign...
                     END DO
                     DO ji = 1, 1                 ! points ipi - khls
                        ii1 = ipi - khls + ji - 1
                        ii2 =       khls + ji
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) =            ptab(jf)%pt4d(ii2,ij2,jk,jl)   ! Warning: pb with sign...
                     END DO
                     DO ji = 1, 1                 ! point khls: redo it just in case (if e-w periodocity already done)
                        !                         ! as we just changed point ipi - khls
                        ii1 = khls + ji - 1
                        ii2 = khls + ji
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) =            ptab(jf)%pt4d(ii2,ij2,jk,jl)   ! Warning: pb with sign...
                     END DO
                  END DO
                  !
                  ! Second: last khls lines (from ipj to ipj-khls+1) : full
               	  DO jj = 1, khls
               	     ij1 = ipj + 1      - jj             ! ends at: ipj + 1 - khls
                     ij2 = ipj - 2*khls + jj             ! ends at: ipj - 2*khls + khls = ipj - khls
                     !
                     DO ji = 1, khls              ! first khls points
                        ii1 =              ji            ! ends at: khls
                        ii2 = 2*khls + 1 - ji            ! ends at: 2*khls + 1 - khls = khls + 1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, Ni0glo            ! points from khls to ipi - khls   (note: Ni0glo = ipi - 2*khls)
                        ii1 =       khls + ji            ! ends at: khls + ipi - 2*khls = ipi - khls
                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls - ( ipi - 2*khls ) + 1 = khls + 1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, khls              ! last khls points
                        ii1 = ipi - khls + ji            ! ends at: ipi - khls + khls = ipi
                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls + 1 - khls = ipi - 2*khls + 1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                  END DO
                  !
               END DO; END DO
            CASE ( 'U' )                               ! U-point
               DO jl = 1, ipl   ;   DO jk = 1, ipk
                  !
                  ! last khls lines (from ipj to ipj-khls+1) : full
               	  DO jj = 1, khls
               	     ij1 = ipj + 1      - jj             ! ends at: ipj + 1 - khls
                     ij2 = ipj - 2*khls + jj             ! ends at: ipj - 2*khls + khls = ipj - khls
                     !
                     DO ji = 1, khls-1            ! first khls-1 points
                        ii1 =          ji                ! ends at: khls-1
                        ii2 = 2*khls - ji                ! ends at: 2*khls - ( khls - 1 ) = khls + 1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, 1                 ! point khls
                        ii1 = khls + ji - 1
                        ii2 = ipi - ii1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, Ni0glo - 1        ! points from khls+1 to ipi - khls - 1  (note: Ni0glo = ipi - 2*khls)
                        ii1 =       khls + ji            ! ends at: khls + ( ipi - 2*khls - 1 ) = ipi - khls - 1
                        ii2 = ipi - khls - ji            ! ends at: ipi - khls - ( ipi - 2*khls - 1 ) = khls + 1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, 1                 ! point ipi - khls
                        ii1 = ipi - khls + ji - 1
                        ii2 = ii1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, khls              ! last khls points
                        ii1 = ipi - khls + ji            ! ends at: ipi - khls + khls = ipi
                        ii2 = ipi - khls - ji            ! ends at: ipi - khls - khls = ipi - 2*khls
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                  END DO
                  !
               END DO; END DO
            CASE ( 'V' )                               ! V-point
               DO jl = 1, ipl   ;   DO jk = 1, ipk
                  !
                  ! last khls lines (from ipj to ipj-khls+1) : full
               	  DO jj = 1, khls
               	     ij1 = ipj          - jj + 1         ! ends at: ipj - khls + 1
                     ij2 = ipj - 2*khls + jj - 1         ! ends at: ipj - 2*khls + khls - 1 = ipj - khls - 1
                     !
                     DO ji = 1, khls              ! first khls points
                        ii1 =              ji            ! ends at: khls
                        ii2 = 2*khls + 1 - ji            ! ends at: 2*khls + 1 - khls = khls + 1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, Ni0glo            ! points from khls to ipi - khls   (note: Ni0glo = ipi - 2*khls)
                        ii1 =       khls + ji          ! ends at: khls + ipi - 2*khls = ipi - khls
                        ii2 = ipi - khls - ji + 1      ! ends at: ipi - khls - ( ipi - 2*khls ) + 1 = khls + 1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, khls            ! last khls points
                        ii1 = ipi - khls + ji          ! ends at: ipi - khls + khls = ipi
                        ii2 = ipi - khls - ji + 1      ! ends at: ipi - khls + 1 - khls = ipi - 2*khls + 1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                  END DO   
                  !
                  ! line number ipj-khls : right half
               	  DO jj = 1, 1
                     ij1 = ipj - khls
                     ij2 = ij1   ! same line
                     !
                     DO ji = 1, Ni0glo/2          ! points from ipi/2+1 to ipi - khls   (note: Ni0glo = ipi - 2*khls)
                        ii1 = ipi/2 + ji                 ! ends at: ipi/2 + (ipi/2 - khls) = ipi - khls
                        ii2 = ipi/2 - ji + 1             ! ends at: ipi/2 - (ipi/2 - khls) + 1 = khls + 1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, khls              ! first khls points: redo them just in case (if e-w periodocity already done)
                        !                         ! as we just changed points ipi-2khls+1 to ipi-khls  
                        ii1 =              ji            ! ends at: khls
                        ii2 = 2*khls + 1 - ji            ! ends at: 2*khls + 1 - khls = khls + 1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     !                            ! last khls points: have been / will done by e-w periodicity 
                  END DO
                  !
               END DO; END DO
            CASE ( 'F' )                               ! F-point
               DO jl = 1, ipl   ;   DO jk = 1, ipk
                  !
                  ! last khls lines (from ipj to ipj-khls+1) : full
               	  DO jj = 1, khls
               	     ij1 = ipj          - jj + 1         ! ends at: ipj - khls + 1
                     ij2 = ipj - 2*khls + jj - 1         ! ends at: ipj - 2*khls + khls - 1 = ipj - khls - 1
                     !
                     DO ji = 1, khls-1            ! first khls-1 points
                        ii1 =          ji                ! ends at: khls-1
                        ii2 = 2*khls - ji                ! ends at: 2*khls - ( khls - 1 ) = khls + 1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, 1                 ! point khls
                        ii1 = khls + ji - 1
                        ii2 = ipi - ii1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, Ni0glo - 1        ! points from khls+1 to ipi - khls - 1  (note: Ni0glo = ipi - 2*khls)
                        ii1 =       khls + ji            ! ends at: khls + ( ipi - 2*khls - 1 ) = ipi - khls - 1
                        ii2 = ipi - khls - ji            ! ends at: ipi - khls - ( ipi - 2*khls - 1 ) = khls + 1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, 1                 ! point ipi - khls
                        ii1 = ipi - khls + ji - 1
                        ii2 = ii1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, khls              ! last khls points
                        ii1 = ipi - khls + ji            ! ends at: ipi - khls + khls = ipi
                        ii2 = ipi - khls - ji            ! ends at: ipi - khls - khls = ipi - 2*khls
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                  END DO   
                  !
                  ! line number ipj-khls : right half
               	  DO jj = 1, 1
                     ij1 = ipj - khls
                     ij2 = ij1   ! same line
                     !
                     DO ji = 1, Ni0glo/2-1        ! points from ipi/2+1 to ipi - khls-1  (note: Ni0glo = ipi - 2*khls)
                        ii1 = ipi/2 + ji                 ! ends at: ipi/2 + (ipi/2 - khls) = ipi - khls
                        ii2 = ipi/2 - ji                 ! ends at: ipi/2 - (ipi/2 - khls - 1 ) = khls + 1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     DO ji = 1, khls-1            ! first khls-1 points: redo them just in case (if e-w periodocity already done)
                        !                         ! as we just changed points ipi-2khls+1 to ipi-nn_hl-1  
                        ii1 =          ji                ! ends at: khls
                        ii2 = 2*khls - ji                ! ends at: 2*khls - ( khls - 1 ) = khls + 1
                        ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                     END DO
                     !                            ! last khls points: have been / will done by e-w periodicity 
                  END DO
                  !
               END DO; END DO
            END SELECT   ! cd_nat(jf)
            !
         ENDIF   ! c_NFtype == 'F'
         !
      END DO   ! ipf
      !
   END SUBROUTINE lbc_nfd_/**/PRECISION