!> \~japanese
!! \brief 正二十面体格子データを含む NetCDF ファイルを読み込み, 構造型 IcGrid2D_FVM の変数に設定するサブルーチンを
!!提供するモジュール.
!!
!! \par IcGrid_ncGridLoader モジュールについて
!!
!! \~english
!! \brief This module provides some subroutines to read the NetCDF file containg icosahedral grid data,
!! and store the data into a variable of derived type IcGrid2D_FVM.
!!
!! \par About IcGrid_ncGridLoader module
!!
!! \~
!!
!! <br><br>
!! \b Copyright (C) GFD Dennou Club, 2011-2012. All rights reserved. <br>
!! \b license ?? <br>
!! \author Yuta Kawai
!!
module IcGrid_ncGridLoader

  ! モジュール引用 ; Use statement
  !

  !* gtool5 *************
  !*

  ! 種類型パラメータ
  ! Kind type parameter
  !
  use dc_types, only: TOKEN, &
    &                 STRING 

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

  !* IGMBaseLib *************
  !*
  
  ! 正二十面体格子データの管理
  ! Manager of icosahedral grid
  !
  use IcGrid2D_FVM_Manager, only: &
    & IcGrid2D_FVM, &
    & malloc_GP_array, malloc_CV_array, &
    & get_LocalProcRectInfo

  ! 正二十面格子における広域矩形領域のサブドメインである局所矩形領域(各 MPI プロセスと対応)の情報管理
  ! Manager of information about a local rectangle region (corresponding to each MPI process)
  !
  use LocalProcRect_Manager, only: &
    & LocalProcRectInfo

  ! NetCDF からの正二十面格子格子データおよび物理場データの読み込み
  ! Reading icosahedral grid and physical field data from NetCDF
  !
  use IcGrid_ncReader_mod, only: &
    & IcGrid_ncReader, &
    & IcGrid_ncReader_Init, open_ncfile, read_GridData, close_ncfile

  ! 各種正二十面体格子の生成
  ! Construction of various icosahedral grids
  !
  use IcGrid2D_FVM_Builder, only: &
    & calc_CV_vertex, calc_CV_Area

  ! 宣言文 ; Declaration statement
  !
  implicit none
  private

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

  ! 公開変数
  ! Public variables
  !

  ! interface 文; interface statements
  !
  interface load_gridData
    module procedure load_grid2DData
  end interface load_gridData

contains

! 
!> \~japanese
!! \brief 正二十面体格子データが書き込まれた NetCDF ファイルを読み込み, 構造型 IcGrid2D_FVM の変数に設定する.
!!
!! NetCDF ファイルから正二十面格子データを読み込むと同時に, それを用いてコントロールボリュームの頂点座標および面積も計算し,
!! それらのデータを icgrid に対して設定する.
!!
!! @attention 第 2 番目の引数 icgrid は, initialize_IcGrid2D_FVM によって初期化されていなければならない.
!! malloc_GP_array(), malloc_CV_array() に関しては, 内部で呼び出される.
!!
!!
!! @param[in] ncfile_path NetCDF ファイルへのパス.
!! @param[in] icgrid initialize_IcGrid2D_FVM によって初期化された構造型 IcGrid2D_FVM の変数.
!!
!! \~english
!! \brief Reads the NetCDF file containg icosahedral grid data, and stores the data in the variable of derived type IcGrid2D_FVM.
!!
!! NetCDF ファイルから読み込んだ正二十面格子データを読み込むと同時に, それを用いてコントロールボリュームの頂点座標および面積を計算し,
!! icgrid に対して設定する.
!!
!! @attention The second argument icgrid  must be initialized by initialize_IcGrid2D_FVM,
!! while malloc_GP_array() and malloc_CV_array() will be called in this procedure.
!!
!! @param[in] ncfile_path The path to the NetCDF file.
!! @param[in] icgrid The variable of derived type IcGrid2D_FVM initialized by initialize_IcGrid2D_FVM.
!!
subroutine load_grid2DData( &
  & ncfile_path,            &  ! (in)
  & icgrid                 &  ! (inout)
  & )

  ! 宣言文 ; Declaration statement
  !
  character(*), intent(in) :: ncfile_path
  type(IcGrid2D_FVM), intent(inout) :: icgrid
  
  ! 作業変数
  ! Work variables
  !
  type(IcGrid_ncReader) :: gridReader
  type(LocalProcRectInfo), pointer :: lcRCInfo
  logical :: parallelIOFlag = .false.

  ! 実行文 ; Executable statement
  !
  call MessageNotify( 'M', 'IGMBaseLib IO::IcGrid_ncGridLoader::load_gridData',  &
    & 'Load IcGrid data from the NetCDF file `%c` ...', &
    & c1=trim(ncfile_path), rank_mpi=0 )

  ! 正二十面体格子の格子点およびコントロールボリュームの座標情報を保持する配列のメモリが確保されていない場合には, 
  ! ここで確保を行う. 
  if ( .not. associated(icgrid%rcs_AGrid) ) then
    call malloc_GP_array(icgrid)
  end if

  if ( .not. associated(icgrid%rcs_CVInfo) ) then  
    call malloc_CV_array(icgrid)
  end if
  
  ! 次に, 格子座標データを格納した netCDF ファイルから格子座標データを読み取る.
  ! 読み取った格子座標情報は, IcGrid2D_FVM クラスのオブジェクトに保持される.
  lcRCInfo => get_LocalProcRectInfo(icgrid)

  call IcGrid_ncReader_Init(gridReader, icgrid, lcRCInfo%MPI_flag)
  call open_ncFile(gridReader, ncfile_path)
  call read_GridData(gridReader)
  call close_ncFile(gridReader)

  ! 各格子点に付随するコントールボリュームの頂点座標および
  ! コントールボリュームの面積を求める. 
  call calc_CV_vertex(icgrid)
  call calc_CV_Area(icgrid)
  
end subroutine load_grid2DData

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! 非公開手続き
!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

end module IcGrid_ncGridLoader
