Class physics_surface_coeff_mod
In: physics/physics_surface_coeff.f90

Methods

Included Modules

type_mod grid_3d_mod constants_mod dc_trace

Public Instance methods

Subroutine :
xy_SurfVelBulkCoeff(im,jm) :real(DBKIND), intent(out)
: (out) バルク係数:比湿
xy_SurfTempBulkCoeff(im,jm) :real(DBKIND), intent(out)
: (out) バルク係数:比湿
xy_SurfQvapBulkCoeff(im,jm) :real(DBKIND), intent(out)
: (out) バルク係数:比湿
xy_SurfBulkRiNum(im,jm) :real(DBKIND), intent(in)
: (in) 最下層温度
xy_SurfVelAbs(im,jm) :real(DBKIND), intent(in)
: (in) 最下層温度
xy_SurfVelRoughLength(im,jm) :real(DBKIND), intent(in)
: (in) 最下層温度
xy_SurfTempRoughLength(im,jm) :real(DBKIND), intent(in)
: (in) 最下層温度
xy_SurfGeoPot(im,jm) :real(DBKIND), intent(in)
: (in) 最下層温度

(in)

[Source]

  subroutine physics_surface_coeff( xy_SurfVelBulkCoeff , xy_SurfTempBulkCoeff, xy_SurfQvapBulkCoeff, xy_SurfBulkRiNum    , xy_SurfVelAbs       , xy_SurfVelRoughLength   , xy_SurfTempRoughLength  , xy_SurfGeoPot            ) ! (in) 

    !==== Dependency
    use type_mod,    only: REKIND, DBKIND, INTKIND, TOKEN, STRING
    use grid_3d_mod, only: im, jm, km
    use constants_mod, only: FKarm 
    use dc_trace,    only: SetDebug, BeginSub, EndSub, DbgMessage, DataDump

    implicit none

    !==== Output
    !
    real(DBKIND), intent(out) :: xy_SurfVelBulkCoeff(im,jm)      , xy_SurfTempBulkCoeff(im,jm)     , xy_SurfQvapBulkCoeff(im,jm)         ! (out) バルク係数:比湿

    !==== Input
    !
    real(DBKIND), intent(in) :: xy_SurfBulkRiNum(im,jm)         , xy_SurfVelAbs(im,jm)            , xy_SurfVelRoughLength(im,jm)    , xy_SurfTempRoughLength(im,jm)   , xy_SurfGeoPot(im,jm)                ! (in) 最下層温度

    !----- 作業用内部変数 -----
    character(STRING),  parameter:: subname = "physics_surface_coeff"

    ! do ループ用作業変数 (東西 i*、南北 j*、鉛直 k*、波数 l*用)
    integer(INTKIND)    :: i, j

    logical            :: Newtral = .FALSE.                 ! 中立であるか否か
    real(DBKIND), parameter :: ConstBulkCoeff  = -1.        ! バルク定数一定値
    real(DBKIND), parameter :: VelBulkCoeffMin  = 0.        ! uバルク係数最小値
    real(DBKIND), parameter :: TempBulkCoeffMin = 0.        ! Tバルク係数最小値
    real(DBKIND), parameter :: QvapBulkCoeffMin = 0.        ! qバルク係数最小値
    real(DBKIND), parameter :: VelBulkCoeffMax  = 1.        ! uバルク係数最大値
    real(DBKIND), parameter :: TempBulkCoeffMax = 1.        ! Tバルク係数最大値
    real(DBKIND), parameter :: QvapBulkCoeffMax = 1.        ! qバルク係数最大値
    
    continue

    !----------------------------------------------------------------
    !   開始処理
    !----------------------------------------------------------------
    call BeginSub(subname)

    !----------------------------------------------------------------
    !   地表面バルク係数計算
    !----------------------------------------------------------------

    ! ---- 1. 中立バルク係数 ----

      if ( ConstBulkCoeff .LT. 0.   ) then

         xy_SurfVelBulkCoeff  = ( FKarm / LOG ( xy_SurfGeoPot / xy_SurfVelRoughLength ) )**2
         xy_SurfTempBulkCoeff = ( FKarm / LOG ( xy_SurfGeoPot / xy_SurfTempRoughLength ) )**2
         xy_SurfQvapBulkCoeff = xy_SurfTempBulkCoeff

      else
         xy_SurfVelBulkCoeff  = ConstBulkCoeff
         xy_SurfTempBulkCoeff = ConstBulkCoeff
         xy_SurfQvapBulkCoeff = ConstBulkCoeff
      end if

    ! ---- 2. 非中立バルク係数 ----

      if ( .NOT. Newtral ) then

         do i = 1, im
            do j = 1, jm
               if ( xy_SurfBulkRiNum(i,j) .GT. 0. ) then 
                  xy_SurfVelBulkCoeff(i,j) = xy_SurfVelBulkCoeff(i,j) / ( 1. + 10.* xy_SurfBulkRiNum(i,j) / SQRT( 1. + 5.* xy_SurfBulkRiNum(i,j) ) )
                  xy_SurfTempBulkCoeff(i,j) = xy_SurfTempBulkCoeff(i,j) / ( 1. + 15.* xy_SurfBulkRiNum(i,j) / SQRT( 1. + 5.* xy_SurfBulkRiNum(i,j) ) )
                  xy_SurfQvapBulkCoeff(i,j) = xy_SurfTempBulkCoeff(i,j)
               else
                  xy_SurfVelBulkCoeff(i,j) = xy_SurfVelBulkCoeff(i,j) * ( 1. - 10.* xy_SurfBulkRiNum(i,j) / ( 1. + 75. * xy_SurfVelBulkCoeff(i,j) * SQRT( - xy_SurfGeoPot(i,j) / xy_SurfVelRoughLength(i,j) * xy_SurfBulkRiNum(i,j) ) ) )

                  xy_SurfTempBulkCoeff(i,j) = xy_SurfTempBulkCoeff(i,j) * ( 1. - 15.* xy_SurfBulkRiNum(i,j) / ( 1. + 75. * xy_SurfTempBulkCoeff(i,j) * SQRT( - xy_SurfGeoPot(i,j) / xy_SurfTempRoughLength(i,j) * xy_SurfBulkRiNum(i,j) ) ) )
                  xy_SurfQvapBulkCoeff(i,j) = xy_SurfTempBulkCoeff(i,j)
               end if               
            end do
         end do

      end if

    ! ---- 3. 最大/最小 判定 ----

      do i = 1, im
         do j = 1, jm
         xy_SurfVelBulkCoeff(i,j)  = MAX( MIN( xy_SurfVelBulkCoeff(i,j) , VelBulkCoeffMax ), VelBulkCoeffMin )
         xy_SurfTempBulkCoeff(i,j) = MAX( MIN( xy_SurfTempBulkCoeff(i,j) , TempBulkCoeffMax ), TempBulkCoeffMin )
         xy_SurfQvapBulkCoeff(i,j) = MAX( MIN( xy_SurfQvapBulkCoeff(i,j) , QvapBulkCoeffMax ), QvapBulkCoeffMin )
         end do
      end do

    !----------------------------------------------------------------
    !   終了処理
    !----------------------------------------------------------------
    call EndSub(subname)

  end subroutine physics_surface_coeff

[Validate]