      subroutine geth_newdate (ndate, odate, idts)
      implicit none

!**********************************************************************
!
!  purpose      -  from old date ('YYYY-MM-DD*HH:MM:SS') and time in
!                  seconds, compute the new date.
!
!  on entry     -  odate  -  the old hdate.
!                  idts   -  the change in time in seconds.
!
!  on exit      -  ndate  -  the new hdate.
!                  idts    -  the change in time in seconds.
!
!**********************************************************************

      integer idts
      character*(*) ndate, odate
      integer nlen, olen

!
!  Local Variables
!
!  yrold    -  indicates the year associated with "odate"
!  moold    -  indicates the month associated with "odate"
!  dyold    -  indicates the day associated with "odate"
!  hrold    -  indicates the hour associated with "odate"
!  miold    -  indicates the minute associated with "odate"
!  scold    -  indicates the second associated with "odate"
!
!  yrnew    -  indicates the year associated with "ndate"
!  monew    -  indicates the month associated with "ndate"
!  dynew    -  indicates the day associated with "ndate"
!  hrnew    -  indicates the hour associated with "ndate"
!  minew    -  indicates the minute associated with "ndate"
!  scnew    -  indicates the second associated with "ndate"
!
!  mday     -  a list assigning the number of days in each month

!  dth      -  the number of hours represented by "idts"
!  i        -  loop counter
!  nday     -  the integer number of days represented by "idts"
!  nhour    -  the integer number of hours in "idts" after taking out
!              all the whole days
!  nmin     -  the integer number of minutes in "idts" after taking out
!              all the whole days and whole hours.
!  nsec     -  the integer number of minutes in "idts" after taking out
!              all the whole days, whole hours, and whole minutes.
!

      integer yrnew, monew, dynew, hrnew, minew, scnew
      integer yrold, moold, dyold, hrold, miold, scold
      integer mday(12), nday, nhour, nmin, nsec, i
      real    dth
      logical opass
      logical noLeapCalendar


!*************************  Subroutine Begin  *************************

!
!  Determine whether the routine should use a no-leap year calendar
!
      noLeapCalendar = .false.
     
#ifdef NO_LEAP_CALENDAR
      noLeapCalendar = .true.
#endif


!
!  Assign the number of days in a months
!

      mday( 1) = 31
      mday( 2) = 28
      mday( 3) = 31
      mday( 4) = 30
      mday( 5) = 31
      mday( 6) = 30
      mday( 7) = 31
      mday( 8) = 31
      mday( 9) = 30
      mday(10) = 31
      mday(11) = 30
      mday(12) = 31

!
!  Break down old hdate into parts
!
      hrold = 0
      miold = 0
      scold = 0
      olen = len(odate)

      read(odate(1:4),  '(I4)') yrold
      read(odate(6:7),  '(I2)') moold
      read(odate(9:10), '(I2)') dyold
      if (olen.ge.13) then
         read(odate(12:13),'(I2)') hrold
         if (olen.ge.16) then
            read(odate(15:16),'(I2)') miold
            if (olen.ge.19) then
               read(odate(18:19),'(I2)') scold
            endif
         endif
      endif
!
!  Set the number of days in February for that year.
!
      mday(2) = 28
      if (.not. noLeapCalendar) then
         if (mod(yrold,4).eq.0) then
            mday(2) = 29
            if (mod(yrold,100).eq.0) then
               mday(2) = 28
               if (mod(yrold,400).eq.0) then
                  mday(2) = 29
               endif
            endif
         endif
      endif
!
!  Check that ODATE makes sense.
!
      opass = .TRUE.

!  Check that the month of ODATE makes sense.

      if ((moold.gt.12).or.(moold.lt.1)) then
         print*, 'GETH_NEWDATE:  Month of ODATE = ', moold
         opass = .FALSE.
      endif

!  Check that the day of ODATE makes sense.

      if ((dyold.gt.mday(moold)).or.(dyold.lt.1)) then

         !
         ! Send a custom message if any leap-day files if it is a No-Leap Calendar
         !
         if (noLeapCalendar .and. (moold .eq. 2) .and. (dyold .eq. 29)) then
            print*,'GET_NEWDATE:  Using a no-Leap Calendar, but data for 2/29 was found.'
         else
            print*, 'GET_NEWDATE:  Day of ODATE = ', dyold
         endif

            opass = .FALSE.
      endif

!  Check that the hour of ODATE makes sense.

      if ((hrold.gt.23).or.(hrold.lt.0)) then
         print*, 'GET_NEWDATE:  Hour of ODATE = ', hrold
         opass = .FALSE.
      endif

!  Check that the minute of ODATE makes sense.

      if ((miold.gt.59).or.(miold.lt.0)) then
         print*, 'GET_NEWDATE:  Minute of ODATE = ', miold
         opass = .FALSE.
      endif

!  Check that the second of ODATE makes sense.

      if ((scold.gt.59).or.(scold.lt.0)) then
         print*, 'GET_NEWDATE:  Second of ODATE = ', scold
         opass = .FALSE.
      endif

      if (.not.opass) then
         print*, 'Crazy ODATE: ', odate(1:olen), olen
         STOP 'Error_odate'
!        stop
      endif
!
!  Date Checks are completed.  Continue.
!

!
!  Compute the number of days, hours, minutes, and seconds in idts
!
      nday   = idts/86400  ! Integer number of days in delta-time
      nhour   = mod(idts,86400)/3600
      nmin   = mod(idts,3600)/60
      nsec   = mod(idts,60)

      scnew = scold + nsec
      if (scnew .ge. 60) then
         scnew = scnew - 60
         nmin  = nmin + 1
      end if
      minew = miold + nmin
      if (minew .ge. 60) then
         minew = minew - 60
         nhour  = nhour + 1
      end if
      hrnew = hrold + nhour
      if (hrnew .ge. 24) then
         hrnew = hrnew - 24
         nday  = nday + 1
      end if

      dynew = dyold
      monew = moold
      yrnew = yrold
      do i = 1, nday
         dynew = dynew + 1
         if (dynew.gt.mday(monew)) then
            dynew = dynew - mday(monew)
            monew = monew + 1
            if (monew .gt. 12) then
               monew = 1
               yrnew = yrnew + 1

               mday(2) = 28
               if (.not. noLeapCalendar) then
                  if (mod(yrnew,4).eq.0) then
                     mday(2) = 29
                     if (mod(yrnew,100).eq.0) then
                        mday(2) = 28
                        if (mod(yrnew,400).eq.0) then
                           mday(2) = 29
                        endif
                     endif
                  endif
               endif

            end if
         endif
      enddo

!
!  Now construct the new mdate
!
      nlen = len(ndate)

      if (nlen.ge.19) then
         write(ndate,19) yrnew, monew, dynew, hrnew, minew, scnew
 19      format(I4.4,'-',I2.2,'-',I2.2,'_',I2.2,':',I2.2,':',I2.2)

      else if (nlen.eq.16) then
         write(ndate,16) yrnew, monew, dynew, hrnew, minew
 16      format(I4.4,'-',I2.2,'-',I2.2,'_',I2.2,':',I2.2)

      else if (nlen.eq.13) then
         write(ndate,13) yrnew, monew, dynew, hrnew
 13      format(I4.4,'-',I2.2,'-',I2.2,'_',I2.2)

      else if (nlen.eq.10) then
         write(ndate,10) yrnew, monew, dynew
 10      format(I4.4,'-',I2.2,'-',I2.2)

      endif

!**************************  Subroutine End  **************************

      end
