SUBROUTINE LAITRI_INIT(KPROMA,KPROMB,KSTART,KPROF,KFLEV,KL0,&
 & KMAP,PSIGN )  

!**** *LAITRI_INIT - semi-LAgrangian scheme:   (adjoint version)
!                 Initialise for TRI-dimensional 32 points interpolations.

!     Purpose.
!     --------
!       Performs initialisations for tri-dimensional 32 point interpolations.

!**   Interface.
!     ----------
!        *CALL* *LAITRI_INIT(KPROMA,KPROMB,KSTART,KPROF,KFLEV,KL0
!                      ,KMAP,PSIGN)

!        Explicit arguments :
!        --------------------

!        INPUT:
!          KPROMA  - horizontal dimension for grid-point quantities.
!          KPROMB  - horizontal dimension for interpolation point
!                    quantities.
!          KSTART  - first element of arrays where
!                    computations are performed.
!          KPROF   - depth of work.
!          KFLEV   - vertical dimension.
!          KL0     - indices of the four western points
!                    of the 16 points interpolation grid.
!        OUTPUT:
!          KMAP    - mapping array for bit reproducibility
!          PSIGN   - sign (+ or -) to be applied to point (symmetric/
!                    antisymmetric properties at polar latitudes)

!        Implicit arguments :
!        --------------------

!     Method.
!     -------
!        See documentation

!     Externals.
!     ----------

!        No external.

!     Reference.
!     ----------

!     Author.
!     -------
!        G. Mozdzynski (ECMWF)

!     Modifications.
!     --------------
!      Original : 00/08/15
!      M.Hamrud      01-Oct-2003 CY28 Cleaning
!      K. Yessad (Sep 2008): update comments + cleanings.
!     ------------------------------------------------------------------

USE PARKIND1  ,ONLY : JPIM     ,JPRB
USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK

USE YOMSLREP , ONLY : NSLMAP, RSASIGN

!     ------------------------------------------------------------------

IMPLICIT NONE

INTEGER(KIND=JPIM),INTENT(IN)    :: KPROMB 
INTEGER(KIND=JPIM),INTENT(IN)    :: KFLEV 
INTEGER(KIND=JPIM),INTENT(IN)    :: KPROMA 
INTEGER(KIND=JPIM),INTENT(IN)    :: KSTART 
INTEGER(KIND=JPIM),INTENT(IN)    :: KPROF 
INTEGER(KIND=JPIM),INTENT(IN)    :: KL0(KPROMB,KFLEV,0:3) 
INTEGER(KIND=JPIM),INTENT(OUT)   :: KMAP(KPROMB,32,KFLEV) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PSIGN(KPROMB,32,KFLEV,2) 

!     ------------------------------------------------------------------

INTEGER(KIND=JPIM) :: IV0L1, IV0L2, IV1L0, IV1L1, IV1L2, IV1L3,&
 & IV2L0, IV2L1, IV2L2, IV2L3, IV3L1, IV3L2, JLEV, JROF  
INTEGER(KIND=JPIM) :: I1,I2,I3,I4,I5,I6,I7,I8,I9,I10,I11,I12,I13,I14,I15,I16,&
 & I17,I18,I19,I20,I21,I22,I23,I24,I25,I26,I27,I28,I29,&
 & I30,I31,I32  
REAL(KIND=JPRB) :: ZHOOK_HANDLE

!     ------------------------------------------------------------------

IF (LHOOK) CALL DR_HOOK('LAITRI_INIT',0,ZHOOK_HANDLE)

!     ------------------------------------------------------------------

!*       1.    INTERPOLATIONS.
!              ---------------

IV0L1=1
IV0L2=2
IV1L0=  KPROMA
IV1L1=1+KPROMA
IV1L2=2+KPROMA
IV1L3=3+KPROMA
IV2L0=IV1L0+KPROMA
IV2L1=IV1L1+KPROMA
IV2L2=IV1L2+KPROMA
IV2L3=IV1L3+KPROMA
IV3L1=IV2L1+KPROMA
IV3L2=IV2L2+KPROMA

DO JLEV=1,KFLEV

!OCL NOVREC
  DO JROF=KSTART,KPROF

    I1=KL0(JROF,JLEV,0)+IV1L1
    I2=KL0(JROF,JLEV,0)+IV1L2
    I3=KL0(JROF,JLEV,0)+IV2L1
    I4=KL0(JROF,JLEV,0)+IV2L2
    I5=KL0(JROF,JLEV,1)+IV0L1
    I6=KL0(JROF,JLEV,1)+IV0L2
    I7=KL0(JROF,JLEV,1)+IV1L0
    I8=KL0(JROF,JLEV,1)+IV1L1
    I9=KL0(JROF,JLEV,1)+IV1L2
    I10=KL0(JROF,JLEV,1)+IV1L3
    I11=KL0(JROF,JLEV,1)+IV2L0
    I12=KL0(JROF,JLEV,1)+IV2L1
    I13=KL0(JROF,JLEV,1)+IV2L2
    I14=KL0(JROF,JLEV,1)+IV2L3
    I15=KL0(JROF,JLEV,1)+IV3L1
    I16=KL0(JROF,JLEV,1)+IV3L2
    I17=KL0(JROF,JLEV,2)+IV0L1
    I18=KL0(JROF,JLEV,2)+IV0L2
    I19=KL0(JROF,JLEV,2)+IV1L0
    I20=KL0(JROF,JLEV,2)+IV1L1
    I21=KL0(JROF,JLEV,2)+IV1L2
    I22=KL0(JROF,JLEV,2)+IV1L3
    I23=KL0(JROF,JLEV,2)+IV2L0
    I24=KL0(JROF,JLEV,2)+IV2L1
    I25=KL0(JROF,JLEV,2)+IV2L2
    I26=KL0(JROF,JLEV,2)+IV2L3
    I27=KL0(JROF,JLEV,2)+IV3L1
    I28=KL0(JROF,JLEV,2)+IV3L2
    I29=KL0(JROF,JLEV,3)+IV1L1
    I30=KL0(JROF,JLEV,3)+IV1L2
    I31=KL0(JROF,JLEV,3)+IV2L1
    I32=KL0(JROF,JLEV,3)+IV2L2

    KMAP(JROF,1,JLEV)=NSLMAP(I1)
    KMAP(JROF,2,JLEV)=NSLMAP(I2)
    KMAP(JROF,3,JLEV)=NSLMAP(I3)
    KMAP(JROF,4,JLEV)=NSLMAP(I4)
    KMAP(JROF,5,JLEV)=NSLMAP(I5)
    KMAP(JROF,6,JLEV)=NSLMAP(I6)
    KMAP(JROF,7,JLEV)=NSLMAP(I7)
    KMAP(JROF,8,JLEV)=NSLMAP(I8)
    KMAP(JROF,9,JLEV)=NSLMAP(I9)
    KMAP(JROF,10,JLEV)=NSLMAP(I10)
    KMAP(JROF,11,JLEV)=NSLMAP(I11)
    KMAP(JROF,12,JLEV)=NSLMAP(I12)
    KMAP(JROF,13,JLEV)=NSLMAP(I13)
    KMAP(JROF,14,JLEV)=NSLMAP(I14)
    KMAP(JROF,15,JLEV)=NSLMAP(I15)
    KMAP(JROF,16,JLEV)=NSLMAP(I16)
    KMAP(JROF,17,JLEV)=NSLMAP(I17)
    KMAP(JROF,18,JLEV)=NSLMAP(I18)
    KMAP(JROF,19,JLEV)=NSLMAP(I19)
    KMAP(JROF,20,JLEV)=NSLMAP(I20)
    KMAP(JROF,21,JLEV)=NSLMAP(I21)
    KMAP(JROF,22,JLEV)=NSLMAP(I22)
    KMAP(JROF,23,JLEV)=NSLMAP(I23)
    KMAP(JROF,24,JLEV)=NSLMAP(I24)
    KMAP(JROF,25,JLEV)=NSLMAP(I25)
    KMAP(JROF,26,JLEV)=NSLMAP(I26)
    KMAP(JROF,27,JLEV)=NSLMAP(I27)
    KMAP(JROF,28,JLEV)=NSLMAP(I28)
    KMAP(JROF,29,JLEV)=NSLMAP(I29)
    KMAP(JROF,30,JLEV)=NSLMAP(I30)
    KMAP(JROF,31,JLEV)=NSLMAP(I31)
    KMAP(JROF,32,JLEV)=NSLMAP(I32)

    PSIGN(JROF,1,JLEV,1)=RSASIGN(MOD(I1-1,KPROMA)+1,1)
    PSIGN(JROF,1,JLEV,2)=RSASIGN(MOD(I1-1,KPROMA)+1,2)
    PSIGN(JROF,2,JLEV,1)=RSASIGN(MOD(I2-1,KPROMA)+1,1)
    PSIGN(JROF,2,JLEV,2)=RSASIGN(MOD(I2-1,KPROMA)+1,2)
    PSIGN(JROF,3,JLEV,1)=RSASIGN(MOD(I3-1,KPROMA)+1,1)
    PSIGN(JROF,3,JLEV,2)=RSASIGN(MOD(I3-1,KPROMA)+1,2)
    PSIGN(JROF,4,JLEV,1)=RSASIGN(MOD(I4-1,KPROMA)+1,1)
    PSIGN(JROF,4,JLEV,2)=RSASIGN(MOD(I4-1,KPROMA)+1,2)
    PSIGN(JROF,5,JLEV,1)=RSASIGN(MOD(I5-1,KPROMA)+1,1)
    PSIGN(JROF,5,JLEV,2)=RSASIGN(MOD(I5-1,KPROMA)+1,2)
    PSIGN(JROF,6,JLEV,1)=RSASIGN(MOD(I6-1,KPROMA)+1,1)
    PSIGN(JROF,6,JLEV,2)=RSASIGN(MOD(I6-1,KPROMA)+1,2)
    PSIGN(JROF,7,JLEV,1)=RSASIGN(MOD(I7-1,KPROMA)+1,1)
    PSIGN(JROF,7,JLEV,2)=RSASIGN(MOD(I7-1,KPROMA)+1,2)
    PSIGN(JROF,8,JLEV,1)=RSASIGN(MOD(I8-1,KPROMA)+1,1)
    PSIGN(JROF,8,JLEV,2)=RSASIGN(MOD(I8-1,KPROMA)+1,2)
    PSIGN(JROF,9,JLEV,1)=RSASIGN(MOD(I9-1,KPROMA)+1,1)
    PSIGN(JROF,9,JLEV,2)=RSASIGN(MOD(I9-1,KPROMA)+1,2)
    PSIGN(JROF,10,JLEV,1)=RSASIGN(MOD(I10-1,KPROMA)+1,1)
    PSIGN(JROF,10,JLEV,2)=RSASIGN(MOD(I10-1,KPROMA)+1,2)
    PSIGN(JROF,11,JLEV,1)=RSASIGN(MOD(I11-1,KPROMA)+1,1)
    PSIGN(JROF,11,JLEV,2)=RSASIGN(MOD(I11-1,KPROMA)+1,2)
    PSIGN(JROF,12,JLEV,1)=RSASIGN(MOD(I12-1,KPROMA)+1,1)
    PSIGN(JROF,12,JLEV,2)=RSASIGN(MOD(I12-1,KPROMA)+1,2)
    PSIGN(JROF,13,JLEV,1)=RSASIGN(MOD(I13-1,KPROMA)+1,1)
    PSIGN(JROF,13,JLEV,2)=RSASIGN(MOD(I13-1,KPROMA)+1,2)
    PSIGN(JROF,14,JLEV,1)=RSASIGN(MOD(I14-1,KPROMA)+1,1)
    PSIGN(JROF,14,JLEV,2)=RSASIGN(MOD(I14-1,KPROMA)+1,2)
    PSIGN(JROF,15,JLEV,1)=RSASIGN(MOD(I15-1,KPROMA)+1,1)
    PSIGN(JROF,15,JLEV,2)=RSASIGN(MOD(I15-1,KPROMA)+1,2)
    PSIGN(JROF,16,JLEV,1)=RSASIGN(MOD(I16-1,KPROMA)+1,1)
    PSIGN(JROF,16,JLEV,2)=RSASIGN(MOD(I16-1,KPROMA)+1,2)
    PSIGN(JROF,17,JLEV,1)=RSASIGN(MOD(I17-1,KPROMA)+1,1)
    PSIGN(JROF,17,JLEV,2)=RSASIGN(MOD(I17-1,KPROMA)+1,2)
    PSIGN(JROF,18,JLEV,1)=RSASIGN(MOD(I18-1,KPROMA)+1,1)
    PSIGN(JROF,18,JLEV,2)=RSASIGN(MOD(I18-1,KPROMA)+1,2)
    PSIGN(JROF,19,JLEV,1)=RSASIGN(MOD(I19-1,KPROMA)+1,1)
    PSIGN(JROF,19,JLEV,2)=RSASIGN(MOD(I19-1,KPROMA)+1,2)
    PSIGN(JROF,20,JLEV,1)=RSASIGN(MOD(I20-1,KPROMA)+1,1)
    PSIGN(JROF,20,JLEV,2)=RSASIGN(MOD(I20-1,KPROMA)+1,2)
    PSIGN(JROF,21,JLEV,1)=RSASIGN(MOD(I21-1,KPROMA)+1,1)
    PSIGN(JROF,21,JLEV,2)=RSASIGN(MOD(I21-1,KPROMA)+1,2)
    PSIGN(JROF,22,JLEV,1)=RSASIGN(MOD(I22-1,KPROMA)+1,1)
    PSIGN(JROF,22,JLEV,2)=RSASIGN(MOD(I22-1,KPROMA)+1,2)
    PSIGN(JROF,23,JLEV,1)=RSASIGN(MOD(I23-1,KPROMA)+1,1)
    PSIGN(JROF,23,JLEV,2)=RSASIGN(MOD(I23-1,KPROMA)+1,2)
    PSIGN(JROF,24,JLEV,1)=RSASIGN(MOD(I24-1,KPROMA)+1,1)
    PSIGN(JROF,24,JLEV,2)=RSASIGN(MOD(I24-1,KPROMA)+1,2)
    PSIGN(JROF,25,JLEV,1)=RSASIGN(MOD(I25-1,KPROMA)+1,1)
    PSIGN(JROF,25,JLEV,2)=RSASIGN(MOD(I25-1,KPROMA)+1,2)
    PSIGN(JROF,26,JLEV,1)=RSASIGN(MOD(I26-1,KPROMA)+1,1)
    PSIGN(JROF,26,JLEV,2)=RSASIGN(MOD(I26-1,KPROMA)+1,2)
    PSIGN(JROF,27,JLEV,1)=RSASIGN(MOD(I27-1,KPROMA)+1,1)
    PSIGN(JROF,27,JLEV,2)=RSASIGN(MOD(I27-1,KPROMA)+1,2)
    PSIGN(JROF,28,JLEV,1)=RSASIGN(MOD(I28-1,KPROMA)+1,1)
    PSIGN(JROF,28,JLEV,2)=RSASIGN(MOD(I28-1,KPROMA)+1,2)
    PSIGN(JROF,29,JLEV,1)=RSASIGN(MOD(I29-1,KPROMA)+1,1)
    PSIGN(JROF,29,JLEV,2)=RSASIGN(MOD(I29-1,KPROMA)+1,2)
    PSIGN(JROF,30,JLEV,1)=RSASIGN(MOD(I30-1,KPROMA)+1,1)
    PSIGN(JROF,30,JLEV,2)=RSASIGN(MOD(I30-1,KPROMA)+1,2)
    PSIGN(JROF,31,JLEV,1)=RSASIGN(MOD(I31-1,KPROMA)+1,1)
    PSIGN(JROF,31,JLEV,2)=RSASIGN(MOD(I31-1,KPROMA)+1,2)
    PSIGN(JROF,32,JLEV,1)=RSASIGN(MOD(I32-1,KPROMA)+1,1)
    PSIGN(JROF,32,JLEV,2)=RSASIGN(MOD(I32-1,KPROMA)+1,2)

  ENDDO

ENDDO

!     ------------------------------------------------------------------
IF (LHOOK) CALL DR_HOOK('LAITRI_INIT',1,ZHOOK_HANDLE)
END SUBROUTINE LAITRI_INIT
