gtool5 Fortran 90/95 ライブラリ 1.0.0-rc5
English
Loading...
Searching...
No Matches
dc_date_internal.f90
Go to the documentation of this file.
1!-----------------------------------------------------------------------
2! Copyright (c) 2000-2026 Gtool Development Group. All rights reserved.
3!-----------------------------------------------------------------------
45
47
49 use dc_types, only: dp, string, token
51
52 implicit none
53
54 private
56 public:: dcdate_nondimcheck
57
58contains
59
93 subroutine dcdate_normalize(day, sec, day_seconds, nondim_flag)
94 use dc_date_types, only: &
96 use dc_scaledsec, only: dc_scaled_sec, &
97 & operator(<), operator(>), operator(<=), operator(>=), &
98 & operator(+), operator(-), operator(*), operator(/), &
99 & modulo, int, abs, sign
100 implicit none
101 type(dc_scaled_sec), intent(inout):: day
102 type(dc_scaled_sec), intent(inout):: sec
103 type(dc_scaled_sec), intent(in), optional:: day_seconds
104 logical, intent(in):: nondim_flag
105 type(dc_scaled_sec):: sgn, day_sec, zero_sec
106 continue
107 if ( nondim_flag ) return
108 if (present(day_seconds)) then
109 day_sec = day_seconds
110 else
112 day_sec = day_seconds_scl
113 end if
114 if (abs(sec) >= day_sec) then
115 day = day + int(sec / day_sec)
116 sec = modulo(sec, day_sec)
117 end if
118!! zero_sec = 0 (デフォルト値 = 0 を使用する).
119 if ( ( sec > zero_sec .and. day < zero_sec ) &
120 & .or. ( sec < zero_sec .and. day > zero_sec ) ) then
121 sgn = sign(day, 1)
122 day = day - sgn
123 sec = sec + sgn * day_sec
124 endif
125 end subroutine dcdate_normalize
126
141 use dc_scaledsec, only: dc_scaled_sec, assignment(=)
142 use dc_date_types, only: day_seconds, &
144 continue
145 if ( .not. flag_set_day_seconds_scl ) then
148 end if
149 end subroutine dcdate_set_day_seconds_scl
150
186 subroutine dcdate_nondimcheck(opr, diff1, diff2, rslt)
188 implicit none
189 character(*), intent(in):: opr
190 type(dc_difftime), intent(in):: diff1, diff2
191 type(dc_difftime), intent(inout):: rslt
192 continue
193 if ( ( diff1 % nondim_flag .and. .not. diff2 % nondim_flag ) &
194 & .or. ( .not. diff1 % nondim_flag .and. diff2 % nondim_flag ) ) then
195 call storeerror(dc_edimtime, opr)
196 end if
197 rslt % nondim_flag = diff1 % nondim_flag
198 end subroutine dcdate_nondimcheck
199
277 character(TOKEN) function dcdate_parse_unit(str) result(unit)
278 use dc_types, only: token
281 use dc_string, only: strieq
282 implicit none
283 character(*), intent(in):: str
284 integer :: unit_str_size, i
285 continue
286 unit = adjustl(str)
287 unit_str_size = size(unit_nondim)
288 do i = 1, unit_str_size
289 if (strieq(trim(unit), trim(unit_nondim(i)))) then
290 unit = unit_nondim(1)
291 return
292 end if
293 end do
294
295 unit_str_size = size(unit_sec)
296 do i = 1, unit_str_size
297 if (strieq(trim(unit), trim(unit_sec(i)))) then
298 unit = unit_sec(1)
299 return
300 end if
301 end do
302
303 unit_str_size = size(unit_min)
304 do i = 1, unit_str_size
305 if (strieq(trim(unit), trim(unit_min(i)))) then
306 unit = unit_min(1)
307 return
308 end if
309 end do
310
311 unit_str_size = size(unit_hour)
312 do i = 1, unit_str_size
313 if (strieq(trim(unit), trim(unit_hour(i)))) then
314 unit = unit_hour(1)
315 return
316 end if
317 end do
318
319 unit_str_size = size(unit_day)
320 do i = 1, unit_str_size
321 if (strieq(trim(unit), trim(unit_day(i)))) then
322 unit = unit_day(1)
323 return
324 end if
325 end do
326
327 unit_str_size = size(unit_month)
328 do i = 1, unit_str_size
329 if (strieq(trim(unit), trim(unit_month(i)))) then
330 unit = unit_month(1)
331 return
332 end if
333 end do
334
335 unit_str_size = size(unit_year)
336 do i = 1, unit_str_size
337 if (strieq(trim(unit), trim(unit_year(i)))) then
338 unit = unit_year(1)
339 return
340 end if
341 end do
342
343 unit = ''
344
345 end function dcdate_parse_unit
346
347end module dc_date_internal
dc_date用の内部モジュール
character(token) function, public dcdate_parse_unit(str)
subroutine, public dcdate_set_day_seconds_scl
subroutine, public dcdate_normalize(day, sec, day_seconds, nondim_flag)
subroutine, public dcdate_nondimcheck(opr, diff1, diff2, rslt)
日付・時刻に関する構造データ型と定数
character(*), dimension(6), parameter, public unit_month
月の単位を示す文字列
character(*), dimension(1), parameter, public unit_nondim
無次元時間の単位を示す文字列
real(dp), save, public day_seconds
1日の秒数 (可変, デフォルトは地球の1日)
type(dc_scaled_sec), save, public day_seconds_scl
1日の秒数 (DC_SCALED_SEC 型)
character(*), dimension(4), parameter, public unit_day
日の単位を示す文字列
logical, save, public flag_set_day_seconds_scl
day_seconds_scl が設定済みかどうかのフラグ
character(*), dimension(8), parameter, public unit_sec
秒の単位を示す文字列
character(*), dimension(8), parameter, public unit_hour
時間の単位を示す文字列
character(*), dimension(4), parameter, public unit_year
年の単位を示す文字列
character(*), dimension(4), parameter, public unit_min
分の単位を示す文字列
エラー処理用モジュール
Definition dc_error.f90:454
subroutine, public storeerror(number, where, err, cause_c, cause_i)
Definition dc_error.f90:891
integer, parameter, public dc_edimtime
Definition dc_error.f90:550
省略可能な制御パラメータの判定
logical function, public present_and_not_empty(arg)
精密な時間演算のための秒スケールモジュール
文字型変数の操作
Definition dc_string.f90:83
種別型パラメタを提供します。
Definition dc_types.f90:55
integer, parameter, public token
単語やキーワードを保持する文字型変数の種別型パラメタ
Definition dc_types.f90:128
integer, parameter, public dp
倍精度実数型変数
Definition dc_types.f90:92
integer, parameter, public string
文字列を保持する 文字型変数の種別型パラメタ
Definition dc_types.f90:137