SUBROUTINE GPXYBAD(KPROMA,KSTART,KPROF,KFLEV,PVDELB,PVC,&
 & PRES,PDELP,PRDELP,PLNPR,PALPH,PRTGR,&
 & PRPRE,PRPP,&
 & PRES5,PDELP5,PRDELP5,PLNPR5,PRPRE5,PRPP5)  

!**** *GPXYBAD* - Computes auxillary arrays, adjoint

!     Purpose.
!     --------
!           COMPUTES AUXILLARY ARRAYS RELATED TO THE HYBRID COORDINATE
!           ,ADJOINT

!**   Interface.
!     ----------
!        *CALL* *GPXYBAD(...)*

!        Explicit arguments :
!        --------------------
!     KPROMA                 : DIMENSIONING
!     KPROF                  : DEPTH OF WORK
!     KFLEV                  : VERT. DIMENSIONING
!     PVDELB(KPROMA,0:KFLEV) : RELATED TO VERT. COORDINATE
!     PVC   (KPROMA,0:KFLEV) :  "     "      "     "    "
!     PRES (KPROF,0:KFLEV)  : HALF LEVEL PRESSURE                (INPUT)
!     PDELP (KPROF,KFLEV)   : PRESSURE DIFFERENCE ACROSS LAYERS  (OUTPUT)
!     PRDELP(KPROF,KFLEV)   : THEIR INVERSE                      (OUTPUT)
!     PLNPR (KPROF,KFLEV)   : LOGARITHM OF RATIO OF PRESSURE     (OUTPUT)
!     PALPH (KPROF,KFLEV)   : COEFFICIENTS OF THE HYDROSTATICS   (OUTPUT)
!     PRTGR (KPROF,KFLEV)   : FOR PRES. GRAD. TERM AND ENE. CONV.(OUTPUT)
!     PRPRE (KPROF,KFLEV)   : INVERSE OF PRESSURE                (OUTPUT)
!     PRPP  (KPROF,KFLEV)   : INVERSE OF P(j) * P(j-1)           (OUTPUT)
!     PRES5(KPROF,0:KFLEV)  : HALF LEVEL PRESSURE                (INPUT-T)
!     PDELP5(KPROF,KFLEV)   : PRESSURE DIFFERENCE ACROSS LAYERS  (INPUT-T)
!     PRDELP5(KPROF,KFLEV)  : THEIR INVERSE                      (INPUT-T)
!     PLNPR5(KPROF,KFLEV)   : LOGARITHM OF RATIO OF PRESSURE     (INPUT-T)
!     PRPRE5(KPROF,KFLEV)   : INVERSE OF PRESSURE                (INPUT-T)
!     PRPP5 (KPROF,KFLEV)   : INVERSE OF P(j) * P(j-1)           (INPUT-T)

!        Implicit arguments :  None.
!        --------------------

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

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

!     Reference.
!     ----------
!        ECMWF Research Department documentation of the IFS

!     Author.
!     -------
!        Jean-Noel THEPAUT METEO FRANCE/EERM/CRMD

!     Modifications.
!     --------------
!        Original : 89-12-12
!        J.N Thepaut: 92-04-08 . loop indexes (IO scheme)
!        Modified : 94-10-11 by Radmila Bubnova: correction in the case
!                            of the other approximation of d (ln p).
!        Modified : 2000-12 by Agathe Untch: vertical finite element scheme
!        M.Hamrud      01-Oct-2003 CY28 Cleaning
!        Modified : 2003-12 J. Hague:  Replace divides with reciprocal
!        Modified : 15-Feb-2005 by K. YESSAD: ZTOPPRES becomes TOPPRES
!        Modified : 10-Apr-2006 by K. YESSAD: PRTGR and PALPH also for LVERTFE=T
!     ------------------------------------------------------------------

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

USE YOMDYN   , ONLY : NDLNPR
USE YOMGEM   , ONLY : VAF      ,VBF      ,TOPPRES
USE YOMCVER  , ONLY : LVERTFE

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

IMPLICIT NONE

INTEGER(KIND=JPIM),INTENT(IN)    :: KPROMA 
INTEGER(KIND=JPIM),INTENT(IN)    :: KFLEV 
INTEGER(KIND=JPIM),INTENT(IN)    :: KSTART 
INTEGER(KIND=JPIM),INTENT(IN)    :: KPROF 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PVDELB(KFLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PVC(KFLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PRES(KPROMA,0:KFLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PDELP(KPROMA,KFLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PRDELP(KPROMA,KFLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PLNPR(KPROMA,KFLEV) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PALPH(KPROMA,KFLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PRTGR(KPROMA,KFLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PRPRE(KPROMA,KFLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PRPP(KPROMA,KFLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PRES5(KPROMA,0:KFLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PDELP5(KPROMA,KFLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PRDELP5(KPROMA,KFLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PLNPR5(KPROMA,KFLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PRPRE5(KPROMA,KFLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PRPP5(KPROMA,KFLEV) 

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

INTEGER(KIND=JPIM) :: IFIRST, JLEV, JLON

REAL(KIND=JPRB) :: ZPRESF, ZPRESF5
REAL(KIND=JPRB) :: ZHOOK_HANDLE
REAL(KIND=JPRB) :: ZPRESFD, ZPRESF5D

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

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

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

!*       0.    Level to begin normal computations
!              ----------------------------------

IF(PRES5(KSTART,0) <= TOPPRES)THEN
  IFIRST=2
ELSE
  IFIRST=1
  DO JLON=KSTART,KPROF
    IF(PRES5(JLON,0) <= TOPPRES)THEN
      IFIRST=2
      EXIT
    ENDIF
  ENDDO
ENDIF
!     ------------------------------------------------------------------

!*       1.    COMPUTES EVERYTHING.
!              --------------------

IF(NDLNPR == 0)THEN

  IF(LVERTFE) THEN
    DO JLEV=1,KFLEV
      DO JLON=KSTART,KPROF

        ! Trajectory:
        ZPRESF5=VAF(JLEV) + VBF(JLEV)*PRES5(JLON,KFLEV)
        ZPRESF5D=1.0_JPRB/ZPRESF5

        ! Adjoint:
        ZPRESF=0.0_JPRB
        ZPRESFD=0.0_JPRB

        ZPRESFD=ZPRESFD+(PRES5(JLON,JLEV)-ZPRESF5)*PALPH(JLON,JLEV)
        PRES(JLON,JLEV)=PRES(JLON,JLEV)+ZPRESF5D*PALPH(JLON,JLEV)
        ZPRESF=ZPRESF-ZPRESF5D*PALPH(JLON,JLEV)
        PALPH(JLON,JLEV)=0.0_JPRB

        ZPRESFD=ZPRESFD+VBF(JLEV)*PRTGR(JLON,JLEV)
        PRTGR(JLON,JLEV)=0.0_JPRB

        ZPRESF=ZPRESF-PDELP5(JLON,JLEV)*PLNPR(JLON,JLEV)*ZPRESF5D**2
        PDELP(JLON,JLEV)=PDELP(JLON,JLEV)+PLNPR(JLON,JLEV)*ZPRESF5D
        PLNPR(JLON,JLEV)=0.0_JPRB

        ZPRESF=ZPRESF-(ZPRESF5D*ZPRESF5D)*ZPRESFD
    
        PRES(JLON,KFLEV)=PRES(JLON,KFLEV)+VBF(JLEV)*ZPRESF
        PDELP(JLON,JLEV)=PDELP(JLON,JLEV)&
         & -PRDELP(JLON,JLEV)/PDELP5(JLON,JLEV)**2  
        PRDELP(JLON,JLEV)=0.0_JPRB
    
        PRES(JLON,KFLEV)=PRES(JLON,KFLEV)+PVDELB(JLEV)*PDELP(JLON,JLEV)
        PDELP(JLON,JLEV)=0.0_JPRB
      ENDDO
    ENDDO

  ELSE

    DO JLEV=1,IFIRST-1
      DO JLON=KSTART,KPROF
        PRES (JLON,JLEV)=PRES (JLON,JLEV)-(PRPRE5(JLON,JLEV)&
         & *PRPRE5(JLON,JLEV)/TOPPRES)*PRPP (JLON,JLEV)  
        PRPP (JLON,JLEV)=0.0_JPRB
        PRES (JLON,JLEV)=PRES (JLON,JLEV)-PRPRE5(JLON,JLEV)&
         & *PRPRE5(JLON,JLEV)*PRPRE(JLON,JLEV)  
        PRPRE(JLON,JLEV)=0.0_JPRB
        PRDELP(JLON,JLEV)=PRDELP(JLON,JLEV)+PVDELB(JLEV)*PRTGR(JLON,JLEV)
        PRTGR(JLON,JLEV)=0.0_JPRB
        PALPH (JLON,JLEV)=0.0_JPRB
        PRES(JLON,1)=PRES(JLON,JLEV)+1.0_JPRB/PRES5(JLON,JLEV)*PLNPR (JLON,JLEV)
        PLNPR (JLON,JLEV)=0.0_JPRB
        PDELP(JLON,JLEV)=PDELP(JLON,JLEV)+(-1.0_JPRB/PDELP5(JLON,JLEV)**&
         & 2)*&
         & PRDELP(JLON,JLEV)  
        PRDELP(JLON,JLEV)=0.0_JPRB
        PRES(JLON,JLEV)=PRES(JLON,JLEV)+PDELP(JLON,JLEV)
        PRES(JLON,JLEV-1)=PRES(JLON,JLEV-1)-PDELP(JLON,JLEV)
        PDELP(JLON,JLEV)=0.0_JPRB
      ENDDO
    ENDDO

    DO JLEV=KFLEV,IFIRST,-1
      DO JLON=KSTART,KPROF
        PRES(JLON,JLEV  )= PRES(JLON,JLEV)-PRPRE5(JLON,JLEV)&
         & *PRPRE5(JLON,JLEV)*PRPRE(JLON,JLEV)  
        PRPRE(JLON,JLEV  )=0.0_JPRB

        PLNPR(JLON,JLEV  )=PLNPR(JLON,JLEV)+PRDELP5(JLON,JLEV)**2*&
         & PVC(JLEV)*PRTGR(JLON,JLEV)  
        PRDELP(JLON,JLEV )=PRDELP(JLON,JLEV)+(2.0_JPRB*PRDELP5(JLON,JLEV)&
         & *PLNPR5(JLON,JLEV)*PVC(JLEV)+PVDELB(JLEV))&
         & *PRTGR(JLON,JLEV)  
        PRTGR(JLON,JLEV)=0.0_JPRB

        PLNPR(JLON,JLEV)=PLNPR(JLON,JLEV)-PRES5(JLON,JLEV-1)*&
         & PRDELP5(JLON,JLEV)*PALPH(JLON,JLEV)  
        PRDELP(JLON,JLEV)=PRDELP(JLON,JLEV)-PRES5(JLON,JLEV-1)*&
         & PLNPR5(JLON,JLEV)*PALPH(JLON,JLEV)  
        PRES(JLON,JLEV-1)=PRES(JLON,JLEV-1)-PRDELP5(JLON,JLEV)*&
         & PLNPR5(JLON,JLEV)*PALPH(JLON,JLEV)  
        PALPH(JLON,JLEV)=0.0_JPRB

        PRES(JLON,JLEV)=PRES(JLON,JLEV)+PLNPR(JLON,JLEV)/PRES5(JLON,JLEV)
        PRES(JLON,JLEV-1)=PRES(JLON,JLEV-1)-PLNPR(JLON,JLEV)/PRES5(JLON,JLEV-1)
        PLNPR(JLON,JLEV)=0.0_JPRB

        PRES(JLON,JLEV  )= PRES (JLON,JLEV)-PRPP5(JLON,JLEV)&
         & *PRPRE5(JLON,JLEV  )*PRPP (JLON,JLEV)  
        PRES(JLON,JLEV-1)= PRES (JLON,JLEV-1)-PRPP5(JLON,JLEV)&
         & *PRPRE5(JLON,JLEV-1)*PRPP (JLON,JLEV)  
        PRPP (JLON,JLEV  )=0.0_JPRB

        PDELP(JLON,JLEV)=PDELP(JLON,JLEV)+(-1.0_JPRB/PDELP5(JLON,JLEV)**&
         & 2)*&
         & PRDELP(JLON,JLEV)  
        PRDELP(JLON,JLEV)=0.0_JPRB

        PRES(JLON,JLEV)=PRES(JLON,JLEV)+PDELP(JLON,JLEV)
        PRES(JLON,JLEV-1)=PRES(JLON,JLEV-1)-PDELP(JLON,JLEV)
        PDELP(JLON,JLEV)=0.0_JPRB
      ENDDO
    ENDDO

  ENDIF

ELSEIF(NDLNPR == 1)THEN

  DO JLEV=IFIRST-1,1,-1
    DO JLON=KPROF,KSTART,-1
      PRDELP (JLON,JLEV)=PRDELP (JLON,JLEV)+&
       & 2.0_JPRB*PLNPR5(JLON,JLEV)**2 *PRDELP5(JLON,JLEV)&
       & *PRPP  (JLON,JLEV)  
      PLNPR (JLON,JLEV)=PLNPR (JLON,JLEV)+&
       & 2.0_JPRB*PLNPR5(JLON,JLEV)*PRDELP5(JLON,JLEV)**2 &
       & *PRPP  (JLON,JLEV)  
      PRPP  (JLON,JLEV)=0.0_JPRB
      PRES(JLON,1)=PRES(JLON,1)-1.0_JPRB/(PRES5(JLON,1))**2 *PRPRE (JLON,JLEV)
      PRPRE (JLON,JLEV)=0.0_JPRB
      PRDELP (JLON,JLEV)=PRDELP (JLON,JLEV)+PVDELB(JLEV)*PRTGR (JLON,JLEV)
      PRTGR (JLON,JLEV)=0.0_JPRB
      PALPH (JLON,JLEV)=0.0_JPRB
      PLNPR (JLON,JLEV)=0.0_JPRB
      PDELP(JLON,JLEV)=PDELP(JLON,JLEV)-1.0_JPRB/(PDELP5(JLON,JLEV))**2 &
       & *PRDELP (JLON,JLEV)  
      PRDELP (JLON,JLEV)=0.0_JPRB
      PRES(JLON,JLEV)=PRES(JLON,JLEV)+PDELP (JLON,JLEV)
      PDELP (JLON,JLEV)=0.0_JPRB
    ENDDO
  ENDDO

  DO JLEV=KFLEV,IFIRST,-1
    DO JLON=KPROF,KSTART,-1
      PRES(JLON,JLEV)=PRES(JLON,JLEV)-1.0_JPRB/(PRES5(JLON,JLEV))**2 &
       & * PRPRE (JLON,JLEV)  
      PRPRE (JLON,JLEV)=0.0_JPRB
      PRDELP (JLON,JLEV)=PRDELP (JLON,JLEV)+&
       & (PVDELB(JLEV)+PVC(JLEV)*PLNPR5(JLON,JLEV)*&
       & PRDELP5(JLON,JLEV)) * PRTGR (JLON,JLEV)  
      PLNPR (JLON,JLEV)=PLNPR (JLON,JLEV)+&
       & PRDELP5(JLON,JLEV)**2 *PVC(JLEV)*PRTGR (JLON,JLEV)  
      PRDELP (JLON,JLEV)=PRDELP (JLON,JLEV)+&
       & PRDELP5(JLON,JLEV)*PVC(JLEV)*PLNPR5(JLON,JLEV)&
       & *PRTGR (JLON,JLEV)  
      PRTGR (JLON,JLEV)=0.0_JPRB
      PLNPR (JLON,JLEV)=PLNPR (JLON,JLEV)&
       & -PRES5(JLON,JLEV-1)*PRDELP5(JLON,JLEV)*PALPH (JLON,JLEV)  
      PRDELP (JLON,JLEV)=PRDELP (JLON,JLEV)&
       & -PRES5(JLON,JLEV-1)*PLNPR5(JLON,JLEV)*PALPH (JLON,JLEV)  
      PRES (JLON,JLEV-1)=PRES (JLON,JLEV-1)&
       & -PRDELP5(JLON,JLEV)*PLNPR5(JLON,JLEV)*PALPH (JLON,JLEV)  
      PALPH (JLON,JLEV)=0.0_JPRB
      PDELP(JLON,JLEV)=PDELP(JLON,JLEV)+&
       & SQRT(PRPP5(JLON,JLEV)) *PLNPR (JLON,JLEV)  
      PRPP(JLON,JLEV)=PRPP(JLON,JLEV)+&
       & SQRT(PRPP5(JLON,JLEV)) *0.5_JPRB*PDELP5(JLON,JLEV)/&
       & PRPP5(JLON,JLEV)*PLNPR (JLON,JLEV)  
      PLNPR (JLON,JLEV)=0.0_JPRB
      PRES (JLON,JLEV)=PRES (JLON,JLEV)&
       & -1.0_JPRB/(PRES5(JLON,JLEV)*PRES5(JLON,JLEV-1))**2 *&
       & PRES5(JLON,JLEV-1)*PRPP  (JLON,JLEV)  
      PRES (JLON,JLEV-1)=PRES (JLON,JLEV-1)&
       & -1.0_JPRB/(PRES5(JLON,JLEV)*PRES5(JLON,JLEV-1))**2 *&
       & PRES5(JLON,JLEV)*PRPP  (JLON,JLEV)  
      PRPP  (JLON,JLEV)=0.0_JPRB
      PDELP(JLON,JLEV)=PDELP(JLON,JLEV)&
       & -1.0_JPRB/(PDELP5(JLON,JLEV))**2 *PRDELP (JLON,JLEV)  
      PRDELP (JLON,JLEV)=0.0_JPRB
      PRES(JLON,JLEV  )=PRES(JLON,JLEV  )+PDELP (JLON,JLEV)
      PRES(JLON,JLEV-1)=PRES(JLON,JLEV-1)-PDELP (JLON,JLEV)
      PDELP (JLON,JLEV)=0.0_JPRB
    ENDDO
  ENDDO

ENDIF

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

IF (LHOOK) CALL DR_HOOK('GPXYBAD',1,ZHOOK_HANDLE)
END SUBROUTINE GPXYBAD
