Class FillNegative_3d
In: util/fillnegative_3d.f90

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

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

Methods

Included Modules

dc_types dc_message gridset_3d

Public Instance methods

Subroutine :
xyza_VarBasic(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) :real(DP), intent(in)
xyz_DensBasic(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) :real(DP), intent(in)

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

[Source]

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

    implicit none

    !入力変数
    real(DP), intent(in) :: xyza_VarBasic(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum)
    real(DP), intent(in) :: xyz_DensBasic(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax)

    !初期化
    allocate( xyza_Basic(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum), xyz_Dens  (DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax )          )
    
    !値の代入
    xyza_Basic = xyza_VarBasic
    xyz_Dens   = xyz_DensBasic

  end subroutine FillNegative_Init
xyz_Dens
Variable :
xyz_Dens(:,:,:) :real(DP), allocatable
xyza_Basic
Variable :
xyza_Basic(:,:,:,:) :real(DP), allocatable
Function :
xyza_FillNegative_xyza(DimXMin:DimXMax,DimYMin:DImYMax,DimZMin:DimZMax, SpcNum) :real(DP)
xyza_Var(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) :real(DP), intent(inout)

[Source]

  function xyza_FillNegative_xyza( xyza_Var )
    
    implicit none

    real(DP), intent(inout) :: xyza_Var(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum)
    real(DP) :: xyza_FillNegative_xyza(DimXMin:DimXMax,DimYMin:DImYMax,DimZMin:DimZMax, SpcNum)
    real(DP) :: xyza_DQFILL(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum)
    real(DP) :: xyza_QSUMPN(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum)
    real(DP), parameter     :: EPS = 1.0d-60  !零での割り算を防ぐ
    integer                :: i, j, k
    
    !初期化
    xyza_QSUMPN = 0.0d0
    xyza_DQFILL = 0.0d0


    do k = DimZMin+2, DimZMax-2
      do j = DimYMin+2, DimYMax-2
        do i = DimXMin+2, DimXMax-2
          xyza_QSUMPN(i,j,k,:) = 1.0d0 / ( (    MAX( 0.0d0, xyza_Basic(i-1,j,k,:) + xyza_Var(i-1,j,k,:) ) * xyz_Dens(i-1,j,k) + MAX( 0.0d0, xyza_Basic(i+1,j,k,:) + xyza_Var(i+1,j,k,:) ) * xyz_Dens(i+1,j,k) + MAX( 0.0d0, xyza_Basic(i,j-1,k,:) + xyza_Var(i,j-1,k,:) ) * xyz_Dens(i,j-1,k) + MAX( 0.0d0, xyza_Basic(i,j+1,k,:) + xyza_Var(i,j+1,k,:) ) * xyz_Dens(i,j+1,k) + MAX( 0.0d0, xyza_Basic(i,j,k-1,:) + xyza_Var(i,j,k-1,:) ) * xyz_Dens(i,j,k-1) + MAX( 0.0d0, xyza_Basic(i,j,k+1,:) + xyza_Var(i,j,k+1,:) ) * xyz_Dens(i,j,k+1) ) * 0.75d0 + (   MAX( 0.0d0, xyza_Basic(i-2,j,k,:) + xyza_Var(i-2,j,k,:) ) * xyz_Dens(i-2,j,k) + MAX( 0.0d0, xyza_Basic(i+2,j,k,:) + xyza_Var(i+2,j,k,:) ) * xyz_Dens(i+2,j,k) + MAX( 0.0d0, xyza_Basic(i,j-2,k,:) + xyza_Var(i,j-2,k,:) ) * xyz_Dens(i,j-2,k) + MAX( 0.0d0, xyza_Basic(i,j+2,k,:) + xyza_Var(i,j+2,k,:) ) * xyz_Dens(i,j+2,k) + MAX( 0.0d0, xyza_Basic(i,j,k-2,:) + xyza_Var(i,j,k-2,:) ) * xyz_Dens(i,j,k-2) + MAX( 0.0d0, xyza_Basic(i,j,k+2,:) + xyza_Var(i,j,k+2,:) ) * xyz_Dens(i,j,k+2) ) * 0.25d0 + EPS ) 
        end do
      end do
    end do

    do k = DimZMin+2, DimZMax-2
      do j = DimYMin+2, DimYMax-2
         do i = DimXMin+2, DimXMax-2
          xyza_DQFILL(i,j,k,:) = - MIN( 0.0d0, xyza_Basic(i,j,k,:) + xyza_Var(i,j,k,:) ) + MAX( 0.0d0, xyza_Basic(i,j,k,:) + xyza_Var(i,j,k,:) ) * ( ( MIN( 0.0d0, xyza_Basic(i-1,j,k,:) + xyza_Var(i-1,j,k,:) ) * xyza_QSUMPN(i-1,j,k,:) * xyz_Dens(i-1,j,k) + MIN( 0.0d0, xyza_Basic(i+1,j,k,:) + xyza_Var(i+1,j,k,:) ) * xyza_QSUMPN(i+1,j,k,:) * xyz_Dens(i+1,j,k) + MIN( 0.0d0, xyza_Basic(i,j-1,k,:) + xyza_Var(i,j-1,k,:) ) * xyza_QSUMPN(i,j-1,k,:) * xyz_Dens(i,j-1,k) + MIN( 0.0d0, xyza_Basic(i,j+1,k,:) + xyza_Var(i,j+1,k,:) ) * xyza_QSUMPN(i,k+1,k,:) * xyz_Dens(i,j+1,k) + MIN( 0.0d0, xyza_Basic(i,j,k-1,:) + xyza_Var(i,j,k-1,:) ) * xyza_QSUMPN(i,j,k-1,:) * xyz_Dens(i,j,k-1) + MIN( 0.0d0, xyza_Basic(i,j,k+1,:) + xyza_Var(i,j,k+1,:) ) * xyza_QSUMPN(i,j,k+1,:) * xyz_Dens(i,j,k+1) ) * 0.75d0 + ( MIN( 0.0d0, xyza_Basic(i-2,j,k,:) + xyza_Var(i-2,j,k,:) ) * xyza_QSUMPN(i-2,j,k,:) * xyz_Dens(i-2,j,k) + MIN( 0.0d0, xyza_Basic(i+2,j,k,:) + xyza_Var(i+2,j,k,:) ) * xyza_QSUMPN(i+2,j,k,:) * xyz_Dens(i+2,j,k) + MIN( 0.0d0, xyza_Basic(i,j-2,k,:) + xyza_Var(i,j-2,k,:) ) * xyza_QSUMPN(i,j-2,k,:) * xyz_Dens(i,j-2,k) + MIN( 0.0d0, xyza_Basic(i,j+2,k,:) + xyza_Var(i,j+2,k,:) ) * xyza_QSUMPN(i,j+2,k,:) * xyz_Dens(i,j+2,k) + MIN( 0.0d0, xyza_Basic(i,j,k-2,:) + xyza_Var(i,j,k-2,:) ) * xyza_QSUMPN(i,j,k-2,:) * xyz_Dens(i,j,k-2) + MIN( 0.0d0, xyza_Basic(i,j,k+2,:) + xyza_Var(i,j,k+2,:) ) * xyza_QSUMPN(i,j,k+2,:) * xyz_Dens(i,j,k+2) ) * 0.25d0 )
        end do
      end do
    end do
   

    !出力
    xyza_FillNegative_xyza = xyza_Var + xyza_DQFILL
    
  end function xyza_FillNegative_xyza

[Validate]