gtool5 Fortran 90/95 Library 1.0.0-rc5
日本語
Loading...
Searching...
No Matches
dcdatetimemod.f90
Go to the documentation of this file.
1! -*- mode: f90; coding: utf-8 -*-
2!-----------------------------------------------------------------------
3! Copyright (c) 2000-2026 Gtool Development Group. All rights reserved.
4!-----------------------------------------------------------------------
5!>
6!> @author Yasuhiro MORIKAWA, Eizi TOYODA
7!> @copyright Copyright (C) GFD Dennou Club, 2000-2026. All rights reserved. <br/>
8!> License is BSD-2-Clause. see [COPYRIGHT](@ref COPYRIGHT) in detail
9!> @en
10!> @brief User defined function "mod"
11!> @details
12!> This file contains implementation procedures of "mod" function
13!> for dc_date_types#DC_DIFFTIME.
14!> @enden
15!>
16!> @ja
17!> @brief 利用者定義関数 mod の実体
18!> @details
19!> このファイルには dc_date_types#DC_DIFFTIME 用の "mod" 関数の
20!> 実装手続きが含まれています。
21!> @endja
22!>
23
24!> @en
25!> @brief Return the remainder of division of two DC_DIFFTIME values
26!> @details
27!> Return the remainder when `diff1` is divided by `diff2`.
28!>
29!> @note Division involving mixed months and datetime may produce
30!> approximate results.
31!>
32!> @param[in] diff1 Dividend (time difference)
33!> @param[in] diff2 Divisor (time difference)
34!> @return Remainder of diff1 / diff2
35!> @enden
36!>
37!> @ja
38!> @brief 2つの DC_DIFFTIME 値の除算の余りを返す
39!> @details
40!> 引数 `diff1` を `diff2` で除算した際の余りを返します.
41!>
42!> @note 月差と日時の混在する除算は近似的結果になるおそれがあります
43!>
44!> @param[in] diff1 被除数 (日時差)
45!> @param[in] diff2 除数 (日時差)
46!> @return diff1 / diff2 の余り
47!> @endja
48function dcdatetime_mod_ff(diff1, diff2) result(result)
49
52 use dc_scaledsec, only: dc_scaled_sec, &
53 & operator(==), operator(<), operator(>), operator(<=), operator(>=), &
54 & operator(+), operator(-), operator(*), operator(/), &
55 & modscl => mod, modulo, int, abs, sign
56 implicit none
57 type(dc_difftime):: result
58 type(dc_difftime), intent(in):: diff1, diff2
59 type(dc_scaled_sec):: sec1, sec2
60 type(dc_scaled_sec):: zero_sec
61continue
62 result % day_seconds = diff1 % day_seconds
63 if (diff1 % day == zero_sec .and. diff2 % day == zero_sec .and. &
64 & diff1 % sec == zero_sec .and. diff2 % sec == zero_sec) then
65 result % mon = modscl(diff1 % mon, diff2 % mon)
66 result % day = zero_sec
67 result % sec = zero_sec
68 else if (diff1 % sec == zero_sec .and. diff2 % sec == zero_sec) then
69 result % mon = zero_sec
70 result % day = modscl((cyclic_mdays * diff1 % mon + diff1 % day), &
71 & (cyclic_mdays * diff2 % mon + diff2 % day))
72 result % sec = zero_sec
73 else
74 sec1 = diff1 % day_seconds * (cyclic_mdays * diff1 % mon + diff1 % day) &
75 & + diff1 % sec
76 sec2 = diff2 % day_seconds * (cyclic_mdays * diff2 % mon + diff2 % day) &
77 & + diff2 % sec
78 result % sec = modscl(sec1, sec2)
79 result % day = zero_sec
80 result % mon = zero_sec
81 call dcdate_normalize(result % day, result % sec, result % day_seconds, result % nondim_flag)
82 endif
83 call dcdate_nondimcheck('dc_date#mod', diff1, diff2, result)
84end function dcdatetime_mod_ff
type(dc_difftime) function dcdatetime_mod_ff(diff1, diff2)
User defined function "mod".
Internal module for dc_date.
subroutine, public dcdate_normalize(day, sec, day_seconds, nondim_flag)
subroutine, public dcdate_nondimcheck(opr, diff1, diff2, rslt)
Derived types and parameters for date and time.
real(dp), parameter, public cyclic_mdays
Days per month for cyclic calendar (also used for DC_DIFFTIME)
Scaled seconds module for precise time operations.