Skip to content

Commit 2afdc55

Browse files
committed
Added stopTime capabiity to alarms built on repeat clocks.
1 parent 681024d commit 2afdc55

File tree

2 files changed

+265
-2
lines changed

2 files changed

+265
-2
lines changed

src/Infrastructure/TimeMgr/src/ESMCI_Alarm.C

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -985,12 +985,25 @@ int Alarm::count=0;
985985
}
986986
}
987987
} else { // Check for ringing due to ringInterval
988-
988+
989+
// If stopTime enabled, then set up flags
990+
bool stopTimeEnabled=false;
991+
bool stopTimeGERingTime=false;
992+
if (stopTime.Time::validate("initialized") == ESMF_SUCCESS) {
993+
stopTimeEnabled=true;
994+
if (stopTime >= ringTime) stopTimeGERingTime=true;
995+
}
996+
989997
// Loop checking the set of times implied by the ringInterval
990998
bool wrapped=false;
991999
Time tmpRingTime=ringTime;
9921000
while (true) {
9931001

1002+
// Check for stopTime greater than or equal to ringTime
1003+
if (stopTimeEnabled && stopTimeGERingTime) {
1004+
if (tmpRingTime >= stopTime) break;
1005+
}
1006+
9941007
// Check for tmpRingTime ringing
9951008
if (currTime > prevTime) { // If currTime is after prevtime, then it needs to be within prevTime to currTime
9961009
if ((tmpRingTime > prevTime) && (tmpRingTime <= currTime)) {
@@ -1019,9 +1032,14 @@ int Alarm::count=0;
10191032
tmpRingTime = clock->startTime + (tmpRingTime-repeatTime);
10201033
wrapped=true;
10211034
}
1022-
1035+
10231036
// If we've wrapped and passed the original ringTime, then stop
10241037
if (wrapped && (tmpRingTime > ringTime)) break;
1038+
1039+
// Check for stopTime less than ringTime
1040+
if (wrapped && stopTimeEnabled && !stopTimeGERingTime) {
1041+
if (tmpRingTime >= stopTime) break;
1042+
}
10251043

10261044
}
10271045
}

src/Infrastructure/TimeMgr/tests/ESMF_AlarmUTest.F90

Lines changed: 245 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1902,6 +1902,251 @@ program ESMF_AlarmTest
19021902
call ESMF_Test(((rc.eq.ESMF_SUCCESS) .and. correct), &
19031903
name, failMsg, result, ESMF_SRCLINE)
19041904

1905+
1906+
1907+
! ----------------------------------------------------------------------------
1908+
1909+
!EX_UTest
1910+
write(failMsg, *) " Returned ESMF_FAILURE"
1911+
write(name, *) "Not sticky Alarm with ringInterval and stopTime with repeating clock test."
1912+
1913+
! Init correct
1914+
correct=.true.
1915+
rc=ESMF_SUCCESS
1916+
1917+
! Simple test of repeating within one hour
1918+
1919+
! Set start time
1920+
call ESMF_TimeSet(startTime, yy=2024, mm=3, dd=14, h=5, m=0, s=0, &
1921+
calendar=gregorianCalendar, rc=localrc)
1922+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
1923+
1924+
! Set timeStep to one minute
1925+
call ESMF_TimeIntervalSet(timeStep, m=14, rc=localrc)
1926+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
1927+
1928+
! Set repeat duration to one hour
1929+
call ESMF_TimeIntervalSet(repeatDuration, h=1, rc=localrc)
1930+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
1931+
1932+
! Create Clock
1933+
repeatClock = ESMF_ClockCreate(timeStep, startTime, &
1934+
repeatDuration=repeatDuration, rc=localrc)
1935+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
1936+
1937+
! Set ringTime
1938+
call ESMF_TimeSet(ringTime, yy=2024, mm=3, dd=14, h=5, m=11, s=0, &
1939+
calendar=gregorianCalendar, rc=localrc)
1940+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
1941+
1942+
! Set stopTime
1943+
call ESMF_TimeSet(stopTime, yy=2024, mm=3, dd=14, h=5, m=50, s=0, &
1944+
calendar=gregorianCalendar, rc=localrc)
1945+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
1946+
1947+
! Set alarm Interval
1948+
call ESMF_TimeIntervalSet(ringInterval, m=20, rc=localrc)
1949+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
1950+
1951+
! Create ringTime Alarm
1952+
alarm = ESMF_AlarmCreate(clock=repeatClock, ringTime=ringTime, &
1953+
ringInterval=ringInterval, stopTime=stopTime, sticky=.false., rc=localrc)
1954+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
1955+
1956+
! Advance clock to 5:14
1957+
call ESMF_ClockAdvance(repeatClock, rc=localrc)
1958+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
1959+
1960+
! Make sure ringing
1961+
if (.not. ESMF_AlarmIsRinging(alarm)) correct=.false.
1962+
1963+
! DEBUG OUTPUT
1964+
!write(*,*) "5:14 Is ringing=",ESMF_AlarmIsRinging(alarm,rc=localrc)
1965+
1966+
! Advance clock to 5:28
1967+
call ESMF_ClockAdvance(repeatClock, rc=localrc)
1968+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
1969+
1970+
! Make sure not ringing
1971+
if (ESMF_AlarmIsRinging(alarm)) correct=.false.
1972+
1973+
! DEBUG OUTPUT
1974+
!write(*,*) "5:28 Is ringing=",ESMF_AlarmIsRinging(alarm,rc=localrc)
1975+
1976+
! Advance clock to 5:42
1977+
call ESMF_ClockAdvance(repeatClock, rc=localrc)
1978+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
1979+
1980+
! Make sure is ringing
1981+
if (.not. ESMF_AlarmIsRinging(alarm)) correct=.false.
1982+
1983+
! DEBUG OUTPUT
1984+
!write(*,*) "5:42 Is ringing=",ESMF_AlarmIsRinging(alarm,rc=localrc)
1985+
1986+
! Advance clock to 5:56 (PAST stopTime)
1987+
call ESMF_ClockAdvance(repeatClock, rc=localrc)
1988+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
1989+
1990+
! Make sure is NOT ringing
1991+
if (ESMF_AlarmIsRinging(alarm)) correct=.false.
1992+
1993+
! DEBUG OUTPUT
1994+
!write(*,*) "5:56 Is ringing=",ESMF_AlarmIsRinging(alarm,rc=localrc)
1995+
1996+
! Advance clock to 5:10 (PAST stopTime)
1997+
call ESMF_ClockAdvance(repeatClock, rc=localrc)
1998+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
1999+
2000+
! Make sure is not ringing
2001+
if (ESMF_AlarmIsRinging(alarm)) correct=.false.
2002+
2003+
! DEBUG OUTPUT
2004+
!write(*,*) "5:10 Is ringing=",ESMF_AlarmIsRinging(alarm,rc=localrc)
2005+
2006+
! Advance clock to 5:24 (passing ringTime again...)
2007+
call ESMF_ClockAdvance(repeatClock, rc=localrc)
2008+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
2009+
2010+
! Make sure is ringing
2011+
if (.not. ESMF_AlarmIsRinging(alarm)) correct=.false.
2012+
2013+
! DEBUG OUTPUT
2014+
!write(*,*) "5:24 Is ringing=",ESMF_AlarmIsRinging(alarm,rc=localrc)
2015+
2016+
! Free Alarm
2017+
call ESMF_AlarmDestroy(alarm, rc=localrc)
2018+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
2019+
2020+
! Free Clock
2021+
call ESMF_ClockDestroy(repeatClock, rc=localrc)
2022+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
2023+
2024+
call ESMF_Test(((rc.eq.ESMF_SUCCESS) .and. correct), &
2025+
name, failMsg, result, ESMF_SRCLINE)
2026+
2027+
2028+
! ----------------------------------------------------------------------------
2029+
2030+
!EX_UTest
2031+
write(failMsg, *) " Returned ESMF_FAILURE"
2032+
write(name, *) "Not sticky Alarm with ringInterval and wrapped stopTime with repeating clock test."
2033+
2034+
! Init correct
2035+
correct=.true.
2036+
rc=ESMF_SUCCESS
2037+
2038+
! Simple test of repeating within one hour
2039+
2040+
! Set start time
2041+
call ESMF_TimeSet(startTime, yy=2024, mm=3, dd=14, h=5, m=0, s=0, &
2042+
calendar=gregorianCalendar, rc=localrc)
2043+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
2044+
2045+
! Set timeStep to one minute
2046+
call ESMF_TimeIntervalSet(timeStep, m=14, rc=localrc)
2047+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
2048+
2049+
! Set repeat duration to one hour
2050+
call ESMF_TimeIntervalSet(repeatDuration, h=1, rc=localrc)
2051+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
2052+
2053+
! Create Clock
2054+
repeatClock = ESMF_ClockCreate(timeStep, startTime, &
2055+
repeatDuration=repeatDuration, rc=localrc)
2056+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
2057+
2058+
! Set ringTime
2059+
call ESMF_TimeSet(ringTime, yy=2024, mm=3, dd=14, h=5, m=31, s=0, &
2060+
calendar=gregorianCalendar, rc=localrc)
2061+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
2062+
2063+
! Set stopTime
2064+
call ESMF_TimeSet(stopTime, yy=2024, mm=3, dd=14, h=5, m=10, s=0, &
2065+
calendar=gregorianCalendar, rc=localrc)
2066+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
2067+
2068+
! Set alarm Interval
2069+
call ESMF_TimeIntervalSet(ringInterval, m=20, rc=localrc)
2070+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
2071+
2072+
! Create ringTime Alarm
2073+
alarm = ESMF_AlarmCreate(clock=repeatClock, ringTime=ringTime, &
2074+
ringInterval=ringInterval, stopTime=stopTime, sticky=.false., rc=localrc)
2075+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
2076+
2077+
! Advance clock to 5:14
2078+
call ESMF_ClockAdvance(repeatClock, rc=localrc)
2079+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
2080+
2081+
! Make sure NOT ringing (it's not in 5:31 - 5:10)
2082+
if (ESMF_AlarmIsRinging(alarm)) correct=.false.
2083+
2084+
! DEBUG OUTPUT
2085+
!write(*,*) "5:14 Is ringing=",ESMF_AlarmIsRinging(alarm,rc=localrc)
2086+
2087+
! Advance clock to 5:28
2088+
call ESMF_ClockAdvance(repeatClock, rc=localrc)
2089+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
2090+
2091+
! Make sure NOT ringing (it's not in 5:31 - 5:10)
2092+
if (ESMF_AlarmIsRinging(alarm)) correct=.false.
2093+
2094+
! DEBUG OUTPUT
2095+
!write(*,*) "5:28 Is ringing=",ESMF_AlarmIsRinging(alarm,rc=localrc)
2096+
2097+
! Advance clock to 5:42
2098+
call ESMF_ClockAdvance(repeatClock, rc=localrc)
2099+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
2100+
2101+
! Make sure is ringing
2102+
if (.not. ESMF_AlarmIsRinging(alarm)) correct=.false.
2103+
2104+
! DEBUG OUTPUT
2105+
!write(*,*) "5:42 Is ringing=",ESMF_AlarmIsRinging(alarm,rc=localrc)
2106+
2107+
! Advance clock to 5:56
2108+
call ESMF_ClockAdvance(repeatClock, rc=localrc)
2109+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
2110+
2111+
! Make sure is ringing
2112+
if (.not. ESMF_AlarmIsRinging(alarm)) correct=.false.
2113+
2114+
! DEBUG OUTPUT
2115+
!write(*,*) "5:56 Is ringing=",ESMF_AlarmIsRinging(alarm,rc=localrc)
2116+
2117+
! Advance clock to 5:10
2118+
call ESMF_ClockAdvance(repeatClock, rc=localrc)
2119+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
2120+
2121+
! Make sure is not ringing
2122+
if (ESMF_AlarmIsRinging(alarm)) correct=.false.
2123+
2124+
! DEBUG OUTPUT
2125+
!write(*,*) "5:10 Is ringing=",ESMF_AlarmIsRinging(alarm,rc=localrc)
2126+
2127+
! Advance clock to 5:24
2128+
call ESMF_ClockAdvance(repeatClock, rc=localrc)
2129+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
2130+
2131+
! Make sure NOT ringing (it's not in 5:31 - 5:10)
2132+
if (ESMF_AlarmIsRinging(alarm)) correct=.false.
2133+
2134+
! DEBUG OUTPUT
2135+
!write(*,*) "5:24 Is ringing=",ESMF_AlarmIsRinging(alarm,rc=localrc)
2136+
2137+
! Free Alarm
2138+
call ESMF_AlarmDestroy(alarm, rc=localrc)
2139+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
2140+
2141+
! Free Clock
2142+
call ESMF_ClockDestroy(repeatClock, rc=localrc)
2143+
if (localrc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
2144+
2145+
call ESMF_Test(((rc.eq.ESMF_SUCCESS) .and. correct), &
2146+
name, failMsg, result, ESMF_SRCLINE)
2147+
2148+
2149+
19052150
! ----------------------------------------------------------------------------
19062151

19072152
!EX_UTest

0 commit comments

Comments
 (0)