From 6e737461745ffe5b60e5a3596d5a698a83f8aa1a Mon Sep 17 00:00:00 2001 From: Florian Prill <florian.prill@dwd.de> Date: Wed, 29 May 2019 14:25:42 +0200 Subject: [PATCH] hl interface: add element-wise addition of timedeltas. --- src/libmtime_hl.f90 | 6 ++++-- src/mtime_t_datetime.inc | 2 +- src/mtime_t_timedelta.inc | 18 ++++++++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/libmtime_hl.f90 b/src/libmtime_hl.f90 index e8514283..2c733148 100644 --- a/src/libmtime_hl.f90 +++ b/src/libmtime_hl.f90 @@ -53,7 +53,7 @@ MODULE mtime_hl PUBLIC :: OPERATOR(*) ! Re-export stuff - public :: register_finish_mtime_procedure, finish_mtime + public :: register_finish_mtime_procedure, finish_mtime ! ! TODO: simply repeat the implementation of "divisionquotienttimespan" in order to disentangle the mtime_hl and the mtime Fortran modules. @@ -157,7 +157,7 @@ MODULE mtime_hl MODULE PROCEDURE t_datetime_assign_raw END INTERFACE t_datetime - + !> Wrapper class for "mtime" data type "timedelta". ! @@ -211,6 +211,7 @@ MODULE mtime_hl PROCEDURE :: scalar_multiply_long => t_timedelta_scalar_multiply_long PROCEDURE :: scalar_multiply_int => t_timedelta_scalar_multiply_int PROCEDURE :: scalar_multiply_real => t_timedelta_scalar_multiply_real + PROCEDURE :: addElementWise => t_timedelta_addElementWise PROCEDURE :: get_c_pointer => t_timedelta_get_c_pointer @@ -222,6 +223,7 @@ MODULE mtime_hl GENERIC :: OPERATOR(>=) => greater_or_equal_datetime GENERIC :: OPERATOR(*) => scalar_multiply_long, scalar_multiply_int, & & scalar_multiply_real + GENERIC :: OPERATOR(+) => addElementWise END TYPE t_timedelta diff --git a/src/mtime_t_datetime.inc b/src/mtime_t_datetime.inc index edd7d08b..5f1ad0aa 100644 --- a/src/mtime_t_datetime.inc +++ b/src/mtime_t_datetime.inc @@ -123,7 +123,7 @@ FUNCTION t_datetime_sub_timedelta(this, td) RESULT(dt_td_sum) TYPE (t_datetime) :: dt_td_sum CLASS (t_datetime), INTENT(in) :: this - type (t_timedelta), INTENT(in) :: td + TYPE (t_timedelta), INTENT(in) :: td TYPE(t_timedelta) :: td_tmp TYPE(datetime), pointer :: dt_tmp type(c_ptr) :: c_pointer1, c_pointer2, dummy_ptr diff --git a/src/mtime_t_timedelta.inc b/src/mtime_t_timedelta.inc index 83c6ef86..c92b0703 100644 --- a/src/mtime_t_timedelta.inc +++ b/src/mtime_t_timedelta.inc @@ -335,3 +335,21 @@ & this%td%hour, this%td%minute, this%td%second, this%td%ms) call handle_errno((.not. c_associated(c_pointer)), 5 * 100 + 2, __FILE__, __LINE__) END FUNCTION t_timedelta_get_c_pointer + + FUNCTION t_timedelta_addElementWise(this, td) RESULT(added_td) + TYPE (t_timedelta) :: added_td + CLASS(t_timedelta), INTENT(IN) :: this + TYPE (t_timedelta), INTENT(in) :: td + TYPE (c_ptr) :: c_pointer1, c_pointer2, dummy_ptr + TYPE(timedelta), POINTER :: td_tmp + + c_pointer1 = this%get_c_pointer() + c_pointer2 = td%get_c_pointer() + + dummy_ptr = my_elementwiseaddtimedeltatotimedelta(c_pointer1, c_pointer2, c_pointer1) + CALL handle_errno(.NOT. C_ASSOCIATED(dummy_ptr), 0 * 100 + 2, __FILE__, __LINE__) + CALL C_F_POINTER(c_pointer1, td_tmp) + CALL my_deallocatedatetime(c_pointer1) + CALL my_deallocatedatetime(c_pointer2) + added_td%td = td_tmp + END FUNCTION t_timedelta_addElementWise -- GitLab