Class Surfaceflux_BS1998
In: ../src/physics/surfaceflux_bs1998.f90

Baker et al. 1989 の上下境界での定フラックス計算モジュール.

Methods

Included Modules

dc_types dc_iounit dc_message gtool_historyauto mpi_wrapper gridset axesset basicset constants timeset DExnerDt

Public Instance methods

Subroutine :
xyz_DPTempDt(imin:imax,jmin:jmax,kmin:kmax) :real(DP), intent(inout)
xyz_DExnerDt(imin:imax,jmin:jmax,kmin:kmax) :real(DP), intent(inout)

[Source]

  subroutine Surfaceflux_BS1998_forcing( xyz_DPTempDt, xyz_DExnerDt )

    !暗黙の型宣言禁止
    implicit none

    !変数定義
    real(DP), intent(inout):: xyz_DPTempDt(imin:imax,jmin:jmax,kmin:kmax)
    real(DP), intent(inout):: xyz_DExnerDt(imin:imax,jmin:jmax,kmin:kmax)

    ! 仮引数配列への加算
    !
    xyz_DPTempDt = xyz_DPTempDt + xyz_DPTempDtFlux
    xyz_DExnerDt = xyz_DExnerDt + xyz_DExnerDtFlux
    
    ! 出力
    ! 
    call HistoryAutoPut(TimeN, 'PTempSfc', xyz_DPTempDtFlux(1:nx,1:ny,1:nz))
    call HistoryAutoPut(TimeN, 'ExnerSfc', xyz_DExnerDtFlux(1:nx,1:ny,1:nz))

  end subroutine Surfaceflux_BS1998_forcing
Subroutine :

Baker et al. 1989 に従って, 上下境界での熱フラックスを決める.

[Source]

  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