(git:5e7fe52)
Loading...
Searching...
No Matches
qs_kpoint_state.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Methods for preparing and committing k-point orbital states to the QS environment.
10! **************************************************************************************************
14 USE cp_cfm_diag, ONLY: cp_cfm_geeig,&
16 USE cp_cfm_types, ONLY: cp_cfm_create,&
22 USE cp_dbcsr_api, ONLY: dbcsr_p_type
26 USE cp_fm_types, ONLY: cp_fm_create,&
33 USE kinds, ONLY: dp
37 USE kpoint_types, ONLY: get_kpoint_info,&
40 USE mathconstants, ONLY: z_one,&
41 z_zero
47 USE qs_mo_types, ONLY: get_mo_set,&
51 USE qs_rho_types, ONLY: qs_rho_get,&
55#include "./base/base_uses.f90"
56
57 IMPLICIT NONE
58 PRIVATE
59
60 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_kpoint_state'
61
65
66CONTAINS
67
68! **************************************************************************************************
69!> \brief Reconstructs fixed-rank complex k-point orbitals from a density kernel.
70!> The density and overlap must first be transferred to kp%ot_hmat and kp%ot_smat. The
71!> largest natural-orbital subspace gives a metric-defined fixed-rank projector without
72!> replacing the guess by the ground-state projector of its initial Hamiltonian.
73!> \param kpoints K-point environment containing the transferred density and overlap matrices.
74! **************************************************************************************************
76 TYPE(kpoint_type), POINTER :: kpoints
77
78 INTEGER :: ikpoint_local, ispin, nao, nmo, nocc
79 LOGICAL :: use_real_wfn
80 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: density_eigenvalues
81 TYPE(cp_cfm_type) :: density_metric, density_work, matrix_p, &
82 matrix_s, matrix_s_work, projected
83 TYPE(cp_fm_struct_type), POINTER :: active_struct, square_struct
84 TYPE(cp_fm_type) :: active_im, active_re
85 TYPE(cp_fm_type), POINTER :: mo_coeff_im, mo_coeff_re
86 TYPE(kpoint_env_type), POINTER :: kp
87
88 NULLIFY (active_struct, kp, mo_coeff_im, mo_coeff_re, square_struct)
89
90 cpassert(ASSOCIATED(kpoints))
91 cpassert(ASSOCIATED(kpoints%kp_env))
92 CALL get_kpoint_info(kpoints, use_real_wfn=use_real_wfn)
93 IF (use_real_wfn) THEN
94 cpabort("Fixed-density k-point OT initialization requires complex wavefunctions.")
95 END IF
96
97 DO ikpoint_local = 1, SIZE(kpoints%kp_env)
98 kp => kpoints%kp_env(ikpoint_local)%kpoint_env
99 cpassert(ASSOCIATED(kp))
100 cpassert(ASSOCIATED(kp%mos))
101 cpassert(ASSOCIATED(kp%ot_hmat))
102 cpassert(ASSOCIATED(kp%ot_smat))
103 cpassert(SIZE(kp%ot_hmat, 1) >= 2)
104 cpassert(SIZE(kp%ot_hmat, 2) >= SIZE(kp%mos, 2))
105 cpassert(SIZE(kp%ot_smat) >= 2)
106
107 CALL cp_fm_get_info(kp%ot_hmat(1, 1), matrix_struct=square_struct, nrow_global=nao)
108 CALL cp_cfm_create(matrix_p, square_struct, name="natural-orbital density P(k)")
109 CALL cp_cfm_create(matrix_s, square_struct, name="natural-orbital overlap S(k)")
110 CALL cp_fm_to_cfm(kp%ot_smat(1), kp%ot_smat(2), matrix_s)
111
112 DO ispin = 1, SIZE(kp%mos, 2)
113 CALL get_mo_set(kp%mos(1, ispin), homo=nocc, mo_coeff=mo_coeff_re, nmo=nmo)
114 CALL get_mo_set(kp%mos(2, ispin), mo_coeff=mo_coeff_im)
115 cpassert(ASSOCIATED(mo_coeff_re))
116 cpassert(ASSOCIATED(mo_coeff_im))
117 cpassert(nocc >= 1 .AND. nocc <= nmo)
118
119 CALL cp_fm_struct_create(active_struct, template_fmstruct=mo_coeff_re%matrix_struct, &
120 ncol_global=nocc)
121 CALL cp_fm_to_cfm(kp%ot_hmat(1, ispin), kp%ot_hmat(2, ispin), matrix_p)
122 CALL cp_cfm_create(projected, active_struct, name="fixed-density natural orbitals")
123 CALL cp_cfm_create(density_metric, square_struct, name="natural-orbital metric")
124 CALL cp_cfm_create(density_work, square_struct, name="natural-orbital work")
125 CALL cp_cfm_create(matrix_s_work, square_struct, name="natural-orbital overlap work")
126
127 ! The largest eigenvectors of S*P*S*C = S*C*n are the natural orbitals of
128 ! S**(1/2)*P*S**(1/2). Negating the left-hand side lets the generalized
129 ! eigensolver request only its lowest nocc eigenpairs when supported.
130 CALL cp_cfm_gemm('N', 'N', nao, nao, nao, z_one, matrix_p, matrix_s, &
131 z_zero, density_work)
132 CALL cp_cfm_gemm('N', 'N', nao, nao, nao, z_one, matrix_s, density_work, &
133 z_zero, density_metric)
134 CALL cp_cfm_scale(-z_one, density_metric)
135 CALL cp_cfm_to_cfm(matrix_s, matrix_s_work)
136 ALLOCATE (density_eigenvalues(nocc))
137 CALL cp_cfm_geeig(density_metric, matrix_s_work, projected, &
138 density_eigenvalues, density_work, lowest_subset=.true.)
139 DEALLOCATE (density_eigenvalues)
140
141 CALL cp_fm_create(active_re, active_struct, name="fixed-density orbitals real")
142 CALL cp_fm_create(active_im, active_struct, name="fixed-density orbitals imaginary")
143 CALL cp_cfm_to_fm(projected, active_re, active_im)
144 CALL cp_fm_set_all(mo_coeff_re, 0.0_dp)
145 CALL cp_fm_set_all(mo_coeff_im, 0.0_dp)
146 CALL cp_fm_to_fm(active_re, mo_coeff_re, nocc)
147 CALL cp_fm_to_fm(active_im, mo_coeff_im, nocc)
148
149 CALL cp_fm_release(active_im)
150 CALL cp_fm_release(active_re)
151 CALL cp_cfm_release(matrix_s_work)
152 CALL cp_cfm_release(density_work)
153 CALL cp_cfm_release(density_metric)
154 CALL cp_cfm_release(projected)
155 CALL cp_fm_struct_release(active_struct)
156 END DO
157
158 CALL cp_cfm_release(matrix_s)
159 CALL cp_cfm_release(matrix_p)
160 END DO
161
163
164! **************************************************************************************************
165!> \brief Rotates a uniformly occupied k-point subspace into Ritz states of the current
166!> Hamiltonian and stores their energy labels. The Hamiltonian must first be transferred
167!> to kp%ot_hmat. Since the rotation is internal to a uniformly occupied subspace, it does
168!> not change the density represented by the orbitals.
169!> \param kpoints K-point environment containing the orbitals and transferred Hamiltonians.
170! **************************************************************************************************
172 TYPE(kpoint_type), POINTER :: kpoints
173
174 INTEGER :: ikpoint_local, ispin, nao, nmo, nocc
175 LOGICAL :: use_real_wfn
176 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: ritz_values
177 REAL(kind=dp), DIMENSION(:), POINTER :: eigenvalues_im, eigenvalues_re
178 TYPE(cp_cfm_type) :: coeff, eigenvectors, hblock, hc, &
179 matrix_h, rotated
180 TYPE(cp_fm_struct_type), POINTER :: active_struct, square_struct
181 TYPE(cp_fm_type) :: active_im, active_re
182 TYPE(cp_fm_type), POINTER :: mo_coeff_im, mo_coeff_re
183 TYPE(kpoint_env_type), POINTER :: kp
184
185 NULLIFY (active_struct, eigenvalues_im, eigenvalues_re, kp, mo_coeff_im, mo_coeff_re, &
186 square_struct)
187
188 cpassert(ASSOCIATED(kpoints))
189 cpassert(ASSOCIATED(kpoints%kp_env))
190 CALL get_kpoint_info(kpoints, use_real_wfn=use_real_wfn)
191 IF (use_real_wfn) THEN
192 cpabort("Fixed-density k-point OT canonicalization requires complex wavefunctions.")
193 END IF
194
195 DO ikpoint_local = 1, SIZE(kpoints%kp_env)
196 kp => kpoints%kp_env(ikpoint_local)%kpoint_env
197 cpassert(ASSOCIATED(kp))
198 cpassert(ASSOCIATED(kp%mos))
199 cpassert(ASSOCIATED(kp%ot_hmat))
200 cpassert(SIZE(kp%ot_hmat, 1) >= 2)
201 cpassert(SIZE(kp%ot_hmat, 2) >= SIZE(kp%mos, 2))
202
203 CALL cp_fm_get_info(kp%ot_hmat(1, 1), matrix_struct=square_struct, nrow_global=nao)
204 CALL cp_cfm_create(matrix_h, square_struct, name="fixed-density Ritz Hamiltonian")
205
206 DO ispin = 1, SIZE(kp%mos, 2)
207 CALL get_mo_set(kp%mos(1, ispin), homo=nocc, mo_coeff=mo_coeff_re, nmo=nmo, &
208 eigenvalues=eigenvalues_re)
209 CALL get_mo_set(kp%mos(2, ispin), mo_coeff=mo_coeff_im, &
210 eigenvalues=eigenvalues_im)
211 cpassert(ASSOCIATED(mo_coeff_re))
212 cpassert(ASSOCIATED(mo_coeff_im))
213 cpassert(ASSOCIATED(eigenvalues_re))
214 cpassert(ASSOCIATED(eigenvalues_im))
215 cpassert(nocc >= 1 .AND. nocc <= nmo)
216 cpassert(SIZE(eigenvalues_re) >= nocc)
217 cpassert(SIZE(eigenvalues_im) >= nocc)
218
219 CALL cp_fm_struct_create(active_struct, template_fmstruct=mo_coeff_re%matrix_struct, &
220 ncol_global=nocc)
221 CALL cp_fm_create(active_re, active_struct, name="fixed-density Ritz orbitals real")
222 CALL cp_fm_create(active_im, active_struct, name="fixed-density Ritz orbitals imaginary")
223 CALL cp_fm_to_fm(mo_coeff_re, active_re, nocc)
224 CALL cp_fm_to_fm(mo_coeff_im, active_im, nocc)
225
226 CALL cp_cfm_create(coeff, active_struct, name="fixed-density Ritz orbitals")
227 CALL cp_cfm_create(hc, active_struct, name="fixed-density Ritz HC")
228 CALL cp_cfm_create(rotated, active_struct, name="fixed-density Ritz rotated orbitals")
229 CALL cp_cfm_create(hblock, active_struct, nrow=nocc, ncol=nocc, &
230 name="fixed-density projected Hamiltonian")
231 CALL cp_cfm_create(eigenvectors, active_struct, nrow=nocc, ncol=nocc, &
232 name="fixed-density Ritz eigenvectors")
233 CALL cp_fm_to_cfm(kp%ot_hmat(1, ispin), kp%ot_hmat(2, ispin), matrix_h)
234 CALL cp_fm_to_cfm(active_re, active_im, coeff)
235
236 CALL cp_cfm_gemm('N', 'N', nao, nocc, nao, z_one, matrix_h, coeff, z_zero, hc)
237 CALL cp_cfm_gemm('C', 'N', nocc, nocc, nao, z_one, coeff, hc, z_zero, hblock)
238 ALLOCATE (ritz_values(nocc))
239 CALL cp_cfm_heevd(hblock, eigenvectors, ritz_values)
240 CALL cp_cfm_gemm('N', 'N', nao, nocc, nocc, z_one, coeff, eigenvectors, &
241 z_zero, rotated)
242 CALL cp_cfm_to_fm(rotated, active_re, active_im)
243 CALL cp_fm_to_fm(active_re, mo_coeff_re, nocc)
244 CALL cp_fm_to_fm(active_im, mo_coeff_im, nocc)
245 eigenvalues_re(1:nocc) = ritz_values
246 eigenvalues_im(1:nocc) = ritz_values
247 DEALLOCATE (ritz_values)
248
249 CALL cp_cfm_release(eigenvectors)
250 CALL cp_cfm_release(hblock)
251 CALL cp_cfm_release(rotated)
252 CALL cp_cfm_release(hc)
253 CALL cp_cfm_release(coeff)
254 CALL cp_fm_release(active_im)
255 CALL cp_fm_release(active_re)
256 CALL cp_fm_struct_release(active_struct)
257 END DO
258
259 CALL cp_cfm_release(matrix_h)
260 END DO
261
263
264! **************************************************************************************************
265!> \brief Rebuilds the physical density from the current k-point orbitals and occupations.
266!> \param qs_env QS environment containing the orbital state to commit.
267!> \param update_occupations Recompute occupations from the current MO energies and SCF settings.
268!> \param separate_spin_occupations Fill restricted energy channels independently.
269!> \param fixed_occupations Restore the fixed occupied rank required by OT.
270! **************************************************************************************************
271 SUBROUTINE qs_kpoint_state_commit(qs_env, update_occupations, &
272 separate_spin_occupations, fixed_occupations)
273 TYPE(qs_environment_type), POINTER :: qs_env
274 LOGICAL, INTENT(IN) :: update_occupations
275 LOGICAL, INTENT(IN), OPTIONAL :: separate_spin_occupations, &
276 fixed_occupations
277
278 INTEGER :: ispin
279 LOGICAL :: fixed, separate_spins
280 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_s_kp, rho_ao_kp
281 TYPE(kpoint_type), POINTER :: kpoints
282 TYPE(mo_set_type), DIMENSION(:, :), POINTER :: mos
283 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
284 POINTER :: sab_nl
285 TYPE(qs_energy_type), POINTER :: energy
286 TYPE(qs_rho_type), POINTER :: rho
287 TYPE(qs_scf_env_type), POINTER :: scf_env
288 TYPE(scf_control_type), POINTER :: scf_control
289
290 NULLIFY (energy, kpoints, matrix_s_kp, mos, rho_ao_kp, sab_nl, rho, scf_env, scf_control)
291
292 fixed = .false.
293 separate_spins = .false.
294 IF (PRESENT(fixed_occupations)) fixed = fixed_occupations
295 IF (PRESENT(separate_spin_occupations)) separate_spins = separate_spin_occupations
296 IF (fixed .AND. .NOT. update_occupations) THEN
297 cpabort("Fixed occupations can only be requested while updating occupations.")
298 END IF
299
300 CALL get_qs_env(qs_env, kpoints=kpoints, matrix_s_kp=matrix_s_kp, &
301 energy=energy, rho=rho, scf_env=scf_env, scf_control=scf_control)
302 CALL get_kpoint_info(kpoints, sab_nl=sab_nl)
303
304 IF (update_occupations) THEN
306 kpoints, scf_control%smear, separate_spin_occupations=separate_spins)
307 IF (fixed) CALL qs_kpoint_set_fixed_occupations(kpoints)
308 END IF
309 CALL kpoint_density_matrices(kpoints)
310 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp)
311 CALL kpoint_density_transform(kpoints, rho_ao_kp, .false., &
312 matrix_s_kp(1, 1)%matrix, sab_nl, scf_env%scf_work1, &
313 overlap_rs=matrix_s_kp)
314 CALL qs_rho_update_rho(rho, qs_env=qs_env)
315 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
316
317 energy%kTS = 0.0_dp
318 energy%efermi = 0.0_dp
319 mos => kpoints%kp_env(1)%kpoint_env%mos
320 cpassert(ASSOCIATED(mos))
321 DO ispin = 1, SIZE(mos, 2)
322 energy%kTS = energy%kTS + mos(1, ispin)%kTS
323 energy%efermi = energy%efermi + mos(1, ispin)%mu
324 END DO
325 energy%efermi = energy%efermi/real(SIZE(mos, 2), kind=dp)
326
327 END SUBROUTINE qs_kpoint_state_commit
328
329! **************************************************************************************************
330!> \brief Checks whether every local k-point channel contains nonzero occupied orbitals.
331!> \param kpoints K-point environment.
332!> \param require_full_space Require every available orbital instead of the occupied block.
333!> \return True if every channel contains a nonzero real or imaginary coefficient.
334! **************************************************************************************************
335 FUNCTION qs_kpoint_mos_initialized(kpoints, require_full_space) RESULT(initialized)
336 TYPE(kpoint_type), POINTER :: kpoints
337 LOGICAL, INTENT(IN), OPTIONAL :: require_full_space
338 LOGICAL :: initialized
339
340 INTEGER :: icomponent, ikpoint_local, ispin, &
341 nactive, nmo, nocc
342 LOGICAL :: full_space
343 REAL(kind=dp) :: coefficient_norm
344 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: column_norm, component_norm
345 TYPE(cp_fm_type), POINTER :: mo_coeff
346 TYPE(kpoint_env_type), POINTER :: kp
347 TYPE(mp_para_env_type), POINTER :: para_env
348
349 NULLIFY (kp, mo_coeff, para_env)
350 cpassert(ASSOCIATED(kpoints))
351 cpassert(ASSOCIATED(kpoints%kp_env))
352
353 full_space = .false.
354 IF (PRESENT(require_full_space)) full_space = require_full_space
355 coefficient_norm = huge(1.0_dp)
356 DO ikpoint_local = 1, SIZE(kpoints%kp_env)
357 kp => kpoints%kp_env(ikpoint_local)%kpoint_env
358 cpassert(ASSOCIATED(kp))
359 cpassert(ASSOCIATED(kp%mos))
360 DO ispin = 1, SIZE(kp%mos, 2)
361 CALL get_mo_set(kp%mos(1, ispin), homo=nocc, mo_coeff=mo_coeff, nmo=nmo)
362 cpassert(ASSOCIATED(mo_coeff))
363 nactive = merge(nmo, nocc, full_space)
364 IF (nactive < 1 .OR. nactive > nmo) THEN
365 coefficient_norm = 0.0_dp
366 cycle
367 END IF
368 ALLOCATE (column_norm(nmo), component_norm(nmo))
369 column_norm(:) = 0.0_dp
370 DO icomponent = 1, SIZE(kp%mos, 1)
371 CALL get_mo_set(kp%mos(icomponent, ispin), mo_coeff=mo_coeff)
372 cpassert(ASSOCIATED(mo_coeff))
373 CALL cp_fm_vectorsnorm(mo_coeff, component_norm)
374 column_norm(:) = column_norm(:) + component_norm(:)**2
375 END DO
376 coefficient_norm = min(coefficient_norm, sqrt(minval(column_norm(1:nactive))))
377 DEALLOCATE (column_norm, component_norm)
378 END DO
379 END DO
380
381 CALL get_kpoint_info(kpoints, para_env=para_env)
382 cpassert(ASSOCIATED(para_env))
383 CALL para_env%min(coefficient_norm)
384 initialized = coefficient_norm > 100.0_dp*epsilon(1.0_dp)
385
386 END FUNCTION qs_kpoint_mos_initialized
387
388! **************************************************************************************************
389!> \brief Copies the first k-point spin channel into the remaining channels.
390!> \param kpoints K-point environment.
391!> \param nspin Number of spin channels to populate.
392! **************************************************************************************************
393 SUBROUTINE qs_kpoint_copy_spin_mos(kpoints, nspin)
394 TYPE(kpoint_type), POINTER :: kpoints
395 INTEGER, INTENT(IN) :: nspin
396
397 INTEGER :: icomponent, ikpoint_local, ispin
398 REAL(kind=dp), DIMENSION(:), POINTER :: eigenvalues_source, eigenvalues_target
399 TYPE(cp_fm_type), POINTER :: mo_coeff_source, mo_coeff_target
400 TYPE(kpoint_env_type), POINTER :: kp
401
402 NULLIFY (eigenvalues_source, eigenvalues_target, kp, mo_coeff_source, mo_coeff_target)
403 cpassert(ASSOCIATED(kpoints))
404 cpassert(ASSOCIATED(kpoints%kp_env))
405 cpassert(nspin >= 1)
406
407 DO ikpoint_local = 1, SIZE(kpoints%kp_env)
408 kp => kpoints%kp_env(ikpoint_local)%kpoint_env
409 cpassert(ASSOCIATED(kp))
410 cpassert(ASSOCIATED(kp%mos))
411 cpassert(SIZE(kp%mos, 2) >= nspin)
412 DO icomponent = 1, SIZE(kp%mos, 1)
413 CALL get_mo_set(kp%mos(icomponent, 1), mo_coeff=mo_coeff_source, &
414 eigenvalues=eigenvalues_source)
415 cpassert(ASSOCIATED(mo_coeff_source))
416 cpassert(ASSOCIATED(eigenvalues_source))
417 DO ispin = 2, nspin
418 CALL get_mo_set(kp%mos(icomponent, ispin), mo_coeff=mo_coeff_target, &
419 eigenvalues=eigenvalues_target)
420 cpassert(ASSOCIATED(mo_coeff_target))
421 cpassert(ASSOCIATED(eigenvalues_target))
422 CALL cp_fm_to_fm(mo_coeff_source, mo_coeff_target)
423 eigenvalues_target(:) = eigenvalues_source(:)
424 END DO
425 END DO
426 END DO
427
428 END SUBROUTINE qs_kpoint_copy_spin_mos
429
430! **************************************************************************************************
431!> \brief Restores the fixed occupied rank required by k-point OT.
432!> \param kpoints K-point environment.
433! **************************************************************************************************
434 SUBROUTINE qs_kpoint_set_fixed_occupations(kpoints)
435 TYPE(kpoint_type), POINTER :: kpoints
436
437 INTEGER :: icomponent, ikpoint_local, ispin, &
438 nelectron, nmo, nocc
439 REAL(kind=dp) :: maxocc
440 REAL(kind=dp), DIMENSION(:), POINTER :: occupation_numbers
441 TYPE(kpoint_env_type), POINTER :: kp
442
443 NULLIFY (kp, occupation_numbers)
444 cpassert(ASSOCIATED(kpoints))
445 cpassert(ASSOCIATED(kpoints%kp_env))
446
447 DO ikpoint_local = 1, SIZE(kpoints%kp_env)
448 kp => kpoints%kp_env(ikpoint_local)%kpoint_env
449 cpassert(ASSOCIATED(kp))
450 cpassert(ASSOCIATED(kp%mos))
451 DO ispin = 1, SIZE(kp%mos, 2)
452 DO icomponent = 1, SIZE(kp%mos, 1)
453 CALL get_mo_set(kp%mos(icomponent, ispin), homo=nocc, maxocc=maxocc, &
454 nelectron=nelectron, nmo=nmo, occupation_numbers=occupation_numbers)
455 cpassert(ASSOCIATED(occupation_numbers))
456 IF (nocc < 1 .OR. nocc > nmo) THEN
457 cpabort("Fixed-occupation k-point OT requires a nonempty occupied subspace.")
458 END IF
459 IF (abs(maxocc*real(nocc, kind=dp) - real(nelectron, kind=dp)) > &
460 100.0_dp*epsilon(1.0_dp)) THEN
461 cpabort("Fixed-occupation k-point OT requires uniform integer occupations.")
462 END IF
463 occupation_numbers(:) = 0.0_dp
464 occupation_numbers(1:nocc) = maxocc
465 kp%mos(icomponent, ispin)%kTS = 0.0_dp
466 END DO
467 END DO
468 END DO
469
470 END SUBROUTINE qs_kpoint_set_fixed_occupations
471
472END MODULE qs_kpoint_state
Basic linear algebra operations for complex full matrices.
subroutine, public cp_cfm_gemm(transa, transb, m, n, k, alpha, matrix_a, matrix_b, beta, matrix_c, a_first_col, a_first_row, b_first_col, b_first_row, c_first_col, c_first_row)
Performs one of the matrix-matrix operations: matrix_c = alpha * op1( matrix_a ) * op2( matrix_b ) + ...
used for collecting diagonalization schemes available for cp_cfm_type
Definition cp_cfm_diag.F:14
subroutine, public cp_cfm_heevd(matrix, eigenvectors, eigenvalues)
Perform a diagonalisation of a complex matrix.
Definition cp_cfm_diag.F:82
subroutine, public cp_cfm_geeig(amatrix, bmatrix, eigenvectors, eigenvalues, work, lowest_subset)
General Eigenvalue Problem AX = BXE Single option version: Cholesky decomposition of B.
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_release(matrix)
Releases a full matrix.
subroutine, public cp_fm_to_cfm(msourcer, msourcei, mtarget)
Construct a complex full matrix by taking its real and imaginary parts from two separate real-value f...
subroutine, public cp_cfm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
Creates a new full matrix with the given structure.
subroutine, public cp_cfm_to_fm(msource, mtargetr, mtargeti)
Copy real and imaginary parts of a complex full matrix into separate real-value full matrices.
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_vectorsnorm(matrix, norm_array)
find the inorm of each column norm_{j}= sqrt( \sum_{i} A_{ij}*A_{ij} )
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Routines needed for kpoint calculation.
subroutine, public kpoint_density_transform(kpoint, denmat, wtype, tempmat, sab_nl, fmwork, for_aux_fit, pmat_ext, overlap_rs)
generate real space density matrices in DBCSR format
subroutine, public kpoint_set_mo_occupation(kpoint, smear, probe, added_mos_auto, added_mos_auto_grow, separate_spin_occupations)
Given the eigenvalues of all kpoints, calculates the occupation numbers.
subroutine, public kpoint_density_matrices(kpoint, energy_weighted, for_aux_fit)
Calculate kpoint density matrices (rho(k), owned by kpoint groups).
Types and basic routines needed for a kpoint calculation.
subroutine, public get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym, inversion_symmetry_only, symmetry_backend, symmetry_reduction_method, gamma_centered, lattice_fft)
Retrieve information from a kpoint environment.
Definition of mathematical constants and functions.
complex(kind=dp), parameter, public z_one
complex(kind=dp), parameter, public z_zero
Interface to the message passing library MPI.
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_vhxc, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
Methods for preparing and committing k-point orbital states to the QS environment.
subroutine, public qs_kpoint_state_commit(qs_env, update_occupations, separate_spin_occupations, fixed_occupations)
Rebuilds the physical density from the current k-point orbitals and occupations.
subroutine, public qs_kpoint_state_prepare_fixed_density(kpoints)
Reconstructs fixed-rank complex k-point orbitals from a density kernel. The density and overlap must ...
logical function, public qs_kpoint_mos_initialized(kpoints, require_full_space)
Checks whether every local k-point channel contains nonzero occupied orbitals.
subroutine, public qs_kpoint_copy_spin_mos(kpoints, nspin)
Copies the first k-point spin channel into the remaining channels.
subroutine, public qs_kpoint_state_canonicalize_fixed(kpoints)
Rotates a uniformly occupied k-point subspace into Ritz states of the current Hamiltonian and stores ...
subroutine, public qs_ks_did_change(ks_env, s_mstruct_changed, rho_changed, potential_changed, full_reset)
tells that some of the things relevant to the ks calculation did change. has to be called when change...
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
Define the neighbor list data types and the corresponding functionality.
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_update_rho(rho_struct, qs_env, rho_xc_external, local_rho_set, task_list_external, task_list_external_soft, pw_env_external, para_env_external)
updates rho_r and rho_g to the rhorho_ao. if use_kinetic_energy_density also computes tau_r and tau_g...
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
module that contains the definitions of the scf types
parameters that control an scf iteration
Represent a complex full matrix.
keeps the information about the structure of a full matrix
represent a full matrix
Keeps information about a specific k-point.
Contains information about kpoints.
stores all the informations relevant to an mpi environment
keeps the density in various representations, keeping track of which ones are valid.