| Class | physics_implicit_mod |
| In: |
physics/physics_implicit.f90
|
地表面フラックス, 放射フラックス, 表面温度を陰解法で 計算する.
(2006-7-30 石渡) subroutine physics_implicit_fluxcorrection 追加
| Subroutine : | |||
| xyr_VelLonFlux(im,jm,km+1) : | real(DBKIND), intent(inout)
| ||
| xyr_VelLatFlux(im,jm,km+1) : | real(DBKIND), intent(inout)
| ||
| xyr_TempFlux(im,jm,km+1) : | real(DBKIND), intent(inout)
| ||
| xyr_QvapFlux(im,jm,km+1) : | real(DBKIND), intent(inout)
| ||
| xyz_DVerdiffVelLonDt(im,jm,km) : | real(DBKIND), intent(in)
| ||
| xyz_DVerdiffVelLatDt(im,jm,km) : | real(DBKIND), intent(in)
| ||
| xyz_DVerdiffTempDt(im,jm,km) : | real(DBKIND), intent(in)
| ||
| xyz_DVerdiffSurfTempDt(im,jm) : | real(DBKIND), intent(in)
| ||
| xyz_DVerdiffQvapDt(im,jm,km) : | real(DBKIND), intent(in)
| ||
| xyzo_VelMatrix(im,jm,km,-1:1) : | real(DBKIND), intent(in)
| ||
| xyzo_TempMatrix(im,jm,0:km,-1:1) : | real(DBKIND), intent(in)
| ||
| xyzo_QvapMatrix(im,jm,km,-1:1) : | real(DBKIND), intent(in)
| ||
| xy_SurfVelMatrix(im,jm) : | real(DBKIND), intent(in)
| ||
| xyoo_SurfTempMatrix(im,jm,0:1,-1:1) : | real(DBKIND), intent(in)
| ||
| xyoo_SurfQvapMatrix(im,jm,0:1,-1:1) : | real(DBKIND), intent(in)
| ||
| DelTimePhy : | real(DBKIND), intent(in)
|
フラックスの補正
subroutine physics_implicit_fluxcorrection ( xyr_VelLonFlux, xyr_VelLatFlux, xyr_TempFlux, xyr_QvapFlux, xyz_DVerdiffVelLonDt, xyz_DVerdiffVelLatDt, xyz_DVerdiffTempDt, xyz_DVerdiffSurfTempDt, xyz_DVerdiffQvapDt, xyzo_VelMatrix, xyzo_TempMatrix, xyzo_QvapMatrix, xy_SurfVelMatrix, xyoo_SurfTempMatrix, xyoo_SurfQvapMatrix, DelTimePhy )
!
! フラックスの補正
!
!
use type_mod, only: DBKIND, INTKIND, STRING
use grid_3d_mod, only: im, jm, km
use constants_mod, only: EL, Cp
use dc_trace, only: BeginSub, EndSub
real(DBKIND), intent(inout) :: xyr_VelLonFlux(im,jm,km+1) ! Uのフラックス
real(DBKIND), intent(inout) :: xyr_VelLatFlux(im,jm,km+1) ! Vのフラックス
real(DBKIND), intent(inout) :: xyr_TempFlux(im,jm,km+1) ! Tのフラックス
real(DBKIND), intent(inout) :: xyr_QvapFlux(im,jm,km+1) ! qのフラックス
real(DBKIND), intent(in) :: xyz_DVerdiffVelLonDt(im,jm,km)
! 東西運動量変化項UA
real(DBKIND), intent(in) :: xyz_DVerdiffVelLatDt(im,jm,km)
! 南北運動量変化項VA
real(DBKIND), intent(in) :: xyz_DVerdiffTempDt(im,jm,km) ! 温度時間変化項H
real(DBKIND), intent(in) :: xyz_DVerdiffSurfTempDt(im,jm) ! 地表温度変化率
real(DBKIND), intent(in) :: xyz_DVerdiffQvapDt(im,jm,km) ! 比湿時間変化項R
real(DBKIND), intent(in) :: xyzo_VelMatrix(im,jm,km,-1:1) ! u陰解行列
real(DBKIND), intent(in) :: xyzo_TempMatrix(im,jm,0:km,-1:1) ! T陰解行列
real(DBKIND), intent(in) :: xyzo_QvapMatrix(im,jm,km,-1:1) ! q陰解行列
real(DBKIND), intent(in) :: xy_SurfVelMatrix(im,jm) ! u陰解行列:地表
real(DBKIND), intent(in) :: xyoo_SurfTempMatrix(im,jm,0:1,-1:1)
! T陰解行列:地表
real(DBKIND), intent(in) :: xyoo_SurfQvapMatrix(im,jm,0:1,-1:1)
! q陰解行列:地表
real(DBKIND), intent(in) :: DelTimePhy ! 時間刻みΔt
real(DBKIND) :: ELF
INTEGER(INTKIND) :: k
character(STRING), parameter:: subname = "physics_implicit_fluxcorrection"
! 開始処理
call BeginSub(subname)
ELF = EL/Cp
DO k = 2, km
xyr_VelLonFlux(:,:,k) = xyr_VelLonFlux(:,:,K) - ( xyzo_VelMatrix(:,:,k,-1)* xyz_DVerdiffVelLonDt(:,:,k-1) - xyzo_VelMatrix(:,:,k-1,1)* xyz_DVerdiffVelLonDt(:,:,k) ) * DelTimePhy
xyr_VelLatFlux(:,:,k) = xyr_VelLatFlux(:,:,k) - ( xyzo_VelMatrix(:,:,k,-1) * xyz_DVerdiffVelLatDt(:,:,k-1) - xyzo_VelMatrix(:,:,k-1,1) * xyz_DVerdiffVelLatDt(:,:,k) ) * DelTimePhy
xyr_TempFlux(:,:,k) = xyr_TempFlux(:,:,k) - ( xyzo_TempMatrix(:,:,k,-1) * xyz_DVerdiffTempDt(:,:,k-1) - xyzo_TempMatrix(:,:,k-1,1) * xyz_DVerdiffTempDt(:,:,k) ) * DelTimePhy
xyr_QvapFlux(:,:,k) = xyr_QvapFlux(:,:,k) - ( xyzo_QvapMatrix(:,:,k,-1) * xyz_DVerdiffQvapDt(:,:,k-1) - xyzo_QvapMatrix(:,:,k-1,1) * xyz_DVerdiffQvapDt(:,:,k) ) * DelTimePhy * ELF
end do
xyr_VelLonFlux(:,:,1) = xyr_VelLonFlux(:,:,1) - xy_SurfVelMatrix(:,:) * xyz_DVerdiffVelLonDt(:,:,1) * DelTimePhy
xyr_VelLatFlux(:,:,1) = xyr_VelLatFlux(:,:,1) - xy_SurfVelMatrix(:,:) * xyz_DVerdiffVelLatDt(:,:,1) * DelTimePhy
xyr_TempFlux(:,:,1) = xyr_TempFlux(:,:,1) - ( xyoo_SurfTempMatrix(:,:,1,-1) * xyz_DVerdiffSurfTempDt(:,:) + xyoo_SurfTempMatrix(:,:,1,0) * xyz_DVerdiffTempDt(:,:,1) ) * DelTimePhy
xyr_QvapFlux(:,:,1) = xyr_QvapFlux(:,:,1) - ( xyoo_SurfQvapMatrix(:,:,1,-1) * xyz_DVerdiffSurfTempDt(:,:) + xyoo_SurfQvapMatrix(:,:,1,0) * xyz_DVerdiffQvapDt(:,:,1) * ELF ) * DelTimePhy
! 終了処理
call EndSub(subname)
end subroutine physics_implicit_fluxcorrection
| Subroutine : | |||
| xyr_VelLonFlux(im*jm,km+1) : | real(DBKIND), intent(out)
| ||
| xyr_VelLatFlux(im*jm,km+1) : | real(DBKIND), intent(out)
| ||
| xyr_TempFlux(im*jm,km+1) : | real(DBKIND), intent(out)
| ||
| xyr_QvapFlux(im*jm,km+1) : | real(DBKIND), intent(out)
| ||
| xyzo_VelMatrix(im*jm,km,-1:1) : | real(DBKIND), intent(out)
| ||
| xyzo_TempMatrix(im*jm,0:km,-1:1) : | real(DBKIND), intent(out)
| ||
| xyzo_QvapMatrix(im*jm,km,-1:1) : | real(DBKIND), intent(out)
| ||
| xyr_Press(im*jm,km+1) : | real(DBKIND), intent(in)
| ||
| DelTimePhy : | real(DBKIND), intent(in)
| ||
| xy_SurfHeatCapacity(im*jm) : | real(DBKIND), intent(in)
| ||
| xy_SurfCondition(im*jm) : | integer(INTKIND), intent(in)
|
(in) 地表状態
subroutine physics_implicit_init( xyr_VelLonFlux , xyr_VelLatFlux , xyr_TempFlux , xyr_QvapFlux , xyzo_VelMatrix , xyzo_TempMatrix , xyzo_QvapMatrix , xyr_Press , DelTimePhy , xy_SurfHeatCapacity , xy_SurfCondition ) ! (in) 地表状態
!
use type_mod, only: REKIND, DBKIND, INTKIND, TOKEN, STRING
use grid_3d_mod, only: im, jm, km
use constants_mod, only: Cp, Grav
use dc_trace, only: SetDebug, BeginSub, EndSub, DbgMessage, DataDump
implicit none
real(DBKIND), intent(out) :: xyr_VelLonFlux(im*jm,km+1) , xyr_VelLatFlux(im*jm,km+1) , xyr_TempFlux(im*jm,km+1) , xyr_QvapFlux(im*jm,km+1) , xyzo_VelMatrix(im*jm,km,-1:1) , xyzo_TempMatrix(im*jm,0:km,-1:1) , xyzo_QvapMatrix(im*jm,km,-1:1) !比湿陰解行列
real(DBKIND), intent(in) :: xyr_Press(im*jm,km+1) , DelTimePhy , xy_SurfHeatCapacity(im*jm) ! 地表熱容量
integer(INTKIND), intent(in) :: xy_SurfCondition(im*jm) ! 地表状態
character(STRING), parameter:: subname = "physics_implicit_init"
integer(INTKIND) :: ij, k
! do ループ用作業変数 (東西 i*、南北 j*、鉛直 k*、波数 l*用)
continue
! 開始処理
call BeginSub(subname)
!----------------------------------------------------------------
! 陰解行列初期化
!----------------------------------------------------------------
! ---- 1. 質量, 熱容量の項 ----
xyzo_VelMatrix = 0.0
xyzo_TempMatrix = 0.0
xyzo_QvapMatrix = 0.0
do k = 1, km
xyzo_VelMatrix(:,k,0) = ( xyr_Press(:,k) - xyr_Press(:,k+1) ) / Grav / DelTimePhy
xyzo_TempMatrix(:,k,0) = xyzo_VelMatrix(:,k,0) * Cp
xyzo_QvapMatrix(:,k,0) = xyzo_VelMatrix(:,k,0) * Cp
end do
do ij = 1, im*jm
if ( xy_SurfCondition(ij) .GE. 1 ) then
xyzo_TempMatrix(ij,0,0) = xy_SurfHeatCapacity(ij) / DelTimePhy
else
xyzo_TempMatrix(ij,0,0) = 1.
end if
end do
! ---- 2. フラックスをリセット ----
xyr_VelLonFlux = 0.0
xyr_VelLatFlux = 0.0
xyr_TempFlux = 0.0
xyr_QvapFlux = 0.0
! 終了処理
call EndSub(subname)
end subroutine physics_implicit_init
| Subroutine : | |||
| xyz_DVerdiffVelLonDt(im*jm,km) : | real(DBKIND), intent(out)
| ||
| xyz_DVerdiffVelLatDt(im*jm,km) : | real(DBKIND), intent(out)
| ||
| xyz_DVerdiffTempDt(im*jm,km) : | real(DBKIND), intent(out)
| ||
| xyz_DVerdiffSurfTempDt(im*jm) : | real(DBKIND), intent(out)
| ||
| xyz_DVerdiffQvapDt(im*jm,km) : | real(DBKIND), intent(out)
| ||
| xyr_VelLonFlux(im*jm,km+1) : | real(DBKIND), intent(in)
| ||
| xyr_VelLatFlux(im*jm,km+1) : | real(DBKIND), intent(in)
| ||
| xyr_TempFlux(im*jm,km+1) : | real(DBKIND), intent(in)
| ||
| xyr_SurfRadSFlux(im*jm) : | real(DBKIND), intent(in)
| ||
| xyr_SurfRadLFlux(im*jm) : | real(DBKIND), intent(in)
| ||
| xy_GroundTempFlux(im*jm) : | real(DBKIND), intent(in)
| ||
| xyr_QvapFlux(im*jm,km+1) : | real(DBKIND), intent(in)
| ||
| xyzo_VelMatrix(im*jm,km,-1:1) : | real(DBKIND), intent(in)
| ||
| xyzo_TempMatrix(im*jm,0:km,-1:1) : | real(DBKIND), intent(in)
| ||
| xyzo_QvapMatrix(im*jm,km,-1:1) : | real(DBKIND), intent(in)
| ||
| xy_SurfVelMatrix(im*jm) : | real(DBKIND), intent(in)
| ||
| xyoo_SurfTempMatrix(im*jm,0:1,-1:1) : | real(DBKIND), intent(in)
| ||
| xyoo_SurfQvapMatrix(im*jm,0:1,-1:1) : | real(DBKIND), intent(in)
| ||
| xyo_SurfRadLMatrix(im*jm,-1:1) : | real(DBKIND), intent(in)
| ||
| DelTimePhy : | real(DBKIND), intent(in)
| ||
| xy_SurfCondition(im*jm) : | integer(INTKIND)
|
(in) 地表状態
時間変化率の計算 (implicit)
subroutine physics_implicit_integrate( xyz_DVerdiffVelLonDt , xyz_DVerdiffVelLatDt , xyz_DVerdiffTempDt , xyz_DVerdiffSurfTempDt , xyz_DVerdiffQvapDt , xyr_VelLonFlux , xyr_VelLatFlux , xyr_TempFlux , xyr_SurfRadSFlux , xyr_SurfRadLFlux , xy_GroundTempFlux , xyr_QvapFlux , xyzo_VelMatrix , xyzo_TempMatrix , xyzo_QvapMatrix , xy_SurfVelMatrix , xyoo_SurfTempMatrix , xyoo_SurfQvapMatrix , xyo_SurfRadLMatrix , DelTimePhy , xy_SurfCondition ) ! (in) 地表状態
!
! 時間変化率の計算 (implicit)
use type_mod, only: REKIND, DBKIND, INTKIND, TOKEN, STRING
use grid_3d_mod, only: im, jm, km
use constants_mod, only: EL, Cp
use dc_trace, only: SetDebug, BeginSub, EndSub, DbgMessage, DataDump
implicit none
real(DBKIND), intent(out) :: xyz_DVerdiffVelLonDt(im*jm,km), xyz_DVerdiffVelLatDt(im*jm,km), xyz_DVerdiffTempDt(im*jm,km), xyz_DVerdiffSurfTempDt(im*jm), xyz_DVerdiffQvapDt(im*jm,km) ! 鉛直拡散加湿率
real(DBKIND), intent(in) :: xyr_VelLonFlux(im*jm,km+1), xyr_VelLatFlux(im*jm,km+1), xyr_TempFlux(im*jm,km+1), xyr_SurfRadSFlux(im*jm), xyr_SurfRadLFlux(im*jm), xy_GroundTempFlux(im*jm) , xyr_QvapFlux(im*jm,km+1) , xyzo_VelMatrix(im*jm,km,-1:1) , xyzo_TempMatrix(im*jm,0:km,-1:1) , xyzo_QvapMatrix(im*jm,km,-1:1) , xy_SurfVelMatrix(im*jm) , xyoo_SurfTempMatrix(im*jm,0:1,-1:1) , xyoo_SurfQvapMatrix(im*jm,0:1,-1:1) , xyo_SurfRadLMatrix(im*jm,-1:1) , DelTimePhy ! 2Δt
integer(INTKIND) :: xy_SurfCondition(im*jm) ! 地表状態
!----- 作業用内部変数 -----
character(STRING), parameter:: subname = "physics_implicit_integrate"
integer(INTKIND) :: ij, k, l
! do ループ用作業変数 (東西 i*、南北 j*、鉛直 k*、波数 l*用)
real(DBKIND) :: xyz_DelTempQvap(im*jm,-km:km) , xyzo_TempQvapLUMatrix(im*jm,-km:km,-1:1) , xyzo_VelLUMatrix(im*jm,km,-1:1) ! LU行列
continue
! 開始処理
call BeginSub(subname)
!----------------------------------------------------------------
! 陰解行列計算
!----------------------------------------------------------------
! ---- 1. 速度 (Vlon, Vlat) の解 ----
xyzo_VelLUMatrix = xyzo_VelMatrix
xyzo_VelLUMatrix(:,1,0) = xyzo_VelLUMatrix(:,1,0) + xy_SurfVelMatrix(:)
call lu_decomposition_tridiagonal( xyzo_VelLUMatrix, im*jm, km )
do k = 1, km
xyz_DVerdiffVelLonDt(:,k) = xyr_VelLonFlux(:,k) - xyr_VelLonFlux(:,k+1)
xyz_DVerdiffVelLatDt(:,k) = xyr_VelLatFlux(:,k) - xyr_VelLatFlux(:,k+1)
end do
call lu_solve_tridiagonal( xyz_DVerdiffVelLonDt , xyzo_VelLUMatrix , 1, im*jm, km )
call lu_solve_tridiagonal( xyz_DVerdiffVelLatDt , xyzo_VelLUMatrix , 1, im*jm, km )
! ---- 2. 温度と比湿の解 ----
do l = -1, 1
do k = 1, km
xyzo_TempQvapLUMatrix(:,k,l) = xyzo_TempMatrix(:,k,l)
xyzo_TempQvapLUMatrix(:,-k,-l) = xyzo_QvapMatrix(:,k,l)
end do
xyzo_TempQvapLUMatrix(:,1,l) = xyzo_TempMatrix(:,1,l) + xyoo_SurfTempMatrix(:,1,l)
xyzo_TempQvapLUMatrix(:,-1,-l) = xyzo_QvapMatrix(:,1,l) + xyoo_SurfQvapMatrix(:,1,l)
end do
xyzo_TempQvapLUMatrix(:,0,0) = xyzo_TempMatrix(:,0,0) + xyoo_SurfTempMatrix(:,0,0) + xyoo_SurfQvapMatrix(:,0,0) + xyo_SurfRadLMatrix(:,0)
xyzo_TempQvapLUMatrix(:,0,1) = + xyoo_SurfTempMatrix(:,0,1) + xyo_SurfRadLMatrix(:,1)
xyzo_TempQvapLUMatrix(:,0,-1) = xyoo_SurfQvapMatrix(:,0,1)
call lu_decomposition_tridiagonal( xyzo_TempQvapLUMatrix, im*jm, 2*km+1 )
do k = 1, km
xyz_DelTempQvap(:,k) = xyr_TempFlux(:,k) - xyr_TempFlux(:,k+1)
xyz_DelTempQvap(:,-k) = xyr_QvapFlux(:,k) - xyr_QvapFlux(:,k+1)
end do
xyz_DelTempQvap(:,0) = - xyr_SurfRadSFlux - xyr_SurfRadLFlux - xyr_TempFlux(:,1) - xyr_QvapFlux(:,1) + xy_GroundTempFlux
call lu_solve_tridiagonal( xyz_DelTempQvap , xyzo_TempQvapLUMatrix , 1, im*jm, 2*km+1 )
! ---- 2. 時間変化率 ----
do k = 1, km
xyz_DVerdiffVelLonDt(:,k) = xyz_DVerdiffVelLonDt(:,k) / DeltimePhy
xyz_DVerdiffVelLatDt(:,k) = xyz_DVerdiffVelLatDt(:,k) / DeltimePhy
xyz_DVerdiffTempDt(:,k) = xyz_DelTempQvap(:,k) / DeltimePhy
xyz_DVerdiffQvapDt(:,k) = xyz_DelTempQvap(:,-k) / DeltimePhy / EL * Cp
end do
do ij = 1, im*jm
if ( xy_SurfCondition(ij) .GE. 1 ) then
xyz_DVerdiffSurfTempDt(ij) = xyz_DelTempQvap(ij,0) / DeltimePhy
else
xyz_DVerdiffSurfTempDt(ij) = 0.
end if
end do
!----------------------------------------------------------------
! 終了処理
!----------------------------------------------------------------
call EndSub(subname)
end subroutine physics_implicit_integrate