subroutine physics_radiation_main( xyr_RadLFlux , xyo_SurfRadLMatrix , xyro_DelRadLFlux , xyr_RadSFlux , xyz_Temp , xy_SurfTemp , xyz_Qvap , xyr_Press , x_Lon , y_Lat , xy_SurfAlbedo ) ! (in) 地表アルベド
!==== Dependency
use type_mod, only: REKIND, DBKIND, INTKIND, TOKEN, STRING
use grid_3d_mod, only: im, jm, km
use constants_mod, only: Grav
use physics_radiation_long_mod, only: physics_radiation_long
use physics_radiation_short_mod, only: physics_radiation_short
use physics_radiation_incoming_mod, only: physics_radiation_incoming
use dc_trace, only: SetDebug, BeginSub, EndSub, DbgMessage, DataDump
use dycore_time_mod, only: CurrentTime, CurrentLoop
implicit none
!==== Output
!
real(DBKIND), intent(out) :: xyr_RadLFlux(im,jm,km+1) , xyo_SurfRadLMatrix(im,jm,-1:1) , xyro_DelRadLFlux(im,jm,km+1,0:1) , xyr_RadSFlux(im,jm,km+1) ! (out) 日射フラックス
!==== Input
!
real(DBKIND), intent(in) :: xyz_Temp(im,jm,km) , xy_SurfTemp(im,jm) , xyz_Qvap(im,jm,km) , xyr_Press(im,jm,km+1) , xy_SurfAlbedo(im,jm) , x_Lon(im) , y_Lat(jm)
!----- 作業用内部変数 -----
character(STRING), parameter:: subname = "physics_radiation_main"
! do ループ用作業変数 (東西 i*、南北 j*、鉛直 k*、波数 l*用)
integer(INTKIND) :: i,j, k
real(DBKIND) :: xyr_TauQvap(im,jm,km+1) , xyr_TauDryAir(im,jm,km+1) , xy_InAngle(im,jm) !" sec(入射角)
real(DBKIND), parameter :: RadLDelTime = 3.0
real(DBKIND), parameter :: RadSDelTime = 1.0
real(DBKIND),allocatable,save :: xy_TempOld(:,:)
real(DBKIND),allocatable,save :: xyr_RadLFluxOld(:,:,:)
real(DBKIND),allocatable,save :: xyr_RadSFluxOld(:,:,:)
real(DBKIND),allocatable,save :: xyro_DelRadLFluxOld(:,:,:,:)
real(DBKIND),save :: RadLTime, RadSTime
continue
!----------------------------------------------------------------
! 開始処理
!----------------------------------------------------------------
call BeginSub(subname)
!----------------------------------------------------------------
! 放射計算
!----------------------------------------------------------------
! 本当は, 放射計算の間隔を決めないといけない.
! 現在は毎ステップ計算してしまう.
! AGCM5 では, 短波は 1 時間, 長波は 3 時間間隔.
if ( CurrentLoop .EQ. 1 ) then
RadLTime = -999.0d0 * 60*60
RadSTime = -999.0d0 * 60*60
allocate( xy_TempOld(im,jm), xyr_RadLFluxOld(im,jm,km+1), xyr_RadSFluxOld(im,jm,km+1), xyro_DelRadLFluxOld(im,jm,km+1,0:1) )
end if
! ---- 1. τ の計算 ----
xyr_TauQvap = 0.0d0
xyr_TauDryAir = 0.0d0
do k = km , 1, -1
xyr_TauQvap(:,:,k) = xyr_TauQvap(:,:,k+1) + xyz_Qvap(:,:,k) * ( xyr_Press(:,:,k) - xyr_Press(:,:,k+1) ) / Grav
xyr_TauDryAir(:,:,k) = xyr_TauDryAir(:,:,k+1) + ( xyr_Press(:,:,k) - xyr_Press(:,:,k+1) ) / Grav
end do
! ---- 2. 長波フラックスの算出 ----
if ( (CurrentTime - RadLTime) .GE. (RadLDelTime*60*60) ) then
RadLTime = CurrentTime
call physics_radiation_long( xyr_RadLFlux , xyro_DelRadLFlux , xyz_Temp , xy_SurfTemp , xyr_TauQvap , xyr_TauDryAir ) ! (in) 光学的厚さ:空気
! ---- 2*. 長波フラックスを計算しない場合 ----
else
xyr_RadLFlux = xyr_RadLFluxOld
xyro_DelRadLFlux = xyro_DelRadLFluxOld
do k = 1, km+1
xyr_RadLFlux(:,:,k) = xyr_RadLFlux(:,:,k) + xyro_DelRadLFlux(:,:,k,1) * (xyz_Temp(:,:,1) - xy_TempOld(:,:) )
xyro_DelRadLFlux(:,:,k,1) = xyro_DelRadLFlux(:,:,k,1) / (xy_TempOld(:,:)**3) * (xyz_Temp(:,:,1)**3)
end do
end if
! ---- 3. 長波陰解用行列 ----
xyo_SurfRadLMatrix(:,:,0) = xyro_DelRadLFlux(:,:,1,0)
xyo_SurfRadLMatrix(:,:,1) = xyro_DelRadLFlux(:,:,1,1)
xyo_SurfRadLMatrix(:,:,-1) = 0.0d0
if ( (CurrentTime - RadSTime) .GE. (RadSDelTime*60*60) ) then
! ---- 4. 短波入射 ----
call physics_radiation_incoming( xyr_RadSFlux(:,:,km+1) , xy_InAngle , y_Lat )
! ---- 5. 短波フラックス ----
call physics_radiation_short( xyr_RadSFlux , xyr_TauQvap , xyr_TauDryAir , xy_InAngle , xy_SurfAlbedo ) ! (in) 地表アルベド
else
xyr_RadSFlux = xyr_RadSFluxOld
end if
! ---- 古い値の保存 ----
xy_TempOld = xyz_Temp(:,:,1)
xyr_RadLFluxOld = xyr_RadLFlux
xyr_RadSFluxOld = xyr_RadSFlux
xyro_DelRadLFluxOld = xyro_DelRadLFlux
!----------------------------------------------------------------
! 終了処理
!----------------------------------------------------------------
call EndSub(subname)
end subroutine physics_radiation_main