NCEPLIBS-prod_util  2.1.0
mdate.f
Go to the documentation of this file.
1 C> @file
2 C>
3 C> UPDATE A DATE GIVEN INCREMENT IN MINUTES
4 C> @author KEYSER @date 2001-09-20
5 C>
6 C> PROGRAM TO COMPUTE A VERIFYING DATE GIVEN AN INCREMENT IN
7 C> MINUTES AND THE INITIAL DATE.
8 C>
9 C> PROGRAM HISTORY LOG:
10 C> - 2001-09-20 KEYSER BASED ON UTILITY PROGRAM NDATE EXCEPTS UPDATES
11 C> BY MINUTES INSTEAD OF HOURS
12 C>
13 C> INPUT ARGUMENT LIST
14 C> - MINUTES - INCREMENT IN MINUTES (MAY BE NEGATIVE)
15 C> MINUTES DEFAULTS TO ZERO.
16 C> - IDATE - INITIAL DATE IN YYYYMMDDHHMM FORMAT.
17 C> IDATE DEFAULTS TO THE CURRENT UTC DATE, HOUR AND
18 C> MINUTE. FIRST CENTURY DATES WILL CAUSE ABORT AFTER
19 C> 1 SEPT 1999.
20 C> OUTPUT ARGUMENT LIST:
21 C> - MDATE - VERIFYING DATE IN YYYYMMDDHHMM FORMAT.
22 C> EXIT STATES:
23 C> - 0 - SUCCESS
24 C> - 1 - FAILURE; INVALID ARGUMENT
25 C> - 2 - FAILURE; INCORRECT NUMBER OF ARGUMENTS
26 C>
27 C> SUBPROGRAMS CALLED:
28 C> - IARGC GET NUMBER OF ARGUMENTS
29 C> - GETARG GET ARGUMENT
30 C> - W3MOVDAT RETURN A DATE FROM A TIME INTERVAL AND DATE
31 C> - W3UTCDAT RETURN THE UTC DATE AND TIME
32 C> - ERRMSG WRITE A MESSAGE TO STDERR
33 C> - ERREXIT EXIT PROGRAM (W3LIB)
34 C>
35  PROGRAM mdate
36  CHARACTER*256 CARG,CFMT
37  INTEGER*4 IARG,LARG,NCARG,NARG,IARGC
38  INTEGER IDAT(8),JDAT(8)
39  REAL RINC(5)
40  LOGICAL W3VALDAT
41 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
42 C GET AND CHECK OPTIONAL ARGUMENTS
43  narg=iargc()
44  iarg=1
45  lstopt=0
46  dowhile(iarg.LE.narg.AND.lstopt.EQ.0)
47  CALL getarg(iarg,carg)
48  larg=len_trim(carg)
49  iarg=iarg+1
50  IF(carg(1:1).NE.'-'.OR.
51  & (carg(2:2).GE.'0'.AND.carg(2:2).LE.'9')) THEN
52  lstopt=1
53  iarg=iarg-1
54  ELSEIF(larg.EQ.1) THEN
55  CALL errmsg('mdate: Invalid option -')
56  CALL eusage
57  CALL errexit(1)
58  ELSE
59  l=2
60  dowhile(l.LE.larg)
61  IF(carg(l:l).EQ.'-') THEN
62  lstopt=1
63  ELSE
64  CALL errmsg('mdate: Invalid option '//carg(l:l))
65  CALL eusage
66  CALL errexit(1)
67  ENDIF
68  l=l+1
69  ENDDO
70  ENDIF
71  ENDDO
72 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
73 C CHECK NUMBER OF ARGUMENTS
74  marg=narg-iarg+1
75  IF(marg.GT.2) THEN
76  CALL errmsg('mdate: Incorrect number of arguments')
77  CALL eusage
78  CALL errexit(2)
79  ENDIF
80 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
81 C GET AND CHECK FIRST ARGUMENT (MINUTE INCREMENT)
82  IF(marg.GE.1) THEN
83  CALL getarg(iarg,carg)
84  ncarg=len_trim(carg)
85  WRITE(cfmt,'("(I",I2,")")') ncarg
86  READ(carg,cfmt,iostat=iret) iminute
87  IF(iret.NE.0) THEN
88  CALL errmsg('mdate: Noninteger minute '//carg(1:ncarg))
89  CALL eusage
90  CALL errexit(1)
91  ENDIF
92  ELSE
93  iminute=0
94  ENDIF
95  rinc=0
96  rinc(3)=iminute
97 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
98 C GET AND CHECK SECOND ARGUMENT (INITIAL DATE YYYYMMDDHHMM)
99  IF(marg.GE.2) THEN
100  CALL getarg(iarg+1,carg)
101  ncarg=len_trim(carg)
102  WRITE(cfmt,'("(I",I2,",4I2)")') ncarg-8
103  idat=0
104  READ(carg,cfmt,iostat=iret) idat(1),idat(2),idat(3),idat(5),
105  & idat(6)
106  IF(iret.NE.0.OR..NOT.w3valdat(idat)) THEN
107  CALL errmsg('mdate: Invalid date '//carg(1:ncarg))
108  CALL eusage
109  CALL errexit(1)
110  ENDIF
111  ELSE
112  CALL w3utcdat(idat)
113  ENDIF
114 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
115 C COMPUTE AND PRINT NEW DATE
116  CALL w3movdat(rinc,idat,jdat)
117  nd=log10(jdat(1)+0.5)+1
118  WRITE(cfmt,'("(I",I2,",4I2.2)")') nd
119  print cfmt,jdat(1),jdat(2),jdat(3),jdat(5),jdat(6)
120 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
121  CONTAINS
122 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
123 C WRITE USAGE
124  SUBROUTINE eusage
125  CALL errmsg('Usage: mdate [minutes [idate]]')
126  ENDSUBROUTINE
127 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
128  ENDPROGRAM