gtool5 Fortran 90/95 ライブラリ 1.0.0-rc5
English
Loading...
Searching...
No Matches
dc_date_generic Module Reference

dc_date より提供される手続の引用仕様宣言 More...

Data Types

interface  dcdatetimecreate
interface  dcdifftimecreate
interface  dcdatetimeputline
interface  dcdifftimeputline
interface  setcaltype
interface  setsecofday
interface  validcaltype
interface  validzone
interface  zonetodiff
interface  parsetimeunits
interface  setzone
interface  eval
interface  evalday
interface  evalhour
interface  evalmin
interface  evalsec
interface  evalnondim
interface  evalsclsec
interface  evalbyunit
interface  tochar
interface  tocharcal
interface  operator(+)
interface  operator(-)
interface  operator(*)
interface  operator(/)
interface  mod
interface  operator(==)
interface  operator(>)
interface  operator(<)
interface  operator(>=)
interface  operator(<=)
interface  max
interface  min
interface  create
interface  putline

Detailed Description

dc_date より提供される手続の引用仕様宣言

Author
Yasuhiro MORIKAWA, Eizi TOYODA

このモジュールは dc_date の手続きの引用仕様を提供します. モジュールの概要については dc_date を参照ください.

手続一覧

以下の手続きは DC_DATETIME または DC_DIFFTIME 派生型 (日時・時刻に関する情報を格納) を対象とします.

手続名 説明
DCDateTimeCreate DC_DATETIME 型変数の初期設定
DCDiffTimeCreate DC_DIFFTIME 型変数の初期設定
assignment(=) DC_DATETIME/DC_DIFFTIME 変数の初期設定
Eval 日時・時刻情報を個別に取得
toChar 日時・時刻情報を文字型変数へ変換
EvalDay 日数 (実数型) に換算して取得
EvalHour 時間 (実数型) に換算して取得
EvalMin 分 (実数型) に換算して取得
EvalSec 秒 (実数型) に換算して取得
EvalNondim 無次元時間 (実数型) に換算して取得
EvalByUnit 単位を指定し、日・時・分・秒のいずれかに換算
operator(+) 加算 (DC_DATETIME/DC_DIFFTIME 型同士)
operator(-) 減算 (DC_DATETIME/DC_DIFFTIME 型同士)
operator(*) 乗算 (DC_DIFFTIME 型と数値型)
operator(/) 除算 (DC_DIFFTIME 型と数値型)
mod 余り (DC_DIFFTIME 型同士)
operator(==) 比較 (DC_DATETIME 型同士)
operator(>) 比較 (DC_DATETIME 型同士)
operator(>=) 比較 (DC_DATETIME 型同士)
operator(<) 比較 (DC_DATETIME 型同士)
operator(<=) 比較 (DC_DATETIME 型同士)
max 大きい値を返す
min 小さい値を返す
SetZone タイムゾーンを変更
DCDateTimePutLine DC_DATETIME 変数の情報を印字
DCDiffTimePutLine DC_DIFFTIME 変数の情報を印字

以下の手続きは dc_date_types 内部の変数を変更します:

手続名 説明
SetCaltype 暦法のデフォルトを変更
SetSecOfDay 1 日の秒数のデフォルトを変更

その他の手続き:

手続名 説明
ValidCaltype 暦法が有効なものかをチェック
ValidZone タイムゾーンとして有効かをチェック
ZoneToDiff タイムゾーンを DC_DIFFTIME 変数へと変換
ParseTimeUnits 時間の単位を解析し、単位のシンボルを返す

使用方法

現在時刻の表示

DC_DATETIME 型の変数に DCDateTimeCreate サブルーチンを用いると 時刻が設定されます. 特に年月日を指定しないと現在時刻が設定されます. 設定された時刻は toChar によって文字型変数へと変換できます. Printf サブルーチンについては dc_string::Printf を参照ください.

program dc_date_sample1
use dc_string, only: printf
use dc_date, only: dc_datetime, dcdatetimecreate, tochar
implicit none
type(DC_DATETIME) :: time
call dcdatetimecreate( time = time ) ! (out)
call printf( fmt = 'current date and time is %c', c1 = trim( tochar(time) ) )
end program dc_date_sample1
日付および時刻に関する手続きを提供するモジュール
Definition dc_date.f90:57
文字型変数の操作
Definition dc_string.f90:83

日時・時刻情報の加算

DC_DIFFTIME 型の変数は日時差を表現します. 下記の例では、 日時差を表現するための変数として diff を用意し、 Create サブルーチンで 25 日 + 12 時間 + 50 分の日時差を設定しています. DC_DATETIME 型の変数 time_beforediff とを operator(+) によって 加算することで time_before から 25 日 + 12 時間 + 50 分を 進めた日時 time_after を取得しています.

program dc_date_sample2
use dc_types, only: dp
use dc_string, only: printf
use dc_date, only: dc_datetime, dc_difftime, &
& dcdatetimecreate, dcdifftimecreate, tochar, operator(+)
implicit none
type(DC_DATETIME) :: time_before, time_after
type(DC_DIFFTIME) :: diff
call dcdatetimecreate( time = time_before, & ! (out)
& year = 2006, mon = 6, day = 10, & ! (in)
& hour = 14, min = 15, sec = 0.0_dp ) ! (in)
call dcdifftimecreate( diff = diff, & ! (out)
& day = 25, hour = 12, min = 50) ! (in)
time_after = time_before + diff
call printf( fmt = '%c + %c = %c', &
& c1 = trim( tochar(time_before) ), c2 = trim( tochar(diff) ), &
& c3 = trim( tochar(time_after) ) )
end program dc_date_sample2
種別型パラメタを提供します。
Definition dc_types.f90:55
integer, parameter, public dp
倍精度実数型変数
Definition dc_types.f90:92

時間積分のループへの応用

以下は dA/dt = -αA (初期値 1, α=0.0001) を t = 12 (時間) まで解くプログラムの例です. 時間積分には前進差分を用いています. Δt、データの出力間隔、計算時間に DC_DIFFTIME を用いることで、 ループの終了処理やデータ出力の際の時刻の比較が容易となります.

program dc_date_sample3
use dc_types, only: dp
use dc_date, only: dc_difftime, &
& dcdifftimecreate, evalsec, evalbyunit, mod, &
& operator(*), operator(==), operator(>)
implicit none
real(DP) :: func_a = 1.0d0 ! 関数 A の初期値
real(DP), parameter :: alph = 0.0001d0 ! 係数 α
character(*), parameter :: out_unit = 'hour' ! 出力される時刻の単位
type(DC_DIFFTIME):: DelTimef, intervalf, calctimef
integer :: i
continue
call dcdifftimecreate( & ! Δt = 5.0 (秒)
& diff = deltimef, & ! (out)
& value = 5.0_dp, unit = 'sec') ! (in)
call dcdifftimecreate( & ! データ出力間隔 = 1.0 (分)
& diff = intervalf, & ! (out)
& value = 1.0_dp, unit = 'min') ! (in)
call dcdifftimecreate( & ! 計算時間 = 12.0 (時間)
& diff = calctimef, & ! (out)
& value = 12.0_dp, unit = 'hour') ! (in)
open( 10, file='dc_date_sample.dat' )
write(10,'(A,A,A)') '# ', out_unit, ' value'
i = 1
do
if (deltimef * i > calctimef) exit ! 計算時間を過ぎたら終了
! A_(n+1) = (1 - αΔt) * A_(n)
func_a = (1.0 - alph * evalsec(deltimef)) * func_a
! intervalf (1 分) 毎にデータを出力
if (mod(deltimef * i, intervalf) == 0) then
write(10,*) ' ', evalbyunit( deltimef * i, out_unit ), func_a
end if
i = i + 1
end do
end program dc_date_sample3