diff --git a/examples/test_dace_hl.f90 b/examples/test_dace_hl.f90 index 0de42d7462296d4c4b610e726f5c5af4856d7ebe..bd46c9e89077727a1fddd19b865192f10a541b33 100644 --- a/examples/test_dace_hl.f90 +++ b/examples/test_dace_hl.f90 @@ -1,30 +1,31 @@ -program test_mtime +PROGRAM test_mtime USE mtime_hl - call setCalendar(proleptic_gregorian) - call test1 () - call test2 () -contains - subroutine test1 () - TYPE(t_timedelta) :: dt, t0, t1, t2, t3 + CALL setCalendar(proleptic_gregorian) + CALL test1 () + CALL test2 () + +CONTAINS + SUBROUTINE test1 () + TYPE(t_timedelta) :: dt, t0, t1, t2, t3 + WRITE (0,*) "test1:" dt = t_timedelta("PT24.000S") t0 = t_timedelta("PT3600.000S") - t1 = t_timedelta("PT3600.000S") - t2 = t_timedelta("PT60M") - t3 = t_timedelta("PT1H") - t1 = t1 + dt - t2 = t2 + dt - t3 = t3 + dt + t1 = t_timedelta("PT3600.000S") + dt + t2 = t_timedelta("PT60M") + dt + t3 = t_timedelta("PT1H") + dt + WRITE(0,*) " t0 : ", t0%toString(), "Reference" WRITE(0,*) " dt : ", dt%toString(), "Modification" WRITE(0,*) " t1 : ", t1%toString(), "???" WRITE(0,*) " t2 : ", t2%toString(), "OK" WRITE(0,*) " t3 : ", t3%toString(), "OK" - end subroutine test1 + END SUBROUTINE test1 + !- - subroutine test2 () + SUBROUTINE test2 () TYPE(t_event) :: mec_Event TYPE(t_datetime) :: mec_RefDate TYPE(t_datetime) :: mec_StartDate @@ -33,24 +34,20 @@ contains TYPE(t_timedelta) :: mec_Stop TYPE(t_timedelta) :: mec_Interval TYPE(t_timedelta) :: time_step - type(t_eventGroup) :: mec_Events - integer :: ierr - logical :: lret + TYPE(t_eventGroup) :: mec_Events TYPE(t_datetime) :: mtime - integer :: i - + INTEGER :: i + mec_Start = t_timeDelta("PT0S") mec_Stop = t_timeDelta("PT3600S") mec_Interval = t_timeDelta("PT300S") - + time_step = t_timeDelta("PT24S") - + mec_RefDate = t_datetime ("2016-05-29T00:00:00.000") - mec_StartDate = mec_RefDate - mec_EndDate = mec_RefDate - mec_StartDate = mec_StartDate + mec_Start - mec_EndDate = mec_EndDate + mec_Stop - + mec_StartDate = mec_RefDate + mec_Start + mec_EndDate = mec_RefDate + mec_Stop + WRITE (0,*) WRITE (0,*) "test2:" WRITE (0,*) "Model time step : ", time_step%toString() @@ -62,27 +59,26 @@ contains WRITE (0,*) "MEC end date : ", mec_EndDate%toString() WRITE (0,*) WRITE (0,*) "Checking event management" -! call initEventManager (mec_RefDate) mec_Events = t_eventGroup('mecEventGroup') + mec_EndDate = mec_EndDate + time_step mec_Event = t_event('mec', mec_RefDate, mec_StartDate, mec_EndDate, mec_Interval) - - call mec_Events%append(mec_Event) - WRITE (0,*) "addEventToEventGroup returns:", lret -! CALL printEventGroup (mec_Events) - + + CALL mec_Events%append(mec_Event) + mtime = mec_StartDate i = 0 - do - if (mec_Event%isActive(mtime, plus_slack=time_step)) then - i = i + 1 - WRITE (0,*) "MEC will be called on: ", trim (mtime%toString()) - end if - IF (mtime >= mec_EndDate) THEN - exit - end IF - mtime = mtime + time_step - end do - write(0,*) "check_dace_timer: total MEC calls:", i, "(expected: 13)" - end subroutine test2 -end program test_mtime + DO + IF (mec_Event%isActive(mtime, plus_slack=time_step)) THEN + i = i + 1 + WRITE (0,*) "MEC will be called on: ", TRIM (mtime%toString()) + END IF + IF (mtime >= mec_EndDate) THEN + EXIT + END IF + mtime = mtime + time_step + END DO + WRITE(0,*) "check_dace_timer: total MEC calls:", i, "(expected: 13)" + END SUBROUTINE test2 + +END PROGRAM test_mtime diff --git a/include/mtime_eventHandling.h b/include/mtime_eventHandling.h index fa6fe66785d2369cc7c9b1aea5861d310190a3bd..21cfbbd0c71fe2ad37da9fc2087ae09373292771 100644 --- a/include/mtime_eventHandling.h +++ b/include/mtime_eventHandling.h @@ -201,6 +201,10 @@ getEventisLastInMonth(struct _event* e); bool getEventisLastInYear(struct _event* e); +struct _datetime* +getEventFirstTriggerDateTime(struct _datetime* start_dt, struct _timedelta* timestep, struct _timedelta* offset, + struct _datetime* ref_dt, struct _datetime* first_trigger_dt); + /** * @} */ diff --git a/src/libmtime_hl.f90 b/src/libmtime_hl.f90 index f6820cdb0d2acc63d71cdbaf9f62bcb811612d3a..6b40c51866e8768992a309879ca3714959cd30e3 100644 --- a/src/libmtime_hl.f90 +++ b/src/libmtime_hl.f90 @@ -302,7 +302,6 @@ MODULE mtime_hl INTEGER(c_int64_t) :: eventId CHARACTER(len=max_eventname_str_len) :: eventName - TYPE(t_datetime) :: eventsLastEvaluationDateTime TYPE(t_datetime) :: eventReferenceDateTime TYPE(t_datetime) :: eventFirstDateTime @@ -325,8 +324,9 @@ MODULE mtime_hl LOGICAL :: eventisLastInMonth LOGICAL :: eventisLastInYear - TYPE(t_datetime) :: triggerNextEventDateTime - TYPE(t_datetime) :: triggeredPreviousEventDateTime + TYPE(t_datetime), POINTER :: eventsLastEvaluationDateTime => NULL() + TYPE(t_datetime), POINTER :: triggerNextEventDateTime => NULL() + TYPE(t_datetime), POINTER :: triggeredPreviousEventDateTime => NULL() CONTAINS @@ -342,6 +342,8 @@ MODULE mtime_hl PROCEDURE :: nextEvent => t_event_next_event PROCEDURE :: isActive => t_event_is_active + PROCEDURE :: getEventFirstTriggerDateTime => t_event_getEventFirstTriggerDateTime + END TYPE t_event INTERFACE t_event diff --git a/src/mtime_c_bindings.f90 b/src/mtime_c_bindings.f90 index 0c53dbc3d98918986423aa7ffb74d169faf05fce..eb5cd8316a30bcdfd9c09efe66159c9e325bac42 100644 --- a/src/mtime_c_bindings.f90 +++ b/src/mtime_c_bindings.f90 @@ -549,6 +549,18 @@ MODULE mtime_c_bindings type(c_ptr), value :: offset end function my_neweventwithdatatypes ! + FUNCTION my_geteventfirsttriggerdatetime(start_dt, timestep, offset, & + & ref_dt, first_trigger_dt) & + & RESULT(c_pointer) BIND(c, name='getEventFirstTriggerDateTime') + import :: c_ptr + type(c_ptr) :: c_pointer + type(c_ptr), value :: start_dt + type(c_ptr), value :: timestep + type(c_ptr), value :: offset + type(c_ptr), value :: ref_dt + TYPE(c_ptr), value :: first_trigger_dt + END FUNCTION my_geteventfirsttriggerdatetime + ! subroutine my_deallocateevent(ev) bind(c,name='deallocateEvent') import :: c_ptr type(c_ptr), value :: ev @@ -567,6 +579,51 @@ MODULE mtime_c_bindings character(kind=c_char), dimension(*) :: string end function my_eventtostring ! + FUNCTION my_isCurrentEventActiveRaw(current_dt, & ! in + & event_eventFirstDateTime, & ! in + & event_eventLastDateTime, & ! in + & event_eventInterval, & ! in + & plus_slack, & ! in + & minus_slack, & ! in + & event_neverTriggerEvent, & ! inout + & event_triggerCurrentEvent, & ! inout + & event_eventisFirstInDay, & ! inout + & event_eventisFirstInMonth, & ! inout + & event_eventisFirstInYear, & ! inout + & event_eventisLastInDay, & ! inout + & event_eventisLastInMonth, & ! inout + & event_eventisLastInYear, & ! inout + & event_nextEventIsFirst, & ! inout + & event_lastEventWasFinal, & ! inout + & event_triggerNextEventDateTime, & ! inout + & event_eventsLastEvaluationDateTime, & ! inout + & event_triggeredPreviousEventDateTime) & ! inout + ! + & RESULT(ret) BIND(c, name='isCurrentEventActiveRaw') + ! + IMPORT :: c_bool, c_ptr + TYPE(c_ptr), VALUE :: current_dt + TYPE(c_ptr), VALUE :: event_eventFirstDateTime + TYPE(c_ptr), VALUE :: event_eventLastDateTime + TYPE(c_ptr), VALUE :: event_eventInterval + TYPE(c_ptr), VALUE :: plus_slack + TYPE(c_ptr), VALUE :: minus_slack + LOGICAL(c_bool) :: event_neverTriggerEvent + LOGICAL(c_bool) :: event_triggerCurrentEvent + LOGICAL(c_bool) :: event_eventisFirstInDay + LOGICAL(c_bool) :: event_eventisFirstInMonth + LOGICAL(c_bool) :: event_eventisFirstInYear + LOGICAL(c_bool) :: event_eventisLastInDay + LOGICAL(c_bool) :: event_eventisLastInMonth + LOGICAL(c_bool) :: event_eventisLastInYear + LOGICAL(c_bool) :: event_nextEventIsFirst + LOGICAL(c_bool) :: event_lastEventWasFinal + TYPE(c_ptr) :: event_triggerNextEventDateTime + TYPE(c_ptr) :: event_eventsLastEvaluationDateTime + TYPE(c_ptr) :: event_triggeredPreviousEventDateTime + LOGICAL(c_bool) :: ret + END FUNCTION my_isCurrentEventActiveRaw + ! function my_isCurrentEventActive(my_event, my_datetime, plus_slack, minus_slack) & & result(ret) bind(c, name='isCurrentEventActive') import :: c_bool, c_ptr diff --git a/src/mtime_eventHandling.c b/src/mtime_eventHandling.c index 27a45a47d8c6477eb24d11cbc8460ab7fd7c0cc1..c21f7f09a03af5d8a43e15626dc2de65b21edb2f 100644 --- a/src/mtime_eventHandling.c +++ b/src/mtime_eventHandling.c @@ -24,9 +24,6 @@ #include "mtime_eventList.h" #include "mtime_iso8601.h" -/* Local static functions. */ -static struct _datetime* -getEventFirstTriggerDateTime(struct _datetime*, struct _timedelta*, struct _timedelta*, struct _datetime*, struct _datetime*); // The IDs are unique only when they are live. Once a group/event has been deleted, the IDs will be reused. // Currently, the IDs are generated but not used. @@ -332,11 +329,17 @@ newEvent(const char* _en, goto cleanup_and_exit; e->triggerNextEventDateTime = newDateTime(initDummyDTString); - /* triggerNextEventDateTime holds the DateTime when an event should be triggered subjectively (i.e assuming real time starts at -Inf and moves fwd.) - At init (right now), triggerNextEventDateTime stores the DateTime of First-Ever trigger. - Events trigger at e->eventReferenceDateTime (+ e-> eventOffset ) + N * e->eventInterval where N is a positive, negative integer. - Hence, first trigger happens at the nearest possible trigger >= e->eventFirstDateTime. */ - if (!getEventFirstTriggerDateTime(e->eventFirstDateTime, e->eventInterval, e->eventOffset, e->eventReferenceDateTime, e->triggerNextEventDateTime)) + /* triggerNextEventDateTime holds the DateTime when an event should + be triggered subjectively (i.e assuming real time starts at -Inf + and moves fwd.) + At init (right now), triggerNextEventDateTime stores the DateTime + of First-Ever trigger. + Events trigger at e->eventReferenceDateTime (+ e-> eventOffset ) + + N * e->eventInterval where N is a positive, negative integer. + Hence, first trigger happens at the nearest possible trigger >= + e->eventFirstDateTime. */ + if (!getEventFirstTriggerDateTime(e->eventFirstDateTime, e->eventInterval, e->eventOffset, + e->eventReferenceDateTime, e->triggerNextEventDateTime)) goto cleanup_and_exit; /* Init the Flags. */ @@ -470,7 +473,6 @@ newEventWithDataType(const char* _en, else e->eventLastDateTime = NULL; // Logically equivalent to Inf. - if (_eventInterval->year == 0 && _eventInterval->month == 0 && _eventInterval->day == 0 && _eventInterval->hour == 0 && _eventInterval->minute == 0 && _eventInterval->second == 0 && _eventInterval->ms == 0) { @@ -515,11 +517,18 @@ newEventWithDataType(const char* _en, goto cleanup_and_exit; e->triggerNextEventDateTime = newDateTime(initDummyDTString); - /* triggerNextEventDateTime holds the DateTime when an event should be triggered subjectively (i.e assuming real time starts at -Inf and moves fwd.) - At init (right now), triggerNextEventDateTime stores the DateTime of First-Ever trigger. - Events trigger at e->eventReferenceDateTime (+ e->eventOffset) + N*e->eventInterval where N is a positive, negative or zero integer. - Hence, first trigger happens at the nearest possible trigger >= e->eventFirstDateTime. */ - if (!getEventFirstTriggerDateTime(e->eventFirstDateTime, e->eventInterval, e->eventOffset, e->eventReferenceDateTime, e->triggerNextEventDateTime)) + /* triggerNextEventDateTime holds the DateTime when an event should + be triggered subjectively (i.e assuming real time starts at -Inf + and moves fwd.) + At init (right now), triggerNextEventDateTime stores the DateTime + of First-Ever trigger. + Events trigger at e->eventReferenceDateTime (+ e->eventOffset) + + N*e->eventInterval where N is a positive, negative or zero + integer. + Hence, first trigger happens at the nearest possible trigger >= + e->eventFirstDateTime. */ + if (!getEventFirstTriggerDateTime(e->eventFirstDateTime, e->eventInterval, e->eventOffset, + e->eventReferenceDateTime, e->triggerNextEventDateTime)) goto cleanup_and_exit; /* Init the Flags. */ @@ -657,9 +666,13 @@ constructAndCopyEvent(struct _event* ev) //Get if trigger is true. Trigger true in [T-minus_slack,T+plus_slack]. static compare_return_val -isTriggerTimeInRange(struct _datetime* current_dt, struct _datetime* triggerNextEventDateTime, struct _timedelta* plus_slack, struct _timedelta* minus_slack) +isTriggerTimeInRange(struct _datetime* current_dt, + struct _datetime* triggerNextEventDateTime, + struct _timedelta* plus_slack, + struct _timedelta* minus_slack) { int cmp_val_flag = -128; + if (triggerNextEventDateTime == NULL) return cmp_val_flag; /* Make a local copy of slack to avoid updating the user supplied timedeltas. */ struct _timedelta* plus_slack_local = NULL; @@ -782,16 +795,16 @@ isCurrentEventActiveRaw(/* in: */ bool *event_eventisLastInYear, bool *event_nextEventIsFirst, bool *event_lastEventWasFinal, - struct _datetime** event_triggerNextEventDateTime, struct _datetime** event_eventsLastEvaluationDateTime, + struct _datetime** event_triggerNextEventDateTime, struct _datetime** event_triggeredPreviousEventDateTime) { /* check for undefined input. allowed slacks can be NULL. */ - if (current_dt == NULL) {fprintf(stderr,"6\n"); return false;} - if ((event_eventFirstDateTime == NULL) || - (event_eventLastDateTime == NULL) || - (event_eventInterval == NULL)) return false; + if (current_dt == NULL) return false; + if ((event_eventFirstDateTime == NULL) || + (event_eventLastDateTime == NULL) || + (event_eventInterval == NULL)) return false; if ((event_neverTriggerEvent == NULL) || (event_triggerCurrentEvent == NULL) || (event_eventisFirstInDay == NULL) || @@ -857,6 +870,7 @@ isCurrentEventActiveRaw(/* in: */ /* Check if trigger time is now. Trigger allowed with a slack provided [start-end] condition is met. */ + if( !(*event_lastEventWasFinal) && (isTriggerTimeInRange(current_dt, *event_triggerNextEventDateTime, plus_slack, minus_slack) == equal_to) ) { @@ -1009,8 +1023,8 @@ isCurrentEventActive(struct _event* event, &event->eventisLastInYear, &event->nextEventIsFirst, &event->lastEventWasFinal, - &event->triggerNextEventDateTime, &event->eventsLastEvaluationDateTime, + &event->triggerNextEventDateTime, &event->triggeredPreviousEventDateTime); } @@ -1186,9 +1200,9 @@ eventToString(struct _event* e, char* string) /* Calculate the first trigger time. First trigger is the nearest allowed trigger time >= start_dt. Triggers are allowd only ref_dt + N * timestep where N can be positive, negative or 0. */ -static struct _datetime* -getEventFirstTriggerDateTime(struct _datetime* start_dt, struct _timedelta* timestep, struct _timedelta* offset, struct _datetime* ref_dt, struct _datetime* first_trigger_dt) +getEventFirstTriggerDateTime(struct _datetime* start_dt, struct _timedelta* timestep, struct _timedelta* offset, + struct _datetime* ref_dt, struct _datetime* first_trigger_dt) { if ((start_dt != NULL) && (timestep != NULL) && (ref_dt != NULL) && (first_trigger_dt != NULL) ) //offset can be NULL. { diff --git a/src/mtime_t_event.inc b/src/mtime_t_event.inc index e8db15edb01e684b018438f243d3ba64d29b48ba..2b78e4636c5af5464ff42c0063a70821d32ae28f 100644 --- a/src/mtime_t_event.inc +++ b/src/mtime_t_event.inc @@ -26,6 +26,20 @@ t_event_assign_raw%eventOffset = t_timedelta(zeroOffset) ENDIF + ALLOCATE(t_event_assign_raw%triggerNextEventDateTime) + t_event_assign_raw%triggerNextEventDateTime = t_event_assign_raw%getEventFirstTriggerDateTime() + + t_event_assign_raw%neverTriggerEvent = .FALSE. + t_event_assign_raw%triggerCurrentEvent = .FALSE. + t_event_assign_raw%eventisFirstInDay = .FALSE. + t_event_assign_raw%eventisFirstInMonth = .FALSE. + t_event_assign_raw%eventisFirstInYear = .FALSE. + t_event_assign_raw%eventisLastInDay = .FALSE. + t_event_assign_raw%eventisLastInMonth = .FALSE. + t_event_assign_raw%eventisLastInYear = .FALSE. + t_event_assign_raw%nextEventIsFirst = .TRUE. + t_event_assign_raw%lastEventWasFinal = .FALSE. + END FUNCTION t_event_assign_raw FUNCTION t_event_assign_types(name, referenceDate, firstdate, lastDate, interval, offset) @@ -50,8 +64,51 @@ t_event_assign_types%eventOffset = t_timedelta(zeroOffset) ENDIF + ALLOCATE(t_event_assign_types%triggerNextEventDateTime) + t_event_assign_types%triggerNextEventDateTime = t_event_assign_types%getEventFirstTriggerDateTime() + + t_event_assign_types%neverTriggerEvent = .FALSE. + t_event_assign_types%triggerCurrentEvent = .FALSE. + t_event_assign_types%eventisFirstInDay = .FALSE. + t_event_assign_types%eventisFirstInMonth = .FALSE. + t_event_assign_types%eventisFirstInYear = .FALSE. + t_event_assign_types%eventisLastInDay = .FALSE. + t_event_assign_types%eventisLastInMonth = .FALSE. + t_event_assign_types%eventisLastInYear = .FALSE. + t_event_assign_types%nextEventIsFirst = .TRUE. + t_event_assign_types%lastEventWasFinal = .FALSE. + END FUNCTION t_event_assign_types + + FUNCTION t_event_getEventFirstTriggerDateTime(this) RESULT(result_dt) + CLASS(t_event), INTENT(IN) :: this + TYPE(t_datetime) :: result_dt + ! + TYPE(c_ptr) :: c_pointer,tmp_evFirstDateTime, tmp_evOffset, tmp_evInterval, & + & tmp_evReferenceDateTime + TYPE(datetime), POINTER :: tmp_dt + + tmp_evFirstDateTime = this%eventFirstDateTime%get_c_pointer() + tmp_evOffset = this%eventOffset%get_c_pointer() + tmp_evInterval = this%eventInterval%get_c_pointer() + tmp_evReferenceDateTime = this%eventReferenceDateTime%get_c_pointer() + + c_pointer = this%eventFirstDateTime%get_c_pointer() + c_pointer = my_geteventfirsttriggerdatetime(tmp_evFirstDateTime, tmp_evInterval, tmp_evOffset, & + & tmp_evReferenceDateTime, c_pointer) + CALL C_F_POINTER(c_pointer, tmp_dt) + result_dt%dt = tmp_dt + + IF (C_ASSOCIATED(c_pointer)) CALL my_deallocatedatetime(c_pointer) + IF (C_ASSOCIATED(tmp_evFirstDateTime)) CALL my_deallocatedatetime(tmp_evFirstDateTime) + IF (C_ASSOCIATED(tmp_evOffset)) CALL my_deallocatetimedelta(tmp_evOffset) + IF (C_ASSOCIATED(tmp_evInterval)) CALL my_deallocatetimedelta(tmp_evInterval) + IF (C_ASSOCIATED(tmp_evReferenceDateTime)) CALL my_deallocatedatetime(tmp_evReferenceDateTime) + + END FUNCTION t_event_getEventFirstTriggerDateTime + + ! Iterate to next event in event group. ! ! @return NULL() if no next event available. @@ -114,30 +171,117 @@ TYPE(t_datetime) :: my_datetime TYPE(t_timedelta), OPTIONAL :: plus_slack TYPE(t_timedelta), OPTIONAL :: minus_slack - TYPE(t_event), POINTER :: tmp_ev - TYPE(c_ptr) :: tmp_dt, tmp_plus, tmp_minus - logical(c_bool) :: ret - - tmp_ev => this - tmp_dt = my_datetime%get_c_pointer() - if (present(plus_slack)) then - tmp_plus = plus_slack%get_c_pointer() - else - tmp_plus = c_null_ptr - endif - - if (present(minus_slack)) then - tmp_minus = minus_slack%get_c_pointer() - else - tmp_minus = c_null_ptr - endif - - ret = my_isCurrentEventActive(c_loc(tmp_ev), tmp_dt, & - & tmp_plus, tmp_minus) + TYPE(c_ptr) :: tmp_dt, tmp_plus, tmp_minus, tmp_evFirstDateTime, tmp_evLastDateTime, tmp_evInterval + LOGICAL(c_bool) :: event_neverTriggerEvent, event_triggerCurrentEvent, event_eventisFirstInDay, & + event_eventisFirstInMonth, event_eventisFirstInYear, event_eventisLastInDay, & + event_eventisLastInMonth, event_eventisLastInYear, event_nextEventIsFirst, & + event_lastEventWasFinal, ret + TYPE(c_ptr) :: event_triggerNextEventDateTime, & + event_eventsLastEvaluationDateTime, & + event_triggeredPreviousEventDateTime + TYPE(datetime), POINTER :: dt_tmp + + ! --- copy-in: + + tmp_dt = my_datetime%get_c_pointer() + tmp_evFirstDateTime = this%eventFirstDateTime%get_c_pointer() + tmp_evLastDateTime = this%eventLastDateTime%get_c_pointer() + tmp_evInterval = this%eventInterval%get_c_pointer() + + tmp_plus = c_null_ptr + tmp_minus = c_null_ptr + IF (PRESENT(plus_slack)) tmp_plus = plus_slack%get_c_pointer() + IF (PRESENT(minus_slack)) tmp_minus = minus_slack%get_c_pointer() + + event_neverTriggerEvent = this%neverTriggerEvent + event_triggerCurrentEvent = this%triggerCurrentEvent + event_eventisFirstInDay = this%eventisFirstInDay + event_eventisFirstInMonth = this%eventisFirstInMonth + event_eventisFirstInYear = this%eventisFirstInYear + event_eventisLastInDay = this%eventisLastInDay + event_eventisLastInMonth = this%eventisLastInMonth + event_eventisLastInYear = this%eventisLastInYear + event_nextEventIsFirst = this%nextEventIsFirst + event_lastEventWasFinal = this%lastEventWasFinal + + event_triggerNextEventDateTime = c_null_ptr + event_eventsLastEvaluationDateTime = c_null_ptr + event_triggeredPreviousEventDateTime = c_null_ptr + + IF (ASSOCIATED(this%triggerNextEventDateTime )) & + & event_triggerNextEventDateTime = this%triggerNextEventDateTime%get_c_pointer() + IF (ASSOCIATED(this%eventsLastEvaluationDateTime )) & + & event_eventsLastEvaluationDateTime = this%eventsLastEvaluationDateTime%get_c_pointer() + IF (ASSOCIATED(this%triggeredPreviousEventDateTime)) & + & event_triggeredPreviousEventDateTime = this%triggeredPreviousEventDateTime%get_c_pointer() + + ! --- call C routine: + + ret = my_isCurrentEventActiveRaw(tmp_dt, & ! in + & tmp_evFirstDateTime, & ! in + & tmp_evLastDateTime, & ! in + & tmp_evInterval, & ! in + & tmp_plus, & ! in + & tmp_minus, & ! in + & event_neverTriggerEvent, & ! inout + & event_triggerCurrentEvent, & ! inout + & event_eventisFirstInDay, & ! inout + & event_eventisFirstInMonth, & ! inout + & event_eventisFirstInYear, & ! inout + & event_eventisLastInDay, & ! inout + & event_eventisLastInMonth, & ! inout + & event_eventisLastInYear, & ! inout + & event_nextEventIsFirst, & ! inout + & event_lastEventWasFinal, & ! inout + & event_eventsLastEvaluationDateTime, & ! inout + & event_triggerNextEventDateTime, & ! inout + & event_triggeredPreviousEventDateTime) ! inout + + ! --- copy-out: + + this%neverTriggerEvent = event_neverTriggerEvent + this%triggerCurrentEvent = event_triggerCurrentEvent + this%eventisFirstInDay = event_eventisFirstInDay + this%eventisFirstInMonth = event_eventisFirstInMonth + this%eventisFirstInYear = event_eventisFirstInYear + this%eventisLastInDay = event_eventisLastInDay + this%eventisLastInMonth = event_eventisLastInMonth + this%eventisLastInYear = event_eventisLastInYear + this%nextEventIsFirst = event_nextEventIsFirst + this%lastEventWasFinal = event_lastEventWasFinal + + IF (C_ASSOCIATED(event_triggerNextEventDateTime)) THEN + IF (.NOT. ASSOCIATED(this%triggerNextEventDateTime)) ALLOCATE(this%triggerNextEventDateTime) + CALL C_F_POINTER(event_triggerNextEventDateTime, dt_tmp) + this%triggerNextEventDateTime%dt = dt_tmp + END IF + IF (C_ASSOCIATED(event_eventsLastEvaluationDateTime)) THEN + IF (.NOT. ASSOCIATED(this%eventsLastEvaluationDateTime)) ALLOCATE(this%eventsLastEvaluationDateTime) + CALL C_F_POINTER(event_eventsLastEvaluationDateTime, dt_tmp) + this%eventsLastEvaluationDateTime%dt = dt_tmp + END IF + IF (C_ASSOCIATED(event_triggeredPreviousEventDateTime)) THEN + IF (.NOT. ASSOCIATED(this%triggeredPreviousEventDateTime)) ALLOCATE(this%triggeredPreviousEventDateTime) + CALL C_F_POINTER(event_triggeredPreviousEventDateTime, dt_tmp) + this%triggeredPreviousEventDateTime%dt = dt_tmp + END IF + + ! --- clean up: CALL my_deallocatedatetime(tmp_dt) - if (c_associated(tmp_plus)) CALL my_deallocatetimedelta(tmp_plus) - if (c_associated(tmp_minus)) CALL my_deallocatetimedelta(tmp_minus) + IF (C_ASSOCIATED(tmp_plus)) CALL my_deallocatetimedelta(tmp_plus) + IF (C_ASSOCIATED(tmp_minus)) CALL my_deallocatetimedelta(tmp_minus) + IF (C_ASSOCIATED(tmp_evFirstDateTime)) CALL my_deallocatedatetime(tmp_evFirstDateTime) + IF (C_ASSOCIATED(tmp_evLastDateTime)) CALL my_deallocatedatetime(tmp_evLastDateTime) + IF (C_ASSOCIATED(tmp_evInterval)) CALL my_deallocatetimedelta(tmp_evInterval) + + IF (C_ASSOCIATED(event_triggerNextEventDateTime )) & + & CALL my_deallocatedatetime(event_triggerNextEventDateTime ) + IF (C_ASSOCIATED(event_eventsLastEvaluationDateTime )) & + & CALL my_deallocatedatetime(event_eventsLastEvaluationDateTime ) + IF (C_ASSOCIATED(event_triggeredPreviousEventDateTime)) & + & CALL my_deallocatedatetime(event_triggeredPreviousEventDateTime) + END FUNCTION t_event_is_active ! ================================================================================