19 USE iso_c_binding,
ONLY: c_intptr_t
26 USE dbcsr_api,
ONLY: dbcsr_csr_type,&
38#include "./base/base_uses.f90"
44 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'pexsi_types'
46 LOGICAL,
PARAMETER,
PRIVATE :: careful_mod = .false.
88 TYPE(dbcsr_type) :: dbcsr_template_matrix_sym, &
89 dbcsr_template_matrix_nonsym
90 TYPE(dbcsr_csr_type) :: csr_mat_p, csr_mat_ks, csr_mat_s, &
93 REAL(kind=
dp),
DIMENSION(:),
POINTER :: kts => null()
94 TYPE(dbcsr_p_type),
DIMENSION(:), &
95 POINTER :: matrix_w => null()
96 INTEGER(KIND=C_INTPTR_T) :: plan
97 INTEGER :: nspin, num_ranks_per_pole
99 TYPE(dbcsr_type),
DIMENSION(:), &
100 POINTER :: max_ev_vector
101 TYPE(dbcsr_type) :: csr_sparsity
102 INTEGER,
DIMENSION(2) :: mp_dims
104 LOGICAL :: csr_screening, do_adaptive_tol_nel
105 REAL(kind=
dp) :: adaptive_nel_alpha, adaptive_nel_beta, &
106 tol_nel_initial, tol_nel_target
124 INTEGER,
INTENT(IN) :: nspin
126 CHARACTER(len=*),
PARAMETER :: routinen =
'lib_pexsi_init'
128 INTEGER :: handle, ispin, npsymbfact, &
133 IF (logger%para_env%is_source())
THEN
139 CALL timeset(routinen, handle)
144 pexsi_env%mp_group = mp_group
145 associate(numnodes => pexsi_env%mp_group%num_pe, mynode => pexsi_env%mp_group%mepos)
149 IF ((pexsi_env%num_ranks_per_pole .GT. numnodes) &
150 .OR. (pexsi_env%num_ranks_per_pole .EQ. 0))
THEN
151 pexsi_env%num_ranks_per_pole = numnodes
157 DO WHILE (mod(numnodes, pexsi_env%num_ranks_per_pole) .NE. 0)
158 pexsi_env%num_ranks_per_pole = pexsi_env%num_ranks_per_pole + 1
162 IF ((npsymbfact .GT. pexsi_env%num_ranks_per_pole) .OR. (npsymbfact .EQ. 0))
THEN
168 pexsi_env%mp_dims = 0
169 CALL mp_dims_create(pexsi_env%num_ranks_per_pole, pexsi_env%mp_dims)
172 pexsi_env%nspin = nspin
173 ALLOCATE (pexsi_env%kTS(nspin))
174 pexsi_env%kTS(:) = 0.0_dp
175 ALLOCATE (pexsi_env%max_ev_vector(nspin))
176 ALLOCATE (pexsi_env%matrix_w(nspin))
177 DO ispin = 1, pexsi_env%nspin
178 ALLOCATE (pexsi_env%matrix_w(ispin)%matrix)
183 pexsi_env%mp_dims(2), mynode)
186 pexsi_env%do_adaptive_tol_nel = .false.
189 IF (unit_nr > 0)
CALL print_pexsi_info(pexsi_env, unit_nr)
191 CALL timestop(handle)
204 CHARACTER(len=*),
PARAMETER :: routinen =
'lib_pexsi_finalize'
206 INTEGER :: handle, ispin
208 CALL timeset(routinen, handle)
209 CALL cp_pexsi_plan_finalize(pexsi_env%plan)
210 DEALLOCATE (pexsi_env%kTS)
211 DEALLOCATE (pexsi_env%max_ev_vector)
212 DO ispin = 1, pexsi_env%nspin
213 DEALLOCATE (pexsi_env%matrix_w(ispin)%matrix)
215 DEALLOCATE (pexsi_env%matrix_w)
216 CALL timestop(handle)
233 INTEGER,
INTENT(IN) :: direction
234 REAL(kind=dp),
INTENT(INOUT),
OPTIONAL :: numelectron
235 TYPE(dbcsr_type),
INTENT(INOUT),
OPTIONAL :: matrix_p
236 TYPE(dbcsr_p_type),
INTENT(INOUT),
OPTIONAL :: matrix_w
237 REAL(kind=dp),
INTENT(INOUT),
OPTIONAL :: kts
239 CHARACTER(len=*),
PARAMETER :: routinen =
'convert_nspin_cp2k_pexsi'
242 REAL(kind=dp) :: scaling
244 CALL timeset(routinen, handle)
246 SELECT CASE (direction)
253 IF (
PRESENT(numelectron)) numelectron = scaling*numelectron
254 IF (
PRESENT(matrix_p))
CALL dbcsr_scale(matrix_p, scaling)
255 IF (
PRESENT(matrix_w))
CALL dbcsr_scale(matrix_w%matrix, scaling)
256 IF (
PRESENT(kts)) kts = scaling*kts
258 CALL timestop(handle)
266 SUBROUTINE print_pexsi_info(pexsi_env, unit_nr)
268 INTEGER,
INTENT(IN) :: unit_nr
270 INTEGER :: npsymbfact, numnodes, numpole, ordering, &
272 REAL(kind=dp) :: gap, muinertiaexpansion, &
273 muinertiatolerance, mumax0, mumin0, &
274 mupexsisafeguard, temperature
276 numnodes = pexsi_env%mp_group%num_pe
278 CALL cp_pexsi_get_options(pexsi_env%options, temperature=temperature, gap=gap, &
279 numpole=numpole, mumin0=mumin0, mumax0=mumax0, muinertiatolerance= &
280 muinertiatolerance, muinertiaexpansion=muinertiaexpansion, &
281 mupexsisafeguard=mupexsisafeguard, ordering=ordering, rowordering=rowordering, &
282 npsymbfact=npsymbfact)
284 WRITE (unit_nr,
'(/A)')
" PEXSI| Initialized with parameters"
285 WRITE (unit_nr,
'(A,T61,E20.3)')
" PEXSI| Electronic temperature", temperature
286 WRITE (unit_nr,
'(A,T61,E20.3)')
" PEXSI| Spectral gap", gap
287 WRITE (unit_nr,
'(A,T61,I20)')
" PEXSI| Number of poles", numpole
288 WRITE (unit_nr,
'(A,T61,E20.3)')
" PEXSI| Target tolerance in number of electrons", &
289 pexsi_env%tol_nel_target
290 WRITE (unit_nr,
'(A,T61,E20.3)')
" PEXSI| Convergence tolerance for inertia counting in mu", &
292 WRITE (unit_nr,
'(A,T61,E20.3)')
" PEXSI| Restart tolerance for inertia counting in mu", &
294 WRITE (unit_nr,
'(A,T61,E20.3)')
" PEXSI| Expansion of mu interval for inertia counting", &
297 WRITE (unit_nr,
'(/A)')
" PEXSI| Parallelization scheme"
298 WRITE (unit_nr,
'(A,T61,I20)')
" PEXSI| Number of poles processed in parallel", &
299 numnodes/pexsi_env%num_ranks_per_pole
300 WRITE (unit_nr,
'(A,T61,I20)')
" PEXSI| Number of processors per pole", &
301 pexsi_env%num_ranks_per_pole
302 WRITE (unit_nr,
'(A,T71,I5,T76,I5)')
" PEXSI| Process grid dimensions", &
303 pexsi_env%mp_dims(1), pexsi_env%mp_dims(2)
304 SELECT CASE (ordering)
306 WRITE (unit_nr,
'(A,T61,A20)')
" PEXSI| Ordering strategy",
"parallel"
308 WRITE (unit_nr,
'(A,T61,A20)')
" PEXSI| Ordering strategy",
"sequential"
310 WRITE (unit_nr,
'(A,T61,A20)')
" PEXSI| Ordering strategy",
"multiple minimum degree"
312 SELECT CASE (rowordering)
314 WRITE (unit_nr,
'(A,T61,A20)')
" PEXSI| Row permutation strategy",
"no row permutation"
316 WRITE (unit_nr,
'(A,T61,A20)')
" PEXSI| Row permutation strategy",
"make diagonal entry larger than off diagonal"
318 IF (ordering .EQ. 0)
WRITE (unit_nr,
'(A,T61,I20/)') &
319 " PEXSI| Number of processors for symbolic factorization", npsymbfact
321 END SUBROUTINE print_pexsi_info
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public lin2009
integer, save, public lin2013
various routines to log and control the output. The idea is that decisions about where to log should ...
recursive integer function, public cp_logger_get_default_unit_nr(logger, local, skip_not_ionode)
asks the default unit number of the given logger. try to use cp_logger_get_unit_nr
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
Defines the basic variable types.
integer, parameter, public dp
Interface to the message passing library MPI.
subroutine, public mp_dims_create(nodes, dims)
wrapper to MPI_Dims_create
Interface to the PEXSI library, providing wrappers for all PEXSI routines that are called inside CP2K...
subroutine, public cp_pexsi_set_options(pexsi_options, temperature, gap, deltae, numpole, isinertiacount, maxpexsiiter, mumin0, mumax0, mu0, muinertiatolerance, muinertiaexpansion, mupexsisafeguard, numelectronpexsitolerance, matrixtype, issymbolicfactorize, ordering, rowordering, npsymbfact, verbosity)
Set PEXSI internal options.
subroutine, public cp_pexsi_get_options(pexsi_options, temperature, gap, deltae, numpole, isinertiacount, maxpexsiiter, mumin0, mumax0, mu0, muinertiatolerance, muinertiaexpansion, mupexsisafeguard, numelectronpexsitolerance, matrixtype, issymbolicfactorize, ordering, rowordering, npsymbfact, verbosity)
Access PEXSI internal options.
subroutine, public cp_pexsi_plan_finalize(plan)
...
integer(kind=c_intptr_t) function, public cp_pexsi_plan_initialize(comm, numprocrow, numproccol, outputfileindex)
...
Environment storing all data that is needed in order to call the DFT driver of the PEXSI library with...
subroutine, public convert_nspin_cp2k_pexsi(direction, numelectron, matrix_p, matrix_w, kts)
Scale various quantities with factors of 2. This converts spin restricted DFT calculations (PEXSI) to...
integer, parameter, public cp2k_to_pexsi
subroutine, public lib_pexsi_init(pexsi_env, mp_group, nspin)
Initialize PEXSI.
integer, parameter, public pexsi_to_cp2k
subroutine, public lib_pexsi_finalize(pexsi_env)
Release all PEXSI data.
type of a logger, at the moment it contains just a print level starting at which level it should be l...