My Project
Public Member Functions | List of all members
mod_time::mod Interface Reference

Public Member Functions

type(time) function modulo_time (A, B)
 

Detailed Description

Definition at line 69 of file mod_time.f90.

Member Function/Subroutine Documentation

◆ modulo_time()

type(time) function mod_time::mod::modulo_time ( type(time), intent(in)  A,
type(time), intent(in)  B 
)

Definition at line 177 of file mod_time.f90.

177 ! COMMENTS: THIS PROGRAM IS ROBUST BUT SLOW.....
178  IMPLICIT NONE
179  TYPE(TIME), INTENT(IN) ::A,B
180  real(DP) :: DPA,DPB,DIV,CNT
181  TYPE(TIME) ::T, ZT
182 
183  zt%mjd=0
184  zt%MuSOD=0
185 
186  dpa = days(a)
187  dpb = days(b)
188  div = dpa/dpb
189 
190  cnt = 1.0_dp
191 
192  IF(abs(div) .GT. 1e5_dp) cnt = log10(abs(div))
193 
194  IF( abs(div) .GT. 1e16_dp) THEN
195  ! THE DIVISOR EXCEEDS THE NUMERICAL ACCURACY - RETURN A BAD RESULT!
196  modulo_time%MJD = -huge(zt%mjd)
197  modulo_time%MUSOD = -huge(zt%musod)
198  RETURN
199  END IF
200 
201 
202 
203  IF (b .EQ. zt) THEN
204  ! SECOND ARGUMENT IS ZERO - ESCAPE
205  modulo_time%MJD = huge(zt%mjd)
206  modulo_time%MUSOD = huge(zt%musod)
207 
208  ELSE IF(abs(a) .LT. abs(b))THEN
209  ! THE FIRST IS SMALLER THAN THE SECOND
210  modulo_time = a
211 
212  ELSE IF(abs(a) .EQ. abs(b))THEN
213  ! THE FIRST IS SMALLER THAN THE SECOND
214  modulo_time = zt
215 
216  ELSE IF (a .GT. zt .and. b .GT. zt) THEN
217  ! BOTH ARE POSITIVE
218 
219  t = b * int((div-cnt),itime)
220  DO WHILE (a .GE. t+b)
221  t = t +b
222  END DO
223 
224  modulo_time = a - t
225  ELSE IF(a .LT. zt .and. b .LT. zt) THEN
226  ! BOTH ARE NEGATIVE
227 
228  t = b * int((div-cnt),itime)
229  DO WHILE(a .LE. t+b)
230  t = t +b
231  END DO
232  modulo_time = a - t
233  ELSE IF (a .LT. zt .and. b .GT. zt) THEN
234  ! A IS NEGATIVE AND B IS POSITIVE
235 
236  t = b * int((div+cnt),itime)
237  DO WHILE(a .LE. t-b)
238  t = t -b
239  END DO
240  modulo_time = a - t
241 
242  ELSE IF (a .GT. zt .and. b .LT. zt) THEN
243  ! A IS POSITIVE AND B IS NEGATIVE
244 
245  t = b * int((div+cnt),itime)
246  DO WHILE(a .GE. t-b)
247  t = t-b
248  END DO
249  modulo_time = a - t
250  ELSE
251 
252  ! THIS SHOULD NEVER HAPPEN!
253  modulo_time%MJD = -huge(zt%mjd)
254  modulo_time%MUSOD = -huge(zt%musod)
255 
256  END IF
257 
type(time) function modulo_time(A, B)
Definition: mod_time.f90:177
real(dp) function days(MJD)
Definition: mod_time.f90:749
integer, parameter itime
Definition: mod_time.f90:48

The documentation for this interface was generated from the following file: