C $Header: /u/gcmpack/MITgcm/pkg/ecco/cost_averagesflags.F,v 1.2 2004/10/11 16:38:53 heimbach Exp $ #include "COST_CPPOPTIONS.h" subroutine COST_AVERAGESFLAGS( I myiter, I mytime, I mythid, O first, O startofday, O startofmonth, O inday, O inmonth, O last, O endofday, O endofmonth, O sum1day, O dayrec, O sum1mon, O monrec & ) c ================================================================== c SUBROUTINE cost_AveragesFlags c ================================================================== c c o Get flags for the daily and monthly time averaging. c c started: Christian Eckert eckert@mit.edu 24-Feb-2000 c c - Introduced in order to create a package for the c MITgcmUV. c c changed: c c ================================================================== c SUBROUTINE cost_AveragesFlags c ================================================================== implicit none c == global variables == #include "EEPARAMS.h" #include "SIZE.h" #include "cal.h" c == routine arguments == integer myiter _RL mytime integer mythid logical first logical startofday logical startofmonth logical inday logical inmonth logical last logical endofday logical endofmonth integer sum1day integer dayrec integer sum1mon integer monrec c == local variables == integer mydate(4) integer nextdate(4) integer prevdate(4) integer timediff(4) integer datediff(4) integer targetdate(4) integer targetdate1 integer targetdate2 integer mydateday integer mydatemonth integer nextdateday integer nextdatemonth integer prevdateday integer prevdatemonth logical equal c == external functions == logical cal_CompDates external integer cal_NumInts external c == end of interface == c-- First, get some dates. call CAL_GETDATE( myiter, mytime, mydate, mythid ) call CAL_GETDATE( myiter+1, mytime+modelstep, nextdate, mythid ) call CAL_TIMEINTERVAL( -modelstep, 'secs', timediff, mythid ) call CAL_ADDTIME( mydate, timediff, prevdate, mythid ) ce print*,' time average flags: mydate = ', mydate ce print*,' time average flags: nextdate = ', nextdate ce print*,' time average flags: prevdate = ', prevdate c-- Where are we with respect to the calendar? c-- The very first model step? equal = cal_CompDates(modelstartdate,mydate,mythid) if ( equal ) then first = .true. dayrec = 0 monrec = 0 else first = .false. endif c-- The very last model step? equal = cal_CompDates(modelenddate,mydate,mythid) if ( equal ) then last = .true. else last = .false. endif c-- Start of a calendar day? mydateday = mod(mydate(1),100) prevdateday = mod(prevdate(1),100) if ( mydateday .ne. prevdateday ) then startofday = .true. else startofday = .false. endif c-- End of a calendar day? mydateday = mod(mydate(1),100) nextdateday = mod(nextdate(1),100) if ( mydateday .ne. nextdateday ) then endofday = .true. else endofday = .false. endif c-- In a calendar day? As coded here, inday can not be true c-- for either the first or the last timestep in the day. c-- So the cases are mutually exclusive. if ( ( mydateday .eq. prevdateday ) .and. & ( mydateday .eq. nextdateday ) ) then inday = .true. else inday = .false. endif c-- Determine sum1day and dayrec explicitly. if ( last .or. endofday ) then if ( mydate(1) .eq. modelstartdate(1) ) then call CAL_COPYDATE( modelstartdate, targetdate, mythid ) dayrec = 1 else targetdate(1) = mydate(1) targetdate(2) = 0 targetdate(3) = mydate(3) targetdate(4) = mydate(4) call CAL_TIMEPASSED( modelstartdate, targetdate, datediff, & mythid ) if ( datediff(2) .eq. 0) then dayrec = datediff(1) + 1 else dayrec = datediff(1) + 2 endif endif call CAL_TIMEINTERVAL( modelstep, 'secs', timediff, mythid ) sum1day = & cal_NumInts( targetdate, mydate, timediff, mythid ) + 1 else sum1day = 0 endif c-- Start of a calendar month? mydatemonth = mod(mydate(1)/100,100) prevdatemonth = mod(prevdate(1)/100,100) if ( mydatemonth .ne. prevdatemonth ) then startofmonth = .true. else startofmonth = .false. endif c-- End of a calendar month? mydatemonth = mod(mydate(1)/100,100) nextdatemonth = mod(nextdate(1)/100,100) if ( mydatemonth .ne. nextdatemonth ) then endofmonth = .true. else endofmonth = .false. endif c-- In a calendar month? As coded here, inmonth can not be true c-- for either the first or the last timestep in the month. c-- So the cases are mutually exclusive. if ( ( mydatemonth .eq. prevdatemonth ) .and. & ( mydatemonth .eq. nextdatemonth ) ) then inmonth = .true. else inmonth = .false. endif c-- Determine sum1mon and monrec explicitly. if ( last .or. endofmonth ) then if ( (mydate(1)/100)*100 .eq. (modelstartdate(1)/100)*100 ) then call CAL_COPYDATE( modelstartdate, targetdate, mythid ) monrec = 1 else targetdate1 = (mydate(1)/100)*100+1 targetdate2 = 0 call CAL_FULLDATE( targetdate1, targetdate2, targetdate, & mythid ) if ( mydate(1)/10000 .eq. modelstartdate(1)/10000 ) then monrec = mod( mydate(1)/100, 100 ) & - mod( modelstartdate(1)/100, 100 ) + 1 else monrec = mod( mydate(1)/100, 100 ) & + nmonthyear - mod(modelstartdate(1)/100,100) + 1 & + ( mydate(1)/10000 - modelstartdate(1)/10000 - 1)* & nmonthyear endif endif call CAL_TIMEINTERVAL( modelstep, 'secs', timediff, mythid ) sum1mon = & cal_NumInts( targetdate, mydate, timediff, mythid ) + 1 else sum1mon = 0 endif end