SUBROUTINE GPGEOTL(KPROMA,KSTART,KPROF,KFLEV,PHI,PHIF,PT,PR,PLNPR,&
 & PALPH,PT5,PR5,PLNPR5,PALPH5)  

!**** *GPGEOTL* - Computes half and full level geopotential,tangent linear

!     Purpose.
!     --------
!           Computes half and full level geopotential,tangent linear

!**   Interface.
!     ----------
!        *CALL* *GPGEOTL(KPROMA,KSTART,KPROF,KFLEV,PHI,PHIF,PT,PR,PLNPR,PALPH,
!                       PT5,PR5,PLNPR5,PALPH5)

!        Explicit arguments :
!        --------------------
!           KPROMA : horiz. dimensioning
!           KSTART :  start of the packet
!           KPROF  : depth of work
!           KFLEV  : number of levels
!           PHI(KPROMA,0:KFLEV)   HALF LEVEL GEOPOTENTIAL    (output)
!           PHIF(KPROMA,KFLEV)    FULL LEVEL GEOPOTENTIAL    (output)
!           PT(KPROMA,KFLEV)     TEMPERATURE                 (input)
!           PR(KPROMA,KFLEV)      R                          ( input)
!           PLNPR(KPROMA,KFLEV)   LOG OF RATIO OF PRESSURE   (input)
!           PALPH(KPROMA,KFLEV)   HYDROSTATICS               (input)
!           PT5(KPROMA,KFLEV)     TEMPERATURE                (input-t)
!           PR5(KPROMA,KFLEV)      R                         (input-t)
!           PLNPR5(KPROMA,KFLEV)   LOG OF RATIO OF PRESSURE  (input-t)
!           PALPH5(KPROMA,KFLEV)   HYDROSTATICS              (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
!        Modified 2000-11 by A. Untch: vertical finite element scheme
!        M.Hamrud      01-Oct-2003 CY28 Cleaning
!     ------------------------------------------------------------------

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

USE YOMGEM   , ONLY : VFE_RDETAH
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(INOUT) :: PHI(KPROMA,0:KFLEV) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PHIF(KPROMA,KFLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PT(KPROMA,KFLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PR(KPROMA,KFLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PLNPR(KPROMA,KFLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PALPH(KPROMA,KFLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PT5(KPROMA,KFLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PR5(KPROMA,KFLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PLNPR5(KPROMA,KFLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PALPH5(KPROMA,KFLEV) 

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

REAL(KIND=JPRB) :: ZPHI(KPROMA,KFLEV)
REAL(KIND=JPRB) :: ZOUT(KPROMA,0:KFLEV)

INTEGER(KIND=JPIM) :: JLEV, JLON
REAL(KIND=JPRB) :: ZHOOK_HANDLE

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

#include "verint.intfb.h"

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

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

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

!*       1.    COMPUTES HALF AND FULL LEVEL GEOPOTENTIAL.
!              ------------------------------------------

IF(LVERTFE) THEN
  ! FULL LEVEL GEOPOTENTIAL
  DO JLEV=1,KFLEV
    DO JLON=KSTART,KPROF
      ZPHI(JLON,JLEV)=-PR (JLON,JLEV)*PT5(JLON,JLEV)&
       & *PLNPR5(JLON,JLEV)*VFE_RDETAH(JLEV)&
       & -PR5(JLON,JLEV)*PT (JLON,JLEV)&
       & *PLNPR5(JLON,JLEV)*VFE_RDETAH(JLEV)&
       & -PR5(JLON,JLEV)*PT5(JLON,JLEV)&
       & *PLNPR (JLON,JLEV)*VFE_RDETAH(JLEV)  
    ENDDO
  ENDDO
  CALL VERINT(KPROMA,KSTART,KPROF,KFLEV,ZPHI,ZOUT,1)
  DO JLEV=1,KFLEV
    DO JLON=KSTART,KPROF
      PHIF(JLON,JLEV) =ZOUT(JLON,JLEV-1)
    ENDDO
  ENDDO
  ! HALF LEVEL GEOPOTENTIAL
  DO JLEV=KFLEV,1,-1
    DO JLON=KSTART,KPROF
      PHI(JLON,JLEV-1)=PHI(JLON,JLEV)&
       & +PR5(JLON,JLEV)*PT5(JLON,JLEV)*PLNPR(JLON,JLEV)&
       & +PR5(JLON,JLEV)*PT(JLON,JLEV)*PLNPR5(JLON,JLEV)&
       & +PR(JLON,JLEV)*PT5(JLON,JLEV)*PLNPR5(JLON,JLEV)  
    ENDDO
  ENDDO
ELSE
  ! HALF LEVEL GEOPOTENTIAL
  DO JLEV=KFLEV,1,-1
    DO JLON=KSTART,KPROF
      PHI(JLON,JLEV-1)=PHI(JLON,JLEV)&
       & +PR5(JLON,JLEV)*PT5(JLON,JLEV)*PLNPR(JLON,JLEV)&
       & +PR5(JLON,JLEV)*PT(JLON,JLEV)*PLNPR5(JLON,JLEV)&
       & +PR(JLON,JLEV)*PT5(JLON,JLEV)*PLNPR5(JLON,JLEV)  
    ENDDO
  ENDDO
  ! FULL LEVEL GEOPOTENTIAL
  DO JLEV=1,KFLEV
    DO JLON=KSTART,KPROF
      PHIF(JLON,JLEV)=PHI(JLON,JLEV)&
       & +PALPH5(JLON,JLEV)*PR5(JLON,JLEV)*PT(JLON,JLEV)&
       & +PALPH5(JLON,JLEV)*PR(JLON,JLEV)*PT5(JLON,JLEV)&
       & +PALPH(JLON,JLEV)*PR5(JLON,JLEV)*PT5(JLON,JLEV)  
    ENDDO
  ENDDO
ENDIF

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

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

