Class HeatFlux_L1979
In: physics/heatflux.f90

下部境界でのフラックスの計算モジュール

Methods

Included Modules

gridset basicset StorePotTemp average chemcalc

Public Instance methods

Function :
pz_MomFluxBulk(DimXMin:DimXMax,DimZMin:DimZMax) :real(8)
: 地表面熱フラックス
xz_PotTemp(DimXMin:DimXMax,DimZMin:DimZMax) :real(8), intent(in)
: 温位の擾乱成分
pz_VelX(DimXMin:DimXMax,DimZMin:DimZMax) :real(8), intent(in)
: 水平風速

下部境界からのフラックスによる運動量の変化率を, Louis (1979) の 方法に基づいて計算する.

[Source]

  function pz_MomFluxBulk( xz_PotTemp, pz_VelX )
    ! 
    ! 下部境界からのフラックスによる運動量の変化率を, Louis (1979) の
    ! 方法に基づいて計算する.
    !

    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(8), intent(in)   :: xz_PotTemp(DimXMin:DimXMax,DimZMin:DimZMax)
                                           ! 温位の擾乱成分    
    real(8), intent(in)   :: pz_VelX(DimXMin:DimXMax,DimZMin:DimZMax)
                                           ! 水平風速
    real(8)               :: xz_MomFluxBulk(DimXMin:DimXMax,DimZMin:DimZMax)
    real(8)               :: pz_MomFluxBulk(DimXMin:DimXMax,DimZMin:DimZMax)
                                           ! 地表面熱フラックス
    integer               :: kz            ! 配列添字
    real(8), allocatable  :: xz_VelX(:,:)  ! 水平風速 (xz 格子)
    real(8), allocatable  :: x_RICHD(:)    ! バルクリチャードソン数

    !作業配列の割り付け
    allocate(xz_VelX(DimXMin:DimXMax,DimZMin:DimZMax))
    allocate(x_RICHD(DimXMin:DimXMax))

    !初期化
    !  * 全ての値をゼロに固定
    pz_MomFluxBulk = 0.0d0

    kz = RegZMin+1
    xz_VelX = xz_avr_pz(pz_VelX)

    ! バルクリチャードソン数の計算
    x_RICHD  = x_CLRICH(xz_PotTemp, xz_VelX)

    ! 運動量フラックスの計算
    xz_MomFluxBulk(:,kz) = - x_CDRAGV(x_RICHD) * SQRT(xz_VelX(:,kz)**2.0 + VelX**2.0) * xz_VelX(:,kz) / DelZ
    pz_MomFluxBulk = pz_avr_xz(xz_MomFluxBulk)

    !作業配列の解放
    deallocate(xz_VelX)
    deallocate(x_RICHD)

  end function pz_MomFluxBulk
Function :
xz_HeatFluxBulk(DimXMin:DimXMax,DimZMin:DimZMax) :real(8)
: 地表面熱フラックス
xz_PotTemp(DimXMin:DimXMax,DimZMin:DimZMax) :real(8), intent(in)
: 温位の擾乱成分
xz_Exner(DimXMin:DimXMax,DimZMin:DimZMax) :real(8), intent(in)
: エクスナー関数の擾乱成分
pz_VelX(DimXMin:DimXMax,DimZMin:DimZMax) :real(8), intent(in)
: 水平風速

下部境界からのフラックスによる温度の変化率を, Louis (1979) の 方法に基づいて計算する.

[Source]

  function xz_HeatFluxBulk( xz_PotTemp, xz_Exner, pz_VelX )
    ! 
    ! 下部境界からのフラックスによる温度の変化率を, Louis (1979) の
    ! 方法に基づいて計算する.
    !

    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(8), intent(in)   :: xz_PotTemp(DimXMin:DimXMax,DimZMin:DimZMax)
                                           ! 温位の擾乱成分    
    real(8), intent(in)   :: xz_Exner(DimXMin:DimXMax,DimZMin:DimZMax)
                                           ! エクスナー関数の擾乱成分    
    real(8), intent(in)   :: pz_VelX(DimXMin:DimXMax,DimZMin:DimZMax)
                                           ! 水平風速
    real(8)               :: xz_HeatFluxBulk(DimXMin:DimXMax,DimZMin:DimZMax)
                                           ! 地表面熱フラックス
    real(8)               :: ExnerBZSfc    ! Basic state Exner function at the surface

    integer               :: kz            ! 配列添字
    real(8), allocatable  :: xz_VelX(:,:)  ! 水平風速 (xz 格子)
    real(8), allocatable  :: x_RICHD(:)    ! バルクリチャードソン数

    !作業配列の割り付け
    allocate(xz_VelX(DimXMin:DimXMax,DimZMin:DimZMax))
    allocate(x_RICHD(DImXMin:DimXMax))

    !初期化
    !  * 全ての値をゼロに固定
    xz_HeatFluxBulk = 0.0d0
    
    !地表面熱フラックスによる加熱率を計算
    !  * 単位は K/s
    !  * エクスナー関数は基本場の値で代表させる.     
    !  * 格子点 xz では, 物理領域の最下端の添え字は RegZMin+1
    kz = RegZMin+1
    xz_VelX = xz_avr_pz(pz_VelX)

    ! バルクリチャードソン数の計算
    x_RICHD  = x_CLRICH(xz_PotTemp, xz_VelX)

    ! 地表面でのエクスナー関数基本場成分
    ExnerBZSfc    = (PressSfc / PressBasis) ** (GasRDry / CpDry)

    ! 熱フラックスの計算
    xz_HeatFluxBulk(:,kz) = - x_CDRAGV(x_RICHD) * SQRT(xz_VelX(:,kz)**2.0 + VelX**2.0) * ( xz_PotTemp(:,kz)  + xz_PotTempBasicZ(:,kz) - TempSfc / ( ExnerBZSfc + xz_Exner(:,kz) ) )/DelZ                                            

!    xz_HeatFluxBulk(:,kz) =                                       &
!      &     - x_CDRAGV(x_RICHD) * SQRT(xz_VelX(:,kz)**2.0 + VelX**2.0)  &
!      &       * (xz_ExnerBasicZ(:,kz)                             &
!      &            * (xz_PotTemp(:,kz)  + xz_PotTempBasicZ(:,kz)) &
!      &          - TempSfc                                        &
!      &         )/DelZ                                            

    call StorePotTempFlux( xz_HeatFluxBulk )

    !作業配列の解放
    deallocate(xz_VelX)
    deallocate(x_RICHD)
    
  end function xz_HeatFluxBulk