| Path: | dc_utils/dccaldateeval.f90 |
| Last Update: | Tue Dec 29 17:16:49 +0900 2009 |
| Authors: | Yasuhiro MORIKAWA |
| Version: | $Id: dccaldateeval.f90,v 1.3 2009-12-29 08:16:49 morikawa Exp $ |
| Tag Name: | $Name: gtool5-20100413 $ |
| Copyright: | Copyright (C) GFD Dennou Club, 2009-. All rights reserved. |
| License: | See COPYRIGHT |
このファイルに記載される手続き群は dc_calendar モジュールから提供されます.
Procedures described in this file are provided from "dc_calendar" module.
| Function : | |||
| result : | real(DP)
| ||
| elapse_sec : | real(DP), intent(in)
| ||
| date : | type(DC_CAL_DATE), intent(in), optional, target
| ||
| cal : | type(DC_CAL), intent(in), optional, target
|
年始めからの通日を算出します.
省略可能引数 date が省略された場合には, dc_calendar 内部で 保持される日時が起点の日時として用いられます. date が省略されない場合にはその変数に設定された日時が 起点の日時として用いられます.
省略可能引数 cal が省略された場合には, 経過秒数 elapse_sec の年月日時分への変換に dc_calendar 内部で保持される暦が用いられます. cal が省略されない場合にはその変数に設定された暦が用いられます.
Evaluate day of year.
If an optional argument date is omitted, information of date that is stored in the "dc_calendar" is used as date of origin, If date is not omitted, information of the variable is used as date of origin.
If an optional argument cal is omitted, information of calendar that is stored in the "dc_calendar" is used for conversion of elapsed seconds elapse_sec into year-month-day etc. If cal is not omitted, information of the variable is used.
function DCCalDateEvalDayOfYear1( elapse_sec, date, cal ) result(result)
! 年始めからの通日を算出します.
!
! 省略可能引数 *date* が省略された場合には, dc_calendar 内部で
! 保持される日時が起点の日時として用いられます.
! *date* が省略されない場合にはその変数に設定された日時が
! 起点の日時として用いられます.
!
! 省略可能引数 *cal* が省略された場合には, 経過秒数 *elapse_sec*
! の年月日時分への変換に dc_calendar 内部で保持される暦が用いられます.
! *cal* が省略されない場合にはその変数に設定された暦が用いられます.
!
! Evaluate day of year.
!
! If an optional argument *date* is omitted,
! information of date that is stored in the "dc_calendar"
! is used as date of origin,
! If *date* is not omitted, information of the variable is used as
! date of origin.
!
! If an optional argument *cal* is omitted,
! information of calendar that is stored in the "dc_calendar"
! is used for conversion of elapsed seconds *elapse_sec* into
! year-month-day etc.
! If *cal* is not omitted, information of the variable is used.
!
use dc_calendar_types, only: DC_CAL_DATE, DC_CAL
use dc_calendar_internal, only: default_cal, default_cal_set, default_date, dccaldate_normalize, dccaldate_ym2d
use dc_calendar_generic, only: DCCalDateInquire
use dc_types, only: DP
implicit none
real(DP), intent(in):: elapse_sec
! *date* からの経過秒数.
! Elapsed seconds from *date*.
type(DC_CAL_DATE), intent(in), optional, target:: date
! 起点となる日時情報を収めたオブジェクト.
!
! An object that stores information of
! date of origin.
type(DC_CAL), intent(in), optional, target:: cal
! 暦情報を収めたオブジェクト.
!
! An object that stores information of
! calendar.
real(DP):: result
! 年始めからの通日.
! Day of year.
! 作業変数
! Work variables
!
integer:: year, month, day, hour, min
real(DP):: sec
integer:: stat
type(DC_CAL_DATE), pointer:: datep =>null()
type(DC_CAL), pointer:: calp =>null()
continue
! オブジェクトのポインタ割付
! Associate pointer of an object
!
if ( present( date ) ) then
datep => date
else
datep => default_date
end if
if ( present( cal ) ) then
calp => cal
else
calp => default_cal
if ( .not. calp % initialized ) call default_cal_set
end if
! 初期設定のチェック
! Check initialization
!
result = 0.0
if ( .not. datep % initialized ) return
if ( .not. calp % initialized ) return
! 経過時間を与えた場合の日時を取得
! Inquire date and time when elapse time is given
!
call DCCalDateInquire( year, month, day, hour, min, sec, elapse_sec = elapse_sec, date = date , cal = cal ) ! (in)
! 年初めからの通日を取得
! Day of year is inquire
!
stat = dccaldate_ym2d( year, month, day, cal, result ) ! (out)
end function DCCalDateEvalDayOfYear1
| Subroutine : | |||
| init_date : | type(DC_CAL_DATE), intent(in)
| ||
| elapse_sec : | real(DP), intent(in)
| ||
| cal : | type(DC_CAL), intent(in), optional, target
| ||
| date : | type(DC_CAL_DATE), intent(out), optional, target
| ||
| err : | logical, intent(out), optional
|
日時の算出と設定を行います.
省略可能引数 date が省略された場合には, dc_calendar 内部で 保持される "dc_calendar_types#DC_CAL_DATE" 型の変数に日時が 設定されます. その後の手続きで date を省略した場合には この日時が使用されます. date が省略されない場合にはその変数に日時が設定されます. その日時を使用する場合, 手続きにその "dc_calendar_types#DC_CAL_DATE" 型の変数 を与えてください.
省略可能引数 cal が省略された場合には, 経過秒数 elapse_sec の年月日時分への変換に dc_calendar 内部で保持される暦が用いられます. cal が省略されない場合にはその変数に設定された暦が用いられます.
Evaluate and set date.
If an optional argument date is omitted, the date setting is stored to a "dc_calendar_types#DC_CAL_DATE" variable that is saved in the "dc_calendar". When date is omitted in subsequent procedures, the internal date is used. If date is not omitted, the settings is stored to the date. In order to use the date setting, use the "dc_calendar_types#DC_CAL_DATE" varieble to subsequent procedures.
If an optional argument cal is omitted, information of calendar that is stored in the "dc_calendar" is used for conversion of elapsed seconds elapse_sec into year-month-day etc. If cal is not omitted, information of the variable is used.
subroutine DCCalDateEvalID1( init_date, elapse_sec, cal, date, err )
!
! 日時の算出と設定を行います.
!
! 省略可能引数 *date* が省略された場合には, dc_calendar 内部で
! 保持される "dc_calendar_types#DC_CAL_DATE" 型の変数に日時が
! 設定されます. その後の手続きで *date* を省略した場合には
! この日時が使用されます.
! *date* が省略されない場合にはその変数に日時が設定されます.
! その日時を使用する場合, 手続きにその "dc_calendar_types#DC_CAL_DATE" 型の変数
! を与えてください.
!
! 省略可能引数 *cal* が省略された場合には, 経過秒数 *elapse_sec*
! の年月日時分への変換に dc_calendar 内部で保持される暦が用いられます.
! *cal* が省略されない場合にはその変数に設定された暦が用いられます.
!
! Evaluate and set date.
!
! If an optional argument *date* is omitted,
! the date setting is stored to a "dc_calendar_types#DC_CAL_DATE"
! variable that is saved in the "dc_calendar".
! When *date* is omitted in subsequent procedures, the internal date
! is used.
! If *date* is not omitted, the settings is stored to the *date*.
! In order to use the date setting, use the "dc_calendar_types#DC_CAL_DATE"
! varieble to subsequent procedures.
!
! If an optional argument *cal* is omitted,
! information of calendar that is stored in the "dc_calendar"
! is used for conversion of elapsed seconds *elapse_sec* into
! year-month-day etc.
! If *cal* is not omitted, information of the variable is used.
!
use dc_calendar_types, only: DC_CAL, DC_CAL_DATE
use dc_calendar_internal, only: default_cal, default_cal_set, default_date, dccaldate_normalize
use dc_calendar_generic, only: DCCalDateCreate, DCCalDateToChar, DCCalToChar
use dc_message, only: MessageNotify
use dc_trace, only: BeginSub, EndSub
use dc_error, only: StoreError, DC_NOERR, DC_ENOTINIT, DC_EINCONSISTCALDATE, DC_EALREADYINIT, DC_EBADDATE, DC_ENEGATIVE
use dc_types, only: STRING, DP, TOKEN
use dc_types, only: DP
implicit none
type(DC_CAL_DATE), intent(in):: init_date
! 起点となる日時情報を収めたオブジェクト.
!
! An object that stores information of
! date of origin.
real(DP), intent(in):: elapse_sec
! *init_date* からの経過秒数.
! Elapsed seconds from *init_date*.
type(DC_CAL), intent(in), optional, target:: cal
! 暦情報を収めたオブジェクト.
!
! An object that stores information of
! calendar.
type(DC_CAL_DATE), intent(out), optional, target:: date
! 経過時間後の日時情報を収めたオブジェクト.
!
! An object that stores information of
! date and time after elapsed time.
logical, intent(out), optional:: err
! 例外処理用フラグ.
! デフォルトでは, この手続き内でエラーが
! 生じた場合, プログラムは強制終了します.
! 引数 *err* が与えられる場合,
! プログラムは強制終了せず, 代わりに
! *err* に .true. が代入されます.
!
! Exception handling flag.
! By default, when error occur in
! this procedure, the program aborts.
! If this *err* argument is given,
! .true. is substituted to *err* and
! the program does not abort.
! 作業変数
! Work variables
!
integer:: wyear, wmonth, wday, whour, wmin
real(DP):: wsec
character(TOKEN):: wzone
type(DC_CAL_DATE), pointer:: datep =>null()
type(DC_CAL), pointer:: calp =>null()
character(STRING):: e_date_str, e_cal_str
integer:: stat
character(STRING):: cause_c
character(*), parameter:: subname = 'DCCalDateEvalID1'
continue
call BeginSub( subname )
stat = DC_NOERR
cause_c = ''
! オブジェクトのポインタ割付
! Associate pointer of an object
!
if ( present( date ) ) then
datep => date
else
datep => default_date
end if
if ( present( cal ) ) then
calp => cal
else
calp => default_cal
if ( .not. calp % initialized ) call default_cal_set
end if
! 初期設定のチェック
! Check initialization
!
!!$ if ( .not. datep % initialized ) then
!!$ stat = DC_ENOTINIT
!!$ cause_c = 'DC_CAL_DATE'
!!$ goto 999
!!$ end if
if ( .not. calp % initialized ) then
stat = DC_ENOTINIT
cause_c = 'DC_CAL'
goto 999
end if
! 各要素への値の参照
! Refer elements
!
wyear = init_date % year
wmonth = init_date % month
wday = init_date % day
whour = init_date % hour
wmin = init_date % min
wsec = init_date % sec
wzone = init_date % zone
! 経過時間(秒)の追加
! Add elapsed time (seconds)
!
if ( elapse_sec < 0.0_DP ) then
stat = DC_ENEGATIVE
cause_c = 'elapse_sec'
goto 999
end if
wsec = wsec + elapse_sec
! 日時の正規化
! Normalize date and time
!
stat = dccaldate_normalize( wyear, wmonth, wday, whour, wmin, wsec, calp ) ! (in)
if ( stat == DC_EINCONSISTCALDATE ) then
e_cal_str = DCCalToChar( calp )
e_date_str = DCCalDateToChar( wyear, wmonth, wday, whour, wmin, wsec, zone = "" )
call MessageNotify('W', subname, 'cal=<%c> and date=<%c> are inconsistency', c1 = trim(e_cal_str), c2 = trim(e_date_str) )
goto 999
end if
! オブジェクトの作成
! Create an object
!
call DCCalDateCreate( wyear, wmonth, wday, whour, wmin, wsec, datep, zone = wzone, err = err ) ! (out) optional
if ( present(err) ) then
if ( err ) then
stat = DC_EBADDATE
goto 999
end if
end if
! 終了処理, 例外処理
! Termination and Exception handling
!
999 continue
nullify( calp, datep )
call StoreError( stat, subname, err, cause_c )
call EndSub( subname )
end subroutine DCCalDateEvalID1
| Subroutine : | |||
| init_date : | type(DC_CAL_DATE), intent(in)
| ||
| elapse_time : | real(DP), intent(in)
| ||
| units : | character(*), intent(in)
| ||
| cal : | type(DC_CAL), intent(in), optional, target
| ||
| date : | type(DC_CAL_DATE), intent(out), optional, target
| ||
| err : | logical, intent(out), optional
|
日時の算出と設定を行います.
省略可能引数 date が省略された場合には, dc_calendar 内部で 保持される "dc_calendar_types#DC_CAL_DATE" 型の変数に日時が 設定されます. その後の手続きで date を省略した場合には この日時が使用されます. date が省略されない場合にはその変数に日時が設定されます. その日時を使用する場合, 手続きにその "dc_calendar_types#DC_CAL_DATE" 型の変数 を与えてください.
省略可能引数 cal が省略された場合には, 経過時間 elapse_time の年月日時分への変換に dc_calendar 内部で保持される暦が用いられます. cal が省略されない場合にはその変数に設定された暦が用いられます.
Evaluate and set date.
If an optional argument date is omitted, the date setting is stored to a "dc_calendar_types#DC_CAL_DATE" variable that is saved in the "dc_calendar". When date is omitted in subsequent procedures, the internal date is used. If date is not omitted, the settings is stored to the date. In order to use the date setting, use the "dc_calendar_types#DC_CAL_DATE" varieble to subsequent procedures.
If an optional argument cal is omitted, information of calendar that is stored in the "dc_calendar" is used for conversion of elapsed time elapse_time into year-month-day etc. If cal is not omitted, information of the variable is used.
subroutine DCCalDateEvalID2( init_date, elapse_time, units, cal, date, err )
!
! 日時の算出と設定を行います.
!
! 省略可能引数 *date* が省略された場合には, dc_calendar 内部で
! 保持される "dc_calendar_types#DC_CAL_DATE" 型の変数に日時が
! 設定されます. その後の手続きで *date* を省略した場合には
! この日時が使用されます.
! *date* が省略されない場合にはその変数に日時が設定されます.
! その日時を使用する場合, 手続きにその "dc_calendar_types#DC_CAL_DATE" 型の変数
! を与えてください.
!
! 省略可能引数 *cal* が省略された場合には, 経過時間 *elapse_time*
! の年月日時分への変換に dc_calendar 内部で保持される暦が用いられます.
! *cal* が省略されない場合にはその変数に設定された暦が用いられます.
!
! Evaluate and set date.
!
! If an optional argument *date* is omitted,
! the date setting is stored to a "dc_calendar_types#DC_CAL_DATE"
! variable that is saved in the "dc_calendar".
! When *date* is omitted in subsequent procedures, the internal date
! is used.
! If *date* is not omitted, the settings is stored to the *date*.
! In order to use the date setting, use the "dc_calendar_types#DC_CAL_DATE"
! varieble to subsequent procedures.
!
! If an optional argument *cal* is omitted,
! information of calendar that is stored in the "dc_calendar"
! is used for conversion of elapsed time *elapse_time* into
! year-month-day etc.
! If *cal* is not omitted, information of the variable is used.
!
use dc_calendar_types, only: DC_CAL, DC_CAL_DATE, UNIT_SYMBOL_DAY, UNIT_SYMBOL_HOUR, UNIT_SYMBOL_MIN, UNIT_SYMBOL_SEC
use dc_calendar_internal, only: default_cal, default_cal_set, default_date, dccaldate_normalize, dccaldate_str2usym
use dc_calendar_generic, only: DCCalDateCreate, DCCalDateToChar, DCCalToChar
use dc_message, only: MessageNotify
use dc_trace, only: BeginSub, EndSub
use dc_error, only: StoreError, DC_NOERR, DC_ENOTINIT, DC_EINCONSISTCALDATE, DC_EALREADYINIT, DC_EBADDATE, DC_EBADUNIT, DC_ENEGATIVE
use dc_types, only: STRING, DP, TOKEN
use dc_types, only: DP
implicit none
type(DC_CAL_DATE), intent(in):: init_date
! 起点となる日時情報を収めたオブジェクト.
!
! An object that stores information of
! date of origin.
real(DP), intent(in):: elapse_time
! *init_date* からの経過時間.
! 単位は *unit* で指定する.
!
! Elapsed time from *init_date*.
! Unit is specified as *unit*.
character(*), intent(in):: units
! *elapse_time* の単位.
!
! Unit of *elapse_time*.
type(DC_CAL), intent(in), optional, target:: cal
! 暦情報を収めたオブジェクト.
!
! An object that stores information of
! calendar.
type(DC_CAL_DATE), intent(out), optional, target:: date
! 経過時間後の日時情報を収めたオブジェクト.
!
! An object that stores information of
! date and time after elapsed time.
logical, intent(out), optional:: err
! 例外処理用フラグ.
! デフォルトでは, この手続き内でエラーが
! 生じた場合, プログラムは強制終了します.
! 引数 *err* が与えられる場合,
! プログラムは強制終了せず, 代わりに
! *err* に .true. が代入されます.
!
! Exception handling flag.
! By default, when error occur in
! this procedure, the program aborts.
! If this *err* argument is given,
! .true. is substituted to *err* and
! the program does not abort.
! 作業変数
! Work variables
!
integer:: wyear, wmonth, wday, whour, wmin
real(DP):: wsec
character(TOKEN):: wzone
type(DC_CAL_DATE), pointer:: datep =>null()
type(DC_CAL), pointer:: calp =>null()
character(STRING):: e_date_str, e_cal_str
integer:: tusym
integer:: stat
character(STRING):: cause_c
character(*), parameter:: subname = 'DCCalDateEvalID2'
continue
call BeginSub( subname )
stat = DC_NOERR
cause_c = ''
! オブジェクトのポインタ割付
! Associate pointer of an object
!
if ( present( date ) ) then
datep => date
else
datep => default_date
end if
if ( present( cal ) ) then
calp => cal
else
calp => default_cal
if ( .not. calp % initialized ) call default_cal_set
end if
! 初期設定のチェック
! Check initialization
!
!!$ if ( .not. datep % initialized ) then
!!$ stat = DC_ENOTINIT
!!$ cause_c = 'DC_CAL_DATE'
!!$ goto 999
!!$ end if
if ( .not. calp % initialized ) then
stat = DC_ENOTINIT
cause_c = 'DC_CAL'
goto 999
end if
! 各要素への値の参照
! Refer elements
!
wyear = init_date % year
wmonth = init_date % month
wday = init_date % day
whour = init_date % hour
wmin = init_date % min
wsec = init_date % sec
wzone = init_date % zone
! 経過時間(秒)の追加
! Add elapsed time (seconds)
!
if ( elapse_time < 0.0_DP ) then
stat = DC_ENEGATIVE
cause_c = 'elapse_time'
goto 999
end if
tusym = dccaldate_str2usym(units)
select case(tusym)
case(UNIT_SYMBOL_DAY)
wsec = wsec + elapse_time * calp % hour_in_day * calp % min_in_hour * calp % sec_in_min
case(UNIT_SYMBOL_HOUR)
wsec = wsec + elapse_time * calp % min_in_hour * calp % sec_in_min
case(UNIT_SYMBOL_MIN)
wsec = wsec + elapse_time * calp % sec_in_min
case(UNIT_SYMBOL_SEC)
wsec = wsec + elapse_time
case default
cause_c = units
call MessageNotify('W', subname, 'units=<%c> is invalid. (ONLY day,hrs,min,sec are valid)', c1 = trim(units) )
stat = DC_EBADUNIT
goto 999
end select
! 日時の正規化
! Normalize date and time
!
stat = dccaldate_normalize( wyear, wmonth, wday, whour, wmin, wsec, calp ) ! (in)
if ( stat == DC_EINCONSISTCALDATE ) then
e_cal_str = DCCalToChar( calp )
e_date_str = DCCalDateToChar( wyear, wmonth, wday, whour, wmin, wsec, zone = "" )
call MessageNotify('W', subname, 'cal=<%c> and date=<%c> are inconsistency', c1 = trim(e_cal_str), c2 = trim(e_date_str) )
goto 999
end if
! オブジェクトの作成
! Create an object
!
call DCCalDateCreate( wyear, wmonth, wday, whour, wmin, wsec, datep, zone = wzone, err = err ) ! (out) optional
if ( present(err) ) then
if ( err ) then
stat = DC_EBADDATE
goto 999
end if
end if
! 終了処理, 例外処理
! Termination and Exception handling
!
999 continue
nullify( calp, datep )
call StoreError( stat, subname, err, cause_c )
call EndSub( subname )
end subroutine DCCalDateEvalID2
| Function : | |||
| result : | real(DP)
| ||
| elapse_sec : | real(DP), intent(in)
| ||
| date : | type(DC_CAL_DATE), intent(in), optional, target
| ||
| cal : | type(DC_CAL), intent(in), optional, target
|
日始めからの通秒を算出します.
省略可能引数 date が省略された場合には, dc_calendar 内部で 保持される日時が起点の日時として用いられます. date が省略されない場合にはその変数に設定された日時が 起点の日時として用いられます.
省略可能引数 cal が省略された場合には, 経過秒数 elapse_sec の年月日時分への変換に dc_calendar 内部で保持される暦が用いられます. cal が省略されない場合にはその変数に設定された暦が用いられます.
Evaluate second of day.
If an optional argument date is omitted, information of date that is stored in the "dc_calendar" is used as date of origin, If date is not omitted, information of the variable is used as date of origin.
If an optional argument cal is omitted, information of calendar that is stored in the "dc_calendar" is used for conversion of elapsed seconds elapse_sec into year-month-day etc. If cal is not omitted, information of the variable is used.
function DCCalDateEvalSecOfDay1( elapse_sec, date, cal ) result(result)
! 日始めからの通秒を算出します.
!
! 省略可能引数 *date* が省略された場合には, dc_calendar 内部で
! 保持される日時が起点の日時として用いられます.
! *date* が省略されない場合にはその変数に設定された日時が
! 起点の日時として用いられます.
!
! 省略可能引数 *cal* が省略された場合には, 経過秒数 *elapse_sec*
! の年月日時分への変換に dc_calendar 内部で保持される暦が用いられます.
! *cal* が省略されない場合にはその変数に設定された暦が用いられます.
!
! Evaluate second of day.
!
! If an optional argument *date* is omitted,
! information of date that is stored in the "dc_calendar"
! is used as date of origin,
! If *date* is not omitted, information of the variable is used as
! date of origin.
!
! If an optional argument *cal* is omitted,
! information of calendar that is stored in the "dc_calendar"
! is used for conversion of elapsed seconds *elapse_sec* into
! year-month-day etc.
! If *cal* is not omitted, information of the variable is used.
!
use dc_calendar_types, only: DC_CAL_DATE, DC_CAL
use dc_calendar_internal, only: default_cal, default_cal_set, default_date, dccaldate_normalize, dccaldate_ym2d
use dc_calendar_generic, only: DCCalDateInquire
use dc_types, only: DP
implicit none
real(DP), intent(in):: elapse_sec
! *date* からの経過秒数.
! Elapsed seconds from *date*.
type(DC_CAL_DATE), intent(in), optional, target:: date
! 起点となる日時情報を収めたオブジェクト.
!
! An object that stores information of
! date of origin.
type(DC_CAL), intent(in), optional, target:: cal
! 暦情報を収めたオブジェクト.
!
! An object that stores information of
! calendar.
real(DP):: result
! 日始めからの通秒.
! Second of day.
! 作業変数
! Work variables
!
integer:: stat
type(DC_CAL_DATE), pointer:: datep =>null()
type(DC_CAL), pointer:: calp =>null()
integer:: year, month, day, hour, min
real(DP):: sec
continue
! オブジェクトのポインタ割付
! Associate pointer of an object
!
if ( present( date ) ) then
datep => date
else
datep => default_date
end if
if ( present( cal ) ) then
calp => cal
else
calp => default_cal
if ( .not. calp % initialized ) call default_cal_set
end if
! 初期設定のチェック
! Check initialization
!
result = 0.0
if ( .not. datep % initialized ) return
if ( .not. calp % initialized ) return
! 経過時間を与えた場合の日時を取得
! Inquire date and time when elapse time is given
!
call DCCalDateInquire( year, month, day, hour, min, sec, elapse_sec = elapse_sec, date = date , cal = cal ) ! (in)
! 通秒へ変換
! Convert into sec of year
!
result = hour * calp % min_in_hour * calp % sec_in_min + min * calp % sec_in_min + sec
end function DCCalDateEvalSecOfDay1
| Function : | |||
| result : | real(DP)
| ||
| elapse_sec : | real(DP), intent(in)
| ||
| date : | type(DC_CAL_DATE), intent(in), optional, target
| ||
| cal : | type(DC_CAL), intent(in), optional, target
|
年始めからの通秒を算出します.
省略可能引数 date が省略された場合には, dc_calendar 内部で 保持される日時が起点の日時として用いられます. date が省略されない場合にはその変数に設定された日時が 起点の日時として用いられます.
省略可能引数 cal が省略された場合には, 経過秒数 elapse_sec の年月日時分への変換に dc_calendar 内部で保持される暦が用いられます. cal が省略されない場合にはその変数に設定された暦が用いられます.
Evaluate second of year.
If an optional argument date is omitted, information of date that is stored in the "dc_calendar" is used as date of origin, If date is not omitted, information of the variable is used as date of origin.
If an optional argument cal is omitted, information of calendar that is stored in the "dc_calendar" is used for conversion of elapsed seconds elapse_sec into year-month-day etc. If cal is not omitted, information of the variable is used.
function DCCalDateEvalSecOfYear1( elapse_sec, date, cal ) result(result)
! 年始めからの通秒を算出します.
!
! 省略可能引数 *date* が省略された場合には, dc_calendar 内部で
! 保持される日時が起点の日時として用いられます.
! *date* が省略されない場合にはその変数に設定された日時が
! 起点の日時として用いられます.
!
! 省略可能引数 *cal* が省略された場合には, 経過秒数 *elapse_sec*
! の年月日時分への変換に dc_calendar 内部で保持される暦が用いられます.
! *cal* が省略されない場合にはその変数に設定された暦が用いられます.
!
! Evaluate second of year.
!
! If an optional argument *date* is omitted,
! information of date that is stored in the "dc_calendar"
! is used as date of origin,
! If *date* is not omitted, information of the variable is used as
! date of origin.
!
! If an optional argument *cal* is omitted,
! information of calendar that is stored in the "dc_calendar"
! is used for conversion of elapsed seconds *elapse_sec* into
! year-month-day etc.
! If *cal* is not omitted, information of the variable is used.
!
use dc_calendar_types, only: DC_CAL_DATE, DC_CAL
use dc_calendar_internal, only: default_cal, default_cal_set, default_date, dccaldate_normalize, dccaldate_ym2d
use dc_calendar_generic, only: DCCalDateInquire, DCCalDateEvalDayOfYear
use dc_types, only: DP
implicit none
real(DP), intent(in):: elapse_sec
! *date* からの経過秒数.
! Elapsed seconds from *date*.
type(DC_CAL_DATE), intent(in), optional, target:: date
! 起点となる日時情報を収めたオブジェクト.
!
! An object that stores information of
! date of origin.
type(DC_CAL), intent(in), optional, target:: cal
! 暦情報を収めたオブジェクト.
!
! An object that stores information of
! calendar.
real(DP):: result
! 年始めからの通秒.
! Second of year.
! 作業変数
! Work variables
!
real(DP):: day_of_year
integer:: stat
type(DC_CAL_DATE), pointer:: datep =>null()
type(DC_CAL), pointer:: calp =>null()
integer:: year, month, day, hour, min
real(DP):: sec
continue
! オブジェクトのポインタ割付
! Associate pointer of an object
!
if ( present( date ) ) then
datep => date
else
datep => default_date
end if
if ( present( cal ) ) then
calp => cal
else
calp => default_cal
if ( .not. calp % initialized ) call default_cal_set
end if
! 初期設定のチェック
! Check initialization
!
result = 0.0
if ( .not. datep % initialized ) return
if ( .not. calp % initialized ) return
! 経過時間を与えた場合の日時を取得
! Inquire date and time when elapse time is given
!
call DCCalDateInquire( year, month, day, hour, min, sec, elapse_sec = elapse_sec, date = date , cal = cal ) ! (in)
! 年初めからの通日を取得
! Day of year is inquire
!
stat = dccaldate_ym2d( year, month, day, cal, day_of_year ) ! (out)
! 通秒へ変換
! Convert into sec of year
!
result = ( day_of_year - 1 ) * calp % hour_in_day * calp % min_in_hour * calp % sec_in_min + hour * calp % min_in_hour * calp % sec_in_min + min * calp % sec_in_min + sec
end function DCCalDateEvalSecOfYear1
| Subroutine : | |||
| year1 : | integer, intent(in)
| ||
| month1 : | integer, intent(in)
| ||
| day1 : | integer, intent(in)
| ||
| hour1 : | integer, intent(in)
| ||
| min1 : | integer, intent(in)
| ||
| sec1 : | real(DP), intent(in)
| ||
| elapse_sec : | real(DP), intent(in)
| ||
| year2 : | integer, intent(out)
| ||
| month2 : | integer, intent(out)
| ||
| day2 : | integer, intent(out)
| ||
| hour2 : | integer, intent(out)
| ||
| min2 : | integer, intent(out)
| ||
| sec2 : | real(DP), intent(out)
| ||
| cal : | type(DC_CAL), intent(in), optional, target
| ||
| err : | logical, intent(out), optional
|
日時の算出と設定を行います.
省略可能引数 cal が省略された場合には, 経過秒数 elapse_sec の年月日時分への変換に dc_calendar 内部で保持される暦が用いられます. cal が省略されない場合にはその変数に設定された暦が用いられます.
Evaluate and set date.
If an optional argument cal is omitted, information of calendar that is stored in the "dc_calendar" is used for conversion of elapsed seconds elapse_sec into year-month-day etc. If cal is not omitted, information of the variable is used.
subroutine DCCalDateEvalYM2YM1( year1, month1, day1, hour1, min1, sec1, elapse_sec, year2, month2, day2, hour2, min2, sec2, cal, err )
!
! 日時の算出と設定を行います.
!
! 省略可能引数 *cal* が省略された場合には, 経過秒数 *elapse_sec*
! の年月日時分への変換に dc_calendar 内部で保持される暦が用いられます.
! *cal* が省略されない場合にはその変数に設定された暦が用いられます.
!
! Evaluate and set date.
!
! If an optional argument *cal* is omitted,
! information of calendar that is stored in the "dc_calendar"
! is used for conversion of elapsed seconds *elapse_sec* into
! year-month-day etc.
! If *cal* is not omitted, information of the variable is used.
!
use dc_calendar_types, only: DC_CAL, DC_CAL_DATE
use dc_calendar_internal, only: default_cal, default_cal_set, default_date, dccaldate_normalize
use dc_calendar_generic, only: DCCalDateCreate, DCCalDateToChar, DCCalToChar
use dc_message, only: MessageNotify
use dc_trace, only: BeginSub, EndSub
use dc_error, only: StoreError, DC_NOERR, DC_ENOTINIT, DC_EINCONSISTCALDATE, DC_EALREADYINIT, DC_EBADDATE, DC_ENEGATIVE
use dc_types, only: STRING, DP, TOKEN
use dc_types, only: DP
implicit none
integer, intent(in):: year1 ! 起点の年. Year of origin.
integer, intent(in):: month1 ! 起点の月. Month of origin.
integer, intent(in):: day1 ! 起点の日. Day of origin.
integer, intent(in):: hour1 ! 起点の時. Hour of origin.
integer, intent(in):: min1 ! 起点の分. Minute of origin.
real(DP), intent(in):: sec1 ! 起点の秒. Second of origin.
real(DP), intent(in):: elapse_sec
! *year1* 〜 *sec1* からの経過秒数.
! Elapsed seconds from *year1* -- *sec1*
integer, intent(out):: year2 ! 経過時間後の年. Year after elapsed time.
integer, intent(out):: month2 ! 経過時間後の月. Month after elapsed time.
integer, intent(out):: day2 ! 経過時間後の日. Day after elapsed time.
integer, intent(out):: hour2 ! 経過時間後の時. Hour after elapsed time.
integer, intent(out):: min2 ! 経過時間後の分. Minute after elapsed time.
real(DP), intent(out):: sec2 ! 経過時間後の秒. Second after elapsed time.
type(DC_CAL), intent(in), optional, target:: cal
! 暦情報を収めたオブジェクト.
!
! An object that stores information of
! calendar.
logical, intent(out), optional:: err
! 例外処理用フラグ.
! デフォルトでは, この手続き内でエラーが
! 生じた場合, プログラムは強制終了します.
! 引数 *err* が与えられる場合,
! プログラムは強制終了せず, 代わりに
! *err* に .true. が代入されます.
!
! Exception handling flag.
! By default, when error occur in
! this procedure, the program aborts.
! If this *err* argument is given,
! .true. is substituted to *err* and
! the program does not abort.
! 作業変数
! Work variables
!
type(DC_CAL), pointer:: calp =>null()
character(STRING):: e_date_str, e_cal_str
integer:: stat
character(STRING):: cause_c
character(*), parameter:: subname = 'DCCalDateEvalYM2YM1'
continue
call BeginSub( subname )
stat = DC_NOERR
cause_c = ''
! オブジェクトのポインタ割付
! Associate pointer of an object
!
if ( present( cal ) ) then
calp => cal
else
calp => default_cal
if ( .not. calp % initialized ) call default_cal_set
end if
! 初期設定のチェック
! Check initialization
!
!!$ if ( .not. datep % initialized ) then
!!$ stat = DC_ENOTINIT
!!$ cause_c = 'DC_CAL_DATE'
!!$ goto 999
!!$ end if
if ( .not. calp % initialized ) then
stat = DC_ENOTINIT
cause_c = 'DC_CAL'
goto 999
end if
! 各要素への値の参照
! Refer elements
!
year2 = year1
month2 = month1
day2 = day1
hour2 = hour1
min2 = min1
sec2 = sec1
! 経過時間(秒)の追加
! Add elapsed time (seconds)
!
if ( elapse_sec < 0.0_DP ) then
stat = DC_ENEGATIVE
cause_c = 'elapse_sec'
goto 999
end if
sec2 = sec2 + elapse_sec
! 日時の正規化
! Normalize date and time
!
stat = dccaldate_normalize( year2, month2, day2, hour2, min2, sec2, calp ) ! (in)
if ( stat == DC_EINCONSISTCALDATE ) then
e_cal_str = DCCalToChar( calp )
e_date_str = DCCalDateToChar( year2, month2, day2, hour2, min2, sec2, zone = "" )
call MessageNotify('W', subname, 'cal=<%c> and date=<%c> are inconsistency', c1 = trim(e_cal_str), c2 = trim(e_date_str) )
goto 999
end if
! 終了処理, 例外処理
! Termination and Exception handling
!
999 continue
nullify( calp )
call StoreError( stat, subname, err, cause_c )
call EndSub( subname )
end subroutine DCCalDateEvalYM2YM1
| Subroutine : | |||
| year1 : | integer, intent(in)
| ||
| month1 : | integer, intent(in)
| ||
| day1 : | integer, intent(in)
| ||
| hour1 : | integer, intent(in)
| ||
| min1 : | integer, intent(in)
| ||
| sec1 : | real(DP), intent(in)
| ||
| elapse_time : | real(DP), intent(in)
| ||
| units : | character(*), intent(in)
| ||
| year2 : | integer, intent(out)
| ||
| month2 : | integer, intent(out)
| ||
| day2 : | integer, intent(out)
| ||
| hour2 : | integer, intent(out)
| ||
| min2 : | integer, intent(out)
| ||
| sec2 : | real(DP), intent(out)
| ||
| cal : | type(DC_CAL), intent(in), optional, target
| ||
| err : | logical, intent(out), optional
|
日時の算出と設定を行います.
省略可能引数 cal が省略された場合には, 経過時間 elapse_time の年月日時分への変換に dc_calendar 内部で保持される暦が用いられます. cal が省略されない場合にはその変数に設定された暦が用いられます.
Evaluate and set date.
If an optional argument cal is omitted, information of calendar that is stored in the "dc_calendar" is used for conversion of elapsed time elapse_time into year-month-day etc. If cal is not omitted, information of the variable is used.
subroutine DCCalDateEvalYM2YM2( year1, month1, day1, hour1, min1, sec1, elapse_time, units, year2, month2, day2, hour2, min2, sec2, cal, err )
!
! 日時の算出と設定を行います.
!
! 省略可能引数 *cal* が省略された場合には, 経過時間 *elapse_time*
! の年月日時分への変換に dc_calendar 内部で保持される暦が用いられます.
! *cal* が省略されない場合にはその変数に設定された暦が用いられます.
!
! Evaluate and set date.
!
! If an optional argument *cal* is omitted,
! information of calendar that is stored in the "dc_calendar"
! is used for conversion of elapsed time *elapse_time* into
! year-month-day etc.
! If *cal* is not omitted, information of the variable is used.
!
use dc_calendar_types, only: DC_CAL, DC_CAL_DATE, UNIT_SYMBOL_DAY, UNIT_SYMBOL_HOUR, UNIT_SYMBOL_MIN, UNIT_SYMBOL_SEC
use dc_calendar_internal, only: default_cal, default_cal_set, default_date, dccaldate_normalize, dccaldate_str2usym
use dc_calendar_generic, only: DCCalDateCreate, DCCalDateToChar, DCCalToChar
use dc_message, only: MessageNotify
use dc_trace, only: BeginSub, EndSub
use dc_error, only: StoreError, DC_NOERR, DC_ENOTINIT, DC_EINCONSISTCALDATE, DC_EALREADYINIT, DC_EBADDATE, DC_EBADUNIT, DC_ENEGATIVE
use dc_types, only: STRING, DP, TOKEN
use dc_types, only: DP
implicit none
integer, intent(in):: year1 ! 起点の年. Year of origin.
integer, intent(in):: month1 ! 起点の月. Month of origin.
integer, intent(in):: day1 ! 起点の日. Day of origin.
integer, intent(in):: hour1 ! 起点の時. Hour of origin.
integer, intent(in):: min1 ! 起点の分. Minute of origin.
real(DP), intent(in):: sec1 ! 起点の秒. Second of origin.
real(DP), intent(in):: elapse_time
! *year1* 〜 *sec1* からの経過時間.
! 単位は *unit* で指定する.
!
! Elapsed time from *year1* -- *sec1*
! Unit is specified as *unit*.
character(*), intent(in):: units
! *elapse_time* の単位.
!
! Unit of *elapse_time*.
integer, intent(out):: year2 ! 経過時間後の年. Year after elapsed time.
integer, intent(out):: month2 ! 経過時間後の月. Month after elapsed time.
integer, intent(out):: day2 ! 経過時間後の日. Day after elapsed time.
integer, intent(out):: hour2 ! 経過時間後の時. Hour after elapsed time.
integer, intent(out):: min2 ! 経過時間後の分. Minute after elapsed time.
real(DP), intent(out):: sec2 ! 経過時間後の秒. Second after elapsed time.
type(DC_CAL), intent(in), optional, target:: cal
! 暦情報を収めたオブジェクト.
!
! An object that stores information of
! calendar.
logical, intent(out), optional:: err
! 例外処理用フラグ.
! デフォルトでは, この手続き内でエラーが
! 生じた場合, プログラムは強制終了します.
! 引数 *err* が与えられる場合,
! プログラムは強制終了せず, 代わりに
! *err* に .true. が代入されます.
!
! Exception handling flag.
! By default, when error occur in
! this procedure, the program aborts.
! If this *err* argument is given,
! .true. is substituted to *err* and
! the program does not abort.
! 作業変数
! Work variables
!
type(DC_CAL), pointer:: calp =>null()
character(STRING):: e_date_str, e_cal_str
integer:: tusym
integer:: stat
character(STRING):: cause_c
character(*), parameter:: subname = 'DCCalDateEvalYM2YM1'
continue
call BeginSub( subname )
stat = DC_NOERR
cause_c = ''
! オブジェクトのポインタ割付
! Associate pointer of an object
!
if ( present( cal ) ) then
calp => cal
else
calp => default_cal
if ( .not. calp % initialized ) call default_cal_set
end if
! 初期設定のチェック
! Check initialization
!
!!$ if ( .not. datep % initialized ) then
!!$ stat = DC_ENOTINIT
!!$ cause_c = 'DC_CAL_DATE'
!!$ goto 999
!!$ end if
if ( .not. calp % initialized ) then
stat = DC_ENOTINIT
cause_c = 'DC_CAL'
goto 999
end if
! 各要素への値の参照
! Refer elements
!
year2 = year1
month2 = month1
day2 = day1
hour2 = hour1
min2 = min1
sec2 = sec1
! 経過時間(秒)の追加
! Add elapsed time (seconds)
!
if ( elapse_time < 0.0_DP ) then
stat = DC_ENEGATIVE
cause_c = 'elapse_time'
goto 999
end if
tusym = dccaldate_str2usym(units)
select case(tusym)
case(UNIT_SYMBOL_DAY)
sec2 = sec2 + elapse_time * calp % hour_in_day * calp % min_in_hour * calp % sec_in_min
case(UNIT_SYMBOL_HOUR)
sec2 = sec2 + elapse_time * calp % min_in_hour * calp % sec_in_min
case(UNIT_SYMBOL_MIN)
sec2 = sec2 + elapse_time * calp % sec_in_min
case(UNIT_SYMBOL_SEC)
sec2 = sec2 + elapse_time
case default
cause_c = units
call MessageNotify('W', subname, 'units=<%c> is invalid. (ONLY day,hour,min,sec are valid)', c1 = trim(units) )
stat = DC_EBADUNIT
goto 999
end select
! 日時の正規化
! Normalize date and time
!
stat = dccaldate_normalize( year2, month2, day2, hour2, min2, sec2, calp ) ! (in)
if ( stat == DC_EINCONSISTCALDATE ) then
e_cal_str = DCCalToChar( calp )
e_date_str = DCCalDateToChar( year2, month2, day2, hour2, min2, sec2, zone = "" )
call MessageNotify('W', subname, 'cal=<%c> and date=<%c> are inconsistency', c1 = trim(e_cal_str), c2 = trim(e_date_str) )
goto 999
end if
! 終了処理, 例外処理
! Termination and Exception handling
!
999 continue
nullify( calp )
call StoreError( stat, subname, err, cause_c )
call EndSub( subname )
end subroutine DCCalDateEvalYM2YM2
| Subroutine : | |||
| year : | integer, intent(in)
| ||
| month : | integer, intent(in)
| ||
| day : | integer, intent(in)
| ||
| hour : | integer, intent(in)
| ||
| min : | integer, intent(in)
| ||
| sec : | real(DP), intent(in)
| ||
| elapse_sec : | real(DP), intent(in)
| ||
| cal : | type(DC_CAL), intent(in), optional, target
| ||
| date : | type(DC_CAL_DATE), intent(out), optional, target
| ||
| err : | logical, intent(out), optional
|
日時の算出と設定を行います.
省略可能引数 date が省略された場合には, dc_calendar 内部で 保持される "dc_calendar_types#DC_CAL_DATE" 型の変数に日時が 設定されます. その後の手続きで date を省略した場合には この日時が使用されます. date が省略されない場合にはその変数に日時が設定されます. その日時を使用する場合, 手続きにその "dc_calendar_types#DC_CAL_DATE" 型の変数 を与えてください.
省略可能引数 cal が省略された場合には, 経過秒数 elapse_sec の年月日時分への変換に dc_calendar 内部で保持される暦が用いられます. cal が省略されない場合にはその変数に設定された暦が用いられます.
Evaluate and set date.
If an optional argument date is omitted, the date setting is stored to a "dc_calendar_types#DC_CAL_DATE" variable that is saved in the "dc_calendar". When date is omitted in subsequent procedures, the internal date is used. If date is not omitted, the settings is stored to the date. In order to use the date setting, use the "dc_calendar_types#DC_CAL_DATE" varieble to subsequent procedures.
If an optional argument cal is omitted, information of calendar that is stored in the "dc_calendar" is used for conversion of elapsed seconds elapse_sec into year-month-day etc. If cal is not omitted, information of the variable is used.
subroutine DCCalDateEvalYMDHMS1( year, month, day, hour, min, sec, elapse_sec, cal, date, err )
!
! 日時の算出と設定を行います.
!
! 省略可能引数 *date* が省略された場合には, dc_calendar 内部で
! 保持される "dc_calendar_types#DC_CAL_DATE" 型の変数に日時が
! 設定されます. その後の手続きで *date* を省略した場合には
! この日時が使用されます.
! *date* が省略されない場合にはその変数に日時が設定されます.
! その日時を使用する場合, 手続きにその "dc_calendar_types#DC_CAL_DATE" 型の変数
! を与えてください.
!
! 省略可能引数 *cal* が省略された場合には, 経過秒数 *elapse_sec*
! の年月日時分への変換に dc_calendar 内部で保持される暦が用いられます.
! *cal* が省略されない場合にはその変数に設定された暦が用いられます.
!
! Evaluate and set date.
!
! If an optional argument *date* is omitted,
! the date setting is stored to a "dc_calendar_types#DC_CAL_DATE"
! variable that is saved in the "dc_calendar".
! When *date* is omitted in subsequent procedures, the internal date
! is used.
! If *date* is not omitted, the settings is stored to the *date*.
! In order to use the date setting, use the "dc_calendar_types#DC_CAL_DATE"
! varieble to subsequent procedures.
!
! If an optional argument *cal* is omitted,
! information of calendar that is stored in the "dc_calendar"
! is used for conversion of elapsed seconds *elapse_sec* into
! year-month-day etc.
! If *cal* is not omitted, information of the variable is used.
!
use dc_calendar_types, only: DC_CAL, DC_CAL_DATE
use dc_calendar_internal, only: default_cal, default_cal_set, default_date, dccaldate_normalize
use dc_calendar_generic, only: DCCalDateCreate, DCCalDateToChar, DCCalToChar
use dc_message, only: MessageNotify
use dc_trace, only: BeginSub, EndSub
use dc_error, only: StoreError, DC_NOERR, DC_ENOTINIT, DC_EINCONSISTCALDATE, DC_EALREADYINIT, DC_EBADDATE, DC_ENEGATIVE
use dc_types, only: STRING, DP, TOKEN
use dc_types, only: DP
implicit none
integer, intent(in):: year ! 起点の年. Year of origin.
integer, intent(in):: month ! 起点の月. Month of origin.
integer, intent(in):: day ! 起点の日. Day of origin.
integer, intent(in):: hour ! 起点の時. Hour of origin.
integer, intent(in):: min ! 起点の分. Minute of origin.
real(DP), intent(in):: sec ! 起点の秒. Second of origin.
real(DP), intent(in):: elapse_sec
! *year* 〜 *sec* からの経過秒数.
! Elapsed seconds from *year* -- *sec*
type(DC_CAL), intent(in), optional, target:: cal
! 暦情報を収めたオブジェクト.
!
! An object that stores information of
! calendar.
type(DC_CAL_DATE), intent(out), optional, target:: date
! 経過時間後の日時情報を収めたオブジェクト.
!
! An object that stores information of
! date and time after elapsed time.
logical, intent(out), optional:: err
! 例外処理用フラグ.
! デフォルトでは, この手続き内でエラーが
! 生じた場合, プログラムは強制終了します.
! 引数 *err* が与えられる場合,
! プログラムは強制終了せず, 代わりに
! *err* に .true. が代入されます.
!
! Exception handling flag.
! By default, when error occur in
! this procedure, the program aborts.
! If this *err* argument is given,
! .true. is substituted to *err* and
! the program does not abort.
! 作業変数
! Work variables
!
integer:: wyear, wmonth, wday, whour, wmin
real(DP):: wsec
type(DC_CAL_DATE), pointer:: datep =>null()
type(DC_CAL), pointer:: calp =>null()
character(STRING):: e_date_str, e_cal_str
integer:: stat
character(STRING):: cause_c
character(*), parameter:: subname = 'DCCalDateEvalYMDHMS1'
continue
call BeginSub( subname )
stat = DC_NOERR
cause_c = ''
! オブジェクトのポインタ割付
! Associate pointer of an object
!
if ( present( date ) ) then
datep => date
else
datep => default_date
end if
if ( present( cal ) ) then
calp => cal
else
calp => default_cal
if ( .not. calp % initialized ) call default_cal_set
end if
! 初期設定のチェック
! Check initialization
!
!!$ if ( .not. datep % initialized ) then
!!$ stat = DC_ENOTINIT
!!$ cause_c = 'DC_CAL_DATE'
!!$ goto 999
!!$ end if
if ( .not. calp % initialized ) then
stat = DC_ENOTINIT
cause_c = 'DC_CAL'
goto 999
end if
! 各要素への値の参照
! Refer elements
!
wyear = year
wmonth = month
wday = day
whour = hour
wmin = min
wsec = sec
! 経過時間(秒)の追加
! Add elapsed time (seconds)
!
if ( elapse_sec < 0.0_DP ) then
stat = DC_ENEGATIVE
cause_c = 'elapse_sec'
goto 999
end if
wsec = wsec + elapse_sec
! 日時の正規化
! Normalize date and time
!
stat = dccaldate_normalize( wyear, wmonth, wday, whour, wmin, wsec, calp ) ! (in)
if ( stat == DC_EINCONSISTCALDATE ) then
e_cal_str = DCCalToChar( calp )
e_date_str = DCCalDateToChar( wyear, wmonth, wday, whour, wmin, wsec, zone = "" )
call MessageNotify('W', subname, 'cal=<%c> and date=<%c> are inconsistency', c1 = trim(e_cal_str), c2 = trim(e_date_str) )
goto 999
end if
! オブジェクトの作成
! Create an object
!
call DCCalDateCreate( wyear, wmonth, wday, whour, wmin, wsec, datep, zone = "", err = err ) ! (out) optional
if ( present(err) ) then
if ( err ) then
stat = DC_EBADDATE
goto 999
end if
end if
! 終了処理, 例外処理
! Termination and Exception handling
!
999 continue
nullify( calp, datep )
call StoreError( stat, subname, err, cause_c )
call EndSub( subname )
end subroutine DCCalDateEvalYMDHMS1
| Subroutine : | |||
| year : | integer, intent(in)
| ||
| month : | integer, intent(in)
| ||
| day : | integer, intent(in)
| ||
| hour : | integer, intent(in)
| ||
| min : | integer, intent(in)
| ||
| sec : | real(DP), intent(in)
| ||
| elapse_time : | real(DP), intent(in)
| ||
| units : | character(*), intent(in)
| ||
| cal : | type(DC_CAL), intent(in), optional, target
| ||
| date : | type(DC_CAL_DATE), intent(out), optional, target
| ||
| err : | logical, intent(out), optional
|
日時の算出と設定を行います.
省略可能引数 date が省略された場合には, dc_calendar 内部で 保持される "dc_calendar_types#DC_CAL_DATE" 型の変数に日時が 設定されます. その後の手続きで date を省略した場合には この日時が使用されます. date が省略されない場合にはその変数に日時が設定されます. その日時を使用する場合, 手続きにその "dc_calendar_types#DC_CAL_DATE" 型の変数 を与えてください.
省略可能引数 cal が省略された場合には, 経過時間 elapse_time の年月日時分への変換に dc_calendar 内部で保持される暦が用いられます. cal が省略されない場合にはその変数に設定された暦が用いられます.
Evaluate and set date.
If an optional argument date is omitted, the date setting is stored to a "dc_calendar_types#DC_CAL_DATE" variable that is saved in the "dc_calendar". When date is omitted in subsequent procedures, the internal date is used. If date is not omitted, the settings is stored to the date. In order to use the date setting, use the "dc_calendar_types#DC_CAL_DATE" varieble to subsequent procedures.
If an optional argument cal is omitted, information of calendar that is stored in the "dc_calendar" is used for conversion of elapsed time elapse_time into year-month-day etc. If cal is not omitted, information of the variable is used.
subroutine DCCalDateEvalYMDHMS2( year, month, day, hour, min, sec, elapse_time, units, cal, date, err )
!
! 日時の算出と設定を行います.
!
! 省略可能引数 *date* が省略された場合には, dc_calendar 内部で
! 保持される "dc_calendar_types#DC_CAL_DATE" 型の変数に日時が
! 設定されます. その後の手続きで *date* を省略した場合には
! この日時が使用されます.
! *date* が省略されない場合にはその変数に日時が設定されます.
! その日時を使用する場合, 手続きにその "dc_calendar_types#DC_CAL_DATE" 型の変数
! を与えてください.
!
! 省略可能引数 *cal* が省略された場合には, 経過時間 *elapse_time*
! の年月日時分への変換に dc_calendar 内部で保持される暦が用いられます.
! *cal* が省略されない場合にはその変数に設定された暦が用いられます.
!
! Evaluate and set date.
!
! If an optional argument *date* is omitted,
! the date setting is stored to a "dc_calendar_types#DC_CAL_DATE"
! variable that is saved in the "dc_calendar".
! When *date* is omitted in subsequent procedures, the internal date
! is used.
! If *date* is not omitted, the settings is stored to the *date*.
! In order to use the date setting, use the "dc_calendar_types#DC_CAL_DATE"
! varieble to subsequent procedures.
!
! If an optional argument *cal* is omitted,
! information of calendar that is stored in the "dc_calendar"
! is used for conversion of elapsed time *elapse_time* into
! year-month-day etc.
! If *cal* is not omitted, information of the variable is used.
!
use dc_calendar_types, only: DC_CAL, DC_CAL_DATE, UNIT_SYMBOL_DAY, UNIT_SYMBOL_HOUR, UNIT_SYMBOL_MIN, UNIT_SYMBOL_SEC
use dc_calendar_internal, only: default_cal, default_cal_set, default_date, dccaldate_normalize, dccaldate_str2usym
use dc_calendar_generic, only: DCCalDateCreate, DCCalDateToChar, DCCalToChar
use dc_message, only: MessageNotify
use dc_trace, only: BeginSub, EndSub
use dc_error, only: StoreError, DC_NOERR, DC_ENOTINIT, DC_EINCONSISTCALDATE, DC_EALREADYINIT, DC_EBADDATE, DC_EBADUNIT, DC_ENEGATIVE
use dc_types, only: STRING, DP, TOKEN
use dc_types, only: DP
implicit none
integer, intent(in):: year ! 起点の年. Year of origin.
integer, intent(in):: month ! 起点の月. Month of origin.
integer, intent(in):: day ! 起点の日. Day of origin.
integer, intent(in):: hour ! 起点の時. Hour of origin.
integer, intent(in):: min ! 起点の分. Minute of origin.
real(DP), intent(in):: sec ! 起点の秒. Second of origin.
real(DP), intent(in):: elapse_time
! *year* 〜 *sec* からの経過時間.
! 単位は *unit* で指定する.
!
! Elapsed time from *year* -- *sec*
! Unit is specified as *unit*.
character(*), intent(in):: units
! *elapse_time* の単位.
!
! Unit of *elapse_time*.
type(DC_CAL), intent(in), optional, target:: cal
! 暦情報を収めたオブジェクト.
!
! An object that stores information of
! calendar.
type(DC_CAL_DATE), intent(out), optional, target:: date
! 経過時間後の日時情報を収めたオブジェクト.
!
! An object that stores information of
! date and time after elapsed time.
logical, intent(out), optional:: err
! 例外処理用フラグ.
! デフォルトでは, この手続き内でエラーが
! 生じた場合, プログラムは強制終了します.
! 引数 *err* が与えられる場合,
! プログラムは強制終了せず, 代わりに
! *err* に .true. が代入されます.
!
! Exception handling flag.
! By default, when error occur in
! this procedure, the program aborts.
! If this *err* argument is given,
! .true. is substituted to *err* and
! the program does not abort.
! 作業変数
! Work variables
!
integer:: wyear, wmonth, wday, whour, wmin
real(DP):: wsec
type(DC_CAL_DATE), pointer:: datep =>null()
type(DC_CAL), pointer:: calp =>null()
character(STRING):: e_date_str, e_cal_str
integer:: tusym
integer:: stat
character(STRING):: cause_c
character(*), parameter:: subname = 'DCCalDateEvalYMDHMS2'
continue
call BeginSub( subname )
stat = DC_NOERR
cause_c = ''
! オブジェクトのポインタ割付
! Associate pointer of an object
!
if ( present( date ) ) then
datep => date
else
datep => default_date
end if
if ( present( cal ) ) then
calp => cal
else
calp => default_cal
if ( .not. calp % initialized ) call default_cal_set
end if
! 初期設定のチェック
! Check initialization
!
!!$ if ( .not. datep % initialized ) then
!!$ stat = DC_ENOTINIT
!!$ cause_c = 'DC_CAL_DATE'
!!$ goto 999
!!$ end if
if ( .not. calp % initialized ) then
stat = DC_ENOTINIT
cause_c = 'DC_CAL'
goto 999
end if
! 各要素への値の参照
! Refer elements
!
wyear = year
wmonth = month
wday = day
whour = hour
wmin = min
wsec = sec
! 経過時間(秒)の追加
! Add elapsed time (seconds)
!
if ( elapse_time < 0.0_DP ) then
stat = DC_ENEGATIVE
cause_c = 'elapse_time'
goto 999
end if
tusym = dccaldate_str2usym(units)
select case(tusym)
case(UNIT_SYMBOL_DAY)
wsec = wsec + elapse_time * calp % hour_in_day * calp % min_in_hour * calp % sec_in_min
case(UNIT_SYMBOL_HOUR)
wsec = wsec + elapse_time * calp % min_in_hour * calp % sec_in_min
case(UNIT_SYMBOL_MIN)
wsec = wsec + elapse_time * calp % sec_in_min
case(UNIT_SYMBOL_SEC)
wsec = wsec + elapse_time
case default
cause_c = units
call MessageNotify('W', subname, 'units=<%c> is invalid. (ONLY day,hrs,min,sec are valid)', c1 = trim(units) )
stat = DC_EBADUNIT
goto 999
end select
! 日時の正規化
! Normalize date and time
!
stat = dccaldate_normalize( wyear, wmonth, wday, whour, wmin, wsec, calp ) ! (in)
if ( stat == DC_EINCONSISTCALDATE ) then
e_cal_str = DCCalToChar( calp )
e_date_str = DCCalDateToChar( wyear, wmonth, wday, whour, wmin, wsec, zone = "" )
call MessageNotify('W', subname, 'cal=<%c> and date=<%c> are inconsistency', c1 = trim(e_cal_str), c2 = trim(e_date_str) )
goto 999
end if
! オブジェクトの作成
! Create an object
!
call DCCalDateCreate( wyear, wmonth, wday, whour, wmin, wsec, datep, zone = "", err = err ) ! (out) optional
if ( present(err) ) then
if ( err ) then
stat = DC_EBADDATE
goto 999
end if
end if
! 終了処理, 例外処理
! Termination and Exception handling
!
999 continue
nullify( calp, datep )
call StoreError( stat, subname, err, cause_c )
call EndSub( subname )
end subroutine DCCalDateEvalYMDHMS2