Class Radiation_Simple
In: ../src/physics/radiation_simple.f90

モデルの放射過程を計算するためのパッケージ型モジュール 具体的には以下の項を計算するための関数を格納する.

 * 一様冷却

Methods

Included Modules

dc_types dc_iounit dc_message gtool_historyauto mpi_wrapper gridSet axesset constants basicset DExnerDt namelist_util

Public Instance methods

Subroutine :

NAMELIST から放射強制の設定を取得

This procedure input/output NAMELIST#radiation_simple_nml .

[Source]

  subroutine Radiation_Simple_init
    !
    !NAMELIST から放射強制の設定を取得
    !

    !暗黙の型宣言禁止
    implicit none

    !入力変数
    real(DP) :: HeightUp   = 0.0d0  !放射強制を与える鉛直領域の上限
    real(DP) :: HeightDown = 0.0d0  !放射強制を与える鉛直領域の下限
    real(DP) :: RadHeatRate = 0.0d0 !一様放射加熱率 [K/day]
    integer  :: k                   !ループ変数
    integer  :: unit

    character(*), parameter:: module_name = 'Radiation_Simple_Init'


    ! NAMELIST から情報を取得
    NAMELIST /radiation_simple_nml/ RadHeatRate, HeightUp, HeightDown, FlagDExnerDtRad

    call FileOpen(unit, file=namelist_filename, mode='r')
    read(unit, NML=radiation_simple_nml)
    close(unit)

    allocate( xyz_PTempRadVary(imin:imax, jmin:jmax, kmin:kmax) )
    allocate( xyz_PTempRadConst(imin:imax, jmin:jmax, kmin:kmax) )
    allocate( xyz_ExnerRadVary(imin:imax, jmin:jmax, kmin:kmax) )
    allocate( xyz_ExnerRadConst(imin:imax, jmin:jmax, kmin:kmax) )

    
    ! 温位の放射強制項. 
    ! 地表面から RadHeight で指定された高度までの間で一様放射冷却を与える. 
    do k = kmin, kmax
      if ( z_Z(k) <= HeightDown  ) then
        xyz_PTempRadConst(:,:,k) = 0.0d0 
      elseif( z_Z(k) >= HeightUp ) then
        xyz_PTempRadConst(:,:,k) = 0.0d0 
      else
        xyz_PTempRadConst(:,:,k) = RadHeatRate / DayTime / xyz_ExnerBZ(:,:,k)
      end if
    end do
    
    if (.not. FlagDExnerDtRad ) then
      xyz_ExnerRadConst = 0.0d0
    else
      xyz_ExnerRadConst = xyz_DExnerDt_xyz(xyz_PTempRadConst)
    end if

    
    ! 温位の放射強制項.
    ! 地表面から Height1 で指定された高度までの間は2[K/day](RadHeatRate)の
    ! 一様な放射冷却を与える.
    ! Height1 から Height2 までは (Height2 - z_Z(k)) / (Height2 - Height1)
    ! の割合で放射冷却の効果を減少させる (Height2でちょうどゼロにする)
    ! Nakajima and Matsuno(1988),中島(1944)を参考にした
    !
    do k = kmin, kmax
      if ( z_Z(k) <= HeightDown ) then
        xyz_PTempRadVary(:,:,k) = RadHeatRate / DayTime / xyz_ExnerBZ(:,:,k)
        
      elseif ( z_Z(k) > HeightDown .AND. z_Z(k) <= HeightUP) then
        xyz_PTempRadVary(:,:,k) = RadHeatRate / DayTime / xyz_ExnerBZ(:,:,k) * (HeightUP - z_Z(k)) / (HeightUP - HeightDown) 
        
      else if (z_Z(k) > HeightUP) then
        xyz_PTempRadVary(:,:,k) = 0.0d0
      end if
    end do

    if (.not. FlagDExnerDtRad ) then
      xyz_ExnerRadVary = 0.0d0
    else
      xyz_ExnerRadVary = xyz_DExnerDt_xyz(xyz_PTempRadVary) 
    end if

    ! Output
    !
    if (myrank == 0) then 
      call MessageNotify( "M", module_name, "RadHeatRate = %f", d=(/RadHeatRate/))
      call MessageNotify( "M", module_name, "HeightUp = %f", d=(/HeightUP/))
      call MessageNotify( "M", module_name, "HeightDown= %f", d=(/HeightDown/))
      call MessageNotify( "M", module_name, "FlagDExnerDtRad= %b", l=(/ FlagDExnerDtRad /))
    end if

    ! ヒストリデータ定義
    ! 
    call HistoryAutoAddVariable( varname='PTempRad', dims=(/'x','y','z','t'/), longname='Radiation term of potential temperature', units='K.s-1', xtype='float')

    call HistoryAutoAddVariable( varname='ExnerRad', dims=(/'x','y','z','t'/), longname='Radiation term of Exner function', units='K.s-1', xtype='float')

  end subroutine Radiation_Simple_init
xyz_ExnerRadConst
Variable :
xyz_ExnerRadConst(:,:,:) :real(DP), save, allocatable, public
: 圧力方程式非断熱加熱項
xyz_ExnerRadVary
Variable :
xyz_ExnerRadVary(:,:,:) :real(DP), save, allocatable, public
: 圧力方程式非断熱加熱項
xyz_PTempRadConst
Variable :
xyz_PTempRadConst(:,:,:) :real(DP), save, allocatable, public
: 放射加熱項
xyz_PTempRadVary
Variable :
xyz_PTempRadVary(:,:,:) :real(DP), save, allocatable, public
: 放射加熱項