!---------------------------------------------------------------------
!     Copyright (C) GFD Dennou Club, 2005. All rights reserved.
!---------------------------------------------------------------------
                                                                 !=begin
!= Module spml_mod
!
!   * Developers: Morikawa Yasuhiro
!   * Version: $Id: spml.f90,v 1.6 2005/01/20 11:02:09 morikawa Exp $
!   * Tag Name: $Name: dcpam2-20050405 $
!   * Change History: 
!
!== Overview
!
!This module is wrapper of
!((<wa_module|URL:http://www.gfd-dennou.org/arch/spmodel/spml/doc/wa_module.htm>))
!in ((<SPMODEL|URL:http://www.gfd-dennou.org/arch/spmodel>)).
!
!
!((<SPMODEL ライブラリ|URL:http://www.gfd-dennou.org/arch/spmodel>))の
!((<wa_module|URL:http://www.gfd-dennou.org/arch/spmodel/spml/doc/wa_module.htm>))
!のラッパーモジュールである。
!他のモジュールから SPMODEL のサブルーチンおよび関数を
!呼ぶ場合には、原則的にこのモジュールを介して呼び出す。
!
!
!
!== Error Handling
!
!== Known Bugs
!
!== Note
!
!((<wa_module|URL:http://www.gfd-dennou.org/arch/spmodel/spml/doc/wa_module.htm>))
!の全ての関数をそのまま利用できるよう、private をつけていない。
!実際にこのモジュールで行なっているのは、初期化を複数回行なわないように
!しているだけである。
!
!== Future Plans
!
                                                                 !=end
module spml_mod
                                                                 !=begin
  !== Dependency
  !
  !このモジュール内部で用いるだけでなく、力学コアなどに wa_module の
  !関数群を提供するという意味で、敢えて only 属性をつけていない。
  !(本来は必要な全ての関数を指定すべきであろうが)。
  !
  use wa_module
  use w_module,   only : rn
  use type_mod,   only : STRING
                                                                 !=end
  implicit none
                                                                 !=begin
  !== Public Interface
  public :: spml_init, spml_end  ! subroutines

  !その他、((<wa_module|URL:http://www.gfd-dennou.org/arch/spmodel/spml/doc/wa_module.htm>))
  !で提供される関数群。
                                                                 !=end
!!$  private
!!$  public :: spml_init, spml_end

  logical, private, save :: spml_initialized = .false.
  character(STRING),parameter:: version = &
       & '$Id: spml.f90,v 1.6 2005/01/20 11:02:09 morikawa Exp $'
  character(STRING),parameter:: tagname = '$Name: dcpam2-20050405 $'

contains
                                                                 !=begin
  !== Procedure Interface
  !
  !=== Initialize wa_module
  !
  !((<wa_module|URL:http://www.gfd-dennou.org/arch/spmodel/spml/doc/wa_module.htm>))
  !の初期化関数
  !((<wa_Initial|URL:http://www.gfd-dennou.org/arch/spmodel/spml/doc/wa_module.htm#wa_Initial>))
  !を呼ぶ。
  !
  subroutine spml_init
  !
  !==== Dependency
  !
    use type_mod           , only: INTKIND, STRING
    use grid_3d_mod        , only: im, jm, km, grid_3d_init
    use grid_wavenumber_mod, only: nm, grid_wavenumber_init
    use dc_trace,    only: DbgMessage, BeginSub, EndSub
    use dc_error,    only: StoreError, USR_ECHAR
    use wa_module,   only: wa_Initial
                                                                 !=end
    implicit none

    !-------------------------------------------------------------------
    !   変数定義
    !-------------------------------------------------------------------
    character(STRING), parameter:: subname = "spml_init"

  continue
    !----------------------------------------------------------------
    !   Check Initialization
    !----------------------------------------------------------------
    call BeginSub(subname)
    if (spml_initialized) then
       call EndSub( subname, '%c is already called', c1=trim(subname) )
       return
    else
       spml_initialized = .true.
    endif

    !----------------------------------------------------------------
    !   Version identifier
    !----------------------------------------------------------------
    call DbgMessage('%c :: %c', c1=trim(version), c2=trim(tagname))

    !----------------------------------------------------------------
    !   grid_3d_mod と grid_wavenumber による初期化
    !----------------------------------------------------------------
    call grid_3d_init
    call grid_wavenumber_init

    !----------------------------------------------------------------
    !   wa_initial による初期化
    !----------------------------------------------------------------
    call wa_Initial(nm,im,jm,km)

    call EndSub( subname, 'wa_initial(nm=<%d>, im=<%d>, jm=<%d>, km=<%d>)', &
         &       i=(/nm, im, jm, km/) )
  end subroutine spml_init


                                                                 !=begin
  !=== Terminate module
  !
  !現状では wa_Initial を解除できないので、
  !何もしない。
  !wa_Initial による初期化を解除できるのなら、
  !((<spml_init>)) による初期化フラグをオフにすべきである。
  !
  subroutine spml_end
  !==== Dependency
    use type_mod,  only: INTKIND, STRING
    use dc_trace,  only: DbgMessage, BeginSub, EndSub
                                                                 !=end
    implicit none
    character(STRING), parameter:: subname = "spml_end"

    !----------------------------------------------------------------
    !   Check Initialization
    !----------------------------------------------------------------
    call BeginSub(subname)
    if ( .not. spml_initialized) then
       call EndSub( subname, 'spml_init was not called', &
            &       c1=trim(subname) )
       return
    else
       ! 初期化を解除できないので .true. のまま
!       spml_initialized = .false.
       spml_initialized = .true.
    endif

    call EndSub( subname, 'spml_init can not release')
  end subroutine spml_end

end module spml_mod
