| Path: | src/dynamics/velocityx.f90 |
| Last Update: | Sat Apr 23 00:01:52 JST 2005 |
Copyright (C) GFD Dennou Club, 2004. All rights reserved.
* Developer: SUGIYAMA Ko-ichiro (sugiyama@gfd-dennou.org) * Version: $Id: velocityx.f90,v 1.2 2005/04/22 15:01:52 sugiyama Exp $ * Tag Name: $Name: $ * Change History:
オイラー法を用いた X 方向の速度の計算. deepconv/arare では時間積分として He-VI 法を利用しているので, X 方向の速度は陽解法で解く.
* エクスナー関数の空間方向の離散化において, 2 次精度の離散化を陽に利用しているため, 本サブプログラムにおいても differentiate_center4 モジュールを指定することはできないので注意.
| fs_VelX_in(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) | ||
| DelTime : | real(8), intent(in)
| ||
| fs_AdvDiffX(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) | ||
| ss_Exner(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) | ||
| fs_VelX_out(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(out)
|
subroutine VelocityX( fs_VelX_in, DelTime, fs_AdvDiffX, fs_VelX, sf_VelZ, ss_Exner, fs_VelX_out )
!=begin
!== Dependency
!=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