Line data Source code
1 : !--------------------------------------------------------------------------------------------------! 2 : ! CP2K: A general program to perform molecular dynamics simulations ! 3 : ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> ! 4 : ! ! 5 : ! SPDX-License-Identifier: GPL-2.0-or-later ! 6 : !--------------------------------------------------------------------------------------------------! 7 : 8 : ! ************************************************************************************************** 9 : !> \brief often used utilities for tall-and-skinny matrices 10 : !> \author Patrick Seewald 11 : ! ************************************************************************************************** 12 : MODULE dbt_tas_util 13 : USE kinds, ONLY: int_4, int_8 14 : USE util, ONLY: sort 15 : 16 : #include "../../base/base_uses.f90" 17 : 18 : ! #if TO_VERSION(1, 11) <= TO_VERSION(LIBXSMM_CONFIG_VERSION_MAJOR, LIBXSMM_CONFIG_VERSION_MINOR) 19 : ! USE libxsmm, ONLY: libxsmm_diff 20 : ! # define PURE_ARRAY_EQ 21 : ! #else 22 : # define PURE_ARRAY_EQ PURE 23 : ! #endif 24 : 25 : IMPLICIT NONE 26 : PRIVATE 27 : 28 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'dbt_tas_util' 29 : 30 : PUBLIC :: array_eq, swap 31 : 32 : INTERFACE swap 33 : MODULE PROCEDURE swap_i8 34 : MODULE PROCEDURE swap_i 35 : END INTERFACE 36 : 37 : INTERFACE array_eq 38 : MODULE PROCEDURE array_eq_i8 39 : MODULE PROCEDURE array_eq_i 40 : END INTERFACE 41 : 42 : CONTAINS 43 : 44 : ! ************************************************************************************************** 45 : !> \brief ... 46 : !> \param arr ... 47 : !> \author Patrick Seewald 48 : ! ************************************************************************************************** 49 641562 : SUBROUTINE swap_i8(arr) 50 : INTEGER(KIND=int_8), DIMENSION(2), INTENT(INOUT) :: arr 51 : 52 : INTEGER(KIND=int_8) :: tmp 53 : 54 641562 : tmp = arr(1) 55 641562 : arr(1) = arr(2) 56 641562 : arr(2) = tmp 57 641562 : END SUBROUTINE 58 : 59 : ! ************************************************************************************************** 60 : !> \brief ... 61 : !> \param arr ... 62 : !> \author Patrick Seewald 63 : ! ************************************************************************************************** 64 0 : SUBROUTINE swap_i(arr) 65 : INTEGER, DIMENSION(2), INTENT(INOUT) :: arr 66 : 67 : INTEGER :: tmp 68 : 69 0 : tmp = arr(1) 70 0 : arr(1) = arr(2) 71 0 : arr(2) = tmp 72 0 : END SUBROUTINE 73 : 74 : ! ************************************************************************************************** 75 : !> \brief ... 76 : !> \param arr1 ... 77 : !> \param arr2 ... 78 : !> \return ... 79 : !> \author Patrick Seewald 80 : ! ************************************************************************************************** 81 122367 : PURE_ARRAY_EQ FUNCTION array_eq_i(arr1, arr2) 82 : INTEGER, DIMENSION(:), INTENT(IN) :: arr1, arr2 83 : LOGICAL :: array_eq_i 84 : 85 : ! #if TO_VERSION(1, 11) <= TO_VERSION(LIBXSMM_CONFIG_VERSION_MAJOR, LIBXSMM_CONFIG_VERSION_MINOR) 86 : ! array_eq_i = .NOT. libxsmm_diff(arr1, arr2) 87 : ! #else 88 122367 : array_eq_i = .FALSE. 89 489356 : IF (SIZE(arr1) .EQ. SIZE(arr2)) array_eq_i = ALL(arr1 == arr2) 90 : ! #endif 91 122367 : END FUNCTION 92 : 93 : ! ************************************************************************************************** 94 : !> \brief ... 95 : !> \param arr1 ... 96 : !> \param arr2 ... 97 : !> \return ... 98 : !> \author Patrick Seewald 99 : ! ************************************************************************************************** 100 122311 : PURE_ARRAY_EQ FUNCTION array_eq_i8(arr1, arr2) 101 : INTEGER(KIND=int_8), DIMENSION(:), INTENT(IN) :: arr1, arr2 102 : LOGICAL :: array_eq_i8 103 : 104 : ! #if TO_VERSION(1, 11) <= TO_VERSION(LIBXSMM_CONFIG_VERSION_MAJOR, LIBXSMM_CONFIG_VERSION_MINOR) 105 : ! array_eq_i8 = .NOT. libxsmm_diff(arr1, arr2) 106 : ! #else 107 122311 : array_eq_i8 = .FALSE. 108 20763845 : IF (SIZE(arr1) .EQ. SIZE(arr2)) array_eq_i8 = ALL(arr1 == arr2) 109 : ! #endif 110 122311 : END FUNCTION 111 : 112 : END MODULE