From 295aadfd9bc12ea71d5689b74b356d0c11e32424 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 b072a57a..29ce00c9 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