* PACKAGE DHYDR       !" 力学 静水圧 GCM5(DHYDR)
*
***********************************************************************
      SUBROUTINE WHYDRO     !" 静水圧の式 ( スペクトル )
     O         ( WDPHI ,
     I           WDT    )
*
*"                 Arakawa & Suarez 鉛直差分 σ座標
*
*   [PARAM] 
#ifdef SYS_IBMS
      INCLUDE   (ZCDIM)                      !" 格子点数, 波数
      INCLUDE   (ZCCOM)                      !" 標準物理定数
#else
#include        "zcdim.F"                    !" 格子点数, 波数
#include        "zccom.F"                    !" 標準物理定数
#endif
*
*   [OUTPUT] 
      REAL       WDPHI ( NMDIM, KMAX )       !" 高度  Φ
      REAL       WDT   ( NMDIM , KMAX     )  !" 温度  Ｔ
*
*   [INPUT] 
      REAL       GDPHI ( IDIM*JDIM, KMAX )   !" 高度  Φ
      REAL       GDT   ( IDIM*JDIM, KMAX )   !" 温度  Ｔ
*
      REAL       SALPHA( KMAX )              !" 静水圧の式の係数 α
      REAL       SBETA ( KMAX )              !" 静水圧の式の係数 β
*
*   [ENTRY INPUT] 
      REAL       SIG   ( KMAX )              !" σレベル(整数)
      REAL       SIGM  ( KMAX+1 )            !" σレベル(半整数)
*
*   [INTERNAL SAVE] 
      REAL       SALPHZ( KMAX )              !" 静水圧の式の係数 α
      REAL       SBETZ ( KMAX )              !" 静水圧の式の係数 β
      LOGICAL    OSET                        !" 定数セットフラグ
      DATA       OSET / .FALSE. /
      SAVE       SALPHZ , SBETZ, OSET
*   [INTERNAL WORK] 
      INTEGER    IJ, K, NM
      REAL       AKAPPA
*
      IF ( .NOT. OSET ) THEN
         CALL MSGDMP( 'E','WHYDRO','CONSTANTS ARE NOT SET.')
      ENDIF
*
*"         < 1. スペクトル空間での積み上げ >
*
      DO 1100 NM = 1, NMDIM
            WDPHI ( NM,1 ) = CP * SALPHZ( 1 ) * WDT ( NM,1 )
 1100 CONTINUE
*
      DO 1200 K = 2, KMAX
         DO 1200 NM = 1, NMDIM
            WDPHI ( NM,K ) = WDPHI( NM,K-1 )
     &                          + CP * SALPHZ( K   ) * WDT ( NM,K   )
     &                          + CP * SBETZ ( K-1 ) * WDT ( NM,K-1 )
 1200 CONTINUE
*
      RETURN
*======================================================================
      ENTRY      GHYDRO     !" 静水圧の式 ( 格子点 )
     O         ( GDPHI ,
     I           GDT     )
*
      IF ( .NOT. OSET ) THEN
         CALL MSGDMP( 'E','GHYDRO','CONSTANTS ARE NOT SET.')
      ENDIF
*
*"         < 2. 格子空間での積み上げ >
*
      DO 2100 IJ = 1, IDIM*JDIM
            GDPHI ( IJ,1 ) = CP * SALPHZ( 1   ) * GDT ( IJ,1 )
 2100 CONTINUE
*
      DO 2200 K = 2, KMAX
         DO 2200 IJ = 1, IDIM*JDIM
            GDPHI ( IJ,K ) = GDPHI( IJ,K-1 )
     &                     + CP * SALPHZ( K   ) * GDT ( IJ,K   )
     &                     + CP * SBETZ ( K-1 ) * GDT ( IJ,K-1 )
 2200 CONTINUE
*
      RETURN
*======================================================================
      ENTRY      HYDROS         !" 静水圧の係数の設定
     I         ( SIG   , SIGM  )
*
      AKAPPA = RAIR / CP
      DO 3100 K = 1, KMAX
         SALPHZ( K ) =        ( SIGM( K   )/SIG ( K ) )**AKAPPA - 1.  
         SBETZ ( K ) = 1.   - ( SIGM( K+1 )/SIG ( K ) )**AKAPPA
 3100 CONTINUE
*
      OSET = .TRUE.
*
      RETURN
*===================================================================
      ENTRY      HYDROQ       !" 静水圧の係数の参照
     O         ( SALPHA, SBETA )
*
      CALL COPY ( SALPHA, SALPHZ, KMAX )
      CALL COPY ( SBETA , SBETZ , KMAX )
*
      RETURN
      END
