Subroutine : |
|
xyz_U(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in)
: | $ u $ . 東西風速. Eastward wind
|
|
xyz_V(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in)
: | $ v $ . 南北風速. Northward wind
|
|
xyz_Temp(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in)
: | $ T $ . 温度 (整数レベル). Temperature (full level)
|
|
xyr_Temp(0:imax-1, 1:jmax, 0:kmax) : | real(DP), intent(in)
: | $ T $ . 温度 (半整数レベル). Temperature (half level)
|
|
xyz_QVap(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in)
: | $ q $ . 比湿. Specific humidity
|
|
xyz_Press(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in)
: | $ p_s $ . 地表面気圧 (整数レベル). Surface pressure (full level)
|
|
xyr_Press(0:imax-1, 1:jmax, 0:kmax) : | real(DP), intent(in)
: | $ p_s $ . 地表面気圧 (半整数レベル). Surface pressure (half level)
|
|
xyz_Height(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in)
: | 高度 (整数レベル). Height (full level)
|
|
xy_SurfTemp(0:imax-1, 1:jmax) : | real(DP), intent(in)
: | 地表面温度. Surface temperature
|
|
xy_SurfHumidCoeff(0:imax-1, 1:jmax) : | real(DP), intent(in)
: | 地表湿潤度. Surface humidity coefficient
|
|
xy_SurfRoughLength(0:imax-1, 1:jmax) : | real(DP), intent(in)
: | 地表粗度長. Surface rough length
|
|
xy_SurfCond(0:imax-1, 1:jmax) : | integer, intent(in)
: | 地表状態. Surface condition
|
|
xyr_UFlux(0:imax-1, 1:jmax, 0:kmax) : | real(DP), intent(inout)
: | 東西風速フラックス. Eastward wind flux
|
|
xyr_VFlux(0:imax-1, 1:jmax, 0:kmax) : | real(DP), intent(inout)
: | 南北風速フラックス. Northward wind flux
|
|
xyr_TempFlux(0:imax-1, 1:jmax, 0:kmax) : | real(DP), intent(inout)
: | 温度フラックス. Temperature flux
|
|
xyr_QVapFlux(0:imax-1, 1:jmax, 0:kmax) : | real(DP), intent(inout)
: | 比湿フラックス. Specific humidity flux
|
|
xy_SurfUVMtx(0:imax-1, 1:jmax) : | real(DP), intent(out)
: | 速度陰解行列: 地表. Implicit matrix about velocity: surface
|
|
xyaa_SurfTempMtx(0:imax-1, 1:jmax, 0:1, -1:1) : | real(DP), intent(out)
|
xyaa_SurfQVapMtx(0:imax-1, 1:jmax, 0:1, -1:1) : | real(DP), intent(out)
: | 比湿陰解行列: 地表. Implicit matrix about specific humidity: surface
|
|
温度, 比湿, 気圧から, 放射フラックスを計算します.
Calculate radiation flux from temperature, specific humidity, and air
pressure.
subroutine SurfaceFlux( xyz_U, xyz_V, xyz_Temp, xyr_Temp, xyz_QVap, xyz_Press, xyr_Press, xyz_Height, xy_SurfTemp, xy_SurfHumidCoeff, xy_SurfRoughLength, xy_SurfCond, xyr_UFlux, xyr_VFlux, xyr_TempFlux, xyr_QVapFlux, xy_SurfUVMtx, xyaa_SurfTempMtx, xyaa_SurfQVapMtx )
!
! 温度, 比湿, 気圧から, 放射フラックスを計算します.
!
! Calculate radiation flux from temperature, specific humidity, and
! air pressure.
!
! モジュール引用 ; USE statements
!
! 物理定数設定
! Physical constants settings
!
use constants, only: Grav, GasRDry, CpDry, LatentHeat
! $ L $ [J kg-1] .
! 凝結の潜熱.
! Latent heat of condensation
! 飽和比湿計算
! Evaluate saturation specific humidity
!
#ifdef LIB_SATURATE_NHA1992
use saturate_nha1992, only: CalcQVapSat, CalcDQVapSatDTemp
#elif LIB_SATURATE_T1930
use saturate_t1930, only: CalcQVapSat, CalcDQVapSatDTemp
#else
use saturate_t1930, only: CalcQVapSat, CalcDQVapSatDTemp
#endif
! 時刻管理
! Time control
!
use timeset, only: TimeN, TimesetClockStart, TimesetClockStop
! ヒストリデータ出力
! History data output
!
use gtool_historyauto, only: HistoryAutoPut
! デバッグ用ユーティリティ
! Utilities for debug
!
use dc_trace, only: DbgMessage, BeginSub, EndSub
! 宣言文 ; Declaration statements
!
implicit none
real(DP), intent(in):: xyz_U (0:imax-1, 1:jmax, 1:kmax)
! $ u $ . 東西風速. Eastward wind
real(DP), intent(in):: xyz_V (0:imax-1, 1:jmax, 1:kmax)
! $ v $ . 南北風速. Northward wind
real(DP), intent(in):: xyz_Temp (0:imax-1, 1:jmax, 1:kmax)
! $ T $ . 温度 (整数レベル).
! Temperature (full level)
real(DP), intent(in):: xyr_Temp (0:imax-1, 1:jmax, 0:kmax)
! $ T $ . 温度 (半整数レベル).
! Temperature (half level)
real(DP), intent(in):: xyz_QVap (0:imax-1, 1:jmax, 1:kmax)
! $ q $ . 比湿. Specific humidity
real(DP), intent(in):: xyz_Press (0:imax-1, 1:jmax, 1:kmax)
! $ p_s $ . 地表面気圧 (整数レベル).
! Surface pressure (full level)
real(DP), intent(in):: xyr_Press (0:imax-1, 1:jmax, 0:kmax)
! $ p_s $ . 地表面気圧 (半整数レベル).
! Surface pressure (half level)
real(DP), intent(in):: xyz_Height (0:imax-1, 1:jmax, 1:kmax)
! 高度 (整数レベル).
! Height (full level)
real(DP), intent(in):: xy_SurfTemp (0:imax-1, 1:jmax)
! 地表面温度.
! Surface temperature
real(DP), intent(in):: xy_SurfHumidCoeff (0:imax-1, 1:jmax)
! 地表湿潤度.
! Surface humidity coefficient
real(DP), intent(in):: xy_SurfRoughLength (0:imax-1, 1:jmax)
! 地表粗度長.
! Surface rough length
integer, intent(in):: xy_SurfCond (0:imax-1, 1:jmax)
! 地表状態.
! Surface condition
real(DP), intent(inout):: xyr_UFlux (0:imax-1, 1:jmax, 0:kmax)
! 東西風速フラックス.
! Eastward wind flux
real(DP), intent(inout):: xyr_VFlux (0:imax-1, 1:jmax, 0:kmax)
! 南北風速フラックス.
! Northward wind flux
real(DP), intent(inout):: xyr_TempFlux (0:imax-1, 1:jmax, 0:kmax)
! 温度フラックス.
! Temperature flux
real(DP), intent(inout):: xyr_QVapFlux (0:imax-1, 1:jmax, 0:kmax)
! 比湿フラックス.
! Specific humidity flux
real(DP), intent(out):: xy_SurfUVMtx (0:imax-1, 1:jmax)
! 速度陰解行列: 地表.
! Implicit matrix about velocity: surface
real(DP), intent(out):: xyaa_SurfTempMtx (0:imax-1, 1:jmax, 0:1, -1:1)
! 温度陰解行列: 地表.
! Implicit matrix about temperature: surface
real(DP), intent(out):: xyaa_SurfQVapMtx (0:imax-1, 1:jmax, 0:1, -1:1)
! 比湿陰解行列: 地表.
! Implicit matrix about specific humidity: surface
! 作業変数
! Work variables
!
real(DP):: xy_SurfBulkRiNum (0:imax-1, 1:jmax)
! バルク $ R_i $ 数.
! Bulk $ R_i $ number
real(DP):: xy_SurfTempTransCoeff (0:imax-1, 1:jmax)
! 輸送係数:温度.
! Transfer coefficient: temperature
real(DP):: xy_SurfQVapTransCoeff (0:imax-1, 1:jmax)
! 輸送係数:比湿.
! Transfer coefficient: specific humidity
real(DP):: xy_SurfVelTransCoeff (0:imax-1, 1:jmax)
! 輸送係数:運動量.
! Diffusion coefficient: velocity
real(DP):: xy_SurfTempBulkCoeff (0:imax-1, 1:jmax)
! バルク係数:温度.
! Bulk coefficient: temperature
real(DP):: xy_SurfQVapBulkCoeff (0:imax-1, 1:jmax)
! バルク係数:比湿.
! Bulk coefficient: specific humidity
real(DP):: xy_SurfVelBulkCoeff (0:imax-1, 1:jmax)
! バルク係数:運動量.
! Bulk coefficient: temperature
real(DP):: xy_SurfExner (0:imax-1, 1:jmax)
! Exner 関数.
! Exner function
real(DP):: xy_SurfVelAbs (0:imax-1, 1:jmax)
! 風速絶対値.
! Absolute velocity
real(DP):: xy_SurfQVapSat (0:imax-1, 1:jmax)
! 地表飽和比湿.
! Saturated specific humidity on surface
real(DP):: xy_SurfDQVapSatDTemp (0:imax-1, 1:jmax)
! 地表飽和比湿変化.
! Saturated specific humidity tendency on surface
real(DP):: xy_UFluxSurf (0:imax-1, 1:jmax)
! 地表面の東西風速フラックス.
! Eastward wind flux on surface
real(DP):: xy_VFluxSurf (0:imax-1, 1:jmax)
! 地表面の南北風速フラックス.
! Northward wind flux on surface
real(DP):: xy_TempFluxSurf (0:imax-1, 1:jmax)
! 地表面の温度フラックス.
! Temperature flux on surface
real(DP):: xy_QVapFluxSurf (0:imax-1, 1:jmax)
! 地表面の比湿フラックス.
! Specific humidity flux on surface
integer:: i ! 経度方向に回る DO ループ用作業変数
! Work variables for DO loop in longitude
integer:: j ! 緯度方向に回る DO ループ用作業変数
! Work variables for DO loop in latitude
! 実行文 ; Executable statement
!
! 計算時間計測開始
! Start measurement of computation time
!
call TimesetClockStart( module_name )
! 初期化
! Initialization
!
if ( .not. surface_flux_bulk_inited ) call SurfFluxInit
! Exner 関数算出
! Calculate Exner functions
!
xy_SurfExner = ( xyz_Press(:,:,1) / xyr_Press(:,:,0) )**( GasRDry / CpDry )
! バルク $ R_i $ 数算出
! Calculate bulk $ R_i $
!
do i = 0, imax-1
do j = 1, jmax
xy_SurfVelAbs(i,j) = sqrt ( xyz_U(i,j,1)**2 + xyz_V(i,j,1)**2 )
xy_SurfBulkRiNum(i,j) = Grav / BasePotTemp * ( xyz_Temp(i,j,1) / xy_SurfExner(i,j) - xy_SurfTemp(i,j) ) / max( xy_SurfVelAbs(i,j), VelMinForRi )**2 * xyz_Height(i,j,1)
end do
end do
! バルク係数算出
! Calculate bulk coefficients
!
call BulkCoeff( xy_SurfBulkRiNum, xy_SurfRoughLength, xy_SurfRoughLength, xyz_Height(:,:,1), xy_SurfVelBulkCoeff, xy_SurfTempBulkCoeff, xy_SurfQVapBulkCoeff ) ! (out)
! 輸送係数の計算
! Calculate transfer coefficient
!
do i = 0, imax-1
do j = 1, jmax
xy_SurfVelTransCoeff(i,j) = xy_SurfVelBulkCoeff(i,j) * xyr_Press(i,j,0) / ( GasRDry * xyr_Temp(i,j,0) ) * min( max( xy_SurfVelAbs(i,j), VelMinForVel ), VelMaxForVel )
xy_SurfTempTransCoeff(i,j) = xy_SurfTempBulkCoeff(i,j) * xyr_Press(i,j,0) / ( GasRDry * xyr_Temp(i,j,0) ) * min( max( xy_SurfVelAbs(i,j), VelMinForTemp ), VelMaxForTemp )
xy_SurfQVapTransCoeff(i,j) = xy_SurfQVapBulkCoeff(i,j) * xyr_Press(i,j,0) / ( GasRDry * xyr_Temp(i,j,0) ) * min( max( xy_SurfVelAbs(i,j), VelMinForQVap ), VelMaxForQVap )
end do
end do
! 飽和比湿の計算
! Calculate saturated specific humidity
!
do i = 0, imax-1
do j = 1, jmax
xy_SurfQVapSat(i,j) = CalcQVapSat( xy_SurfTemp(i,j), xyr_Press(i,j,0) )
end do
end do
do i = 0, imax-1
do j = 1, jmax
xy_SurfDQVapSatDTemp(i,j) = CalcDQVapSatDTemp( xy_SurfTemp(i,j), xy_SurfQVapSat(i,j) )
end do
end do
! 地表面フラックスの計算
! Calculate fluxes on flux
!
xy_UFluxSurf = - xy_SurfVelTransCoeff * xyz_U(:,:,1)
xy_VFluxSurf = - xy_SurfVelTransCoeff * xyz_V(:,:,1)
xy_TempFluxSurf = CpDry * xy_SurfTempTransCoeff * ( xy_SurfTemp - xyz_Temp(:,:,1) / xy_SurfExner )
xy_QVapFluxSurf = LatentHeat * xy_SurfQVapTransCoeff * xy_SurfHumidCoeff * ( xy_SurfQVapSat - xyz_QVap(:,:,1) )
! フラックスの計算
! Calculate fluxes
!
xyr_UFlux(:,:,0) = xyr_UFlux(:,:,0) + xy_UFluxSurf
xyr_VFlux(:,:,0) = xyr_VFlux(:,:,0) + xy_VFluxSurf
xyr_TempFlux(:,:,0) = xyr_TempFlux(:,:,0) + xy_TempFluxSurf
xyr_QVapFlux(:,:,0) = xyr_QVapFlux(:,:,0) + xy_QVapFluxSurf
!!$ xyr_UFlux(:,:,0) = xyr_UFlux(:,:,0) &
!!$ & - xy_SurfVelTransCoeff * xyz_U(:,:,1)
!!$
!!$ xyr_VFlux(:,:,0) = xyr_VFlux(:,:,0) &
!!$ & - xy_SurfVelTransCoeff * xyz_V(:,:,1)
!!$
!!$ xyr_TempFlux(:,:,0) = xyr_TempFlux(:,:,0) &
!!$ & + CpDry * xy_SurfTempTransCoeff &
!!$ & * ( xy_SurfTemp &
!!$ & - xyz_Temp(:,:,1) / xy_SurfExner )
!!$
!!$ xyr_QVapFlux(:,:,0) = xyr_QVapFlux(:,:,0) &
!!$ & + LatentHeat * xy_SurfQVapTransCoeff * xy_SurfHumidCoeff &
!!$ & * ( xy_SurfQVapSat - xyz_QVap(:,:,1) )
! 陰解行列の計算
! Calculate implicit matrices
!
xyaa_SurfTempMtx = 0.0_DP
xyaa_SurfQVapMtx = 0.0_DP
xy_SurfUVMtx = xy_SurfVelTransCoeff
xyaa_SurfTempMtx(:,:,1,0) = CpDry * xy_SurfTempTransCoeff / xy_SurfExner
xyaa_SurfTempMtx(:,:,0,1) = - CpDry * xy_SurfTempTransCoeff / xy_SurfExner
xyaa_SurfQVapMtx(:,:,1,0) = CpDry * xy_SurfQVapTransCoeff * xy_SurfHumidCoeff
xyaa_SurfQVapMtx(:,:,0,1) = - CpDry * xy_SurfQVapTransCoeff * xy_SurfHumidCoeff
do i = 0, imax-1
do j = 1, jmax
if ( xy_SurfCond(i,j) >= 1 ) then
xyaa_SurfTempMtx(i,j,1,-1) = - CpDry * xy_SurfTempTransCoeff(i,j)
xyaa_SurfTempMtx(i,j,0,0) = CpDry * xy_SurfTempTransCoeff(i,j)
xyaa_SurfQVapMtx(i,j,1,-1) = - LatentHeat * xy_SurfQVapTransCoeff(i,j) * xy_SurfHumidCoeff(i,j) * xy_SurfDQVapSatDTemp(i,j)
xyaa_SurfQVapMtx(i,j,0,0) = LatentHeat * xy_SurfQVapTransCoeff(i,j) * xy_SurfHumidCoeff(i,j) * xy_SurfDQVapSatDTemp(i,j)
end if
end do
end do
! ヒストリデータ出力
! History data output
!
call HistoryAutoPut( TimeN, 'UFluxSurf', xy_UFluxSurf )
call HistoryAutoPut( TimeN, 'VFluxSurf', xy_VFluxSurf )
call HistoryAutoPut( TimeN, 'TempFluxSurf', xy_TempFluxSurf )
call HistoryAutoPut( TimeN, 'QVapFluxSurf', xy_QVapFluxSurf )
! 計算時間計測一時停止
! Pause measurement of computation time
!
call TimesetClockStop( module_name )
end subroutine SurfaceFlux