| Class | Radiation_3d |
| In: |
physics/radiation_3d.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 !ループ変数
integer :: unit !装置番号
! NAMELIST から情報を取得
NAMELIST /radiation/ RadHeatRate, RadHeightUp, RadHeightDown
call FileOpen(unit, file=cfgfile, mode='r')
read(unit, NML=radiation)
close(unit)
allocate( xyz_RadHeight(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) )
! 放射強制が存在する領域の設定
! RadHeightDown < s_Z < RadHeightUp の範囲では値が 1 となる
! 係数を用意する.
!
xyz_RadHeight = 1.0d0
do k = DimZMin, DimZMax
if ( z_Z(k) <= RadHeightDown ) then
xyz_RadHeight(:,:,k) = 0.0d0
elseif( z_Z(k) >= RadHeightUp ) then
xyz_RadHeight(:,:,k) = 0.0d0
end if
end do
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 subroutine Radiation_init
| Function : | |||
| xyz_NewtonCool(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) : | real(8)
| ||
| xyz_PotTemp(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) : | real(8), intent(in)
|
温位の放射強制項. 地表面から RadHeight で指定された高度までの間で一様放射冷却を与える.
上記の仕様通り設計されていない. 要検討.
function xyz_NewtonCool(xyz_PotTemp)
!
! 温位の放射強制項.
! 地表面から RadHeight で指定された高度までの間で一様放射冷却を与える.
!
! = バグ
!
! 上記の仕様通り設計されていない. 要検討.
!暗黙の型宣言を禁止
implicit none
!変数定義
real(8), intent(in) :: xyz_PotTemp(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax)
!温位の擾乱場
real(8) :: xyz_NewtonCool(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax)
!放射強制
real(8) :: xyz_PotTempMean(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax)
!温位擾乱の東西平均
real(8) :: EFTime !放射緩和時間
integer :: k
!放射緩和時間は 5 日
EFTime = 5.0d0 * DayTime
do k = DimZMin, DimZMax
xyz_PotTempMean(:,:,k) = sum( xyz_PotTemp(:,:,k) ) / (real(DimXMax - DimXMin + 1) * real(DimYMax - DimYMin + 1) )
end do
xyz_NewtonCool = - (xyz_PotTemp - xyz_PotTempMean) / EFTime
call StorePotTempDamp( xyz_NewtonCool )
end function xyz_NewtonCool
| Function : | |||
| xyz_RadHeatConst(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) : | real(8)
| ||
| xyz_Exner(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) : | real(8), intent(in)
|
温位の放射強制項. 地表面から RadHeight で指定された高度までの間で一様放射冷却を与える.
function xyz_RadHeatConst(xyz_Exner)
!
! 温位の放射強制項.
! 地表面から RadHeight で指定された高度までの間で一様放射冷却を与える.
!
!暗黙の型宣言を禁止
implicit none
!変数定義
real(8), intent(in) :: xyz_Exner(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax)
!エクスナー関数の擾乱場
real(8) :: xyz_RadHeatConst(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax)
!放射強制
xyz_RadHeatConst = xyz_RadHeight * RadHeatRate / ( ( xyz_ExnerBasicZ + xyz_Exner ) * DayTime )
call StorePotTempRad( xyz_RadHeatConst )
end function xyz_RadHeatConst