Class | timeset |
In: |
setup/timeset.f90
|
Note that Japanese and English are described in parallel.
時刻情報の管理を行います.
Information of time is controlled.
TimeB : | ステップ $ t - Delta t $ の時刻 |
TimeN : | ステップ $ t $ の時刻 |
TimeA : | ステップ $ t + Delta t $ の時刻 |
DelTime : | $ Delta t $ [s] (実数型の数値) |
StartTime : | 計算開始時刻 |
EndTime : | 計算終了時刻 |
StartDate : | 計算開始日時 |
StartDateValid : | 計算開始日時の有効性 |
———— : | ———— |
TimeB : | Time of step $ t - Delta t $ |
TimeN : | Time of step $ t $ |
TimeA : | Time of step $ t + Delta t $ |
DelTime : | $ Delta t $ [s] (numerical value of float type) |
StartTime : | Start time of calculation |
EndTime : | End time of calculation |
StartDate : | Start date of calculation |
StartDateValid : | Validation of start date of calculation |
TimesetInit : | timeset モジュールの初期化 |
TimesetDelTimeHalf : | Δt を一時的に半分に |
TimesetProgress : | 時刻の進行 |
TimesetClockStart : | 計算時間計測開始 |
TimesetClockStop : | 計算時間計一時停止 |
TimesetClose : | timeset モジュールの終了処理 |
———— : | ———— |
TimesetInit : | Initialize "timeset" module |
TimesetDelTimeHalf : | Reduce delta t to half temporarily |
TimesetProgress : | Progress time |
TimesetClockStart : | Start measurement of computation time |
TimesetClockStop : | Pause measurement of computation time |
TimesetClose : | Terminate "timeset" module |
Variable : | |||
StartDateValid : | logical, save, public
|
Variable : | |||
TimeA : | type(DC_DIFFTIME), save, public
|
Variable : | |||
TimeB : | type(DC_DIFFTIME), save, public
|
Subroutine : | |||
name : | character(*), intent(in)
|
プログラム単位 (主にモジュールを想定) ごとの時間計測を開始します.
Start measurement of computation time by program unit (expected modules).
subroutine TimesetClockStart( name ) ! ! プログラム単位 (主にモジュールを想定) ごとの時間計測を開始します. ! ! Start measurement of computation time by program unit ! (expected modules). ! モジュール引用 ; USE statements ! ! CPU 時間計測 ! CPU time monitor ! use dc_clock, only: DCClockCreate, DCClockStart ! 宣言文 ; Declaration statements ! implicit none character(*), intent(in):: name ! モジュールの名称. ! Name of module ! 作業変数 ! Work variables ! integer:: i ! clocks, clocks_name 用 DO ループ用作業変数 ! Work variables for DO loop for "clocks", "clocks_name" ! 実行文 ; Executable statement ! if ( .not. CpuTimeMoniter ) return do i = 1, clk_proc_num if ( trim(clocks_name(i)) == trim(name) ) then call DCClockStart( clocks(i) ) ! (in) return end if end do call DCClockCreate( clocks(clk_proc_num + 1), name ) ! (in) call DCClockStart( clocks(clk_proc_num + 1) ) ! (in) clocks_name(clk_proc_num + 1) = name clk_proc_num = clk_proc_num + 1 end subroutine TimesetClockStart
Subroutine : | |||
name : | character(*), intent(in)
|
プログラム単位 (主にモジュールを想定) ごとの時間計測を一時停止します.
Pause measurement of computation time by program unit (expected modules).
subroutine TimesetClockStop( name ) ! ! プログラム単位 (主にモジュールを想定) ごとの時間計測を一時停止します. ! ! Pause measurement of computation time by program unit ! (expected modules). ! モジュール引用 ; USE statements ! ! CPU 時間計測 ! CPU time monitor ! use dc_clock, only: DCClockStop ! 宣言文 ; Declaration statements ! implicit none character(*), intent(in):: name ! モジュールの名称. ! Name of module ! 作業変数 ! Work variables ! integer:: i ! clocks, clocks_name 用 DO ループ用作業変数 ! Work variables for DO loop for "clocks", "clocks_name" ! 実行文 ; Executable statement ! if ( .not. CpuTimeMoniter ) return do i = 1, clk_proc_num if ( trim(clocks_name(i)) == trim(name) ) then call DCClockStop( clocks(i) ) ! (in) return end if end do call MessageNotify( 'W', module_name, ' name "%c" is not found in "TimesetClockStop"', c1 = trim(name) ) end subroutine TimesetClockStop
Subroutine : |
計算時間の総計を表示します.
Total computation time is printed.
subroutine TimesetClose ! ! 計算時間の総計を表示します. ! ! Total computation time is printed. ! モジュール引用 ; USE statements ! ! CPU 時間計測 ! CPU time monitor ! use dc_clock, only: DCClockStop, DCClockResult, DCClockSetName, operator(+), operator(-) ! 宣言文 ; Declaration statements ! implicit none integer:: i ! clocks, clocks_name 用 DO ループ用作業変数 ! Work variables for DO loop for "clocks", "clocks_name" ! 作業変数 ! Work variables ! ! 実行文 ; Executable statement ! if ( .not. CpuTimeMoniter ) return ! CPU 時間計測終了 (モデル全体) ! Stop CPU time monitoring (for entire model) ! call DCClockStop( clocks(1) ) ! (in) ! 「その他」の CPU 時間を算出 ! Calculate CPU time of "Others" ! clocks(clk_proc_num + 1) = clocks(1) do i = 2, clk_proc_num clocks(clk_proc_num + 1) = clocks(clk_proc_num + 1) - clocks(i) end do call DCClockSetName( clocks(clk_proc_num + 1), 'others' ) ! CPU 時間の総計を表示 ! Print total CPU time ! call DCClockResult( clocks(2:clk_proc_num + 1), total_auto = .true. ) ! (in) end subroutine TimesetClose
Subroutine : |
計算の初回だけはオイラー法を用いるため, 一時的に Δt を半分にします. TimesetProgress が呼ばれた段階で Δt は元に戻ります.
Delta t is reduced to half temporarily in order to use Euler method at initial step. Delta t is returned to default, when "TimesetProgress" is called.
subroutine TimesetDelTimeHalf ! ! 計算の初回だけはオイラー法を用いるため, ! 一時的に Δt を半分にします. ! TimesetProgress が呼ばれた段階で Δt は元に戻ります. ! ! Delta t is reduced to half temporarily ! in order to use Euler method at initial step. ! Delta t is returned to default, when "TimesetProgress" is called. ! ! 宣言文 ; Declaration statements ! implicit none ! 作業変数 ! Work variables ! ! 実行文 ; Executable statement ! if ( flag_half ) return DelTime = DelTime / 2.0_DP flag_half = .true. end subroutine TimesetDelTimeHalf
Subroutine : |
timeset モジュールの初期化を行います. NAMELIST#timeset_nml の読み込みはこの手続きで行われます.
"timeset" module is initialized. NAMELIST#timeset_nml is loaded in this procedure.
This procedure input/output NAMELIST#timeset_nml .
subroutine TimesetInit ! ! timeset モジュールの初期化を行います. ! NAMELIST#timeset_nml の読み込みはこの手続きで行われます. ! ! "timeset" module is initialized. ! NAMELIST#timeset_nml is loaded in this procedure. ! ! モジュール引用 ; USE statements ! ! NAMELIST ファイル入力に関するユーティリティ ! Utilities for NAMELIST file input ! use namelist_util, only: namelist_filename, NmlutilMsg ! ファイル入出力補助 ! File I/O support ! use dc_iounit, only: FileOpen ! 種別型パラメタ ! Kind type parameter ! use dc_types, only: STDOUT ! 標準出力の装置番号. Unit number of standard output ! 日付および時刻の取り扱い ! Date and time handler ! use dc_date_types, only: DC_DIFFTIME ! 日時の差を表現するデータ型. ! Data type for difference about date and time use dc_date, only: DCDateTimeCreate, DCDiffTimeCreate, EvalSec, EvalByUnit, mod, toChar, toCharCal, operator(*), operator(==), operator(<), operator(>), operator(/), operator(+), operator(-) ! CPU 時間計測 ! CPU time monitor ! use dc_clock, only: DCClockCreate, DCClockStart ! 文字列操作 ! Character handling ! use dc_string, only: toChar ! 宣言文 ; 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 real, parameter:: date_zero(8) = 0.0 ! NAMELIST による Date の有効性を調べるための変数 ! Variable for check of validation of "Date" by NAMELIST ! NAMELIST 変数群 ! NAMELIST group name ! namelist /timeset_nml/ StartTimeValue, StartTimeUnit, EndTimeValue, EndTimeUnit, DelTimeValue, DelTimeUnit, PredictIntValue, PredictIntUnit, CpuTimeMoniter, Date, Calendar ! ! デフォルト値については初期化手続 "timeset#TimesetInit" ! のソースコードを参照のこと. ! ! Refer to source codes in the initialization procedure ! "timeset#TimesetInit" for the default values. ! ! 実行文 ; Executable statement ! if ( timeset_inited ) return call InitCheck ! デフォルト値の設定 ! Default values settings ! StartTimeValue = 0.0_DP StartTimeUnit = 'day' EndTimeValue = 10.0_DP EndTimeUnit = 'day' DelTime = 180.0_DP DelTimeValue = 30.0_DP DelTimeUnit = 'min' DelTimeSave = DelTime flag_half = .false. PredictIntValue = 1.0_DP PredictIntUnit = 'day' call DCDiffTimeCreate( PredictIntTime, PredictIntValue, PredictIntUnit ) ! (in) call DCDiffTimeCreate( PredictPrevTime, StartTimeValue, StartTimeUnit ) ! (in) CpuTimeMoniter = .true. Date = 0.0 Calendar = '' StartDateValid = .false. ! 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 = timeset_nml, iostat = iostat_nml ) ! (out) close( unit_nml ) call NmlutilMsg( iostat_nml, module_name ) ! (in) if ( iostat_nml == 0 ) write( STDOUT, nml = timeset_nml ) end if ! DC_DIFFTIME 型変数の設定 ! Configure DC_DIFFTIME type variables ! call DCDiffTimeCreate( StartTime, StartTimeValue, StartTimeUnit ) ! (in) call DCDiffTimeCreate( EndTime, EndTimeValue, EndTimeUnit ) ! (in) call DCDiffTimeCreate( DCdiffDelTime, DelTimeValue, DelTimeUnit ) ! (in) call DCDiffTimeCreate( PredictIntTime, PredictIntValue, PredictIntUnit ) ! (in) PredictPrevTime = StartTime - DCdiffDelTime ! 時刻の正当性のチェック ! Check validation of time ! call TimeValidCheck( StartTime, EndTime, DCdiffDelTime, PredictIntTime ) ! $ \Delta t $ [s] 算出 ! Calculate $ \Delta t $ [s] ! DelTime = EvalSec( DCdiffDelTime ) DelTimeSave = DelTime ! 各タイムステップの時刻の設定 ! Configure time on each time step ! call DCDiffTimeCreate( TimeN, StartTimeValue, StartTimeUnit ) ! (in) TimeB = TimeN - DCdiffDelTime TimeA = TimeN + DCdiffDelTime ! CPU 時間計測開始 (モデル全体) ! Start CPU time monitoring (for entire model) ! if ( CpuTimeMoniter ) then call DCClockCreate( clocks(clk_proc_num + 1), 'total' ) ! (in) call DCClockStart( clocks(clk_proc_num + 1) ) ! (in) clocks_name(clk_proc_num + 1) = 'total' clk_proc_num = clk_proc_num + 1 end if ! 計算開始日時 ! Start date of calculation ! if ( any( date_zero(1:8) /= Date(1:8) ) ) then call DCDateTimeCreate( StartDate, year = Date(1), mon = Date(2), day = Date(3), hour = Date(4), min = Date(5), sec = real( Date(6), DP ) , zone_hour = Date(7), zone_min = Date(8), caltype_str = Calendar ) ! (in) StartDateValid = .true. else StartDateValid = .false. end if ! 印字 ; Print ! call MessageNotify( 'M', module_name, '----- Initialization Messages -----' ) call MessageNotify( 'M', module_name, ' StartTime = %f [%c]', d = (/ StartTimeValue /), c1 = trim(StartTimeUnit) ) if ( StartDateValid ) then call MessageNotify( 'M', module_name, ' StartDate = %c', c1 = trim(toChar(StartDate)) ) call MessageNotify( 'M', module_name, ' Calendar = %c', c1 = trim(toCharCal(StartDate)) ) end if call MessageNotify( 'M', module_name, ' EndTime = %f [%c]', d = (/ EndTimeValue /), c1 = trim(EndTimeUnit) ) call MessageNotify( 'M', module_name, ' DelTime = %f [%c]', d = (/ DelTimeValue /), c1 = trim(DelTimeUnit) ) call MessageNotify( 'M', module_name, ' = %f [%c]', d = (/ DelTime /), c1 = 'sec' ) call MessageNotify( 'M', module_name, ' PredictInt = %f [%c]', d = (/ PredictIntValue /), c1 = trim(PredictIntUnit) ) call MessageNotify( 'M', module_name, ' CpuTimeMoniter = %b', l = (/ CpuTimeMoniter /) ) call MessageNotify( 'M', module_name, '-- version = %c', c1 = trim(version) ) timeset_inited = .true. end subroutine TimesetInit
Subroutine : |
timeset モジュール内の時刻を進めます. また, TimesetProgress#PredictIntStep で設定された値に応じて, 現在までの計算時間と計算終了予測時刻を表示します.
Progress time configured in "timeset" module. And, computation time until now and predicted end of computation time are printed according to configured "TimesetProgress#PredictIntStep"
subroutine TimesetProgress ! ! timeset モジュール内の時刻を進めます. ! また, TimesetProgress#PredictIntStep で設定された値に応じて, ! 現在までの計算時間と計算終了予測時刻を表示します. ! ! Progress time configured in "timeset" module. ! And, computation time until now and ! predicted end of computation time are printed ! according to configured "TimesetProgress#PredictIntStep" ! ! モジュール引用 ; USE statements ! ! CPU 時間計測 ! CPU time monitor ! use dc_clock, only: DCClockPredict, DCClockStop, DCClockClose, operator(+), operator(-) ! 日付および時刻の取り扱い ! Date and time handler ! use dc_date, only: operator(==), operator(+), operator(/), operator(-), operator(>=), toChar ! 宣言文 ; Declaration statements ! implicit none ! 作業変数 ! Work variables ! type(CLOCK):: clock_tmp ! 実行文 ; Executable statement ! ! Δt を元に戻す. ! Delta t is returned to default ! if ( flag_half ) then DelTime = DelTimeSave flag_half = .false. end if ! 終了予測日時表示 ! Print predicted end time ! if ( TimeA - PredictPrevTime >= PredictIntTime ) then PredictPrevTime = PredictPrevTime + PredictIntTime if ( CpuTimeMoniter ) then clock_tmp = clocks(1) call DCClockStop( clock_tmp ) ! (in) call DCClockPredict( clock_tmp, real( ( TimeA - StartTime ) / ( ( EndTime + DelTimeSave ) - StartTime ) ) ) ! (in) call DCClockClose( clock_tmp ) ! (in) else call MessageNotify( 'M', module_name, ' Current/Total = [ %c / %c ]', c1 = trim(toChar(TimeA - StartTime)), c2 = trim(toChar(EndTime - StartTime)) ) end if end if ! 時刻の進行 ! Progress time ! TimeB = TimeB + DCdiffDelTime TimeN = TimeN + DCdiffDelTime TimeA = TimeA + DCdiffDelTime end subroutine TimesetProgress
Variable : | |||
timeset_inited = .false. : | logical, save, public
|
Variable : | |||
CpuTimeMoniter : | logical, save
|
Variable : | |||
DelTimeSave : | real(DP), save
|
Variable : | |||
DelTimeValue : | real(DP), save
|
Variable : | |||
EndTimeUnit : | character(TOKEN), save
|
Subroutine : |
依存モジュールの初期化チェック
Check initialization of dependency modules
subroutine InitCheck ! ! 依存モジュールの初期化チェック ! ! Check initialization of dependency modules ! モジュール引用 ; USE statements ! ! NAMELIST ファイル入力に関するユーティリティ ! Utilities for NAMELIST file input ! use namelist_util, only: namelist_util_inited ! 実行文 ; Executable statement ! if ( .not. namelist_util_inited ) call MessageNotify( 'E', module_name, '"namelist_util" module is not initialized.' ) end subroutine InitCheck
Variable : | |||
PredictIntTime : | type(DC_DIFFTIME), save
|
Variable : | |||
PredictIntUnit : | character(TOKEN), save
|
Variable : | |||
PredictIntValue : | real(DP), save
|
Variable : | |||
PredictPrevTime : | type(DC_DIFFTIME), save
|
Variable : | |||
StartTimeUnit : | character(TOKEN), save
|
Subroutine : | |||
dcdiff_start : | type(DC_DIFFTIME), intent(in)
| ||
dcdiff_end : | type(DC_DIFFTIME), intent(in)
| ||
dcdiff_delt : | type(DC_DIFFTIME), intent(in)
| ||
dcdiff_predict : | type(DC_DIFFTIME), intent(in)
|
時刻情報についての有効性をチェックします.
Check validation about infomation time
subroutine TimeValidCheck( dcdiff_start, dcdiff_end, dcdiff_delt, dcdiff_predict ) ! ! 時刻情報についての有効性をチェックします. ! ! Check validation about infomation time ! ! モジュール引用 ; USE statements ! ! 日付および時刻の取り扱い ! Date and time handler ! use dc_date_types, only: DC_DIFFTIME ! 日時の差を表現するデータ型. ! Data type for difference about date and time use dc_date, only: DCDiffTimeCreate, EvalSec, EvalByUnit, mod, toChar, operator(*), operator(==), operator(<), operator(>), operator(/), operator(+), operator(-) implicit none type(DC_DIFFTIME), intent(in):: dcdiff_start ! 計算開始時刻. ! Start time of calculation type(DC_DIFFTIME), intent(in):: dcdiff_end ! 計算終了時刻. ! End time of calculation type(DC_DIFFTIME), intent(in):: dcdiff_delt ! $ \Delta t $ [s] type(DC_DIFFTIME), intent(in):: dcdiff_predict ! 終了予測日時表示間隔. ! Interval of predicted end time output ! 作業変数 ! Work variables ! ! 実行文 ; Executable statement ! if ( .not. 0.0_DP < EvalSec( dcdiff_end - dcdiff_start ) ) then call MessageNotify( 'E', module_name, 'StartTime=<%f[%c]> is later than EndTime=<%f[%c]>', d = (/ StartTimeValue, EndTimeValue /), c1 = trim(StartTimeUnit), c2 = trim(EndTimeUnit) ) end if if ( dcdiff_delt > ( dcdiff_end - dcdiff_start ) ) then call MessageNotify( 'E', module_name, 'DelTime=<%f[%c]> is larger than ' // 'EndTime=<%f[%c]> - StartTime=<%f[%c]>.', d = (/ DelTimeValue, EndTimeValue, StartTimeValue /), c1 = trim(DelTimeUnit), c2 = trim(EndTimeUnit), c3 = trim(StartTimeUnit) ) end if if ( .not. EvalSec( dcdiff_delt ) > 0.0_DP ) then call MessageNotify( 'E', module_name, 'DelTime=<%f[%c]> must be more than 0.', d = (/ DelTimeValue /), c1 = trim(DelTimeUnit) ) end if if ( .not. EvalSec( dcdiff_predict ) > 0.0_DP ) then call MessageNotify( 'E', module_name, 'PredictInt=<%f[%c]> must be more than 0.', d = (/ PredictIntValue /), c1 = trim(PredictIntUnit) ) end if end subroutine TimeValidCheck
Variable : | |||
clk_proc_num = 0 : | integer, save
|
Constant : | |||
clkmax = 64 : | integer, parameter
|
Variable : | |||
clocks(1:clkmax) : | type(CLOCK), save
|
Variable : | |||
clocks_name(1:clkmax) = ’’ : | character(TOKEN), save
|
Variable : | |||
flag_half : | logical, save
|
Constant : | |||
version = ’$Name: dcpam5-20090317 $’ // ’$Id: timeset.f90,v 1.9 2009-03-17 02:41:03 morikawa Exp $’ : | character(*), parameter
|