dcdatetimemod.f90
Go to the documentation of this file.
1 != 利用者定義関数 mod の実体
2 != User defined function "mod"
3 !
4 ! Authors:: Yasuhiro MORIKAWA, Eizi TOYODA
5 ! Version:: $Id: dcdatetimemod.f90,v 1.2 2009-05-31 11:46:03 morikawa Exp $
6 ! Tag Name:: $Name: $
7 ! Copyright:: Copyright (C) GFD Dennou Club, 2000-2005. All rights reserved.
8 ! License:: See COPYRIGHT[link:../../COPYRIGHT]
9 !
10  function dcdatetime_mod_ff(diff1, diff2) result(result)
11  !
12  ! 引数 <b>diff1</b> を <b>diff2</b> で除算した際の余りを返します.
13  !
14  ! ※ 注意: 月差と日時の混在する除算は近似的結果になるおそれがあります
15  !
18  use dc_scaledsec, only: dc_scaled_sec, &
19  & operator(==), operator(<), operator(>), operator(<=), operator(>=), &
20  & operator(+), operator(-), operator(*), operator(/), &
21  & modscl => mod, modulo, int, abs, sign
22  implicit none
23  type(dc_difftime):: result
24  type(dc_difftime), intent(in):: diff1, diff2
25  type(dc_scaled_sec):: sec1, sec2
26  type(dc_scaled_sec):: zero_sec
27  continue
28  result % day_seconds = diff1 % day_seconds
29  if (diff1 % day == zero_sec .and. diff2 % day == zero_sec .and. &
30  & diff1 % sec == zero_sec .and. diff2 % sec == zero_sec) then
31  result % mon = modscl(diff1 % mon, diff2 % mon)
32  result % day = zero_sec
33  result % sec = zero_sec
34  else if (diff1 % sec == zero_sec .and. diff2 % sec == zero_sec) then
35  result % mon = zero_sec
36  result % day = modscl((cyclic_mdays * diff1 % mon + diff1 % day), &
37  & (cyclic_mdays * diff2 % mon + diff2 % day))
38  result % sec = zero_sec
39  else
40  sec1 = diff1 % day_seconds * (cyclic_mdays * diff1 % mon + diff1 % day) &
41  & + diff1 % sec
42  sec2 = diff2 % day_seconds * (cyclic_mdays * diff2 % mon + diff2 % day) &
43  & + diff2 % sec
44  result % sec = modscl(sec1, sec2)
45  result % day = zero_sec
46  result % mon = zero_sec
47  call dcdate_normalize(result % day, result % sec, result % day_seconds, result % nondim_flag)
48  endif
49  call dcdate_nondimcheck('dc_date#mod', diff1, diff2, result)
50  end function dcdatetime_mod_ff
real(dp), parameter, public cyclic_mdays
subroutine, public dcdate_nondimcheck(opr, diff1, diff2, rslt)
type(dc_difftime) function dcdatetime_mod_ff(diff1, diff2)
subroutine, public dcdate_normalize(day, sec, day_seconds, nondim_flag)