!= 地表面温度リスタートデータ, 初期値データ入出力
!
!= Restart data, initial data of surface temperature input/output
!
! Authors::   Yasuhiro MORIKAWA
! Version::   $Id: restart_surftemp_io.F90,v 1.2 2008-11-08 06:41:24 morikawa Exp $
! Tag Name::  $Name: dcpam5-20081109-1 $
! Copyright:: Copyright (C) GFD Dennou Club, 2008. All rights reserved.
! License::   See COPYRIGHT[link:../../../COPYRIGHT]
!

module restart_surftemp_io
  !
  != 地表面温度リスタートデータ, 初期値データ入出力
  !
  != Restart data, initial data of surface temperature input/output
  !
  ! <b>Note that Japanese and English are described in parallel.</b>
  !
  ! 地表面温度のリスタートデータもしくは初期値データの入出力を行います. 
  ! 入力ファイル, 出力ファイル, データの出力の間隔は
  ! NAMELIST#restart_surftemp_io_nml で設定します. 
  !
  ! リスタートデータの入力ファイルが指定されない場合, 
  ! surface_data モジュールで生成された初期値データを取得します. 
  !
  ! Restart data or initial data is input/output. 
  ! Settings of input file, output file, and interval of data output 
  ! is configured by "NAMELIST#restart_surftemp_io_nml". 
  !
  ! If input file of restart data is not set, 
  ! initial data is generated in "surface_data" module, and 
  ! obtained data from the module. 
  !
  !== Procedures List
  !
  ! RestartSurfTempOpen   :: リスタートファイルのオープン
  ! RestartSurfTempOutput :: リスタートファイルへのデータ出力
  ! RestartSurfTempClose  :: リスタートファイルのクローズ
  ! RestartSurfTempGet    :: リスタートファイルの入力
  ! ------------      :: ------------
  ! RestartSurfTempOpen   :: Open restart file
  ! RestartSurfTempOutput :: Data output to restart file
  ! RestartSurfTempClose  :: Close restart file
  ! RestartSurfTempGet    :: Input restart file
  !
  !== NAMELIST
  !
  ! NAMELIST#restart_surftemp_io_nml
  !

  ! モジュール引用 ; USE statements
  !

  ! 格子点設定
  ! Grid points settings
  !
  use gridset, only: imax, & ! 経度格子点数. 
                             ! Number of grid points in longitude
    &                jmax, & ! 緯度格子点数. 
                             ! Number of grid points in latitude
    &                kmax    ! 鉛直層数. 
                             ! Number of vertical level

  ! 日付および時刻の取り扱い
  ! Date and time handler
  !
  use dc_date_types, only: DC_DIFFTIME
                              ! 日時の差を表現するデータ型. 
                              ! Data type for difference about date and time

  ! 種別型パラメタ
  ! Kind type parameter
  !
  use dc_types, only: DP, &      ! 倍精度実数型. Double precision. 
    &                 STRING, &  ! 文字列.       Strings. 
    &                 TOKEN      ! キーワード.   Keywords. 

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

  ! gtool4 データ出力
  ! Gtool4 data output
  !
  use gtool_history, only: GT_HISTORY

  ! 宣言文 ; Declaration statements
  !
  implicit none
  private
#ifdef LIB_MPI
  ! MPI ライブラリ
  ! MPI library
  !
  include 'mpif.h'
#endif

  ! 公開手続き
  ! Public procedure
  !
  public:: RestartSurfTempOpen, RestartSurfTempClose, RestartSurfTempOutPut
  public:: RestartSurfTempGet

  ! 公開変数
  ! Public variables
  !
  logical, save, public:: restart_surftemp_io_inited = .false.
                              ! 初期設定フラグ. 
                              ! Initialization flag

  logical, save, public:: restart_surftemp_opened = .false.
                              ! リスタートファイルのオープンに関するフラグ. 
                              ! Flag of restart file open

  ! 非公開変数
  ! Private variables
  !
  logical, save:: flag_init_data_save
                              ! 初期値データを作成する場合は, 
                              ! この引数に .true. を与えます. 
                              ! 
                              ! If initial data is created, 
                              ! give ".true." to this argument. 

  character(STRING), save:: InputFile
                              ! 入力するリスタートデータのファイル名
                              ! Filename of input restart data
  character(TOKEN), save:: InputName
                              ! 入力するリスタートデータの変数名
                              ! Variable name of input restart data

  character(STRING), save:: OutputFile
                              ! 出力するリスタートデータのファイル名
                              ! Filename of output restart data
  real, save:: IntValue
                              ! リスタートデータの出力間隔. 
                              ! Interval of restart data output
  character(TOKEN):: IntUnit
                              ! リスタートデータの出力間隔の単位. 
                              ! Unit for interval of restart data output

  type(GT_HISTORY), save:: gthst_rst
                              ! リスタートデータ用 gtool_history#GT_HISTORY 変数
                              ! "gtool_history#GT_HISTORY" variable for restart data

  type(DC_DIFFTIME), save:: PrevOutputTime
                              ! 前回の出力時間. 
                              ! Previous output time

  type(DC_DIFFTIME), save:: IntTime
                              ! リスタートデータの出力時間. 
                              ! Time interval of restart data output

  character(*), parameter:: time_name = 'time'
                              ! 時刻の次元の変数名
                              ! Variable name of time dimension
  character(*), parameter:: deltime_name = 'deltime'
                              ! Δt の変数名
                              ! Variable name of Delta t


  character(*), parameter:: module_name = 'restart_surftemp_io'
                              ! モジュールの名称. 
                              ! Module name
  character(*), parameter:: version = &
    & '$Name: dcpam5-20081109-1 $' // &
    & '$Id: restart_surftemp_io.F90,v 1.2 2008-11-08 06:41:24 morikawa Exp $'
                              ! モジュールのバージョン
                              ! Module version

  ! INTERFACE 文 ; INTERFACE statements
  !
  interface RestartSurfTempOpen
    module procedure RestartSurfTempOpen
  end interface

  interface RestartSurfTempClose
    module procedure RestartSurfTempClose
  end interface

  interface RestartSurfTempOutput
    module procedure RestartSurfTempOutput
  end interface

  interface RestartSurfTempGet
    module procedure RestartSurfTempGet
  end interface

contains

  subroutine RestartSurfTempOpen( flag_init_data )
    !
    ! リスタートファイルをオープンします. 
    !
    ! A restart file is opened. 
    !

    ! モジュール引用 ; USE statements
    !

    ! 出力ファイルの基本情報
    ! Basic information for output files
    ! 
    use fileset, only: &
      & FileTitle, &
                              ! 出力データファイルの表題.
                              ! Title of output data files
      & FileSource, &
                              ! データファイル作成の手段. 
                              ! Source of data file
      & FileInstitution
                              ! データファイルを最終的に変更した組織/個人. 
                              ! Institution or person that changes data files for the last time

    ! 物理定数設定
    ! Physical constants settings
    !
    use constants, only: PI   ! $ \pi $ .
                              ! 円周率.  Circular constant

    ! 座標データ設定
    ! Axes data settings
    !
    use axesset, only: &
      & x_Lon, &
                              ! $ \lambda $ [rad.] . 経度. Longitude
      & x_Lon_Weight, &
                              ! $ \Delta \lambda $ [rad.] . 
                              ! 経度座標重み. 
                              ! Weight of longitude
      & y_Lat, &
                              ! $ \varphi $ [rad.] . 緯度. Latitude
      & y_Lat_Weight
                              ! $ \Delta \varphi $ [rad.] . 
                              ! 緯度座標重み. 
                              ! Weight of latitude

    ! 時刻管理
    ! Time control
    !
    use timeset, only: &
      & DelTime, &            ! $ \Delta t $ [s]
      & StartTime, &          ! 計算開始時刻. 
                              ! Start time of calculation
      & StartDate, &          ! 計算開始日時. 
                              ! Start date of calculation
      & StartDateValid        ! 計算開始日時の有効性. 
                              ! Validation of start date of calculation

    ! gtool4 データ出力
    ! Gtool4 data output
    !
    use gtool_history, only: HistoryCreate, HistoryAddVariable, &
      & HistoryPut, HistoryAddAttr

    ! 文字列操作
    ! Character handling
    !
    use dc_string, only: StoA, CPrintf, LChar

    ! 日付および時刻の取り扱い
    ! Date and time handler
    !
    use dc_date, only: toChar, EvalByUnit, operator(+)

    ! 組み込み関数 PRESENT の拡張版関数
    ! Extended functions of intrinsic function "PRESENT"
    !
    use dc_present, only: present_and_true

    ! 宣言文 ; Declaration statements
    !
    implicit none
    logical, intent(in), optional:: flag_init_data
                              ! 初期値データを作成する場合は, 
                              ! この引数に .true. を与えます. 
                              ! 
                              ! If initial data is created, 
                              ! give ".true." to this argument. 

    ! 作業変数
    ! Work variables
    !
    character(STRING):: title_msg
                              ! 表題に付加するメッセージ. 
                              ! Message added to title
    real:: origin_time
                              ! 計算開始時刻. 
                              ! Start time of calculation
    character(STRING):: time_unit
                              ! 日時の単位. Units of date and time

    logical:: flag_mpi_init
#ifdef LIB_MPI
    integer:: err_mpi
#endif

    ! 実行文 ; Executable statement
    !

    ! 初期化
    ! Initialization
    !
    flag_init_data_save = present_and_true( flag_init_data )
    if ( .not. restart_surftemp_io_inited ) call RestartSurfTempInit
    if ( restart_surftemp_opened ) return

    ! 表題に付加するメッセージの設定
    ! Configure message added to title
    !
    if ( .not. flag_init_data_save ) then
      title_msg = ' restart data of surface temperature'
    else
      title_msg = ' initial data of surface temperature'
    end if

    ! 時刻情報の取得
    ! Get time information
    !
    if ( .not. flag_init_data_save ) then
      origin_time = EvalByUnit( StartTime + IntTime, IntUnit )
    else
      origin_time = EvalByUnit( StartTime, IntUnit )
    end if

    if ( StartDateValid ) then
      time_unit = trim(IntUnit) // ' since ' // toChar(StartDate)
    else
      time_unit = IntUnit
    end if

#ifdef LIB_MPI
    ! MPI における初期化が行われているかを確認する. 
    ! Confirm initialization of MPI
    !
    call MPI_Initialized(flag_mpi_init, err_mpi)
#else
    flag_mpi_init = .false.
#endif

    ! リスタートファイルのオープン
    ! Open a restart file
    !
    call HistoryCreate( &
      &      file = OutputFile,   &
      &     title = trim(FileTitle) // trim(title_msg), &          ! (in)
      &    source = FileSource, institution = FileInstitution, &   ! (in)
      &      dims = StoA( 'lon', 'lat', time_name ), &             ! (in)
      &  dimsizes = (/ imax, jmax, 0 /), &                         ! (in)
      & longnames = StoA( 'longitude', 'latitude', time_name ), &  ! (in)
      &     units = StoA( 'degree_east', 'degree_north', &
      &                    time_unit ), &                          ! (in)
      &         origin = origin_time, &       ! (in) optional
      &       interval = IntValue, &          ! (in) optional
      & flag_mpi_split = flag_mpi_init, &     ! (in) optional
      &        history = gthst_rst )          ! (out) optional

    ! 座標データの設定
    ! Axes data settings
    !
    call HistoryAddAttr( &
      & varname = 'lon', attrname = 'standard_name', &   ! (in)
      & value = 'longitude', &                           ! (in)
      & history = gthst_rst )                            ! (inout)
    call HistoryAddAttr( &
      & varname = 'lat', attrname = 'standard_name', &   ! (in)
      & value = 'latitude', &                            ! (in)
      & history = gthst_rst )                            ! (inout)
    call HistoryAddAttr( &
      & varname = time_name, attrname = 'standard_name', &  ! (in)
      & value = 'time', &                                ! (in)
      & history = gthst_rst )                            ! (inout)

    call HistoryPut( &
      & varname = 'lon', &               ! (in)
      & array = x_Lon / PI * 180.0_DP, & ! (in)
      & history = gthst_rst )            ! (inout)
    call HistoryPut( &
      & varname = 'lat', &               ! (in)
      & array = y_Lat / PI * 180.0_DP, & ! (in)
      & history = gthst_rst )            ! (inout)

    ! 座標重みの設定
    ! Axes weights settings
    !
    call HistoryAddVariable( &
      & varname = 'lon_weight', &                           ! (in)
      & dims = StoA('lon'), &                               ! (in)
      & longname = 'weight for integration in longitude', & ! (in)
      & units = 'radian', xtype = 'double', &               ! (in)
      & history = gthst_rst )                               ! (inout)
    call HistoryAddAttr( &
      & varname = 'lon', attrname = 'gt_calc_weight', &     ! (in)
      & value = 'lon_weight', &                             ! (in)
      & history = gthst_rst )                               ! (inout)
    call HistoryPut( &
      & varname = 'lon_weight', array = x_Lon_Weight, &     ! (in)
      & history = gthst_rst )                               ! (inout)

    call HistoryAddVariable( &
      & varname = 'lat_weight', &                           ! (in)
      & dims = StoA('lat'), &                               ! (in)
      & longname = 'weight for integration in latitude', &  ! (in)
      & units = 'radian', xtype = 'double', &               ! (in)
      & history = gthst_rst )                               ! (inout)
    call HistoryAddAttr( &
      & varname = 'lat', attrname = 'gt_calc_weight', &     ! (in)
      & value = 'lat_weight', &                             ! (in)
      & history = gthst_rst )                               ! (inout)
    call HistoryPut( &
      & varname = 'lat_weight', array = y_Lat_Weight, &     ! (in)
      & history = gthst_rst )                               ! (inout)

    ! 予報変数の設定
    ! Predictional variables settings
    !
    call HistoryAddVariable( &
      & varname = 'SurfTemp', &                   ! (in)
      & dims = StoA('lon', 'lat', time_name), &   ! (in)
      & longname = 'surface temperature', &       ! (in)
      & units = 'K', xtype = 'double', &          ! (in)
      & history = gthst_rst )                     ! (inout)

    restart_surftemp_opened = .true.
  end subroutine RestartSurfTempOpen

  !-------------------------------------------------------------------

  subroutine RestartSurfTempOutput( &
    & xy_SurfTemp &   ! (in)
    & )
    !
    ! リスタートデータの出力を行います. 
    !
    ! Output restart data

    ! モジュール引用 ; USE statements
    !

    ! gtool4 データ出力
    ! Gtool4 data output
    !
    use gtool_history, only: HistoryPut

    ! 時刻管理
    ! Time control
    !
    use timeset, only: TimeN  ! ステップ $ t $ の時刻. 
                              ! Time of step $ t $. 

    ! 日付および時刻の取り扱い
    ! Date and time handler
    !
    use dc_date, only: operator(<), operator(-), DCDiffTimePutLine

    ! 宣言文 ; Declaration statements
    !
    implicit none
    real(DP), intent(in):: xy_SurfTemp (0:imax-1, 1:jmax)
                              ! 地表面温度. 
                              ! Surface temperature

    ! 作業変数
    ! Work variables
    !

    ! 実行文 ; Executable statement
    !

    if ( .not. restart_surftemp_opened ) call RestartSurfTempOpen

    ! 出力タイミングのチェック
    ! Check output timing
    !
    if ( .not. flag_init_data_save .and. &
      &  TimeN - PrevOutputTime < IntTime ) return
    PrevOutputTime = TimeN

    ! データ出力
    ! Data output
    !
    call HistoryPut( &
      & 'SurfTemp', xy_SurfTemp, history = gthst_rst ) ! (in)

  end subroutine RestartSurfTempOutput

  !-------------------------------------------------------------------

  subroutine RestartSurfTempClose
    !
    ! リスタートデータファイル出力の終了処理を行います. 
    !
    ! Terminate restart data files output. 

    ! モジュール引用 ; USE statements
    !

    ! gtool4 データ出力
    ! Gtool4 data output
    !
    use gtool_history, only: HistoryClose

    ! 宣言文 ; Declaration statements
    !
    implicit none

    ! 作業変数
    ! Work variables
    !

    ! 実行文 ; Executable statement
    !
    if ( .not. restart_surftemp_opened ) return

    call HistoryClose( history = gthst_rst ) ! (inout)

    restart_surftemp_opened = .false.
  end subroutine RestartSurfTempClose

  !-------------------------------------------------------------------

  subroutine RestartSurfTempGet( &
    & xy_SurfTemp &                 ! (out)
    & )
    !
    ! リスタートデータの入力を行います. 
    ! リスタートデータが存在しない場合には, 
    ! surface_data モジュールを用いて, 地表面温度データ生成を行います. 
    !
    ! Input restart data. 
    ! If restart data is not exist, 
    ! surface temperature data is created by "surface_data". 


    ! モジュール引用 ; USE statements
    !

    ! 地表面データ提供
    ! Prepare surface data
    !
    use surface_data, only: SurfDataGet

    ! 時刻管理
    ! Time control
    !
    use timeset, only: &
      & StartTime             ! 計算開始時刻. 

    ! gtool4 データ入力
    ! Gtool4 data input
    !
    use gtool_history, only: HistoryGet

    ! 日付および時刻の取り扱い
    ! Date and time handler
    !
    use dc_date, only: EvalByUnit

    ! 文字列操作
    ! Character handling
    !
    use dc_string, only: toChar

    ! 宣言文 ; Declaration statements
    !
    implicit none
    real(DP), intent(out):: xy_SurfTemp (0:imax-1, 1:jmax)
                              ! 地表面温度. 
                              ! Surface temperature

    ! 作業変数
    ! Work variables
    !
    character(TOKEN):: time_range
                              ! 時刻の指定. 
                              ! Specification of time
    logical:: flag_mpi_init
#ifdef LIB_MPI
    integer:: err_mpi
#endif

    ! 実行文 ; Executable statement
    !

    if ( .not. restart_surftemp_io_inited ) call RestartSurfTempInit

    ! データを surface_data モジュールから取得
    ! Data is input from "surface_data" module
    ! 
    if ( trim(InputFile) == '' .or. trim(InputName) == '' ) then
      call SurfDataGet( xy_SurfTemp = xy_SurfTemp )  ! (out) optional

    ! データを InputFile から取得
    ! Data is input from InputFile
    ! 
    else

      ! 時刻情報の取得
      ! Get time information
      !
      time_range = time_name // '=' // &
        &          toChar( EvalbyUnit( StartTime, IntUnit ) )

#ifdef LIB_MPI
      ! MPI における初期化が行われているかを確認する. 
      ! Confirm initialization of MPI
      !
      call MPI_Initialized(flag_mpi_init, err_mpi)
#else
      flag_mpi_init = .false.
#endif

      ! データ入力
      ! Data input
      ! 
      call HistoryGet( &
        & InputFile, InputName, range = time_range, &  ! (in)
        & array = xy_SurfTemp, &                       ! (out)
        & flag_mpi_split = flag_mpi_init )             ! (in) optional

    end if

  end subroutine RestartSurfTempGet

  !-------------------------------------------------------------------

  subroutine RestartSurfTempInit
    !
    ! restart_surftemp_io モジュールの初期化を行います. 
    ! NAMELIST#restart_surftemp_io_nml の読み込みはこの手続きで行われます. 
    !
    ! "restart_surftemp_io" module is initialized. 
    ! "NAMELIST#restart_surftemp_io_nml" is loaded in this procedure. 
    !

    ! モジュール引用 ; USE statements
    !

    ! リスタートデータ入出力
    ! Restart data input/output
    !
    use restart_file_io, only: restart_file_io_inited, &
      & RestartFileIntValue => IntValue, &
                              ! リスタートデータの出力間隔. 
                              ! Interval of restart data output
      & RestartFileIntUnit  => IntUnit
                              ! リスタートデータの出力間隔の単位. 
                              ! Unit for interval of restart data output

    ! 時刻管理
    ! Time control
    !
    use timeset, only: &
      & StartTime             ! 計算開始時刻. 
                              ! Start time of calculation

    ! NAMELIST ファイル入力に関するユーティリティ
    ! Utilities for NAMELIST file input
    !
    use namelist_util, only: namelist_filename, NmlutilMsg

    ! 日付および時刻の取り扱い
    ! Date and time handler
    !
    use dc_date, only: DCDiffTimeCreate, operator(-)

    ! ファイル入出力補助
    ! File I/O support
    !
    use dc_iounit, only: FileOpen

    ! 種別型パラメタ
    ! Kind type parameter
    !
    use dc_types, only: STDOUT ! 標準出力の装置番号. Unit number of standard output

    ! 宣言文 ; Declaration statements
    !
    implicit none

    ! 作業変数
    ! Work variables
    !
    integer:: unit_nml        ! NAMELIST ファイルオープン用装置番号. 
                              ! Unit number for NAMELIST file open
    integer:: iostat_nml      ! NAMELIST 読み込み時の IOSTAT. 
                              ! IOSTAT of NAMELIST read

    ! NAMELIST 変数群
    ! NAMELIST group name
    !
    namelist /restart_surftemp_io_nml/ &
      & InputFile, &
      & InputName, &
      & OutputFile, &
      & IntValue, IntUnit
          !
          ! デフォルト値については初期化手続 "restart_surftemp_io#RestartSurfTempInit" 
          ! のソースコードを参照のこと. 
          !
          ! Refer to source codes in the initialization procedure
          ! "restart_surftemp_io#RestartSurfTempInit" for the default values. 
          !


    ! 実行文 ; Executable statement
    !

    if ( restart_surftemp_io_inited ) return
    call InitCheck

    ! デフォルト値の設定
    ! Default values settings
    !
    InputFile  = ''
    InputName  = 'SurfTemp'
    if ( .not. flag_init_data_save ) then
      OutputFile = 'restart_sst.nc'
    else
      OutputFile = 'sst.nc'
    end if

    if ( restart_file_io_inited ) then
      IntValue   = RestartFileIntValue
      IntUnit    = RestartFileIntUnit
    else
      IntValue   = 1.0
      IntUnit    = 'day'
    end if

    ! NAMELIST の読み込み
    ! NAMELIST is input
    !
    if ( trim(namelist_filename) /= '' ) then
      call FileOpen( unit_nml, &          ! (out)
        & namelist_filename, mode = 'r' ) ! (in)

      rewind( unit_nml )
      read( unit_nml, &         ! (in)
        & nml = restart_surftemp_io_nml, &  ! (out)
        & iostat = iostat_nml ) ! (out)
      close( unit_nml )

      call NmlutilMsg( iostat_nml, module_name ) ! (in)
      if ( iostat_nml == 0 ) write( STDOUT, nml = restart_surftemp_io_nml )
    end if

    ! 出力時間間隔の設定
    ! Configure time interval of output
    !
    call DCDiffTimeCreate( IntTime, & ! (out)
      & IntValue, IntUnit )           ! (in)
    PrevOutputTime = StartTime

    ! 印字 ; Print
    !
    call MessageNotify( 'M', module_name, '----- Initialization Messages -----' )
    call MessageNotify( 'M', module_name, 'Input:: ' )
    call MessageNotify( 'M', module_name, '  InputFile  = %c', c1 = trim(InputFile) )
    call MessageNotify( 'M', module_name, '  InputName  = %c', c1 = trim(InputName) )
    call MessageNotify( 'M', module_name, 'Output:: ' )
    call MessageNotify( 'M', module_name, '  OutputFile = %c', c1 = trim(OutputFile) )
    call MessageNotify( 'M', module_name, '  IntTime    = %r [%c]', r = (/ IntValue /), c1 = trim(IntUnit) )
    call MessageNotify( 'M', module_name, '-- version = %c', c1 = trim(version) )

    restart_surftemp_io_inited = .true.
  end subroutine RestartSurfTempInit

  !-------------------------------------------------------------------

  subroutine InitCheck
    !
    ! 依存モジュールの初期化チェック
    !
    ! Check initialization of dependency modules

    ! モジュール引用 ; USE statements
    !

    ! NAMELIST ファイル入力に関するユーティリティ
    ! Utilities for NAMELIST file input
    !
    use namelist_util, only: namelist_util_inited

    ! 出力ファイルの基本情報管理
    ! Management basic information for output files
    !
    use fileset, only: fileset_inited

    ! 格子点設定
    ! Grid points settings
    !
    use gridset, only: gridset_inited

    ! 物理定数設定
    ! Physical constants settings
    !
    use constants, only: constants_inited

    ! 座標データ設定
    ! Axes data settings
    !
    use axesset, only: axesset_inited

    ! 時刻管理
    ! Time control
    !
    use timeset, only: timeset_inited

    ! 実行文 ; Executable statement
    !

    if ( .not. namelist_util_inited ) &
      & call MessageNotify( 'E', module_name, '"namelist_util" module is not initialized.' )

    if ( .not. fileset_inited ) &
      & call MessageNotify( 'E', module_name, '"fileset" module is not initialized.' )

    if ( .not. gridset_inited ) &
      & call MessageNotify( 'E', module_name, '"gridset" module is not initialized.' )

    if ( .not. constants_inited ) &
      & call MessageNotify( 'E', module_name, '"constants" module is not initialized.' )

    if ( .not. axesset_inited ) &
      & call MessageNotify( 'E', module_name, '"axesset" module is not initialized.' )

    if ( .not. timeset_inited ) &
      & call MessageNotify( 'E', module_name, '"timeset" module is not initialized.' )


  end subroutine InitCheck

end module restart_surftemp_io
