Class DynFunc
In: dynamic/dynfunc.f90

陽開放を用いた力学過程の各項の計算モジュール. 具体的には以下の項を計算するための関数を格納する.

 * 移流項
 * 浮力項
 * 気圧傾度力項

Methods

Included Modules

gridset damping basicset average StorePotTemp StoreMixRt StoreMom StoreBuoy differentiate_center4 differentiate_center2

Public Instance methods

Function :
pz_AdvVelX(DimXMin:DimXMax, DimZMin:DimZMax) :real(8)
: スカラー量の水平移流
pz_VelX(DimXMin:DimXMax, DimZMin:DimZMax) :real(8), intent(in)
: 水平風速
xr_VelZ(DimXMin:DimXMax, DimZMin:DimZMax) :real(8), intent(in)
: 鉛直風速

z 方向に半格子ずれた点における移流を計算

[Source]

  function pz_AdvVelX(pz_VelX, xr_VelZ)
    !
    ! z 方向に半格子ずれた点における移流を計算
    !
    
    !モジュール読み込み
    use differentiate_center4, only: xz_dx_pz, pr_dz_pz
!    use differentiate_center2, only: xz_dx_pz, pr_dz_pz

    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(8), intent(in) :: pz_VelX(DimXMin:DimXMax, DimZMin:DimZMax)
                                                        !水平風速
    real(8), intent(in) :: xr_VelZ(DimXMin:DimXMax, DimZMin:DimZMax)
                                                        !鉛直風速
    real(8)             :: pz_AdvVelX(DimXMin:DimXMax, DimZMin:DimZMax)
                                                        !スカラー量の水平移流
    
!    pz_AdvVelX = 0.0d0  !初期化
    pz_AdvVelX = - pz_VelX * pz_avr_xz( xz_dx_pz( pz_VelX ) ) - pz_avr_pr( pr_avr_xr( xr_VelZ ) * pr_dz_pz( pz_VelX ) )
    
    call StoreMomAdv( pz_AdvVelX )   

  end function pz_AdvVelX
Function :
pz_GradPi(DimXMin:DimXMax, DimZMin:DimZMax) :real(8)
: 圧力傾度力
xz_Exner(DimXMin:DimXMax, DimZMin:DimZMax) :real(8), intent(in)
: エクスナー関数の擾乱
pz_VelX(DimXMin:DimXMax, DimZMin:DimZMax) :real(8), intent(in)
: 水平速度
xr_VelZ(DimXMin:DimXMax, DimZMin:DimZMax) :real(8), intent(in)
: 鉛直速度

z 方向に半格子ずれた点での圧力傾度力項の計算. 音波減衰項を含めた形式で定式化してあることに注意.

[Source]

  function pz_GradPi(xz_Exner, pz_VelX, xr_VelZ)
    !
    ! z 方向に半格子ずれた点での圧力傾度力項の計算. 
    ! 音波減衰項を含めた形式で定式化してあることに注意.
    !
    
    !モジュール読み込み
    use differentiate_center2,  only: pz_dx_xz, xz_dx_pz, xz_dz_xr
        
    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(8), intent(in)  :: xz_Exner(DimXMin:DimXMax, DimZMin:DimZMax)
                                               !エクスナー関数の擾乱
    real(8), intent(in)  :: pz_VelX(DimXMin:DimXMax, DimZMin:DimZMax)
                                               !水平速度
    real(8), intent(in)  :: xr_VelZ(DimXMin:DimXMax, DimZMin:DimZMax)
                                               !鉛直速度
    real(8)              :: pz_GradPi(DimXMin:DimXMax, DimZMin:DimZMax)
                                               !圧力傾度力
    real(8)              :: xz_DivVel(DimXMin:DimXMax, DimZMin:DimZMax)
                                               !速度の収束

    !速度の収束
    xz_DivVel =  xz_dx_pz( pz_VelX ) + xz_dz_xr( xr_VelZ )
    
    !圧力傾度
!    pz_GradPi = 0.0d0
    pz_GradPi = pz_avr_xz( CpDry * xz_PotTempBasicZ / xz_EffMolWtBasicZ ) * ( pz_dx_xz( xz_Exner ) - pz_dx_xz( DampSound * xz_DivVel ) )  
    
  end function pz_GradPi
Function :
xr_AdvVelZ(DimXMin:DimXMax, DimZMin:DimZMax) :real(8)
: スカラー量の水平移流
xr_VelZ(DimXMin:DimXMax, DimZMin:DimZMax) :real(8), intent(in)
: 鉛直風速
pz_VelX(DimXMin:DimXMax, DimZMin:DimZMax) :real(8), intent(in)
: 水平風速

x 方向に半格子ずれた点における移流を計算

[Source]

  function xr_AdvVelZ(xr_VelZ, pz_VelX)
    !
    ! x 方向に半格子ずれた点における移流を計算
    !
    
    !モジュール読み込み
    use differentiate_center4, only: pr_dx_xr, xz_dz_xr
!    use differentiate_center2, only: pr_dx_xr, xz_dz_xr
    
    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(8), intent(in) :: pz_VelX(DimXMin:DimXMax, DimZMin:DimZMax)
                                                        !水平風速
    real(8), intent(in) :: xr_VelZ(DimXMin:DimXMax, DimZMin:DimZMax)
                                                        !鉛直風速
    real(8)             :: xr_AdvVelZ(DimXMin:DimXMax, DimZMin:DimZMax)
                                                        !スカラー量の水平移流
  
!    xr_AdvVelZ = 0.0d0  !初期化
    xr_AdvVelZ = - xr_avr_pr( pr_avr_pz( pz_VelX ) * pr_dx_xr( xr_VelZ ) ) - xr_VelZ * xr_avr_xz( xz_dz_xr( xr_VelZ ) )
    
  end function xr_AdvVelZ
Function :
xr_Buoy(DimXMin:DimXMax, DimZMin:DimZMax) :real(8)
: 浮力項
xz_PotTemp(DimXMin:DimXMax, DimZMin:DimZMax) :real(8), intent(in)
: 温位擾乱

鉛直方向の運動方程式に現れる浮力項を計算

[Source]

  function xr_Buoy(xz_PotTemp)
    !
    ! 鉛直方向の運動方程式に現れる浮力項を計算
    !
    
    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(8), intent(in)  :: xz_PotTemp(DimXMin:DimXMax, DimZMin:DimZMax)
                                               !温位擾乱
    real(8)              :: xr_Buoy(DimXMin:DimXMax, DimZMin:DimZMax)
                                               !浮力項

!    !初期化
!    xr_Buoy = 0.0d0

    !浮力項の計算
    xr_Buoy = Grav * xr_avr_xz(xz_PotTemp / xz_PotTempBasicZ)

    call StoreBuoyTemp(xz_avr_xr(xr_Buoy))

  end function xr_Buoy
Function :
xz_AdvKm(DimXMin:DimXMax, DimZMin:DimZMax) :real(8)
: スカラー量の水平移流
xz_Var(DimXMin:DimXMax, DimZMin:DimZMax) :real(8), intent(in)
: スカラー量
pz_VelX(DimXMin:DimXMax, DimZMin:DimZMax) :real(8), intent(in)
: 水平風速
xr_VelZ(DimXMin:DimXMax, DimZMin:DimZMax) :real(8), intent(in)
: 鉛直風速

x, z 方向に半格子ずれた点における移流を計算

[Source]

  function xz_AdvKm(xz_Var, pz_VelX, xr_VelZ)
    !
    ! x, z 方向に半格子ずれた点における移流を計算
    !
    
    !モジュール読み込み
    use differentiate_center4, only: pz_dx_xz, xr_dz_xz
!    use differentiate_center2, only: pz_dx_xz, xr_dz_xz

    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(8), intent(in) :: pz_VelX(DimXMin:DimXMax, DimZMin:DimZMax)
                                                        !水平風速
    real(8), intent(in) :: xr_VelZ(DimXMin:DimXMax, DimZMin:DimZMax)
                                                        !鉛直風速
    real(8), intent(in) :: xz_Var(DimXMin:DimXMax, DimZMin:DimZMax)
                                                        !スカラー量
    real(8)             :: xz_AdvKm(DimXMin:DimXMax, DimZMin:DimZMax)
                                                        !スカラー量の水平移流
    
    xz_AdvKm = - xz_avr_pz(pz_VelX * pz_dx_xz(xz_Var)) - xz_avr_xr(xr_VelZ * xr_dz_xz(xz_Var))    
    
  end function xz_AdvKm
Function :
xz_AdvScalar(DimXMin:DimXMax, DimZMin:DimZMax) :real(8)
: スカラー量の水平移流
xz_Var(DimXMin:DimXMax, DimZMin:DimZMax) :real(8), intent(in)
: スカラー量
pz_VelX(DimXMin:DimXMax, DimZMin:DimZMax) :real(8), intent(in)
: 水平風速
xr_VelZ(DimXMin:DimXMax, DimZMin:DimZMax) :real(8), intent(in)
: 鉛直風速

x, z 方向に半格子ずれた点における移流を計算

[Source]

  function xz_AdvScalar(xz_Var, pz_VelX, xr_VelZ)
    !
    ! x, z 方向に半格子ずれた点における移流を計算
    !
    
    !モジュール読み込み
    use differentiate_center4, only: pz_dx_xz, xr_dz_xz
!    use differentiate_center2, only: pz_dx_xz, xr_dz_xz

    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(8), intent(in) :: pz_VelX(DimXMin:DimXMax, DimZMin:DimZMax)
                                                        !水平風速
    real(8), intent(in) :: xr_VelZ(DimXMin:DimXMax, DimZMin:DimZMax)
                                                        !鉛直風速
    real(8), intent(in) :: xz_Var(DimXMin:DimXMax, DimZMin:DimZMax)
                                                        !スカラー量
    real(8)             :: xz_AdvScalar(DimXMin:DimXMax, DimZMin:DimZMax)
                                                        !スカラー量の水平移流
    
    xz_AdvScalar = - xz_avr_pz(pz_VelX * pz_dx_xz(xz_Var)) - xz_avr_xr(xr_VelZ * xr_dz_xz(xz_Var))    

    call StorePotTempAdv( xz_AdvScalar )   

  end function xz_AdvScalar
Function :
xza_AdvScalar(DimXMin:DimXMax, DimZMin:DimZMax, SpcNum) :real(8)
: スカラー量の水平移流
xza_Var(DimXMin:DimXMax, DimZMin:DimZMax, SpcNum) :real(8), intent(in)
: スカラー量
pz_VelX(DimXMin:DimXMax, DimZMin:DimZMax) :real(8), intent(in)
: 水平風速
xr_VelZ(DimXMin:DimXMax, DimZMin:DimZMax) :real(8), intent(in)
: 鉛直風速

x, z 方向に半格子ずれた点における移流を計算

[Source]

  function xza_AdvScalar(xza_Var, pz_VelX, xr_VelZ)
    !
    ! x, z 方向に半格子ずれた点における移流を計算
    !
    
    !モジュール読み込み
    use differentiate_center4, only: pz_dx_xz, xr_dz_xz
!    use differentiate_center2, only: pz_dx_xz, xr_dz_xz

    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(8), intent(in) :: pz_VelX(DimXMin:DimXMax, DimZMin:DimZMax)
                                                        !水平風速
    real(8), intent(in) :: xr_VelZ(DimXMin:DimXMax, DimZMin:DimZMax)
                                                        !鉛直風速
    real(8), intent(in) :: xza_Var(DimXMin:DimXMax, DimZMin:DimZMax, SpcNum)
                                                        !スカラー量
    real(8)             :: xza_AdvScalar(DimXMin:DimXMax, DimZMin:DimZMax, SpcNum)
                                                        !スカラー量の水平移流
    integer             :: s

    do s = 1, SpcNum
      xza_AdvScalar(:,:,s) = - xz_avr_pz(pz_VelX * pz_dx_xz(xza_Var(:,:,s))) - xz_avr_xr(xr_VelZ * xr_dz_xz(xza_Var(:,:,s)))    
    end do

    call StoreMixRtAdv( xza_AdvScalar )   
    
  end function xza_AdvScalar