My Project
mod_time.f90
Go to the documentation of this file.
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 !/===========================================================================/
13 ! Copyright (c) 2007, The University of Massachusetts Dartmouth
14 ! Produced at the School of Marine Science & Technology
15 ! Marine Ecosystem Dynamics Modeling group
16 ! All rights reserved.
17 !
18 ! FVCOM has been developed by the joint UMASSD-WHOI research team. For
19 ! details of authorship and attribution of credit please see the FVCOM
20 ! technical manual or contact the MEDM group.
21 !
22 !
23 ! This file is part of FVCOM. For details, see http://fvcom.smast.umassd.edu
24 ! The full copyright notice is contained in the file COPYRIGHT located in the
25 ! root directory of the FVCOM code. This original header must be maintained
26 ! in all distributed versions.
27 !
28 ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
29 ! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
30 ! THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
31 ! PURPOSE ARE DISCLAIMED.
32 !
33 !/---------------------------------------------------------------------------/
34 ! CVS VERSION INFORMATION
35 ! $Id$
36 ! $Name$
37 ! $Revision$
38 !/===========================================================================/
39 
40 MODULE mod_time
41  USE mod_prec
42  IMPLICIT NONE
43 
44  PUBLIC
45 
46 
47 ! !PUBLIC DATA MEMBERS:
48  INTEGER, PARAMETER :: itime = selected_int_kind(18)
49 
50  INTEGER :: mpi_time
51 
52 ! ! INTEL 9.1.X does not like initialized types
53 ! TYPE :: TIME
54 ! INTEGER(itime) :: MJD !! MODIFIED JULIAN DAY
55 ! INTEGER(itime) :: MuSOD !! MicroSECOND OF DAY
56 ! END TYPE TIME
57 
58  ! USE THIS FOR INTEL 10.1+
59  TYPE :: time
60  INTEGER(itime) :: mjd = 0 !! MODIFIED JULIAN DAY
61  INTEGER(itime) :: musod = 0 !! MicroSECOND OF DAY
62  END TYPE time
63 
64  INTERFACE abs
65  MODULE PROCEDURE abs_time
66  END INTERFACE
67 
68 
69  INTERFACE mod
70  MODULE PROCEDURE modulo_time
71  END INTERFACE
72 
73  INTERFACE ASSIGNMENT(=)
74  MODULE PROCEDURE assign_time
75  END INTERFACE
76 
77  INTERFACE OPERATOR(*)
78  MODULE PROCEDURE time_x_int
79  MODULE PROCEDURE time_x_long
80  MODULE PROCEDURE time_x_flt
81  MODULE PROCEDURE time_x_dbl
82  MODULE PROCEDURE int_x_time
83  MODULE PROCEDURE long_x_time
84  MODULE PROCEDURE flt_x_time
85  MODULE PROCEDURE dbl_x_time
86  END INTERFACE
87 
88  INTERFACE OPERATOR(/)
89  MODULE PROCEDURE time_div_int
90  MODULE PROCEDURE time_div_long
91  MODULE PROCEDURE time_div_flt
92  MODULE PROCEDURE time_div_dbl
93 
94  END INTERFACE
95 
96  INTERFACE OPERATOR(+)
97  MODULE PROCEDURE add_time
98  MODULE PROCEDURE add_time_1
99  MODULE PROCEDURE add_time_1a
100  MODULE PROCEDURE add_time_a1
101  MODULE PROCEDURE add_time_2
102  MODULE PROCEDURE add_time_2a
103  MODULE PROCEDURE add_time_a2
104 ! MODULE PROCEDURE ADD_TIME_STEP
105  END INTERFACE
106 
107  INTERFACE OPERATOR(-)
108  MODULE PROCEDURE subtract_time
109  MODULE PROCEDURE subtract_time_1
110  MODULE PROCEDURE subtract_time_1a
111  MODULE PROCEDURE subtract_time_a1
112  MODULE PROCEDURE subtract_time_2
113  MODULE PROCEDURE subtract_time_2a
114  MODULE PROCEDURE subtract_time_a2
115 ! MODULE PROCEDURE SUBTRACT_TIME_STEP
116  END INTERFACE
117 
118 
119  INTERFACE OPERATOR(<=)
120  MODULE PROCEDURE le_time
121  END INTERFACE
122 
123  INTERFACE OPERATOR(>=)
124  MODULE PROCEDURE ge_time
125  END INTERFACE
126 
127  INTERFACE OPERATOR(==)
128  MODULE PROCEDURE eq_time
129  END INTERFACE
130 
131  INTERFACE OPERATOR(/=)
132  MODULE PROCEDURE ne_time
133  END INTERFACE
134 
135  INTERFACE OPERATOR(>)
136  MODULE PROCEDURE gt_time
137  END INTERFACE
138 
139  INTERFACE OPERATOR(<)
140  MODULE PROCEDURE lt_time
141  END INTERFACE
142 
143  INTERFACE days2time
144  MODULE PROCEDURE days2time_dbl
145  MODULE PROCEDURE days2time_flt
146  MODULE PROCEDURE days2time_int
147  MODULE PROCEDURE days2time_lint
148  END INTERFACE
149  INTERFACE seconds2time
150  MODULE PROCEDURE seconds2time_dbl
151  MODULE PROCEDURE seconds2time_flt
152  MODULE PROCEDURE seconds2time_int
153  MODULE PROCEDURE seconds2time_lint
154  END INTERFACE
155 
156  ! Seconds per day
157  integer(itime), parameter :: spd = 86400
158  integer(itime), parameter :: mspd = spd * 1000
159  integer(itime), parameter :: muspd = mspd * 1000
160  Integer(itime), parameter :: million = 10**6
161  CONTAINS
162 !======================================================
163 !======================================================
164 !======================================================
165  TYPE(time) function abs_time(a)
166  IMPLICIT NONE
167  TYPE(time), INTENT(IN) ::a
168 
169  CALL adjust(a)
170 
171  abs_time%mjd = abs(a%mjd)
172  abs_time%musod = abs(a%musod)
173 
174  END FUNCTION abs_time
175 !======================================================
176  TYPE(time) function modulo_time(a,b)
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 
258  END FUNCTION modulo_time
259 !======================================================
260  TYPE(time) function days2time_dbl(days)
261  implicit none
262  TYPE(time) :: mjd
263  real(dp), INTENT(IN) :: days
264  real(dp) :: temp
265 
266  mjd%mjd = anint(days,itime)
267  temp = days - anint(days,itime)
268  mjd%MuSOD = anint(temp*real(muspd,dp),itime)
269  CALL adjust(mjd)
270  days2time_dbl = mjd
271  END FUNCTION days2time_dbl
272 !======================================================
273  TYPE(time) function days2time_int(days)
274  implicit none
275  TYPE(time) :: mjd
276  INTEGER, INTENT(IN) :: days
277 
278  mjd%mjd = days
279  mjd%MuSOD = 0
280  days2time_int = mjd
281  END FUNCTION days2time_int
282 !======================================================
283  TYPE(time) function days2time_lint(days)
284  implicit none
285  TYPE(time) :: mjd
286  INTEGER(ITIME), INTENT(IN) :: days
287 
288  mjd%mjd = days
289  mjd%MuSOD = 0
290  days2time_lint = mjd
291  END FUNCTION days2time_lint
292 !======================================================
293  TYPE(time) function days2time_flt(days)
294  implicit none
295  real(spa), INTENT(IN) :: days
296  real(dp) :: temp
297  temp = dble(days)
299  END FUNCTION days2time_flt
300 !======================================================
301  TYPE(time) function seconds2time_dbl(secs)
302  implicit none
303  TYPE(time) :: mjd
304  real(dp), INTENT(IN) :: secs
305  real(dp) :: temp
306 
307  mjd%mjd = int(secs/dble(spd),itime)
308  temp = mod(secs,dble(spd))
309  mjd%MuSOD = anint(temp*real(million,dp),itime)
310  CALL adjust(mjd)
311  seconds2time_dbl = mjd
312  END FUNCTION seconds2time_dbl
313 !======================================================
314  TYPE(time) function seconds2time_int(secs)
315  implicit none
316  TYPE(time) :: mjd
317  INTEGER, INTENT(IN) :: secs
318 
319  mjd%mjd = 0
320  mjd%MuSOD = secs
321  CALL adjust(mjd)
322  seconds2time_int = mjd
323  END FUNCTION seconds2time_int
324 !======================================================
325  TYPE(time) function seconds2time_lint(secs)
326  implicit none
327  TYPE(time) :: mjd
328  INTEGER(ITIME), INTENT(IN) :: secs
329 
330  mjd%mjd = 0
331  mjd%MuSOD = secs
332  CALL adjust(mjd)
333  seconds2time_lint = mjd
334  END FUNCTION seconds2time_lint
335 !======================================================
336  TYPE(time) function seconds2time_flt(secs)
337  implicit none
338  real(spa), INTENT(IN) :: secs
339 
340  seconds2time_flt = seconds2time_dbl(dble(secs))
341 
342  END FUNCTION seconds2time_flt
343 !======================================================
344  FUNCTION time2ncitime(MJD,RJD,D,MS) RESULT(res)
345  implicit none
346  INTEGER :: res
347  TYPE(time), INTENT(IN) :: mjd,rjd
348  INTEGER, INTENT(OUT) :: d, ms
349  REAL(dp) :: msec
350 
351  res = -1
352  msec = dble(mjd%MuSod) / 1000.0_dp
353  ms = anint(msec)
354 
355  ! CHECK TO MAKE SURE IT IS NOT TOO LARGE
356  IF (abs(mjd%MJD) .GT. huge(d)) THEN
357  res =0
358  return
359  END IF
360 
361  d = mjd%MJD - rjd%MJD
362 
363  END FUNCTION time2ncitime
364 !======================================================
365  FUNCTION ncitime(D,MS) RESULT(MJD)
366  implicit none
367  TYPE(time) :: mjd
368  INTEGER, INTENT(IN) :: d, ms
369 
370  mjd%MJD = d
371 
372  mjd%MuSod= int(ms,itime)* int(1000,itime)
373 
374  END FUNCTION ncitime
375 !======================================================
376  SUBROUTINE adjust(MJD)
377  implicit none
378  TYPE(time) :: MJD
379  integer(itime) :: musec
380  integer(itime) :: idays
381 ! print*,"+++++++++++++begin adjust+++++++++++++++++"
382 ! write(*,*) "MJD in= ",MJD%MJD
383 ! write(*,*) "MUSOD in= ",MJD%MuSOD
384 
385  musec = mod(mjd%MuSOD, muspd)
386 ! print *,"musec= ", musec
387 
388  idays = (mjd%MuSOD - musec)/ muspd
389 ! print *, "idays= ",idays
390  mjd%mjd = mjd%mjd + idays
391  mjd%MuSOD = musec
392 
393 
394 ! call print_time(mjd,6,"intermediate")
395 
396  if (mjd%MuSOD .GT. 0 .AND. mjd%mjd .LT. 0) then
397  mjd%mjd=mjd%mjd+1
398  mjd%MuSOD=mjd%MuSOD-muspd
399 ! call print_time(mjd,6,"if... out")
400  return
401  else if (mjd%MuSOD .LT. 0 .AND.mjd%mjd .GT. 0 ) then
402  mjd%MuSOD = muspd + mjd%MuSOD
403  mjd%mjd = mjd%mjd -1
404 ! call print_time(mjd,6,"else if... out")
405  return
406  else
407 ! call print_time(mjd,6,"else... out")
408  return
409  end if
410 ! print*,"+++++++++++++END adjust+++++++++++++++++"
411 
412  END SUBROUTINE adjust
413 !======================================================
414  TYPE(time) FUNCTION READ_TIME(timestr,status,TZONE)
415  implicit none
416  include 'fjulian.inc'
417  character(Len=*) :: timestr ! DO NOT USE INTENT ATTRIBUTE
418  CHARACTER(LEN=*),OPTIONAL, INTENT(IN) :: tzone
419  integer status
420  logical statl
421  real(dp) :: secs
422  TYPE(time) :: dzone
423 
424 
425  if(timestr(1:1)=="-") then
426  statl = fjul_parsetime(timestr(2:),.false.,secs)
427  secs = -secs
428  else if(timestr(1:1)=="+") then
429  statl = fjul_parsetime(timestr(2:),.false.,secs)
430  else
431  statl = fjul_parsetime(timestr,.false.,secs)
432  end if
433  read_time = seconds2time(secs)
434  status = 0
435  if(statl) status = 1
436 
437  IF (PRESENT(tzone)) THEN
438  read_time = read_time - time_zone(tzone,status)
439  END IF
440 
441  END FUNCTION read_time
442 !======================================================
443  FUNCTION time_zone(TZONE,status) RESULT(DZONE)
444  TYPE(time) :: dzone
445  CHARACTER(LEN=*), INTENT(IN) :: tzone
446  integer, intent(out) :: status
447  !! USE STANDARD NAMES FROM www.timeanddate.com
448  !! Handle time zones!
449 
450 
451  status = 1
452  SELECT CASE (tzone)
453  CASE("UTC")
454  dzone = seconds2time(0.0_dp)
455  CASE("NONE")
456  dzone = seconds2time(0.0_dp)
457  CASE("none")
458  dzone = seconds2time(0.0_dp)
459  CASE("None")
460  dzone = seconds2time(0.0_dp)
461  CASE("A")
462  dzone = read_time('01:00:00',status)
463  CASE("ACDT")
464  dzone = read_time('10:30:00',status)
465  CASE("ACST")
466  dzone = read_time('09:30:00',status)
467  CASE("ADT")
468  dzone = read_time('-03:00:00',status)
469  CASE("AEDT")
470  dzone = read_time('11:00:00',status)
471  CASE("AEST")
472  dzone = read_time('10:00:00',status)
473  CASE("AKDT")
474  dzone = read_time('-08:00:00',status)
475  CASE("AKST")
476  dzone = read_time('-09:00:00',status)
477  CASE("AST")
478  dzone = read_time('-04:00:00',status)
479  CASE("AWDT")
480  dzone = read_time('09:00:00',status)
481  CASE("AWST")
482  dzone = read_time('08:00:00',status)
483  CASE("B")
484  dzone = read_time('02:00:00',status)
485  CASE("BST")
486  dzone = read_time('01:00:00',status)
487  CASE("CDT")
488  dzone = read_time('-05:00:00',status)
489  CASE("CEDT")
490  dzone = read_time('02:00:00',status)
491  CASE("CEST")
492  dzone = read_time('02:00:00',status)
493  CASE("CET")
494  dzone = read_time('01:00:00',status)
495  !! SKIPPING MULTIPLE ABREVIATIONS 'CST'
496  CASE("CST")
497  dzone = read_time('-06:00:00',status)
498  CASE("CXT")
499  dzone = read_time('07:00:00',status)
500  CASE("D")
501  dzone = read_time('04:00:00',status)
502  CASE("E")
503  dzone = read_time('05:00:00',status)
504  CASE("EDT")
505  dzone = read_time('-04:00:00',status)
506  CASE("EEDT")
507  dzone = read_time('03:00:00',status)
508  CASE("EEST")
509  dzone = read_time('03:00:00',status)
510  CASE("EET")
511  dzone = read_time('02:00:00',status)
512  !! AGAIN, SKIPPING MULTIPLE 'EST' defs, sorry australia!
513  CASE("EST")
514  dzone = read_time('-05:00:00',status)
515  CASE("F")
516  dzone = read_time('06:00:00',status)
517  CASE("G")
518  dzone = read_time('07:00:00',status)
519  CASE("GMT")
520  dzone = seconds2time(0.0_dp)
521  CASE("H")
522  dzone = read_time('08:00:00',status)
523  CASE("HAA")
524  dzone = read_time('-03:00:00',status)
525  CASE("HAC")
526  dzone = read_time('-05:00:00',status)
527  CASE("HADT")
528  dzone = read_time('-09:00:00',status)
529  CASE("HAE")
530  dzone = read_time('-04:00:00',status)
531  CASE("HAP")
532  dzone = read_time('-07:00:00',status)
533  CASE("HAR")
534  dzone = read_time('-06:00:00',status)
535  CASE("HAST")
536  dzone = read_time('-10:00:00',status)
537  CASE("HAT")
538  dzone = read_time('-02:30:00',status)
539  CASE("HAY")
540  dzone = read_time('-08:00:00',status)
541  CASE("HNA")
542  dzone = read_time('-04:00:00',status)
543  CASE("HNC")
544  dzone = read_time('-06:00:00',status)
545  CASE("HNE")
546  dzone = read_time('-05:00:00',status)
547  CASE("HNP")
548  dzone = read_time('-08:00:00',status)
549  CASE("HNR")
550  dzone = read_time('-07:00:00',status)
551  CASE("HNT")
552  dzone = read_time('-3:30:00',status)
553  CASE("HNY")
554  dzone = read_time('-09:00:00',status)
555  CASE("I")
556  dzone = read_time('09:00:00',status)
557  CASE("IST")
558  dzone = read_time('01:00:00',status)
559  CASE("K")
560  dzone = read_time('10:00:00',status)
561  CASE("L")
562  dzone = read_time('11:00:00',status)
563  CASE("M")
564  dzone = read_time('12:00:00',status)
565  CASE("MDT")
566  dzone = read_time('-06:00:00',status)
567  CASE("MESZ")
568  dzone = read_time('02:00:00',status)
569  CASE("MEZ")
570  dzone = read_time('01:00:00',status)
571  CASE("MST")
572  dzone = read_time('-07:00:00',status)
573  CASE("N")
574  dzone = read_time('-01:00:00',status)
575  CASE("NDT")
576  dzone = read_time('-02:30:00',status)
577  CASE("NFT")
578  dzone = read_time('11:30:00',status)
579  CASE("NST")
580  dzone = read_time('-03:30:00',status)
581  CASE("O")
582  dzone = read_time('-02:00:00',status)
583  CASE("P")
584  dzone = read_time('-03:00:00',status)
585  CASE("PDT")
586  dzone = read_time('-07:00:00',status)
587  CASE("PST")
588  dzone = read_time('-08:00:00',status)
589  CASE("Q")
590  dzone = read_time('-04:00:00',status)
591  CASE("R")
592  dzone = read_time('-05:00:00',status)
593  CASE("S")
594  dzone = read_time('-06:00:00',status)
595  CASE("T")
596  dzone = read_time('-07:00:00',status)
597  CASE("U")
598  dzone = read_time('-08:00:00',status)
599  CASE("V")
600  dzone = read_time('-09:00:00',status)
601  CASE("W")
602  dzone = read_time('-10:00:00',status)
603  CASE("WEDT")
604  dzone = read_time('01:00:00',status)
605  CASE("WEST")
606  dzone = read_time('01:00:00',status)
607  CASE("WET")
608  dzone = read_time('00:00:00',status)
609  CASE("WST")
610  write(6,*)"TIMEZONE 'WST' IS AMBIGIOUS! USING WESTERN STANDARD TIME: UTC + 8:00"
611  dzone = read_time('08:00:00',status)
612  CASE("X")
613  dzone = read_time('-11:00:00',status)
614  CASE("Y")
615  dzone = read_time('-12:00:00',status)
616  CASE("Z")
617  dzone = read_time('00:00:00',status)
618 
619  CASE DEFAULT
620  dzone = read_time(tzone,status)
621  END SELECT
622 
623  if(status==0) write(6,*) "Time_zone failed! :: "//trim(tzone)
624 
625  END FUNCTION time_zone
626 !======================================================
627  LOGICAL FUNCTION is_valid_timezone(timezone)
628  IMPLICIT NONE
629  character(Len=*), intent(in):: timezone
630  TYPE(time) :: test
631  integer :: status
632 
633  is_valid_timezone=.false.
634  test = time_zone(timezone,status)
635  if (status==1) is_valid_timezone=.true.
636 
637  END FUNCTION is_valid_timezone
638 !======================================================
639  TYPE(time) function read_datetime(timestr,frmt,tzone,status)
640  ! RETURN VALUES FOR STATUS:
641  !
642  ! STATUS = -1 => SUCCESS
643  !
644  ! STATUS = 0 => FAILURE
645  IMPLICIT NONE
646  include 'fjulian.inc'
647  character(Len=*) :: timestr ! DO NOT USE INTENT ATTRIBUTE
648  character(Len=*), intent(in) :: frmt
649  integer, intent(out) :: status
650 ! CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: TZONE
651  CHARACTER(LEN=*), INTENT(IN) :: tzone
652 
653  TYPE(time) :: mjd
654  TYPE(time) :: dzone
655  integer :: dutc, pos
656  real(dp) :: secs, tai,rmjd
657  logical :: statl
658 
659  statl = fjul_parsedt(timestr, frmt, dutc, secs)
660  if (.NOT. statl) then
661  ! KNOWN WEEKNESS OF PARSE: CAN'T USE '_' AS A DELIMITER
662  pos = index(timestr,'_')
663  IF(pos == 0 ) return
664  ! IF YOU FOUND '_' replace it with a ' '
665  timestr(pos:pos) = ' '
666  statl = fjul_parsedt(timestr, frmt, dutc, secs)
667  ! IF STILL UNSUCCESSFUL RETURN FAULT
668  if(.not. statl) return
669  end if
670  status = 0
671  if(statl) status = 1
672  mjd%MuSOD = anint(secs*million,itime)
673  tai = fjul_taiofdutc(dutc)
674  mjd%mjd = anint(fjul_mjdoftai(tai, fjul_utc_type),itime)
675 
676  read_datetime = mjd - time_zone(tzone,status)
677 
678 
679  END FUNCTION read_datetime
680 !======================================================
681  character(len=80) FUNCTION write_datetime(mjdin,prec,TZONE)
682  IMPLICIT NONE
683  include 'fjulian.inc'
684  ! PREC is the number of decimal seconds digits
685  integer, intent(IN) :: prec
686  TYPE(time), INTENT(IN) :: mjdin
687  CHARACTER(LEN=*), INTENT(IN) :: tzone
688 
689  TYPE(time) :: mjd
690  real(dp) :: rmjd
691  real(dp) :: tai
692  real(dp) :: secs
693  integer :: dutc, status
694  real(dp) :: tmp1,tmp2
695 
696  mjd = mjdin + time_zone(tzone,status)
697 
698 
699  tmp1 = dble(mjd%MuSOD)
700  tmp2 = dble(muspd)
701 
702  rmjd = mjd%mjd + tmp1/tmp2
703 
704  secs = tmp1 / dble(million)
705 
706  tai = fjul_taiofmjd(rmjd, fjul_utc_type)
707 
708  dutc = fjul_dutcoftai(tai,secs)
709 
710 
711  call fjul_formatpds(dutc, secs, prec, .true., write_datetime)
712 
713  END FUNCTION write_datetime
714 !======================================================
715  TYPE(time) function get_now()
716  IMPLICIT NONE
717  include 'fjulian.inc'
718  CHARACTER(LEN=8) d
719  CHARACTER(LEN=10) t
720  CHARACTER(LEN=5) z
721  CHARACTER(LEN=15) toff
722  CHARACTER(LEN=25) ts
723  TYPE(time) :: tzone
724  integer :: dutc
725  real(dp) :: secs
726  integer status
727 
728  CALL date_and_time ( date=d,time=t, zone=z)
729 
730  ! GET TIME ZONE
731  toff = z(1:3)//":"//z(4:5)
732 
733  ! GET TIME
734  ts = d(1:4)//"/"//d(5:6)//"/"//d(7:8)// &
735  & " "//t(1:2)//":"//t(3:4)//":"//t(5:8)
736 
737  get_now = read_datetime(trim(ts),'ymd',toff,status)
738 
739  END FUNCTION get_now
740 !======================================================
741  REAL(dp) function seconds(mjd)
742  IMPLICIT NONE
743  TYPE(time), INTENT(IN):: mjd
744 
745  seconds = dble(mjd%mjd * spd) + dble(mjd%MUSOD)/dble(million)
746  END FUNCTION seconds
747 !======================================================
748  REAL(dp) function days(mjd)
749  IMPLICIT NONE
750  TYPE(time), INTENT(IN):: mjd
751 
752  days = dble(mjd%mjd) + dble(mjd%MUSOD)/dble(muspd)
753  END FUNCTION days
754 !======================================================
755 !--MODULE OPERATORS
756 !======================================================
757  TYPE(time) function int_x_time(int,mjd)
758  IMPLICIT NONE
759  TYPE(time), INTENT(IN) :: mjd
760  integer, INTENT(IN) :: int
761 
762  int_x_time%MuSOD=mjd%MuSOD * int
763  int_x_time%mjd=mjd%mjd * int
764 
765 
766  call adjust(int_x_time)
767  END FUNCTION int_x_time
768 !======================================================
769  TYPE(time) function long_x_time(long,mjd)
770  IMPLICIT NONE
771  TYPE(time), INTENT(IN) :: mjd
772  integer(itime), INTENT(IN) :: long
773 
774  long_x_time%MuSOD=mjd%MuSOD * long
775  long_x_time%mjd=mjd%mjd * long
776 
777 
778  call adjust(long_x_time)
779  END FUNCTION long_x_time
780 !======================================================
781  TYPE(time) function time_x_int(mjd,int)
782  IMPLICIT NONE
783  TYPE(time), INTENT(IN) :: mjd
784  integer, INTENT(IN) :: int
785 
786  time_x_int%MuSOD=mjd%MuSOD * int
787  time_x_int%mjd=mjd%mjd * int
788 
789 
790  call adjust(time_x_int)
791  END FUNCTION time_x_int
792 !======================================================
793  TYPE(time) function time_x_long(mjd,long)
794  IMPLICIT NONE
795  TYPE(time), INTENT(IN) :: mjd
796  integer(itime), INTENT(IN) :: long
797 
798  time_x_long%MuSOD=mjd%MuSOD * long
799  time_x_long%mjd=mjd%mjd * long
800 
801  call adjust(time_x_long)
802  END FUNCTION time_x_long
803 !======================================================
804  TYPE(time) function time_x_flt(mjd,flt)
805  IMPLICIT NONE
806  TYPE(time), INTENT(IN) :: mjd
807  real(spa), INTENT(in) :: flt
808  real(dp) :: dbl
809 
810  dbl = flt
811  time_x_flt = mjd * dbl
812 
813  END FUNCTION time_x_flt
814 !======================================================
815  TYPE(time) RECURSIVE function time_x_dbl(mjd,dbl)
816  IMPLICIT NONE
817  TYPE(time), INTENT(IN) :: mjd
818  real(dp), INTENT(in) :: dbl
819  integer(itime) :: int
820  real(dp) :: remainder
821  real(dp) :: temp
822 
823  if (abs(dbl) .gt. 1.0_dp) THEN
824  int = anint(dbl,itime)
825  remainder = dbl - int
826  time_x_dbl = (mjd * int) + (mjd * remainder)
827  else
828  temp = real(mjd%MuSOD,dp) * real(dbl,dp)
829  time_x_dbl%MuSOD= anint(temp,itime)
830 
831  temp = real(mjd%mjd,dp) * real(dbl,dp)
832  int = anint(temp,itime)
833  time_x_dbl%mjd=int
834  time_x_dbl%MuSOD = time_x_dbl%MuSOD + (temp-int)*muspd
835  end if
836  call adjust(time_x_dbl)
837 
838  END FUNCTION time_x_dbl
839 !======================================================
840  TYPE(time) function flt_x_time(flt,mjd)
841  IMPLICIT NONE
842  TYPE(time), INTENT(IN) :: mjd
843  real(spa), INTENT(in) :: flt
844  real(dp) :: dbl
845 
846  dbl = dble(flt)
847 ! if(DBG_SET(dbg_log)) print*,'dbl=',dbl
848  flt_x_time = mjd * dbl
849 
850  END FUNCTION flt_x_time
851 !======================================================
852  TYPE(time) function dbl_x_time(dbl,mjd)
853  IMPLICIT NONE
854  TYPE(time), INTENT(IN) :: mjd
855  real(dp), INTENT(in) :: dbl
856 
857  dbl_x_time = mjd * dbl
858 
859  END FUNCTION dbl_x_time
860 !======================================================
861  TYPE(time) function time_div_int(mjd,int)
862  IMPLICIT NONE
863  TYPE(time), INTENT(IN) :: mjd
864  integer, INTENT(IN) :: int
865  real(dp) :: dbl
866 
867  dbl = dble(int)
868  dbl = 1.0_dp / dbl
869  time_div_int = mjd * dbl
870 
871  END FUNCTION time_div_int
872 !======================================================
873  TYPE(time) function time_div_long(mjd,long)
874  IMPLICIT NONE
875  TYPE(time), INTENT(IN) :: mjd
876  integer(itime), INTENT(IN) :: long
877  real(dp) :: dbl
878 
879  dbl = dble(long)
880  dbl = 1.0_dp / dbl
881  time_div_long = mjd * dbl
882 
883  END FUNCTION time_div_long
884 !======================================================
885  TYPE(time) function time_div_flt(mjd,flt)
886  IMPLICIT NONE
887  TYPE(time), INTENT(IN) :: mjd
888  real(spa), INTENT(IN) :: flt
889  real(dp) :: dbl
890 
891  dbl = dble(flt)
892  dbl = 1.0_dp / dbl
893  time_div_flt = mjd * dbl
894 
895  END FUNCTION time_div_flt
896 !======================================================
897  TYPE(time) function time_div_dbl(mjd,dbl)
898  IMPLICIT NONE
899  TYPE(time), INTENT(IN) :: mjd
900  real(dp), INTENT(IN) :: dbl
901 
902  time_div_dbl = mjd * (1.0_dp / dbl)
903 
904  END FUNCTION time_div_dbl
905 !!$!======================================================
906 !!$ TYPE(TIME) FUNCTION SUBTRACT_TIME_STEP(time1,musec)
907 !!$ IMPLICIT NONE
908 !!$ TYPE(TIME), INTENT(IN) :: time1
909 !!$ integer(itime), INTENT(IN) :: musec
910 !!$
911 !!$ SUBTRACT_TIME_STEP = ADD_TIME_STEP(time1,-1*musec)
912 !!$
913 !!$ END FUNCTION SUBTRACT_TIME_STEP
914 !======================================================
915  TYPE(time) function add_time(time1,time2)
916  IMPLICIT NONE
917  TYPE(time), INTENT(IN) :: time1, time2
918  integer(itime) :: musec
919 
920  add_time%MuSOD = time1%MuSOD + time2%MuSOD
921  add_time%mjd = time1%mjd + time2%mjd
922 
923  call adjust(add_time)
924  END FUNCTION add_time
925 !======================================================
926  FUNCTION add_time_1(time1,time2) RESULT(TSUM)
927  IMPLICIT NONE
928  TYPE(time), INTENT(IN) :: time1(:), time2(:)
929  TYPE(time), DIMENSION(SIZE(TIME1)) :: tsum
930  INTEGER :: i
931 
932  DO i = 1,SIZE(time1)
933  tsum(i) = time1(i) + time2(i)
934  END DO
935  END FUNCTION add_time_1
936 !======================================================
937  FUNCTION add_time_1a(time1,time2) RESULT(TSUM)
938  IMPLICIT NONE
939  TYPE(time), INTENT(IN) :: time1(:), time2
940  TYPE(time), DIMENSION(SIZE(TIME1)) :: tsum
941  INTEGER :: i
942 
943  DO i = 1,SIZE(time1)
944  tsum(i) = time1(i) + time2
945  END DO
946  END FUNCTION add_time_1a
947 !======================================================
948  FUNCTION add_time_a1(time1,time2) RESULT(TSUM)
949  IMPLICIT NONE
950  TYPE(time), INTENT(IN) :: time1, time2(:)
951  TYPE(time), DIMENSION(SIZE(TIME2)) :: tsum
952  INTEGER :: i
953 
954  DO i = 1,SIZE(time2)
955  tsum(i) = time1 + time2(i)
956  END DO
957  END FUNCTION add_time_a1
958 !======================================================
959  FUNCTION add_time_2(time1,time2) RESULT(TSUM)
960  IMPLICIT NONE
961  TYPE(time), INTENT(IN) :: time1(:,:), time2(:,:)
962  TYPE(time), DIMENSION(SIZE(TIME1,1),size(time1,2)) :: tsum
963  INTEGER :: i,j
964 
965  DO i = 1,SIZE(time1,1)
966  DO j = 1,SIZE(time1,2)
967  tsum(i,j) = time1(i,j) + time2(i,j)
968  END DO
969  END DO
970  END FUNCTION add_time_2
971 !======================================================
972  FUNCTION add_time_2a(time1,time2) RESULT(TSUM)
973  IMPLICIT NONE
974  TYPE(time), INTENT(IN) :: time1(:,:), time2
975  TYPE(time), DIMENSION(SIZE(TIME1,1),size(time1,2)) :: tsum
976  INTEGER :: i,j
977 
978  DO i = 1,SIZE(time1,1)
979  DO j = 1,SIZE(time1,2)
980  tsum(i,j) = time1(i,j) + time2
981  END DO
982  END DO
983  END FUNCTION add_time_2a
984 !======================================================
985  FUNCTION add_time_a2(time1,time2) RESULT(TSUM)
986  IMPLICIT NONE
987  TYPE(time), INTENT(IN) :: time1, time2(:,:)
988  TYPE(time), DIMENSION(SIZE(TIME2,1),size(time2,2)) :: tsum
989  INTEGER :: i,j
990 
991  DO i = 1,SIZE(time2,1)
992  DO j = 1,SIZE(time2,2)
993  tsum(i,j) = time1 + time2(i,j)
994  END DO
995  END DO
996  END FUNCTION add_time_a2
997 !======================================================
998  TYPE(time) function subtract_time(time1,time2)
999  IMPLICIT NONE
1000  TYPE(time), INTENT(IN) :: time1, time2
1001 
1002  subtract_time%MuSOD = time1%MuSOD - time2%MuSOD
1003  subtract_time%mjd = time1%mjd - time2%mjd
1004 
1005  call adjust(subtract_time)
1006  END FUNCTION subtract_time
1007 !======================================================
1008  FUNCTION subtract_time_1(time1,time2) RESULT(TDIFF)
1009  IMPLICIT NONE
1010  TYPE(time), INTENT(IN) :: time1(:), time2(:)
1011  TYPE(time), DIMENSION(SIZE(TIME1)) :: tdiff
1012  INTEGER :: i
1013 
1014  DO i = 1,SIZE(time1)
1015  tdiff(i) = time1(i) - time2(i)
1016  END DO
1017  END FUNCTION subtract_time_1
1018 !======================================================
1019  FUNCTION subtract_time_1a(time1,time2) RESULT(TDIFF)
1020  IMPLICIT NONE
1021  TYPE(time), INTENT(IN) :: time1, time2(:)
1022  TYPE(time), DIMENSION(SIZE(TIME2)) :: tdiff
1023  INTEGER :: i
1024 
1025  DO i = 1,SIZE(time2)
1026  tdiff(i) = time1 - time2(i)
1027  END DO
1028  END FUNCTION subtract_time_1a
1029 !======================================================
1030  FUNCTION subtract_time_a1(time1,time2) RESULT(TDIFF)
1031  IMPLICIT NONE
1032  TYPE(time), INTENT(IN) :: time1(:), time2
1033  TYPE(time), DIMENSION(SIZE(TIME1)) :: tdiff
1034  INTEGER :: i
1035 
1036  DO i = 1,SIZE(time1)
1037  tdiff(i) = time1(i) - time2
1038  END DO
1039  END FUNCTION subtract_time_a1
1040 !======================================================
1041  FUNCTION subtract_time_2(time1,time2) RESULT(TDIFF)
1042  IMPLICIT NONE
1043  TYPE(time), INTENT(IN) :: time1(:,:), time2(:,:)
1044  TYPE(time), DIMENSION(SIZE(TIME1,1),SIZE(TIME1,2)) :: tdiff
1045  INTEGER :: i,j
1046 
1047  DO i = 1,SIZE(time1,1)
1048  DO j = 1,SIZE(time1,2)
1049  tdiff(i,j) = time1(i,j) - time2(i,j)
1050  END DO
1051  END DO
1052  END FUNCTION subtract_time_2
1053 !======================================================
1054  FUNCTION subtract_time_2a(time1,time2) RESULT(TDIFF)
1055  IMPLICIT NONE
1056  TYPE(time), INTENT(IN) :: time1(:,:), time2
1057  TYPE(time), DIMENSION(SIZE(TIME1,1),SIZE(TIME1,2)) :: tdiff
1058  INTEGER :: i,j
1059 
1060  DO i = 1,SIZE(time1,1)
1061  DO j = 1,SIZE(time1,2)
1062  tdiff(i,j) = time1(i,j) - time2
1063  END DO
1064  END DO
1065  END FUNCTION subtract_time_2a
1066 !======================================================
1067  FUNCTION subtract_time_a2(time1,time2) RESULT(TDIFF)
1068  IMPLICIT NONE
1069  TYPE(time), INTENT(IN) :: time1, time2(:,:)
1070  TYPE(time), DIMENSION(SIZE(TIME2,1),SIZE(TIME2,2)) :: tdiff
1071  INTEGER :: i,j
1072 
1073  DO i = 1,SIZE(time2,1)
1074  DO j = 1,SIZE(time2,2)
1075  tdiff(i,j) = time1 - time2(i,j)
1076  END DO
1077  END DO
1078  END FUNCTION subtract_time_a2
1079 
1080 
1081 
1082 !!$!======================================================
1083 !!$ TYPE(TIME) FUNCTION ADD_TIME_STEP(mjd,tstp)
1084 !!$ IMPLICIT NONE
1085 !!$ !INPUT PARAMETERS:
1086 !!$ TYPE(TIME), intent(in) :: mjd
1087 !!$ integer(itime), intent(in) :: tstp
1088 !!$
1089 !!$ ADD_TIME_STEP%MuSOD = mjd%MuSOD + tstp
1090 !!$ ADD_TIME_STEP%mjd = MJD%mjd
1091 !!$
1092 !!$ call adjust(ADD_TIME_STEP)
1093 !!$ END FUNCTION ADD_TIME_STEP
1094 !======================================================
1095  SUBROUTINE assign_time(A,B)
1096  IMPLICIT NONE
1097  TYPE(time), INTENT(OUT) ::A
1098  TYPE(time), INTENT(IN) ::B
1099 
1100  a%MJD = b%MJD
1101  a%MUSOD = b%MUSOD
1102 
1103  END SUBROUTINE assign_time
1104 !======================================================
1105  ! time1 <= time2
1106  LOGICAL FUNCTION le_time(time1,time2)
1107  IMPLICIT NONE
1108  TYPE(time), INTENT(IN) :: time1, time2
1109  TYPE(time) dtime
1110  le_time = .false.
1111  dtime = time1 - time2
1112  if (dtime%MJD .lt. 0 .or. &
1113  & (dtime%MJD .EQ. 0 .and. dtime%MuSOD .LE. 0) ) le_time = .true.
1114  END FUNCTION le_time
1115 !======================================================
1116  ! time1 < time2
1117  LOGICAL FUNCTION lt_time(time1,time2)
1118  IMPLICIT NONE
1119  TYPE(time), INTENT(IN) :: time1, time2
1120  TYPE(time) dtime
1121  lt_time = .false.
1122  dtime = time1 - time2
1123  if (dtime%MJD .lt. 0 .or. dtime%MuSOD .lt. 0) lt_time = .true.
1124  END FUNCTION lt_time
1125 !======================================================
1126  ! time1 == time2
1127  LOGICAL FUNCTION eq_time(time1,time2)
1128  IMPLICIT NONE
1129  TYPE(time), INTENT(IN) :: time1, time2
1130  eq_time = .false.
1131  if (time1%MJD .EQ. time2%MJD .and. &
1132  & time1%MuSOD .EQ. time2%MuSOD ) eq_time = .true.
1133  END FUNCTION eq_time
1134 !======================================================
1135  ! time1 /= time2
1136  LOGICAL FUNCTION ne_time(time1,time2)
1137  IMPLICIT NONE
1138  TYPE(time), INTENT(IN) :: time1, time2
1139  ne_time = .true.
1140  if (eq_time(time1,time2) ) ne_time = .false.
1141  END FUNCTION ne_time
1142 !======================================================
1143  ! time1 >= time2
1144  LOGICAL FUNCTION ge_time(time1,time2)
1145  IMPLICIT NONE
1146  TYPE(time), INTENT(IN) :: time1, time2
1147  TYPE(time) dtime
1148  ge_time = .false.
1149  dtime = time1 - time2
1150  if (dtime%MJD .gt. 0 .or. &
1151  & (dtime%MJD .EQ. 0 .and. dtime%MuSOD .GE. 0) ) ge_time = .true.
1152  END FUNCTION ge_time
1153 !======================================================
1154  ! time1 > time2
1155  LOGICAL FUNCTION gt_time(time1,time2)
1156  IMPLICIT NONE
1157  TYPE(time), INTENT(IN) :: time1, time2
1158  TYPE(time) dtime
1159  gt_time = .false.
1160  dtime = time1 - time2
1161  if (dtime%MJD .gt. 0 .or. dtime%MuSOD .gt. 0 ) gt_time = .true.
1162  END FUNCTION gt_time
1163 !======================================================
1164 
1165  SUBROUTINE print_time(mjd,IPT,char)
1166  implicit none
1167  CHARACTER(Len=*), INTENT(IN) :: char
1168  INTEGER, INTENT(IN) :: IPT
1169  TYPE(time),INTENT(IN) :: mjd
1170  real(DP) :: tmp, seconds
1171  integer :: hours, minutes
1172  Character(len=3) :: h, m
1173  Character(Len=10) :: s
1174  Character(len=8) :: d
1175 
1176  tmp = real(mjd%MuSOD,dp) / real(million,dp)
1177 
1178  hours = tmp/3600
1179  minutes = (tmp-hours*3600)/60
1180  seconds = mod(tmp,60.0_dp)
1181 
1182  write(d,'(i8.7)') mjd%mjd
1183  write(h,'(i3.2)') hours
1184  write(m,'(i3.2)') minutes
1185  write(s,'(F10.6)') seconds
1186 
1187  d = adjustl(d)
1188  h = adjustl(h)
1189  m = adjustl(m)
1190  s = adjustl(s)
1191 
1192  write(ipt,*)"!========"//trim(char)// "=========="
1193  write(ipt,*)"! Day # :", mjd%mjd
1194  write(ipt,*)"! MicroSecond #:", mjd%MuSOD
1195  write(ipt,*)"! (Human Time=d "//trim(d)//"::h"//trim(h)//":m"//trim(m)//":s"//trim(s)//")"
1196  write(ipt,*)"!=========================="
1197 
1198  END SUBROUTINE print_time
1199 
1200  SUBROUTINE print_real_time(mjd,IPT,char,TZONE)
1201  implicit none
1202  CHARACTER(Len=*), INTENT(IN) :: char
1203  INTEGER, INTENT(IN) :: IPT
1204  TYPE(time),INTENT(IN) :: mjd
1205  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: TZONE
1206  CHARACTER(LEN=120) :: string_local, string_utc
1207 
1208 
1209  IF(PRESENT(tzone)) THEN
1210  ! IF THIS IS AN IDEAL TIME OR CASE THEN USE PRINT_TIME
1211  IF(tzone=="none" .or. tzone == "NONE") THEN
1212  CALL print_time(mjd,ipt,char)
1213  RETURN
1214  END IF
1215 
1216  string_local = write_datetime(mjd,6,tzone)
1217  string_local = "! (Local Time="//trim(string_local)//"); time zone: "//trim(tzone)
1218  END IF
1219 
1220  string_utc = write_datetime(mjd,6,"UTC")
1221 
1222  write(ipt,*)"!========"//trim(char)// "=========="
1223  write(ipt,*)"! Day # :", mjd%mjd
1224  write(ipt,*)"! MicroSecond #:", mjd%MuSOD
1225  write(ipt,*)"! (Date Time="//trim(string_utc)//")"
1226  IF(PRESENT(tzone)) write(ipt,*) string_local
1227  write(ipt,*)"!=========================="
1228 
1229  END SUBROUTINE print_real_time
1230 !-----------------------------------------------------------------------
1231 !! Get the the month and total days of present month
1232 !======================================================
1233  SUBROUTINE now_2_month_days(TTime,Pyear,Pmonth,Pmdays)
1234  IMPLICIT NONE
1235  include 'fjulian.inc'
1236  TYPE(time), INTENT(IN) ::TTime
1237  Integer, INTENT(OUT) :: Pyear,Pmonth,Pmdays
1238  Integer :: Iyear,Imonth
1239 !======================================================
1240  CHARACTER(LEN=8) D
1241  CHARACTER(LEN=10) T
1242  CHARACTER(LEN=5) Z
1243  CHARACTER(LEN=15) toff
1244  CHARACTER(LEN=25) TS
1245  TYPE(time) :: tzone
1246  integer :: dutc
1247  real(DP) :: secs
1248  integer status
1249  TYPE(time) ::Time1, Time2
1250  CHARACTER(LEN=120) :: string_local, string_utc
1251  CHARACTER(LEN=10) :: string_tt
1252 
1253  !CALL DATE_AND_TIME ( DATE=D,TIME=T, ZONE=Z)
1254 
1255  !string_utc = WRITE_DATETIME(mjd,6,"UTC")
1256  string_local = write_datetime(ttime,6,"UTC")
1257 
1258  string_tt=trim(string_local)
1259  d(1:4)=string_tt(1:4)
1260  d(5:6)=string_tt(6:7)
1261  d(7:8)=string_tt(9:10)
1262 
1263  ! GET TIME ZONE
1264  !toff = Z(1:3)//":"//Z(4:5)
1265  toff = '0:00'
1266 
1267  !! get the month from D(5:6)
1268  ! TS1
1269  read(d(1:4),'(I4)') iyear
1270  read(d(5:6),'(I2)') pmonth
1271 
1272  pyear = iyear
1273 
1274  d(7:8)='01'
1275  t(1:8)='00000000'
1276 
1277  ! First day of Present month
1278  ts = d(1:4)//"/"//d(5:6)//"/"//d(7:8)// &
1279  & " "//t(1:2)//":"//t(3:4)//":"//t(5:8)
1280 
1281  time1 = read_datetime(trim(ts),'ymd',toff,status)
1282 
1283  ! First day of next month
1284  imonth=pmonth+1
1285  if(imonth>12) then !! to next year
1286  imonth=1
1287  iyear =iyear+1
1288  endif
1289  write(d(1:4),'(I4.4)') iyear
1290  write(d(5:6),'(I2.2)') imonth
1291 
1292 
1293  ts = d(1:4)//"/"//d(5:6)//"/"//d(7:8)// &
1294  & " "//t(1:2)//":"//t(3:4)//":"//t(5:8)
1295 
1296  time2 = read_datetime(trim(ts),'ymd',toff,status)
1297 
1298  pmdays = time2%mjd -time1%mjd
1299 
1300  END SUBROUTINE now_2_month_days
1301 !!
1302 
1303  SUBROUTINE now_2_days_test
1304  IMPLICIT NONE
1305  include 'fjulian.inc'
1306  Integer :: Iyear,Imonth
1307  Integer :: Pmonth,Pmdays
1308 !======================================================
1309  CHARACTER(LEN=8) D
1310  CHARACTER(LEN=10) T
1311  CHARACTER(LEN=5) Z
1312  CHARACTER(LEN=15) toff
1313  CHARACTER(LEN=25) TS
1314  TYPE(time) :: tzone
1315  integer :: dutc
1316  real(DP) :: secs
1317  integer status
1318  TYPE(time) ::Time1, Time2
1319  CHARACTER(LEN=120) :: string_local, string_utc
1320  CHARACTER(LEN=10) :: string_tt
1321 
1322  !CALL DATE_AND_TIME ( DATE=D,TIME=T, ZONE=Z)
1323 
1324  d='1990-01-01'
1325  toff = '0:00'
1326 
1327  ! TS1
1328  iyear=01
1329  pmonth=01
1330  write(d(1:4),'(I4.4)') iyear
1331  write(d(5:6),'(I2.2)') pmonth
1332 
1333  d(7:8)='01'
1334  t(1:8)='00000000'
1335 
1336  ! First day of Present month
1337  ts = d(1:4)//"/"//d(5:6)//"/"//d(7:8)// &
1338  & " "//t(1:2)//":"//t(3:4)//":"//t(5:8)
1339 
1340  time1 = read_datetime(trim(ts),'ymd',toff,status)
1341 
1342  ! TS1
1343  iyear=01995
1344  pmonth=01
1345  write(d(1:4),'(I4.4)') iyear
1346  write(d(5:6),'(I2.2)') pmonth
1347 
1348  d(7:8)='01'
1349  t(1:8)='00000000'
1350 
1351  ! First day of Present month
1352  ts = d(1:4)//"/"//d(5:6)//"/"//d(7:8)// &
1353  & " "//t(1:2)//":"//t(3:4)//":"//t(5:8)
1354 
1355  time1 = read_datetime(trim(ts),'ymd',toff,status)
1356 
1357 
1358  end subroutine now_2_days_test
1359 
1360 end module mod_time
1361 
type(time) function modulo_time(A, B)
Definition: mod_time.f90:177
type(time) function, dimension(size(time1, 1), size(time1, 2)) subtract_time_2a(time1, time2)
Definition: mod_time.f90:1055
type(time) function, dimension(size(time2, 1), size(time2, 2)) add_time_a2(time1, time2)
Definition: mod_time.f90:986
type(time) function flt_x_time(flt, MJD)
Definition: mod_time.f90:841
type(time) function days2time_int(DAYS)
Definition: mod_time.f90:274
integer function time2ncitime(MJD, RJD, D, MS)
Definition: mod_time.f90:345
integer(itime), parameter spd
Definition: mod_time.f90:157
type(time) function, dimension(size(time1, 1), size(time1, 2)) subtract_time_2(time1, time2)
Definition: mod_time.f90:1042
type(time) function, dimension(size(time1)) subtract_time_1(time1, time2)
Definition: mod_time.f90:1009
type(time) function read_time(timestr, status, TZONE)
Definition: mod_time.f90:415
type(time) function get_now()
Definition: mod_time.f90:716
subroutine now_2_month_days(TTime, Pyear, Pmonth, Pmdays)
Definition: mod_time.f90:1234
type(time) function days2time_flt(DAYS)
Definition: mod_time.f90:294
subroutine adjust(MJD)
Definition: mod_time.f90:377
logical function lt_time(time1, time2)
Definition: mod_time.f90:1118
type(time) function days2time_dbl(DAYS)
Definition: mod_time.f90:261
type(time) function, dimension(size(time1, 1), size(time1, 2)) add_time_2(time1, time2)
Definition: mod_time.f90:960
type(time) function seconds2time_dbl(SECS)
Definition: mod_time.f90:302
subroutine print_real_time(mjd, IPT, char, TZONE)
Definition: mod_time.f90:1201
integer(itime), parameter muspd
Definition: mod_time.f90:159
logical function ne_time(time1, time2)
Definition: mod_time.f90:1137
type(time) function seconds2time_lint(SECS)
Definition: mod_time.f90:326
real(dp) function days(MJD)
Definition: mod_time.f90:749
type(time) function add_time(time1, time2)
Definition: mod_time.f90:916
type(time) function read_datetime(timestr, frmt, TZONE, status)
Definition: mod_time.f90:640
type(time) recursive function time_x_dbl(MJD, dbl)
Definition: mod_time.f90:816
type(time) function seconds2time_flt(SECS)
Definition: mod_time.f90:337
type(time) function int_x_time(int, MJD)
Definition: mod_time.f90:758
logical function le_time(time1, time2)
Definition: mod_time.f90:1107
type(time) function long_x_time(long, MJD)
Definition: mod_time.f90:770
type(time) function, dimension(size(time2)) add_time_a1(time1, time2)
Definition: mod_time.f90:949
type(time) function, dimension(size(time1)) subtract_time_a1(time1, time2)
Definition: mod_time.f90:1031
type(time) function, dimension(size(time2, 1), size(time2, 2)) subtract_time_a2(time1, time2)
Definition: mod_time.f90:1068
real(dp) function seconds(MJD)
Definition: mod_time.f90:742
type(time) function time_div_flt(MJD, flt)
Definition: mod_time.f90:886
integer(itime), parameter mspd
Definition: mod_time.f90:158
subroutine assign_time(A, B)
Definition: mod_time.f90:1096
type(time) function, dimension(size(time1, 1), size(time1, 2)) add_time_2a(time1, time2)
Definition: mod_time.f90:973
type(time) function subtract_time(time1, time2)
Definition: mod_time.f90:999
type(time) function time_x_int(MJD, int)
Definition: mod_time.f90:782
type(time) function time_zone(TZONE, status)
Definition: mod_time.f90:444
type(time) function time_x_long(MJD, long)
Definition: mod_time.f90:794
type(time) function dbl_x_time(dbl, MJD)
Definition: mod_time.f90:853
integer mpi_time
Definition: mod_time.f90:50
logical function is_valid_timezone(timezone)
Definition: mod_time.f90:628
type(time) function time_div_int(MJD, int)
Definition: mod_time.f90:862
type(time) function time_x_flt(MJD, flt)
Definition: mod_time.f90:805
subroutine now_2_days_test
Definition: mod_time.f90:1304
type(time) function days2time_lint(DAYS)
Definition: mod_time.f90:284
integer(itime), parameter million
Definition: mod_time.f90:160
type(time) function time_div_dbl(MJD, dbl)
Definition: mod_time.f90:898
type(time) function, dimension(size(time1)) add_time_1a(time1, time2)
Definition: mod_time.f90:938
type(time) function seconds2time_int(SECS)
Definition: mod_time.f90:315
logical function eq_time(time1, time2)
Definition: mod_time.f90:1128
type(time) function ncitime(D, MS)
Definition: mod_time.f90:366
type(time) function, dimension(size(time2)) subtract_time_1a(time1, time2)
Definition: mod_time.f90:1020
logical function ge_time(time1, time2)
Definition: mod_time.f90:1145
type(time) function time_div_long(MJD, long)
Definition: mod_time.f90:874
type(time) function abs_time(A)
Definition: mod_time.f90:166
integer, parameter itime
Definition: mod_time.f90:48
type(time) function, dimension(size(time1)) add_time_1(time1, time2)
Definition: mod_time.f90:927
subroutine print_time(mjd, IPT, char)
Definition: mod_time.f90:1166
character(len=80) function write_datetime(mjdin, prec, TZONE)
Definition: mod_time.f90:682
logical function gt_time(time1, time2)
Definition: mod_time.f90:1156