subroutine physics_dryadjust( xyz_Temp , xyz_DDryTempDt , xyz_Press , xyr_Press , DelTimePhy ) ! (in) 2Δt
!==== Dependency
use type_mod, only: REKIND, DBKIND, INTKIND, TOKEN, STRING
use grid_3d_mod, only: im, jm, km
use constants_mod, only: Cp , RAir ! 大気気体定数
use dc_trace, only: SetDebug, BeginSub, EndSub, DbgMessage, DataDump
implicit none
!==== Input
!
real(DBKIND), intent(in) :: xyz_Press(im,jm,km) , xyr_Press(im,jm,km+1) , DelTimePhy ! (in) 2Δt
!==== Output
!
real(DBKIND), intent(out) :: xyz_DDryTempDt(im,jm,km) ! (out) 温度変化率
!==== In/Out
!
real(DBKIND), intent(inout) :: xyz_Temp(im,jm,km) ! (inout) 温度
!----- 作業用内部変数 -----
character(STRING), parameter:: subname = "physics_dryadjust"
real(DBKIND) :: xyz_Temp_b(im,jm,km) , xy_Adjust(im,jm) , xy_Adjust_b(im,jm) , xyz_DPressDz(im,jm,km) , xyz_DDPressDDPress(im,jm,km) , xyz_DPFact(im,jm,km) , TempSat , DelTemp , Adjust ! 今回全領域において一度でも調節されたか否か
integer(INTKIND), parameter :: IterationMax = 10 ! イテレーション回数
real(DBKIND) :: TempSatMax(IterationMax) ! 不安定の許容誤差
data TempSatMax / 0.01 , 0.02 , 0.02 , 0.05 , 0.05 , 0.10 , 0.10 , 0.20 , 0.20 , 0.40 /
! do ループ用作業変数 (東西 i*、南北 j*、鉛直 k*、波数 l*用)
integer(INTKIND) :: i, j, k
integer(INTKIND) :: Iteration
continue
!----------------------------------------------------------------
! 開始処理
!----------------------------------------------------------------
call BeginSub(subname)
!----------------------------------------------------------------
! 湿潤対流調節
!----------------------------------------------------------------
!----- 調節前 Qvap の保存 -----
xyz_Temp_b = xyz_Temp
!----- 変数初期化 -----
xyz_DDryTempDt = 0.0d0
!----- ファクター計算 -----
do k = 1, km
xyz_DPressDz(:,:,k) = xyr_Press(:,:,k) - xyr_Press(:,:,k+1)
end do
do k = 2, km
xyz_DDPressDDPress(:,:,k) = xyz_DPressDz(:,:,k) / xyz_DPressDz(:,:,k-1)
xyz_DPFact(:,:,k) = RAir / Cp * ( xyz_Press(:,:,k-1) - xyz_Press(:,:,k) ) / ( xyz_DPressDz(:,:,k-1) + xyz_DPressDz(:,:,k) ) / xyr_Press(:,:,k)
end do
!----- 調節 ------
xy_Adjust_b = 1.0d0
!----- 3.1 イテレーション ------
do Iteration = 1, IterationMax
xy_Adjust = 0.0d0
do k = 2, km
do i = 1, im
do j = 1, jm
if ( xy_Adjust_b(i,j) .GT. 0.9 ) then
TempSat = xyz_Temp(i,j,k-1) - xyz_Temp(i,j,k) - xyz_DPFact(i,j,k) * ( xyz_DPressDz(i,j,k-1) * xyz_Temp(i,j,k-1) + xyz_DPressDz(i,j,k) * xyz_Temp(i,j,k) )
! 不安定であるならば
if ( TempSat .GT. TempSatMax(Iteration) ) then
DelTemp = TempSat / ( 1. + xyz_DDPressDDPress(i,j,k) )
xyz_Temp(i,j,k) = xyz_Temp(i,j,k) + DelTemp
xyz_Temp(i,j,k-1) = xyz_Temp(i,j,k-1) - DelTemp * xyz_DDPressDDPress(i,j,k)
! 調節したか否か
xy_Adjust(i,j) = 1.
end if
end if
end do
end do
end do
Adjust = 0.
do i = 1, im
do j = 1, jm
xy_Adjust_b(i,j) = xy_Adjust(i,j)
Adjust = Adjust + xy_Adjust(i,j)
end do
end do
if ( Adjust .LT. 1. ) exit
end do
!----- 比湿変化率, 温度変化率, 降水量の算出 -----
! 温度変化率
xyz_DDryTempDt = xyz_DDryTempDt + ( xyz_Temp - xyz_Temp_b ) / DelTimePhy
!----------------------------------------------------------------
! 終了処理
!----------------------------------------------------------------
call EndSub(subname)
end subroutine physics_dryadjust