From e5b04d50aae88855a8f2e28cb87605eb07754851 Mon Sep 17 00:00:00 2001 From: Florian Prill <florian.prill@dwd.de> Date: Thu, 16 May 2019 16:07:02 +0200 Subject: [PATCH] [divide_timespans] remove obsolete divide... subroutines in mtime_timedelta. --- examples/duration.f90 | 28 +++++-- examples/tas.f90 | 4 +- include/mtime_timedelta.h | 10 --- src/libmtime.f90 | 67 ++--------------- src/mtime_c_bindings.f90 | 34 --------- src/mtime_timedelta.c | 152 -------------------------------------- 6 files changed, 30 insertions(+), 265 deletions(-) diff --git a/examples/duration.f90 b/examples/duration.f90 index 77dc3f03..94f4d3d1 100644 --- a/examples/duration.f90 +++ b/examples/duration.f90 @@ -65,7 +65,6 @@ contains REAL, intent(in) :: expected integer :: ierr, ierrs - integer(i8) :: denominator = 0 TYPE(divisionquotienttimespan) :: quotient TYPE(datetime), POINTER :: dt1_num => NULL() @@ -73,7 +72,9 @@ contains TYPE(datetime), POINTER :: dt1_denom => NULL() TYPE(datetime), POINTER :: dt2_denom => NULL() TYPE(timedelta), POINTER :: td => NULL() - + TYPE(timedelta), POINTER :: td_num => NULL() + TYPE(timedelta), POINTER :: td_denom => NULL() + TYPE(juliandelta), POINTER :: jd_denom => NULL() ierrs = 0 dt1_num => newDatetime(dt1_dividend, errno = ierr) @@ -85,12 +86,29 @@ contains dt2_denom => newDatetime(dt2_divisor, errno = ierr) ierrs = ierrs + ierr - CALL divideTwoDatetimeDiffsInSeconds(dt1_num,dt2_num,dt1_denom,dt2_denom,denominator,quotient) - print *, '(', TRIM(dt1_dividend), ' - ', TRIM(dt2_dividend), ') / ', & - & '(', TRIM(dt1_divisor), ' - ', TRIM(dt2_divisor), '): ', REAL(quotient%remainder_in_ms) / 1000. / REAL(denominator) + td_num => newTimeDelta('PT0H', errno = ierr) + ierrs = ierrs + ierr + td_denom => newTimeDelta('PT0H', errno = ierr) + ierrs = ierrs + ierr + td_num = dt1_num - dt2_num + td_denom = dt1_denom - dt2_denom + + jd_denom => newJuliandelta("+", 0_i8, 0_i8, ierr) + ierrs = ierrs + ierr + CALL timeDeltaToJulianDelta(td_denom, dt2_denom, jd_denom) + + CALL divideTimeDelta(td_num, td_denom, dt2_num, quotient) + print *, '(', TRIM(dt1_dividend), ' - ', TRIM(dt2_dividend), ') mod ', & + & '(', TRIM(dt1_divisor), ' - ', TRIM(dt2_divisor), '): ', & + & (86400.*REAL(quotient%remainder_days) + 0.001*REAL(quotient%remainder_in_ms)) / & + & (86400.*REAL(jd_denom%day) + 0.001*REAL(jd_denom%ms)), & + & " (rel.)" print *, 'expected: ', expected CALL deallocateTimeDelta(td) + CALL deallocateTimeDelta(td_num) + CALL deallocateTimeDelta(td_denom) + CALL deallocateJulianDelta(jd_denom) end subroutine testDatetimeDiffComp diff --git a/examples/tas.f90 b/examples/tas.f90 index 70c62d3c..0d42bb84 100644 --- a/examples/tas.f90 +++ b/examples/tas.f90 @@ -72,7 +72,7 @@ program tas call timedeltatostring(tdivisor, ctd) print *, ctd - CALL divideTimeDeltaInSeconds(tdividend, tdivisor, dt1, tq) + CALL divideTimeDelta(tdividend, tdivisor, dt1, tq) print *, tq @@ -173,7 +173,7 @@ contains mtime_step => newDatetime("0000-01-01T00:00:00.000"); - CALL dividetimedeltainseconds(tddiff, vlsec, mtime_step, tq) + CALL divideTimeDelta(tddiff, vlsec, mtime_step, tq) step = tq%quotient if (step >= 0) then diff --git a/include/mtime_timedelta.h b/include/mtime_timedelta.h index ec2e6b76..ec88e299 100644 --- a/include/mtime_timedelta.h +++ b/include/mtime_timedelta.h @@ -90,16 +90,6 @@ struct _divisionquotienttimespan* divideTimeDelta(struct _timedelta* dividend, struct _timedelta* divisor, struct _datetime* base_dt, struct _divisionquotienttimespan* quo_ret); -struct _divisionquotienttimespan* -divideTimeDeltaInSeconds(struct _timedelta* dividend, struct _timedelta* divisor, struct _datetime* base_dt, -struct _divisionquotienttimespan* quo_ret); - -struct _divisionquotienttimespan* -divideTwoDatetimeDiffsInSeconds(struct _datetime* dt1_dividend, struct _datetime* dt2_dividend,struct _datetime* dt1_divisor, struct _datetime* dt2_divisor, int64_t * denominator_ret, struct _divisionquotienttimespan* quo_ret); - -struct _divisionquotienttimespan* -divideDatetimeDifferenceInSeconds(struct _datetime* dt1, struct _datetime* dt2, struct _timedelta* divisor, struct _divisionquotienttimespan* quo_ret); - struct _timedelta* getTimeDeltaFromDate(struct _date*, struct _date*, struct _timedelta*); diff --git a/src/libmtime.f90 b/src/libmtime.f90 index 6e9df0ec..5855591b 100644 --- a/src/libmtime.f90 +++ b/src/libmtime.f90 @@ -1092,9 +1092,7 @@ module mtime_timedelta public :: getPTStringFromMinutes public :: getPTStringFromHours public :: timeDeltaToJulianDelta - public :: divideTimeDeltaInSeconds - public :: divideTwoDatetimeDiffsInSeconds - public :: divideDatetimeDifferenceInSeconds + public :: divideTimeDelta public :: operator(+) public :: operator(-) public :: operator(*) @@ -1730,7 +1728,7 @@ contains END SUBROUTINE timeDeltaToJulianDelta !> - !! @brief division by seconds. + !! @brief timedelta division. !! !! @param[in] dividend !! A pointer to type timedelta @@ -1741,7 +1739,7 @@ contains !! @param[out] quotient !! A pointer to type divisionquotienttimespan !! - SUBROUTINE divideTimeDeltaInSeconds(dividend, divisor, base_dt, quotient, errna)!OK-UNTESTED. + SUBROUTINE divideTimeDelta(dividend, divisor, base_dt, quotient, errna)!OK-UNTESTED. type(timedelta), target, intent(in) :: dividend type(timedelta), target, intent(in) :: divisor TYPE(datetime), TARGET, INTENT(in) :: base_dt @@ -1749,66 +1747,11 @@ contains INTEGER, INTENT(out), optional :: errna type(c_ptr) :: dummy_ptr IF (PRESENT(errna)) errna = 0 ! FIXME: no_error - dummy_ptr = my_dividetimedeltainseconds(c_loc(dividend), c_loc(divisor), c_loc(base_dt), c_loc(quotient)) + dummy_ptr = my_dividetimedelta(c_loc(dividend), c_loc(divisor), c_loc(base_dt), c_loc(quotient)) IF (PRESENT(errna) .AND. .NOT. c_associated(dummy_ptr)) THEN errna = errna + 2 ! increment error number by 2, see below for an explanation. ENDIF - end subroutine divideTimeDeltaInSeconds - !> - !! @brief division of two differences in datetimes. - !! - !! @param dt1_dividend, dt2_dividend, dt1_divisor, dt2_divisor - !! Reference date (a pointer to struct _datetime). - !! - !! @param intvlsec - !! Interval given in seconds. - !! - !! @return result of division. NULL indicates error. - subroutine divideTwoDatetimeDiffsInSeconds(dt1_dividend,dt2_dividend, & - & dt1_divisor, dt2_divisor, & - & denominator, quotient) - type(datetime), target, intent(in) :: dt1_dividend - type(datetime), target, intent(in) :: dt2_dividend - type(datetime), target, intent(in) :: dt1_divisor - type(datetime), target, intent(in) :: dt2_divisor - integer(c_int64_t), target, intent(out) :: denominator - type(divisionquotienttimespan), target, intent(out) :: quotient - type(c_ptr) :: dummy_ptr - dummy_ptr = my_dividetwodatetimediffsinseconds(c_loc(dt1_dividend), c_loc(dt2_dividend), & - & c_loc(dt1_divisor), c_loc(dt2_divisor), & - & c_loc(denominator), c_loc(quotient)) - end subroutine divideTwoDatetimeDiffsInSeconds - - !> - !! @brief division of an datetime interval by seconds. - !! - !! the datetime interval is calculated by dt1-dt2. - !! - !! @param[in] dt1 - !! A pointer to type datetime - !! - !! @param[in] dt2 - !! A pointer to type datetime - !! - !! @param[in] divisor - !! A pointer to type timedelta - !! - !! @param[out] quotient - !! A pointer to type divisionquotienttimespan - !! - subroutine divideDatetimeDifferenceInSeconds(dt1, dt2, divisor, quotient, errna) - type(datetime), target, intent(in) :: dt1 - type(datetime), target, intent(in) :: dt2 - type(timedelta), target, intent(in) :: divisor - type(divisionquotienttimespan), target, intent(out) :: quotient - INTEGER, INTENT(out), optional :: errna - type(c_ptr) :: dummy_ptr - IF (PRESENT(errna)) errna = 0 ! FIXME: no_error - dummy_ptr = my_dividedatetimedifferenceinseconds(c_loc(dt1), c_loc(dt2), c_loc(divisor), c_loc(quotient)) - IF (PRESENT(errna) .AND. .NOT. c_associated(dummy_ptr)) THEN - errna = errna + 2 ! increment error number by 2, see below for an explanation. - ENDIF - end subroutine divideDatetimeDifferenceInSeconds + END SUBROUTINE divideTimeDelta ! end module mtime_timedelta !> diff --git a/src/mtime_c_bindings.f90 b/src/mtime_c_bindings.f90 index f9ff38a0..0c53dbc3 100644 --- a/src/mtime_c_bindings.f90 +++ b/src/mtime_c_bindings.f90 @@ -511,16 +511,6 @@ MODULE mtime_c_bindings type(c_ptr), value :: jd end function my_timedeltatojuliandelta ! - FUNCTION my_divideTimeDeltaInSeconds(dividend, divisor, base_dt, quotient) & -RESULT(ret_quotient) BIND(c,name='divideTimeDeltaInSeconds') - import :: c_ptr - type(c_ptr) :: ret_quotient - type(c_ptr), value :: dividend - type(c_ptr), value :: divisor - type(c_ptr), value :: base_dt - type(c_ptr), value :: quotient - end function my_divideTimeDeltaInSeconds - ! FUNCTION my_divideTimeDelta(dividend, divisor, base_dt, quotient) & RESULT(ret_quotient) BIND(c,name='divideTimeDelta') import :: c_ptr @@ -531,30 +521,6 @@ RESULT(ret_quotient) BIND(c,name='divideTimeDeltaInSeconds') type(c_ptr), value :: quotient END FUNCTION my_divideTimeDelta ! - FUNCTION my_divideDatetimeDifferenceInSeconds(dt1, dt2, divisor, quotient) RESULT(ret_quotient) & - & bind(c,name='divideDatetimeDifferenceInSeconds') - import :: c_ptr - type(c_ptr) :: ret_quotient - type(c_ptr), value :: dt1 - type(c_ptr), value :: dt2 - type(c_ptr), value :: divisor - type(c_ptr), value :: quotient - end function my_divideDatetimeDifferenceInSeconds - ! - function my_divideTwoDatetimeDiffsInSeconds(dt1_dividend, dt2_dividend, & - & dt1_divisor, dt2_divisor, denominator, quotient) & - & result(ret_quotient) & - & bind(c,name='divideTwoDatetimeDiffsInSeconds') - import :: c_ptr - type(c_ptr) :: ret_quotient - type(c_ptr), value :: dt1_dividend - type(c_ptr), value :: dt2_dividend - type(c_ptr), value :: dt1_divisor - type(c_ptr), value :: dt2_divisor - type(c_ptr), value :: denominator - type(c_ptr), value :: quotient - end function my_divideTwoDatetimeDiffsInSeconds - ! end interface ! interface diff --git a/src/mtime_timedelta.c b/src/mtime_timedelta.c index 019d572c..e1a549df 100644 --- a/src/mtime_timedelta.c +++ b/src/mtime_timedelta.c @@ -1244,158 +1244,6 @@ divideTimeDelta(struct _timedelta* dividend, struct _timedelta* divisor, } -/* TODO: Remove the following subroutine? */ -struct _divisionquotienttimespan* -divideTimeDeltaInSeconds(struct _timedelta* dividend, struct _timedelta* divisor, struct _datetime* base_dt, struct _divisionquotienttimespan* quo_ret) -{ - if ((dividend != NULL) && (divisor != NULL) && (quo_ret != NULL)) - { - if ((dividend->year == 0) && (divisor->year == 0) && (divisor->month == 0)) - { - - struct _juliandelta* jd = newJulianDelta('+', 0, 0); - if ( jd == NULL ) - return 0; - jd = timeDeltaToJulianDelta(dividend, base_dt, jd); - if ( jd == NULL ) - { - deallocateJulianDelta(jd); - return 0; - } - - intmax_t numerator = (intmax_t) (((int64_t) jd->day * NO_OF_MS_IN_A_DAY + jd->ms)); - intmax_t denominator = (intmax_t) (((int64_t) divisor->day * 86400 + - divisor->hour * 3600 + - divisor->minute * 60 + - divisor->second ) * 1000 + - divisor->ms); - - deallocateJulianDelta(jd); - if (denominator == 0) /* Division by zero is illegal. */ - return NULL; - - imaxdiv_t div = imaxdiv(numerator, denominator); - - quo_ret->quotient = (int64_t) div.quot; - quo_ret->remainder_days = (int64_t) 0; - quo_ret->remainder_in_ms = (int64_t) div.rem; - return quo_ret; - } - } - return NULL; -} - -/** - * @brief division by an interval given in of seconds. - * - * @param refdt - * Reference date (a pointer to struct _datetime). - * @param dt - * A pointer to struct _datetime. - * @param intvlsec - * Interval given in seconds. - * - * @return result of division. NULL indicates error. - */ -/* TODO: For the sake of simplicity, remove the following subroutine? */ -struct _divisionquotienttimespan* -divideDatetimeDifferenceInSeconds(struct _datetime* dt1, struct _datetime* dt2, struct _timedelta* divisor, struct _divisionquotienttimespan* quo_ret) -{ - if ((dt1 != NULL) && (dt2 != NULL) && (divisor != NULL) && (quo_ret != NULL)) - { - if ((divisor->year == 0) && (divisor->month == 0)) - { - struct _julianday* jd1 = newJulianDay(0, 0); - if (jd1 != NULL) jd1 = date2julian(dt1, jd1); - - struct _julianday* jd2 = newJulianDay(0, 0); - if (jd2 != NULL) jd2 = date2julian(dt2, jd2); - - intmax_t denominator = (intmax_t) (((int64_t) divisor->day * 86400 + divisor->hour * 3600 +divisor->minute * 60 + divisor->second ) * 1000 + divisor->ms); - - if (denominator == 0) /* Division by zero is illegal. */ - return NULL; - - struct _juliandelta* jd = newJulianDelta('+', 0, 0); - jd = substractJulianDay(jd1, jd2, jd); - intmax_t numerator = (intmax_t) (jd->day * 86400000 + jd->ms); - - imaxdiv_t div = imaxdiv(numerator, denominator); - - quo_ret->quotient = (int64_t) div.quot; - quo_ret->remainder_days = (int64_t) 0; - quo_ret->remainder_in_ms = (int64_t) div.rem; - - if (jd1 != NULL) deallocateJulianDay(jd1); - if (jd2 != NULL) deallocateJulianDay(jd2); - if (jd != NULL) deallocateJulianDelta(jd); - return quo_ret; - } - } - return NULL; -} - -/** - * @brief division of two differences in datetimes. - * - * @param dt1_dividend, dt2_dividend, dt1_divisor, dt2_divisor - * Reference date (a pointer to struct _datetime). - * - * @param intvlsec - * Interval given in seconds. - * - * @return result of division. NULL indicates error. - */ -/* TODO: For the sake of simplicity, remove the following subroutine? */ -struct _divisionquotienttimespan* -divideTwoDatetimeDiffsInSeconds(struct _datetime* dt1_dividend, struct _datetime* dt2_dividend, struct _datetime* dt1_divisor, struct _datetime* dt2_divisor, int64_t* denominator_ret, struct _divisionquotienttimespan* quo_ret) -{ - if ((dt1_dividend != NULL) && (dt2_dividend != NULL) && - (dt1_divisor != NULL) && (dt2_divisor != NULL) && (quo_ret != NULL)) - { - // dividend - struct _julianday* jd1_dividend = newJulianDay(0, 0); - if (jd1_dividend != NULL) jd1_dividend = date2julian(dt1_dividend, jd1_dividend); - - struct _julianday* jd2_dividend = newJulianDay(0, 0); - if (jd2_dividend != NULL) jd2_dividend = date2julian(dt2_dividend, jd2_dividend); - - struct _juliandelta* jd_dividend = newJulianDelta('+', 0, 0); - jd_dividend = substractJulianDay(jd1_dividend, jd2_dividend, jd_dividend); - intmax_t numerator = (intmax_t) (jd_dividend->day * 86400000 + jd_dividend->ms); - - // divisor - struct _julianday* jd1_divisor = newJulianDay(0, 0); - if (jd1_divisor != NULL) jd1_divisor = date2julian(dt1_divisor, jd1_divisor); - - struct _julianday* jd2_divisor = newJulianDay(0, 0); - if (jd2_divisor != NULL) jd2_divisor = date2julian(dt2_divisor, jd2_divisor); - - struct _juliandelta* jd_divisor = newJulianDelta('+', 0, 0); - jd_divisor = substractJulianDay(jd1_divisor, jd2_divisor, jd_divisor); - intmax_t denominator = (intmax_t) (jd_divisor->day * 86400000 + jd_divisor->ms); - - imaxdiv_t div = imaxdiv(numerator, denominator); - - quo_ret->quotient = (int64_t) div.quot; - quo_ret->remainder_days = (int64_t) 0; - quo_ret->remainder_in_ms = (int64_t) div.rem; - *denominator_ret = (int64_t) (denominator / 1000); - - if (jd1_dividend != NULL) deallocateJulianDay(jd1_dividend); - if (jd2_dividend != NULL) deallocateJulianDay(jd2_dividend); - if (jd_dividend != NULL) deallocateJulianDelta(jd_dividend); - - if (jd1_divisor != NULL) deallocateJulianDay(jd1_divisor); - if (jd2_divisor != NULL) deallocateJulianDay(jd2_divisor); - if (jd_divisor != NULL) deallocateJulianDelta(jd_divisor); - - return quo_ret; - } - else - return NULL; -} - /** * @brief Get the TimeDelta between two Dates d1 and d2 as (d1-d2). * -- GitLab