!=============================================================================== ! SVN $Id: shr_alarm_mod.F90 6752 2007-10-04 21:02:15Z jwolfe $ ! SVN $URL: https://svn-ccsm-models.cgd.ucar.edu/csm_share/branch_tags/cesm1_0_rel_tags/cesm1_0_rel01_share3_100616/shr/shr_alarm_mod.F90 $ !=============================================================================== !BOP =========================================================================== ! ! !MODULE: shr_alarm_mod -- date/time module, built upon calendar module ! ! !DESCRIPTION: ! Keeps track of model date, including elapsed seconds in current date. ! ! !REVISION HISTORY: ! 2002-Sep-17 - B. Kauffman - created initial version ! ! !REMARKS: ! This module is independant of a particular calendar, e.g. is ignorant of ! whether the underlying calendar does or doesn't implement leap years. ! ! !INTERFACE: ------------------------------------------------------------------ module shr_alarm_mod,6 ! !USES: use shr_cal_mod ! underlying calendar module use shr_date_mod ! underlying date module use shr_sys_mod ! system call wrappers use shr_kind_mod ! kinds use shr_log_mod, only: s_loglev => shr_log_Level use shr_log_mod, only: s_logunit => shr_log_Unit implicit none private ! except ! !PUBLIC TYPES: public :: shr_alarm type shr_alarm private sequence integer(SHR_KIND_IN) :: type ! type of alarm integer(SHR_KIND_IN) :: n ! n wrt nDays or nMonths type(shr_date) :: oDate ! offset date logical :: isOn ! true iff alarm is on end type shr_alarm ! !PUBLIC MEMBER FUNCTIONS: public :: shr_alarm_isOn ! returns true iff alarm is on public :: shr_alarm_set ! turn alarm on or off public :: shr_alarm_getType ! returns alarm type public :: shr_alarm_initDate ! initialize/return an alarm public :: shr_alarm_initMonthly ! initialize/return an alarm public :: shr_alarm_initYearly ! initialize/return an alarm public :: shr_alarm_initNDays ! initialize/return an alarm public :: shr_alarm_initNMonths ! initialize/return an alarm public :: shr_alarm_initNStep ! initialize/return an alarm public :: shr_alarm_initifsec ! initialize/return an alarm public :: shr_alarm_initifdays0 ! initialize/return an alarm public :: shr_alarm_initifday ! initialize/return an alarm public :: shr_alarm_initifmon ! initialize/return an alarm public :: shr_alarm_initifyear ! initialize/return an alarm public :: shr_alarm_initNone ! initialize/return an alarm public :: shr_alarm_dump ! dump alarm internals for debugging ! !PUBLIC DATA MEMBERS: integer(SHR_KIND_IN),parameter,public :: shr_alarm_date = 1 ! goes on on given date integer(SHR_KIND_IN),parameter,public :: shr_alarm_monthly = 2 ! goes on start of month integer(SHR_KIND_IN),parameter,public :: shr_alarm_yearly = 3 ! goes on start of year integer(SHR_KIND_IN),parameter,public :: shr_alarm_nDays = 4 ! periodic alarm integer(SHR_KIND_IN),parameter,public :: shr_alarm_nMonths = 5 ! periodic alarm integer(SHR_KIND_IN),parameter,public :: shr_alarm_nStep = 6 ! periodic alarm integer(SHR_KIND_IN),parameter,public :: shr_alarm_ifsec = 7 ! goes on sec value integer(SHR_KIND_IN),parameter,public :: shr_alarm_ifdays0 = 8 ! goes on day value integer(SHR_KIND_IN),parameter,public :: shr_alarm_ifday = 9 ! goes on day value integer(SHR_KIND_IN),parameter,public :: shr_alarm_ifmon = 10 ! goes on month value integer(SHR_KIND_IN),parameter,public :: shr_alarm_ifyear = 11 ! goes on year value integer(SHR_KIND_IN),parameter,public :: shr_alarm_none = 1 ! goes on on given date !EOP !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ contains !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_alarm_isOn - returns true iff alarm is on. ! ! !DESCRIPTION: ! turns alarm on (when appropriate) and returns true iff alarm is on. ! ! !REVISION HISTORY: ! 2002-Sep-17 - B. Kauffman - initial version. ! ! !INTERFACE: ----------------------------------------------------------------- logical function shr_alarm_isOn(date,alarm),15 implicit none ! !INPUT/OUTPUT PARAMETERS: type(shr_date ),intent(in) :: date ! date type(shr_alarm),intent(inout) :: alarm ! alarm !EOP !----- local ----- integer(SHR_KIND_IN) :: y, m, d, s ! input date's year,month,day,sec integer(SHR_KIND_IN) :: oy,om,od,os ! offset date's year,month,day,sec integer(SHR_KIND_IN) :: eDay ! input date's eDay integer(SHR_KIND_IN) :: SPDay ! input date's Steps Per Day integer(SHR_KIND_IN) :: SIDay ! input date's Step In Day integer(SHR_KIND_IN) :: oEDay ! offset date's eDay !----- formats ----- character(len=*),parameter :: F01 = "('(shr_alarm_isOn) ',a,i8)" !------------------------------------------------------------------------------- ! !------------------------------------------------------------------------------- shr_alarm_isOn = .false. call shr_date_getYMD(date,y ,m ,d ,s ) if ( alarm%isOn) then !--- alarm stays on until shr_alarm_set is called --- shr_alarm_isOn = .true. else if (alarm%type == shr_alarm_date ) then if (s == 0) then call shr_date_getYMD(alarm%oDate,oy,om,od,os) if (y==oy .and. m==om .and. d==od) shr_alarm_isOn = .true. endif else if (alarm%type == shr_alarm_monthly ) then if (s == 0) then if (d == 1) shr_alarm_isOn = .true. endif else if (alarm%type == shr_alarm_yearly ) then if (s == 0) then if (m==1 .and. d == 1) shr_alarm_isOn = .true. endif else if (alarm%type == shr_alarm_nDays ) then if (s == 0) then call shr_date_getEday( date, eDay , s) call shr_date_getEday(alarm%oDate,oEDay,os) if ( mod((eDay-oEDay),alarm%n) == 0 ) shr_alarm_isOn = .true. endif else if (alarm%type == shr_alarm_nMonths ) then if (s == 0) then call shr_date_getYMD(alarm%oDate,oy,om,od,os) if ( mod(((12*y+m)-(12*oy+om)),alarm%n) == 0 ) then !--- it's the right month, is it the right day? --- od = min(od,shr_cal_numDaysInMonth(y,m)) if ( d == od ) shr_alarm_isOn = .true. end if endif else if (alarm%type == shr_alarm_nStep ) then call shr_date_getEday ( date, eDay , s) SPDay = shr_date_getStepsPerDay( date ) SIDay = shr_date_getStepInDay ( date ) if ( mod((eDay*SPDay + SIDay),alarm%n) == 0) then shr_alarm_isOn = .true. endif else if (alarm%type == shr_alarm_ifsec ) then call shr_date_getYMD(date,oy,om,od,os) if (os == alarm%n) shr_alarm_isOn = .true. else if (alarm%type == shr_alarm_ifdays0 ) then if (s == 0) then call shr_date_getYMD(date,oy,om,od,os) if (od == alarm%n) shr_alarm_isOn = .true. endif else if (alarm%type == shr_alarm_ifday ) then call shr_date_getYMD(date,oy,om,od,os) if (od == alarm%n) shr_alarm_isOn = .true. else if (alarm%type == shr_alarm_ifmon ) then call shr_date_getYMD(date,oy,om,od,os) if (om == alarm%n) shr_alarm_isOn = .true. else if (alarm%type == shr_alarm_ifyear ) then call shr_date_getYMD(date,oy,om,od,os) if (oy == alarm%n) shr_alarm_isOn = .true. else if (alarm%type == shr_alarm_none ) then !--- do nothing --- else write(s_logunit,F01) "ERROR: unrecognized alarm type = ",alarm%type call shr_sys_abort("(shr_alarm_isOn)") end if end if end function shr_alarm_isOn !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_alarm_set - turn alarm on or off ! ! !DESCRIPTION: ! Turns alarm on or off. ! ! !REVISION HISTORY: ! 2002-Sep-17 - B. Kauffman - initial version. ! ! !INTERFACE: ----------------------------------------------------------------- subroutine shr_alarm_set(alarm,isOn) implicit none ! !INPUT/OUTPUT PARAMETERS: type(shr_alarm),intent(inout) :: alarm ! alarm logical ,intent(in) :: isOn !EOP !------------------------------------------------------------------------------- ! !------------------------------------------------------------------------------- alarm%isOn = isOn end subroutine shr_alarm_set !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_alarm_getType - return alarm type ! ! !DESCRIPTION: ! Return alarm type. ! ! !REVISION HISTORY: ! 2002-Sep-17 - B. Kauffman - initial version. ! ! !INTERFACE: ----------------------------------------------------------------- integer function shr_alarm_getType(alarm) implicit none ! !INPUT/OUTPUT PARAMETERS: type(shr_alarm),intent(inout) :: alarm ! alarm !EOP !------------------------------------------------------------------------------- ! !------------------------------------------------------------------------------- shr_alarm_getType = alarm%type end function shr_alarm_getType !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_alarm_initDate(date) -- initialize an alarm ! ! !DESCRIPTION: ! Initialize an alarm. ! ! !REVISION HISTORY: ! 2002-Sep-17 - B. Kauffman - initial version. ! ! !INTERFACE: ----------------------------------------------------------------- function shr_alarm_initDate(date) implicit none ! !INPUT/OUTPUT PARAMETERS: type(shr_date ),intent(in) :: date type(shr_alarm) :: shr_alarm_initDate !EOP !----- local ----- type(shr_alarm) :: alarm !----- formats ----- character(len=*),parameter :: F00 = "('(shr_alarm_initDate) ',8a)" !------------------------------------------------------------------------------- ! !------------------------------------------------------------------------------- alarm%type = shr_alarm_date alarm%n = -999 ! is irrelavant for this option alarm%oDate = date alarm%isOn = .false. shr_alarm_initDate = alarm end function shr_alarm_initDate !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_alarm_initMonthly(n) -- initialize an alarm ! ! !DESCRIPTION: ! Initialize an alarm: goes off every n days relative to the given date. ! ! !REVISION HISTORY: ! 2002-Sep-17 - B. Kauffman - initial version. ! ! !INTERFACE: ----------------------------------------------------------------- function shr_alarm_initMonthly(),1 implicit none ! !INPUT/OUTPUT PARAMETERS: type(shr_alarm) :: shr_alarm_initMonthly !EOP !----- local ----- type(shr_alarm) :: alarm !----- formats ----- character(len=*),parameter :: F00 = "('(shr_alarm_initMonthly) ',8a)" !------------------------------------------------------------------------------- ! !------------------------------------------------------------------------------- alarm%type = shr_alarm_monthly alarm%n = -999 ! is irrelavant for this option alarm%oDate = shr_date_initYMD(0,1,1,0) ! is irrelavant for this option alarm%isOn = .false. shr_alarm_initMonthly = alarm end function shr_alarm_initMonthly !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_alarm_initYearly(n) -- initialize an alarm ! ! !DESCRIPTION: ! Initialize an alarm: goes off every n days relative to the given date. ! ! !REVISION HISTORY: ! 2002-Sep-17 - B. Kauffman - initial version. ! ! !INTERFACE: ----------------------------------------------------------------- function shr_alarm_initYearly(),1 implicit none ! !INPUT/OUTPUT PARAMETERS: type(shr_alarm) :: shr_alarm_initYearly !EOP !----- local ----- type(shr_alarm) :: alarm !----- formats ----- character(len=*),parameter :: F00 = "('(shr_alarm_initYearly) ',8a)" !------------------------------------------------------------------------------- ! !------------------------------------------------------------------------------- alarm%type = shr_alarm_yearly alarm%n = -999 ! is irrelavant for this option alarm%oDate = shr_date_initYMD(0,1,1,0) ! is irrelavant for this option alarm%isOn = .false. shr_alarm_initYearly = alarm end function shr_alarm_initYearly !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_alarm_initNDays(n) -- initialize an alarm ! ! !DESCRIPTION: ! Initialize an alarm: goes off every n days relative to the given date. ! ! !REVISION HISTORY: ! 2002-Sep-17 - B. Kauffman - initial version. ! ! !INTERFACE: ----------------------------------------------------------------- function shr_alarm_initNDays(n,date) implicit none ! !INPUT/OUTPUT PARAMETERS: integer(SHR_KIND_IN),intent(in) :: n type(shr_date),intent(in) :: date type(shr_alarm) :: shr_alarm_initNDays !EOP !----- local ----- type(shr_alarm) :: alarm !----- formats ----- character(len=*),parameter :: F00 = "('(shr_alarm_initNDays) ',8a)" !------------------------------------------------------------------------------- ! !------------------------------------------------------------------------------- alarm%type = shr_alarm_nDays alarm%n = n alarm%oDate = date alarm%isOn = .false. shr_alarm_initNDays = alarm end function shr_alarm_initNDays !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_alarm_initNMonths(n) -- initialize an alarm ! ! !DESCRIPTION: ! Initialize an alarm: goes off every n months relative to the given date. ! ! !REVISION HISTORY: ! 2002-Sep-17 - B. Kauffman - initial version. ! ! !INTERFACE: ----------------------------------------------------------------- function shr_alarm_initNMonths(n,date) implicit none ! !INPUT/OUTPUT PARAMETERS: integer(SHR_KIND_IN),intent(in) :: n type(shr_date),intent(in) :: date type(shr_alarm) :: shr_alarm_initNMonths !EOP !----- local ----- type(shr_alarm) :: alarm !----- formats ----- character(len=*),parameter :: F00 = "('(shr_alarm_initNMonths) ',8a)" !------------------------------------------------------------------------------- ! !------------------------------------------------------------------------------- alarm%type = shr_alarm_nMonths alarm%n = n alarm%oDate = date alarm%isOn = .false. shr_alarm_initNMonths = alarm end function shr_alarm_initNMonths !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_alarm_initNStep(n) -- initialize an alarm ! ! !DESCRIPTION: ! Initialize an alarm: goes off every n steps relative to the given step 0. ! ! !REVISION HISTORY: ! 2002-Nov-17 - T. Craig - initial version. ! ! !INTERFACE: ----------------------------------------------------------------- function shr_alarm_initNStep(n),1 implicit none ! !INPUT/OUTPUT PARAMETERS: integer(SHR_KIND_IN),intent(in) :: n type(shr_alarm) :: shr_alarm_initNStep !EOP !----- local ----- type(shr_alarm) :: alarm !----- formats ----- character(len=*),parameter :: F00 = "('(shr_alarm_initNStep) ',8a)" !------------------------------------------------------------------------------- ! !------------------------------------------------------------------------------- alarm%type = shr_alarm_NStep alarm%n = n alarm%oDate = shr_date_initYMD(0,1,1,0) ! is irrelavant for this option alarm%isOn = .false. shr_alarm_initNStep = alarm end function shr_alarm_initNStep !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_alarm_initifsec(n) -- initialize an alarm ! ! !DESCRIPTION: ! Initialize an alarm: goes off when sec is equal to n ! ! !REVISION HISTORY: ! 2002-Nov-26 - T. Craig - initial version. ! ! !INTERFACE: ----------------------------------------------------------------- function shr_alarm_initifsec(n),1 implicit none ! !INPUT/OUTPUT PARAMETERS: integer(SHR_KIND_IN),intent(in) :: n type(shr_alarm) :: shr_alarm_initifsec !EOP !----- local ----- type(shr_alarm) :: alarm !----- formats ----- character(len=*),parameter :: F00 = "('(shr_alarm_initifsec) ',8a)" !------------------------------------------------------------------------------- ! !------------------------------------------------------------------------------- alarm%type = shr_alarm_ifsec alarm%n = n alarm%oDate = shr_date_initYMD(0,1,1,0) ! is irrelavant for this option alarm%isOn = .false. shr_alarm_initifsec = alarm end function shr_alarm_initifsec !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_alarm_initifdays0(n) -- initialize an alarm ! ! !DESCRIPTION: ! Initialize an alarm: goes off when day is equal to n and second is zero ! ! !REVISION HISTORY: ! 2003-Jun-15 - T. Craig - initial version. ! ! !INTERFACE: ----------------------------------------------------------------- function shr_alarm_initifdays0(n),1 implicit none ! !INPUT/OUTPUT PARAMETERS: integer(SHR_KIND_IN),intent(in) :: n type(shr_alarm) :: shr_alarm_initifdays0 !EOP !----- local ----- type(shr_alarm) :: alarm !----- formats ----- character(len=*),parameter :: F00 = "('(shr_alarm_initifdays0) ',8a)" !------------------------------------------------------------------------------- ! !------------------------------------------------------------------------------- alarm%type = shr_alarm_ifdays0 alarm%n = n alarm%oDate = shr_date_initYMD(0,1,1,0) ! is irrelavant for this option alarm%isOn = .false. shr_alarm_initifdays0 = alarm end function shr_alarm_initifdays0 !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_alarm_initifday(n) -- initialize an alarm ! ! !DESCRIPTION: ! Initialize an alarm: goes off when day is equal to n ! ! !REVISION HISTORY: ! 2002-Nov-26 - T. Craig - initial version. ! ! !INTERFACE: ----------------------------------------------------------------- function shr_alarm_initifday(n),1 implicit none ! !INPUT/OUTPUT PARAMETERS: integer(SHR_KIND_IN),intent(in) :: n type(shr_alarm) :: shr_alarm_initifday !EOP !----- local ----- type(shr_alarm) :: alarm !----- formats ----- character(len=*),parameter :: F00 = "('(shr_alarm_initifday) ',8a)" !------------------------------------------------------------------------------- ! !------------------------------------------------------------------------------- alarm%type = shr_alarm_ifday alarm%n = n alarm%oDate = shr_date_initYMD(0,1,1,0) ! is irrelavant for this option alarm%isOn = .false. shr_alarm_initifday = alarm end function shr_alarm_initifday !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_alarm_initifmon(n) -- initialize an alarm ! ! !DESCRIPTION: ! Initialize an alarm: goes off when month is equal to n ! ! !REVISION HISTORY: ! 2002-Nov-26 - T. Craig - initial version. ! ! !INTERFACE: ----------------------------------------------------------------- function shr_alarm_initifmon(n),1 implicit none ! !INPUT/OUTPUT PARAMETERS: integer(SHR_KIND_IN),intent(in) :: n type(shr_alarm) :: shr_alarm_initifmon !EOP !----- local ----- type(shr_alarm) :: alarm !----- formats ----- character(len=*),parameter :: F00 = "('(shr_alarm_initifmon) ',8a)" !------------------------------------------------------------------------------- ! !------------------------------------------------------------------------------- alarm%type = shr_alarm_ifmon alarm%n = n alarm%oDate = shr_date_initYMD(0,1,1,0) ! is irrelavant for this option alarm%isOn = .false. shr_alarm_initifmon = alarm end function shr_alarm_initifmon !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_alarm_initifyear(n) -- initialize an alarm ! ! !DESCRIPTION: ! Initialize an alarm: goes off when year is equal to n ! ! !REVISION HISTORY: ! 2002-Nov-26 - T. Craig - initial version. ! ! !INTERFACE: ----------------------------------------------------------------- function shr_alarm_initifyear(n),1 implicit none ! !INPUT/OUTPUT PARAMETERS: integer(SHR_KIND_IN),intent(in) :: n type(shr_alarm) :: shr_alarm_initifyear !EOP !----- local ----- type(shr_alarm) :: alarm !----- formats ----- character(len=*),parameter :: F00 = "('(shr_alarm_initifyear) ',8a)" !------------------------------------------------------------------------------- ! !------------------------------------------------------------------------------- alarm%type = shr_alarm_ifyear alarm%n = n alarm%oDate = shr_date_initYMD(0,1,1,0) ! is irrelavant for this option alarm%isOn = .false. shr_alarm_initifyear = alarm end function shr_alarm_initifyear !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_alarm_initNone() -- initialize an alarm ! ! !DESCRIPTION: ! Initialize an alarm. ! ! !REVISION HISTORY: ! 2002-Sep-17 - B. Kauffman - initial version. ! ! !INTERFACE: ----------------------------------------------------------------- function shr_alarm_initNone(),1 implicit none ! !INPUT/OUTPUT PARAMETERS: type(shr_alarm) :: shr_alarm_initNone !EOP !----- local ----- type(shr_alarm) :: alarm !----- formats ----- character(len=*),parameter :: F00 = "('(shr_alarm_initNone) ',8a)" !------------------------------------------------------------------------------- ! !------------------------------------------------------------------------------- alarm%type = shr_alarm_none alarm%n = -999 ! is irrelavant for this option alarm%oDate = shr_date_initYMD(0,1,1,0) ! is irrelavant for this option alarm%isOn = .false. shr_alarm_initNone = alarm end function shr_alarm_initNone !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_alarm_dump -- dump alarm's internal data ! ! !DESCRIPTION: ! Dump dump alarm's internal data for debugging. ! ! !REVISION HISTORY: ! 2003-Jan-06 - B. Kauffman - initial version. ! ! !INTERFACE: ----------------------------------------------------------------- subroutine shr_alarm_dump(a),1 implicit none ! !INPUT/OUTPUT PARAMETERS: type(shr_alarm) :: a ! alarm in question !EOP !----- local ----- integer(SHR_KIND_IN) :: cDate ! coded date integer(SHR_KIND_IN) :: sec ! seconds on date !----- formats ----- character(len=*),parameter :: F00 = "('(shr_alarm_dump) ',8a)" character(len=*),parameter :: F01 = "('(shr_alarm_dump) ',a,i8)" character(len=*),parameter :: F02 = "('(shr_alarm_dump) ',a,i8.4,i6,'sec')" character(len=*),parameter :: F03 = "('(shr_alarm_dump) ',a,l7)" !------------------------------------------------------------------------------- ! !------------------------------------------------------------------------------- call shr_date_getCDate(a%oDate,cDate,sec) if (s_loglev > 0) then write(s_logunit,F00) "dump alarm internal data..." write(s_logunit,F01) "* type = ", a%type ! type of alarm write(s_logunit,F01) "* n = ", a%n ! n wrt nDays or nMonths write(s_logunit,F02) "* oDate = ", cDate,sec ! offset date write(s_logunit,F03) "* isOn = ", a%isOn ! true iff alarm is on endif end subroutine shr_alarm_dump !=============================================================================== !=============================================================================== end module shr_alarm_mod