!-------------------------------------- LICENCE BEGIN ------------------------------------
!Environment Canada - Atmospheric Science and Technology License/Disclaimer, 
!                     version 3; Last Modified: May 7, 2008.
!This is free but copyrighted software; you can use/redistribute/modify it under the terms 
!of the Environment Canada - Atmospheric Science and Technology License/Disclaimer 
!version 3 or (at your option) any later version that should be found at: 
!http://collaboration.cmc.ec.gc.ca/science/rpn.comm/license.html 
!
!This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
!without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
!See the above mentioned License/Disclaimer for more details.
!You should have received a copy of the License/Disclaimer along with this software; 
!if not, you can write to: EC-RPN COMM Group, 2121 TransCanada, suite 500, Dorval (Quebec), 
!CANADA, H9P 1J3; or send e-mail to service.rpn@ec.gc.ca
!-------------------------------------- LICENCE END --------------------------------------
***s/r p0vt2gz_hyb - Compute hydrostatic GZ from P0 and VT
*
#include "model_macros_f.h"
*

      subroutine p0vt2gz_hyb (F_gz, F_pia, F_pib, F_ps, F_vt,  14
     $                             n, Nk, F_pib_L, F_sig_L)
      implicit none
*
      logical F_pib_L,F_sig_L
      integer n, Nk
      real F_gz(n,Nk), F_vt(n,Nk), F_ps(n), F_pia(Nk), F_pib(Nk)
*
*author
*
*revision
* v2_00 - Desgagne M.       - initial MPI version (from p0vt2gz v1_03)
* v2_30 - Edouard  S.       - adapt for vertical hybrid coordinate
* v3_00 - Lee v.            - treats 2D plane as 1-D vector no halos
* v3_02 - Lemay G.          - Vectorisation
* v3_21 - Lee V.            - Output Optimization
*

*object
*       see id section
*
*arguments
*  Name        I/O                 Description
*----------------------------------------------------------------
* F_gz         O    - geopotential height
* F_pia        I    - actually RNA if F_sig_L=T
*                   - pia          if F_sig_L=F
* F_pib        I    - unused       if F_sig_L=T
*                   - pib          if F_sig_L=F and F_pib_L=T
*                   - pibb         if F_sig_L=F and F_pib_L=F
* F_ps         I    - ln(pi_s/z_s) if F_pib_L=T
*                   - pi_S         if F_pib_L=F or F_sig_L=T
* F_vt         I    - virtual temperature
* F_pib_L      I    - TRUE or FALSE
* F_sig_L      I    - TRUE or FALSE
*
*implicits
#include "lun.cdk"
#include "dcst.cdk"
#include "glb_ld.cdk"
#include "geomg.cdk"
*
**
      integer i,k,ik
      real*8 invdet
      real con,q1,q2,q3,x0,xm,xp,aa,bb,cc,dd,zak,zbk,zck
      real pr(n,Nk), vma(n,Nk), vmb(n,Nk), vmc(n,Nk), ex,expps(n)
*
*     ---------------------------------------------------------------
*
      con = -Dcst_rgasd_8
*
      if (F_pib_L) then
          do i=1,n
             expps(i)=exp( F_ps(i) )
          enddo
      endif

      if (F_sig_L) then
          do k=1,Nk
          do i=1,n
          pr(i,k) =  F_pia(k)  *  F_ps(i)
          enddo
          enddo
      else
          if (F_pib_L) then
              do k=1,Nk
              do i=1,n
               pr(i,k) = F_pia(k) + F_pib(k)*expps(i)
              enddo
              enddo
          else
              do k=1,Nk
              do i=1,n
               pr(i,k) = F_pia(k) + F_pib(k)*F_ps(i)
              enddo
              enddo
          endif
      endif
*
!$omp parallel private(q1,q2,q3,x0,xm,xp,aa,bb,
!$omp$                 cc,dd,invdet,zak,zbk,zck,ex,i)
!$omp$         shared (vma, vmb, vmc, con,pr)
!$omp do
      do k=1,Nk            
      do i=1,n
         x0=pr(i,k)
         if (k.eq.1) then
            xm=pr(i,1)
            xp=pr(i,2)
            aa=pr(i,3)-x0
            bb=pr(i,2)-x0
         elseif (k.eq.nk) then
            xm=pr(i,Nk-1)
            xp=pr(i,Nk)
            aa=pr(i,Nk-1)-x0
            bb=pr(i,Nk-2)-x0
         else
            xm=pr(i,k-1)
            xp=pr(i,k+1)
            aa=xm-x0
            bb=xp-x0
         endif

         q1=alog(xp/xm)
         q2=xp-xm
         q3=(xp*xp - xm*xm)*0.5

         q3=q3-x0*(2.0*q2-x0*q1)
         q2=q2-x0*q1
         cc=aa*aa
         dd=bb*bb
         invdet=aa*dd-bb*cc
         invdet = 0.5/invdet
         vma(i,k)=(dd*q2-bb*q3)*invdet
         vmc(i,k)=(aa*q3-cc*q2)*invdet
         vmb(i,k)=q1*0.5-vma(i,k)-vmc(i,k)
      end do
      end do
!$omp enddo
*
!$omp do
      do i=1,n
         zak = -2.0*con*vma(i,nk)
         zbk = -2.0*con*vmb(i,nk)
         zck = -2.0*con*vmc(i,nk)
         F_gz(i,nk-1) = zak * F_vt(i,nk-1) + zbk * F_vt(i,nk) +
     $                  zck * F_vt(i,nk-2) + F_gz(i,nk)
      end do
!$omp enddo
!$omp end parallel
*
      do k = 1, nk-2
         ik  = nk-1-k
         do i=1,n
            zak = -2.0*con*vma(i,ik+1)
            zbk = -2.0*con*vmb(i,ik+1)
            zck = -2.0*con*vmc(i,ik+1)
            F_gz(i,ik) = zak * F_vt(i,ik  ) + zbk * F_vt(i,ik+1) +
     $                   zck * F_vt(i,ik+2) + F_gz(i,ik+2)
*
         end do
      end do
*
*     ---------------------------------------------------------------
*
      return
      end