C $Header: /u/gcmpack/MITgcm/pkg/cal/cal_monthsforyear.F,v 1.2 2003/10/09 04:19:19 edhill Exp $
C $Name:  $

#include "CAL_OPTIONS.h"

      subroutine CAL_MONTHSFORYEAR(
     I                              iyear,
     O                              firstmonth,
     O                              lastmonth,
     O                              nmonths,
     I                              mythid
     &                            )

c     ==================================================================
c     SUBROUTINE cal_MonthsForYear
c     ==================================================================
c
c     o Given the current year of integration this routine returns
c       the number of months affected by the integration as well as the
c       first month and the last month in the sequence of the total
c       number of months that are to be integrated.
c
c       This routine also checks consistency of variables quite
c       extensively.
c
c     started: Christian Eckert eckert@mit.edu  06-Apr-2000
c
c     changed: 
c
c     ==================================================================
c     SUBROUTINE cal_MonthsForYear
c     ==================================================================

      implicit none

c     == global variables ==

#include "cal.h"

c     == routine arguments ==

      integer iyear
      integer firstmonth
      integer lastmonth
      integer nmonths
      integer mythid

c     == local variables ==

      integer ierr
      integer numyears
      integer firstyear
      integer firstmon
      integer lastyear
      integer lastmon
      integer lastday
      integer lastsecs

c     == external ==

      integer  cal_IntYears
      external 

c     == end of interface ==

      numyears = cal_IntYears( mythid )

      firstyear = modelstartdate(1)/10000
      firstmon  = mod(modelstartdate(1)/100,100)
      lastyear  = modelenddate(1)/10000
      lastmon   = mod(modelenddate(1)/100,100)
      lastday   = mod(modelenddate(1),100)
      lastsecs  = modelenddate(2)/10000*secondsperhour +
     &            mod(modelenddate(2)/100,100)*secondsperminute +
     &            mod(modelenddate(2),100)

      if ( numyears .eq. 1 ) then
c--     Only one calendar year affected by the integration.
        if ( iyear .eq. 1 ) then
          if ( firstyear .eq. lastyear ) then
            if ( (lastday .eq. 1) .and. (lastsecs .eq. 0) ) then
c--           Not really next month yet.
              lastmonth  = lastmon - firstmon
            else
c--           The most frequent case.
              lastmonth  = lastmon - firstmon + 1
            endif
            firstmonth = 1
          else if ( firstyear+1 .eq. lastyear ) then
c--         This is only the case if we end at midnight of 01-Jan
c--         of the next year.
            if ( ( modelenddate(2) .eq. 0) .and.
     &         ( mod(modelenddate(1),100) .eq. 1 ) .and.
     &           mod(modelenddate(1)/100,100) .eq. 1 ) then
              firstmonth = 1
              lastmonth  = nmonthyear - firstmon + 1
            else
c--           Inconsistent modelenddate; check cal_IntYears.
              ierr = 2804
              call CAL_PRINTERROR( ierr, mythid )
              stop ' stopped in cal_MonthsForYear.'
            endif
          else
c--         The specification of lastyear is wrong.
            ierr = 2803
            call CAL_PRINTERROR( ierr, mythid )
            stop ' stopped in cal_MonthsForYear.'
          endif
        else
c--       The variables numyears and iyear are inconsistent;
c--       ( iyear .gt. numyears ).
          ierr = 2802
          call CAL_PRINTERROR( ierr, mythid )
          stop ' stopped in cal_MonthsForYear.'
        endif

      else if ( numyears .gt. 1 ) then
c--     More than one year of integration.
        if ( iyear .eq. 1 ) then
          firstmonth = 1
          lastmonth  = nmonthyear - firstmon + 1
        else if ( ( iyear .gt. 1 )        .and.
     &            ( iyear .lt. numyears )       ) then
c--       Somewhere between first and last year.
          firstmonth = (nmonthyear - firstmon + 1) +
     &                 (iyear - 2)*nmonthyear + 1
          lastmonth  = (nmonthyear - firstmon + 1) +
     &                 (iyear - 2)*nmonthyear + nmonthyear
        else if ( iyear .eq. numyears ) then
c--       The last year of the integration.
          if ( lastyear .eq. (firstyear + numyears - 1) ) then
            if ( (lastday .eq. 1) .and. (lastsecs .eq. 0) ) then
c--           Not really next month yet.
              lastmonth  = (nmonthyear - firstmon + 1) +
     &                     (numyears - 2)*nmonthyear + lastmon - 1
            else
c--           The most frequent case.
              lastmonth  = (nmonthyear - firstmon + 1) +
     &                     (numyears - 2)*nmonthyear + lastmon
            endif
            firstmonth = (nmonthyear - firstmon + 1) +
     &                   (numyears - 2)*nmonthyear + 1
          else if ( lastyear .eq. (firstyear + numyears) ) then
c--         This is only the case if we end at midnight of 01-Jan.
            if ( ( modelenddate(2) .eq. 0) .and.
     &         ( mod(modelenddate(1),100) .eq. 1 ) .and.
     &           mod(modelenddate(1)/100,100) .eq. 1 ) then
              firstmonth = (nmonthyear - firstmon) +
     &                     (numyears - 2)*nmonthyear + 1
              lastmonth  = (nmonthyear - firstmon) +
     &                     (numyears - 2)*nmonthyear + nmonthyear
            else
c--           Inconsistent modelenddate; check cal_IntYears.
              ierr = 2807
              call CAL_PRINTERROR( ierr, mythid )
              stop ' stopped in cal_MonthsForYear.'
            endif
          else
c--         The variables lastyear and numyears are inconsistent.
            ierr = 2806
            call CAL_PRINTERROR( ierr, mythid )
            stop ' stopped in cal_MonthsForYear.'
          endif
        else
c--       The variables iyear and numyears are inconsistent.
          ierr = 2805
          call CAL_PRINTERROR( ierr, mythid )
          stop ' stopped in cal_MonthsForYear.'
        endif

      else
c--     The number of years to integrate is wrong; check cal_IntYears.
        ierr = 2801
        call CAL_PRINTERROR( ierr, mythid )
        stop ' stopped in cal_MonthsForYear.'
      endif

c--   The number of months to integrate in the given year.
      nmonths = lastmonth - firstmonth + 1

      return
      end