!> \~japanese
!! \brief シミュレーションに必要な全てのパラメータを管理するモジュール.
!! \~english
!! \brief This module manages all paramers which are necessary for the simulation.
!! \~
!!
!! <br><br>
!! \b Copyright (C) GFD Dennou Club, 2011-2012. All rights reserved. <br>
!! \b license ?? <br>
!! \author Yuta Kawai
!! 
module param_manager
  
  ! モジュール引用 ; Use statements 
  !

  ! * gtool **
  ! *

  ! 種類型パラメータ
  ! Kind type parameter
  !
  use dc_types, only :DP, &    ! 倍精度実数型. Double precision. 
    &                 TOKEN, & ! 短い文字列型. 
    &                 STRING   ! 文字列型. 

  ! メッセージ出力
  ! Message dump
  !
  use dc_message, only : MessageNotify 

  ! * IGMBaseLib **
  ! *

  ! 地球における物理定数
  ! Physical constants on the earth
  !
  use Earth_Constants, only: &
    & earth_radius, &
    & earth_g,       &
    & earth_Omega

  ! 宣言文 ; Declaration statements
  !
  implicit none
  private

  ! 正二十面体格子の生成に関するパラメータ
  ! Parameters associated with the generation of icosahedral grid. 
  !

  !> \~japanese 水平分割レベル.
  !! \~english Horizontal division level.
  integer, public :: div_level  = 5

  !> \~japanese 正二十面体を内包する球の半径.
  !! \~english The radius of sphere embedded in an icosahedron.
  real(DP), public :: ic_radius = earth_radius

  !> \~japanese 格子点座標が記録されている netCDF のファイル名.
  !! \~english Name of NetCDF file recording vertecies on grid points.
  character(STRING), public :: gridData_ncFile = 'SPR-GC-grid_glevel5.nc' 
 

  ! 数値シュミレーションに関するパラメータ.  
  ! Parameters associated with the numerical simulation. 
  !

  !> \~japanese 自転角速度 [rad \f$ \rm s^{-1} \f$] .
  !! \~english  Angular speed [rad \f$ \rm s^{-1} \f$].
  real(DP), parameter, public :: Omega = earth_Omega

  !> \~japanese 重力加速度 [m \f$ \rm s^{-2} \f$].
  !! \~english Gravitational acceleration. [m \f$ \rm s^{-2} \f$]
  real(DP), parameter, public :: Grav = earth_g

  !> \~japanese 計算結果をデータファイルに書き出す時間間隔 [s].
  !! \~english Output time step. [s]
  real(DP), public :: output_tick

  !> \~japanese シミュレーション結果をファイルに書き出すかのフラグ.
  !! \~english Flag indicating whether the result of simulation will be written to the output file.
  logical, public :: data_output_flag

  !> \~japanese シミュレーション結果を書きだす NetCDF ファイルの名前.
  !! \~english The name of the NetCDF file to write the simulation result to.
  character(TOKEN), public :: output_data_ncFile

  !> \~japanese デカルト座標系の z 軸と xz 平面上に存在する自転軸がなす角 [rad].
  !! \~english The angle between z axis of the cartesian coordinate system and the axis of rotation lying in the x-z plane. [rad]
  real(DP), public :: alpha 

  !> \~japanese 時間刻み幅 [s].
  !! \~english Time step [s].
  real(DP), public :: DelTime
  
  !> \~japanese 積分時間 [s].
  !! \~english Integration time [s].
  real(DP), public :: integration_time

  !> \~japanese 運動方程式を有効にするかのフラグ.
  !! \~english Flag indicating whether the equation of motion is enable.
  logical, public :: motionEq_flag


  ! 公開手続き
  ! Public procedure
  !
  public :: read_namelistFile

contains

!
!> \~japanese
!! \brief シミュレーションパラメータ等を設定しているネームリストファイルを読み込む.
!!
!! @param[in] nml_filename ネームリストファイルの名前.
!!
!! \~english
!! \brief Reads the namelist file which configures some simulation parmeters.
!!
!! @param[in] nml_filename The name of namelist file.
!!
subroutine read_namelistFile(nml_filename)

  ! 宣言文 ; Declaration statements
  !
  character(*), intent(in) :: nml_filename
  integer :: deviceID = 10

  ! 作業変数
  ! Work variable
  !

  ! 正二十面体格子に関係するネームリスト. 
  ! Namelist for icosahedral grid.
  namelist /IcGrid_Config/ &
    & div_level, &
    & gridData_ncFile
  
  ! 数値シミュレーションに関係するネームリスト. 
  ! Namelist for the numerical simulation. 
  namelist /NumSim_Param/ &
    & alpha, &
    & output_tick, output_data_ncFile, data_output_flag, &
    & DelTime, integration_time, motionEq_flag

  ! 実行文 ; Executable statements
  !

  ! ネームリストファイルから各種パラメータを読み取り, 変数にセットする. 
  ! Read each of parameter from namelist file and assign values tp variables. 
  !

  call MessageNotify( "M", &
    & "IGModel-SW", "Reading namelist file `%c` ..", c1=trim(nml_filename) )
 
  open(deviceID, file=nml_filename, form='FORMATTED')
  read(deviceID, nml=IcGrid_Config)
  read(deviceID, nml=NumSim_Param)

end subroutine read_namelistFile

end module param_manager
 
