!---------------------------------------------------------------------
!     Copyright (C) GFD Dennou Club, 2004. All rights reserved.
!---------------------------------------------------------------------
                                                                 !=begin
!= Subroutine VelocityX
!
!   * Developer: SUGIYAMA Ko-ichiro (sugiyama@gfd-dennou.org)
!   * Version: $Id:  $ 
!   * Tag Name: $Name:  $
!   * Change History: 
!
!== Overview 
!
!オイラー法を用いた X 方向の速度の計算. 
!deepconv/arare では時間積分として He-VI 法を利用しているので, 
!X 方向の速度は陽解法で解く. 
!
!== Error Handling
!
!== Known Bugs
!
!== Note
!
!  * エクスナー関数の空間方向の離散化において, 2 次精度の離散化を陽に利用しているため, 本サブプログラムにおいても differentiate_center4 モジュールを指定することはできないので注意.
!
!== Future Plans
!
                                                                 !=end

subroutine VelocityX(                           &
     & fs_VelX_in,                              &
     & DelTime,                                 &
     & fs_AdvDiffX, fs_VelX, sf_VelZ, ss_Exner, &
     & fs_VelX_out )
                                                                 !=begin
  !== Dependency
  use dc_trace, only: BeginSub, EndSub
  use gridset,  only: DimXMin, DimXMax, DimZMin, DimZMax
  use basicset, only: ss_CpBasicZ, ss_PotTempBasicZ
  use bcset,    only: fs_BC
  use arareset, only: alpha
  use average,  only: fs_avr_ss
  use differentiate_center2,  only: fs_dx_ss, ss_dx_fs, ss_dz_sf

                                                                 !=end  
  !== 暗黙の型宣言禁止
  implicit none
                                                                 !=begin  
  !== Input
  real(8), intent(in)    :: DelTime
  real(8), intent(in)    :: fs_VelX_in(DimXMin:DimXMax, DimZMin:DimZMax)
  real(8), intent(in)    :: ss_Exner(DimXMin:DimXMax, DimZMin:DimZMax)
  real(8), intent(in)    :: fs_VelX(DimXMin:DimXMax, DimZMin:DimZMax)
  real(8), intent(in)    :: sf_VelZ(DimXMin:DimXMax, DimZMin:DimZMax)
  real(8), intent(in)    :: fs_AdvDiffX(DimXMin:DimXMax, DimZMin:DimZMax)

  !== Output
  real(8), intent(out)   :: fs_VelX_out(DimXMin:DimXMax, DimZMin:DimZMax)
                                                                 !=end  
  !== Work
  real(8)                :: ss_DivVel(DimXMin:DimXMax, DimZMin:DimZMax)
  real(8)                :: fs_PressGradVelX(DimXMin:DimXMax, DimZMin:DimZMax)
  real(8)                :: fs_TendVelX(DimXMin:DimXMax, DimZMin:DimZMax)


  call BeginSub("VelocityX", &
&           fmt="%c",        &
&           c1="Calculate VelXShort (fs_VelX).")

  !=== 速度の収束
  ss_DivVel =  ss_dx_fs( fs_VelX ) + ss_dz_sf( sf_VelZ )
  

  !=== 速度 u の計算 (圧力傾度は前進差分で評価)
  fs_PressGradVelX =  &
       & - fs_avr_ss( ss_CpBasicZ * ss_PotTempBasicZ )  &
       &   * ( fs_dx_ss( ss_Exner ) - fs_dx_ss( alpha * ss_DivVel ) )  


  !=== 微分係数の評価
  fs_TendVelX = fs_PressGradVelX + fs_AdvDiffX
  

  !=== 数値積分
  fs_VelX_out = fs_VelX_in + DelTime * fs_TendVelX
  

  !=== 境界条件
  call boundary(fs_BC, fs_VelX_out)
  

  call EndSub("VelocityX")
  
end subroutine VelocityX


    
