| Class | Surfaceflux_bulk | 
| In: | ../src/physics/surfaceflux_bulk.f90 ../src/surface_flux/surfaceflux_bulk.f90 | 
Note that Japanese and English are described in parallel.
Louis et al. (1982) の方法に基づいて地表面フラックスを計算.
Surface fluxes are calculated by using the scheme by Louis et al. (1982).
Louis, J-F., M. Tiedtke, and J-F. Geleyn, A short history of the PBL parameterization at ECMWF, Workshop on Planetary Boundary Layer Parameterization, 59-80, ECMWF, Reading, U.K., 1982.
| Subroutine : | |||
| 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) 
 | ||
| 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_Bulk_forcing( pyz_VelX, xqz_VelY, xyz_PTemp, xyz_Exner, xyzf_QMix, pyz_DVelXDt, xqz_DVelYDt, xyz_DPTempDt, xyz_DExnerDt, xyzf_DQMixDt )
    ! 
    ! 下部境界からのフラックスによる温度の変化率を,
    ! バルク方法に基づいて計算する.
    !
    ! 暗黙の型宣言禁止
    ! Implicit none
    !
    implicit none
    ! 変数
    ! variables
    !
    real(DP), intent(in)   :: pyz_VelX(imin:imax,jmin:jmax,kmin:kmax)
                              ! 水平風速
                              ! X-component velocity
    real(DP), intent(in)   :: xqz_VelY(imin:imax,jmin:jmax,kmin:kmax)
                              ! 水平風速
                              ! Y-component velocity
    real(DP), intent(in)   :: xyz_PTemp(imin:imax,jmin:jmax,kmin:kmax)
                              ! 温位
                              ! Potential temperature
    real(DP), intent(in)   :: xyz_Exner(imin:imax,jmin:jmax,kmin:kmax)
                              ! 圧力関数
                              ! Exner function
    real(DP), intent(in)   :: xyzf_QMix(imin:imax,jmin:jmax,kmin:kmax, ncmax)
                              ! 混合比
                              ! Mixing ration
    real(DP), intent(inout):: pyz_DVelXDt(imin:imax,jmin:jmax,kmin:kmax)
                              ! 風速時間変化率
                              ! X-component velocity tendency
    real(DP), intent(inout):: xqz_DVelYDt(imin:imax,jmin:jmax,kmin:kmax)
                              ! 風速時間変化率
                              ! Y-component velocity tendency
    real(DP), intent(inout):: xyz_DPTempDt(imin:imax,jmin:jmax,kmin:kmax)
                              ! 温位時間変化率
                              ! Potential tempreture tendency
    real(DP), intent(inout):: xyz_DExnerDt(imin:imax,jmin:jmax,kmin:kmax)
                              ! 圧力関数時間変化率
                              ! Exner function tendency
    real(DP), intent(inout):: xyzf_DQMixDt(imin:imax,jmin:jmax,kmin:kmax, ncmax)
                              ! 混合比時間変化率
                              ! Mixing ratio tendency
    ! 作業変数
    ! Work variables
    real(DP) :: xy_SurfRoughLength(imin:imax,jmin:jmax)
                              ! 祖度長さ
                              ! Roughness length
    real(DP) :: xy_SurfTemp(imin:imax,jmin:jmax)
                              ! 地表面温度
                              ! surface temperature
    real(DP) :: xy_SurfHumidCoef(imin:imax,jmin:jmax)
                              ! 
                              ! 
    real(DP) :: xy_SurfHeight(imin:imax,jmin:jmax)
                              ! 
                              ! 
    real(DP) :: xy_SurfVelTransCoef(imin:imax,jmin:jmax)
                              ! バルク係数(運動量)
                              ! Bulk coefficient for momentum
    real(DP) :: xy_SurfTempTransCoef(imin:imax,jmin:jmax)
                              ! バルク係数(熱)
                              ! Bulk coefficient for heat
    real(DP) :: xy_SurfQMixTransCoef(imin:imax,jmin:jmax)
                              ! バルク係数(混合比)
                              ! Bulk coefficient for mixing ratio
    real(DP) :: xyr_MomFluxX(imin:imax,jmin:jmax,kmin:kmax)
                              ! x 方向運動量フラックス
                              ! momentum flux in x
    real(DP) :: pyr_MomFluxX(imin:imax,jmin:jmax,kmin:kmax)
                              ! x 方向運動量フラックス
                              ! momentum flux in x
    real(DP) :: xyr_MomFluxY(imin:imax,jmin:jmax,kmin:kmax)
                              ! y 方向運動量フラックス
                              ! momentum flux in y
    real(DP) :: xqr_MomFluxY(imin:imax,jmin:jmax,kmin:kmax)
                              ! y 方向運動量フラックス
                              ! momentum flux in y
    real(DP) :: xyr_HeatFlux(imin:imax,jmin:jmax,kmin:kmax)
                              ! 熱フラックス
                              ! heat flux
    real(DP) :: xyrf_QMixFlux(imin:imax,jmin:jmax,kmin:kmax,ncmax)
                              ! 凝結成分混合比フラックス
                              ! Mixing ratio flux
    real(DP) :: xy_PTempFlux(imin:imax,jmin:jmax)
                              ! 温位フラックス
                              ! Potential temperature flux
    real(DP) :: py_VelXFlux(imin:imax,jmin:jmax)
                              ! 速度フラックス
                              ! velocity flux
    real(DP) :: xq_VelYFlux(imin:imax,jmin:jmax)
                              ! 速度フラックス
                              ! velocity flux
    real(DP) :: xyf_QMixFlux(imin:imax,jmin:jmax,ncmax)
                              ! 凝結成分混合比フラックス
                              ! Mixing ratio flux
    real(DP) :: xy_ExnerFlux(imin:imax,jmin:jmax)
                              !
                              !
    real(DP) :: xyz_VelX(imin:imax,jmin:jmax,kmin:kmax)
                              ! 水平風速 (xyz 格子)
                              ! X-component velocity (xyz grid)
    real(DP) :: xyz_VelY(imin:imax,jmin:jmax,kmin:kmax)
                              ! 水平風速 (xyz 格子)
                              ! Y-component velocity (xyz grid)
    real(DP) :: xyz_PTempAll(imin:imax,jmin:jmax,kmin:kmax)
                              ! 温位(基本場 + 擾乱)
                              ! Total value of potential temperature
    real(DP) :: xyz_TempAll(imin:imax,jmin:jmax,kmin:kmax)
                              ! 温度(基本場 + 擾乱)
                              ! Total value of potential temperature
    real(DP) :: xyr_TempAll(imin:imax,jmin:jmax,kmin:kmax)
                              ! 温度(基本場 + 擾乱)
                              ! Total value of potential temperature
    real(DP) :: xyz_VirTempAll(imin:imax,jmin:jmax,kmin:kmax)
                              ! 仮温度(基本場 + 擾乱)
                              ! Total value of virtual temperature
    real(DP) :: xyr_VirTempAll(imin:imax,jmin:jmax,kmin:kmax)
                              ! 仮温度(基本場 + 擾乱)
                              ! Total value of virtual temperature
    real(DP) :: xyz_ExnerAll (imin:imax,jmin:jmax,kmin:kmax)
                              ! 圧力関数(基本場 + 擾乱)
                              ! Total value of exner function
    real(DP) :: xyr_ExnerAll (imin:imax,jmin:jmax,kmin:kmax)
                              ! 圧力関数(基本場 + 擾乱)
                              ! Total value of exner function
    real(DP) :: xyz_PressAll (imin:imax,jmin:jmax,kmin:kmax)
                              ! 圧力(基本場 + 擾乱)
                              ! Total value of pressure
    real(DP) :: xyr_PressAll (imin:imax,jmin:jmax,kmin:kmax)
                              ! 圧力(基本場 + 擾乱)
                              ! Total value of pressure
    real(DP) :: xyz_DensAll (imin:imax,jmin:jmax,kmin:kmax)
                              ! 圧力(基本場 + 擾乱)
                              ! Total value of pressure
    real(DP) :: xyzf_QMixAll(imin:imax,jmin:jmax,kmin:kmax, ncmax)
                              ! 混合比(基本場 + 擾乱)
                              ! Total value of mixing ratios
    real(DP) :: xyzf_QMixPerMolWt(imin:imax,jmin:jmax,kmin:kmax, ncmax)
                              ! 混合比(基本場 + 擾乱)/分子量
                              ! mixing ratios per molecular weight
    real(DP) :: xy_DPTempDtBulk(imin:imax,jmin:jmax)
                              ! 時間変化(温位)
                              ! potential temperature tendency by surface flux
    real(DP) :: xy_DExnerDtBulk(imin:imax,jmin:jmax)
                              ! 時間変化(圧力関数)
                              ! Exner function tendency by surface flux
    real(DP) :: xyf_DQMixDtBulk(imin:imax,jmin:jmax, ncmax)
                              ! 時間変化(混合比)
                              ! Mixing ratio tendency by surface flux
    real(DP) :: py_DVelXDtBulk (imin:imax,jmin:jmax)
                              ! 時間変化(U)
                              ! x-component velocity tendency by surface flux
    real(DP) :: xq_DVelYDtBulk (imin:imax,jmin:jmax)
                              ! 時間変化(V)
                              ! y-component velocity tendency by surface flux
    real(DP) :: xyz_DPTempDtBulk(imin:imax,jmin:jmax,kmin:kmax)
                              ! 時間変化(温位)
                              ! potential temperature tendency by surface flux
    real(DP) :: xyz_DExnerDtBulk(imin:imax,jmin:jmax,kmin:kmax)
                              ! 時間変化(圧力関数)
                              ! Exner function tendency by surface flux
    real(DP) :: xyzf_DQMixDtBulk(imin:imax,jmin:jmax,kmin:kmax, ncmax)
                              ! 時間変化(混合比)
                              ! Mixing ratio tendency by surface flux
    real(DP) :: pyz_DVelXDtBulk (imin:imax,jmin:jmax,kmin:kmax)
                              ! 時間変化(U)
                              ! x-component velocity tendency by surface flux
    real(DP) :: xqz_DVelYDtBulk (imin:imax,jmin:jmax,kmin:kmax)
                              ! 時間変化(V)
                              ! y-component velocity tendency by surface flux
    integer  :: kz            ! 配列添字
                              ! Arrzy index
    integer  :: s             ! 組成方向に回る DO ループ用作業変数
                              ! Work variables for DO loop in dimension of constituen                         
    ! 初期化
    ! Initialization
    ! 
    kz = 1
!    xyr_MomFluxX = 0.0d0
!    xyr_MomFluxY = 0.0d0
!    xyr_HeatFlux = 0.0d0
!    xyrf_QMixFlux = 0.0d0
!    xy_SurfVelTransCoef = 0.0d0
!    xy_SurfTempTransCoef = 0.0d0
!    xy_SurfQMixTransCoef = 0.0d0
    ! 祖度長さの指定
    ! Specify surface length
    ! 表面値の指定
    ! Specify surface values
    xy_SurfHeight = 0.0d0
    xy_SurfTemp = TempSfc
    xy_SurfHumidCoef = 1.0d0
    xy_SurfRoughLength = SfcRoughLength
    ! 全量の計算
    ! Calculate total value of thermodynamic variables
    ! 
!    xyz_PTempAll  = xyz_PTemp + xyz_PTempBZ
!    xyz_ExnerAll  = xyz_Exner + xyz_ExnerBZ
!    xyzf_QMixAll  = xyzf_QMix + xyzf_QMixBZ
    xyz_PTempAll  = xyz_PTempBZ
    xyz_ExnerAll  = xyz_ExnerBZ
    xyzf_QMixAll  = xyzf_QMixBZ
    xyz_TempAll   = xyz_PTempAll * xyz_ExnerAll
    xyr_TempAll   = xyr_avr_xyz(xyz_TempAll)
    do s = 1, ncmax
      xyzf_QMixPerMolWt(:,:,:,s) = xyzf_QMixAll(:,:,:,IdxG(s)) / MolWtWet(IdxG(s))
    end do
!    xyz_VirTempAll = xyz_TempAll / &
!      & (                          &
!      &   (1.0d0 / ( 1.0d0 + MolWtDry * sum(xyzf_QMixPerMolWt, 4) ) ) /  & 
!      &   (1.0d0 + sum(xyzf_QMixAll, 4))     &
!      & )
!    xyr_VirTempAll = xyr_avr_xyz(xyz_VirTempAll)
    xyz_VirTempAll = xyz_TempAll
    xyr_VirTempAll = xyr_avr_xyz(xyz_TempAll)
    xyz_PressAll  = PressBasis * xyz_ExnerAll**(CpDry / GasRDry)
    xyr_PressAll  = xyr_avr_xyz(xyz_PressAll)
    xyr_ExnerAll  = xyr_avr_xyz(xyz_ExnerAll)
    xyz_DensAll   = xyz_PressAll / (GasRDry * xyz_VirTempAll)
    write(*,*) 'ExnerAll(0,0,0)=', xyr_ExnerAll(1,1,0) 
    write(*,*) 'ExnerAll(0,0,1)=', xyz_ExnerAll(1,1,1)
    write(*,*) 'TempAll(0,0,1)=', xyz_TempAll(1,1,1)
!    write(*,*) 'PTempAll(0,0,1)=', xyz_PTempAll(0,0,1)
    write(*,*) 'DensAll(0,0,1)=', xyz_DensAll(1,1,1)
    write(*,*) 'SurfTemp(0,0)=', xy_SurfTemp(1,1)
    
    ! Perturbation component of Exner function at the surface is assumed 
    ! to be same as that at the lowest layer. (YOT, 2011/09/03)
    ! 
    !ExnerBZSfc    = (PressSfc / PressBasis) ** (GasRDry / CpDry)
    !xy_PressSfc   = (PressBasis * xyz_ExnerAll(:,:,kz))**(CpDry / GasRDry)
    ! xyz 格子点の速度の計算
    ! Calculate velocities at xyz grid points
    !
    xyz_VelX = xyz_avr_pyz(pyz_VelX)
    xyz_VelY = xyz_avr_xqz(xqz_VelY)
    ! フラックスの計算
    ! Surface fluxes are calculated. 
    !
    ! dcpam ソースを call
    ! 
    xyrf_QMixFlux = 0.0_DP
    xyf_QMixFlux  = 0.0_DP
    call SurfaceFlux_Core( xyz_VelX   (1:nx,1:ny,1:nz), xyz_VelY   (1:nx,1:ny,1:nz), xyz_TempAll(1:nx,1:ny,1:nz), xyr_TempAll(1:nx,1:ny,0:nz), xyr_VirTempAll(1:nx,1:ny,0:nz), xyzf_QMixAll(1:nx,1:ny,1:nz,1:ncmax), xyr_PressAll(1:nx,1:ny,0:nz), xy_SurfHeight(1:nx,1:ny), xyz_Z(1:nx,1:ny,1:nz), xyz_ExnerAll(1:nx,1:ny,1:nz), xyr_ExnerAll(1:nx,1:ny,0:nz), xy_SurfTemp(1:nx,1:ny), xy_SurfHumidCoef(1:nx,1:ny), xy_SurfRoughLength(1:nx,1:ny), xyr_MomFluxX(1:nx,1:ny,0:nz), xyr_MomFluxY(1:nx,1:ny,0:nz), xyr_HeatFlux(1:nx,1:ny,0:nz), xyrf_QMixFlux(1:nx,1:ny,0:nz,1:ncmax), xy_SurfVelTransCoef(1:nx,1:ny), xy_SurfTempTransCoef(1:nx,1:ny), xy_SurfQMixTransCoef(1:nx,1:ny) )
    ! フラックスの変換
    ! convert surface flux
    !
    pyr_MomFluxX = pyr_avr_xyr(xyr_MomFluxX)
    xqr_MomFluxY = xqr_avr_xyr(xyr_MomFluxY)
    xy_PTempFlux(1:nx,1:ny) = xyr_HeatFlux(1:nx,1:ny,0)/ xyz_DensAll(1:nx,1:ny,kz) / CpDry
    py_VelXFlux(1:nx,1:ny)  = pyr_MomFluxX(1:nx,1:ny,0)/ xyz_DensAll(1:nx,1:ny,kz)
    xq_VelYFlux(1:nx,1:ny)  = xqr_MomFluxY(1:nx,1:ny,0)/ xyz_DensAll(1:nx,1:ny,kz)
    xyf_QMixFlux(1:nx,1:ny,:) = xyrf_QmixFlux(1:nx,1:ny,0,:)
    ! 圧力方程式の強制項の計算
    ! 
    xy_ExnerFlux = xy_DExnerDt_xy_xyf(xy_PTempFlux, xyf_QMixFlux, kz)
    ! 地表フラックスによる時間変化を計算
    ! Tendencies by surface fluxes (convergences of fluxes) are calculated.
    !
    xy_DPTempDtBulk = - ( 0.0d0 - xy_PTempFlux ) / z_dz(kz)
    !
    xy_DExnerDtBulk = - ( 0.0d0 - xy_ExnerFlux ) / z_dz(kz)
    !
    xyf_DQMixDtBulk = - ( 0.0d0 - xyf_QMixFlux ) / z_dz(kz)
    !
    py_DVelXDtBulk = - ( 0.0d0 - py_VelXFlux ) / z_dz(kz)
    !
    xq_DVelYDtBulk = - ( 0.0d0 - xq_VelYFlux ) / z_dz(kz)
    
    ! 仮引数配列へ格納
    ! Add tendency by surface flux convergence
    !
    xyz_DPTempDt(:,:,kz) = xyz_DPTempDt(:,:,kz) + xy_DPTempDtBulk
    xyz_DExnerDt(:,:,kz) = xyz_DExnerDt(:,:,kz) + xy_DExnerDtBulk
    do s = 1, ncmax
      xyzf_DQMixDt(:,:,kz,s) = xyzf_DQMixDt(:,:,kz,s) + xyf_DQMixDtBulk(:,:,s)
    end do
    pyz_DVelXDt (:,:,kz) = pyz_DVelXDt (:,:,kz) + py_DVelXDtBulk
    xqz_DVelYDt (:,:,kz) = xqz_DVelYDt (:,:,kz) + xq_DVelYDtBulk
    ! 出力
    ! Output
    !
    xyz_DPTempDtBulk = 0.0d0
    xyz_DExnerDtBulk = 0.0d0
    xyzf_DQMixDtBulk = 0.0d0
    pyz_DVelXDtBulk  = 0.0d0
    xqz_DVelYDtBulk  = 0.0d0
    xyz_DPTempDtBulk(:,:,kz) = xy_DPTempDtBulk
    xyz_DExnerDtBulk(:,:,kz) = xy_DExnerDtBulk
    do s = 1, ncmax
      xyzf_DQMixDtBulk(:,:,kz,s) = xyf_DQMixDtBulk(:,:,s)
    end do
    pyz_DVelXDtBulk (:,:,kz) = py_DVelXDtBulk
    xqz_DVelYDtBulk (:,:,kz) = xq_DVelYDtBulk
    !
    call HistoryAutoPut(TimeN, 'PTempSfc', xyz_DPTempDtBulk(1:nx,1:ny,1:nz))
    call HistoryAutoPut(TimeN, 'ExnerSfc', xyz_DExnerDtBulk(1:nx,1:ny,1:nz))
    call HistoryAutoPut(TimeN, 'VelXSfc',  pyz_DVelXDtBulk (1:nx,1:ny,1:nz))
    call HistoryAutoPut(TimeN, 'VelYSfc',  xqz_DVelYDtBulk (1:nx,1:ny,1:nz))
    do s = 1, ncmax
      call HistoryAutoPut(TimeN, trim(SpcWetSymbol(s))//'_Sfc', xyzf_DQMixDtBulk(1:nx,1:ny,1:nz,s))
    end do
    call HistoryAutoPut(TimeN, 'PTempSfcFlux', xy_PTempFlux(1:nx,1:ny))
    call HistoryAutoPut(TimeN, 'ExnerSfcFlux', xy_ExnerFlux(1:nx,1:ny))
    call HistoryAutoPut(TimeN, 'VelXSfcFlux',  py_VelXFlux (1:nx,1:ny))
    call HistoryAutoPut(TimeN, 'VelYSfcFlux',  xq_VelYFlux (1:nx,1:ny))
    do s = 1, ncmax
      call HistoryAutoPut(TimeN, trim(SpcWetSymbol(s))//'_SfcFlux', xyf_QMixFlux(1:nx,1:ny,s))
    end do
    call HistoryAutoPut(TimeN, 'SfcHeatFlux', xyr_HeatFlux(1:nx,1:ny,0) )
    call HistoryAutoPut(TimeN, 'SfcXMomFlux', xyr_MomFluxX(1:nx,1:ny,0) )
    call HistoryAutoPut(TimeN, 'SfcYMomFlux', xyr_MomFluxY(1:nx,1:ny,0) )
    do s = 1, ncmax
      call HistoryAutoPut(TimeN, trim(SpcWetSymbol(s))//'_SfcMassFlux', xyz_DensAll(1:nx,1:ny,1) * xyf_QMixFlux(1:nx,1:ny,s))
    end do
  end subroutine Surfaceflux_Bulk_forcing
          | Subroutine : | |||
| 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) 
 | ||
| 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_Bulk_forcing( pyz_VelX, xqz_VelY, xyz_PTemp, xyz_Exner, xyzf_QMix, pyz_DVelXDt, xqz_DVelYDt, xyz_DPTempDt, xyz_DExnerDt, xyzf_DQMixDt )
    ! 
    ! 下部境界からのフラックスによる温度の変化率を,
    ! バルク方法に基づいて計算する.
    !
    ! 暗黙の型宣言禁止
    ! Implicit none
    !
    implicit none
    ! 変数
    ! variables
    !
    real(DP), intent(in)   :: pyz_VelX(imin:imax,jmin:jmax,kmin:kmax)
                              ! 水平風速
                              ! X-component velocity
    real(DP), intent(in)   :: xqz_VelY(imin:imax,jmin:jmax,kmin:kmax)
                              ! 水平風速
                              ! Y-component velocity
    real(DP), intent(in)   :: xyz_PTemp(imin:imax,jmin:jmax,kmin:kmax)
                              ! 温位
                              ! Potential temperature
    real(DP), intent(in)   :: xyz_Exner(imin:imax,jmin:jmax,kmin:kmax)
                              ! 圧力関数
                              ! Exner function
    real(DP), intent(in)   :: xyzf_QMix(imin:imax,jmin:jmax,kmin:kmax, ncmax)
                              ! 混合比
                              ! Mixing ration
    real(DP), intent(inout):: pyz_DVelXDt(imin:imax,jmin:jmax,kmin:kmax)
                              ! 風速時間変化率
                              ! X-component velocity tendency
    real(DP), intent(inout):: xqz_DVelYDt(imin:imax,jmin:jmax,kmin:kmax)
                              ! 風速時間変化率
                              ! Y-component velocity tendency
    real(DP), intent(inout):: xyz_DPTempDt(imin:imax,jmin:jmax,kmin:kmax)
                              ! 温位時間変化率
                              ! Potential tempreture tendency
    real(DP), intent(inout):: xyz_DExnerDt(imin:imax,jmin:jmax,kmin:kmax)
                              ! 圧力関数時間変化率
                              ! Exner function tendency
    real(DP), intent(inout):: xyzf_DQMixDt(imin:imax,jmin:jmax,kmin:kmax, ncmax)
                              ! 混合比時間変化率
                              ! Mixing ratio tendency
    ! 作業変数
    ! Work variables
    real(DP) :: xy_SurfBulkRiNum(imin:imax,jmin:jmax)
                              ! バルクリチャードソン数
                              ! Bulk Richardson number
    real(DP) :: xy_SurfRoughLength(imin:imax,jmin:jmax)
                              ! 祖度長さ
                              ! Roughness length
    real(DP) :: xy_SurfVelBulkCoef(imin:imax,jmin:jmax)
                              ! バルク係数(運動量)
                              ! Bulk coefficient for momentum
    real(DP) :: xy_SurfTempBulkCoef(imin:imax,jmin:jmax)
                              ! バルク係数(熱)
                              ! Bulk coefficient for heat
    real(DP) :: xy_SurfQmixBulkCoef(imin:imax,jmin:jmax)
                              ! バルク係数(混合比)
                              ! Bulk coefficient for mixing ratio
    real(DP) :: py_VelXflux (imin:imax,jmin:jmax)
                              ! x 方向速度フラックス
                              ! velocity flux in x
    real(DP) :: xq_VelYflux (imin:imax,jmin:jmax)
                              ! y 方向速度フラックス
                              ! celocity flux in y
    real(DP) :: xy_PTempFlux(imin:imax,jmin:jmax)
                              ! 温位フラックス
                              ! potential temperature flux
    real(DP) :: xy_ExnerFlux(imin:imax,jmin:jmax)
                              !
                              !
    real(DP) :: xyf_QMixFlux(imin:imax,jmin:jmax,ncmax)
                              ! 凝結成分混合比フラックス
                              ! Mixing ratio flux
    real(DP) :: xyz_VelX(imin:imax,jmin:jmax,kmin:kmax)
                              ! 水平風速 (xyz 格子)
                              ! X-component velocity (xyz grid)
    real(DP) :: xyz_VelY(imin:imax,jmin:jmax,kmin:kmax)
                              ! 水平風速 (xyz 格子)
                              ! Y-component velocity (xyz grid)
    real(DP) :: xyz_AbsVel(imin:imax,jmin:jmax,kmin:kmax)
                              ! 水平風速絶対値 (xyz 格子)
                              ! Absolute value of horizontal velocity (xyz grid)
    real(DP) :: pyz_AbsVel(imin:imax,jmin:jmax,kmin:kmax)
                              ! 水平風速絶対値 (pyz 格子)
                              ! Absolute value of horizontal velocity (pyz grid)
    real(DP) :: xqz_AbsVel(imin:imax,jmin:jmax,kmin:kmax)
                              ! 水平風速絶対値 (xqz 格子)
                              ! Absolute value of horizontal velocity (xqz grid)
    real(DP) :: xyz_PTempAll(imin:imax,jmin:jmax,kmin:kmax)
                              ! 温位(基本場 + 擾乱)
                              ! Total value of potential temperature
    real(DP) :: xyz_ExnerAll (imin:imax,jmin:jmax,kmin:kmax)
                              ! 圧力関数(基本場 + 擾乱)
                              ! Total value of exner function
    real(DP) :: xyzf_QMixAll(imin:imax,jmin:jmax,kmin:kmax, ncmax)
                              ! 混合比(基本場 + 擾乱)
                              ! Total value of mixing ratios
    real(DP) :: xy_DPTempDtBulk(imin:imax,jmin:jmax)
                              ! 時間変化(温位)
                              ! potential temperature tendency by surface flux
    real(DP) :: xy_DExnerDtBulk(imin:imax,jmin:jmax)
                              ! 時間変化(圧力関数)
                              ! Exner function tendency by surface flux
    real(DP) :: xyf_DQMixDtBulk(imin:imax,jmin:jmax, ncmax)
                              ! 時間変化(混合比)
                              ! Mixing ratio tendency by surface flux
    real(DP) :: py_DVelXDtBulk (imin:imax,jmin:jmax)
                              ! 時間変化(U)
                              ! x-component velocity tendency by surface flux
    real(DP) :: xq_DVelYDtBulk (imin:imax,jmin:jmax)
                              ! 時間変化(V)
                              ! y-component velocity tendency by surface flux
    real(DP) :: xyz_DPTempDtBulk(imin:imax,jmin:jmax,kmin:kmax)
                              ! 時間変化(温位)
                              ! potential temperature tendency by surface flux
    real(DP) :: xyz_DExnerDtBulk(imin:imax,jmin:jmax,kmin:kmax)
                              ! 時間変化(圧力関数)
                              ! Exner function tendency by surface flux
    real(DP) :: xyzf_DQMixDtBulk(imin:imax,jmin:jmax,kmin:kmax, ncmax)
                              ! 時間変化(混合比)
                              ! Mixing ratio tendency by surface flux
    real(DP) :: pyz_DVelXDtBulk (imin:imax,jmin:jmax,kmin:kmax)
                              ! 時間変化(U)
                              ! x-component velocity tendency by surface flux
    real(DP) :: xqz_DVelYDtBulk (imin:imax,jmin:jmax,kmin:kmax)
                              ! 時間変化(V)
                              ! y-component velocity tendency by surface flux
    real(DP) :: ExnerBZSfc    ! 地表面圧力関数 
                              ! Basic state Exner function at the surface
    real(DP) :: xy_PressSfc(imin:imax,jmin:jmax)
                              ! Total pressure at the surface
    integer  :: kz            ! 配列添字
                              ! Arrzy index
    integer  :: s             ! 組成方向に回る DO ループ用作業変数
                              ! Work variables for DO loop in dimension of constituen                         
    ! 初期化
    ! Initialization
    ! 
    kz = 1
    ! 祖度長さの指定
    ! Specify surface length
    xy_SurfRoughLength = SfcRoughLength
    ! 全量の計算
    ! Calculate total value of thermodynamic variables
    ! 
    xyz_PTempAll  = xyz_PTemp + xyz_PTempBZ
    xyz_ExnerAll  = xyz_Exner + xyz_ExnerBZ
    xyzf_QMixAll  = xyzf_QMix + xyzf_QMixBZ
    ! Perturbation component of Exner function at the surface is assumed 
    ! to be same as that at the lowest layer. (YOT, 2011/09/03)
    ! 
    ExnerBZSfc    = (PressSfc / PressBasis) ** (GasRDry / CpDry)
    xy_PressSfc   = (PressBasis * xyz_ExnerAll(:,:,kz))**(CpDry / GasRDry)
    ! xyz 格子点の速度の計算
    ! Calculate velocities at xyz grid points
    !
    xyz_VelX = xyz_avr_pyz(pyz_VelX)
    xyz_VelY = xyz_avr_xqz(xqz_VelY)
    ! 水平風速の絶対値の計算
    ! Calculate of absoluto horizontal velocities
    ! 
    xyz_AbsVel = SQRT( xyz_VelX**2 + xyz_VelY**2 + Vel0**2 )
    pyz_AbsVel = pyz_avr_xyz(xyz_AbsVel)
    xqz_AbsVel = xqz_avr_xyz(xyz_AbsVel)
    ! バルク $ R_i $ 数算出
    ! Calculate bulk $ R_i $
    !
    xy_SurfBulkRiNum = Grav / ( xyz_PTempAll(:,:,1) ) * ( xyz_PTempAll(:,:,1) -TempSfc / (ExnerBZSfc + xyz_Exner(:,:,1))) / max( xyz_AbsVel(:,:,1), VelMinForRi )**2 * z_dz(1) * 0.5d0
    ! バルク係数の計算
    ! Bulk coefficients are calculated.
    ! 
    call BulkCoef( xy_SurfBulkRiNum, xy_SurfRoughLength, xy_SurfVelBulkCoef, xy_SurfTempBulkCoef, xy_SurfQmixBulkCoef )
    ! フラックスの計算
    ! Surface fluxes are calculated. 
    !
    xy_PTempFlux = - xy_SurfTempBulkCoef * xyz_AbsVel(:,:,kz) * ( xyz_PTempAll(:,:,kz) - TempSfc / ( ExnerBZSfc + xyz_Exner(:,:,kz) ) )
    xyf_QMixFlux = 0.0d0
    do s = 1, CondNum
      xyf_QMixFlux(:,:,IdxCG(s)) = - xy_SurfQmixBulkCoef * xyz_AbsVel(:,:,kz) * ( xyzf_QMixAll(:,:,kz,s) - SvapPress( SpcWetID(IdxCC(s)), TempSfc ) / ( xy_PressSfc ) * (MolWtWet(IdxCG(s)) / MolWtDry) )
    end do
    !
    if ( FlagDExnerDtSurf ) then
      xy_ExnerFlux = xy_DExnerDt_xy_xyf(xy_PTempFlux, xyf_QMixFlux, kz)
    else
      xy_ExnerFlux = 0.0d0
    end if
    !
    py_VelXFlux = - xy_SurfVelBulkCoef * pyz_AbsVel(:,:,kz) * pyz_VelX(:,:,kz)
    !
    xq_VelYFlux = - xy_SurfVelBulkCoef * xqz_AbsVel(:,:,kz) * xqz_VelY(:,:,kz)
    ! フラックスの下限値を設定
    ! Set lower limit of surface fluxes
    ! 
    xy_PTempFlux = max( PTempFluxMin, xy_PTempFlux )
    xy_ExnerFlux = max( ExnerFluxMin, xy_ExnerFlux )
    xyf_QMixFlux = max( QMixFluxMin, xyf_QMixFlux )
    ! 地表フラックスによる時間変化を計算
    ! Tendencies by surface fluxes (convergences of fluxes) are calculated.
    !
    xy_DPTempDtBulk = - ( 0.0d0 - xy_PTempFlux ) / z_dz(kz)
    !
    xy_DExnerDtBulk = - ( 0.0d0 - xy_ExnerFlux ) / z_dz(kz)
    !
    xyf_DQMixDtBulk = - ( 0.0d0 - xyf_QMixFlux ) / z_dz(kz)
    !
    py_DVelXDtBulk = - ( 0.0d0 - py_VelXFlux ) / z_dz(kz)
    !
    xq_DVelYDtBulk = - ( 0.0d0 - xq_VelYFlux ) / z_dz(kz)
    
    ! 仮引数配列へ格納
    ! Add tendency by surface flux convergence
    !
    xyz_DPTempDt(:,:,kz) = xyz_DPTempDt(:,:,kz) + xy_DPTempDtBulk
    xyz_DExnerDt(:,:,kz) = xyz_DExnerDt(:,:,kz) + xy_DExnerDtBulk
    do s = 1, ncmax
      xyzf_DQMixDt(:,:,kz,s) = xyzf_DQMixDt(:,:,kz,s) + xyf_DQMixDtBulk(:,:,s)
    end do
    pyz_DVelXDt (:,:,kz) = pyz_DVelXDt (:,:,kz) + py_DVelXDtBulk
    xqz_DVelYDt (:,:,kz) = xqz_DVelYDt (:,:,kz) + xq_DVelYDtBulk
    ! 出力
    ! Output
    !
    xyz_DPTempDtBulk = 0.0d0
    xyz_DExnerDtBulk = 0.0d0
    xyzf_DQMixDtBulk = 0.0d0
    pyz_DVelXDtBulk  = 0.0d0
    xqz_DVelYDtBulk  = 0.0d0
    xyz_DPTempDtBulk(:,:,kz) = xy_DPTempDtBulk
    xyz_DExnerDtBulk(:,:,kz) = xy_DExnerDtBulk
    do s = 1, ncmax
      xyzf_DQMixDtBulk(:,:,kz,s) = xyf_DQMixDtBulk(:,:,s)
    end do
    pyz_DVelXDtBulk (:,:,kz) = py_DVelXDtBulk
    xqz_DVelYDtBulk (:,:,kz) = xq_DVelYDtBulk
    !
    call HistoryAutoPut(TimeN, 'PTempSfc', xyz_DPTempDtBulk(1:nx,1:ny,1:nz))
    call HistoryAutoPut(TimeN, 'ExnerSfc', xyz_DExnerDtBulk(1:nx,1:ny,1:nz))
    call HistoryAutoPut(TimeN, 'VelXSfc',  pyz_DVelXDtBulk (1:nx,1:ny,1:nz))
    call HistoryAutoPut(TimeN, 'VelYSfc',  xqz_DVelYDtBulk (1:nx,1:ny,1:nz))
    do s = 1, ncmax
      call HistoryAutoPut(TimeN, trim(SpcWetSymbol(s))//'_Sfc', xyzf_DQMixDtBulk(1:nx,1:ny,1:nz,s))
    end do
    call HistoryAutoPut(TimeN, 'PTempSfcFlux', xy_PTempFlux(1:nx,1:ny))
    call HistoryAutoPut(TimeN, 'ExnerSfcFlux', xy_ExnerFlux(1:nx,1:ny))
    call HistoryAutoPut(TimeN, 'VelXSfcFlux',  py_VelXFlux (1:nx,1:ny))
    call HistoryAutoPut(TimeN, 'VelYSfcFlux',  xq_VelYFlux (1:nx,1:ny))
    do s = 1, ncmax
      call HistoryAutoPut(TimeN, trim(SpcWetSymbol(s))//'_SfcFlux', xyf_QMixFlux(1:nx,1:ny,s))
    end do
    call HistoryAutoPut(TimeN, 'SfcHeatFlux', CpDry * xyz_DensBZ(1:nx,1:ny,1) * xy_PTempFlux(1:nx,1:ny) * ( ExnerBZSfc + xyz_Exner(1:nx,1:ny,1) ) )
    call HistoryAutoPut(TimeN, 'SfcXMomFlux', xyz_DensBZ(1:nx,1:ny,1) * py_VelXFlux (1:nx,1:ny))
    call HistoryAutoPut(TimeN, 'SfcYMomFlux', xyz_DensBZ(1:nx,1:ny,1) * xq_VelYFlux (1:nx,1:ny))
    do s = 1, ncmax
      call HistoryAutoPut(TimeN, trim(SpcWetSymbol(s))//'_SfcMassFlux', xyz_DensBZ(1:nx,1:ny,1) * xyf_QMixFlux(1:nx,1:ny,s))
    end do
  end subroutine Surfaceflux_Bulk_forcing
          | Subroutine : | 
NAMELIST から必要な情報を読み取り, 時間関連の変数の設定を行う.
  subroutine Surfaceflux_Bulk_init
    !
    ! NAMELIST から必要な情報を読み取り, 時間関連の変数の設定を行う. 
    !
    ! 暗黙の型宣言禁止
    ! Implicit none
    !
    implicit none
    ! 作業変数
    ! Work variables
    !
    integer    :: l, unit   ! 出力装置番号
                         ! Device number 
    !---------------------------------------------------------------
    ! 格子点の初期化
    !
    call GridsetSurfacefluxInit
    !---------------------------------------------------------------
    ! NAMELIST から情報を取得
    !
!    NAMELIST /surface_flux_bulk_nml/ &
!      &  SfcRoughLength, Vel0                 
!    call FileOpen(unit, file=namelist_filename, mode='r')
!    read(unit, NML=surface_flux_bulk_nml)
!    close(unit)  
    ! dcpam ソースの初期化プログラムを call
    call SurfaceFluxInit_Core
!    if (myrank == 0) then 
!      call MessageNotify( "M", module_name, "SfcRoughLength = %f",  &
!        &  d=(/SfcRoughLength/))
!      call MessageNotify( "M", module_name, "Vel0 = %f", d=(/Vel0/))
!    end if
    call HistoryAutoAddVariable( varname='PTempSfcFlux', dims=(/'x','y','t'/), longname='surface potential temperature flux (heat flux divided by density and specific heat)', units='K.m.s-1', xtype='float')
    call HistoryAutoAddVariable( varname='ExnerSfcFlux', dims=(/'x','y','t'/), longname='surface exner function flux (heat flux divided by density and specific heat)', units='s-1', xtype='float')
    call HistoryAutoAddVariable( varname='VelXSfcFlux', dims=(/'x','y','t'/), longname='surface flux of x-component of velocity (momentum flux divided by density)', units='m2.s-2', xtype='float')
    call HistoryAutoAddVariable( varname='VelYSfcFlux', dims=(/'x','y','t'/), longname='surface flux of y-component of velocity (momentum flux divided by density)', units='m2.s-2', xtype='float')
    do l = 1, ncmax
      call HistoryAutoAddVariable( varname=trim(SpcWetSymbol(l))//'_SfcFlux', dims=(/'x','y','t'/), longname='surface flux of ' //trim(SpcWetSymbol(l))//' mixing ratio (mass flux divided by density)', units='m.s-1', xtype='float')
    end do
    call HistoryAutoAddVariable( varname='PTempSfc', dims=(/'x','y','z','t'/), longname='potential temperature tendency by surface flux', units='K.s-1', xtype='float')
    call HistoryAutoAddVariable( varname='ExnerSfc', dims=(/'x','y','z','t'/), longname='exner function tendency by surface flux', units='K.s-1', xtype='float')
    call HistoryAutoAddVariable( varname='VelXSfc', dims=(/'x','y','z','t'/), longname='x-component velocity tendency by surface flux', units='m.s-2', xtype='float')
    call HistoryAutoAddVariable( varname='VelYSfc', dims=(/'x','y','z','t'/), longname='y-component velocity tendency by surface flux', units='m.s-2', xtype='float')
    do l = 1, ncmax
      call HistoryAutoAddVariable( varname=trim(SpcWetSymbol(l))//'_Sfc', dims=(/'x','y','z','t'/), longname=trim(SpcWetSymbol(l))//' mixing ratio tendency by surface flux', units='s-1', xtype='float')
    end do
    call HistoryAutoAddVariable( varname='SfcHeatFlux', dims=(/'x','y','t'/), longname='surface heat flux', units='W.m-2', xtype='float')
    call HistoryAutoAddVariable( varname='SfcXMomFlux', dims=(/'x','y','t'/), longname='surface x-component momentum flux', units='kg.m-2.s-1', xtype='float')
    call HistoryAutoAddVariable( varname='SfcYMomFlux', dims=(/'x','y','t'/), longname='surface y-component momentum flux', units='kg.m-2.s-1', xtype='float')
    do l = 1, ncmax
      call HistoryAutoAddVariable( varname=trim(SpcWetSymbol(l))//'_SfcMassFlux', dims=(/'x','y','t'/), longname=trim(SpcWetSymbol(l))//' surface mass flux', units='kg.m-2.s-1', xtype='float')
    end do
  end subroutine Surfaceflux_Bulk_init
          | Subroutine : | 
NAMELIST から必要な情報を読み取り, 時間関連の変数の設定を行う.
This procedure input/output NAMELIST#surfaceflux_bulk_nml .
  subroutine Surfaceflux_Bulk_init
    !
    ! NAMELIST から必要な情報を読み取り, 時間関連の変数の設定を行う. 
    !
    ! 暗黙の型宣言禁止
    ! Implicit none
    !
    implicit none
    ! 作業変数
    ! Work variables
    !
    integer    :: l, unit   ! 出力装置番号
                         ! Device number 
    !---------------------------------------------------------------
    ! NAMELIST から情報を取得
    !
    NAMELIST /surfaceflux_bulk_nml/ FlagConstBulkCoef, FlagUseOfBulkCoefInNeutralCond, ConstBulkCoef, FlagDExnerDtSurf, VelMinForRi, SfcRoughLength, Vel0, VelBulkCoefMin, TempBulkCoefMin, QmixBulkCoefMin, VelBulkCoefMax, TempBulkCoefMax, QmixBulkCoefMax
    call FileOpen(unit, file=namelist_filename, mode='r')
    read(unit, NML=surfaceflux_bulk_nml)
    close(unit)  
    if (myrank == 0) then 
      call MessageNotify( "M", module_name, "SfcRoughLength = %f", d=(/SfcRoughLength/))
      call MessageNotify( "M", module_name, "VelMinForRi = %f", d=(/VelMinForRi/) )
      call MessageNotify( "M", module_name, "Vel0 = %f", d=(/Vel0/))
      call MessageNotify( 'M', module_name, "FlagConstBulkCoef              = %b", l = (/ FlagConstBulkCoef /) )
      call MessageNotify( 'M', module_name, "FlagUseOfBulkCoefInNeutralCond = %b", l = (/ FlagUseOfBulkCoefInNeutralCond /) )
      call MessageNotify( 'M', module_name, "FlagDExnerDtSurf = %b", l = (/ FlagDExnerDtSurf /) )
      call MessageNotify( 'M', module_name, "ConstBulkCoef   = %f", d = (/ ConstBulkCoef   /) )
      call MessageNotify( 'M', module_name, "VelBulkCoefMin  = %f", d = (/ VelBulkCoefMin  /) )
      call MessageNotify( 'M', module_name, "TempBulkCoefMin = %f", d = (/ TempBulkCoefMin /) )
      call MessageNotify( 'M', module_name, "QmixBulkCoefMin = %f", d = (/ QmixBulkCoefMin /) )
      call MessageNotify( "M", module_name, "VelBulkCoefMax = %f", d=(/VelBulkCoefMax/))
      call MessageNotify( "M", module_name, "TempBulkCoefMax = %f", d=(/TempBulkCoefMax/))
      call MessageNotify( "M", module_name, "QmixBulkCoefMax = %f", d=(/QmixBulkCoefMax/))
    end if
    call HistoryAutoAddVariable( varname='PTempSfcFlux', dims=(/'x','y','t'/), longname='surface potential temperature flux (heat flux divided by density and specific heat)', units='K.m.s-1', xtype='float')
    call HistoryAutoAddVariable( varname='ExnerSfcFlux', dims=(/'x','y','t'/), longname='surface exner function flux (heat flux divided by density and specific heat)', units='s-1', xtype='float')
    call HistoryAutoAddVariable( varname='VelXSfcFlux', dims=(/'x','y','t'/), longname='surface flux of x-component of velocity (momentum flux divided by density)', units='m2.s-2', xtype='float')
    call HistoryAutoAddVariable( varname='VelYSfcFlux', dims=(/'x','y','t'/), longname='surface flux of y-component of velocity (momentum flux divided by density)', units='m2.s-2', xtype='float')
    do l = 1, ncmax
      call HistoryAutoAddVariable( varname=trim(SpcWetSymbol(l))//'_SfcFlux', dims=(/'x','y','t'/), longname='surface flux of ' //trim(SpcWetSymbol(l))//' mixing ratio (mass flux divided by density)', units='m.s-1', xtype='float')
    end do
    call HistoryAutoAddVariable( varname='PTempSfc', dims=(/'x','y','z','t'/), longname='potential temperature tendency by surface flux', units='K.s-1', xtype='float')
    call HistoryAutoAddVariable( varname='ExnerSfc', dims=(/'x','y','z','t'/), longname='exner function tendency by surface flux', units='K.s-1', xtype='float')
    call HistoryAutoAddVariable( varname='VelXSfc', dims=(/'x','y','z','t'/), longname='x-component velocity tendency by surface flux', units='m.s-2', xtype='float')
    call HistoryAutoAddVariable( varname='VelYSfc', dims=(/'x','y','z','t'/), longname='y-component velocity tendency by surface flux', units='m.s-2', xtype='float')
    do l = 1, ncmax
      call HistoryAutoAddVariable( varname=trim(SpcWetSymbol(l))//'_Sfc', dims=(/'x','y','z','t'/), longname=trim(SpcWetSymbol(l))//' mixing ratio tendency by surface flux', units='s-1', xtype='float')
    end do
    call HistoryAutoAddVariable( varname='SfcHeatFlux', dims=(/'x','y','t'/), longname='surface heat flux', units='W.m-2', xtype='float')
    call HistoryAutoAddVariable( varname='SfcXMomFlux', dims=(/'x','y','t'/), longname='surface x-component momentum flux', units='kg.m-2.s-1', xtype='float')
    call HistoryAutoAddVariable( varname='SfcYMomFlux', dims=(/'x','y','t'/), longname='surface y-component momentum flux', units='kg.m-2.s-1', xtype='float')
    do l = 1, ncmax
      call HistoryAutoAddVariable( varname=trim(SpcWetSymbol(l))//'_SfcMassFlux', dims=(/'x','y','t'/), longname=trim(SpcWetSymbol(l))//' surface mass flux', units='kg.m-2.s-1', xtype='float')
    end do
  end subroutine Surfaceflux_Bulk_init