Class physics_dryadjust_mod
In: physics/physics_dryadjust.f90

Methods

Included Modules

type_mod grid_3d_mod constants_mod dc_trace

Public Instance methods

Subroutine :
xyz_Temp(im,jm,km) :real(DBKIND), intent(inout)
: (inout) 温度
xyz_DDryTempDt(im,jm,km) :real(DBKIND), intent(out)
: (out) 温度変化率
xyz_Press(im,jm,km) :real(DBKIND), intent(in)
: (in) 2Δt
xyr_Press(im,jm,km+1) :real(DBKIND), intent(in)
: (in) 2Δt
DelTimePhy :real(DBKIND), intent(in)
: (in) 2Δt

(in) 2Δt

[Source]

  subroutine physics_dryadjust( xyz_Temp          , xyz_DDryTempDt    , xyz_Press         , xyr_Press         , DelTimePhy         )  ! (in) 2Δt

    !==== Dependency
    use type_mod,      only: REKIND, DBKIND, INTKIND, TOKEN, STRING
    use grid_3d_mod,   only: im, jm, km
    use constants_mod, only: Cp    , RAir     ! 大気気体定数
    use dc_trace,      only: SetDebug, BeginSub, EndSub, DbgMessage, DataDump

    implicit none

    !==== Input
    !
    real(DBKIND), intent(in) :: xyz_Press(im,jm,km)   , xyr_Press(im,jm,km+1) , DelTimePhy               ! (in) 2Δt

    !==== Output
    !
    real(DBKIND), intent(out) :: xyz_DDryTempDt(im,jm,km) ! (out) 温度変化率

    !==== In/Out
    !
    real(DBKIND), intent(inout) :: xyz_Temp(im,jm,km)         ! (inout) 温度

    !----- 作業用内部変数 -----
    character(STRING),  parameter:: subname = "physics_dryadjust"
    real(DBKIND)        :: xyz_Temp_b(im,jm,km)              , xy_Adjust(im,jm)                  , xy_Adjust_b(im,jm)                , xyz_DPressDz(im,jm,km)            , xyz_DDPressDDPress(im,jm,km)      , xyz_DPFact(im,jm,km)              , TempSat                           , DelTemp                           , Adjust                ! 今回全領域において一度でも調節されたか否か


    integer(INTKIND), parameter :: IterationMax = 10 ! イテレーション回数
    
    real(DBKIND) ::  TempSatMax(IterationMax)   ! 不安定の許容誤差
    data TempSatMax  / 0.01  , 0.02  , 0.02  , 0.05  , 0.05  , 0.10  , 0.10  , 0.20  , 0.20  , 0.40  /

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

    continue

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

    !----------------------------------------------------------------
    !  湿潤対流調節
    !----------------------------------------------------------------

    !----- 調節前 Qvap の保存 -----    
    xyz_Temp_b  = xyz_Temp

    !----- 変数初期化 -----    
    xyz_DDryTempDt = 0.0d0
    
    !----- ファクター計算 -----    
    do k = 1, km
       xyz_DPressDz(:,:,k) = xyr_Press(:,:,k) - xyr_Press(:,:,k+1)
    end do

    do k = 2, km
       xyz_DDPressDDPress(:,:,k) = xyz_DPressDz(:,:,k) / xyz_DPressDz(:,:,k-1)
       xyz_DPFact(:,:,k) = RAir / Cp * ( xyz_Press(:,:,k-1) - xyz_Press(:,:,k) ) / ( xyz_DPressDz(:,:,k-1) + xyz_DPressDz(:,:,k) ) / xyr_Press(:,:,k)
    end do

    !----- 調節 ------    
    xy_Adjust_b = 1.0d0

    !----- 3.1 イテレーション ------    
    do Iteration = 1, IterationMax
       xy_Adjust = 0.0d0

       do k = 2, km
          do i = 1, im
             do j = 1, jm 
                if ( xy_Adjust_b(i,j) .GT. 0.9 ) then
                   
                   TempSat = xyz_Temp(i,j,k-1) - xyz_Temp(i,j,k) - xyz_DPFact(i,j,k) * ( xyz_DPressDz(i,j,k-1) * xyz_Temp(i,j,k-1) + xyz_DPressDz(i,j,k) * xyz_Temp(i,j,k) )
                   
                   ! 不安定であるならば
                   if ( TempSat .GT. TempSatMax(Iteration) ) then
                      
                      DelTemp = TempSat / ( 1. + xyz_DDPressDDPress(i,j,k) )
                      xyz_Temp(i,j,k) = xyz_Temp(i,j,k) + DelTemp
                      xyz_Temp(i,j,k-1) = xyz_Temp(i,j,k-1) - DelTemp * xyz_DDPressDDPress(i,j,k)
                      
                      ! 調節したか否か
                      xy_Adjust(i,j) = 1.
                   end if

                end if
             end do
          end do
       end do

       Adjust = 0. 
       do i = 1, im
          do j = 1, jm
             xy_Adjust_b(i,j) = xy_Adjust(i,j)
             Adjust           = Adjust +  xy_Adjust(i,j)
          end do
       end do
       
       if ( Adjust .LT. 1. ) exit
       
    end do

    !----- 比湿変化率, 温度変化率, 降水量の算出 ----- 

    ! 温度変化率
    xyz_DDryTempDt = xyz_DDryTempDt + ( xyz_Temp - xyz_Temp_b ) / DelTimePhy
    
    !----------------------------------------------------------------
    !   終了処理
    !----------------------------------------------------------------
    call EndSub(subname)

  end subroutine physics_dryadjust

[Validate]