Subroutine : |
|
xyz_PTemp(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in)
|
xyzf_QMix(imin:imax,jmin:jmax,kmin:kmax, ncmax) : | real(DP), intent(in)
|
xyz_DPTempDt(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(inout)
|
xyz_DExnerDt(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(inout)
|
xyzf_DQMixDt(imin:imax,jmin:jmax,kmin:kmax, ncmax) : | real(DP), intent(inout)
|
下部境界からのフラックスによる温度の変化率を, バルク方法に基づいて計算する.
subroutine Surfaceflux_Diff_forcing( xyz_PTemp, xyzf_QMix, xyz_DPTempDt, xyz_DExnerDt, xyzf_DQMixDt )
!
! 下部境界からのフラックスによる温度の変化率を,
! バルク方法に基づいて計算する.
!
!暗黙の型宣言禁止
implicit none
!変数定義
real(DP), intent(in) :: xyz_PTemp(imin:imax,jmin:jmax,kmin:kmax)
!温位の擾乱成分
real(DP), intent(in) :: xyzf_QMix(imin:imax,jmin:jmax,kmin:kmax, ncmax)
!温位の擾乱成分
real(DP), intent(inout):: xyz_DPTempDt(imin:imax,jmin:jmax,kmin:kmax)
real(DP), intent(inout):: xyz_DExnerDt(imin:imax,jmin:jmax,kmin:kmax)
real(DP), intent(inout):: xyzf_DQMixDt(imin:imax,jmin:jmax,kmin:kmax, ncmax)
real(DP) :: xyz_DPTempDt0(imin:imax,jmin:jmax,kmin:kmax)
real(DP) :: xyz_DExnerDt0(imin:imax,jmin:jmax,kmin:kmax)
real(DP) :: xyzf_DQMixDt0(imin:imax,jmin:jmax,kmin:kmax, ncmax)
real(DP) :: xyz_Heatflux(imin:imax,jmin:jmax,kmin:kmax)
real(DP) :: xyz_Exnerflux(imin:imax,jmin:jmax,kmin:kmax)
real(DP) :: xyzf_QMixflux(imin:imax,jmin:jmax,kmin:kmax, ncmax)
!地表面熱フラックス
integer, parameter :: kz = 1 !配列添字
integer :: l !ループ変数
! 初期化
!
xyz_HeatFlux = 0.0d0
xyz_ExnerFlux = 0.0d0
xyzf_QMixFlux = 0.0d0
xyz_DPTempDt0 = xyz_DPTempDt
xyz_DExnerDt0 = xyz_DExnerDt
xyzf_DQMixDt0 = xyzf_DQMixDt
!地表面熱フラックスによる加熱率を計算
! * 単位は K/s
! * エクスナー関数は基本場の値で代表させる.
! * 格子点 xz では, 物理領域の最下端の添え字は kz = 1
xyz_HeatFlux(:,:,kz) = - Kappa * xyz_PTemp(:,:,kz) * xyz_ExnerBZ(:,:,kz) / ( ( z_dz(kz) * 5.0d-1 ) ** 2.0d0 )
do l = 1, GasNum
xyzf_QMixFlux(:,:,kz,l) = max( 0.0d0, - Kappa * xyzf_QMix(:,:,kz,l) / ( ( z_dz(kz) * 5.0d-1 ) ** 2.0d0 ) )
end do
xyz_DPTempDt = xyz_DPTempDt0 + xyz_Heatflux
xyzf_DQMixDt = xyzf_DQMixDt0 + xyzf_Qmixflux
xyz_ExnerFlux = xyz_DExnerDt_xyz_xyzf( xyz_HeatFlux, xyzf_QMixFlux )
xyz_DExnerDt = xyz_DExnerDt0 + xyz_ExnerFlux
call HistoryAutoPut(TimeN, 'PTempFlux', xyz_HeatFlux(1:nx,1:ny,1:nz))
call HistoryAutoPut(TimeN, 'ExnerFlux', xyz_ExnerFlux(1:nx,1:ny,1:nz))
do l = 1, ncmax
call HistoryAutoPut(TimeN, trim(SpcWetSymbol(l))//'_Flux', xyzf_Qmixflux(1:nx,1:ny,1:nz,l))
end do
! Set margin
!
! call SetMargin_xyz(xyz_DPTempDt)
! call SetMargin_xyzf(xyzf_DQMixDt)
end subroutine Surfaceflux_Diff_forcing