Skip to content
Snippets Groups Projects
jul2greg.h90 3.07 KiB
Newer Older
Guillaume Samson's avatar
Guillaume Samson committed
   RECURSIVE SUBROUTINE jul2greg( ksec, kminut, khour, kday, kmonth, kyear, &
      &                           prelday, krefdate )
      !!-----------------------------------------------------------------------
      !!
      !!                     ***  ROUTINE jul2greg  ***
      !!
      !! ** Purpose : Take the relative time in days and re-express in terms of
      !!              seconds, minutes, hours, days, month, year.
      !!
      !! ** Method  : Reference date : 19500101
      !!
      !! ** Action  :
      !!
      !! History
      !!      ! 06-04  (A. Vidard) Original
      !!      ! 06-05  (A. Vidard) Reformatted and refdate      
      !!      ! 06-10  (A. Weaver) Cleanup
      !!      ! 2014-09 (D. Lea) Change to use FLOOR to deal with negative prelday
      !!-----------------------------------------------------------------------

      ! * Arguments
      INTEGER, INTENT(IN), OPTIONAL :: &
         & krefdate
      INTEGER, INTENT(OUT) :: &
         & ksec,   &
         & kminut, &
         & khour,  &
         & kday,   &
         & kmonth, &
         & kyear
      REAL(KIND=dp), INTENT(IN) :: &
         & prelday

      !! * Local declarations
      INTEGER, PARAMETER :: &
         & jpgreg = 2299161, &
         & jporef = 2433283, &
         & jparef = 2415021
      INTEGER :: &
         & ijulian, &
         & ij1,     &
         & ija,     &
         & ijb,     &
         & ijc,     &
         & ijd,     &
         & ije,     &
         & isec,    &
         & imin,    &
         & ihou,    &
         & iday,    &
         & imon,    &
         & iyea,    &
         & iref
      REAL(KIND=wp) :: &
         & zday, &
         & zref
      CHARACTER(len=200) :: &
         & cerr

      ! Main computation
      IF ( PRESENT( krefdate ) ) THEN

         SELECT CASE ( krefdate )

         CASE( 0 ) 
            iref = jpgreg

         CASE( 19500101 )
            iref = jporef

         CASE( 19000101 )
            iref = jparef

         CASE DEFAULT
            WRITE(cerr,'(A,I8.8)')'jul2greg: Unknown krefdate:', krefdate
            CALL ctl_stop( cerr )

         END SELECT

      ELSE
         iref = jporef 
      ENDIF

      zday = prelday
      ksec = FLOOR( 86400. * MOD( zday, 1. ) )

      IF ( ksec < 0. ) ksec = 86400. + ksec

      khour  = ksec / 3600
      kminut = ( ksec - 3600 * khour ) / 60
      ksec   = MOD( ksec , 60 )

      ijulian = iref + INT( zday )
      IF ( zday < 0. ) ijulian = ijulian - 1

      ! If input date after 10/15/1582 :
      IF ( ijulian >= jpgreg ) THEN
	 ij1 = INT( ( DBLE( ijulian - 1867216 ) - 0.25 ) / 36524.25 )
	 ija = ijulian + 1 + ij1 - INT( ( 0.25 * ij1 ) )
      ELSE
	 ija = ijulian
      ENDIF

      ijb = ija + 1524
      ijc = INT( 6680. + ( DBLE ( ijb - 2439870 ) - 122.1 ) / 365.25 )
      ijd = 365 * ijc + INT( 0.25 * ijc )
      ije = INT( ( ijb - ijd ) / 30.6001 )
      kday = ijb - ijd - INT( 30.6001 * ije )
      kmonth = ije - 1
      IF ( kmonth > 12 ) kmonth = kmonth - 12
      kyear = ijc - 4715
      IF ( kmonth > 2 ) kyear = kyear - 1
      IF ( kyear <= 0 ) kyear = kyear - 1

   END SUBROUTINE jul2greg