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