!-*- F90 -*-

module modgps07geostruct 6,4
#if defined (DOC)
  !
  ! Structure containing the geopotential height and derivatives
  ! of a model profile.
  !
  ! Functions:
  !      Construct the geop hgt cached profiles.
  !
  ! Josep M. Aparicio
  ! Meteorological Service of Canada, 2003.
  ! Revisions:
  !        J.M. Aparicio - ARMA Feb 2012
  !          Improved compressibility
  !
#endif
  use modgps00base     , only : i4, dp, ngpssize
  use modgps03diff
  use modgps04profile  , only : gpsprofile
  use modgps05refstruct, only : gpspre, gpstem, gpsQ, gpscmp

  implicit none
  
contains
  

  subroutine gpsgeo(prf) 10,4
    type(gpsprofile)    :: prf
    
    integer(i4)         :: i, ngpslev
    
    real(dp), parameter :: Avog  = 6.02214e26_dp
    real(dp), parameter :: Boltz = 1.38065e-23_dp
    real(dp), parameter :: mwDAir= 28.966_dp
    real(dp), parameter :: Rd=Avog*Boltz/mwDAir
    real(dp), parameter :: Rg=9.80616_dp

    real(dp), parameter :: alpha = -1._dp
    real(dp), parameter :: rgasd = 287.05_dp
    real(dp), parameter :: delta = 0.6077686814144_dp

    type(gpsdiff)       :: xi (ngpssize)
    type(gpsdiff)       :: tv (ngpssize)
    type(gpsdiff)       :: cmp(ngpssize)

    type(gpsdiff)       :: tvm
    type(gpsdiff)       :: dx
    type(gpsdiff)       :: z
    type(gpsdiff)       :: q,p,t,Zt

    if (prf%bgst .EQV. .false.) then
       call gpspre(prf)
       call gpstem(prf)
       call gpsQ  (prf)
       call gpscmp(prf,cmp)
       ngpslev=prf%ngpslev

       do i = 1, ngpslev
          p = prf%pst(i)
          t = prf%tst(i)
          q = prf%qst(i)
          Zt= cmp(i)
          !
          ! Log(P)
          !
          xi(i) = log(p)
          !
          ! Virtual temperature (K) (corrected of compressibility)
          !
          tv(i) = (1._dp+delta*q) * t * Zt
       enddo
       
       !
       ! Hydrostatic equation
       !
       prf%gst(ngpslev) = prf%rMT
       do i = ngpslev-1, 1, -1
          dx  =  xi(i)-xi(i+1)
          tvm = 0.5_dp*(tv(i)+tv(i+1))
          !
          ! Geopotential height increment
          !
          z   = (-Rd/Rg) * tvm * dx
          prf%gst(i) = prf%gst(i+1) + z
       enddo
       prf%bgst = .true.
    endif

  end subroutine gpsgeo

end module modgps07geostruct