dc_date_internal Module Reference

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)
 
integer function parsetimeunits (str)
 
character(token) function, public dcdate_parse_unit (str)
 

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 
)

Definition at line 84 of file dc_date_internal.f90.

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

Referenced by dcdatetime_add_fd(), dcdatetime_add_ff(), dcdatetime_max_ff(), dcdatetime_min_ff(), dcdatetime_mod_ff(), and dcdatetime_sub_ff().

84  !
85  ! このサブルーチンは内部向けなので dc_date モジュール外では
86  ! 極力使用しないでください.
87  !
88  ! diff1 と diff2 が両方とも有次元もしくは無次元かをチェックし,
89  ! 両方が同じであれば, その結果を rslt に適用します.
90  ! 2つの引数で片方が有次元, もう片方が無次元の場合には
91  ! エラーを発生させます.
92  !
93  use dc_error, only: storeerror, dc_edimtime
94  implicit none
95  character(*), intent(in):: opr ! 演算子の名称
96  type(dc_difftime), intent(in):: diff1, diff2
97  type(dc_difftime), intent(inout):: rslt
98  continue
99  if ( ( diff1 % nondim_flag .and. .not. diff2 % nondim_flag ) &
100  & .or. ( .not. diff1 % nondim_flag .and. diff2 % nondim_flag ) ) then
101  call storeerror(dc_edimtime, opr)
102  end if
103  rslt % nondim_flag = diff1 % nondim_flag
subroutine, public storeerror(number, where, err, cause_c, cause_i)
Definition: dc_error.f90:830
integer, parameter, public dc_edimtime
Definition: dc_error.f90:573
Here is the call graph for this function:
Here is the caller 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 
)

Definition at line 27 of file dc_date_internal.f90.

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

Referenced by dcdatetime_add_fd(), dcdatetime_add_ff(), dcdatetime_div_fd(), dcdatetime_mod_ff(), dcdatetime_mul_df(), dcdatetime_mul_if(), dcdatetime_sub_fd(), dcdatetime_sub_ff(), dcdatetime_sub_tt(), and dcdifftimecreate1().

27  !
28  !=== 日と秒の正規化
29  !
30  ! このサブルーチンは内部向けなので dc_date モジュール外では
31  ! 極力使用しないでください.
32  !
33  ! 日付 *day* と秒数 *sec* の正規化を行います. *sec* が *day_seconds*
34  ! (省略される場合は dc_date_types#day_seconds) を超える場合, *day*
35  ! に繰上げを行います.
36  ! また, *sec* と *day* の符号が逆の場合, 同符号になるよう
37  ! 設定します.
38  !
39  use dc_date_types, only: &
41  use dc_scaledsec, only: dc_scaled_sec, &
42  & operator(<), operator(>), operator(<=), operator(>=), &
43  & operator(+), operator(-), operator(*), operator(/), &
44  & modulo, int, abs, sign
45  implicit none
46  type(dc_scaled_sec), intent(inout):: day
47  type(dc_scaled_sec), intent(inout):: sec
48  type(dc_scaled_sec), intent(in), optional:: day_seconds
49  logical, intent(in):: nondim_flag
50  type(dc_scaled_sec):: sgn, day_sec, zero_sec
51  continue
52  if ( nondim_flag ) return
53  if (present(day_seconds)) then
54  day_sec = day_seconds
55  else
56  if ( .not. flag_set_day_seconds_scl ) call dcdate_set_day_seconds_scl
57  day_sec = day_seconds_scl
58  end if
59  if (abs(sec) >= day_sec) then
60  day = day + int(sec / day_sec)
61  sec = modulo(sec, day_sec)
62  end if
63 !! zero_sec = 0 (デフォルト値 = 0 を使用する).
64  if ( ( sec > zero_sec .and. day < zero_sec ) &
65  & .or. ( sec < zero_sec .and. day > zero_sec ) ) then
66  sgn = sign(day, 1)
67  day = day - sgn
68  sec = sec + sgn * day_sec
69  endif
logical, save, public flag_set_day_seconds_scl
type(dc_scaled_sec), save, public day_seconds_scl
Here is the call graph for this function:
Here is the caller graph for this function:

◆ dcdate_parse_unit()

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

Definition at line 208 of file dc_date_internal.f90.

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.

208  !
209  ! このサブルーチンは内部向けなので dc_date モジュール外では
210  ! 極力使用しないでください.
211  !
212  ! 引数 *str* に与えられた文字列を解釈し, 日時の単位を
213  ! 返します. それぞれ以下の文字列が日時の単位として解釈されます.
214  ! 大文字と小文字は区別されません.
215  ! 返る文字列は以下の文字型の配列の先頭の文字列です.
216  ! (例: *str* に 'hrs.' が与えられる場合, dc_date_types#UNIT_HOUR
217  ! 配列の先頭の文字列 UNIT_HOUR(1) が返ります.)
218  !
219  ! 年 :: dc_date_types#UNIT_YEAR
220  ! 月 :: dc_date_types#UNIT_MONTH
221  ! 日 :: dc_date_types#UNIT_DAY
222  ! 時 :: dc_date_types#UNIT_HOUR
223  ! 分 :: dc_date_types#UNIT_MIN
224  ! 秒 :: dc_date_types#UNIT_SEC
225  ! 無次元時間 :: dc_date_types#UNIT_NONDIM
226  !
227  ! これらに該当しない文字列を *str* に与えた場合, 空文字が返ります.
228  !
229  use dc_types, only: token
232  use dc_string, only: strieq
233  implicit none
234  character(*), intent(in):: str
235  integer :: unit_str_size, i
236  continue
237  unit = adjustl(str)
238  unit_str_size = size(unit_nondim)
239  do i = 1, unit_str_size
240  if (strieq(trim(unit), trim(unit_nondim(i)))) then
241  unit = unit_nondim(1)
242  return
243  end if
244  end do
245 
246  unit_str_size = size(unit_sec)
247  do i = 1, unit_str_size
248  if (strieq(trim(unit), trim(unit_sec(i)))) then
249  unit = unit_sec(1)
250  return
251  end if
252  end do
253 
254  unit_str_size = size(unit_min)
255  do i = 1, unit_str_size
256  if (strieq(trim(unit), trim(unit_min(i)))) then
257  unit = unit_min(1)
258  return
259  end if
260  end do
261 
262  unit_str_size = size(unit_hour)
263  do i = 1, unit_str_size
264  if (strieq(trim(unit), trim(unit_hour(i)))) then
265  unit = unit_hour(1)
266  return
267  end if
268  end do
269 
270  unit_str_size = size(unit_day)
271  do i = 1, unit_str_size
272  if (strieq(trim(unit), trim(unit_day(i)))) then
273  unit = unit_day(1)
274  return
275  end if
276  end do
277 
278  unit_str_size = size(unit_month)
279  do i = 1, unit_str_size
280  if (strieq(trim(unit), trim(unit_month(i)))) then
281  unit = unit_month(1)
282  return
283  end if
284  end do
285 
286  unit_str_size = size(unit_year)
287  do i = 1, unit_str_size
288  if (strieq(trim(unit), trim(unit_year(i)))) then
289  unit = unit_year(1)
290  return
291  end if
292  end do
293 
294  unit = ''
295 
character(*), dimension(4), parameter, public unit_min
character(*), dimension(4), parameter, public unit_day
integer, parameter, public token
単語やキーワードを保持する文字型変数の種別型パラメタ
Definition: dc_types.f90:109
character(*), dimension(8), parameter, public unit_hour
character(*), dimension(1), parameter, public unit_nondim
character(*), dimension(4), parameter, public unit_year
文字型変数の操作.
Definition: dc_string.f90:24
種別型パラメタを提供します。
Definition: dc_types.f90:49
character(*), dimension(8), parameter, public unit_sec
character(*), dimension(6), parameter, public unit_month

◆ dcdate_set_day_seconds_scl()

subroutine, public dc_date_internal::dcdate_set_day_seconds_scl ( )

Definition at line 73 of file dc_date_internal.f90.

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

Referenced by dcdate_normalize(), and dcdatetimecreate1().

73  use dc_scaledsec, only: dc_scaled_sec, assignment(=)
74  use dc_date_types, only: day_seconds, &
76  continue
77  if ( .not. flag_set_day_seconds_scl ) then
80  end if
logical, save, public flag_set_day_seconds_scl
real(dp), save, public day_seconds
type(dc_scaled_sec), save, public day_seconds_scl
Here is the caller graph for this function:

◆ parsetimeunits()

integer function dc_date_internal::parsetimeunits ( character(*), intent(in)  str)

Definition at line 107 of file dc_date_internal.f90.

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, dc_date_types::unit_symbol_day, dc_date_types::unit_symbol_err, dc_date_types::unit_symbol_hour, dc_date_types::unit_symbol_min, dc_date_types::unit_symbol_month, dc_date_types::unit_symbol_nondim, dc_date_types::unit_symbol_sec, dc_date_types::unit_symbol_year, and dc_date_types::unit_year.

107  !
108  ! 引数 *str* に与えられた文字列を解釈し, 日時の単位を示す
109  ! シンボルを返します. それぞれ以下の文字列が日時の単位として解釈されます.
110  ! 大文字と小文字は区別されません.
111  !
112  ! 年 :: dc_date_types#UNIT_YEAR
113  ! 月 :: dc_date_types#UNIT_MONTH
114  ! 日 :: dc_date_types#UNIT_DAY
115  ! 時 :: dc_date_types#UNIT_HOUR
116  ! 分 :: dc_date_types#UNIT_MIN
117  ! 秒 :: dc_date_types#UNIT_SEC
118  ! 無次元時間 :: dc_date_types#UNIT_NONDIM
119  !
120  ! 返るシンボル (整数型) は以下の通りです.
121  !
122  ! 年 :: dc_date_types#UNIT_SYMBOL_YEAR
123  ! 月 :: dc_date_types#UNIT_SYMBOL_MONTH
124  ! 日 :: dc_date_types#UNIT_SYMBOL_DAY
125  ! 時 :: dc_date_types#UNIT_SYMBOL_HOUR
126  ! 分 :: dc_date_types#UNIT_SYMBOL_MIN
127  ! 秒 :: dc_date_types#UNIT_SYMBOL_SEC
128  ! 無次元時間 :: dc_date_types#UNIT_SYMBOL_NONDIM
129  !
130  ! これらに該当しない文字列を *str* に与えた場合,
131  ! dc_date_types#UNIT_SYMBOL_ERR が返ります.
132  !
133  use dc_types, only: token
139  use dc_string, only: strieq
140  implicit none
141  character(*), intent(in):: str
142  integer:: symbol
143  integer:: unit_str_size, i
144  character(TOKEN):: unit
145  continue
146  unit = adjustl(str)
147  unit_str_size = size(unit_nondim)
148  do i = 1, unit_str_size
149  if (strieq(trim(unit), trim(unit_nondim(i)))) then
150  symbol = unit_symbol_nondim
151  return
152  end if
153  end do
154 
155  unit_str_size = size(unit_sec)
156  do i = 1, unit_str_size
157  if (strieq(trim(unit), trim(unit_sec(i)))) then
158  symbol = unit_symbol_sec
159  return
160  end if
161  end do
162 
163  unit_str_size = size(unit_min)
164  do i = 1, unit_str_size
165  if (strieq(trim(unit), trim(unit_min(i)))) then
166  symbol = unit_symbol_min
167  return
168  end if
169  end do
170 
171  unit_str_size = size(unit_hour)
172  do i = 1, unit_str_size
173  if (strieq(trim(unit), trim(unit_hour(i)))) then
174  symbol = unit_symbol_hour
175  return
176  end if
177  end do
178 
179  unit_str_size = size(unit_day)
180  do i = 1, unit_str_size
181  if (strieq(trim(unit), trim(unit_day(i)))) then
182  symbol = unit_symbol_day
183  return
184  end if
185  end do
186 
187  unit_str_size = size(unit_month)
188  do i = 1, unit_str_size
189  if (strieq(trim(unit), trim(unit_month(i)))) then
190  symbol = unit_symbol_month
191  return
192  end if
193  end do
194 
195  unit_str_size = size(unit_year)
196  do i = 1, unit_str_size
197  if (strieq(trim(unit), trim(unit_year(i)))) then
198  symbol = unit_symbol_year
199  return
200  end if
201  end do
202 
203  symbol = unit_symbol_err
204 
integer, parameter, public unit_symbol_nondim
character(*), dimension(4), parameter, public unit_min
character(*), dimension(4), parameter, public unit_day
integer, parameter, public unit_symbol_month
integer, parameter, public unit_symbol_err
integer, parameter, public unit_symbol_min
integer, parameter, public token
単語やキーワードを保持する文字型変数の種別型パラメタ
Definition: dc_types.f90:109
integer, parameter, public unit_symbol_hour
character(*), dimension(8), parameter, public unit_hour
character(*), dimension(1), parameter, public unit_nondim
character(*), dimension(4), parameter, public unit_year
文字型変数の操作.
Definition: dc_string.f90:24
種別型パラメタを提供します。
Definition: dc_types.f90:49
integer, parameter, public unit_symbol_sec
integer, parameter, public unit_symbol_day
integer, parameter, public unit_symbol_year
character(*), dimension(8), parameter, public unit_sec
character(*), dimension(6), parameter, public unit_month