!-------------------------------------- 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 --------------------------------------
!

      SUBROUTINE ESTOHU(ZVAL,IMARK,KLIST,KNELE,KNVAL,KINT,KNELOUT) 3,11
      IMPLICIT NONE
#include "comlun.cdk"
#include "comcst.cdk"
#include "cparbrp.cdk"
#include "comnumbr.cdk"
#include "comphy.cdk"
#include "dintern8.cdk"
#include "fintern8.cdk"
      INTEGER KNELE,KNVAL,KINT,KNELOUT
      INTEGER KLIST(*)
      REAL*8 ZVAL(*)
      INTEGER IMARK(*)
*
#if defined (DOC)
************************************************************************
*
*       PURPOSE: TO COMPUTE SPECIFIC HUMIDITY FROM EXISTING RAOBS AND
*                SURFACE DATA EXTRACTED FROM A BURP FILE
*
*       AUTHOR:   D. ANSELMO (MRB/ARMA) October 2004
*                 (modified copy of FDTOUV.ftn)
*
*       REVISION:
*
*       ARGUMENTS:
*               INPUT:
*                      -ZVAL    : DATA BLOCK
*                      -IMARK   : MARKER DATA BLOCK
*                      -KLIST   : LIST OF BUFR ELEMENTS
*                      -KNELE   : NUMBER OF ELEMENTS IN DATA BLOCK
*                      -KNVAL   : NUMBER OF LEVELS IN DATA BLOCK
*                      -KINT    : THIRD DIMENSION OF INPUT DATA BLOCK
*                      -KNELOUT : THIRD DIMENSION OF OUTPUT DATA BLOCK
*
*               OUTPUT:
*                      -MODIFIED ZVAL AND KLIST
*
*               INTERNAL:
*                      -ZPROFES : PROFILE OF ES VALUES EXTRACTED FROM ZVAL
*                      -ZPROFTT : PROFILE OF TT VALUES EXTRACTED FROM ZVAL
*                      -ZPROFPS : PROFILE OF PS VALUES EXTRACTED FROM ZVAL
*                      -ZPROFHU : PROFILE OF HU VALUES EXTRACTED FROM ZVAL
*
*
************************************************************************
#endif
*
      REAL*8 ZPROFES(JPMXNLV),ZPROFTT(JPMXNLV)
      REAL*8 ZPROFPP(JPMXNLV),ZPROFHU(JPMXNLV)
      REAL*8 ZVAL2(JPLNG)
      INTEGER IMARK2(JPLNG)
      REAL*8 ZES,ZTT,ZPP,ZTD,ZESTD,ZHU
      INTEGER JJ,JN,INDEX1,INDEX2,J1,J2,J3
      INTEGER IND1,IND2,IND3,IND4
      INTEGER IES,ITT,IPP,IHU
      logical llmis,lladd2,LLEXPAND,LLPRINT
*
cc      LLPRINT = .TRUE.
      LLPRINT = .FALSE.
*
************************************************************************
*     BURP FILE ELEMENT NAMES
*     GET ES,TT,PP
************************************************************************
*
      IES=NEES
      ITT=NETT
      IPP=NEPP
      IHU=NEHU
      lladd2=.true.
      KNELOUT=KNELE+1
      CALL GETELE(IES,1,KLIST,ZVAL,ZPROFES,KNELE,KNVAL,KINT,IND1)
      CALL GETELE(ITT,1,KLIST,ZVAL,ZPROFTT,KNELE,KNVAL,KINT,IND2)
      CALL GETELE(IPP,1,KLIST,ZVAL,ZPROFPP,KNELE,KNVAL,KINT,IND3)
      CALL GETELE(IHU,1,KLIST,ZVAL,ZPROFHU,KNELE,KNVAL,KINT,IND4)
C
C        FOR SURFACE (SYNOP ...etc..) ES,TT at 2 M iS REPORTED
C
      IF ( IND1 .EQ. -1 .AND. IND2 .EQ. -1 .AND. IND3 .EQ. -1 ) THEN
         IES=NESS
         ITT=NETS
         IPP=NEPS
         CALL GETELE(IES,1,KLIST,ZVAL,ZPROFES,KNELE,KNVAL,KINT,IND1)
         CALL GETELE(ITT,1,KLIST,ZVAL,ZPROFTT,KNELE,KNVAL,KINT,IND2)
         CALL GETELE(IPP,1,KLIST,ZVAL,ZPROFPP,KNELE,KNVAL,KINT,IND3)
         IF ( IND1 .NE. -1 .AND. IND2 .NE. -1 .AND. IND3 .NE. -1 ) THEN
            IHU=NEHS
            CALL GETELE(IHU,1,KLIST,ZVAL,ZPROFHU,KNELE,KNVAL,KINT,IND4)
         ENDIF
      ENDIF
C
      LLEXPAND=.FALSE.
      IF ( (IND1 .NE. -1) .AND. (IND2 .NE. -1) .AND. (IND3 .NE. -1) .AND.
     +   (IND4 .EQ. -1) )THEN
       LLEXPAND=.TRUE.
      DO 2 JN=1,KINT
         CALL GETELE(IES,JN,KLIST,ZVAL,ZPROFES,KNELE,KNVAL,KINT,IND1)
         CALL GETELE(ITT,JN,KLIST,ZVAL,ZPROFTT,KNELE,KNVAL,KINT,IND2)
         CALL GETELE(IPP,JN,KLIST,ZVAL,ZPROFPP,KNELE,KNVAL,KINT,IND3)
C
C        FOR SURFACE (SYNOP ...etc..) ES,TT at 2 M iS REPORTED
C
*
************************************************************************
*    -IF ES,TT,PP WERE FOUND CONVERT TO HU
*    -CHECK IF MISSING DATA
*    -SET FLAGS TO 0
************************************************************************
*
*        for residual or background check configuration
C
         IF ( lladd2 ) THEN
            KLIST(KNELE+1)=IHU
         ELSE
            KLIST(IND1)=IHU
         ENDIF
*
*
         DO 3 JJ=1,KNVAL
            IF (LLPRINT) write(nulout,*)' ----ESTOHU: press= ',ZPROFPP(JJ)
            IF ( lladd2 ) THEN
               INDEX1=KNELE+1 + (JJ-1)*(KNELOUT)+(JN-1)*(KNVAL)*(KNELOUT)
            ELSE
               INDEX1=IND1    + (JJ-1)*(KNELOUT)+(JN-1)*(KNVAL)*(KNELOUT)
            ENDIF
            IMARK2(INDEX1)=0
            zVAL2(INDEX1)=PPMIS
*
            IF ( ZPROFES(JJ).GT.30. .OR. ZPROFES(JJ).LT.0. ) THEN
               ZPROFES(JJ) = PPMIS
            ENDIF
            llmis=(ZPROFES(JJ) .eq. PPMIS) .OR. (ZPROFTT(JJ) .eq. PPMIS)
     +            .OR. (ZPROFPP(JJ) .eq. PPMIS)
            if ( .NOT. LLMIS) THEN
*
                ZES=ZPROFES(JJ)
                ZTT=ZPROFTT(JJ)
                ZPP=ZPROFPP(JJ)

*=============================================
c  COMPUTE LQ given ES,TT,PP
c      a) compute td
c      b) compute sat. vap. press using Tetens (water)
c      c) compute ln q
*=============================================

                ZTD   = ZTT - ZES
                ZESTD = foewa8(ZTD)
                ZHU   = log( foqfe8(ZESTD,ZPP) )

                IF (LLPRINT) THEN
                  write(nulout,*)'     ZES = ',ZES
                  write(nulout,*)'     ZTT = ',ZTT
                  write(nulout,*)'     ZTD = ',ZTD
                  write(nulout,*)'   ZESTD = ',ZESTD
                  write(nulout,*)'     ZHU = ',ZHU
                ENDIF

                IF ( lladd2 ) THEN
                   ZVAL2(INDEX1)= ZHU
                   IMARK2(INDEX1)=0
                ELSE
                   ZVAL (INDEX1)= ZHU
                ENDIF
             else
                IF ( lladd2 ) THEN
                   ZVAL2(INDEX1)=ppmis
                ELSE
                   ZVAL (INDEX1)=ppmis
                ENDIF
             endif
C
*=============================================
    3    CONTINUE
*
    2 CONTINUE
      ENDIF
C
C      TRANSFER BACK TO INPUT ARRAYS
C
      IF ( lladd2 .AND. LLEXPAND ) THEN
         DO J1 =1,KNELE
            DO J2 =1,KNVAL
               DO J3 =1,KINT
                  INDEX1=J1 + (J2-1)*KNELE   +(J3-1)*KNELE*KNVAL
                  INDEX2=J1 + (J2-1)*KNELOUT +(J3-1)*KNELOUT*KNVAL
                  ZVAL2 (INDEX2)= ZVAL(INDEX1)
                  IMARK2(INDEX2)=IMARK(INDEX1)
               END DO
            END DO
         END DO
C
         DO JJ =1,KNELOUT*KNVAL*KINT
            ZVAL (JJ)= ZVAL2(JJ)
            IMARK(JJ)=IMARK2(JJ)
         END DO
      ELSE
CC    NO WORK DONE BY ROUTINE
         KNELOUT=KNELE
      ENDIF
C
      RETURN
      END