NCEPLIBS-prod_util  2.1.0
ndate.f
Go to the documentation of this file.
1 C> @file
2 C> COMPUTE VERIFYING DATE
3 C> @author IREDELL @date 1998-08-18
4 C>
5 C> PROGRAM TO COMPUTE VERIFYING DATE
6 C> GIVEN THE FORECAST HOUR AND THE INITIAL DATE.
7 C>
8 C> PROGRAM HISTORY LOG:
9 C> - 95-02-28 IREDELL
10 C> - 97-09-22 IREDELL 4-DIGIT YEAR ALLOWED; 2-DIGIT YEAR STANDARDIZED
11 C> - 98-03-25 IREDELL 4-DIGIT YEAR FOR ALL DATES. A 2-DIGIT YEAR WILL
12 C> BE INTERPRETED AS A YEAR IN THE FIRST CENTURY
13 C> WHICH SHOULD BE ALL RIGHT BEFORE THE YEAR 2000.
14 C> STANDARD ERROR WARNINGS WILL BE GIVEN FOR SUCH
15 C> DATES UNTIL 1 SEPT 1998 AFTER WHICH NDATE ABORTS.
16 C> NDATE WILL ALSO ABORT AFTER 1 SEPT 1998 IF THE
17 C> NOW IRRELEVANT -Y OPTION IS INVOKED.
18 C> THE NEW Y2K-COMPLIANT W3LIB PACKAGE IS USED.
19 C> - 1998-08-17 IREDELL DROP-DEAD DATE RESET TO 1 SEPT 1999
20 C> - 1999-01-26 VUONG CHANGED TO USE 4-DIGIT YEAR AS STANDARDIZED FOR
21 C> ALL DATES AND CONVERTED TO IBM RS/6000 SP AND
22 C> MODIFIED PROGRAM TO CALL ROUTINE GETARG INSTEAD OF
23 C> USING SUBROUTINE GETARG AS A FUNCTION.
24 C> - 1999-09-02 IREDELL UNDID RESTRICTION ON FORECAST HOUR
25 C>
26 C> USAGE: ndate [fhour [idate]]
27 C> INPUT ARGUMENT LIST
28 C> - FHOUR - FORECAST HOUR (MAY BE NEGATIVE)
29 C> FHOUR DEFAULTS TO ZERO.
30 C> - IDATE - INITIAL DATE IN YYYYMMDDHH FORMAT.
31 C> IDATE DEFAULTS TO THE CURRENT UTC DATE AND HOUR.
32 C> FIRST CENTURY DATES WILL CAUSE ABORT AFTER 1 SEPT 1999.
33 C> OUTPUT ARGUMENT LIST:
34 C> - NDATE - VERIFYING DATE IN YYYYMMDDHH FORMAT.
35 C> EXIT STATES:
36 C> - 0 - SUCCESS
37 C> - 1 - FAILURE; INVALID ARGUMENT
38 C> - 2 - FAILURE; INCORRECT NUMBER OF ARGUMENTS
39 C>
40 C> SUBPROGRAMS CALLED:
41 C> - IARGC GET NUMBER OF ARGUMENTS
42 C> - GETARG GET ARGUMENT
43 C> - W3DIFDAT RETURN A TIME INTERVAL BETWEEN TWO DATES
44 C> - W3MOVDAT RETURN A DATE FROM A TIME INTERVAL AND DATE
45 C> - W3PRADAT FORMAT A DATE AND TIME INTO CHARACTERS
46 C> - W3UTCDAT RETURN THE UTC DATE AND TIME
47 C> - ERRMSG WRITE A MESSAGE TO STDERR
48 C> - EXIT EXIT PROGRAM
49 C>
50  PROGRAM ndate
51  CHARACTER*256 CARG,CFMT
52  INTEGER*4 IARG,LARG,NCARG,NARG,IARGC
53  INTEGER IDAT(8),JDAT(8)
54  REAL RINC(5)
55  LOGICAL W3VALDAT
56 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
57 C GET AND CHECK OPTIONAL ARGUMENTS
58  narg=iargc()
59  iarg=1
60  lstopt=0
61  dowhile(iarg.LE.narg.AND.lstopt.EQ.0)
62  CALL getarg(iarg,carg)
63  larg=len_trim(carg)
64  iarg=iarg+1
65  IF(carg(1:1).NE.'-'.OR.
66  & (carg(2:2).GE.'0'.AND.carg(2:2).LE.'9')) THEN
67  lstopt=1
68  iarg=iarg-1
69  ELSEIF(larg.EQ.1) THEN
70  CALL errmsg('ndate: Invalid option -')
71  CALL eusage
72  CALL errexit(1)
73  ELSE
74  l=2
75  dowhile(l.LE.larg)
76  IF(carg(l:l).EQ.'-') THEN
77  lstopt=1
78  ELSE
79  CALL errmsg('ndate: Invalid option '//carg(l:l))
80  CALL eusage
81  CALL errexit(1)
82  ENDIF
83  l=l+1
84  ENDDO
85  ENDIF
86  ENDDO
87 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
88 C CHECK NUMBER OF ARGUMENTS
89  marg=narg-iarg+1
90  IF(marg.GT.2) THEN
91  CALL errmsg('ndate: Incorrect number of arguments')
92  CALL eusage
93  CALL errexit(2)
94  ENDIF
95 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
96 C GET AND CHECK FIRST ARGUMENT (HOUR INCREMENT)
97  IF(marg.GE.1) THEN
98  CALL getarg(iarg,carg)
99  ncarg=len_trim(carg)
100  WRITE(cfmt,'("(I",I2,")")') ncarg
101  READ(carg,cfmt,iostat=iret) ihour
102  IF(iret.NE.0) THEN
103  CALL errmsg('ndate: Noninteger forecast hour '//carg(1:ncarg))
104  CALL eusage
105  CALL errexit(1)
106  ENDIF
107  ELSE
108  ihour=0
109  ENDIF
110  rinc=0
111  rinc(2)=ihour
112 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
113 C GET AND CHECK SECOND ARGUMENT (INITIAL DATE)
114  IF(marg.GE.2) THEN
115  CALL getarg(iarg+1,carg)
116  ncarg=len_trim(carg)
117  WRITE(cfmt,'("(I",I2,",3I2)")') ncarg-6
118  idat=0
119  READ(carg,cfmt,iostat=iret) idat(1),idat(2),idat(3),idat(5)
120  IF(iret.NE.0.OR..NOT.w3valdat(idat)) THEN
121  CALL errmsg('ndate: Invalid date '//carg(1:ncarg))
122  CALL eusage
123  CALL errexit(1)
124  ENDIF
125  ELSE
126  CALL w3utcdat(idat)
127  ENDIF
128 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
129 C COMPUTE AND PRINT NEW DATE
130  CALL w3movdat(rinc,idat,jdat)
131  nd=log10(jdat(1)+0.5)+1
132  WRITE(cfmt,'("(I",I2,",3I2.2)")') nd
133  print cfmt,jdat(1),jdat(2),jdat(3),jdat(5)
134 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
135  CONTAINS
136 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
137 C WRITE USAGE
138  SUBROUTINE eusage
139  CALL errmsg('Usage: ndate [fhour [idate]]')
140  ENDSUBROUTINE
141 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
142  ENDPROGRAM