Class physics_verdiff_main_mod
In: physics/physics_verdiff_main.f90

Methods

Included Modules

type_mod grid_3d_mod constants_mod physics_verdiff_coeff_mod dc_trace

Public Instance methods

Subroutine :
xyr_VelLonFlux(im,jm,km+1) :real(DBKIND), intent(out)
: (out) 比湿フラックス
xyr_VelLatFlux(im,jm,km+1) :real(DBKIND), intent(out)
: (out) 比湿フラックス
xyr_TempFlux(im,jm,km+1) :real(DBKIND), intent(out)
: (out) 比湿フラックス
xyr_QvapFlux(im,jm,km+1) :real(DBKIND), intent(out)
: (out) 比湿フラックス
xyzo_VelMatrix(im,jm,km,-1:1) :real(DBKIND), intent(inout)
: (inout) 比湿陰解行列
xyzo_TempMatrix(im,jm,0:km,-1:1) :real(DBKIND), intent(inout)
: (inout) 比湿陰解行列
xyzo_QvapMatrix(im,jm,km,-1:1) :real(DBKIND), intent(inout)
: (inout) 比湿陰解行列
xyz_VelLon(im,jm,km) :real(DBKIND), intent(in)
: (in) 高度 (半整数)
xyz_VelLat(im,jm,km) :real(DBKIND), intent(in)
: (in) 高度 (半整数)
xyz_Temp(im,jm,km) :real(DBKIND), intent(in)
: (in) 高度 (半整数)
xyr_Temp(im,jm,km+1) :real(DBKIND), intent(in)
: (in) 高度 (半整数)
xyz_Qvap(im,jm,km) :real(DBKIND), intent(in)
: (in) 高度 (半整数)
xyz_Press(im,jm,km) :real(DBKIND), intent(in)
: (in) 高度 (半整数)
xyr_Press(im,jm,km+1) :real(DBKIND), intent(in)
: (in) 高度 (半整数)
xyz_GeoPot(im,jm,km) :real(DBKIND), intent(in)
: (in) 高度 (半整数)
xyr_GeoPot(im,jm,km+1) :real(DBKIND), intent(in)
: (in) 高度 (半整数)

(in) 高度 (半整数)

[Source]

  subroutine physics_verdiff_main( xyr_VelLonFlux       , xyr_VelLatFlux       , xyr_TempFlux         , xyr_QvapFlux         , xyzo_VelMatrix       , xyzo_TempMatrix      , xyzo_QvapMatrix      , xyz_VelLon           , xyz_VelLat           , xyz_Temp             , xyr_Temp             , xyz_Qvap             , xyz_Press            , xyr_Press            , xyz_GeoPot           , xyr_GeoPot             ) ! (in) 高度 (半整数)

    !==== Dependency
    use type_mod,    only: REKIND, DBKIND, INTKIND, TOKEN, STRING
    use grid_3d_mod, only: im, jm, km
    use constants_mod, only: RAir, Cp, Grav, EL
    use physics_verdiff_coeff_mod,  only: physics_verdiff_coeff
    use dc_trace,    only: SetDebug, BeginSub, EndSub, DbgMessage, DataDump

    implicit none

    !==== Output
    !
    real(DBKIND), intent(out) :: xyr_VelLonFlux(im,jm,km+1)        , xyr_VelLatFlux(im,jm,km+1)        , xyr_TempFlux(im,jm,km+1)          , xyr_QvapFlux(im,jm,km+1)              ! (out) 比湿フラックス

    !==== Input
    !
    real(DBKIND), intent(in) :: xyz_VelLon(im,jm,km)              , xyz_VelLat(im,jm,km)              , xyz_Temp(im,jm,km)                , xyr_Temp(im,jm,km+1)              , xyz_Qvap(im,jm,km)                , xyz_Press(im,jm,km)               , xyr_Press(im,jm,km+1)             , xyz_GeoPot(im,jm,km)              , xyr_GeoPot(im,jm,km+1)                ! (in) 高度 (半整数)

    !==== In/Out
    !
    real(DBKIND), intent(inout) :: xyzo_VelMatrix(im,jm,km,-1:1)    , xyzo_TempMatrix(im,jm,0:km,-1:1) , xyzo_QvapMatrix(im,jm,km,-1:1)       ! (inout) 比湿陰解行列

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

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

    real(DBKIND), parameter :: RefPress        = 100000.0D0 ! 参照気圧
    real(DBKIND), parameter :: BasePotTemp     = 300.0D0    ! 基本温位
    real(DBKIND), parameter :: SquareVelMin    = 0.1D0      ! 風二乗差最小値
    real(DBKIND), parameter :: BulkRiNumMin    = - 100.0D0  ! バルクRi数最小値

    real(DBKIND) :: xyr_DVelDz(im,jm,km+1)            , xyr_BulkRiNum(im,jm,km+1)         , xyr_TempTransCoeff(im,jm,km+1)    , xyr_QvapTransCoeff(im,jm,km+1)    , xyr_VelTransCoeff(im,jm,km+1)     , xyr_TempDiffuCoeff(im,jm,km+1)    , xyr_QvapDiffuCoeff(im,jm,km+1)    , xyr_VelDiffuCoeff(im,jm,km+1)     , xyz_Exner(im,jm,km)               , xyr_Exner(im,jm,km+1)                 ! Exner関数 (半整数)

    continue

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

    !----------------------------------------------------------------
    !   鉛直拡散計算
    !----------------------------------------------------------------

    ! ---- 1. 定数計算 ----
    xyz_Exner = ( xyz_Press / RefPress ) ** (RAir/Cp)
    xyr_Exner = ( xyr_Press / RefPress ) ** (RAir/Cp)

    ! ---- 2. バルクRi数 ----

    xyr_DVelDz    = 0.0d0
    xyr_BulkRiNum = 0.0d0

    do k = 2, km 
       do i = 1, im
          do j = 1, jm
             xyr_DVelDz(i,j,k) = SQRT( MAX( SquareVelMin , ( xyz_VelLon(i,j,k) - xyz_VelLon(i,j,k-1) )**2 + ( xyz_VelLat(i,j,k) - xyz_VelLat(i,j,k-1) )**2 )    ) / ( xyz_GeoPot(i,j,k) - xyz_GeoPot(i,j,k-1) )

             xyr_BulkRiNum(i,j,k) = Grav / BasePotTemp *  (   xyz_Temp(i,j,k)   / xyz_Exner(i,j,k) - xyz_Temp(i,j,k-1) / xyz_Exner(i,j,k-1) ) / ( xyz_GeoPot(i,j,k) - xyz_GeoPot(i,j,k-1) ) / xyr_DVelDz(i,j,k)**2

             xyr_BulkRiNum(i,j,k) = MAX( xyr_BulkRiNum(i,j,k) , BulkRiNumMin )

          end do
       end do
    end do

    ! ---- 3. 拡散係数 ----    

    call physics_verdiff_coeff( xyr_VelDiffuCoeff , xyr_TempDiffuCoeff, xyr_QvapDiffuCoeff, xyr_BulkRiNum     , xyr_DVelDz        , xyr_GeoPot )          ! (in) 

    ! ----  *. 浅い積雲対流 ----
    
    ! ----  *. 拡散係数の出力 ----
    
!    CALL HISTIN ( DFM  , 'DFM'  )
!    CALL HISTIN ( DFH  , 'DFH'  )
!    CALL HISTIN ( DFE  , 'DFE'  )

   ! ----  5. 輸送係数 ----
    
    xyr_VelTransCoeff  = 0.0d0
    xyr_TempTransCoeff = 0.0d0
    xyr_QvapTransCoeff = 0.0d0

    do k = 2, km
       xyr_VelTransCoeff(:,:,k) = xyr_VelDiffuCoeff(:,:,k) * xyr_Press(:,:,k) / RAir / xyr_Temp(:,:,k) / ( xyz_GeoPot(:,:,k) - xyz_GeoPot(:,:,k-1) )
       xyr_TempTransCoeff(:,:,k) = xyr_TempDiffuCoeff(:,:,k) * xyr_Press(:,:,k) / RAir / xyr_Temp(:,:,k) / ( xyz_GeoPot(:,:,k) - xyz_GeoPot(:,:,k-1) )
       xyr_QvapTransCoeff(:,:,k) = xyr_QvapDiffuCoeff(:,:,k) * xyr_Press(:,:,k) / RAir / xyr_Temp(:,:,k) / ( xyz_GeoPot(:,:,k) - xyz_GeoPot(:,:,k-1) )
    end do

   ! ----  5. フラックス----

    ! k =0, km+1 も 0 でいいのかな. 
    xyr_VelLonFlux  = 0.0d0
    xyr_VelLatFlux  = 0.0d0
    xyr_TempFlux    = 0.0d0
    xyr_QvapFlux    = 0.0d0

    do k = 2, km

       xyr_VelLonFlux(:,:,k) = xyr_VelLonFlux(:,:,k) + xyr_VelTransCoeff(:,:,k) * ( xyz_VelLon(:,:,k-1) - xyz_VelLon(:,:,k) )


       xyr_VelLatFlux(:,:,k) = xyr_VelLatFlux(:,:,k) + xyr_VelTransCoeff(:,:,k) * ( xyz_VelLat(:,:,k-1) - xyz_VelLat(:,:,k) )

       xyr_TempFlux(:,:,k) = xyr_TempFlux(:,:,k) + Cp * xyr_TempTransCoeff(:,:,k) * xyr_Exner(:,:,k) * (   xyz_Temp(:,:,k-1) / xyz_Exner(:,:,k-1) - xyz_Temp(:,:,k)   / xyz_Exner(:,:,k)  )

       xyr_QvapFlux(:,:,k) = xyr_QvapFlux(:,:,k) + EL * xyr_QvapTransCoeff(:,:,k) * ( xyz_Qvap(:,:,k-1) - xyz_Qvap(:,:,k) )

    end do

   ! ----  5. 陰解用行列 ----

    do k = 2, km 
       xyzo_VelMatrix(:,:,k,0)  = xyzo_VelMatrix(:,:,k,0) + xyr_VelTransCoeff(:,:,k)
       xyzo_VelMatrix(:,:,k,-1) =                         - xyr_VelTransCoeff(:,:,k)

       xyzo_TempMatrix(:,:,k,0)  = xyzo_TempMatrix(:,:,k,0) + Cp * xyr_TempTransCoeff(:,:,k) * xyr_Exner(:,:,k) / xyz_Exner(:,:,k) 
       xyzo_TempMatrix(:,:,k,-1) = - Cp * xyr_TempTransCoeff(:,:,k) * xyr_Exner(:,:,k) / xyz_Exner(:,:,k-1) 

       xyzo_QvapMatrix(:,:,k,0)  = xyzo_QvapMatrix(:,:,k,0) + Cp * xyr_QvapTransCoeff(:,:,k)
       xyzo_QvapMatrix(:,:,k,-1) = - Cp * xyr_QvapTransCoeff(:,:,k) 
    end do

    do k = 1, km-1
       xyzo_VelMatrix(:,:,k,0)  = xyzo_VelMatrix(:,:,k,0) + xyr_VelTransCoeff(:,:,k+1)
       xyzo_VelMatrix(:,:,k,1)  = - xyr_VelTransCoeff(:,:,k+1) 

       xyzo_TempMatrix(:,:,k,0)  = xyzo_TempMatrix(:,:,k,0) + Cp * xyr_TempTransCoeff(:,:,k+1) * xyr_Exner(:,:,k+1) / xyz_Exner(:,:,k) 
       xyzo_TempMatrix(:,:,k,1)  = - Cp * xyr_TempTransCoeff(:,:,k+1) * xyr_Exner(:,:,k+1) / xyz_Exner(:,:,k+1) 

       xyzo_QvapMatrix(:,:,k,0)  = xyzo_QvapMatrix(:,:,k,0) + Cp * xyr_QvapTransCoeff(:,:,k+1)
       xyzo_QvapMatrix(:,:,k,1)  = - Cp * xyr_QvapTransCoeff(:,:,k+1) 
    end do

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

  end subroutine physics_verdiff_main

[Validate]