Class physics_negq_mod
In: physics/physics_negq.f90

Methods

Included Modules

type_mod grid_3d_mod spml_mod dc_trace

Public Instance methods

Subroutine :
xyz_Qvap(im,jm,km) :real(DBKIND), intent(inout)
: intent(inout): 比湿変化率
xyz_DNegQvapDt(im,jm,km) :real(DBKIND), intent(inout)
: intent(inout): 比湿変化率
xyr_Press(im,jm,km+1) :real(DBKIND), intent(in)
: intent(in): 2Δt
DelTimePhy :real(DBKIND), intent(in)
: intent(in): 2Δt

[Source]

  subroutine physics_negq(xyz_Qvap, xyz_DNegQvapDt, xyr_Press, DelTimePhy)

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

    implicit none

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

    !==== In/Out
    !
    real(DBKIND), intent(inout) :: xyz_Qvap(im,jm,km)     , xyz_DNegQvapDt(im,jm,km)     ! intent(inout): 比湿変化率

    !----- 作業用内部変数 -----
    character(STRING),  parameter:: subname = "physics_negq"
    real(DBKIND)        :: xyz_Qvap_b(im,jm,km)              , xyz_DPressDz(im,jm,km)            , xyz_Qvap_DPressDz(im,jm,km)       , xyz_DelQvap_DPressDz(im,jm,km)    , Qvap_DPressDz_AvrXYZ              , DelQvap_DPressDz_AvrXYZ               ! \int<ΔqΔp>dz

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


    continue

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

    !----------------------------------------------------------------
    !   負の水蒸気の補正
    !----------------------------------------------------------------

    !----- 調節前 Qvap の保存, ΔPress の計算 -----
    do k = 1, km
       do i = 1, im
          do j = 1, jm
             xyz_Qvap_b(i,j,k)   = xyz_Qvap(i,j,k)
             xyz_DPressDz(i,j,k) = xyr_Press(i,j,k) - xyr_Press(i,j,k+1)
          end do
       end do
    end do

    !----- 局所補正 ----- (最下層に負値を追いやる?)
    do k = km, 2, -1
       do i = 1, im
          do j = 1, jm
             if ( xyz_Qvap(i,j,k) < 0 ) then 
                Work = - xyz_Qvap(i,j,k) * xyz_DPressDz(i,j,k) / xyz_DPressDz(i,j,k-1) 
                xyz_Qvap(i,j,k) = 0.0d0
                xyz_Qvap(i,j,k-1) = xyz_Qvap(i,j,k-1) - Work
             end if
          end do
       end do
    end do

    !----- 全球補正 ----- 
    ! 各層における補正量の算出
    do k = 1, km
       do i = 1, im
          do j = 1, jm
             xyz_Qvap_DPressDz(i,j,k) = xyz_Qvap(i,j,k) * xyz_DPressDz(i,j,k) 
             if ( xyz_Qvap_DPressDz(i,j,k) < 0 ) then 
                xyz_DelQvap_DPressDz(i,j,k) = - xyz_Qvap_DPressDz(i,j,k)
             else
                xyz_DelQvap_DPressDz(i,j,k) = 0.0d0
             end if
          end do
       end do
    end do

    ! 補正量の東西南北鉛直平均
    Qvap_DPressDz_AvrXYZ = 0.0d0
    DelQvap_DPressDz_AvrXYZ = 0.0d0
    do k = 1, km
       Qvap_DPressDz_AvrXYZ    = Qvap_DPressDz_AvrXYZ + AvrLonLat_xy( xyz_Qvap_DPressDz(:,:,k) )
       DelQvap_DPressDz_AvrXYZ = DelQvap_DPressDz_AvrXYZ + AvrLonLat_xy( xyz_DelQvap_DPressDz(:,:,k) )
    end do


    ! 全体を引き下げる, 負値をゼロにする
    if ( Qvap_DPressDz_AvrXYZ .ne. 0.0d0 ) then 
       do k = 1, km
          do i = 1, im
             do j = 1, jm
                xyz_Qvap(i,j,k) = Qvap_DPressDz_AvrXYZ / (Qvap_DPressDz_AvrXYZ + DelQvap_DPressDz_AvrXYZ) * Max( xyz_Qvap(i,j,k) , 0.0d0 )             
             end do
          end do
       end do
    end if

    !----- 比湿変化の算出 ----- 
    do k = 1, km
       do i = 1, im
          do j = 1, jm
             xyz_DNegQvapDt(i,j,k) = xyz_DNegQvapDt(i,j,k) + ( xyz_Qvap(i,j,k) - xyz_Qvap_b(i,j,k) ) / DelTimePhy
          end do
       end do
    end do

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

  end subroutine physics_negq

[Validate]