| Class | Radiation | 
| In: | 
                
                physics/radiation.f90
                
         | 
モデルの放射過程を計算するためのパッケージ型モジュール 具体的には以下の項を計算するための関数を格納する.
* 一様冷却
| Subroutine : | |
| cfgfile : | character(*), intent(in) | 
NAMELIST から放射強制の設定を取得
This procedure input/output NAMELIST#radiation .
  subroutine Radiation_init(cfgfile)
    !
    !NAMELIST から放射強制の設定を取得
    !
    !暗黙の型宣言禁止
    implicit none
    !入力変数
    character(*), intent(in) :: cfgfile
    real(8)                  :: RadHeightUp   !放射強制を与える鉛直領域の上限
    real(8)                  :: RadHeightDown !放射強制を与える鉛直領域の下限
    integer                  :: k             !ループ変数
    ! NAMELIST から情報を取得
    NAMELIST /radiation/ RadHeatRate, RadHeightUp, RadHeightDown
    open (10, FILE=cfgfile)
    read(10, NML=radiation)
    close(10)
    allocate( xz_RadHeight(DimXMin:DimXMax, DimZMin:DimZMax) )
    ! 放射強制が存在する領域の設定
    ! RadHeightDown < s_Z < RadHeightUp の範囲では値が 1 となる
    ! 係数を用意する.
    !
    xz_RadHeight = 1.0d0    
    do k = DimZMin, DimZMax
      if ( s_Z(k) <= RadHeightDown  ) then
        xz_RadHeight(:,k) = 0.0d0 
      elseif( s_Z(k) >= RadHeightUp ) then
        xz_RadHeight(:,k) = 0.0d0 
      end if
    end do
    if (cpurank == 0) then 
      call MessageNotify( "M", "Radiation", "RadHeatRate = %f", d=(/RadHeatRate/))
      call MessageNotify( "M", "Radiation", "RadHeightUp = %f", d=(/RadHeightUP/))
      call MessageNotify( "M", "Radiation", "RadHeightDown= %f", d=(/RadHeightDown/))
    end if
  end subroutine Radiation_init
          | Subroutine : | |
| cfgfile : | character(*), intent(in) | 
NAMELIST から放射強制の設定を取得
This procedure input/output NAMELIST#radiation .
  subroutine Radiation_init2(cfgfile)
    !
    !NAMELIST から放射強制の設定を取得
    !
    !暗黙の型宣言禁止
    implicit none
    !入力変数
    character(*), intent(in) :: cfgfile
    real(8)                  :: RadHeightUp   !放射強制を与える鉛直領域の上限
    real(8)                  :: RadHeightDown !放射強制を与える鉛直領域の下限
    integer                  :: k             !ループ変数
    ! NAMELIST から情報を取得
    NAMELIST /radiation/ RadHeatRate, RadHeightUp, RadHeightDown, RadHeight1, RadHeight2
    open (10, FILE=cfgfile)
    read(10, NML=radiation)
    close(10)
    allocate( xz_RadHeight(DimXMin:DimXMax, DimZMin:DimZMax) )
    ! 放射強制が存在する領域の設定
    ! RadHeightDown < s_Z < RadHeightUp の範囲では値が 1 となる
    ! 係数を用意する.
    !
    xz_RadHeight = 1.0d0    
    do k = DimZMin, DimZMax
      if ( s_Z(k) <= RadHeightDown  ) then
        xz_RadHeight(:,k) = 0.0d0 
      elseif( s_Z(k) >= RadHeightUp ) then
        xz_RadHeight(:,k) = 0.0d0 
      end if
    end do
    if (cpurank == 0) then 
      call MessageNotify( "M", "Radiation", "RadHeatRate = %f", d=(/RadHeatRate/))
      call MessageNotify( "M", "Radiation", "RadHeightUp = %f", d=(/RadHeightUP/))
      call MessageNotify( "M", "Radiation", "RadHeightDown= %f", d=(/RadHeightDown/))
      call MessageNotify( "M", "Radiation", "RadHeight1= %f", d=(/RadHeight1/))
      call MessageNotify( "M", "Radiation", "RadHeight2= %f", d=(/RadHeight2/))
    end if
  end subroutine Radiation_init2
          | Function : | |||
| xz_NewtonCool(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8)
  | ||
| xz_PotTemp(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in)
  | 
温位の放射強制項. 地表面から RadHeight で指定された高度までの間で一様放射冷却を与える.
  function xz_NewtonCool(xz_PotTemp)
    !
    ! 温位の放射強制項. 
    ! 地表面から RadHeight で指定された高度までの間で一様放射冷却を与える. 
    !
    
    !暗黙の型宣言を禁止
    implicit none
    !変数定義
    real(8), intent(in)   :: xz_PotTemp(DimXMin:DimXMax, DimZMin:DimZMax)
                                       !温位の擾乱場
    real(8)               :: xz_NewtonCool(DimXMin:DimXMax, DimZMin:DimZMax)
                                       !放射強制
    real(8)               :: xz_PotTempMean(DimXMin:DimXMax, DimZMin:DimZMax)
                                       !温位擾乱の東西平均
    real(8)               :: EFTime    !放射緩和時間
    integer               :: k
    !放射緩和時間は 5 日
    EFTime = 5.0d0 * DayTime  
    
    do k = DimZMin, DimZMax
      xz_PotTempMean(:,k) = sum( xz_PotTemp(:,k) ) / real(DimXMax - DimXMin + 1)
    end do
    
    xz_NewtonCool = - xz_PotTempMean / EFTime 
    
    call StorePotTempDamp( xz_NewtonCool )
  end function xz_NewtonCool
          | Function : | |||
| xz_RadHeatConst(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8)
  | ||
| xz_Exner(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in)
  | 
温位の放射強制項. 地表面から RadHeight で指定された高度までの間で一様放射冷却を与える.
  function xz_RadHeatConst(xz_Exner)
    !
    ! 温位の放射強制項. 
    ! 地表面から RadHeight で指定された高度までの間で一様放射冷却を与える. 
    !
    
    !暗黙の型宣言を禁止
    implicit none
    !変数定義
    real(8), intent(in)   :: xz_Exner(DimXMin:DimXMax, DimZMin:DimZMax)
                                       !エクスナー関数の擾乱場
    real(8)               :: xz_RadHeatConst(DimXMin:DimXMax, DimZMin:DimZMax)
                                       !放射強制
    xz_RadHeatConst = xz_RadHeight * RadHeatRate / ( ( xz_ExnerBasicZ + xz_Exner ) * DayTime )
    call StorePotTempRad( xz_RadHeatConst )
    
  end function xz_RadHeatConst
          | Function : | |||
| xz_RadHeatVary(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8)
  | ||
| xz_Exner(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in)
  | 
温位の放射強制項. 地表面から RadHeight1 で指定された高度までの間は2[K/day](RadHeatRate)の 一様な放射冷却を与える. RadHeight1 から RadHeight2 までは (RadHeight2 - s_Z(k)) / (RadHeight2 - RadHeight1) の割合で放射冷却の効果を減少させる (RadHeight2でちょうどゼロにする) Nakajima and Matsuno(1988),中島(1944)を参考にした
  function xz_RadHeatVary(xz_Exner)
  !
  ! 温位の放射強制項.
  ! 地表面から RadHeight1 で指定された高度までの間は2[K/day](RadHeatRate)の
  ! 一様な放射冷却を与える.
  ! RadHeight1 から RadHeight2 までは (RadHeight2 - s_Z(k)) / (RadHeight2 - RadHeight1)
  ! の割合で放射冷却の効果を減少させる (RadHeight2でちょうどゼロにする)
  ! Nakajima and Matsuno(1988),中島(1944)を参考にした
  !
  !暗黙の型宣言を禁止
  implicit none
  !変数定義
  real(8), intent(in)   :: xz_Exner(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !エクスナー関数の擾乱場
  real(8)               :: xz_RadHeatVary(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !放射強制
  do k = RegZMin+1, DimZMax
   if (s_Z(k).le.RadHeight1) then
    xz_RadHeatVary(:,k) = RadHeatRate / ( ( xz_ExnerBasicZ(:,k) + xz_Exner(:,k) ) * DayTime )
   else if (s_Z(k).gt.RadHeight1.and.s_Z(k).le.RadHeight2) then
    xz_RadHeatVary(:,k) = RadHeatRate  * (RadHeight2 - s_Z(k)) / ( (RadHeight2 - RadHeight1) * ( xz_ExnerBasicZ(:,k) + xz_Exner(:,k) ) * DayTime )
   else if (s_Z(k).gt.RadHeight2) then
    xz_RadHeatVary(:,k) = 0.0d0
   end if
  end do
  call StorePotTempRad( xz_RadHeatVary )
end function xz_RadHeatVary