TABLE OF CONTENTS
- ABINIT/m_xgTools
- m_xg/checkResizeC
- m_xg/checkResizeI
- m_xg/checkResizeR
- m_xg/cols
- m_xg/comm
- m_xg/getClocC
- m_xg/getClocR
- m_xg/gpu_option
- m_xg/rows
- m_xg/setComm
- m_xg/space
- m_xg/xg_associated
- m_xg/xg_finalize
- m_xg/xg_free
- m_xg/xg_get
- m_xg/xg_init
- m_xg/xg_set
- m_xg/xg_setBlock
- m_xg/xgBlock_add
- m_xg/xgBlock_apply_diag_nospin
- m_xg/xgBlock_average
- m_xg/xgBlock_check
- m_xg/xgBlock_check_gpu_option
- m_xg/xgBlock_colwiseCymax
- m_xg/xgBlock_colwiseDivision
- m_xg/xgBlock_colwiseDotProduct
- m_xg/xgBlock_colwiseMulC
- m_xg/xgBlock_colwiseMulR
- m_xg/xgBlock_colwiseNorm2
- m_xg/xgBlock_copy
- m_xg/xgBlock_copy_from_gpu
- m_xg/xgBlock_copy_to_gpu
- m_xg/xgBlock_cshift
- m_xg/xgBlock_deviation
- m_xg/xgBlock_diagonal
- m_xg/xgBlock_diagonalOnly
- m_xg/xgBlock_gemmC
- m_xg/xgBlock_gemmR
- m_xg/xgBlock_get
- m_xg/xgBlock_getid
- m_xg/xgBlock_getSize
- m_xg/xgBlock_heev
- m_xg/xgBlock_heevd
- m_xg/xgBlock_hegvd
- m_xg/xgBlock_hegvx
- m_xg/xgBlock_hgev
- m_xg/xgBlock_hpev
- m_xg/xgBlock_hpevd
- m_xg/xgBlock_hpgv
- m_xg/xgBlock_hpgvd
- m_xg/xgBlock_hpgvx
- m_xg/xgBlock_map
- m_xg/xgBlock_minmax
- m_xg/xgBlock_one
- m_xg/xgBlock_pack
- m_xg/xgBlock_potrf
- m_xg/xgBlock_prefetch_async
- m_xg/xgBlock_print
- m_xg/xgBlock_reshape
- m_xg/xgBlock_reshape_spinor
- m_xg/xgBlock_reverseMap
- m_xg/xgBlock_saxpyC
- m_xg/xgBlock_saxpyR
- m_xg/xgBlock_scaleC
- m_xg/xgBlock_scaleR
- m_xg/xgBlock_set
- m_xg/xgBlock_setBlock
- m_xg/xgBlock_trsmC
- m_xg/xgBlock_trsmR
- m_xg/xgBlock_zero
ABINIT/m_xgTools [ Modules ]
NAME
m_xgTools
FUNCTION
This is a module to manage and help developer with 2D arrays for low level routines. Particularly, it manages memory for allocations and deallocations (see xg_routines), It handles MPI, complex and real values (*8 kind only) automatically. It is also possible to build sub-block of an array and work on it very easily (see xgBlock_routines) Several routines are also available for performing blas/lapack which again manage the type and MPI (and openmp if needed) Almost all routines are timed by abinit timers This is a starting point and has to be improved/developed An example of how to use those types and routines can be found in 30_diago/m_lobpcg2.F90. This is a full rewrite of LOBPCG algorithm which uses only these types to perfom calculations.
COPYRIGHT
Copyright (C) 2016-2024 ABINIT group (J. Bieder, MS) This file is distributed under the terms of the GNU General Public License, see ~abinit/COPYING or http://www.gnu.org/copyleft/gpl.txt .
NOTES
SOURCE
28 #if defined HAVE_CONFIG_H 29 #include "config.h" 30 #endif 31 32 #include "abi_common.h" 33 34 module m_xg 35 36 use, intrinsic :: iso_c_binding, only: c_loc, c_double, c_double_complex, c_int32_t, c_size_t, c_ptr 37 38 use m_errors 39 use m_abicore 40 use defs_basis 41 use m_time, only : timab 42 use m_xmpi 43 use m_xomp 44 use m_abi_linalg 45 46 #if defined HAVE_MPI2 47 use mpi 48 #endif 49 50 #if defined(HAVE_GPU) 51 use m_gpu_toolbox 52 #endif 53 54 #if defined(HAVE_KOKKOS) 55 use m_xg_kokkos 56 #endif 57 58 #if defined HAVE_YAKL 59 use gator_mod 60 #endif 61 62 implicit none 63 64 private 65 66 integer, parameter, public :: SPACE_R = 1 67 integer, parameter, public :: SPACE_C = 2 68 integer, parameter, public :: SPACE_CR = 3 69 70 integer, parameter, public :: COLS2ROWS = 1 71 integer, parameter, public :: ROWS2COLS = -1 72 73 integer, parameter :: tim_gemm_blas = 1670 74 integer, parameter :: tim_trsm = 1671 75 integer, parameter :: tim_potrf = 1672 76 integer, parameter :: tim_set = 1673 77 integer, parameter :: tim_get = 1674 78 integer, parameter :: tim_heev = 1675 79 integer, parameter :: tim_heevd = 1676 80 integer, parameter :: tim_hpev = 1677 81 integer, parameter :: tim_hpevd = 1678 82 integer, parameter :: tim_hegv = 1679 83 integer, parameter :: tim_hegvx = 1680 84 integer, parameter :: tim_hegvd = 1681 85 integer, parameter :: tim_hpgv = 1682 86 integer, parameter :: tim_hpgvx = 1683 87 integer, parameter :: tim_hpgvd = 1684 88 integer, parameter :: tim_copy = 1685 89 integer, parameter :: tim_cshift = 1686 90 integer, parameter :: tim_pack = 1687 91 integer, parameter :: tim_gemm_mpi = 1688 92 93 integer, save, private :: lrwork = 0 94 integer, save, private :: lcwork = 0 95 integer, save, private :: liwork = 0 96 integer, allocatable, save, private :: iwork(:) 97 real(kind=c_double), allocatable, save, private :: rwork(:) 98 complex(kind=c_double_complex), allocatable, save, private :: cwork(:) 99 100 type, public :: xgBlock_t 101 integer, private :: space 102 integer, private :: rows 103 integer, private :: LDim 104 integer, private :: cols 105 character, public :: trans 106 character, public :: normal 107 integer, private :: spacedim_comm 108 integer, private :: gpu_option 109 real(kind=c_double) , ABI_CONTIGUOUS pointer, private :: vecR(:,:) => null() 110 complex(kind=c_double_complex) , ABI_CONTIGUOUS pointer, private :: vecC(:,:) => null() 111 end type xgBlock_t 112 113 type, public :: xg_t 114 integer, private :: space 115 integer, private :: rows 116 integer, private :: cols 117 character, public :: trans 118 character, public :: normal 119 integer, private :: spacedim_comm 120 !FIXME Settle this 121 real(kind=c_double) , ABI_CONTIGUOUS pointer, private :: vecR(:,:) => null() 122 complex(kind=c_double_complex) , ABI_CONTIGUOUS pointer, private :: vecC(:,:) => null() 123 integer, private :: gpu_option 124 type(xgBlock_t), public :: self 125 end type xg_t 126 127 interface xgBlock_gemm 128 module procedure xgBlock_gemmR 129 module procedure xgBlock_gemmC 130 end interface xgBlock_gemm 131 132 interface xgBlock_saxpy 133 module procedure xgBlock_saxpyR 134 module procedure xgBlock_saxpyC 135 end interface xgBlock_saxpy 136 137 interface xgBlock_colwiseMul 138 module procedure xgBlock_colwiseMulR 139 module procedure xgBlock_colwiseMulC 140 end interface xgBlock_colwiseMul 141 142 interface xgBlock_trsm 143 module procedure xgBlock_trsmR 144 module procedure xgBlock_trsmC 145 end interface xgBlock_trsm 146 147 interface xgBlock_scale 148 module procedure xgBlock_scaleR 149 module procedure xgBlock_scaleC 150 end interface xgBlock_scale 151 152 interface checkResize 153 module procedure checkResizeI 154 module procedure checkResizeR 155 module procedure checkResizeC 156 end interface checkResize 157 158 public :: space 159 public :: cols 160 public :: rows 161 public :: comm 162 public :: gpu_option 163 public :: xgBlock_setComm 164 private :: getClocR 165 private :: getClocC 166 private :: checkResize 167 168 public :: xg_init 169 public :: xg_set 170 public :: xg_get 171 public :: xg_setBlock 172 public :: xg_free 173 174 public :: xg_associated 175 176 public :: xgBlock_setBlock 177 public :: xgBlock_set 178 public :: xgBlock_map 179 public :: xgBlock_reverseMap 180 public :: xgBlock_prefetch_async 181 public :: xgBlock_get 182 public :: xgBlock_copy 183 public :: xgBlock_pack 184 public :: xgBlock_getSize 185 186 public :: xgBlock_check 187 public :: xgBlock_check_gpu_option 188 189 public :: xgBlock_potrf 190 public :: xgBlock_trsm 191 192 public :: xgBlock_heev 193 public :: xgBlock_heevd 194 195 public :: xgBlock_hpev 196 public :: xgBlock_hpevd 197 198 public :: xgBlock_hegv 199 public :: xgBlock_hegvx 200 public :: xgBlock_hegvd 201 202 public :: xgBlock_hpgv 203 public :: xgBlock_hpgvx 204 public :: xgBlock_hpgvd 205 206 public :: xgBlock_gemm 207 public :: xgBlock_add 208 public :: xgBlock_cshift 209 public :: xgBlock_colwiseNorm2 210 public :: xgBlock_colwiseDotProduct 211 public :: xgBlock_colwiseDivision 212 public :: xgBlock_colwiseCymax 213 public :: xgBlock_saxpy 214 public :: xgBlock_colwiseMul 215 public :: xgBlock_scale 216 217 public :: xgBlock_apply_diag_nospin 218 219 public :: xgBlock_zero 220 public :: xgBlock_one 221 public :: xgBlock_diagonal 222 public :: xgBlock_diagonalOnly 223 224 public :: xgBlock_minmax 225 public :: xgBlock_average 226 public :: xgBlock_deviation 227 228 public :: xgBlock_reshape 229 public :: xgBlock_reshape_spinor 230 public :: xgBlock_print 231 public :: xgBlock_getId 232 public :: xgBlock_copy_from_gpu 233 public :: xgBlock_copy_to_gpu 234 public :: xg_finalize 235 236 contains
m_xg/checkResizeC [ Functions ]
NAME
checkResizeC
m_xg/checkResizeI [ Functions ]
NAME
checkResizeI
m_xg/checkResizeR [ Functions ]
NAME
checkResizeR
m_xg/cols [ Functions ]
NAME
cols
m_xg/comm [ Functions ]
NAME
comm
m_xg/getClocC [ Functions ]
NAME
getClocC
m_xg/getClocR [ Functions ]
NAME
getClocR
m_xg/gpu_option [ Functions ]
NAME
gpu_option
m_xg/rows [ Functions ]
NAME
rows
m_xg/setComm [ Functions ]
NAME
setComm
m_xg/space [ Functions ]
NAME
space
m_xg/xg_associated [ Functions ]
NAME
xg_associated
m_xg/xg_finalize [ Functions ]
NAME
xg_finalize
m_xg/xg_free [ Functions ]
NAME
xg_free
m_xg/xg_get [ Functions ]
NAME
xg_get
m_xg/xg_init [ Functions ]
NAME
xg_init
m_xg/xg_set [ Functions ]
NAME
xg_set
m_xg/xg_setBlock [ Functions ]
NAME
xg_setBlock
m_xg/xgBlock_add [ Functions ]
NAME
xgBlock_add
m_xg/xgBlock_apply_diag_nospin [ Functions ]
NAME
xgBlock_apply_diag_nospin
m_xg/xgBlock_average [ Functions ]
NAME
xgBlock_average
m_xg/xgBlock_check [ Functions ]
NAME
xgBlock_check
m_xg/xgBlock_check_gpu_option [ Functions ]
NAME
xgBlock_check_gpu_option
m_xg/xgBlock_colwiseCymax [ Functions ]
NAME
xgBlock_colwiseCymax
m_xg/xgBlock_colwiseDivision [ Functions ]
NAME
xgBlock_colwiseDivision
m_xg/xgBlock_colwiseDotProduct [ Functions ]
NAME
xgBlock_colwiseDotProduct
m_xg/xgBlock_colwiseMulC [ Functions ]
NAME
xgBlock_colwiseMulC
m_xg/xgBlock_colwiseMulR [ Functions ]
NAME
xgBlock_colwiseMulR
m_xg/xgBlock_colwiseNorm2 [ Functions ]
NAME
xgBlock_colwiseNorm2
m_xg/xgBlock_copy [ Functions ]
NAME
xgBlock_copy
m_xg/xgBlock_copy_from_gpu [ Functions ]
NAME
xgBlock_copy_from_gpu
m_xg/xgBlock_copy_to_gpu [ Functions ]
NAME
xgBlock_copy_to_gpu
m_xg/xgBlock_cshift [ Functions ]
NAME
xgBlock_cshift
m_xg/xgBlock_deviation [ Functions ]
NAME
xgBlock_deviation
m_xg/xgBlock_diagonal [ Functions ]
NAME
xgBlock_diagonal
m_xg/xgBlock_diagonalOnly [ Functions ]
NAME
xgBlock_diagonalOnly
m_xg/xgBlock_gemmC [ Functions ]
NAME
xgBlock_gemmC
m_xg/xgBlock_gemmR [ Functions ]
NAME
xgBlock_gemmR
m_xg/xgBlock_get [ Functions ]
NAME
xgBlock_get
m_xg/xgBlock_getid [ Functions ]
NAME
xgBlock_getid
m_xg/xgBlock_getSize [ Functions ]
NAME
xgBlock_getSize
m_xg/xgBlock_heev [ Functions ]
NAME
xgBlock_heev
m_xg/xgBlock_heevd [ Functions ]
NAME
xgBlock_heevd
m_xg/xgBlock_hegvd [ Functions ]
NAME
xgBlock_hegvd
m_xg/xgBlock_hegvx [ Functions ]
NAME
xgBlock_hegvx
m_xg/xgBlock_hgev [ Functions ]
NAME
xgBlock_hgev
m_xg/xgBlock_hpev [ Functions ]
NAME
xgBlock_hpev
m_xg/xgBlock_hpevd [ Functions ]
NAME
xgBlock_hpevd
m_xg/xgBlock_hpgv [ Functions ]
NAME
xgBlock_hpgv
m_xg/xgBlock_hpgvd [ Functions ]
NAME
xgBlock_hpgvd
m_xg/xgBlock_hpgvx [ Functions ]
NAME
xgBlock_hpgvx
m_xg/xgBlock_map [ Functions ]
NAME
xgBlock_map
m_xg/xgBlock_minmax [ Functions ]
NAME
xgBlock_minmax
m_xg/xgBlock_one [ Functions ]
NAME
xgBlock_one
m_xg/xgBlock_pack [ Functions ]
NAME
xgBlock_pack
m_xg/xgBlock_potrf [ Functions ]
NAME
xgBlock_potrf
m_xg/xgBlock_prefetch_async [ Functions ]
NAME
xgBlock_prefetch_async
m_xg/xgBlock_print [ Functions ]
NAME
xgBlock_print
m_xg/xgBlock_reshape [ Functions ]
NAME
xgBlock_reshape
m_xg/xgBlock_reshape_spinor [ Functions ]
NAME
xgBlock_reshape_spinor
m_xg/xgBlock_reverseMap [ Functions ]
NAME
xgBlock_reverseMap
m_xg/xgBlock_saxpyC [ Functions ]
NAME
xgBlock_saxpyC
m_xg/xgBlock_saxpyR [ Functions ]
NAME
xgBlock_saxpyR
m_xg/xgBlock_scaleC [ Functions ]
NAME
xgBlock_scaleC
m_xg/xgBlock_scaleR [ Functions ]
NAME
xgBlock_scaleR
m_xg/xgBlock_set [ Functions ]
NAME
xgBlock_set
m_xg/xgBlock_setBlock [ Functions ]
NAME
xgBlock_setBlock
m_xg/xgBlock_trsmC [ Functions ]
NAME
xgBlock_trsmC
m_xg/xgBlock_trsmR [ Functions ]
NAME
xgBlock_trsmR
m_xg/xgBlock_zero [ Functions ]
NAME
xgBlock_zero