diff --git a/src/trigger.f90 b/src/trigger.f90 index 910fd0e313aa62e6dfa9fe9c516f2b01e4afd760..7a405b05f180b96da304c61077a53e981579ce07 100644 --- a/src/trigger.f90 +++ b/src/trigger.f90 @@ -1,3 +1,5 @@ +!> TODO: we need undefs for a lot of datatypes + FUNCTION triggerEvent(this, current_dt, plus_slack, minus_slack) RESULT(res) CLASS(t_event) :: this TYPE(t_datetime), INTENT(in) :: current_dt @@ -344,156 +346,98 @@ FUNCTION getEventFirstTriggerDateTime(start_dt, timestep, offset, ref_dt) RESULT END FUNCTION getEventFirstTriggerDateTime -function getTriggerNextEventAtDateTime(e, current_dt) result(dt_return) - type(t_datetime) :: dt_return - type(t_event), intent(in) :: e - type(t_datetime), intent(in) :: current_dt +FUNCTION getTriggerNextEventAtDateTime(e, current_dt) RESULT(dt_return) + TYPE(t_datetime) :: dt_return + TYPE(t_event), INTENT(in) :: e + TYPE(t_datetime), INTENT(in) :: current_dt - type(t_timedelta) :: modulo_td + TYPE(t_timedelta) :: modulo_td - if (e%eventLastDateTime && (compareDatetime(current_dt,e%eventLastDateTime) == greater_than)) - return NULL + IF (e%eventLastDateTime .and. (current_dt > e%eventLastDateTime)) then + RETURN + ENDIF - if (e%nextEventIsFirst) .and. (current_dt > e%triggerNextEventDateTime)) then - struct _timedelta* modulo_td = newTimeDelta("PT00.000S") - // Get the first trigger time and return (WARNING: Do not update e%triggerNextEventDateTime here!). - moduloTimeDeltaFromDateTime(e%triggerNextEventDateTime, e%eventInterval, current_dt, modulo_td) - addTimeDeltaToDateTime(current_dt,modulo_td,dt_return) - // Cleanup. - deallocateTimeDelta(modulo_td) - return dt_return - } - // else ... - dt_return = replaceDatetime(e%triggerNextEventDateTime, dt_return) - return dt_return - -end function getTriggerNextEventAtDateTime + IF (e%nextEventIsFirst .AND. (current_dt > e%triggerNextEventDateTime)) THEN + moduloTimeDeltaFromDateTime(e%triggerNextEventDateTime, e%eventInterval, current_dt, modulo_td) + dt_return = current_dt + modulo_td + ELSE + dt_return = e%triggerNextEventDateTime + ENDIF + +END FUNCTION getTriggerNextEventAtDateTime -! /** -! * @brief Get the Datetime when 'this' event was triggered last. -! * -! * @param e -! * A pointer to struct _event. This is the event being queried. -! * -! * @param dt_return -! * A pointer to struct _datetime. The last trigger datetime is copied here. -! * -! * @return dt_return -! * A pointer to DT with previous-trigger datetime. -! */ -! /* NOTE: If the event was never tiggered, default value of 0-01-01T00:00:00.000 is returned. */ -! struct _datetime* -! getTriggeredPreviousEventAtDateTime(struct _event* e, struct _datetime* dt_return) -! { -! if ((e /= NULL )&& (dt_return /= NULL) ) -! { ! /* No trigger ever happened? */ ! if (e%nextEventIsFirst) ! return NULL +FUNCTION getTriggeredPreviousEventAtDateTime(e) result(dt_return) + type(t_datetime) :: dt_return + type(t_event) :: e + + dt_return = e%triggeredPreviousEventDateTime +end FUNCTION getTriggeredPreviousEventAtDateTime -! replaceDatetime(e%triggeredPreviousEventDateTime, dt_return) -! return dt_return -! } -! else -! return NULL -! } - - -! struct _datetime* -! getEventReferenceDateTime(struct _event* e) -! { -! if (e /= NULL) -! return e%eventReferenceDateTime -! else -! return NULL -! } - -! struct _datetime* -! getEventFirstDateTime(struct _event* e) -! { -! if (e /= NULL) -! return e%eventFirstDateTime -! else -! return NULL -! } - -! struct _datetime* -! getEventLastDateTime(struct _event* e) -! { -! if (e /= NULL) -! return e%eventLastDateTime -! else -! return NULL -! } - -! struct _timedelta* -! getEventInterval(struct _event* e) -! { -! if (e /= NULL) -! return e%eventInterval -! else -! return NULL -! } - -! bool -! getNextEventIsFirst(struct _event* e) -! { -! if (e /= NULL) -! return e%nextEventIsFirst -! else -! return false -! } - -! bool -! getEventisFirstInDay(struct _event* e) -! { -! if (e /= NULL) -! return e%eventisFirstInDay -! else -! return false -! } - -! bool -! getEventisFirstInMonth(struct _event* e) -! { -! if (e /= NULL) -! return e%eventisFirstInMonth -! else -! return false -! } - -! bool -! getEventisFirstInYear(struct _event* e) -! { -! if (e /= NULL) -! return e%eventisFirstInYear -! else -! return false -! } - -! bool -! getEventisLastInDay(struct _event* e) -! { -! if (e /= NULL) -! return e%eventisLastInDay -! else -! return false -! } - -! bool -! getEventisLastInMonth(struct _event* e) -! { -! if (e /= NULL) -! return e%eventisLastInMonth -! else -! return false -! } - -! bool -! getEventisLastInYear(struct _event* e) -! { -! if (e /= NULL) -! return e%eventisLastInYear -! else -! return false -! } +function getEventReferenceDateTime(e) result(dt_return) + type(t_datetime) :: dt_return + type(t_event) :: e + dt_return ? e%eventReferenceDateTime +end function getEventReferenceDateTime + +function getEventFirstDateTime(e) result(dt_return) + type(t_datetime) :: dt_return + type(t_event) :: e + dt_return = e%eventFirstDateTime +end function getEventFirstDateTime + +function getEventLastDateTime(e) result(dt_return) + type(t_datetime) :: dt_return + type(t_event) :: e + dt_return = e%eventLastDateTime +end function getEventLastDateTime + +function getEventInterval(e) result(td_return) + type(t_timedelta) :: td_return + type(t_event) :: e + dt_return = e%eventInterval +end function getEventInterval + +function getNextEventIsFirst(e) result(is) + logical :: is + type(t_event) :: e + is = e%nextEventIsFirst +end function getNextEventIsFirst + +function getEventisFirstInDay(e) result(is) + logical :: is + type(t_event) :: e + is = e%eventisFirstInDay +end function getEventisFirstInDay + +function getEventisFirstInMonth(e) result(is) + logical :: is + type(t_event) :: e + is = e%eventisFirstInMonth +end function getEventisFirstInMonth + +function getEventisFirstInYear(e) result(is) + logical :: is + type(t_event) :: e + is = e%eventisFirstInYear +end function getEventisFirstInYear + +function getEventisLastInDay(e) result(is) + logical :: is + type(t_event) :: e + is = e%eventisLastInDay +end function getEventisLastInDay + +function getEventisLastInMonth(e) result(is) + logical :: is + type(t_event) :: e + is = e%eventisLastInMonth +end function getEventisLastInMonth + +function getEventisLastInYear(e) result(is) + logical :: is + type(t_event) :: e + is = e%eventisLastInYear +end function getEventisLastInYear