!---------------------------------------------------------------------
!     Copyright (C) GFD Dennou Club, 2004. All rights reserved.
!---------------------------------------------------------------------
                                                                 !=begin
!= Module BcSet
!
!   * Developer: SUGIYAMA Ko-ichiro (sugiyama@gfd-dennou.org)
!   * Version: $Id: bcset.f90,v 1.4 2005/02/02 10:07:26 odakker Exp $ 
!   * Tag Name: $Name:  $
!   * Change History: 
!
!== Overview 
!
!境界条件のタイプを設定するためのモジュール. 
!選択できる境界条件は以下の通り.
!   * 周期境界条件 (水平方向のみ)
!   * 固定壁
!   * 自由境界
!
!== Error Handling
!
!== Known Bugs
!
!水平方向の境界条件は周期境界しかコーディングされていない.
!
!
!== Note
!
!deepconv/arare の離散化では鉛直方向に周期境界条件を取れないことに注意. 
!水平, 鉛直ともに摩擦無し境界条件は, 移流のテスト計算用.
!
!== Future Plans
!
!水平方向の境界条件として固定壁をコーディング
!
                                                                 !=end

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

  !--- save 属性
  save
                                                                 !=begin
  !== Public Interface
  character(4)          :: ss_Bc        !境界(スカラー量)
  character(4)          :: fs_Bc        !境界(ベクトル u)
  character(4)          :: sf_Bc        !境界(ベクトル w)
                                                                 !=end
contains
                                                                 !=begin
  !== Procedure Interface 
  !
  !=== Initialize module and acquire NAMELIST
  !
  !NAMELIST から境界条件のタイプを設定する. 
  !NAMELIST 名は外部から設定する.
  !
  !スカラーな変数とベクトルな変数では, 同じ固定壁/自由境界でも
  !境界のあたえ方が異なる. そのため BcX では, 
  !   * C: 周期境界条件 (水平方向のみ)
  !   * R: 固定壁
  !   * F: 自由境界
  !を与え, **_Bc では, 
  !   * C: 周期境界条件 (水平方向のみ)
  !   * sA: スカラー量を境界を挟んで半対称
  !   * fA: ベクトル量を境界を挟んで半対称
  !   * sS: スカラー量を境界を挟んで対称
  !   * fA: ベクトル量を境界を挟んで半対称
  !を与える

  subroutine bcset_init(cfgfile)

    !== Dependency
    use dc_trace, only: BeginSub, EndSub
    use dc_message,only: MessageNotify

    !=== Input
    character(*), intent(in) :: cfgfile
                                                                   !=end
    character(2)       :: BcX
    character(2)       :: BcZ
                                                                   !=begin
    !=== NAMELIST    
    NAMELIST /bcset/ BcX, BcZ
                                                                   !=end

    open (10, FILE=cfgfile)
    read(10, NML=bcset)
    close(10)

    call BeginSub("bcset_init", &
&                 fmt="%c",       &
&                 c1="Initialize boundary conditions. ")
    

    !--- 境界のタイプを指定 (boundary.f90 参照)
    if (trim(BcX) == "C" .AND. trim(BcZ) == "R") then        
       ss_Bc = "CsS"   
       fs_Bc = "CsA"
       sf_Bc = "CfA"

    elseif (trim(BcX) == "C" .AND. trim(BcZ) == "F") then        
       ss_Bc = "CsS"   
       fs_Bc = "CsS"
       sf_Bc = "CfA"

    !--- test 2005-01-13
    elseif (trim(BcX) == "C" .AND. trim(BcZ) == "RF") then        
       ss_Bc = "CsS"   
       fs_Bc = "CsAS"
       sf_Bc = "CfA"

    !--- 移流計算テスト用の境界条件. 実際の問題を解く場合には
    !--- 使用しないこと (2005/02/02 小高正嗣)
    elseif (trim(BcX) == "F" .AND. trim(BcZ) == "F") then        
       ss_Bc = "sSsS"   
       fs_Bc = "fSsS"
       sf_Bc = "sSfS"

    else 
       call MessageNotify("Error", "bcset_init", &
&                         "unknown boundary condition" )
    end if

    call EndSub("bcset_init")

  end subroutine bcset_init
  
end module bcset



