C $Header: /u/gcmpack/MITgcm/pkg/ctrl/ctrl_get_gen_rec.F,v 1.4 2004/03/04 19:49:47 heimbach Exp $ #include "PACKAGES_CONFIG.h" #include "CTRL_CPPOPTIONS.h" subroutine CTRL_GET_GEN_REC( I xx_genstartdate, I xx_genperiod, O fac, O first, O changed, O count0, O count1, I mytime, I myiter, I mythid & ) c ================================================================== c SUBROUTINE ctrl_get_gen_rec c ================================================================== c c o Get flags, counters, and the linear interpolation factor for a c given control vector contribution. c o New, generic, for new routine ctrl_get_gen c c ================================================================== c SUBROUTINE ctrl_get_gen_rec c ================================================================== implicit none c == global variables == #include "EEPARAMS.h" #include "SIZE.h" #include "ctrl.h" #ifdef ALLOW_CAL # include "cal.h" #endif c == routine arguments == integer xx_genstartdate(4) _RL xx_genperiod _RL fac logical first logical changed integer count0 integer count1 _RL mytime integer myiter integer mythid c == local variables == #ifdef ALLOW_CAL integer mydate(4) integer previousdate(4) integer difftime(4) integer fldcount _RL fldsecs integer prevfldcount _RL prevfldsecs integer flddate(4) integer fldstartdate(4) _RL fldperiod logical lArgErr #ifdef ECCO_VERBOSE character*(max_len_mbuf) msgbuf #endif c == end of interface == lArgErr = .true. fldperiod = 0. c Map the field parameters. call CAL_COPYDATE( I xx_genstartdate, O fldstartdate, I mythid & ) fldperiod = xx_genperiod lArgErr = .false. c-- Check the field argument. if ( lArgErr ) then print*,' The subroutine *ctrl_get_gen_rec* has been called' print*,' with an illegal field specification.' stop ' ... stopped in ctrl_get_gen_rec.' endif c-- Determine the current date. call CAL_GETDATE( myiter, mytime, mydate, mythid ) c Determine the flux record just before mycurrentdate. call CAL_TIMEPASSED( fldstartdate, mydate, difftime, & mythid ) call CAL_TOSECONDS( difftime, fldsecs, mythid ) fldsecs = int((fldsecs+0.5)/fldperiod)*fldperiod fldcount = int((fldsecs+0.5)/fldperiod) + 1 c Set switches for reading new records. first = ((mytime - modelstart) .lt. 0.5*modelstep) if ( first) then changed = .false. else call CAL_GETDATE( myiter-1, mytime-modelstep, & previousdate, mythid ) call CAL_TIMEPASSED( fldstartdate, previousdate, & difftime, mythid ) call CAL_TOSECONDS( difftime, prevfldsecs, mythid ) prevfldsecs = int((prevfldsecs+0.5)/fldperiod)*fldperiod prevfldcount = int((prevfldsecs+0.5)/fldperiod) + 1 if (fldcount .ne. prevfldcount) then changed = .true. else changed = .false. endif endif count0 = fldcount count1 = fldcount + 1 call CAL_TIMEINTERVAL( fldsecs, 'secs', difftime, mythid ) call CAL_ADDTIME( fldstartdate, difftime, flddate, mythid ) call CAL_TIMEPASSED( flddate, mydate, difftime, mythid ) call CAL_TOSECONDS( difftime, fldsecs, mythid ) c Weight belonging to irec for linear interpolation purposes. c Note: The weight as chosen here is 1. - fac of the "old" c MITgcm's estimation program. fac = 1. - fldsecs/fldperiod #ifdef ECCO_VERBOSE c Do some printing for the protocol. _BEGIN_MASTER( mythid ) write(msgbuf,'(a)') ' ' call PRINT_MESSAGE( msgbuf, standardmessageunit, & SQUEEZE_RIGHT , mythid) write(msgbuf,'(a,2x,l2,2x,l2,2x,D15.8)') & ' first, changed, fac:', & first, changed, fac call PRINT_MESSAGE( msgbuf, standardmessageunit, & SQUEEZE_RIGHT , mythid) write(msgbuf,'(a,i4,i4)') & ' count0, count1:', & count0, count1 call PRINT_MESSAGE( msgbuf, standardmessageunit, & SQUEEZE_RIGHT , mythid) write(msgbuf,'(a)') ' ' call PRINT_MESSAGE( msgbuf, standardmessageunit, & SQUEEZE_RIGHT , mythid) _END_MASTER( mythid ) #endif #endif /* ALLOW_CAL */ return end