*IF DEF,PPTOANC,OR,DEF,FLUXPROC                                            ZPDATE1.2      
C *****************************COPYRIGHT******************************     ZPDATE1.3      
C (c) CROWN COPYRIGHT 1998, METEOROLOGICAL OFFICE, All Rights Reserved.    ZPDATE1.4      
C                                                                          ZPDATE1.5      
C Use, duplication or disclosure of this code is subject to the            ZPDATE1.6      
C restrictions as set forth in the contract.                               ZPDATE1.7      
C                                                                          ZPDATE1.8      
C                Meteorological Office                                     ZPDATE1.9      
C                London Road                                               ZPDATE1.10     
C                BRACKNELL                                                 ZPDATE1.11     
C                Berkshire UK                                              ZPDATE1.12     
C                RG12 2SZ                                                  ZPDATE1.13     
C                                                                          ZPDATE1.14     
C If no contract has been raised with this copy of the code, the use,      ZPDATE1.15     
C duplication or disclosure of it is strictly prohibited.  Permission      ZPDATE1.16     
C to do so must first be obtained in writing from the Head of Numerical    ZPDATE1.17     
C Modelling at the above address.                                          ZPDATE1.18     
C ******************************COPYRIGHT******************************    ZPDATE1.19     
                                                                           ZPDATE1.20     
!*********************************************************************     ZPDATE1.21     
!                                                                     *    ZPDATE1.22     
!   RECORD OF CHANGES:                                                *    ZPDATE1.23     
!   ==================                                                *    ZPDATE1.24     
!                                                                     *    ZPDATE1.25     
!  0 ORIGINAL VERSION BY JOHN PRINCE, LONG AGO IN THE MISTS OF TIME,  *    ZPDATE1.26     
!                                     FOR THE IBM WITH STATIC MEMORY  *    ZPDATE1.27     
!  1 TRANSLATED BY FPP 2.26B16 11/12/89  11:44:56   TDYON=X           *    ZPDATE1.28     
!  2 RE-WRITE   BY PAUL WHITE  13/12/89                               *    ZPDATE1.29     
!                        TO MAKE RE-ENTRANT WITH INLINE EXPANSION     *    ZPDATE1.30     
!                        TRANSLATED BY FPP 2.26B16 13/12/89  11:41:08 *    ZPDATE1.31     
!                        SWITCHES: LSTOFF=T,OPTON=78,TDYON=FX         *    ZPDATE1.32     
!  3 RE-COMPILED 29/10/91 TO PRODUCE 31 BIT ADDRESSING MODE VERSION   *    ZPDATE1.33     
!        BY M. COLLIER - COPIED TO MET.PROGLIB                        *    ZPDATE1.34     
!  4 Updated 30/1/98 by Edward Jones                                  *    ZPDATE1.35     
!                        Update ZPDATE subroutine                     *    ZPDATE1.36     
!                        Added ISALEAP subroutine                     *    ZPDATE1.37     
!                        Ported to HP, Cray and PC from MET.SRCELIB   *    ZPDATE1.38     
!  5 Updated 17/2/98 by Edward Jones                                  *    ZPDATE1.39     
!                        Added DATCHK and MNTHDS Routines             *    ZPDATE1.40     
!  6 Updated 23/3/98 by Edward Jones                                  *    ZPDATE1.41     
!                        Added JDAY Routine                           *    ZPDATE1.42     
!  7fre  Updated 17/4/98 by Stephen Turner                            *    ZPDATE1.43     
!                        Converted to FREE  format F90, and added     *    ZPDATE1.44     
!                              Zeller method                          *    ZPDATE1.45     
!  7fix  Updated 01/9/98 by Stephen Turner                            *    ZPDATE1.46     
!                        Converted to FIXED format F90 and removed    *    ZPDATE1.47     
!                        (irrelevant) Zeller method                   *    ZPDATE1.48     
!  7fix_nomods Updated 6/10/98 by Stephen Turner                      *    ZPDATE1.49     
!                        Converted to FIXED format F90 without        *    ZPDATE1.50     
!                        using modules (and without Zeller method)    *    ZPDATE1.51     
!                                                                     *    ZPDATE1.52     
!**********************************************************************    ZPDATE1.53     
!-----------------------------------------------------------------------   ZPDATE1.54     
                                                                           ZPDATE1.55     
                                                                           ZPDATE1.56     
                                                                           ZPDATE1.57     
                                                                           ZPDATE1.58     
                                                                           ZPDATE1.59     

      LOGICAL FUNCTION ISALEAP(IY)                                          5ZPDATE1.60     
!                                                                          ZPDATE1.61     
!     Returns .TRUE. if IY is a Leap year                                  ZPDATE1.62     
!     Returns .FALSE. if IY is not a Leap year                             ZPDATE1.63     
!                                                                          ZPDATE1.64     
      IMPLICIT NONE                                                        ZPDATE1.65     
!     INPUT ARGUMENT                                                       ZPDATE1.66     
      INTEGER, INTENT(IN) :: IY                                            ZPDATE1.67     
                                                                           ZPDATE1.68     
                                                                           ZPDATE1.69     
      IF (IY/4*4 .NE. IY) THEN    ! Divide by 4                            ZPDATE1.70     
         ISALEAP=.FALSE.                                                   ZPDATE1.71     
      ELSE                                                                 ZPDATE1.72     
        IF (IY/400*400 .EQ. IY) THEN  ! Century check                      ZPDATE1.73     
           ISALEAP=.TRUE.                                                  ZPDATE1.74     
        ELSE                                                               ZPDATE1.75     
          IF (IY/100*100 .EQ. IY) THEN   ! Century qualifier               ZPDATE1.76     
             ISALEAP=.FALSE.                                               ZPDATE1.77     
          ELSE                                                             ZPDATE1.78     
            ISALEAP=.TRUE.                                                 ZPDATE1.79     
          ENDIF                                                            ZPDATE1.80     
        ENDIF                                                              ZPDATE1.81     
      ENDIF                                                                ZPDATE1.82     
      END FUNCTION ISALEAP                                                 ZPDATE1.83     
                                                                           ZPDATE1.84     
!-----------------------------------------------------------------------   ZPDATE1.85     
                                                                           ZPDATE1.86     

      SUBROUTINE  ZPDATE                                                   ZPDATE1.87     
!                                                                          ZPDATE1.88     
!     Prints version information                                           ZPDATE1.89     
!                                                                          ZPDATE1.90     
      PRINT *, '  ZPDATE - F90 fixed format module-free version            ZPDATE1.91     
     &              (Y2K Compliance Checked)'                              ZPDATE1.92     
      PRINT *, '  LAST MODIFIED MONDAY 5th October 1998'                   ZPDATE1.93     
      PRINT *, '        by Stephen Turner (DD)'                            ZPDATE1.94     
      PRINT *, '  Contact Software Engineering Group with any queries.'    ZPDATE1.95     
      RETURN                                                               ZPDATE1.96     
      END SUBROUTINE ZPDATE                                                ZPDATE1.97     
                                                                           ZPDATE1.98     
!-----------------------------------------------------------------------   ZPDATE1.99     

      SUBROUTINE DATE21 (IDY, IY, ICD)                                     ZPDATE1.100    
!                                                                          ZPDATE1.101    
!     DAYS SINCE 1.1.1900, FROM DAY OF YEAR                                ZPDATE1.102    
!                                                                          ZPDATE1.103    
      IMPLICIT NONE                                                        ZPDATE1.104    
!                        INPUT ARGUMENTS                                   ZPDATE1.105    
      INTEGER, INTENT(IN)  :: IDY, IY                                      ZPDATE1.106    
!                       OUTPUT ARGUMENTS                                   ZPDATE1.107    
      INTEGER, INTENT(OUT) :: ICD                                          ZPDATE1.108    
!                       LOCAL VARIABLES                                    ZPDATE1.109    
      INTEGER :: IYN                                                       ZPDATE1.110    
                                                                           ZPDATE1.111    
      IYN = IY - 1900                                                      ZPDATE1.112    
      IF (IYN .GT. 0) THEN                                                 ZPDATE1.113    
         ICD = IDY + IYN*365 + (IYN-1)/4 - (IYN-1)/100 + (IYN+299)/400     ZPDATE1.114    
      ELSE                                                                 ZPDATE1.115    
         ICD = IDY + IYN*365 + IYN/4 - IYN/100                             ZPDATE1.116    
      ENDIF                                                                ZPDATE1.117    
                                                                           ZPDATE1.118    
      END SUBROUTINE DATE21                                                ZPDATE1.119    
!-----------------------------------------------------------------------   ZPDATE1.120    

      SUBROUTINE DATE23 (IDY, IY, ID, IM, INY)                             ,1ZPDATE1.121    
!                                                                          ZPDATE1.122    
!     DAY, MONTH, YEAR FROM DAY OF YEAR                                    ZPDATE1.123    
!                                                                          ZPDATE1.124    
      IMPLICIT NONE                                                        ZPDATE1.125    
!                        INPUT ARGUMENTS                                   ZPDATE1.126    
      INTEGER, INTENT(IN) ::  IDY, IY                                      ZPDATE1.127    
!                       OUTPUT ARGUMENTS                                   ZPDATE1.128    
      INTEGER, INTENT(OUT) :: ID, IM, INY                                  ZPDATE1.129    
!                       LOCAL VARIABLES                                    ZPDATE1.130    
      INTEGER :: I, K, days_in_feb                                         ZPDATE1.131    
      INTEGER, DIMENSION(12) :: MONTHS                                     ZPDATE1.132    
!     external function                                                    ZPDATE1.133    
      LOGICAL, EXTERNAL :: ISALEAP                                         ZPDATE1.134    
                                                                           ZPDATE1.135    
      IF (ISALEAP(IY)) THEN                                                ZPDATE1.136    
         days_in_feb = 29                                                  ZPDATE1.137    
      ELSE                                                                 ZPDATE1.138    
         days_in_feb = 28                                                  ZPDATE1.139    
      ENDIF                                                                ZPDATE1.140    
                                                                           ZPDATE1.141    
                                                                           ZPDATE1.142    
      MONTHS = (/31,days_in_feb,31,30,31,30,31,31,30,31,30,31/)            ZPDATE1.143    
      K = IDY                                                              ZPDATE1.144    
                                                                           ZPDATE1.145    
      DO I=1,12                                                            ZPDATE1.146    
        K = K - MONTHS(I)                                                  ZPDATE1.147    
        IF (K .GT. 0) THEN                                                 ZPDATE1.148    
           CYCLE                                                           ZPDATE1.149    
        ELSE                                                               ZPDATE1.150    
          ID = K + MONTHS(I)                                               ZPDATE1.151    
          IM = I                                                           ZPDATE1.152    
          INY = IY                                                         ZPDATE1.153    
        ENDIF                                                              ZPDATE1.154    
        EXIT                                                               ZPDATE1.155    
      END DO                                                               ZPDATE1.156    
                                                                           ZPDATE1.157    
      END SUBROUTINE DATE23                                                ZPDATE1.158    
!-----------------------------------------------------------------------   ZPDATE1.159    

      SUBROUTINE DATE13 (ICD, ID, IM, INY)                                  2,1ZPDATE1.160    
!                                                                          ZPDATE1.161    
!     DAY, MONTH, YEAR FROM DAYS SINCE 1.1.1900                            ZPDATE1.162    
!                                                                          ZPDATE1.163    
        IMPLICIT NONE                                                      ZPDATE1.164    
!                        INPUT ARGUMENTS                                   ZPDATE1.165    
        INTEGER, INTENT(IN) :: ICD                                         ZPDATE1.166    
!                       OUTPUT ARGUMENTS                                   ZPDATE1.167    
        INTEGER, INTENT(OUT) :: ID, IM, INY                                ZPDATE1.168    
!                       LOCAL VARIABLES                                    ZPDATE1.169    
        INTEGER :: IDY, IY                                                 ZPDATE1.170    
        INTEGER :: K,KD,KE,KY,I,K1X, days_in_feb                           ZPDATE1.171    
        INTEGER, DIMENSION(12) :: MONTHS                                   ZPDATE1.172    
!       external function                                                  ZPDATE1.173    
        LOGICAL, EXTERNAL :: ISALEAP                                       ZPDATE1.174    
                                                                           ZPDATE1.175    
        K = ICD                                                            ZPDATE1.176    
        KE = 0                                                             ZPDATE1.177    
        IF (K .GE. 366) THEN  ! these allow for the non-leap years 1900    ZPDATE1.178    
           K = K + 1                                                       ZPDATE1.179    
           IF (K .GE. 73416) THEN         !2100, ...                       ZPDATE1.180    
              K = K + 1                                                    ZPDATE1.181    
              IF (K .GE. 109941) THEN     !2200,                           ZPDATE1.182    
                 K = K + 1                                                 ZPDATE1.183    
                 IF (K .GE. 146466) THEN  !2300 ...                        ZPDATE1.184    
                    K = K + 1                                              ZPDATE1.185    
                 ENDIF                                                     ZPDATE1.186    
              ENDIF                                                        ZPDATE1.187    
           ENDIF                                                           ZPDATE1.188    
        ENDIF                                                              ZPDATE1.189    
        IF (K .LE. -36159) THEN   ! and 1800 respectively                  ZPDATE1.190    
           K = K - 1                                                       ZPDATE1.191    
        ENDIF                                                              ZPDATE1.192    
                                                                           ZPDATE1.193    
        KY = K/1461*4                                                      ZPDATE1.194    
        KD = K - K/1461*1461                                               ZPDATE1.195    
        IF (KD .LT. 0) THEN                                                ZPDATE1.196    
           KD = KD + 1461                                                  ZPDATE1.197    
           KY = KY - 4                                                     ZPDATE1.198    
        ENDIF                                                              ZPDATE1.199    
        KY = KY + 1900                                                     ZPDATE1.200    
        IF (KD .GT. 366) THEN                                              ZPDATE1.201    
           KD = KD - 1                                                     ZPDATE1.202    
           KE = KD/365                                                     ZPDATE1.203    
           KD = KD - KD/365*365                                            ZPDATE1.204    
        ENDIF                                                              ZPDATE1.205    
        IF (KD .EQ. 0) THEN                                                ZPDATE1.206    
           KE = KE - 1                                                     ZPDATE1.207    
           KD = 365                                                        ZPDATE1.208    
        ENDIF                                                              ZPDATE1.209    
        INY = KY + KE                                                      ZPDATE1.210    
        IDY = KD                                                           ZPDATE1.211    
        IY = INY                                                           ZPDATE1.212    
                                                                           ZPDATE1.213    
        IF (ISALEAP(IY)) THEN                                              ZPDATE1.214    
           days_in_feb = 29                                                ZPDATE1.215    
        ELSE                                                               ZPDATE1.216    
           days_in_feb = 28                                                ZPDATE1.217    
        ENDIF                                                              ZPDATE1.218    
                                                                           ZPDATE1.219    
        MONTHS = (/31,days_in_feb,31,30,31,30,31,31,30,31,30,31/)          ZPDATE1.220    
                                                                           ZPDATE1.221    
        K1X = IDY                                                          ZPDATE1.222    
                                                                           ZPDATE1.223    
        DO I=1,12                                                          ZPDATE1.224    
           K1X = K1X - MONTHS(I)                                           ZPDATE1.225    
           IF (K1X .GT. 0) THEN                                            ZPDATE1.226    
              CYCLE                                                        ZPDATE1.227    
           ELSE                                                            ZPDATE1.228    
              ID = K1X + MONTHS(I)                                         ZPDATE1.229    
              IM = I                                                       ZPDATE1.230    
              INY = IY                                                     ZPDATE1.231    
                                                                           ZPDATE1.232    
           ENDIF                                                           ZPDATE1.233    
           EXIT                                                            ZPDATE1.234    
        END DO                                                             ZPDATE1.235    
                                                                           ZPDATE1.236    
      END SUBROUTINE DATE13                                                ZPDATE1.237    
!-----------------------------------------------------------------------   ZPDATE1.238    

      SUBROUTINE DATE31 (ID, IM, IY, ICD)                                   5,2ZPDATE1.239    
!                                                                          ZPDATE1.240    
!     DAYS SINCE 1.1.1900 FROM DAY, MONTH, YEAR                            ZPDATE1.241    
!                                                                          ZPDATE1.242    
        IMPLICIT NONE                                                      ZPDATE1.243    
!                        INPUT ARGUMENTS                                   ZPDATE1.244    
        INTEGER, INTENT(IN) :: ID, IM, IY                                  ZPDATE1.245    
!                       OUTPUT ARGUMENTS                                   ZPDATE1.246    
        INTEGER, INTENT(OUT) :: ICD                                        ZPDATE1.247    
!                       LOCAL VARIABLES                                    ZPDATE1.248    
        INTEGER :: IDY, INY                                                ZPDATE1.249    
        INTEGER :: K,IYN, days_in_feb                                      ZPDATE1.250    
        INTEGER, DIMENSION(12) :: MONTHS                                   ZPDATE1.251    
!       external function                                                  ZPDATE1.252    
        LOGICAL, EXTERNAL :: ISALEAP                                       ZPDATE1.253    
                                                                           ZPDATE1.254    
        IF (ISALEAP(IY)) THEN                                              ZPDATE1.255    
           days_in_feb = 29                                                ZPDATE1.256    
        ELSE                                                               ZPDATE1.257    
           days_in_feb = 28                                                ZPDATE1.258    
        ENDIF                                                              ZPDATE1.259    
                                                                           ZPDATE1.260    
        MONTHS = (/31,days_in_feb,31,30,31,30,31,31,30,31,30,31/)          ZPDATE1.261    
                                                                           ZPDATE1.262    
        K = SUM(MONTHS(1:(IM-1)))    ! use array sections and intrinsics   ZPDATE1.263    
                                                                           ZPDATE1.264    
        IDY = K + ID                                                       ZPDATE1.265    
        INY = IY                                                           ZPDATE1.266    
        IYN = INY - 1900                                                   ZPDATE1.267    
        IF (IYN .GT. 0) THEN                                               ZPDATE1.268    
           ICD = IDY + IYN*365 + (IYN-1)/4 - (IYN-1)/100 + (IYN+299)/400   ZPDATE1.269    
        ELSE                                                               ZPDATE1.270    
           ICD = IDY + IYN*365 + IYN/4 - IYN/100                           ZPDATE1.271    
        ENDIF                                                              ZPDATE1.272    
                                                                           ZPDATE1.273    
                                                                           ZPDATE1.274    
      END SUBROUTINE DATE31                                                ZPDATE1.275    
!-----------------------------------------------------------------------   ZPDATE1.276    

      SUBROUTINE  DATE12(ICD,IDY,IY)                                       ZPDATE1.277    
!                                                                          ZPDATE1.278    
!     DAY OF YEAR FROM DAYS SINCE 1.1.1900                                 ZPDATE1.279    
!                                                                          ZPDATE1.280    
        IMPLICIT NONE                                                      ZPDATE1.281    
!                        INPUT ARGUMENTS                                   ZPDATE1.282    
        INTEGER, INTENT(IN)  :: ICD                                        ZPDATE1.283    
!                       OUTPUT ARGUMENTS                                   ZPDATE1.284    
        INTEGER, INTENT(OUT) :: IDY, IY                                    ZPDATE1.285    
!                       LOCAL VARIABLES                                    ZPDATE1.286    
        INTEGER :: K, KD, KE, KY                                           ZPDATE1.287    
                                                                           ZPDATE1.288    
        K = ICD                                                            ZPDATE1.289    
        KE = 0                                                             ZPDATE1.290    
        IF (K .GE. 366) THEN                                               ZPDATE1.291    
           K = K + 1                                                       ZPDATE1.292    
           IF (K .GE. 73416) THEN                                          ZPDATE1.293    
              K = K + 1                                                    ZPDATE1.294    
              IF (K .GE. 109941) THEN                                      ZPDATE1.295    
                 K = K + 1                                                 ZPDATE1.296    
                 IF (K .GE. 146466) THEN                                   ZPDATE1.297    
                    K = K + 1                                              ZPDATE1.298    
                 ENDIF                                                     ZPDATE1.299    
              ENDIF                                                        ZPDATE1.300    
           ENDIF                                                           ZPDATE1.301    
        ENDIF                                                              ZPDATE1.302    
        IF (K .LE. -36159) THEN                                            ZPDATE1.303    
           K = K - 1                                                       ZPDATE1.304    
        ENDIF                                                              ZPDATE1.305    
        KY = K/1461*4                                                      ZPDATE1.306    
        KD = K - K/1461*1461                                               ZPDATE1.307    
        IF (KD .LT. 0) THEN                                                ZPDATE1.308    
           KD = KD + 1461                                                  ZPDATE1.309    
           KY = KY - 4                                                     ZPDATE1.310    
        ENDIF                                                              ZPDATE1.311    
        KY = KY + 1900                                                     ZPDATE1.312    
        IF (KD .GT. 366) THEN                                              ZPDATE1.313    
           KD = KD - 1                                                     ZPDATE1.314    
           KE = KD/365                                                     ZPDATE1.315    
           KD = KD - KD/365*365                                            ZPDATE1.316    
        ENDIF                                                              ZPDATE1.317    
        IF (KD .EQ. 0) THEN                                                ZPDATE1.318    
           KE = KE - 1                                                     ZPDATE1.319    
           KD = 365                                                        ZPDATE1.320    
        ENDIF                                                              ZPDATE1.321    
        IY = KY + KE                                                       ZPDATE1.322    
        IDY = KD                                                           ZPDATE1.323    
                                                                           ZPDATE1.324    
      END SUBROUTINE DATE12                                                ZPDATE1.325    
!-----------------------------------------------------------------------   ZPDATE1.326    

      SUBROUTINE  DATE32(ID,IM,IY,IDY,INY)                                 ZPDATE1.327    
!                                                                          ZPDATE1.328    
!     DAY OF YEAR FROM DAY, MONTH, YEAR                                    ZPDATE1.329    
!                                                                          ZPDATE1.330    
        IMPLICIT NONE                                                      ZPDATE1.331    
!                        INPUT ARGUMENTS                                   ZPDATE1.332    
        INTEGER, INTENT(IN)  :: ID, IM, IY                                 ZPDATE1.333    
!                       OUTPUT ARGUMENTS                                   ZPDATE1.334    
        INTEGER, INTENT(OUT) :: IDY, INY                                   ZPDATE1.335    
!                       LOCAL VARIABLES                                    ZPDATE1.336    
        INTEGER :: K, days_in_feb                                          ZPDATE1.337    
        INTEGER, DIMENSION(12) :: MONTHS                                   ZPDATE1.338    
!       external function                                                  ZPDATE1.339    
        LOGICAL, EXTERNAL :: ISALEAP                                       ZPDATE1.340    
                                                                           ZPDATE1.341    
        IF (ISALEAP(IY)) THEN                                              ZPDATE1.342    
           days_in_feb = 29                                                ZPDATE1.343    
        ELSE                                                               ZPDATE1.344    
           days_in_feb = 28                                                ZPDATE1.345    
        ENDIF                                                              ZPDATE1.346    
                                                                           ZPDATE1.347    
        MONTHS = (/31,days_in_feb,31,30,31,30,31,31,30,31,30,31/)          ZPDATE1.348    
                                                                           ZPDATE1.349    
        K = SUM(MONTHS(1:(IM-1)))  !use array sections and intrinsics      ZPDATE1.350    
                                                                           ZPDATE1.351    
        IDY = K + ID                                                       ZPDATE1.352    
        INY = IY                                                           ZPDATE1.353    
                                                                           ZPDATE1.354    
      END SUBROUTINE DATE32                                                ZPDATE1.355    
                                                                           ZPDATE1.356    
                                                                           ZPDATE1.357    
!-----------------------------------------------------------------------   ZPDATE1.358    

      INTEGER FUNCTION MNTHDS(MONTH,YEAR)                                   1,1ZPDATE1.359    
!                                                                          ZPDATE1.360    
! Returns Days in Month from Month and Year.                               ZPDATE1.361    
!                                                                          ZPDATE1.362    
      IMPLICIT NONE                                                        ZPDATE1.363    
!     INPUT ARGUMENTS                                                      ZPDATE1.364    
      INTEGER, INTENT(IN)  :: MONTH,YEAR                                   ZPDATE1.365    
!     LOCAL VARIABLES                                                      ZPDATE1.366    
                                                                           ZPDATE1.367    
      LOGICAL, EXTERNAL :: ISALEAP                                         ZPDATE1.368    
                                                                           ZPDATE1.369    
      SELECT CASE (MONTH)                                                  ZPDATE1.370    
      CASE (1,3,5,7,8,10,12)                                               ZPDATE1.371    
         MNTHDS = 31                                                       ZPDATE1.372    
      CASE (4,6,9,11)                                                      ZPDATE1.373    
         MNTHDS = 30                                                       ZPDATE1.374    
      CASE (2)                                                             ZPDATE1.375    
         IF (ISALEAP(YEAR)) THEN                                           ZPDATE1.376    
            MNTHDS = 29                                                    ZPDATE1.377    
         ELSE                                                              ZPDATE1.378    
            MNTHDS = 28                                                    ZPDATE1.379    
         ENDIF                                                             ZPDATE1.380    
      CASE DEFAULT                                                         ZPDATE1.381    
         PRINT *, "Error in function MNTHDS"                               ZPDATE1.382    
         RETURN                                                            ZPDATE1.383    
      END SELECT                                                           ZPDATE1.384    
                                                                           ZPDATE1.385    
      END FUNCTION MNTHDS                                                  ZPDATE1.386    
!-----------------------------------------------------------------------   ZPDATE1.387    

      SUBROUTINE DATCHK (DAY,MONTH,YEAR,VALID)                             ,1ZPDATE1.388    
!                                                                          ZPDATE1.389    
!     Checks the date and returns to a given statement for invalid         ZPDATE1.390    
!     values                                                               ZPDATE1.391    
!                                                                          ZPDATE1.392    
      IMPLICIT NONE                                                        ZPDATE1.393    
      INTEGER, INTENT(IN)  :: DAY,MONTH,YEAR                               ZPDATE1.394    
      LOGICAL, INTENT(OUT) :: VALID                                        ZPDATE1.395    
                                                                           ZPDATE1.396    
      INTEGER :: LDAY                                                      ZPDATE1.397    
      INTEGER :: LMNTH                                                     ZPDATE1.398    
      INTEGER, EXTERNAL :: MNTHDS                                          ZPDATE1.399    
                                                                           ZPDATE1.400    
                                                                           ZPDATE1.401    
      IF (YEAR .EQ. 1752) THEN                                             ZPDATE1.402    
         LDAY=14                                                           ZPDATE1.403    
         LMNTH=9                                                           ZPDATE1.404    
      ELSE                                                                 ZPDATE1.405    
         LDAY=1                                                            ZPDATE1.406    
         LMNTH=1                                                           ZPDATE1.407    
      ENDIF                                                                ZPDATE1.408    
                                                                           ZPDATE1.409    
! Check that within valid year range                                       ZPDATE1.410    
! Check that within valid month range                                      ZPDATE1.411    
! and check that within valid day range                                    ZPDATE1.412    
                                                                           ZPDATE1.413    
      IF ((YEAR .GE. 1752) .AND.                                           ZPDATE1.414    
     &      (YEAR .LE. 2399) .AND.                                         ZPDATE1.415    
     &      (MONTH .GE. LMNTH) .AND.                                       ZPDATE1.416    
     &      (MONTH .LE. 12)   .AND.                                        ZPDATE1.417    
     &      (DAY .GE. LDAY) .AND.                                          ZPDATE1.418    
     &      (DAY .LE. MNTHDS(MONTH,YEAR))) THEN                            ZPDATE1.419    
! Valid date, so return from here                                          ZPDATE1.420    
         VALID=.TRUE.                                                      ZPDATE1.421    
      ELSE                                                                 ZPDATE1.422    
         VALID=.FALSE.                                                     ZPDATE1.423    
      ENDIF                                                                ZPDATE1.424    
      RETURN                                                               ZPDATE1.425    
      END SUBROUTINE DATCHK                                                ZPDATE1.426    
!-----------------------------------------------------------------------   ZPDATE1.427    
! The JDATE Conversion algorithms are based on the algorithm published     ZPDATE1.428    
! in a letter to the editor of Communications of the ACM (CACM, volume 1   ZPDATE1.429    
! number 10, October 1968, p.657) by Henry F. Fliegel and                  ZPDATE1.430    
! Thomas Van Flandern                                                      ZPDATE1.431    
! This algorithm is valid only for dates from                              ZPDATE1.432    
! 1/3/-4900 G onward when converting from a Julian day number to a date,   ZPDATE1.433    
! or from 1/3/-4800 when converting from a date to a Julian day number.    ZPDATE1.434    
! It should be noted that these algorithms are valid only in the           ZPDATE1.435    
! Gregorian Calendar and the Proleptic Gregorian Calendar (after the       ZPDATE1.436    
! dates given above). They do not handle dates in the Julian Calendar.     ZPDATE1.437    
!-----------------------------------------------------------------------   ZPDATE1.438    

      SUBROUTINE JDATE31(ID,IM,IY,OD)                                      ZPDATE1.439    
        !                                                                  ZPDATE1.440    
        !     Returns the Julian Day Number for a Day, Month, Year         ZPDATE1.441    
        !                                                                  ZPDATE1.442    
        IMPLICIT NONE                                                      ZPDATE1.443    
        !                        INPUT ARGUMENTS                           ZPDATE1.444    
        INTEGER, INTENT(IN)  :: ID,IM,IY                                   ZPDATE1.445    
        !                       OUTPUT ARGUMENTS                           ZPDATE1.446    
        INTEGER, INTENT(OUT) :: OD                                         ZPDATE1.447    
                                                                           ZPDATE1.448    
        OD = ID - 32075                                                    ZPDATE1.449    
     &        + 1461 * ( IY + 4800 - ( 14 - IM ) / 12 )/4                  ZPDATE1.450    
     &        + 367 * ( IM - 2 + (( 14 - IM ) / 12 ) * 12 ) / 12           ZPDATE1.451    
     &        - 3 * ( ( IY + 4900 - ( 14 - IM ) / 12 ) / 100 ) / 4         ZPDATE1.452    
                                                                           ZPDATE1.453    
                                                                           ZPDATE1.454    
      END SUBROUTINE JDATE31                                               ZPDATE1.455    
                                                                           ZPDATE1.456    
!-----------------------------------------------------------------------   ZPDATE1.457    

      SUBROUTINE JDATE13(ID,OD,OM,OY)                                      ZPDATE1.458    
        !                                                                  ZPDATE1.459    
        !     Returns the Day, Month, Year from a Julian Day Number        ZPDATE1.460    
        !                                                                  ZPDATE1.461    
                                                                           ZPDATE1.462    
        IMPLICIT NONE                                                      ZPDATE1.463    
        !                        INPUT ARGUMENTS                           ZPDATE1.464    
        INTEGER, INTENT(IN)  :: ID                                         ZPDATE1.465    
        !                       OUTPUT ARGUMENTS                           ZPDATE1.466    
        INTEGER, INTENT(OUT) :: OD,OM,OY                                   ZPDATE1.467    
        !                       LOCAL VARIABLES                            ZPDATE1.468    
        INTEGER :: J,I,L,N                                                 ZPDATE1.469    
                                                                           ZPDATE1.470    
        L = ID + 68569                                                     ZPDATE1.471    
        N = ( 4 * L ) / 146097                                             ZPDATE1.472    
        L = L - ( 146097 * N + 3 ) / 4                                     ZPDATE1.473    
        I = ( 4000 * ( L + 1 ) ) / 1461001                                 ZPDATE1.474    
        L = L - ( 1461 * I ) / 4 + 31                                      ZPDATE1.475    
        J = ( 80 * L ) / 2447                                              ZPDATE1.476    
        OD = L - ( 2447 * J ) / 80                                         ZPDATE1.477    
        L = J / 11                                                         ZPDATE1.478    
        OM = J + 2 - ( 12 * L )                                            ZPDATE1.479    
        OY = 100 * ( N - 49 ) + I + L                                      ZPDATE1.480    
                                                                           ZPDATE1.481    
                                                                           ZPDATE1.482    
      END SUBROUTINE JDATE13                                               ZPDATE1.483    
!----------------------------------------------------------                ZPDATE1.484    
*ENDIF                                                                     ZPDATE1.485    
                                                                           ZPDATE1.486