!c Description:
!c   境界条件
!c
!c Current Code Owner:
!c   sugiyama@gfd-dennou.org
!c
!c Copyright (C) SUGIYAMA Ko-ichiro, 2004, All rights reserved

module if_boundary
  interface boundary

     subroutine boundary2d(type, var)
       use gridset
       character(*), intent(in)   :: type
       real(8), intent(inout)     :: var(DimXMin:DimXMax, DimZMin:DimZMax)
     end subroutine boundary2d

  end interface
end module if_boundary

subroutine boundary2d(type, var)
  !--- モジュールの読み込み
  use gridset

  !--- 暗黙の型宣言禁止
  implicit none

  !--- 入出力変数
  character(*), intent(in)   :: type
  real(8), intent(inout)     :: var(DimXMin:DimXMax, DimZMin:DimZMax)

  !--- 内部変数
  integer   :: i

  if (type == "CC") then
     !--- x 方向: 周期境界
     do i = 0, Margin
        var(RegXMin - i , RegZMin:RegZMax) &
             & = var(RegXMax - i , RegZMin:RegZMax)
     end do
     do i = 1, Margin
        var(RegXMax + i , RegZMin:RegZMax) &
             & = var(RegXMin + i , RegZMin:RegZMax)
     end do

     !--- z 方向: 周期境界
     do i = 0, Margin
        var(:, RegZMin - i) = var(:, RegZMax - i)
     end do
     do i = 1, Margin
        var(:, RegZMax + i) = var(:, RegZMin + i)
     end do

  elseif (type == "CsS") then
     !--- x 方向: 周期境界
     do i = 0, Margin
        var(RegXMin - i , RegZMin:RegZMax) &
             & = var(RegXMax - i , RegZMin:RegZMax)
     end do
     do i = 1, Margin
        var(RegXMax + i , RegZMin:RegZMax) &
             & = var(RegXMin + i , RegZMin:RegZMax)
     end do

     !--- z 方向: 対称
     do i = 0, Margin
        var(:, RegZMin - i) = var(:, RegZMin + 1 + i )
     end do
     do i = 1, Margin
        var(:, RegZMax + i ) = var(:, RegZMax - i - 1 )
     end do

  elseif (type == "CfS") then
     !--- x 方向: 周期境界
     do i = 0, Margin
        var(RegXMin - i , RegZMin:RegZMax) &
             & = var(RegXMax - i , RegZMin:RegZMax)
     end do
     do i = 1, Margin
        var(RegXMax + i , RegZMin:RegZMax) &
             & = var(RegXMin + i , RegZMin:RegZMax)
     end do

     !--- z 方向: 対称
     var(:, RegZMin) = 0.0d0
     var(:, RegZMax) = 0.0d0
     do i = 1, Margin
        var(:, RegZMin - i) = var(:, RegZMin + i )
     end do
     do i = 1, Margin
        var(:, RegZMax + i ) = var(:, RegZMax - i )
     end do

  elseif (type == "CsA") then
     !--- x 方向: 周期境界
     do i = 0, Margin
        var(RegXMin - i , RegZMin:RegZMax) &
             & = var(RegXMax - i , RegZMin:RegZMax)
     end do
     do i = 1, Margin
        var(RegXMax + i , RegZMin:RegZMax) &
             & = var(RegXMin + i , RegZMin:RegZMax)
     end do

     !--- z 方向: 反対称
     do i = 0, Margin
        var(:, RegZMin - i) = - var(:, RegZMin + 1 + i )
     end do
     do i = 1, Margin
        var(:, RegZMax + i) = - var(:, RegZMax - i - 1)
     end do

  elseif (type == "CfA") then
     !--- x 方向: 周期境界
     do i = 0, Margin
        var(RegXMin - i , RegZMin:RegZMax) &
             & = var(RegXMax - i , RegZMin:RegZMax)
     end do
     do i = 1, Margin
        var(RegXMax + i , RegZMin:RegZMax) &
             & = var(RegXMin + i , RegZMin:RegZMax)
     end do

     !--- z 方向: 反対称
     var(:, RegZMin) = 0.0d0
     var(:, RegZMax) = 0.0d0
     do i = 1, Margin
        var(:, RegZMin - i) = - var(:, RegZMin + i )
     end do
     do i = 1, Margin
        var(:, RegZMax + i) = - var(:, RegZMax - i )
     end do

  elseif (type == "SC") then
     !--- x 方向: 対称
     do i = 0, Margin
        var(RegXMin - i, RegZMin:RegZMax) &
             & = var(RegXMin + 1 + i, RegZMin:RegZMax )
     end do
     do i = 1, Margin
        var(RegXMax + i, RegZMin:RegZMax) &
             & = var(RegXMax - i - 1, RegZMin:RegZMax )
     end do

     !--- z 方向: 周期境界
     do i = 0, Margin
        var(RegXMin:RegXMax, RegZMin - i) &
             & = var(RegXMin:RegXMax, RegZMax - i)
     end do
     do i = 1, Margin
        var(RegXMin:RegXMax, RegZMax + i) &
             & = var(RegXMin:RegXMax, RegZMin + i)
     end do

  elseif (type == "AC") then
     !--- x 方向: 反対称
     var(RegXMin, RegZMin:RegZMax) = 0.0d0
     var(RegXMax, RegZMin:RegZMax) = 0.0d0
     do i = 0, Margin
        var(RegXMin - i, RegZMin:RegZMax) &
             & = - var(RegXMin + 1 + i, RegZMin:RegZMax)
     end do
     do i = 1, Margin
        var(RegXMax + i, RegZMin:RegZMax) &
             & = - var(RegXMax - i - 1, RegZMin:RegZMax)
     end do

     !--- z 方向: 周期境界
     do i = 0, Margin
        var(RegXMin:RegXMax, RegZMin - i) &
             & = var(RegXMin:RegXMax, RegZMax - i)
     end do
     do i = 1, Margin
        var(RegXMin:RegXMax, RegZMax + i) &
             & = var(RegXMin:RegXMax, RegZMin + i)
     end do

  elseif (type == "SS") then
     !--- x 方向: 対称
     do i = 0, Margin
        var(RegXMin - i, RegZMin:RegZMax) &
             & = var(RegXMin + 1 + i, RegZMin:RegZMax )
     end do
     do i = 1, Margin
        var(RegXMax + i, RegZMin:RegZMax) &
             & = var(RegXMax - i - 1, RegZMin:RegZMax )
     end do

     !--- z 方向: 対称
     do i = 0, Margin
        var(RegXMin:RegXMax, RegZMin - i) &
             & = var(RegXMin:RegXMax, RegZMin + 1 + i )
     end do
     do i = 1, Margin
        var(RegXMin:RegXMax, RegZMax - i + 1) &
             & = var(RegXMin:RegXMax, RegZMax + i )
     end do

  elseif (type == "AA") then
     !--- x 方向: 反対称
     var(RegXMin, RegZMin:RegZMax) = 0.0d0
     var(RegXMax, RegZMin:RegZMax) = 0.0d0
     do i = 0, Margin
        var(RegXMin - i, RegZMin:RegZMax) &
             & = - var(RegXMin + 1 + i, RegZMin:RegZMax)
     end do
     do i = 1, Margin
        var(RegXMax + i, RegZMin:RegZMax) &
             & = - var(RegXMax - i - 1, RegZMin:RegZMax)
     end do

     !--- z 方向: 反対称
     var(:, RegZMin) = 0.0d0
     var(:, RegZMax) = 0.0d0
     do i = 0, Margin
        var(:, RegZMin - i) = - var(:, RegZMin + 1 + i )
     end do
     do i = 1, Margin
        var(:, RegZMax + i) = - var(:, RegZMax - i - 1)
     end do

  else
     write(*,*) "boundary.f90: Unknown Boundary Type", type
     stop

  end if

end subroutine boundary2d