gtool5 Fortran 90/95 Library 1.0.0-rc5
日本語
Loading...
Searching...
No Matches
dc_date_internal Module Reference

Internal module for dc_date. More...

Functions/Subroutines

subroutine, public dcdate_normalize (day, sec, day_seconds, nondim_flag)
subroutine, public dcdate_set_day_seconds_scl
subroutine, public dcdate_nondimcheck (opr, diff1, diff2, rslt)
character(token) function, public dcdate_parse_unit (str)

Detailed Description

Internal module for dc_date.

Author
Yasuhiro MORIKAWA, Eizi TOYODA

This module provides internal constants, variables, and procedures used by the dc_date module. These are for internal use only and should not be used outside of dc_date module.

Internal procedures

Procedure Description
dcdate_normalize Normalize day and seconds
dcdate_set_day_seconds_scl Set scaled seconds for day
dcdate_nondimcheck Check dimensionality consistency
dcdate_parse_unit Parse time unit string

Function/Subroutine Documentation

◆ dcdate_nondimcheck()

subroutine, public dc_date_internal::dcdate_nondimcheck ( character(*), intent(in) opr,
type(dc_difftime), intent(in) diff1,
type(dc_difftime), intent(in) diff2,
type(dc_difftime), intent(inout) rslt )

Check dimensionality consistency

Checks whether diff1 and diff2 are both dimensional or both non-dimensional, and applies the result to rslt. If one is dimensional and the other is non-dimensional, an error is raised.

This is an internal subroutine and should not be used outside of dc_date module.

Parameters
[in]oprName of the operator
[in]diff1First operand
[in]diff2Second operand
[in,out]rsltResult operand

Definition at line 186 of file dc_date_internal.f90.

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
Error handling module.
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

References dc_error::dc_edimtime, and dc_error::storeerror().

Here is the call graph for this function:

◆ dcdate_normalize()

subroutine, public dc_date_internal::dcdate_normalize ( type(dc_scaled_sec), intent(inout) day,
type(dc_scaled_sec), intent(inout) sec,
type(dc_scaled_sec), intent(in), optional day_seconds,
logical, intent(in) nondim_flag )

Normalize day and seconds

Normalizes day and seconds values. If sec exceeds day_seconds, the excess is carried over to day. Also ensures that sec and day have the same sign.

This is an internal subroutine and should not be used outside of dc_date module.

Parameters
[in,out]dayDay value
[in,out]secSecond value
[in]day_secondsSeconds in a day (optional)
[in]nondim_flagNon-dimensional flag

Definition at line 93 of file dc_date_internal.f90.

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
111 if ( .not. flag_set_day_seconds_scl ) call dcdate_set_day_seconds_scl
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
Derived types and parameters for date and time.
real(dp), save, public day_seconds
Seconds per day (variable, default is Earth day)
type(dc_scaled_sec), save, public day_seconds_scl
Seconds per day (DC_SCALED_SEC type)
logical, save, public flag_set_day_seconds_scl
Flag indicating if day_seconds_scl is set
Scaled seconds module for precise time operations.

References dc_date_types::day_seconds, dc_date_types::day_seconds_scl, dcdate_set_day_seconds_scl(), and dc_date_types::flag_set_day_seconds_scl.

Here is the call graph for this function:

◆ dcdate_parse_unit()

character(token) function, public dc_date_internal::dcdate_parse_unit ( character(*), intent(in) str)

Parse time unit string and return symbol

Interprets the string str and returns the time unit symbol. The following strings are interpreted as time units (case insensitive):

Unit Symbol constant
year UNIT_SYMBOL_YEAR
month UNIT_SYMBOL_MONTH
day UNIT_SYMBOL_DAY
hour UNIT_SYMBOL_HOUR
minute UNIT_SYMBOL_MIN
second UNIT_SYMBOL_SEC
non-dimensional UNIT_SYMBOL_NONDIM

If str does not match any of these, UNIT_SYMBOL_ERR is returned.

Parameters
[in]strInput unit string
Returns
Unit symbol integer

Parse time unit string and return unit string

Interprets the string str and returns the time unit string. Case insensitive. Returns the first element of the unit array. Returns empty string for unrecognized unit.

This is an internal function and should not be used outside of dc_date module.

Parameters
[in]strInput unit string
Returns
Standardized unit string

Definition at line 277 of file dc_date_internal.f90.

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
character(*), dimension(6), parameter, public unit_month
Strings recognized as month unit
character(*), dimension(1), parameter, public unit_nondim
Strings recognized as nondimensional unit
character(*), dimension(4), parameter, public unit_day
Strings recognized as day unit
character(*), dimension(8), parameter, public unit_sec
Strings recognized as second unit
character(*), dimension(8), parameter, public unit_hour
Strings recognized as hour unit
character(*), dimension(4), parameter, public unit_year
Strings recognized as year unit
character(*), dimension(4), parameter, public unit_min
Strings recognized as minute unit
Handling character types.
Definition dc_string.f90:83
Provides kind type parameter values.
Definition dc_types.f90:55
integer, parameter, public token
Character length for word, token
Definition dc_types.f90:128

References dc_types::token, dc_date_types::unit_day, dc_date_types::unit_hour, dc_date_types::unit_min, dc_date_types::unit_month, dc_date_types::unit_nondim, dc_date_types::unit_sec, and dc_date_types::unit_year.

◆ dcdate_set_day_seconds_scl()

subroutine, public dc_date_internal::dcdate_set_day_seconds_scl

Set scaled seconds for day

Sets the scaled seconds value for day_seconds_scl.

Definition at line 140 of file dc_date_internal.f90.

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

References dc_date_types::day_seconds, dc_date_types::day_seconds_scl, and dc_date_types::flag_set_day_seconds_scl.