C     @(#)leapyear.f	1.2     02/04/00
C
      logical function leapyear (nyear)

c This function decides whether a particular year is a leap year
c Rule 1: Years not exactly divisible by four are not leap years
c Rule 2: Years not exactly divisible by one hundred are leap years
c Rule 3: Years not exactly divisible by four hundred are not leapyears
c         Years exactly divisible by four hundred are leapyears

c prior to the adoption of Gregorian Calendar in 1583 October, dates are
c assumed to be Julian i.e. Rule 1 only applies. 1700 is the first year
c affected by this change.

      logical test
      
      integer*4 nyear_local

      test(n) = (nyear_local/n)*n .eq. nyear_local
      
      nyear_local = nyear
      
      
c     tests to guarantee all possibilities re Y2K - PD - 01/02/00
c     further amended -3/7/00 - using local 'nyear' variable so
c     that incorrect nyear not returned (only happened when leapyear
c     called with a 2 digit year)

c     if nyear is 2 digits (including zero) & possible 100-200 range

      if (nyear_local .lt. 200) then

         if (nyear_local .le. 95) then      
            nyear_local = 2000 + nyear_local      
         else     
            nyear_local = 1900 + nyear_local      
         end if
         
      end if      

      if (nyear_local .gt. 0) then
      else if (nyear_local .lt. 0) then
              call abort('Rules for BC leap years undetermined')
           else
              call abort('Year zero does not exist: 1 AD follows 1 BC')
      end if
      leapyear = test(4)
      if (leapyear .and. nyear_local .ge. 1700) then
        leapyear = .not.test(100)
        if (.not.leapyear) leapyear = test(400)
      end if
      return
      end
