Class FillNegative
In: util/fillnegative.f90

負の雲水量などを穴埋めするためのルーチン

 * 負となった場合には, 周囲の 8 格子点の値を削って穴埋めする.

Methods

Included Modules

gridset

Public Instance methods

Subroutine :
xza_VarBasic(DimXMin:DimXMax, DimZMin:DimZMax, SpcNum) :real(8), intent(in)
xz_DensBasic(DimXMin:DimXMax, DimZMin:DimZMax) :real(8), intent(in)

基準値を取得. 基本場と擾乱成分の和がゼロよりも小さくなることは許容しない

[Source]

  subroutine FillNegative_Init( xza_VarBasic, xz_DensBasic )
    !
    ! 基準値を取得. 
    ! 基本場と擾乱成分の和がゼロよりも小さくなることは許容しない
    !

    implicit none

    !入力変数
    real(8), intent(in) :: xza_VarBasic(DimXMin:DimXMax, DimZMin:DimZMax, SpcNum)
    real(8), intent(in) :: xz_DensBasic(DimXMin:DimXMax, DimZMin:DimZMax)

    !初期化
    allocate( xza_Basic(DimXMin:DimXMax, DimZMin:DimZMax, SpcNum), xz_Dens(DimXMin:DimXMax, DimZMin:DimZMax )          )
    
    !値の代入
    xza_Basic = xza_VarBasic
    xz_Dens    = xz_DensBasic

  end subroutine FillNegative_Init
xz_Dens
Variable :
xz_Dens(:,:) :real(8), allocatable
Function :
xz_FillNegativeMMC_xz(DimXMin:DimXMax, DimZMin:DimZMax) :real(8)
xz_Var(DimXMin:DimXMax, DimZMin:DimZMax) :real(8), intent(inout)

主成分凝結対流用. 雲密度に対してのみ適用可能. 行なっていることは木星版と同じ.

[Source]

  function xz_FillNegativeMMC_xz( xz_Var )
    ! 主成分凝結対流用. 
    ! 雲密度に対してのみ適用可能. 
    ! 行なっていることは木星版と同じ. 

    implicit none

    real(8), intent(inout) :: xz_Var(DimXMin:DimXMax, DimZMin:DimZMax)
    real(8)                :: xz_FillNegativeMMC_xz(DimXMin:DimXMax, DimZMin:DimZMax)
    real(8)                :: xz_DQFILL(DimXMin:DimXMax, DimZMin:DimZMax)
    real(8)                :: xz_QSUMPN(DimXMin:DimXMax, DimZMin:DimZMax)
    real(8), parameter     :: EPS = 1.0d-60  !零での割り算を防ぐ
    integer                :: i, k
    
    !初期化
    xz_QSUMPN = 0.0d0
    xz_DQFILL = 0.0d0

!    do s = 1, SpcNum
!      write(*,*) s, xz_Min(2:20,48,s)
!    end do

      do k = DimZMin+2, DimZMax-2
        do i = DimXMin+2, DimXMax-2
          xz_QSUMPN(i,k) = 1.0d0 / ( (    MAX( 0.0d0, xz_Var(i-1,k) ) + MAX( 0.0d0, xz_Var(i+1,k) ) + MAX( 0.0d0, xz_Var(i,k-1) ) + MAX( 0.0d0, xz_Var(i,k+1) ) ) * 0.75d0 + (   MAX( 0.0d0, xz_Var(i-2,k) ) + MAX( 0.0d0, xz_Var(i+2,k) ) + MAX( 0.0d0, xz_Var(i,k-2) ) + MAX( 0.0d0, xz_Var(i,k+2) ) ) * 0.25d0 + EPS ) 
        end do
      end do

      do k = DimZMin+2, DimZMax-2
        do i = DimXMin+2, DimXMax-2
          xz_DQFILL(i,k) = - MIN( 0.0d0, xz_Var(i,k) ) + MAX( 0.0d0, xz_Var(i,k) ) * ( ( MIN( 0.0d0, xz_Var(i-1,k) ) * xz_QSUMPN(i-1,k) + MIN( 0.0d0, xz_Var(i+1,k) ) * xz_QSUMPN(i+1,k) + MIN( 0.0d0, xz_Var(i,k-1) ) * xz_QSUMPN(i,k-1) + MIN( 0.0d0, xz_Var(i,k+1) ) * xz_QSUMPN(i,k+1) ) * 0.75d0 + ( MIN( 0.0d0, xz_Var(i-2,k) ) * xz_QSUMPN(i-2,k) + MIN( 0.0d0, xz_Var(i+2,k) ) * xz_QSUMPN(i+2,k) + MIN( 0.0d0, xz_Var(i,k-2) ) * xz_QSUMPN(i,k-2) + MIN( 0.0d0, xz_Var(i,k+2) ) * xz_QSUMPN(i,k+2) ) * 0.25d0 )
        end do
      end do

!      write(*,*) sum( xz_DQFILL(DimXMin:DimXMax,DimZMin:DimZMax) )

    !出力
    xz_FillNegativeMMC_xz = xz_Var + xz_DQFILL
    
  end function xz_FillNegativeMMC_xz
xza_Basic
Variable :
xza_Basic(:,:,:) :real(8), allocatable
Function :
xza_FillNegative_xza(DimXMin:DimXMax, DimZMin:DimZMax, SpcNum) :real(8)
xza_Var(DimXMin:DimXMax, DimZMin:DimZMax, SpcNum) :real(8), intent(inout)

[Source]

  function xza_FillNegative_xza( xza_Var )
    
    implicit none

    real(8), intent(inout) :: xza_Var(DimXMin:DimXMax, DimZMin:DimZMax, SpcNum)
    real(8)                :: xza_FillNegative_xza(DimXMin:DimXMax, DimZMin:DimZMax, SpcNum)
    real(8)                :: xza_DQFILL(DimXMin:DimXMax, DimZMin:DimZMax, SpcNum)
    real(8)                :: xza_QSUMPN(DimXMin:DimXMax, DimZMin:DimZMax, SpcNum)
    real(8), parameter     :: EPS = 1.0d-60  !零での割り算を防ぐ
    integer                :: i, k, s
    
    !初期化
    xza_QSUMPN = 0.0d0
    xza_DQFILL = 0.0d0

!    do s = 1, SpcNum
!      write(*,*) s, xza_Min(2:20,48,s)
!    end do

    do s = 1, SpcNum
      do k = DimZMin+2, DimZMax-2
        do i = DimXMin+2, DimXMax-2
          xza_QSUMPN(i,k,s) = 1.0d0 / ( (    MAX( 0.0d0, xza_Basic(i-1,k,s) + xza_Var(i-1,k,s) ) * xz_Dens(i-1,k) + MAX( 0.0d0, xza_Basic(i+1,k,s) + xza_Var(i+1,k,s) ) * xz_Dens(i+1,k) + MAX( 0.0d0, xza_Basic(i,k-1,s) + xza_Var(i,k-1,s) ) * xz_Dens(i,k-1) + MAX( 0.0d0, xza_Basic(i,k+1,s) + xza_Var(i,k+1,s) ) * xz_Dens(i,k+1) ) * 0.75d0 + (   MAX( 0.0d0, xza_Basic(i-2,k,s) + xza_Var(i-2,k,s) ) * xz_Dens(i-2,k) + MAX( 0.0d0, xza_Basic(i+2,k,s) + xza_Var(i+2,k,s) ) * xz_Dens(i+2,k) + MAX( 0.0d0, xza_Basic(i,k-2,s) + xza_Var(i,k-2,s) ) * xz_Dens(i,k-2) + MAX( 0.0d0, xza_Basic(i,k+2,s) + xza_Var(i,k+2,s) ) * xz_Dens(i,k+2) ) * 0.25d0 + EPS ) 
        end do
      end do
    end do

    do s = 1, SpcNum
      do k = DimZMin+2, DimZMax-2
        do i = DimXMin+2, DimXMax-2
          xza_DQFILL(i,k,s) = - MIN( 0.0d0, xza_Basic(i,k,s) + xza_Var(i,k,s) ) + MAX( 0.0d0, xza_Basic(i,k,s) + xza_Var(i,k,s) ) * ( ( MIN( 0.0d0, xza_Basic(i-1,k,s) + xza_Var(i-1,k,s) ) * xza_QSUMPN(i-1,k,s) * xz_Dens(i-1,k) + MIN( 0.0d0, xza_Basic(i+1,k,s) + xza_Var(i+1,k,s) ) * xza_QSUMPN(i+1,k,s) * xz_Dens(i+1,k) + MIN( 0.0d0, xza_Basic(i,k-1,s) + xza_Var(i,k-1,s) ) * xza_QSUMPN(i,k-1,s) * xz_Dens(i,k-1) + MIN( 0.0d0, xza_Basic(i,k+1,s) + xza_Var(i,k+1,s) ) * xza_QSUMPN(i,k+1,s) * xz_Dens(i,k+1) ) * 0.75d0 + ( MIN( 0.0d0, xza_Basic(i-2,k,s) + xza_Var(i-2,k,s) ) * xza_QSUMPN(i-2,k,s) * xz_Dens(i-2,k) + MIN( 0.0d0, xza_Basic(i+2,k,s) + xza_Var(i+2,k,s) ) * xza_QSUMPN(i+2,k,s) * xz_Dens(i+2,k) + MIN( 0.0d0, xza_Basic(i,k-2,s) + xza_Var(i,k-2,s) ) * xza_QSUMPN(i,k-2,s) * xz_Dens(i,k-2) + MIN( 0.0d0, xza_Basic(i,k+2,s) + xza_Var(i,k+2,s) ) * xza_QSUMPN(i,k+2,s) * xz_Dens(i,k+2) ) * 0.25d0 )
        end do
      end do

!      write(*,*) sum( xza_DQFILL(DimXMin:DimXMax,DimZMin:DimZMax,s) )
    end do

    !出力
    xza_FillNegative_xza = xza_Var + xza_DQFILL
    
  end function xza_FillNegative_xza