| Class | restart_file_io |
| In: |
io/restart_file_io.f90
|
Note that Japanese and English are described in parallel.
リスタートデータもしくは初期値データの入出力を行います. 入力ファイル, 出力ファイル, データの出力の間隔は NAMELIST#restart_file_io_nml で設定します.
リスタートデータの入力ファイルが指定されない場合, initial_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_file_io_nml".
If input file of restart data is not set, initial data is generated in "initial_data" module, and obtained data from the module.
| RestartFileOpen : | リスタート/初期値ファイルのオープン |
| RestartFileOutput : | リスタート/初期値ファイルへのデータ出力 |
| InitialFileOutput : | 初期値ファイルへのデータ出力 |
| RestartFileClose : | リスタート/初期値ファイルのクローズ |
| RestartFileGet : | リスタート/初期値ファイルの入力 |
| ———— : | ———— |
| RestartFileOpen : | Open restart/initial file |
| RestartFileOutput : | Data output to restart/initial file |
| InitialFileOutput : | Data output to initial file |
| RestartFileClose : | Close restart/initial file |
| RestartFileGet : | Input restart/initial file |
| Subroutine : | |||
| xyz_U(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in)
| ||
| xyz_V(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in)
| ||
| xyz_Temp(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in)
| ||
| xyzf_QMix(0:imax-1, 1:jmax, 1:kmax, 1:ncmax) : | real(DP), intent(in)
| ||
| xy_Ps(0:imax-1, 1:jmax) : | real(DP), intent(in)
|
初期値データの出力を行います.
Output initial data
subroutine InitialFileOutput( xyz_U, xyz_V, xyz_Temp, xyzf_QMix, xy_Ps )
!
! 初期値データの出力を行います.
!
! Output initial data
! モジュール引用 ; USE statements
!
! 時刻管理
! Time control
!
use timeset, only: TimeN, EndTime, InitialDate ! 計算開始日時.
! Start date of calculation
! gtool4 データ出力
! Gtool4 data output
!
use gtool_history, only: HistoryPut, HistorySetTime
! 暦と日時の取り扱い
! Calendar and Date handler
!
use dc_calendar, only: DCCalDateInquire
! 組み込み関数 PRESENT の拡張版関数
! Extended functions of intrinsic function "PRESENT"
!
use dc_present, only: present_and_true
! 宣言文 ; Declaration statements
!
implicit none
real(DP), intent(in):: xyz_U (0:imax-1, 1:jmax, 1:kmax)
! $ u $ . 東西風速. Eastward wind
real(DP), intent(in):: xyz_V (0:imax-1, 1:jmax, 1:kmax)
! $ v $ . 南北風速. Northward wind
real(DP), intent(in):: xyz_Temp (0:imax-1, 1:jmax, 1:kmax)
! $ T $ . 温度. Temperature
real(DP), intent(in):: xyzf_QMix(0:imax-1, 1:jmax, 1:kmax, 1:ncmax)
! $ q $ . 比湿. Specific humidity
real(DP), intent(in):: xy_Ps (0:imax-1, 1:jmax)
! $ p_s $ . 地表面気圧. Surface pressure
! 作業変数
! Work variables
!
character(STRING):: date_str ! 日時の年月日時分秒形式.
! Date with year-month-day hour:minute:second format
integer :: n
! 実行文 ; Executable statement
!
if ( .not. restart_file_opened ) call RestartFileOpen( flag_init_data = .true. )
! 初期値出力であることのチェック
! Check initial data output
!
if ( .not. flag_init_data_save ) then
call MessageNotify( 'E', module_name, 'Now, restart data output mode.' )
end if
! 時刻の設定
! Set time
!
call HistorySetTime( timed = TimeN, history = gthst_rst )
! "TimeN" を年月日時分秒表記にして "datetime" 変数へ出力
! Put "TimeN" on "datetime" variable with year-month-day hour:minute:second format
!
call DCCalDateInquire( date_str = date_str, elapse_sec = TimeN, date = InitialDate ) ! (in) optional
call HistoryPut( 'datetime', date_str, history = gthst_rst ) ! (inout) optional
! データ出力
! Data output
!
call HistoryPut( 'U', xyz_U, history = gthst_rst ) ! (in)
call HistoryPut( 'V', xyz_V, history = gthst_rst ) ! (in)
call HistoryPut( 'Temp', xyz_Temp, history = gthst_rst ) ! (in)
do n = 1, ncmax
call HistoryPut( a_QMixName(n), xyzf_QMix(:,:,:,n), history = gthst_rst ) ! (in)
end do
call HistoryPut( 'Ps', xy_Ps, history = gthst_rst ) ! (in)
end subroutine InitialFileOutput
| Variable : | |||
| InputFile : | character(STRING), save, public
|
| Variable : | |||
| IntTime : | real(DP), save, public
|
| Variable : | |||
| IntUnit : | character(TOKEN), save, public
|
| Variable : | |||
| IntValue : | real(DP), save, public
|
| Variable : | |||
| OutputFile : | character(STRING), save, public
|
| Subroutine : |
リスタートデータファイル出力の終了処理を行います.
Terminate restart data files output.
subroutine RestartFileClose
!
! リスタートデータファイル出力の終了処理を行います.
!
! 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_file_opened ) return
call HistoryClose( history = gthst_rst ) ! (inout)
restart_file_opened = .false.
end subroutine RestartFileClose
| Subroutine : | |||
| xyz_UB(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(out)
| ||
| xyz_VB(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(out)
| ||
| xyz_TempB(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(out)
| ||
| xyzf_QMixB(0:imax-1, 1:jmax, 1:kmax, 1:ncmax) : | real(DP), intent(out)
| ||
| xy_PsB(0:imax-1, 1:jmax) : | real(DP), intent(out)
| ||
| xyz_UN(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(out)
| ||
| xyz_VN(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(out)
| ||
| xyz_TempN(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(out)
| ||
| xyzf_QMixN(0:imax-1, 1:jmax, 1:kmax, 1:ncmax) : | real(DP), intent(out)
| ||
| xy_PsN(0:imax-1, 1:jmax) : | real(DP), intent(out)
| ||
| flag_initial : | logical , intent(out), optional
|
リスタート/初期値データの入力を行います. リスタート/初期値データファイルが存在しない場合には, initial_data モジュールを用いて, 初期値生成を行います.
Input restart/initial data. If a restart/initial data file is not exist, initial data is created by "initial_data".
subroutine RestartFileGet( xyz_UB, xyz_VB, xyz_TempB, xyzf_QMixB, xy_PsB, xyz_UN, xyz_VN, xyz_TempN, xyzf_QMixN, xy_PsN, flag_initial )
!
! リスタート/初期値データの入力を行います.
! リスタート/初期値データファイルが存在しない場合には,
! initial_data モジュールを用いて, 初期値生成を行います.
!
! Input restart/initial data.
! If a restart/initial data file is not exist,
! initial data is created by "initial_data".
! モジュール引用 ; USE statements
!
! 時刻管理
! Time control
!
use timeset, only: DelTime ! $ \Delta t $ [s]
! 初期値データ (リスタートデータ) 提供
! Prepare initial data (restart data)
!
use initial_data, only: SetInitData
! 時刻管理
! Time control
!
use timeset, only: TimesetSetInitialDate, TimesetSetTimeN, TimesetSetCalendar, RestartTime ! リスタート開始時刻.
! Restart time of calculation
! gtool4 データ入力
! Gtool4 data input
!
use gtool_history, only: HistoryGet, HistoryGetAttr
! 文字列操作
! Character handling
!
use dc_string, only: toChar
! ファイル入出力補助
! File I/O support
!
use dc_iounit, only: FileOpen
! 宣言文 ; Declaration statements
!
implicit none
real(DP), intent(out):: xyz_UB (0:imax-1, 1:jmax, 1:kmax)
! $ u (t-\Delta t) $ . 東西風速. Eastward wind
real(DP), intent(out):: xyz_VB (0:imax-1, 1:jmax, 1:kmax)
! $ v (t-\Delta t) $ . 南北風速. Northward wind
real(DP), intent(out):: xyz_TempB (0:imax-1, 1:jmax, 1:kmax)
! $ T (t-\Delta t) $ . 温度. Temperature
real(DP), intent(out):: xyzf_QMixB (0:imax-1, 1:jmax, 1:kmax, 1:ncmax)
! $ q (t-\Delta t) $ . 比湿. Specific humidity
real(DP), intent(out):: xy_PsB (0:imax-1, 1:jmax)
! $ p_s (t-\Delta t) $ . 地表面気圧. Surface pressure
real(DP), intent(out):: xyz_UN (0:imax-1, 1:jmax, 1:kmax)
! $ u (t) $ . 東西風速. Eastward wind
real(DP), intent(out):: xyz_VN (0:imax-1, 1:jmax, 1:kmax)
! $ v (t) $ . 南北風速. Northward wind
real(DP), intent(out):: xyz_TempN (0:imax-1, 1:jmax, 1:kmax)
! $ T (t) $ . 温度. Temperature
real(DP), intent(out):: xyzf_QMixN (0:imax-1, 1:jmax, 1:kmax, 1:ncmax)
! $ q (t) $ . 比湿. Specific humidity
real(DP), intent(out):: xy_PsN (0:imax-1, 1:jmax)
! $ p_s (t) $ . 地表面気圧. Surface pressure
logical , intent(out), optional:: flag_initial
! リスタートデータを読み込む場合には,
! .false. が, 初期値データを読み込む場合には
! .true. が返ります.
!
! If restart data is loaded, .false. is returned.
! On the other hand, if initial data is loaded,
! .true. is returned.
! 作業変数
! Work variables
!
integer:: flag_rst ! 初期値データから入力時は 0,
! リスタートデータ入力時は 1.
!
! If initial data is input, this value is 0.
! If restart data is input, this value is 1.
character(STRING):: time_range
! 時刻の指定.
! Specification of time
character(TOKEN):: dummy_str
! 入力チェック用のダミー変数
! Dummy variable for check of input
logical:: get_err
! 入力時のエラーフラグ.
! Error flag for input
real(DP):: returned_time
! 入力データの時刻.
! Time of input data.
logical:: flag_time_exist
! 入力データの時刻用のフラグ.
! Flag for time of input data.
integer:: origin_year, origin_month, origin_day, origin_hour, origin_min
! 計算開始の年月日時分.
real(DP):: origin_sec
! 計算開始の秒.
character(TOKEN):: cal_type
! 暦のタイプ.
integer:: month_in_year, hour_in_day, min_in_hour
integer, pointer:: day_in_month_ptr(:) => null()
real(DP):: sec_in_min
! 暦の詳細情報
real(DP):: rst_time
! リスタートデータファイルから得られる時刻変数
! Time variable from a restart data file
logical:: flag_mpi_init
integer :: n
! 実行文 ; Executable statement
!
if ( .not. restart_file_io_inited ) then
call MessageNotify( 'E', module_name, 'This module has not been initialized.' )
end if
! データを initial_data モジュールから取得
! Data is input from "initial_data" module
!
if ( trim(InputFile) == '' ) then
call SetInitData( xyz_UB, xyz_VB, xyz_TempB, xyzf_QMixB(:,:,:,IndexH2OVap), xy_PsB ) ! (out)
! The variables below are initialized here, temporarily.
!
xyzf_QMixB(:,:,:,1:IndexH2OVap-1) = 0.0_DP
xyzf_QMixB(:,:,:,IndexH2OVap+1:ncmax) = 0.0_DP
call MessageNotify( 'M', module_name, 'Initial data (not restart data) is input ' // 'from a module "initial_data". ' // '*B (t-dt) and *N (t) are same.' )
xyz_UN = xyz_UB
xyz_VN = xyz_VB
xyz_TempN = xyz_TempB
xyzf_QMixN = xyzf_QMixB
xy_PsN = xy_PsB
if ( present(flag_initial) ) flag_initial = .true.
! データを InputFile から取得
! Data is input from InputFile
!
else
!!$ flag_mpi_init = .false.
flag_mpi_init = .true.
! ファイルの有無を確認
! Conform an existence of an input file
!
call HistoryGetAttr( InputFile, 'lon', 'units', dummy_str, flag_mpi_split = flag_mpi_init, err = get_err ) ! (out)
if ( get_err ) then
call MessageNotify( 'E', module_name, 'restart/initial data file "%c" is not found.', c1 = trim(InputFile) )
end if
! 時刻情報の取得
! Get time information
!
time_range = 'time=' // toChar( RestartTime )
! 初期値データかリスタートデータかのチェック
! Check whether input data is initial data or restart data
!
call HistoryGet( InputFile, 'flag_rst', flag_rst, err = get_err, quiet = .true., flag_mpi_split = flag_mpi_init ) ! (in) optional
if ( get_err ) then
! flag_rst 変数が読み込めない場合、とりあえず初期値データと見なす
!
flag_rst = 0
if ( present(flag_initial) ) flag_initial = .true.
else if ( flag_rst == 0 ) then
if ( present(flag_initial) ) flag_initial = .true.
else
if ( present(flag_initial) ) flag_initial = .false.
end if
! 物理量データの有無のチェック ("U", "UB" のみ)
! Check existence or nonexistence of physical data (only "U", "UB")
!
if ( flag_rst == 0 ) then
call HistoryGet( InputFile, 'U', xyz_UB, err = get_err, quiet = .true., flag_mpi_split = flag_mpi_init ) ! (in) optional
if ( get_err ) then
call MessageNotify( 'E', module_name, 'One of necessary variables "U" for start of calculation ' // 'cannot be read from "%c"', c1 = trim(InputFile) )
end if
else
call HistoryGet( InputFile, 'UB', xyz_UB, range = time_range, quiet = .true., err = get_err, returned_time = returned_time, flag_time_exist = flag_time_exist, flag_mpi_split = flag_mpi_init ) ! (in) optional
if ( get_err ) then
call MessageNotify( 'E', module_name, 'One of necessary variables "UB" for restart ' // 'cannot be read from "%c"', c1 = trim(InputFile) )
end if
end if
! 初期値データを入力する場合、経過時間を 0 に設定
! Set 0 to elapsed time, when initial data is input
!
if ( flag_rst == 0 ) then
call TimesetSetTimeN( 0.0_DP )
end if
! 暦、開始日時、経過時刻の読み込みと上書き設定
! Input and overwrite calendar, start date, and elapsed time
!
if ( flag_rst /= 0 ) then
! 暦の読み込み
! Input calendar
!
call HistoryGetAttr( InputFile, 'time', 'calendar', cal_type, flag_mpi_split = flag_mpi_init ) ! (in) optional
call HistoryGetAttr( InputFile, 'time', 'month_in_year', month_in_year, flag_mpi_split = flag_mpi_init ) ! (in) optional
allocate( day_in_month_ptr(month_in_year) )
call HistoryGetAttr( InputFile, 'time', 'day_in_month', day_in_month_ptr, flag_mpi_split = flag_mpi_init ) ! (in) optional
call HistoryGetAttr( InputFile, 'time', 'hour_in_day', hour_in_day, flag_mpi_split = flag_mpi_init ) ! (in) optional
call HistoryGetAttr( InputFile, 'time', 'min_in_hour', min_in_hour, flag_mpi_split = flag_mpi_init ) ! (in) optional
call HistoryGetAttr( InputFile, 'time', 'sec_in_min', sec_in_min, flag_mpi_split = flag_mpi_init ) ! (in) optional
! 暦の上書き設定
! Overwrite calendar
!
call TimesetSetCalendar( cal_type, month_in_year, day_in_month_ptr, hour_in_day, min_in_hour, sec_in_min ) ! (in)
deallocate( day_in_month_ptr )
! 開始日時の読み込み
! Input start date
!
call HistoryGetAttr( InputFile, 'time', 'origin_year', origin_year, flag_mpi_split = flag_mpi_init ) ! (in) optional
call HistoryGetAttr( InputFile, 'time', 'origin_month', origin_month, flag_mpi_split = flag_mpi_init ) ! (in) optional
call HistoryGetAttr( InputFile, 'time', 'origin_day', origin_day, flag_mpi_split = flag_mpi_init ) ! (in) optional
call HistoryGetAttr( InputFile, 'time', 'origin_hour', origin_hour, flag_mpi_split = flag_mpi_init ) ! (in) optional
call HistoryGetAttr( InputFile, 'time', 'origin_min', origin_min, flag_mpi_split = flag_mpi_init ) ! (in) optional
call HistoryGetAttr( InputFile, 'time', 'origin_sec', origin_sec, flag_mpi_split = flag_mpi_init ) ! (in) optional
! 開始日時の上書き設定
! Overwrite start date
!
call TimesetSetInitialDate( origin_year, origin_month, origin_day, origin_hour, origin_min, origin_sec ) ! (in)
! 経過時間の読み込み
! Input elapsed time
!
call HistoryGet( InputFile, 'time', range = time_range, array = rst_time, flag_mpi_split = flag_mpi_init ) ! (in) optional
call MessageNotify( 'M', module_name, ' Specified RestartTime from a NAMELIST file = <%f>, ', d = (/ RestartTime /) )
call MessageNotify( 'M', module_name, ' Actual initial value of TimeN from a restart file = <%f>', d = (/ rst_time /) )
! 経過時間の上書き設定
! Overwrite elapsed time
!
call TimesetSetTimeN( rst_time )
end if
! データ入力
! Data input
!
if ( flag_rst == 0 ) then
call HistoryGet( InputFile, 'U', array = xyz_UB, flag_mpi_split = flag_mpi_init ) ! (in) optional
call HistoryGet( InputFile, 'V', array = xyz_VB, flag_mpi_split = flag_mpi_init ) ! (in) optional
call HistoryGet( InputFile, 'Temp', array = xyz_TempB, flag_mpi_split = flag_mpi_init ) ! (in) optional
do n = 1, ncmax
call HistoryGet( InputFile, trim(a_QMixName(n)), array = xyzf_QMixB(:,:,:,n), flag_mpi_split = flag_mpi_init )
end do
call HistoryGet( InputFile, 'Ps', array = xy_PsB, flag_mpi_split = flag_mpi_init ) ! (in) optional
call MessageNotify( 'M', module_name, 'Initial data (not restart data) is input ' // 'from a data file "%c". ' // '*B (t-dt) and *N (t) are same.', c1 = trim(InputFile) )
xyz_UN = xyz_UB
xyz_VN = xyz_VB
xyz_TempN = xyz_TempB
xyzf_QMixN = xyzf_QMixB
xy_PsN = xy_PsB
else
call HistoryGet( InputFile, 'UB', range = time_range, array = xyz_UB, flag_mpi_split = flag_mpi_init ) ! (in) optional
call HistoryGet( InputFile, 'VB', range = time_range, array = xyz_VB, flag_mpi_split = flag_mpi_init ) ! (in) optional
call HistoryGet( InputFile, 'TempB', range = time_range, array = xyz_TempB, flag_mpi_split = flag_mpi_init ) ! (in) optional
do n = 1, ncmax
call HistoryGet( InputFile, trim(a_QMixName(n))//'B', range = time_range, array = xyzf_QMixB(:,:,:,n), flag_mpi_split = flag_mpi_init )
end do
call HistoryGet( InputFile, 'PsB', range = time_range, array = xy_PsB, flag_mpi_split = flag_mpi_init ) ! (in) optional
call HistoryGet( InputFile, 'UN', range = time_range, array = xyz_UN, flag_mpi_split = flag_mpi_init ) ! (in) optional
call HistoryGet( InputFile, 'VN', range = time_range, array = xyz_VN, flag_mpi_split = flag_mpi_init ) ! (in) optional
call HistoryGet( InputFile, 'TempN', range = time_range, array = xyz_TempN, flag_mpi_split = flag_mpi_init ) ! (in) optional
do n = 1, ncmax
call HistoryGet( InputFile, trim(a_QMixName(n))//'N', range = time_range, array = xyzf_QMixN(:,:,:,n), flag_mpi_split = flag_mpi_init )
end do
call HistoryGet( InputFile, 'PsN', range = time_range, array = xy_PsN, flag_mpi_split = flag_mpi_init ) ! (in) optional
call MessageNotify( 'M', module_name, 'Restart data (not initial data) is input ' // 'from a data file "%c". ', c1 = trim(InputFile) )
end if
end if
end subroutine RestartFileGet
| Subroutine : |
restart_file_io モジュールの初期化を行います. NAMELIST#restart_file_io_nml の読み込みはこの手続きで行われます.
"restart_file_io" module is initialized. "NAMELIST#restart_file_io_nml" is loaded in this procedure.
This procedure input/output NAMELIST#restart_file_io_nml .
subroutine RestartFileInit
!
! restart_file_io モジュールの初期化を行います.
! NAMELIST#restart_file_io_nml の読み込みはこの手続きで行われます.
!
! "restart_file_io" module is initialized.
! "NAMELIST#restart_file_io_nml" is loaded in this procedure.
!
! モジュール引用 ; USE statements
!
! 時刻管理
! Time control
!
use timeset, only: RestartTime ! リスタート開始時刻.
! Restart time of calculation
! NAMELIST ファイル入力に関するユーティリティ
! Utilities for NAMELIST file input
!
use namelist_util, only: namelist_filename, NmlutilMsg
! 暦と日時の取り扱い
! Calendar and Date handler
!
use dc_calendar, only: DCCalConvertByUnit
! ファイル入出力補助
! File I/O support
!
use dc_iounit, only: FileOpen
! 種別型パラメタ
! Kind type parameter
!
use dc_types, only: STDOUT ! 標準出力の装置番号. Unit number of standard output
! 初期値データ (リスタートデータ) 提供
! Prepare initial data (restart data)
!
use initial_data, only: InitDataInit
! 宣言文 ; 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_file_io_nml/ InputFile, OutputFile, IntValue, IntUnit
!
! デフォルト値については初期化手続 "restart_file_io#RestartFileInit"
! のソースコードを参照のこと.
!
! Refer to source codes in the initialization procedure
! "restart_file_io#RestartFileInit" for the default values.
!
! 実行文 ; Executable statement
!
if ( restart_file_io_inited ) return
! デフォルト値の設定
! Default values settings
!
InputFile = ''
if ( .not. flag_init_data_save ) then
OutputFile = 'rst.nc'
else
OutputFile = 'init.nc'
end if
IntValue = 365.0d0
IntUnit = 'day'
! NAMELIST の読み込み
! NAMELIST is input
!
if ( trim(namelist_filename) /= '' ) then
call FileOpen( unit_nml, namelist_filename, mode = 'r' ) ! (in)
rewind( unit_nml )
read( unit_nml, nml = restart_file_io_nml, iostat = iostat_nml ) ! (out)
close( unit_nml )
call NmlutilMsg( iostat_nml, module_name ) ! (in)
if ( iostat_nml == 0 ) write( STDOUT, nml = restart_file_io_nml )
end if
! 出力時間間隔の設定
! Configure time interval of output
!
IntTime = DCCalConvertByUnit( IntValue, IntUnit, 'sec' ) ! (in)
PrevOutputTime = RestartTime
! フラグの初期化
! Initialize flag
!
flag_output_end = .false.
! Initialization of modules used in this module
! 初期値データ (リスタートデータ) 提供
! Prepare initial data (restart data)
!
call InitDataInit
! 印字 ; Print
!
call MessageNotify( 'M', module_name, '----- Initialization Messages -----' )
call MessageNotify( 'M', module_name, 'Input:: ' )
if ( trim(InputFile) /= '' ) then
call MessageNotify( 'M', module_name, ' InputFile = %c', c1 = trim(InputFile) )
else
call MessageNotify( 'M', module_name, ' InputFile = <Non>' )
call MessageNotify( 'M', module_name, ' ** Initial data is generated in "initial_data" module' )
end if
call MessageNotify( 'M', module_name, 'Output:: ' )
call MessageNotify( 'M', module_name, ' OutputFile = %c', c1 = trim(OutputFile) )
call MessageNotify( 'M', module_name, ' IntTime = %f [%c]', d = (/ IntValue /), c1 = trim(IntUnit) )
call MessageNotify( 'M', module_name, '-- version = %c', c1 = trim(version) )
restart_file_io_inited = .true.
end subroutine RestartFileInit
| Subroutine : | |||
| flag_init_data : | logical, intent(in), optional
|
リスタート/初期値ファイルをオープンします.
A restart/initial data file is opened.
subroutine RestartFileOpen( flag_init_data )
!
! リスタート/初期値ファイルをオープンします.
!
! A restart/initial data file is opened.
!
! モジュール引用 ; USE statements
!
! 出力ファイルの基本情報
! Basic information for output files
!
use fileset, only: FileTitle, FileSource, FileInstitution
! データファイルを最終的に変更した組織/個人.
! Institution or person that changes data files for the last time
! 物理・数学定数設定
! Physical and mathematical constants settings
!
use constants0, only: PI ! $ \pi $.
! 円周率. Circular constant
! 座標データ設定
! Axes data settings
!
use axesset, only: x_Lon, x_Lon_Weight, y_Lat, y_Lat_Weight, z_Sigma, r_Sigma, z_DelSigma
! $ \Delta \sigma $ (整数).
! $ \Delta \sigma $ (Full)
! 時刻管理
! Time control
!
use timeset, only: DelTime, RestartTime, InitialDate ! 計算開始日時.
! Start date of calculation
! gtool4 データ出力
! Gtool4 data output
!
use gtool_history, only: HistoryCreate, HistoryAddVariable, HistoryPut, HistoryAddAttr
! 暦と日時の取り扱い
! Calendar and Date handler
!
use dc_calendar, only: DCCalInquire, DCCalDateInquire
! 文字列操作
! Character handling
!
use dc_string, only: CPrintf, LChar
! 組み込み関数 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(DP):: origin_time
! 計算開始時刻.
! Start time of calculation
integer:: InitialYear, InitialMonth, InitialDay, InitialHour, InitialMin
! 計算開始の年月日時分.
real(DP):: InitialSec
! 計算開始の秒.
character(TOKEN):: cal_type
! 暦のタイプ.
integer:: month_in_year, hour_in_day, min_in_hour
integer, pointer:: day_in_month_ptr(:) => null()
real(DP):: sec_in_min
! 暦の詳細情報
logical:: flag_mpi_init
integer :: n
! 実行文 ; Executable statement
!
! 初期化
! Initialization
!
flag_init_data_save = present_and_true( flag_init_data )
if ( .not. restart_file_io_inited ) then
call MessageNotify( 'E', module_name, 'This module has not been initialized.' )
end if
if ( restart_file_opened ) return
! 表題に付加するメッセージの設定
! Configure message added to title
!
if ( .not. flag_init_data_save ) then
title_msg = ' restart data'
else
title_msg = ' initial data'
end if
! 時刻情報の取得
! Get time information
!
if ( .not. flag_init_data_save ) then
origin_time = RestartTime + IntTime
else
origin_time = RestartTime
end if
flag_mpi_init = .false.
! リスタートファイルのオープン
! Open a restart file
!
call HistoryCreate( file = OutputFile, title = trim(FileTitle) // trim(title_msg), source = FileSource, institution = FileInstitution, dims = (/ 'lon ', 'lat ', 'sig ', 'sigm ', 'timestr', 'time ' /), dimsizes = (/ imax, jmax, kmax, kmax + 1, TOKEN, 0 /), longnames = (/ 'longitude ', 'latitude ', 'sigma at layer midpoints ', 'sigma at layer end-points (half level)', 'number of characters for datetime ', 'time ' /), units = (/ 'degree_east ', 'degree_north', '1 ', '1 ', '1 ', 'sec ' /), xtypes = (/'double', 'double', 'double', 'double', 'int ', 'double'/), origind = origin_time, intervald = IntTime, flag_mpi_split = .true., history = gthst_rst ) ! (out) optional
! ※ 元々再計算データかどうかのチェックのためのフラグとして
! 作成したものであるため、下記 flag_rst 設定完了後
! 削除予定 (morikawa 2010/06/13)
!
! $ \Delta t $ に関する情報を追加.
! Add information about $ \Delta t $.
!
!!$ if ( .not. flag_init_data_save ) then
!!$ call HistoryAddVariable( &
!!$ & varname = 'deltime', & ! (in)
!!$ & dims = (/''/), & ! (in)
!!$ & longname = 'delta time', & ! (in)
!!$ & units = 'sec', xtype = 'double', & ! (in)
!!$ & history = gthst_rst ) ! (inout)
!!$ call HistoryPut( &
!!$ & varname = 'deltime', & ! (in)
!!$ & array = (/ DelTime /), & ! (in)
!!$ & history = gthst_rst ) ! (inout)
!!$ end if
! 開始日時情報を "time" の属性として設定
! Set start date information as attributes of "time"
!
call DCCalDateInquire( InitialYear, InitialMonth, InitialDay, InitialHour, InitialMin, InitialSec, date = InitialDate ) ! (in)
call HistoryAddAttr( 'time', attrname = 'origin', value = 'origin_year origin_month origin_day origin_hour origin_min origin_sec', history = gthst_rst ) ! (inout)
call HistoryAddAttr( 'time', attrname = 'origin_year', value = InitialYear, history = gthst_rst ) ! (inout)
call HistoryAddAttr( 'time', attrname = 'origin_month', value = InitialMonth, history = gthst_rst ) ! (inout)
call HistoryAddAttr( 'time', attrname = 'origin_day', value = InitialDay, history = gthst_rst ) ! (inout)
call HistoryAddAttr( 'time', attrname = 'origin_hour', value = InitialHour, history = gthst_rst ) ! (inout)
call HistoryAddAttr( 'time', attrname = 'origin_min', value = InitialMin, history = gthst_rst ) ! (inout)
call HistoryAddAttr( 'time', attrname = 'origin_sec', value = InitialSec, history = gthst_rst ) ! (inout)
! 暦情報を "time" の属性として設定
! Set calendar information as attributes of "time"
!
call DCCalInquire( cal_type = cal_type, month_in_year = month_in_year, day_in_month_ptr = day_in_month_ptr , hour_in_day = hour_in_day , min_in_hour = min_in_hour , sec_in_min = sec_in_min ) ! (out)
call HistoryAddAttr( 'time', attrname = 'calendar', value = cal_type, history = gthst_rst ) ! (inout)
call HistoryAddAttr( 'time', attrname = 'month_in_year', value = month_in_year, history = gthst_rst ) ! (inout)
call HistoryAddAttr( 'time', attrname = 'day_in_month', value = day_in_month_ptr, history = gthst_rst ) ! (inout)
call HistoryAddAttr( 'time', attrname = 'hour_in_day', value = hour_in_day, history = gthst_rst ) ! (inout)
call HistoryAddAttr( 'time', attrname = 'min_in_hour', value = min_in_hour, history = gthst_rst ) ! (inout)
call HistoryAddAttr( 'time', attrname = 'sec_in_min', value = sec_in_min, history = gthst_rst ) ! (inout)
deallocate( day_in_month_ptr )
! 再計算データ用のフラグ設定
! Set flag for a restart data file.
!
call HistoryAddVariable( varname = 'flag_rst', dims = (/''/), longname = 'flag for restart data', units = '1', xtype = 'int', history = gthst_rst ) ! (inout)
call HistoryAddAttr( varname = 'flag_rst', attrname = 'comment', value = 'If this value is nonzero, this file provides restart data', history = gthst_rst ) ! (inout)
if ( flag_init_data_save ) then
call HistoryPut( varname = 'flag_rst', array = (/ 0 /), history = gthst_rst ) ! (inout)
else
call HistoryPut( varname = 'flag_rst', array = (/ 1 /), history = gthst_rst ) ! (inout)
end if
! 年月日時分秒形式の日時情報変数の設定
! Set a date information variable with year-month-day hour:minute:second format
!
call HistoryAddVariable( varname = 'datetime', dims = (/'timestr', 'time ' /), longname = 'time represented as strings', units = '1', xtype = 'char', history = gthst_rst ) ! (inout) optional
! 座標データの設定
! Axes data settings
!
call HistoryAddAttr( 'lon', attrname = 'standard_name', value = 'longitude', history = gthst_rst ) ! (inout)
call HistoryAddAttr( 'lat', attrname = 'standard_name', value = 'latitude', history = gthst_rst ) ! (inout)
call HistoryAddAttr( 'sig', attrname = 'standard_name', value = 'atmosphere_sigma_coordinate', history = gthst_rst ) ! (inout)
call HistoryAddAttr( 'sigm', attrname = 'standard_name', value = 'atmosphere_sigma_coordinate', history = gthst_rst ) ! (inout)
call HistoryAddAttr( 'time', attrname = 'standard_name', value = 'time', history = gthst_rst ) ! (inout)
call HistoryAddAttr( 'sig', attrname = 'positive', value = 'down', history = gthst_rst ) ! (inout)
call HistoryAddAttr( 'sigm', attrname = 'positive', value = 'down', history = gthst_rst ) ! (inout)
call HistoryPut( 'lon', x_Lon / PI * 180.0_DP, history = gthst_rst ) ! (inout)
call HistoryPut( 'lat', y_Lat / PI * 180.0_DP, history = gthst_rst ) ! (inout)
call HistoryPut( 'sig', z_Sigma, history = gthst_rst ) ! (inout)
call HistoryPut( 'sigm', r_Sigma, history = gthst_rst ) ! (inout)
! 座標重みの設定
! Axes weights settings
!
call HistoryAddVariable( 'lon_weight', (/'lon'/), 'weight for integration in longitude', 'radian', xtype = 'double', history = gthst_rst ) ! (inout)
call HistoryAddAttr( 'lon', attrname = 'gt_calc_weight', value = 'lon_weight', history = gthst_rst ) ! (inout)
call HistoryPut( 'lon_weight', x_Lon_Weight, history = gthst_rst ) ! (inout)
call HistoryAddVariable( 'lat_weight', (/'lat'/), 'weight for integration in latitude', units = 'radian', xtype = 'double', history = gthst_rst ) ! (inout)
call HistoryAddAttr( 'lat', attrname = 'gt_calc_weight', value = 'lat_weight', history = gthst_rst ) ! (inout)
call HistoryPut( 'lat_weight', y_Lat_Weight, history = gthst_rst ) ! (inout)
call HistoryAddVariable( 'sig_weight', (/'sig'/), 'weight for integration in sigma', '1', xtype = 'double', history = gthst_rst ) ! (inout)
call HistoryAddAttr( 'sig', attrname = 'gt_calc_weight', value = 'sig_weight', history = gthst_rst ) ! (inout)
call HistoryPut( 'sig_weight', z_DelSigma, history = gthst_rst ) ! (inout)
! 予報変数の設定
! Predictional variables settings
!
if ( flag_init_data_save ) then
! 初期データファイル用
! For initial data file
!
call HistoryAddVariable( 'U', (/ 'lon ', 'lat ', 'sig ', 'time' /), 'eastward wind', 'm s-1', xtype = 'double', history = gthst_rst ) ! (inout)
call HistoryAddVariable( 'V', (/ 'lon ', 'lat ', 'sig ', 'time' /), 'northward wind', 'm s-1', xtype = 'double', history = gthst_rst ) ! (inout)
call HistoryAddVariable( 'Temp', (/ 'lon ', 'lat ', 'sig ', 'time' /), 'temperature', 'K', xtype = 'double', history = gthst_rst ) ! (inout)
do n = 1, ncmax
call HistoryAddVariable( a_QMixName(n), (/ 'lon ', 'lat ', 'sig ', 'time' /), a_QMixLongName(n), 'kg kg-1', xtype = 'double', history = gthst_rst )
end do
call HistoryAddVariable( 'Ps', (/ 'lon ', 'lat ', 'time' /), 'surface pressure', 'Pa', xtype = 'double', history = gthst_rst ) ! (inout)
else
! リスタートデータファイル用
! For restart data file
!
call HistoryAddVariable( 'UB', (/ 'lon ', 'lat ', 'sig ', 'time' /), 'eastward wind (at t-\Delta t)', 'm s-1', xtype = 'double', history = gthst_rst ) ! (inout)
call HistoryAddVariable( 'VB', (/ 'lon ', 'lat ', 'sig ', 'time' /), 'northward wind (at t-\Delta t)', 'm s-1', xtype = 'double', history = gthst_rst ) ! (inout)
call HistoryAddVariable( 'TempB', (/ 'lon ', 'lat ', 'sig ', 'time' /), 'temperature (at t-\Delta t)', 'K', xtype = 'double', history = gthst_rst ) ! (inout)
do n = 1, ncmax
call HistoryAddVariable( trim(a_QMixName(n))//'B', (/ 'lon ', 'lat ', 'sig ', 'time' /), a_QMixLongName(n), 'kg kg-1', xtype = 'double', history = gthst_rst )
end do
call HistoryAddVariable( 'PsB', (/ 'lon ', 'lat ', 'time' /), 'surface pressure (at t-\Delta t)', 'Pa', xtype = 'double', history = gthst_rst ) ! (inout)
call HistoryAddVariable( 'UN', (/ 'lon ', 'lat ', 'sig ', 'time' /), 'eastward wind (at t)', 'm s-1', xtype = 'double', history = gthst_rst ) ! (inout)
call HistoryAddVariable( 'VN', (/ 'lon ', 'lat ', 'sig ', 'time' /), 'northward wind (at t)', 'm s-1', xtype = 'double', history = gthst_rst ) ! (inout)
call HistoryAddVariable( 'TempN', (/ 'lon ', 'lat ', 'sig ', 'time' /), 'temperature (at t)', 'K', xtype = 'double', history = gthst_rst ) ! (inout)
do n = 1, ncmax
call HistoryAddVariable( trim(a_QMixName(n))//'N', (/ 'lon ', 'lat ', 'sig ', 'time' /), a_QMixLongName(n), 'kg kg-1', xtype = 'double', history = gthst_rst )
end do
call HistoryAddVariable( 'PsN', (/ 'lon ', 'lat ', 'time' /), 'surface pressure (at t)', 'Pa', xtype = 'double', history = gthst_rst ) ! (inout)
end if
restart_file_opened = .true.
end subroutine RestartFileOpen
| Subroutine : | |||
| xyz_UB(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in)
| ||
| xyz_VB(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in)
| ||
| xyz_TempB(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in)
| ||
| xyzf_QMixB(0:imax-1, 1:jmax, 1:kmax, 1:ncmax) : | real(DP), intent(in)
| ||
| xy_PsB(0:imax-1, 1:jmax) : | real(DP), intent(in)
| ||
| xyz_UN(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in)
| ||
| xyz_VN(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in)
| ||
| xyz_TempN(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in)
| ||
| xyzf_QMixN(0:imax-1, 1:jmax, 1:kmax, 1:ncmax) : | real(DP), intent(in)
| ||
| xy_PsN(0:imax-1, 1:jmax) : | real(DP), intent(in)
|
リスタートデータの出力を行います.
Output restart data
subroutine RestartFileOutput( xyz_UB, xyz_VB, xyz_TempB, xyzf_QMixB, xy_PsB, xyz_UN, xyz_VN, xyz_TempN, xyzf_QMixN, xy_PsN )
!
! リスタートデータの出力を行います.
!
! Output restart data
! モジュール引用 ; USE statements
!
! 時刻管理
! Time control
!
use timeset, only: TimeN, EndTime, InitialDate ! 計算開始日時.
! Start date of calculation
! gtool4 データ出力
! Gtool4 data output
!
use gtool_history, only: HistoryPut, HistorySetTime
! 暦と日時の取り扱い
! Calendar and Date handler
!
use dc_calendar, only: DCCalDateInquire
! 組み込み関数 PRESENT の拡張版関数
! Extended functions of intrinsic function "PRESENT"
!
use dc_present, only: present_and_true
! 宣言文 ; Declaration statements
!
implicit none
real(DP), intent(in):: xyz_UB (0:imax-1, 1:jmax, 1:kmax)
! $ u (t-\Delta t) $ . 東西風速. Eastward wind
real(DP), intent(in):: xyz_VB (0:imax-1, 1:jmax, 1:kmax)
! $ v (t-\Delta t) $ . 南北風速. Northward wind
real(DP), intent(in):: xyz_TempB (0:imax-1, 1:jmax, 1:kmax)
! $ T (t-\Delta t) $ . 温度. Temperature
real(DP), intent(in):: xyzf_QMixB (0:imax-1, 1:jmax, 1:kmax, 1:ncmax)
! $ q (t-\Delta t) $ . 比湿. Specific humidity
real(DP), intent(in):: xy_PsB (0:imax-1, 1:jmax)
! $ p_s (t-\Delta t) $ . 地表面気圧. Surface pressure
real(DP), intent(in):: xyz_UN (0:imax-1, 1:jmax, 1:kmax)
! $ u (t) $ . 東西風速. Eastward wind
real(DP), intent(in):: xyz_VN (0:imax-1, 1:jmax, 1:kmax)
! $ v (t) $ . 南北風速. Northward wind
real(DP), intent(in):: xyz_TempN (0:imax-1, 1:jmax, 1:kmax)
! $ T (t) $ . 温度. Temperature
real(DP), intent(in):: xyzf_QMixN (0:imax-1, 1:jmax, 1:kmax, 1:ncmax)
! $ q (t) $ . 比湿. Specific humidity
real(DP), intent(in):: xy_PsN (0:imax-1, 1:jmax)
! $ p_s (t) $ . 地表面気圧. Surface pressure
! 作業変数
! Work variables
!
logical:: flag_output
! 出力のフラグ.
! Flag for output
character(TOKEN):: date_str ! 日時の年月日時分秒形式.
! Date with year-month-day hour:minute:second format
integer :: n
! 実行文 ; Executable statement
!
if ( .not. restart_file_opened ) call RestartFileOpen
! リスタートデータ出力であることのチェック
! Check restart data output
!
if ( flag_init_data_save ) then
call MessageNotify( 'E', module_name, 'Now, initial data output mode.' )
end if
! 出力タイミングのチェック
! Check output timing
!
flag_output = TimeN - PrevOutputTime >= IntTime
if ( TimeN >= EndTime .and. .not. flag_output_end ) then
flag_output = .true.
flag_output_end = .true.
end if
flag_output = ( .not. TimeN == PrevOutputTime ) .and. flag_output
flag_output = flag_init_data_save .or. flag_output
if ( .not. flag_output ) return
! 次回用に, 今回の出力 (希望) 時刻 を保存
! Save output time (expected) in this time, for next time
!
PrevOutputTime = PrevOutputTime + IntTime
! 時刻の設定
! Set time
!
call HistorySetTime( timed = TimeN, history = gthst_rst )
! "TimeN" を年月日時分秒表記にして "datetime" 変数へ出力
! Put "TimeN" on "datetime" variable with year-month-day hour:minute:second format
!
call DCCalDateInquire( date_str = date_str, elapse_sec = TimeN, date = InitialDate ) ! (in) optional
call HistoryPut( 'datetime', date_str, history = gthst_rst ) ! (inout) optional
! データ出力
! Data output
!
call HistoryPut( 'UB', xyz_UB, history = gthst_rst ) ! (in)
call HistoryPut( 'VB', xyz_VB, history = gthst_rst ) ! (in)
call HistoryPut( 'TempB', xyz_TempB, history = gthst_rst ) ! (in)
do n = 1, ncmax
call HistoryPut( trim(a_QMixName(n))//'B', xyzf_QMixB(:,:,:,n), history = gthst_rst ) ! (in)
end do
call HistoryPut( 'PsB', xy_PsB, history = gthst_rst ) ! (in)
call HistoryPut( 'UN', xyz_UN, history = gthst_rst ) ! (in)
call HistoryPut( 'VN', xyz_VN, history = gthst_rst ) ! (in)
call HistoryPut( 'TempN', xyz_TempN, history = gthst_rst ) ! (in)
do n = 1, ncmax
call HistoryPut( trim(a_QMixName(n))//'N', xyzf_QMixN(:,:,:,n), history = gthst_rst ) ! (in)
end do
call HistoryPut( 'PsN', xy_PsN, history = gthst_rst ) ! (in)
end subroutine RestartFileOutput
| Variable : | |||
| restart_file_io_inited = .false. : | logical, save, public
|
| Variable : | |||
| restart_file_opened = .false. : | logical, save, public
|
| Variable : | |||
| flag_init_data_save : | logical, save
|
| Variable : | |||
| flag_output_end : | logical, save
|
| Variable : | |||
| gthst_rst : | type(GT_HISTORY), save
|
| Constant : | |||
| module_name = ‘restart_file_io‘ : | character(*), parameter
|
| Constant : | |||
| version = ’$Name: $’ // ’$Id: restart_file_io.f90,v 1.26 2013/09/30 03:03:42 yot Exp $’ : | character(*), parameter
|