Class | Radiation |
In: |
physics/radiation.f90
physics/radiation_balance.f90 physics/radiation_balance2.f90 physics/radiation_balance3.f90 physics/radiation_balance4.f90 physics/radiation_heatandcool.f90 |
モデルの放射過程を計算するためのパッケージ型モジュール 具体的には以下の項を計算するための関数を格納する.
* 一様冷却・一様加熱
Subroutine : | |
cfgfile : | character(*), intent(in) |
NAMELIST から放射強制の設定を取得
This procedure input/output NAMELIST#radiation .
subroutine Radiation_init(cfgfile) ! !NAMELIST から放射強制の設定を取得 ! !暗黙の型宣言禁止 implicit none !入力変数 character(*), intent(in) :: cfgfile integer :: k !ループ変数 ! NAMELIST から情報を取得 NAMELIST /radiation/ RadHeatRate, RadHeightUp, RadHeightDown, RadCoolRate, RadHeightUp2, RadHeightDown2 open (10, FILE=cfgfile) read(10, NML=radiation) close(10) allocate( xz_RadHeight(DimXMin:DimXMax, DimZMin:DimZMax) ) allocate( xz_RadHeight2(DimXMin:DimXMax, DimZMin:DimZMax) ) ! IntHeightUp の特定 do k = DimZMin, DimZMax if ( (RadHeightUp - DelZ <= s_Z(k)) .and. (s_Z(k) < RadHeightUp) ) then IntHeightUp = k else if ( (RadHeightUp2 - DelZ <= s_Z(k)) .and. (s_Z(k) < RadHeightUp2) ) then IntHeightUp2 = k end if end do write(*,*) s_Z(IntHeightUp) write(*,*) s_Z(IntHeightUp2) ! ! PressHeightUp の算出 ! PressHeightUp = xz_PressBasicZ(1,IntHeightUp) + & ! & ( xz_PressBasicZ(1,IntHeightUp + 1) - xz_PressBasicZ(1,IntHeightUp) ) & ! & * ( RadHeightUp - s_Z(IntHeightUp) ) / DelZ ! ! HeatWork の算出 ! HeatWork = CpDry * RadHeatRate * ( PressSfc - PressHeightUp ) / Grav ! 放射強制が存在する領域の設定 ! RadHeightDown < s_Z < RadHeightUp の範囲では値が 1 となる ! 係数を用意する. ! xz_RadHeight = 1.0d0 xz_RadHeight2 = 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 do k = DimZMin, DimZMax if ( s_Z(k) <= RadHeightDown2 ) then xz_RadHeight2(:,k) = 0.0d0 elseif( s_Z(k) >= RadHeightUp2 ) then xz_RadHeight2(:,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/)) call MessageNotify( "M", "Radiation", "RadCoolRate = %f", d=(/RadCoolRate/)) call MessageNotify( "M", "Radiation", "RadHeightUp2 = %f", d=(/RadHeightUP2/)) call MessageNotify( "M", "Radiation", "RadHeightDown2 = %f", d=(/RadHeightDown2/)) ! call MessageNotify( "M", & ! & "Radiation", "PressHeightUp = %f", d=(/PressHeightUp/)) end subroutine Radiation_init
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 !放射強制を与える鉛直領域の下限 real(8) :: RadHeightUp2 !放射強制を与える鉛直領域の上限 real(8) :: RadHeightDown2 !放射強制を与える鉛直領域の下限 integer :: k !ループ変数 ! NAMELIST から情報を取得 NAMELIST /radiation/ RadHeatRate, RadHeightUp, RadHeightDown, RadHeatRate2, RadHeightUp2, RadHeightDown2 open (10, FILE=cfgfile) read(10, NML=radiation) close(10) allocate( xz_RadHeight(DimXMin:DimXMax, DimZMin:DimZMax) ) allocate( xz_RadHeight2(DimXMin:DimXMax, DimZMin:DimZMax) ) ! 放射強制が存在する領域の設定 ! RadHeightDown < s_Z < RadHeightUp の範囲では値が 1 となる ! 係数を用意する. ! xz_RadHeight = 1.0d0 xz_RadHeight2 = 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 do k = DimZMin, DimZMax if ( s_Z(k) <= RadHeightDown2 ) then xz_RadHeight2(:,k) = 0.0d0 elseif( s_Z(k) >= RadHeightUp2 ) then xz_RadHeight2(:,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
Subroutine : | |
cfgfile : | character(*), intent(in) |
NAMELIST から放射強制の設定を取得
This procedure input/output NAMELIST#radiation .
subroutine Radiation_init(cfgfile) ! !NAMELIST から放射強制の設定を取得 ! !暗黙の型宣言禁止 implicit none !入力変数 character(*), intent(in) :: cfgfile integer :: k !ループ変数 ! NAMELIST から情報を取得 NAMELIST /radiation/ RadHeatRate, RadHeightUp, RadHeightDown, RadCoolRate, RadHeightUp2, RadHeightDown2 open (10, FILE=cfgfile) read(10, NML=radiation) close(10) allocate( xz_RadHeight(DimXMin:DimXMax, DimZMin:DimZMax) ) allocate( xz_RadHeight2(DimXMin:DimXMax, DimZMin:DimZMax) ) ! IntHeightUp の特定 do k = DimZMin, DimZMax if ( (RadHeightUp - DelZ <= s_Z(k)) .and. (s_Z(k) < RadHeightUp) ) then IntHeightUp = k else if ( (RadHeightUp2 - DelZ <= s_Z(k)) .and. (s_Z(k) < RadHeightUp2) ) then IntHeightUp2 = k end if end do write(*,*) s_Z(IntHeightUp) write(*,*) s_Z(IntHeightUp2) ! ! PressHeightUp の算出 ! PressHeightUp = xz_PressBasicZ(1,IntHeightUp) + & ! & ( xz_PressBasicZ(1,IntHeightUp + 1) - xz_PressBasicZ(1,IntHeightUp) ) & ! & * ( RadHeightUp - s_Z(IntHeightUp) ) / DelZ ! ! HeatWork の算出 ! HeatWork = CpDry * RadHeatRate * ( PressSfc - PressHeightUp ) / Grav ! 放射強制が存在する領域の設定 ! RadHeightDown < s_Z < RadHeightUp の範囲では値が 1 となる ! 係数を用意する. ! xz_RadHeight = 1.0d0 xz_RadHeight2 = 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 do k = DimZMin, DimZMax if ( s_Z(k) <= RadHeightDown2 ) then xz_RadHeight2(:,k) = 0.0d0 elseif( s_Z(k) >= RadHeightUp2 ) then xz_RadHeight2(:,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/)) call MessageNotify( "M", "Radiation", "RadCoolRate = %f", d=(/RadCoolRate/)) call MessageNotify( "M", "Radiation", "RadHeightUp2 = %f", d=(/RadHeightUP2/)) call MessageNotify( "M", "Radiation", "RadHeightDown2 = %f", d=(/RadHeightDown2/)) ! call MessageNotify( "M", & ! & "Radiation", "PressHeightUp = %f", d=(/PressHeightUp/)) end subroutine Radiation_init
Subroutine : | |
cfgfile : | character(*), intent(in) |
NAMELIST から放射強制の設定を取得
This procedure input/output NAMELIST#radiation .
subroutine Radiation_init(cfgfile) ! !NAMELIST から放射強制の設定を取得 ! !暗黙の型宣言禁止 implicit none !入力変数 character(*), intent(in) :: cfgfile integer :: k !ループ変数 ! NAMELIST から情報を取得 NAMELIST /radiation/ RadHeatRate, RadHeightUp, RadHeightDown, RadCoolRate, RadHeightUp2, RadHeightDown2 open (10, FILE=cfgfile) read(10, NML=radiation) close(10) allocate( xz_RadHeight(DimXMin:DimXMax, DimZMin:DimZMax) ) allocate( xz_RadHeight2(DimXMin:DimXMax, DimZMin:DimZMax) ) ! IntHeightUp の特定 do k = DimZMin, DimZMax if ( (RadHeightUp - DelZ <= s_Z(k)) .and. (s_Z(k) < RadHeightUp) ) then IntHeightUp = k else if ( (RadHeightUp2 - DelZ <= s_Z(k)) .and. (s_Z(k) < RadHeightUp2) ) then IntHeightUp2 = k end if end do write(*,*) s_Z(IntHeightUp) write(*,*) s_Z(IntHeightUp2) ! ! PressHeightUp の算出 ! PressHeightUp = xz_PressBasicZ(1,IntHeightUp) + & ! & ( xz_PressBasicZ(1,IntHeightUp + 1) - xz_PressBasicZ(1,IntHeightUp) ) & ! & * ( RadHeightUp - s_Z(IntHeightUp) ) / DelZ ! ! HeatWork の算出 ! HeatWork = CpDry * RadHeatRate * ( PressSfc - PressHeightUp ) / Grav ! 放射強制が存在する領域の設定 ! RadHeightDown < s_Z < RadHeightUp の範囲では値が 1 となる ! 係数を用意する. ! xz_RadHeight = 1.0d0 xz_RadHeight2 = 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 do k = DimZMin, DimZMax if ( s_Z(k) <= RadHeightDown2 ) then xz_RadHeight2(:,k) = 0.0d0 elseif( s_Z(k) >= RadHeightUp2 ) then xz_RadHeight2(:,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/)) call MessageNotify( "M", "Radiation", "RadCoolRate = %f", d=(/RadCoolRate/)) call MessageNotify( "M", "Radiation", "RadHeightUp2 = %f", d=(/RadHeightUP2/)) call MessageNotify( "M", "Radiation", "RadHeightDown2 = %f", d=(/RadHeightDown2/)) ! call MessageNotify( "M", & ! & "Radiation", "PressHeightUp = %f", d=(/PressHeightUp/)) end subroutine Radiation_init
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) :: PressHeightUp !放射強制領域上限の基本場圧力 !1次補間により算出 ! real(8) :: RadHeightUp !放射強制を与える鉛直領域の上限 ! real(8) :: RadHeightDown !放射強制を与える鉛直領域の下限 ! real(8) :: RadHeightUp2 !放射強制を与える鉛直領域の上限 ! real(8) :: RadHeightDown2 !放射強制を与える鉛直領域の下限 integer :: k !ループ変数 ! NAMELIST から情報を取得 NAMELIST /radiation/ RadHeatRate, RadHeightUp, RadHeightDown, RadHeatRate2, RadHeightUp2, RadHeightDown2 open (10, FILE=cfgfile) read(10, NML=radiation) close(10) allocate( xz_RadHeight(DimXMin:DimXMax, DimZMin:DimZMax) ) allocate( xz_RadHeight2(DimXMin:DimXMax, DimZMin:DimZMax) ) ! IntHeightUp の特定 do k = DimZMin, DimZMax if ( (RadHeightUp - DelZ <= s_Z(k)) .and. (s_Z(k) < RadHeightUp) ) then IntHeightUp = k else if ( (RadHeightUp2 - DelZ <= s_Z(k)) .and. (s_Z(k) < RadHeightUp2) ) then IntHeightUp2 = k end if end do ! PressHeightUp の算出 PressHeightUp = xz_PressBasicZ(1,IntHeightUp) + ( xz_PressBasicZ(1,IntHeightUp + 1) - xz_PressBasicZ(1,IntHeightUp) ) * ( RadHeightUp - s_Z(IntHeightUp) ) / DelZ ! HeatWork の算出 HeatWork = CpDry * RadHeatRate * ( PressSfc - PressHeightUp ) / Grav ! 放射強制が存在する領域の設定 ! RadHeightDown < s_Z < RadHeightUp の範囲では値が 1 となる ! 係数を用意する. ! xz_RadHeight = 1.0d0 xz_RadHeight2 = 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 do k = DimZMin, DimZMax if ( s_Z(k) <= RadHeightDown2 ) then xz_RadHeight2(:,k) = 0.0d0 elseif( s_Z(k) >= RadHeightUp2 ) then xz_RadHeight2(:,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/)) call MessageNotify( "M", "Radiation", "RadHeatRate2 = %f", d=(/RadHeatRate2/)) call MessageNotify( "M", "Radiation", "RadHeightUp2 = %f", d=(/RadHeightUP2/)) call MessageNotify( "M", "Radiation", "RadHeightDown2 = %f", d=(/RadHeightDown2/)) call MessageNotify( "M", "Radiation", "PressHeightUp = %f", d=(/PressHeightUp/)) end subroutine Radiation_init
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) :: PressHeightUp !放射強制領域上限の基本場圧力 !1次補間により算出 ! real(8) :: RadHeightUp !放射強制を与える鉛直領域の上限 ! real(8) :: RadHeightDown !放射強制を与える鉛直領域の下限 ! real(8) :: RadHeightUp2 !放射強制を与える鉛直領域の上限 ! real(8) :: RadHeightDown2 !放射強制を与える鉛直領域の下限 integer :: k !ループ変数 ! NAMELIST から情報を取得 NAMELIST /radiation/ RadHeatRate, RadHeightUp, RadHeightDown, RadHeatRate2, RadHeightUp2, RadHeightDown2 open (10, FILE=cfgfile) read(10, NML=radiation) close(10) allocate( xz_RadHeight(DimXMin:DimXMax, DimZMin:DimZMax) ) allocate( xz_RadHeight2(DimXMin:DimXMax, DimZMin:DimZMax) ) ! IntHeightUp の特定 do k = DimZMin, DimZMax if ( (RadHeightUp - DelZ <= s_Z(k)) .and. (s_Z(k) < RadHeightUp) ) then IntHeightUp = k else if ( (RadHeightUp2 - DelZ <= s_Z(k)) .and. (s_Z(k) < RadHeightUp2) ) then IntHeightUp2 = k end if end do ! PressHeightUp の算出 PressHeightUp = xz_PressBasicZ(1,IntHeightUp) + ( xz_PressBasicZ(1,IntHeightUp + 1) - xz_PressBasicZ(1,IntHeightUp) ) * ( RadHeightUp - s_Z(IntHeightUp) ) / DelZ ! HeatWork の算出 HeatWork = CpDry * RadHeatRate * ( PressSfc - PressHeightUp ) / Grav ! 放射強制が存在する領域の設定 ! RadHeightDown < s_Z < RadHeightUp の範囲では値が 1 となる ! 係数を用意する. ! xz_RadHeight = 1.0d0 xz_RadHeight2 = 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 do k = DimZMin, DimZMax if ( s_Z(k) <= RadHeightDown2 ) then xz_RadHeight2(:,k) = 0.0d0 elseif( s_Z(k) >= RadHeightUp2 ) then xz_RadHeight2(:,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/)) call MessageNotify( "M", "Radiation", "RadHeatRate2 = %f", d=(/RadHeatRate2/)) call MessageNotify( "M", "Radiation", "RadHeightUp2 = %f", d=(/RadHeightUP2/)) call MessageNotify( "M", "Radiation", "RadHeightDown2 = %f", d=(/RadHeightDown2/)) call MessageNotify( "M", "Radiation", "PressHeightUp = %f", d=(/PressHeightUp/)) end subroutine Radiation_init
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_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_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_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_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_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_RadHeatBalance(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8)
| ||
xz_ExnerBasicZ(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) | ||
xz_PotTempBasicZ(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) | ||
xz_Exner(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) | ||
xz_PotTemp(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) |
温位の放射強制項. 地表面から RadHeight で指定された高度までの間で空間的に一様な加熱, RadHeight から RadHeight2 までの間で空間的な一様な冷却を与える. 放射強制全体として加熱と冷却がバランスするように時々刻々一様加熱率 および一様冷却率を変化させる. この際, ある時刻における各々の加熱量と冷却量は初期の加熱量と冷却量 等しくなるように調節する.
function xz_RadHeatBalance(xz_ExnerBasicZ, xz_PotTempBasicZ, xz_Exner, xz_PotTemp) ! ! 温位の放射強制項. ! 地表面から RadHeight で指定された高度までの間で空間的に一様な加熱, ! RadHeight から RadHeight2 までの間で空間的な一様な冷却を与える. ! 放射強制全体として加熱と冷却がバランスするように時々刻々一様加熱率 ! および一様冷却率を変化させる. ! この際, ある時刻における各々の加熱量と冷却量は初期の加熱量と冷却量 ! 等しくなるように調節する. !暗黙の型宣言を禁止 implicit none !変数定義 real(8), intent(in) :: xz_ExnerBasicZ(DimXMin:DimXMax, DimZMin:DimZMax) real(8), intent(in) :: xz_Exner(DimXMin:DimXMax, DimZMin:DimZMax) real(8), intent(in) :: xz_PotTempBasicZ(DimXMin:DimXMax, DimZMin:DimZMax) real(8), intent(in) :: xz_PotTemp(DimXMin:DimXMax, DimZMin:DimZMax) real(8) :: xz_RadHeatBalance(DimXMin:DimXMax, DimZMin:DimZMax) !放射強制 real(8) :: xz_DensSum(DimXMin:DimXMax, DimZMin:DimZMax) !密度(基本場成分と擾乱成分の和) real(8) :: z_DensXmean(DimZMin:DimZMax) !密度(水平平均) real(8) :: HeatRatio !初期の加熱率とある時刻の加熱率の比 real(8) :: CoolRatio !初期の冷却率とある時刻の冷却率の比 real(8) :: HeatSum !ある時刻での単位時間当たりの加熱量 real(8) :: CoolSum !ある時刻での単位時間当たりの冷却量 integer :: k ! 密度の算出 xz_DensSum = PressSfc * (xz_ExnerBasicZ + xz_Exner)**( (CpDry - GasRDry)/GasRDry ) / (GasRDry * (xz_PotTempBasicZ + xz_PotTemp ) ) ! 密度の水平平均の算出 z_DensXmean = sum( xz_DensSum, 1) / real(DimXMax - DimXMin + 1) HeatSum = 0.0d0 CoolSum = 0.0d0 ! ある時刻での加熱量を計算 ! do k = DimZmin, IntHeightUp - 1 do k = RegZmin + 1, IntHeightUp - 1 HeatSum = HeatSum + 0.5d0 * DelZ * CpDry * RadHeatRate * ( z_DensXmean(k) + z_DensXmean(k+1) ) end do HeatSum = HeatSum + 0.5d0 * CpDry * RadHeatRate * ( 2.0d0 * z_DensXmean(RegZMin+1) - (z_DensXmean(RegZMin+2) - z_DensXmean(RegZMin+1) ) * s_Z(RegZMin+1) / DelZ + 2.0d0 * z_DensXmean(IntHeightUp) + ( z_DensXmean(IntHeightUp - 1) - z_DensXmean(IntHeightUp) ) * (RadHeightUp - s_Z(IntHeightUp)) / DelZ ) ! ある時刻での冷却量を計算 do k = IntHeightUp + 1, IntHeightUp2 - 1 CoolSum = CoolSum + 0.5d0 * DelZ * CpDry * RadHeatRate2 * ( z_DensXmean(k) + z_DensXmean(k+1) ) end do CoolSum = CoolSum + 0.5d0 * CpDry * RadHeatRate2 * ( 2.0d0 * z_DensXmean(IntHeightUp + 1) - (z_DensXmean(IntHeightUp+2) - z_DensXmean(IntHeightUp+1) ) * ( s_Z(IntHeightUp+1) - RadHeightUp2 ) / DelZ + 2.0d0 * z_DensXmean(IntHeightUp2) + ( z_DensXmean(IntHeightUp2 + 1) - z_DensXmean(IntHeightUp2) ) * (RadHeightUp2 - s_Z(IntHeightUp2)) / DelZ ) ! 加熱量及び冷却量の変化の比を算出 HeatRatio = HeatWork / HeatSum CoolRatio = - HeatWork / CoolSum xz_RadHeatBalance = xz_RadHeight * HeatRatio * RadHeatRate / ( xz_ExnerBasicZ * DayTime ) + xz_RadHeight2 * CoolRatio * RadHeatRate2 / ( xz_ExnerBasicZ * DayTime ) call StorePotTempRad( xz_RadHeatBalance ) end function xz_RadHeatBalance
Function : | |||
xz_RadHeatBalance(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8)
| ||
xz_ExnerBasicZ(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) | ||
xz_PotTempBasicZ(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) | ||
xz_Exner(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) | ||
xz_PotTemp(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) |
温位の放射強制項. 地表面から RadHeight で指定された高度までの間で空間的に一様な加熱, RadHeight から RadHeight2 までの間で空間的な一様な冷却を与える. 放射強制全体として加熱と冷却がバランスするように時々刻々一様加熱率 および一様冷却率を変化させる. この際, ある時刻における各々の加熱量と冷却量は初期の加熱量と冷却量 等しくなるように調節する.
function xz_RadHeatBalance(xz_ExnerBasicZ, xz_PotTempBasicZ, xz_Exner, xz_PotTemp) ! ! 温位の放射強制項. ! 地表面から RadHeight で指定された高度までの間で空間的に一様な加熱, ! RadHeight から RadHeight2 までの間で空間的な一様な冷却を与える. ! 放射強制全体として加熱と冷却がバランスするように時々刻々一様加熱率 ! および一様冷却率を変化させる. ! この際, ある時刻における各々の加熱量と冷却量は初期の加熱量と冷却量 ! 等しくなるように調節する. !暗黙の型宣言を禁止 implicit none !変数定義 real(8), intent(in) :: xz_ExnerBasicZ(DimXMin:DimXMax, DimZMin:DimZMax) real(8), intent(in) :: xz_Exner(DimXMin:DimXMax, DimZMin:DimZMax) real(8), intent(in) :: xz_PotTempBasicZ(DimXMin:DimXMax, DimZMin:DimZMax) real(8), intent(in) :: xz_PotTemp(DimXMin:DimXMax, DimZMin:DimZMax) real(8) :: xz_RadHeatBalance(DimXMin:DimXMax, DimZMin:DimZMax) !放射強制 real(8) :: xz_DensSum(DimXMin:DimXMax, DimZMin:DimZMax) !密度(基本場成分と擾乱成分の和) real(8) :: z_DensXmean(DimZMin:DimZMax) !密度(水平平均) real(8) :: HeatRatio !初期の加熱率とある時刻の加熱率の比 real(8) :: CoolRatio !初期の冷却率とある時刻の冷却率の比 real(8) :: HeatSum !ある時刻での単位時間当たりの加熱量 real(8) :: CoolSum !ある時刻での単位時間当たりの冷却量 integer :: k ! 密度の算出 xz_DensSum = PressSfc * (xz_ExnerBasicZ + xz_Exner)**( (CpDry - GasRDry)/GasRDry ) / (GasRDry * (xz_PotTempBasicZ + xz_PotTemp ) ) ! 密度の水平平均の算出 z_DensXmean = sum( xz_DensSum, 1) / real(DimXMax - DimXMin + 1) HeatSum = 0.0d0 CoolSum = 0.0d0 ! ある時刻での加熱量を計算 ! do k = DimZmin, IntHeightUp - 1 do k = RegZmin + 1, IntHeightUp - 1 HeatSum = HeatSum + 0.5d0 * DelZ * CpDry * RadHeatRate * ( z_DensXmean(k) + z_DensXmean(k+1) ) end do HeatSum = HeatSum + 0.5d0 * CpDry * RadHeatRate * ( 2.0d0 * z_DensXmean(RegZMin+1) * s_Z(RegZMin+1) - (z_DensXmean(RegZMin+2) - z_DensXmean(RegZMin+1) ) * s_Z(RegZMin+1) * s_Z(RegZMin+1) / DelZ + 2.0d0 * z_DensXmean(IntHeightUp) * (RadHeightUp - s_Z(IntHeightUp)) - ( z_DensXmean(IntHeightUp - 1) - z_DensXmean(IntHeightUp) ) * (RadHeightUp - s_Z(IntHeightUp)) * (RadHeightUp - s_Z(IntHeightUp)) / DelZ ) ! ある時刻での冷却量を計算 do k = IntHeightUp + 1, IntHeightUp2 - 1 CoolSum = CoolSum + 0.5d0 * DelZ * CpDry * RadHeatRate2 * ( z_DensXmean(k) + z_DensXmean(k+1) ) end do CoolSum = CoolSum + 0.5d0 * CpDry * RadHeatRate2 * ( 2.0d0 * z_DensXmean(IntHeightUp + 1) * ( s_Z(IntHeightUp+1) - RadHeightDown2 ) - (z_DensXmean(IntHeightUp+2) - z_DensXmean(IntHeightUp+1) ) * ( s_Z(IntHeightUp+1) - RadHeightDown2 ) * ( s_Z(IntHeightUp+1) - RadHeightDown2 ) / DelZ + 2.0d0 * z_DensXmean(IntHeightUp2) * (RadHeightUp2 - s_Z(IntHeightUp2)) - ( z_DensXmean(IntHeightUp2 - 1) - z_DensXmean(IntHeightUp2) ) * (RadHeightUp2 - s_Z(IntHeightUp2)) * (RadHeightUp2 - s_Z(IntHeightUp2)) / DelZ ) ! 加熱量及び冷却量の変化の比を算出 HeatRatio = HeatWork / HeatSum CoolRatio = - HeatWork / CoolSum xz_RadHeatBalance = xz_RadHeight * HeatRatio * RadHeatRate / ( xz_ExnerBasicZ * DayTime ) + xz_RadHeight2 * CoolRatio * RadHeatRate2 / ( xz_ExnerBasicZ * DayTime ) call StorePotTempRad( xz_RadHeatBalance ) end function xz_RadHeatBalance
Function : | |||
xz_RadHeatBalance(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8)
| ||
xz_ExnerBasicZ(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) | ||
xz_PotTempBasicZ(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) | ||
xz_Exner(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) | ||
xz_PotTemp(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) |
温位の放射強制項. 地表面から RadHeight で指定された高度までの間で空間的に一様な加熱, RadHeight から RadHeight2 までの間で空間的な一様な冷却を与える. 放射強制全体として加熱と冷却がバランスするように時々刻々一様加熱率 および一様冷却率を変化させる. 冷却の振幅を与え, 加熱の振幅を調節する.
function xz_RadHeatBalance(xz_ExnerBasicZ, xz_PotTempBasicZ, xz_Exner, xz_PotTemp) ! ! 温位の放射強制項. ! 地表面から RadHeight で指定された高度までの間で空間的に一様な加熱, ! RadHeight から RadHeight2 までの間で空間的な一様な冷却を与える. ! 放射強制全体として加熱と冷却がバランスするように時々刻々一様加熱率 ! および一様冷却率を変化させる. ! 冷却の振幅を与え, 加熱の振幅を調節する. !暗黙の型宣言を禁止 implicit none !変数定義 real(8), intent(in) :: xz_ExnerBasicZ(DimXMin:DimXMax, DimZMin:DimZMax) real(8), intent(in) :: xz_Exner(DimXMin:DimXMax, DimZMin:DimZMax) real(8), intent(in) :: xz_PotTempBasicZ(DimXMin:DimXMax, DimZMin:DimZMax) real(8), intent(in) :: xz_PotTemp(DimXMin:DimXMax, DimZMin:DimZMax) real(8) :: xz_RadHeatBalance(DimXMin:DimXMax, DimZMin:DimZMax) !放射強制 real(8) :: xz_DensSum(DimXMin:DimXMax, DimZMin:DimZMax) !密度(基本場成分と擾乱成分の和) ! real(8) :: z_DensXmean(DimZMin:DimZMax) ! !密度(水平平均) ! real(8) :: HeatRatio !初期の加熱率とある時刻の加熱率の比 ! real(8) :: CoolRatio !初期の冷却率とある時刻の冷却率の比 real(8) :: HeatSum !ある時刻での単位時間当たりの加熱量 real(8) :: CoolSum !ある時刻での単位時間当たりの冷却量 real(8) :: WorkRad !ある時刻での単位時間当たりの冷却量 integer :: i integer :: k ! 密度の算出 xz_DensSum = PressSfc * (xz_ExnerBasicZ + xz_Exner)**( CvDry /GasRDry ) / (GasRDry * (xz_PotTempBasicZ + xz_PotTemp ) ) ! ! 密度の水平平均の算出 ! z_DensXmean = sum( xz_DensSum(RegXMin+1:RegXMax, :), 1) / real(RegXMax - RegXMin) HeatSum = 0.0d0 CoolSum = 0.0d0 !加熱するのは, 高度 0 - 1000 m => 格子点は 1 (RegZMin + 1) から IntHeightUp !冷却するのは, 高度 1000 - 15000 m => 格子点は IntHeightUp + 1 から IntHeightUp2 !*** 抜粋 *** ! IntHeightUp の特定 !do k = DimZMin, DimZMax ! if ( (RadHeightUp - DelZ <= s_Z(k)) .and. (s_Z(k) < RadHeightUp) ) then ! IntHeightUp = k ! else if ( (RadHeightUp2 - DelZ <= s_Z(k)) .and. (s_Z(k) < RadHeightUp2) ) then ! IntHeightUp2 = k ! end if !end do ! ! 下端 1000 ! |--*--|--*--|--*--|--*--|--*--|--*--|--*--| ! 1 5 ! ! 1000 Max ! |--*--|--*--|--*--|--*--|--*--|--*--|--*--| ! 6 I ! ある時刻での (加熱量/加熱率) を計算 do k = RegZmin + 1, IntHeightUp do i = RegXmin + 1, RegXMax HeatSum = HeatSum + DelZ * CpDry * xz_DensSum(i,k) end do end do ! ある時刻での (冷却量/冷却率) を計算 do k = IntHeightUp + 1, IntHeightUp2 do i = RegXmin + 1, RegXMax CoolSum = CoolSum + DelZ * CpDry * xz_DensSum(i,k) end do end do ! 加熱率の算出 ! RadCoolRate が負値であることに注意. RadHeatRate = - RadCoolRate * CoolSum / HeatSum xz_RadHeatBalance = xz_RadHeight * RadHeatRate / ( xz_ExnerBasicZ * DayTime ) + xz_RadHeight2 * RadCoolRate / ( xz_ExnerBasicZ * DayTime ) WorkRad = HeatSum * RadHeatRate + CoolSum * RadCoolRate call StorePotTempRad( xz_RadHeatBalance ) write(*,*) WorkRad end function xz_RadHeatBalance
Function : | |||
xz_RadHeatBalance(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8)
| ||
xz_ExnerBasicZ(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) | ||
xz_PotTempBasicZ(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) | ||
xz_Exner(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) | ||
xz_PotTemp(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) |
温位の放射強制項. 地表面から RadHeight で指定された高度までの間で空間的に一様な加熱, RadHeight から RadHeight2 までの間で空間的な一様な冷却を与える. 放射強制全体として加熱と冷却がバランスするように時々刻々一様加熱率 および一様冷却率を変化させる. 冷却の振幅を与え, 加熱の振幅を調節する.
function xz_RadHeatBalance(xz_ExnerBasicZ, xz_PotTempBasicZ, xz_Exner, xz_PotTemp) ! ! 温位の放射強制項. ! 地表面から RadHeight で指定された高度までの間で空間的に一様な加熱, ! RadHeight から RadHeight2 までの間で空間的な一様な冷却を与える. ! 放射強制全体として加熱と冷却がバランスするように時々刻々一様加熱率 ! および一様冷却率を変化させる. ! 冷却の振幅を与え, 加熱の振幅を調節する. !暗黙の型宣言を禁止 implicit none !変数定義 real(8), intent(in) :: xz_ExnerBasicZ(DimXMin:DimXMax, DimZMin:DimZMax) real(8), intent(in) :: xz_Exner(DimXMin:DimXMax, DimZMin:DimZMax) real(8), intent(in) :: xz_PotTempBasicZ(DimXMin:DimXMax, DimZMin:DimZMax) real(8), intent(in) :: xz_PotTemp(DimXMin:DimXMax, DimZMin:DimZMax) real(8) :: xz_RadHeatBalance(DimXMin:DimXMax, DimZMin:DimZMax) !放射強制 real(8) :: xz_DensSum(DimXMin:DimXMax, DimZMin:DimZMax) !密度(基本場成分と擾乱成分の和) ! real(8) :: z_DensXmean(DimZMin:DimZMax) ! !密度(水平平均) ! real(8) :: HeatRatio !初期の加熱率とある時刻の加熱率の比 ! real(8) :: CoolRatio !初期の冷却率とある時刻の冷却率の比 real(8) :: HeatSum !ある時刻での単位時間当たりの加熱量 real(8) :: CoolSum !ある時刻での単位時間当たりの冷却量 ! real(8) :: WorkRad(DimXMin:DimXMax, DimZMin:DimZMax) !ある時刻での単位時間当たりの冷却量 ! real(8) :: WorkRad2 !ある時刻での単位時間当たりの冷却量 integer :: i integer :: k ! 密度の算出 xz_DensSum = PressSfc * (xz_ExnerBasicZ + xz_Exner)**( CvDry /GasRDry ) / (GasRDry * (xz_PotTempBasicZ + xz_PotTemp ) ) ! ! 密度の水平平均の算出 ! z_DensXmean = sum( xz_DensSum(RegXMin+1:RegXMax, :), 1) / real(RegXMax - RegXMin) HeatSum = 0.0d0 CoolSum = 0.0d0 !加熱するのは, 高度 0 - 1000 m => 格子点は 1 (RegZMin + 1) から IntHeightUp !冷却するのは, 高度 1000 - 15000 m => 格子点は IntHeightUp + 1 から IntHeightUp2 !*** 抜粋 *** ! IntHeightUp の特定 !do k = DimZMin, DimZMax ! if ( (RadHeightUp - DelZ <= s_Z(k)) .and. (s_Z(k) < RadHeightUp) ) then ! IntHeightUp = k ! else if ( (RadHeightUp2 - DelZ <= s_Z(k)) .and. (s_Z(k) < RadHeightUp2) ) then ! IntHeightUp2 = k ! end if !end do ! ! 下端 1000 ! |--*--|--*--|--*--|--*--|--*--|--*--|--*--| ! 1 5 ! ! 1000 Max ! |--*--|--*--|--*--|--*--|--*--|--*--|--*--| ! 6 I ! ある時刻での (加熱量/加熱率) を計算 do k = RegZmin + 1, IntHeightUp do i = RegXmin + 1, RegXMax HeatSum = HeatSum + DelZ * CpDry * xz_DensSum(i,k) end do end do ! ある時刻での (冷却量/冷却率) を計算 do k = IntHeightUp + 1, IntHeightUp2 do i = RegXmin + 1, RegXMax CoolSum = CoolSum + DelZ * CpDry * xz_DensSum(i,k) end do end do ! 加熱率の算出 ! RadCoolRate が負値であることに注意. RadHeatRate = - RadCoolRate * CoolSum / HeatSum xz_RadHeatBalance = xz_RadHeight * RadHeatRate / ( xz_ExnerBasicZ * DayTime ) + xz_RadHeight2 * RadCoolRate / ( xz_ExnerBasicZ * DayTime ) ! WorkRad = HeatSum * RadHeatRate + CoolSum * RadCoolRate ! WorkRad = DelZ * CpDry * xz_ExnerBasicZ * xz_RadHeatBalance * xz_DensSum ! WorkRad2 = sum( WorkRad(RegXMin+1:RegXMax, RegZMin+1:RegZMax) ) call StorePotTempRad( xz_RadHeatBalance ) ! write(*,*) "net radiative heating", WorkRad2 end function xz_RadHeatBalance
Function : | |||
xz_RadHeatBalance(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8)
| ||
xz_ExnerBasicZ(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) | ||
xz_PotTempBasicZ(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) | ||
xz_Exner(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) | ||
xz_PotTemp(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) |
温位の放射強制項. 地表面から RadHeight で指定された高度までの間で空間的に一様な加熱, RadHeight から RadHeight2 までの間で空間的な一様な冷却を与える. 放射強制全体として加熱と冷却がバランスするように時々刻々一様加熱率 および一様冷却率を変化させる. 冷却の振幅を与え, 加熱の振幅を調節する.
function xz_RadHeatBalance(xz_ExnerBasicZ, xz_PotTempBasicZ, xz_Exner, xz_PotTemp) ! ! 温位の放射強制項. ! 地表面から RadHeight で指定された高度までの間で空間的に一様な加熱, ! RadHeight から RadHeight2 までの間で空間的な一様な冷却を与える. ! 放射強制全体として加熱と冷却がバランスするように時々刻々一様加熱率 ! および一様冷却率を変化させる. ! 冷却の振幅を与え, 加熱の振幅を調節する. !暗黙の型宣言を禁止 implicit none !変数定義 real(8), intent(in) :: xz_ExnerBasicZ(DimXMin:DimXMax, DimZMin:DimZMax) real(8), intent(in) :: xz_Exner(DimXMin:DimXMax, DimZMin:DimZMax) real(8), intent(in) :: xz_PotTempBasicZ(DimXMin:DimXMax, DimZMin:DimZMax) real(8), intent(in) :: xz_PotTemp(DimXMin:DimXMax, DimZMin:DimZMax) real(8) :: xz_RadHeatBalance(DimXMin:DimXMax, DimZMin:DimZMax) !放射強制 real(8) :: xz_DensSum(DimXMin:DimXMax, DimZMin:DimZMax) !密度(基本場成分と擾乱成分の和) ! real(8) :: z_DensXmean(DimZMin:DimZMax) ! !密度(水平平均) ! real(8) :: HeatRatio !初期の加熱率とある時刻の加熱率の比 ! real(8) :: CoolRatio !初期の冷却率とある時刻の冷却率の比 real(8) :: HeatSum !ある時刻での単位時間当たりの加熱量 real(8) :: CoolSum !ある時刻での単位時間当たりの冷却量 ! real(8) :: WorkRad(DimXMin:DimXMax, DimZMin:DimZMax) !ある時刻での単位時間当たりの冷却量 ! real(8) :: WorkRad2 !ある時刻での単位時間当たりの冷却量 integer :: i integer :: k ! 密度の算出 xz_DensSum = PressSfc * (xz_ExnerBasicZ + xz_Exner)**( CvDry /GasRDry ) / (GasRDry * (xz_PotTempBasicZ + xz_PotTemp ) ) ! ! 密度の水平平均の算出 ! z_DensXmean = sum( xz_DensSum(RegXMin+1:RegXMax, :), 1) / real(RegXMax - RegXMin) HeatSum = 0.0d0 CoolSum = 0.0d0 !加熱するのは, 高度 0 - 1000 m => 格子点は 1 (RegZMin + 1) から IntHeightUp !冷却するのは, 高度 1000 - 15000 m => 格子点は IntHeightUp + 1 から IntHeightUp2 !*** 抜粋 *** ! IntHeightUp の特定 !do k = DimZMin, DimZMax ! if ( (RadHeightUp - DelZ <= s_Z(k)) .and. (s_Z(k) < RadHeightUp) ) then ! IntHeightUp = k ! else if ( (RadHeightUp2 - DelZ <= s_Z(k)) .and. (s_Z(k) < RadHeightUp2) ) then ! IntHeightUp2 = k ! end if !end do ! ! 下端 1000 ! |--*--|--*--|--*--|--*--|--*--|--*--|--*--| ! 1 5 ! ! 1000 Max ! |--*--|--*--|--*--|--*--|--*--|--*--|--*--| ! 6 I ! ある時刻での (加熱量/加熱率) を計算 do k = RegZmin + 1, IntHeightUp do i = RegXmin + 1, RegXMax HeatSum = HeatSum + DelZ * CpDry * xz_DensSum(i,k) end do end do ! ある時刻での (冷却量/冷却率) を計算 do k = IntHeightUp + 1, IntHeightUp2 do i = RegXmin + 1, RegXMax CoolSum = CoolSum + DelZ * CpDry * xz_DensSum(i,k) end do end do ! 加熱率の算出 ! RadCoolRate が負値であることに注意. RadHeatRate = - RadCoolRate * CoolSum / HeatSum xz_RadHeatBalance = xz_RadHeight * RadHeatRate / ( xz_ExnerBasicZ * DayTime ) + xz_RadHeight2 * RadCoolRate / ( xz_ExnerBasicZ * DayTime ) ! WorkRad = HeatSum * RadHeatRate + CoolSum * RadCoolRate ! WorkRad = DelZ * CpDry * xz_ExnerBasicZ * xz_RadHeatBalance * xz_DensSum ! WorkRad2 = sum( WorkRad(RegXMin+1:RegXMax, RegZMin+1:RegZMax) ) call StorePotTempRad( xz_RadHeatBalance ) ! write(*,*) "net radiative heating", WorkRad2 end function xz_RadHeatBalance
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 ) xz_RadHeatConst = xz_RadHeight * RadHeatRate / ( ( xz_ExnerBasicZ + xz_Exner ) * DayTime ) + xz_RadHeight2 * RadHeatRate2 / ( ( xz_ExnerBasicZ + xz_Exner ) * DayTime ) call StorePotTempRad( xz_RadHeatConst ) end function xz_RadHeatConst
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 ) xz_RadHeatConst = xz_RadHeight * RadHeatRate / ( ( xz_ExnerBasicZ + xz_Exner ) * DayTime ) + xz_RadHeight2 * RadCoolRate / ( ( xz_ExnerBasicZ + xz_Exner ) * DayTime ) call StorePotTempRad( xz_RadHeatConst ) end function xz_RadHeatConst
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 ) xz_RadHeatConst = xz_RadHeight * RadHeatRate / ( ( xz_ExnerBasicZ + xz_Exner ) * DayTime ) + xz_RadHeight2 * RadHeatRate2 / ( ( xz_ExnerBasicZ + xz_Exner ) * DayTime ) call StorePotTempRad( xz_RadHeatConst ) end function xz_RadHeatConst
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 ) xz_RadHeatConst = xz_RadHeight * RadHeatRate / ( ( xz_ExnerBasicZ + xz_Exner ) * DayTime ) + xz_RadHeight2 * RadCoolRate / ( ( xz_ExnerBasicZ + xz_Exner ) * DayTime ) call StorePotTempRad( xz_RadHeatConst ) end function xz_RadHeatConst
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 ) xz_RadHeatConst = xz_RadHeight * RadHeatRate / ( ( xz_ExnerBasicZ + xz_Exner ) * DayTime ) + xz_RadHeight2 * RadCoolRate / ( ( xz_ExnerBasicZ + xz_Exner ) * DayTime ) call StorePotTempRad( xz_RadHeatConst ) end function xz_RadHeatConst
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 ) xz_RadHeatConst = xz_RadHeight * RadHeatRate / ( ( xz_ExnerBasicZ + xz_Exner ) * DayTime ) + xz_RadHeight2 * RadHeatRate2 / ( ( xz_ExnerBasicZ + xz_Exner ) * DayTime ) call StorePotTempRad( xz_RadHeatConst ) end function xz_RadHeatConst