|  Subroutine  : | 
 | 
| Time      : | real(DP), intent(in)
 | 
| pyz_VelX(imin:imax,jmin:jmax,kmin:kmax)      : | real(DP), intent(in)
 | 
| xqz_VelY(imin:imax,jmin:jmax,kmin:kmax)      : | real(DP), intent(in)
 | 
| xyz_PTemp(imin:imax,jmin:jmax,kmin:kmax)      : | real(DP), intent(in)
 | 
| xyz_Exner(imin:imax,jmin:jmax,kmin:kmax)      : | real(DP), intent(in)
 | 
| xyzf_QMix(imin:imax,jmin:jmax,kmin:kmax, ncmax)      : | real(DP), intent(in)
 | 
| pyz_DVelXDt(imin:imax,jmin:jmax,kmin:kmax)      : | real(DP), intent(inout)
 | 
| xqz_DVelYDt(imin:imax,jmin:jmax,kmin:kmax)      : | real(DP), intent(inout)
 | 
| xyz_DPTempDt(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_Bulk_forcing( Time, pyz_VelX, xqz_VelY, xyz_PTemp, xyz_Exner, xyzf_QMix, pyz_DVelXDt, xqz_DVelYDt, xyz_DPTempDt, xyzf_DQMixDt )
    ! 
    ! 下部境界からのフラックスによる温度の変化率を,
    ! バルク方法に基づいて計算する.
    !
    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(DP), intent(in)   :: Time         !時刻
    real(DP), intent(in)   :: pyz_VelX(imin:imax,jmin:jmax,kmin:kmax)
                                           !水平風速
    real(DP), intent(in)   :: xqz_VelY(imin:imax,jmin:jmax,kmin:kmax)
                                           !水平風速
    real(DP), intent(in)   :: xyz_PTemp(imin:imax,jmin:jmax,kmin:kmax)
                                           !温位の擾乱成分    
    real(DP), intent(in)   :: xyz_Exner(imin:imax,jmin:jmax,kmin:kmax)
                                           !温位の擾乱成分    
    real(DP), intent(in)   :: xyzf_QMix(imin:imax,jmin:jmax,kmin:kmax, ncmax)
                                           !温位の擾乱成分    
    real(DP), intent(inout):: pyz_DVelXDt(imin:imax,jmin:jmax,kmin:kmax)
    real(DP), intent(inout):: xqz_DVelYDt(imin:imax,jmin:jmax,kmin:kmax)
    real(DP), intent(inout):: xyz_DPTempDt(imin:imax,jmin:jmax,kmin:kmax)
    real(DP), intent(inout):: xyzf_DQMixDt(imin:imax,jmin:jmax,kmin:kmax, ncmax)
    real(DP)               :: pyz_DVelXDt0(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)               :: xqz_DVelYDt0(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)               :: xyz_DPTempDt0(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)               :: xyzf_DQMixDt0(imin:imax,jmin:jmax,kmin:kmax, ncmax)
    real(DP)               :: pyz_Momflux(imin:imax,jmin:jmax,kmin:kmax)
                                           !運動量フラックス
    real(DP)               :: xqz_Momflux(imin:imax,jmin:jmax,kmin:kmax)
                                           !運動量フラックス
    real(DP)               :: xyz_Heatflux(imin:imax,jmin:jmax,kmin:kmax)
                                           !地表面熱フラックス
    real(DP)               :: xyzf_QMixflux(imin:imax,jmin:jmax,kmin:kmax, ncmax)
                                           !物質的フラックス
    real(DP)               :: pyz_VelXSfc(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)               :: xqz_VelYSfc(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)               :: xyz_VelXSfc(imin:imax,jmin:jmax,kmin:kmax)
                                           !水平風速 (xyz 格子)
    real(DP)               :: xyz_VelYSfc(imin:imax,jmin:jmax,kmin:kmax)
                                           !水平風速 (xyz 格子)
    real(DP)               :: TempSfc 
    real(DP)               :: PressSfc 
    real(DP)               :: xyz_VelSfc(imin:imax,jmin:jmax,kmin:kmax)
                                           !水平風速 (xyz 格子)
    real(DP)               :: xyz_TempAll(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)               :: xyzf_QMixAll(imin:imax,jmin:jmax,kmin:kmax, ncmax)
    integer                :: kz            !配列添字
    integer                :: s             !ループ変数
    ! 初期化
    !
    kz = 1
    xyz_Heatflux = 0.0d0
    xyzf_QMixflux = 0.0d0
    pyz_Momflux = 0.0d0
    xqz_Momflux = 0.0d0
    pyz_DVelXDt0  = pyz_DVelXDt
    xqz_DVelYDt0  = xqz_DVelYDt
    xyz_DPTempDt0 = xyz_DPTempDt
    xyzf_DQMixDt0 = xyzf_DQMixDt
    xyz_TempAll  = (xyz_Exner + xyz_ExnerBZ) * (xyz_PTemp + xyz_PTempBZ)
    xyzf_QMixAll = xyzf_QMix + xyzf_QMixBZ
    
    pyz_VelXSfc = pyz_VelX + VelX0
    xqz_VelYSfc = xqz_VelY + VelY0    
    ! 地表面での値
    ! 
    TempSfc = xyz_TempBZ(1,1,kz)  !水平一様なので, i=j=1 で代表させる
    PressSfc= xyz_PressBZ(1,1,kz) !水平一様なので, i=j=1 で代表させる
    
    !地表面熱フラックスによる加熱率を計算
    !  * 単位は K/s
    !  * エクスナー関数は基本場の値で代表させる.     
    !  * 格子点 xz では, 物理領域の最下端の添え字は kz = 1
    xyz_VelXSfc = xyz_avr_pyz(pyz_VelXSfc)
    xyz_VelYSfc = xyz_avr_xqz(xqz_VelYSfc)    
    
    xyz_VelSfc = SQRT(  xyz_VelXSfc ** 2.0 + xyz_VelYSfc ** 2.0 )
    xyz_Heatflux(:,:,kz) = MAX( 0.0d0, - Bulk * xyz_VelSfc(:,:,kz) * ( xyz_TempAll(:,:,kz) - TempSfc ) / ( z_dz(kz) * 5.0d-1 ) )
    do s = 1, CondNum
      xyzf_QMixflux(:,:,kz,IdxCG(s)) = MAX( 0.0d0, - Bulk * xyz_VelSfc(:,:,kz) * (  xyzf_QMixAll(:,:,kz,s) - SvapPress( SpcWetID(IdxCC(s)), TempSfc ) / PressSfc * (MolWtWet(IdxCG(s)) / MolWtDry) ) / ( z_dz(kz) * 5.0d-1 ) )
    end do
    !地表面運動量フラックスによる変化率を計算
    !  * 単位は m/s^2
    !  * 格子点 xz では, 物理領域の最下端の添え字は kz = 1
    pyz_MomFlux(:,:,kz) = MAX( 0.0d0, - Bulk * abs(pyz_VelXSfc(:,:,kz)) * pyz_VelX(:,:,kz) / ( z_dz(kz) * 5.0d-1 ) )
    xqz_MomFlux(:,:,kz) = MAX( 0.0d0, - Bulk * abs(xyz_VelYSfc(:,:,kz)) * xqz_VelY(:,:,kz) / ( z_dz(kz) * 5.0d-1 ) )
    xyz_DPTempDt = xyz_DPTempDt0 + xyz_Heatflux
    xyzf_DQMixDt = xyzf_DQMixDt0 + xyzf_Qmixflux
    pyz_DVelXDt  = pyz_DVelXDt0  + pyz_MomFlux
    xqz_DVelYDt  = xqz_DVelYDt0  + xqz_MomFlux
    call HistoryAutoPut(Time, 'PTempSfc', xyz_HeatFlux(1:nx,1:ny,1:nz))
    call HistoryAutoPut(Time, 'VelXSfc',  pyz_MomFlux(1:nx,1:ny,1:nz))
    call HistoryAutoPut(Time, 'VelYSfc',  xqz_MomFlux(1:nx,1:ny,1:nz))
    do s = 1, ncmax
      call HistoryAutoPut(Time, trim(SpcWetSymbol(s))//'_Sfc', xyzf_Qmixflux(1:nx,1:ny,1:nz,s))
    end do
  end subroutine Surfaceflux_Bulk_forcing