Baker et al. 1989 に従って, 上下境界での熱フラックスを決める.
subroutine Surfaceflux_BS1998_init
!
! Baker et al. 1989 に従って, 上下境界での熱フラックスを決める.
!
!暗黙の型宣言禁止
implicit none
!内部変数
real(DP), parameter :: Qsub_100km = 717.0d0 ! [W/m^2]
real(DP), parameter :: Zref = 100.0d3
real(DP) :: QsubTop, QsubBtm
real(DP) :: z1, z2
real(DP) :: xyz_TempFlux(imin:imax,jmin:jmax,kmin:kmax) !温度フラックス [W/m^3]
real(DP) :: xyz_PTempFlux(imin:imax,jmin:jmax,kmin:kmax) !温位フラックス [W/m^3]
integer :: k
!---------------------------------------------------------------
! 初期化
!
z1 = z_Z(nz) + dz ! 領域内の点は含まない
z2 = z_Z(1) ! 領域内の点は含む
allocate( xyz_DPTempDtFlux(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xyz_DExnerDtFlux(imin:imax,jmin:jmax,kmin:kmax) )
xyz_DPTempDtFlux = 0.0d0
xyz_DExnerDtFlux = 0.0d0
xyz_TempFlux = 0.0d0
xyz_PTempFlux = 0.0d0
!---------------------------------------------------------------
! 境界での加熱率を計算する.
!
QsubTop = 0.0d0
do while ( z1 <= Zref )
QsubTop = QsubTop + cal_Qsub( z1 ) * dz
z1 = z1 + dz
end do
xyz_TempFlux(:,:,nz) = - Qsub_100km + QsubTop
xyz_TempFlux(:,:,nz+1) = - Qsub_100km + QsubTop ! 境界値
xyz_PTempFlux(:,:,nz) = - Qsub_100km + QsubTop
xyz_PTempFlux(:,:,nz+1) = - Qsub_100km + QsubTop ! 境界値
QsubBtm = 0.0d0
do while ( z2 <= Zref )
QsubBtm = QsubBtm + cal_Qsub( z2 ) * dz
z2 = z2 + dz
end do
xyz_TempFlux(:,:,1) = Qsub_100km - QsubBtm
xyz_TempFlux(:,:,0) = Qsub_100km - QsubBtm ! 境界値
QsubBtm = 0.0d0
do k = 1, nz
QsubBtm = QsubBtm + cal_Qsub( z_Z(k) ) / xyz_ExnerBZ(1,1,k) * dz
end do
xyz_PTempFlux(:,:,1) = Qsub_100km - QsubTop - QsubBtm
xyz_PTempFlux(:,:,0) = Qsub_100km - QsubTop - QsubBtm
!---------------------------------------------------------------
! 時間変化率の計算
! 最上部および最下層の格子で xyz_TempFlux で与えられる加熱 [W/m^2]
! が適用されるようにする. そのため, 格子間隔 dz で割り算する.
!
! xyz_DPTempDtFlux = xyz_TempFlux / xyz_ExnerBZ / xyz_DensBZ / CpDry / dz
xyz_DPTempDtFlux = xyz_PTempFlux / xyz_DensBZ / CpDry / dz
xyz_DExnerDtFlux = xyz_DExnerDt_xyz( xyz_DPTempDtFlux )
!---------------------------------------------------------------
! 確認用の出力
!
if (myrank == 0) then
call MessageNotify( "M", module_name, "TempFluxTop = %f", d=(/xyz_TempFlux(1,1,nz)/) )
call MessageNotify( "M", module_name, "PTempFluxTop = %f", d=(/xyz_PTempFlux(1,1,nz)/) )
call MessageNotify( "M", module_name, "DPTempDtTop = %f", d=(/xyz_DPTempDtFlux(1,1,nz)/) )
call MessageNotify( "M", module_name, "TempFluxBtm = %f", d=(/xyz_TempFlux(1,1,1)/) )
call MessageNotify( "M", module_name, "PTempFluxBtm = %f", d=(/xyz_PTempFlux(1,1,1)/) )
call MessageNotify( "M", module_name, "DPTempDtBtm = %f", d=(/xyz_DPTempDtFlux(1,1,1)/) )
end if
!---------------------------------------------------------------
! ファイルの定義
!
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')
end subroutine Surfaceflux_BS1998_init