(git:ba1d7ca)
Loading...
Searching...
No Matches
dm_ls_scf_qs.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 Routines for a linear scaling quickstep SCF run based on the density
10!> matrix, with a focus on the interface between dm_ls_scf and qs
11!> \par History
12!> 2011.04 created [Joost VandeVondele]
13!> \author Joost VandeVondele
14! **************************************************************************************************
18 USE cp_dbcsr_api, ONLY: &
29 USE dm_ls_scf_types, ONLY: ls_cluster_atomic,&
30 ls_cluster_molecular,&
36 USE kinds, ONLY: default_string_length,&
37 dp
41 USE pw_env_types, ONLY: pw_env_get,&
43 USE pw_methods, ONLY: pw_zero
44 USE pw_pool_types, ONLY: pw_pool_p_type,&
46 USE pw_types, ONLY: pw_c1d_gs_type,&
63 USE qs_ks_types, ONLY: qs_ks_did_change,&
72 USE qs_rho_types, ONLY: qs_rho_get,&
78 USE tblite_types, ONLY: tblite_type
79#include "./base/base_uses.f90"
80
81 IMPLICIT NONE
82
83 PRIVATE
84
85 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'dm_ls_scf_qs'
86
90
91CONTAINS
92
93! **************************************************************************************************
94!> \brief create a matrix for use (and as a template) in ls based on a qs template
95!> \param matrix_ls ...
96!> \param matrix_qs ...
97!> \param ls_mstruct ...
98!> \par History
99!> 2011.03 created [Joost VandeVondele]
100!> 2015.09 add support for PAO [Ole Schuett]
101!> \author Joost VandeVondele
102! **************************************************************************************************
103 SUBROUTINE matrix_ls_create(matrix_ls, matrix_qs, ls_mstruct)
104 TYPE(dbcsr_type) :: matrix_ls, matrix_qs
105 TYPE(ls_mstruct_type), INTENT(IN) :: ls_mstruct
106
107 CHARACTER(len=*), PARAMETER :: routinen = 'matrix_ls_create'
108
109 CHARACTER(len=default_string_length) :: name
110 INTEGER :: handle, iatom, imol, jatom, natom, nmol
111 INTEGER, ALLOCATABLE, DIMENSION(:), TARGET :: atom_to_cluster, atom_to_cluster_primus, &
112 clustered_blk_sizes, primus_of_mol
113 INTEGER, DIMENSION(:), POINTER :: clustered_col_dist, clustered_row_dist, &
114 ls_blk_sizes, ls_col_dist, ls_row_dist
115 TYPE(dbcsr_distribution_type) :: ls_dist, ls_dist_clustered
116
117 CALL timeset(routinen, handle)
118
119 ! Defaults -----------------------------------------------------------------------------------
120 CALL dbcsr_get_info(matrix_qs, col_blk_size=ls_blk_sizes, distribution=ls_dist)
121 CALL dbcsr_distribution_hold(ls_dist)
122 CALL dbcsr_distribution_get(ls_dist, row_dist=ls_row_dist, col_dist=ls_col_dist)
123
124 ! PAO ----------------------------------------------------------------------------------------
125 IF (ls_mstruct%do_pao) THEN
126 CALL dbcsr_get_info(ls_mstruct%matrix_A, col_blk_size=ls_blk_sizes)
127 END IF
128
129 ! Clustering ---------------------------------------------------------------------------------
130 SELECT CASE (ls_mstruct%cluster_type)
131 CASE (ls_cluster_atomic)
132 ! do nothing
134 ! create format of the clustered matrix
135 CALL dbcsr_get_info(matrix_qs, nblkrows_total=natom)
136 nmol = maxval(ls_mstruct%atom_to_molecule)
137 ALLOCATE (atom_to_cluster_primus(natom))
138 ALLOCATE (atom_to_cluster(natom))
139 ALLOCATE (primus_of_mol(nmol))
140 DO iatom = 1, natom
141 atom_to_cluster(iatom) = ls_mstruct%atom_to_molecule(iatom)
142 ! the first atom of the molecule is the primus
143 ! if the number of atoms per molecule is independent of system size, this is not a quadratic loop
144 ! it assumes that all atoms of the molecule are consecutive.
145 DO jatom = iatom, 1, -1
146 IF (ls_mstruct%atom_to_molecule(jatom) == atom_to_cluster(iatom)) THEN
147 atom_to_cluster_primus(iatom) = jatom
148 ELSE
149 EXIT
150 END IF
151 END DO
152 primus_of_mol(atom_to_cluster(iatom)) = atom_to_cluster_primus(iatom)
153 END DO
154
155 ! row
156 ALLOCATE (clustered_row_dist(nmol))
157 DO imol = 1, nmol
158 clustered_row_dist(imol) = ls_row_dist(primus_of_mol(imol))
159 END DO
160
161 ! col
162 ALLOCATE (clustered_col_dist(nmol))
163 DO imol = 1, nmol
164 clustered_col_dist(imol) = ls_col_dist(primus_of_mol(imol))
165 END DO
166
167 ALLOCATE (clustered_blk_sizes(nmol))
168 clustered_blk_sizes = 0
169 DO iatom = 1, natom
170 clustered_blk_sizes(atom_to_cluster(iatom)) = clustered_blk_sizes(atom_to_cluster(iatom)) + &
171 ls_blk_sizes(iatom)
172 END DO
173 ls_blk_sizes => clustered_blk_sizes ! redirect pointer
174
175 ! create new distribution
176 CALL dbcsr_distribution_new(ls_dist_clustered, &
177 template=ls_dist, &
178 row_dist=clustered_row_dist, &
179 col_dist=clustered_col_dist, &
180 reuse_arrays=.true.)
181 CALL dbcsr_distribution_release(ls_dist)
182 ls_dist = ls_dist_clustered
183
184 CASE DEFAULT
185 cpabort("Unknown LS cluster type")
186 END SELECT
187
188 ! Create actual matrix -----------------------------------------------------------------------
189 CALL dbcsr_get_info(matrix_qs, name=name)
190 CALL dbcsr_create(matrix_ls, &
191 name=name, &
192 dist=ls_dist, &
193 matrix_type="S", &
194 row_blk_size=ls_blk_sizes, &
195 col_blk_size=ls_blk_sizes)
196 CALL dbcsr_distribution_release(ls_dist)
197 CALL dbcsr_finalize(matrix_ls)
198
199 CALL timestop(handle)
200
201 END SUBROUTINE matrix_ls_create
202
203! **************************************************************************************************
204!> \brief first link to QS, copy a QS matrix to LS matrix
205!> used to isolate QS style matrices from LS style
206!> will be useful for future features (e.g. precision, symmetry, blocking, ...)
207!> \param matrix_ls ...
208!> \param matrix_qs ...
209!> \param ls_mstruct ...
210!> \param covariant ...
211!> \par History
212!> 2010.10 created [Joost VandeVondele]
213!> 2015.09 add support for PAO [Ole Schuett]
214!> \author Joost VandeVondele
215! **************************************************************************************************
216 SUBROUTINE matrix_qs_to_ls(matrix_ls, matrix_qs, ls_mstruct, covariant)
217 TYPE(dbcsr_type) :: matrix_ls, matrix_qs
218 TYPE(ls_mstruct_type), INTENT(IN), TARGET :: ls_mstruct
219 LOGICAL, INTENT(IN) :: covariant
220
221 CHARACTER(len=*), PARAMETER :: routinen = 'matrix_qs_to_ls'
222
223 INTEGER :: handle
224 INTEGER, DIMENSION(:), POINTER :: pao_blk_sizes
225 TYPE(dbcsr_type) :: matrix_pao, matrix_tmp
226 TYPE(dbcsr_type), POINTER :: matrix_trafo
227
228 CALL timeset(routinen, handle)
229
230 IF (.NOT. ls_mstruct%do_pao) THEN
231 CALL matrix_cluster(matrix_ls, matrix_qs, ls_mstruct)
232
233 ELSE ! using pao
234 CALL dbcsr_get_info(ls_mstruct%matrix_A, col_blk_size=pao_blk_sizes)
235 CALL dbcsr_create(matrix_pao, &
236 matrix_type="N", &
237 template=matrix_qs, &
238 row_blk_size=pao_blk_sizes, &
239 col_blk_size=pao_blk_sizes)
240
241 matrix_trafo => ls_mstruct%matrix_A ! contra-variant
242 IF (covariant) matrix_trafo => ls_mstruct%matrix_B ! co-variant
243 CALL dbcsr_create(matrix_tmp, template=matrix_trafo)
244
245 CALL dbcsr_multiply("N", "N", 1.0_dp, matrix_qs, matrix_trafo, 0.0_dp, matrix_tmp)
246 CALL dbcsr_multiply("T", "N", 1.0_dp, matrix_trafo, matrix_tmp, 0.0_dp, matrix_pao)
247 CALL dbcsr_release(matrix_tmp)
248
249 CALL matrix_cluster(matrix_ls, matrix_pao, ls_mstruct)
250 CALL dbcsr_release(matrix_pao)
251 END IF
252
253 CALL timestop(handle)
254
255 END SUBROUTINE matrix_qs_to_ls
256
257! **************************************************************************************************
258!> \brief Performs molecular blocking and reduction to single precision if enabled
259!> \param matrix_out ...
260!> \param matrix_in ...
261!> \param ls_mstruct ...
262!> \author Ole Schuett
263! **************************************************************************************************
264 SUBROUTINE matrix_cluster(matrix_out, matrix_in, ls_mstruct)
265 TYPE(dbcsr_type) :: matrix_out, matrix_in
266 TYPE(ls_mstruct_type), INTENT(IN) :: ls_mstruct
267
268 CHARACTER(len=*), PARAMETER :: routinen = 'matrix_cluster'
269
270 INTEGER :: handle
271 TYPE(dbcsr_type) :: matrix_in_nosym
272
273 CALL timeset(routinen, handle)
274
275 SELECT CASE (ls_mstruct%cluster_type)
276 CASE (ls_cluster_atomic)
277 CALL dbcsr_copy(matrix_out, matrix_in)
278
280 ! desymmetrize the qs matrix
281 CALL dbcsr_create(matrix_in_nosym, template=matrix_in, matrix_type="N")
282 CALL dbcsr_desymmetrize(matrix_in, matrix_in_nosym)
283
284 ! perform the magic complete redistribute copy
285 CALL dbcsr_complete_redistribute(matrix_in_nosym, matrix_out)
286 CALL dbcsr_release(matrix_in_nosym)
287
288 CASE DEFAULT
289 cpabort("Unknown LS cluster type")
290 END SELECT
291
292 CALL timestop(handle)
293
294 END SUBROUTINE matrix_cluster
295
296! **************************************************************************************************
297!> \brief second link to QS, copy a LS matrix to QS matrix
298!> used to isolate QS style matrices from LS style
299!> will be useful for future features (e.g. precision, symmetry, blocking, ...)
300!> \param matrix_qs ...
301!> \param matrix_ls ...
302!> \param ls_mstruct ...
303!> \param covariant ...
304!> \param keep_sparsity will be passed on to dbcsr_copy, by default set to .TRUE.
305!> \par History
306!> 2010.10 created [Joost VandeVondele]
307!> 2015.09 add support for PAO [Ole Schuett]
308!> \author Joost VandeVondele
309! **************************************************************************************************
310 SUBROUTINE matrix_ls_to_qs(matrix_qs, matrix_ls, ls_mstruct, covariant, keep_sparsity)
311 TYPE(dbcsr_type) :: matrix_qs, matrix_ls
312 TYPE(ls_mstruct_type), INTENT(IN), TARGET :: ls_mstruct
313 LOGICAL :: covariant
314 LOGICAL, OPTIONAL :: keep_sparsity
315
316 CHARACTER(len=*), PARAMETER :: routinen = 'matrix_ls_to_qs'
317
318 INTEGER :: handle
319 INTEGER, DIMENSION(:), POINTER :: pao_blk_sizes
320 LOGICAL :: my_keep_sparsity
321 TYPE(dbcsr_type) :: matrix_declustered, matrix_tmp1, &
322 matrix_tmp2
323 TYPE(dbcsr_type), POINTER :: matrix_trafo
324
325 CALL timeset(routinen, handle)
326
327 my_keep_sparsity = .true.
328 IF (PRESENT(keep_sparsity)) THEN
329 my_keep_sparsity = keep_sparsity
330 END IF
331
332 IF (.NOT. ls_mstruct%do_pao) THEN
333 CALL dbcsr_create(matrix_declustered, template=matrix_qs)
334 CALL matrix_decluster(matrix_declustered, matrix_ls, ls_mstruct)
335 CALL dbcsr_copy(matrix_qs, matrix_declustered, keep_sparsity=my_keep_sparsity)
336 CALL dbcsr_release(matrix_declustered)
337
338 ELSE ! using pao
339 CALL dbcsr_get_info(ls_mstruct%matrix_A, col_blk_size=pao_blk_sizes)
340 CALL dbcsr_create(matrix_declustered, &
341 template=matrix_qs, &
342 row_blk_size=pao_blk_sizes, &
343 col_blk_size=pao_blk_sizes)
344
345 CALL matrix_decluster(matrix_declustered, matrix_ls, ls_mstruct)
346
347 matrix_trafo => ls_mstruct%matrix_B ! contra-variant
348 IF (covariant) matrix_trafo => ls_mstruct%matrix_A ! co-variant
349 CALL dbcsr_create(matrix_tmp1, template=matrix_trafo)
350 CALL dbcsr_create(matrix_tmp2, template=matrix_qs)
351 CALL dbcsr_multiply("N", "N", 1.0_dp, matrix_trafo, matrix_declustered, 0.0_dp, matrix_tmp1)
352 CALL dbcsr_multiply("N", "T", 1.0_dp, matrix_tmp1, matrix_trafo, 0.0_dp, matrix_tmp2)
353 CALL dbcsr_copy(matrix_qs, matrix_tmp2, keep_sparsity=my_keep_sparsity)
354 CALL dbcsr_release(matrix_declustered)
355 CALL dbcsr_release(matrix_tmp1)
356 CALL dbcsr_release(matrix_tmp2)
357 END IF
358
359 CALL timestop(handle)
360
361 END SUBROUTINE matrix_ls_to_qs
362
363! **************************************************************************************************
364!> \brief Reverses molecular blocking and reduction to single precision if enabled
365!> \param matrix_out ...
366!> \param matrix_in ...
367!> \param ls_mstruct ...
368!> \author Ole Schuett
369! **************************************************************************************************
370 SUBROUTINE matrix_decluster(matrix_out, matrix_in, ls_mstruct)
371 TYPE(dbcsr_type) :: matrix_out, matrix_in
372 TYPE(ls_mstruct_type), INTENT(IN) :: ls_mstruct
373
374 CHARACTER(len=*), PARAMETER :: routinen = 'matrix_decluster'
375
376 INTEGER :: handle
377
378 CALL timeset(routinen, handle)
379
380 SELECT CASE (ls_mstruct%cluster_type)
381 CASE (ls_cluster_atomic)
382 CALL dbcsr_copy(matrix_out, matrix_in)
383
385 ! perform the magic complete redistribute copy
386 CALL dbcsr_complete_redistribute(matrix_in, matrix_out)
387
388 CASE DEFAULT
389 cpabort("Unknown LS cluster type")
390 END SELECT
391
392 CALL timestop(handle)
393
394 END SUBROUTINE matrix_decluster
395
396! **************************************************************************************************
397!> \brief further required initialization of QS.
398!> Might be factored-out since this seems common code with the other SCF.
399!> \param qs_env ...
400!> \par History
401!> 2010.10 created [Joost VandeVondele]
402!> \author Joost VandeVondele
403! **************************************************************************************************
404 SUBROUTINE ls_scf_init_qs(qs_env)
405 TYPE(qs_environment_type), POINTER :: qs_env
406
407 CHARACTER(len=*), PARAMETER :: routinen = 'ls_scf_init_qs'
408
409 INTEGER :: handle, ispin, nspin, unit_nr
410 TYPE(cp_logger_type), POINTER :: logger
411 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s
412 TYPE(dft_control_type), POINTER :: dft_control
413 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
414 POINTER :: sab_orb
415 TYPE(qs_ks_env_type), POINTER :: ks_env
416
417 NULLIFY (sab_orb)
418 CALL timeset(routinen, handle)
419
420 ! get a useful output_unit
421 logger => cp_get_default_logger()
422 IF (logger%para_env%is_source()) THEN
423 unit_nr = cp_logger_get_default_unit_nr(logger, local=.true.)
424 ELSE
425 unit_nr = -1
426 END IF
427
428 ! get basic quantities from the qs_env
429 CALL get_qs_env(qs_env, dft_control=dft_control, &
430 matrix_s=matrix_s, &
431 matrix_ks=matrix_ks, &
432 ks_env=ks_env, &
433 sab_orb=sab_orb)
434
435 nspin = dft_control%nspins
436
437 ! we might have to create matrix_ks
438 IF (.NOT. ASSOCIATED(matrix_ks)) THEN
439 CALL dbcsr_allocate_matrix_set(matrix_ks, nspin)
440 DO ispin = 1, nspin
441 ALLOCATE (matrix_ks(ispin)%matrix)
442 CALL dbcsr_create(matrix_ks(ispin)%matrix, template=matrix_s(1)%matrix)
443 CALL cp_dbcsr_alloc_block_from_nbl(matrix_ks(ispin)%matrix, sab_orb)
444 CALL dbcsr_set(matrix_ks(ispin)%matrix, 0.0_dp)
445 END DO
446 CALL set_ks_env(ks_env, matrix_ks=matrix_ks)
447 END IF
448
449 CALL timestop(handle)
450
451 END SUBROUTINE ls_scf_init_qs
452
453! **************************************************************************************************
454!> \brief get an atomic initial guess
455!> \param qs_env ...
456!> \param ls_scf_env ...
457!> \param energy ...
458!> \param nonscf ...
459!> \par History
460!> 2012.11 created [Joost VandeVondele]
461!> \author Joost VandeVondele
462! **************************************************************************************************
463 SUBROUTINE ls_scf_qs_atomic_guess(qs_env, ls_scf_env, energy, nonscf)
464 TYPE(qs_environment_type), POINTER :: qs_env
465 TYPE(ls_scf_env_type) :: ls_scf_env
466 REAL(kind=dp) :: energy
467 LOGICAL, INTENT(IN), OPTIONAL :: nonscf
468
469 CHARACTER(len=*), PARAMETER :: routinen = 'ls_scf_qs_atomic_guess'
470
471 INTEGER :: handle, nspin, unit_nr
472 INTEGER, DIMENSION(2) :: nelectron_spin
473 LOGICAL :: do_scf, has_unit_metric
474 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
475 TYPE(cp_logger_type), POINTER :: logger
476 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s, rho_ao
477 TYPE(dft_control_type), POINTER :: dft_control
478 TYPE(mp_para_env_type), POINTER :: para_env
479 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
480 TYPE(qs_energy_type), POINTER :: qs_energy
481 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
482 TYPE(qs_ks_env_type), POINTER :: ks_env
483 TYPE(qs_rho_type), POINTER :: rho
484 TYPE(scf_control_type), POINTER :: scf_control
485
486 CALL timeset(routinen, handle)
487 NULLIFY (rho, rho_ao, scf_control)
488
489 ! get a useful output_unit
490 logger => cp_get_default_logger()
491 IF (logger%para_env%is_source()) THEN
492 unit_nr = cp_logger_get_default_unit_nr(logger, local=.true.)
493 ELSE
494 unit_nr = -1
495 END IF
496
497 ! get basic quantities from the qs_env
498 CALL get_qs_env(qs_env, dft_control=dft_control, &
499 matrix_s=matrix_s, &
500 matrix_ks=matrix_ks, &
501 ks_env=ks_env, &
502 energy=qs_energy, &
503 atomic_kind_set=atomic_kind_set, &
504 qs_kind_set=qs_kind_set, &
505 particle_set=particle_set, &
506 has_unit_metric=has_unit_metric, &
507 para_env=para_env, &
508 nelectron_spin=nelectron_spin, &
509 rho=rho, &
510 scf_control=scf_control)
511
512 CALL qs_rho_get(rho, rho_ao=rho_ao)
513
514 nspin = dft_control%nspins
515 IF (qs_env%harris_method .AND. scf_control%density_guess == external_density_guess) THEN
516 cpabort("EXTERNAL_DENSITY SCF guess is incompatible with HARRIS_METHOD")
517 END IF
518
519 ! create an initial atomic guess
520 IF (dft_control%qs_control%dftb .OR. dft_control%qs_control%semi_empirical .OR. &
521 dft_control%qs_control%xtb) THEN
522 CALL calculate_mopac_dm(rho_ao, matrix_s(1)%matrix, has_unit_metric, &
523 dft_control, particle_set, atomic_kind_set, qs_kind_set, &
524 nspin, nelectron_spin, para_env)
525 ELSE
526 CALL calculate_atomic_block_dm(rho_ao, matrix_s(1)%matrix, atomic_kind_set, qs_kind_set, &
527 nspin, nelectron_spin, unit_nr, para_env)
528 END IF
529
530 do_scf = .true.
531 IF (PRESENT(nonscf)) do_scf = .NOT. nonscf
532 IF (do_scf) THEN
533 IF (scf_control%density_guess == external_density_guess) THEN
534 CALL read_scf_guess_density(qs_env, scf_control%external_density_file_name)
535 ELSE
536 CALL qs_rho_update_rho(rho, qs_env=qs_env)
537 END IF
538 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
539 CALL qs_ks_update_qs_env(qs_env, calculate_forces=.false., just_energy=.false.)
540 CALL ls_scf_tblite_energy(qs_env, qs_energy)
541 energy = qs_energy%total
542 ELSE
543 CALL ls_nonscf_ks(qs_env, ls_scf_env, energy)
544 END IF
545
546 CALL timestop(handle)
547
548 END SUBROUTINE ls_scf_qs_atomic_guess
549
550! **************************************************************************************************
551!> \brief use the density matrix in ls_scf_env to compute the new energy and KS matrix
552!> \param qs_env ...
553!> \param ls_scf_env ...
554!> \param energy_new ...
555!> \param iscf ...
556!> \par History
557!> 2011.04 created [Joost VandeVondele]
558!> 2015.02 added gspace density mixing [Patrick Seewald]
559!> \author Joost VandeVondele
560! **************************************************************************************************
561 SUBROUTINE ls_scf_dm_to_ks(qs_env, ls_scf_env, energy_new, iscf)
562 TYPE(qs_environment_type), POINTER :: qs_env
563 TYPE(ls_scf_env_type) :: ls_scf_env
564 REAL(kind=dp) :: energy_new
565 INTEGER, INTENT(IN) :: iscf
566
567 CHARACTER(len=*), PARAMETER :: routinen = 'ls_scf_dm_to_ks'
568
569 INTEGER :: handle, ispin, nspin, unit_nr
570 TYPE(cp_logger_type), POINTER :: logger
571 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao
572 TYPE(mp_para_env_type), POINTER :: para_env
573 TYPE(qs_energy_type), POINTER :: energy
574 TYPE(qs_rho_type), POINTER :: rho
575
576 NULLIFY (energy, rho, rho_ao)
577 CALL timeset(routinen, handle)
578
579 logger => cp_get_default_logger()
580 IF (logger%para_env%is_source()) THEN
581 unit_nr = cp_logger_get_default_unit_nr(logger, local=.true.)
582 ELSE
583 unit_nr = -1
584 END IF
585
586 nspin = ls_scf_env%nspins
587 CALL get_qs_env(qs_env, para_env=para_env, energy=energy, rho=rho)
588 CALL qs_rho_get(rho, rho_ao=rho_ao)
589
590 ! set the new density matrix
591 DO ispin = 1, nspin
592 CALL matrix_ls_to_qs(rho_ao(ispin)%matrix, ls_scf_env%matrix_p(ispin), &
593 ls_scf_env%ls_mstruct, covariant=.false.)
594 END DO
595
596 ! compute the corresponding KS matrix and new energy, mix density if requested
597 CALL qs_rho_update_rho(rho, qs_env=qs_env)
598 IF (ls_scf_env%do_rho_mixing) THEN
599 IF (ls_scf_env%density_mixing_method == direct_mixing_nr) THEN
600 cpabort("Direct P mixing not implemented in linear scaling SCF. ")
601 END IF
602 IF (ls_scf_env%density_mixing_method >= gspace_mixing_nr) THEN
603 IF (iscf > max(ls_scf_env%mixing_store%nskip_mixing, 1)) THEN
604 CALL gspace_mixing(qs_env, ls_scf_env%density_mixing_method, &
605 ls_scf_env%mixing_store, rho, para_env, &
606 iscf - 1)
607 IF (unit_nr > 0) THEN
608 WRITE (unit_nr, '(A57)') &
609 "*********************************************************"
610 WRITE (unit_nr, '(A13,F5.3,A20,A6,A7,I3)') &
611 " Using ALPHA=", ls_scf_env%mixing_store%alpha, &
612 " to mix rho: method=", ls_scf_env%mixing_store%iter_method, ", iscf=", iscf
613 WRITE (unit_nr, '(A8,F5.3,A6,F5.3,A8)') &
614 " rho_nw=", ls_scf_env%mixing_store%alpha, "*rho + ", &
615 1.0_dp - ls_scf_env%mixing_store%alpha, "*rho_old"
616 WRITE (unit_nr, '(A57)') &
617 "*********************************************************"
618 END IF
619 END IF
620 END IF
621 END IF
622
623 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
624 CALL qs_ks_update_qs_env(qs_env, calculate_forces=.false., &
625 just_energy=.false., print_active=.true.)
626 CALL ls_scf_tblite_energy(qs_env, energy)
627 energy_new = energy%total
628
629 CALL timestop(handle)
630
631 END SUBROUTINE ls_scf_dm_to_ks
632
633! **************************************************************************************************
634!> \brief use the external density in ls_scf_env to compute the new KS matrix
635!> \param qs_env ...
636!> \param ls_scf_env ...
637!> \param energy_new ...
638! **************************************************************************************************
639 SUBROUTINE ls_nonscf_ks(qs_env, ls_scf_env, energy_new)
640 TYPE(qs_environment_type), POINTER :: qs_env
641 TYPE(ls_scf_env_type) :: ls_scf_env
642 REAL(kind=dp) :: energy_new
643
644 CHARACTER(len=*), PARAMETER :: routinen = 'ls_nonscf_ks'
645
646 INTEGER :: handle, ispin, nspin
647 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao
648 TYPE(harris_type), POINTER :: harris_env
649 TYPE(mp_para_env_type), POINTER :: para_env
650 TYPE(qs_energy_type), POINTER :: energy
651 TYPE(qs_rho_type), POINTER :: rho
652
653 NULLIFY (energy, rho, rho_ao)
654 CALL timeset(routinen, handle)
655
656 nspin = ls_scf_env%nspins
657 CALL get_qs_env(qs_env, para_env=para_env, energy=energy, rho=rho)
658 CALL qs_rho_get(rho, rho_ao=rho_ao)
659
660 ! set the new density matrix
661 DO ispin = 1, nspin
662 CALL matrix_ls_to_qs(rho_ao(ispin)%matrix, ls_scf_env%matrix_p(ispin), &
663 ls_scf_env%ls_mstruct, covariant=.false.)
664 END DO
665
666 IF (qs_env%harris_method) THEN
667 CALL get_qs_env(qs_env, harris_env=harris_env)
668 CALL harris_density_update(qs_env, harris_env)
669 END IF
670 ! compute the corresponding KS matrix and new energy
671 CALL qs_rho_update_rho(rho, qs_env=qs_env)
672 IF (ls_scf_env%do_rho_mixing) THEN
673 cpabort("P mixing not implemented in linear scaling NONSCF. ")
674 END IF
675
676 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
677 CALL qs_ks_update_qs_env(qs_env, calculate_forces=.false., &
678 just_energy=.false., print_active=.true.)
679 CALL ls_scf_tblite_energy(qs_env, energy)
680 energy_new = energy%total
681
682 CALL timestop(handle)
683
684 END SUBROUTINE ls_nonscf_ks
685
686! **************************************************************************************************
687!> \brief use the new density matrix in ls_scf_env to compute the new energy
688!> \param qs_env ...
689!> \param ls_scf_env ...
690! **************************************************************************************************
691 SUBROUTINE ls_nonscf_energy(qs_env, ls_scf_env)
692 TYPE(qs_environment_type), POINTER :: qs_env
693 TYPE(ls_scf_env_type) :: ls_scf_env
694
695 CHARACTER(len=*), PARAMETER :: routinen = 'ls_nonscf_energy'
696
697 INTEGER :: handle, ispin, nspin
698 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_h, matrix_ks, rho_ao
699 TYPE(mp_para_env_type), POINTER :: para_env
700 TYPE(qs_energy_type), POINTER :: energy
701 TYPE(qs_rho_type), POINTER :: rho
702
703 NULLIFY (energy, rho, rho_ao)
704 CALL timeset(routinen, handle)
705 IF (qs_env%qmmm) THEN
706 cpabort("NYA")
707 END IF
708
709 nspin = ls_scf_env%nspins
710 CALL get_qs_env(qs_env, para_env=para_env, energy=energy, rho=rho)
711 CALL qs_rho_get(rho, rho_ao=rho_ao)
712
713 ! set the new density matrix
714 DO ispin = 1, nspin
715 CALL matrix_ls_to_qs(rho_ao(ispin)%matrix, ls_scf_env%matrix_p(ispin), &
716 ls_scf_env%ls_mstruct, covariant=.false.)
717 END DO
718
719 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
720
721 ! band energy : Tr(PH)
722 CALL get_qs_env(qs_env, matrix_ks=matrix_ks)
723 CALL calculate_ptrace(matrix_ks, rho_ao, energy%band, nspin, .true.)
724 ! core energy : Tr(Ph)
725 energy%total = energy%total - energy%core
726 CALL get_qs_env(qs_env, matrix_h=matrix_h)
727 CALL calculate_ptrace(matrix_h, rho_ao, energy%core, nspin)
728
729 CALL timestop(handle)
730
731 END SUBROUTINE ls_nonscf_energy
732
733! **************************************************************************************************
734!> \brief update CP2K/tblite total energy after an LS_SCF KS rebuild.
735!> \param qs_env ...
736!> \param energy ...
737! **************************************************************************************************
738 SUBROUTINE ls_scf_tblite_energy(qs_env, energy)
739 TYPE(qs_environment_type), POINTER :: qs_env
740 TYPE(qs_energy_type), POINTER :: energy
741
742 TYPE(dft_control_type), POINTER :: dft_control
743 TYPE(tblite_type), POINTER :: tb
744
745 NULLIFY (dft_control, tb)
746 CALL get_qs_env(qs_env, dft_control=dft_control, tb_tblite=tb)
747
748 IF (dft_control%qs_control%xtb .AND. dft_control%qs_control%xtb_control%do_tblite) THEN
749 cpassert(ASSOCIATED(tb))
750 CALL tb_get_energy(qs_env, tb, energy)
751 END IF
752
753 END SUBROUTINE ls_scf_tblite_energy
754
755! **************************************************************************************************
756!> \brief ...
757!> \param qs_env ...
758!> \param ls_scf_env ...
759!> \param matrix_p_ls ...
760!> \param unit_nr ...
761!> \param title ...
762!> \param stride ...
763! **************************************************************************************************
764 SUBROUTINE write_matrix_to_cube(qs_env, ls_scf_env, matrix_p_ls, unit_nr, title, stride)
765 TYPE(qs_environment_type), POINTER :: qs_env
766 TYPE(ls_scf_env_type) :: ls_scf_env
767 TYPE(dbcsr_type), INTENT(IN) :: matrix_p_ls
768 INTEGER, INTENT(IN) :: unit_nr
769 CHARACTER(LEN=*), INTENT(IN) :: title
770 INTEGER, DIMENSION(:), POINTER :: stride
771
772 CHARACTER(len=*), PARAMETER :: routinen = 'write_matrix_to_cube'
773
774 INTEGER :: handle
775 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks
776 TYPE(dbcsr_type), TARGET :: matrix_p_qs
777 TYPE(particle_list_type), POINTER :: particles
778 TYPE(pw_c1d_gs_type) :: wf_g
779 TYPE(pw_env_type), POINTER :: pw_env
780 TYPE(pw_pool_p_type), DIMENSION(:), POINTER :: pw_pools
781 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
782 TYPE(pw_r3d_rs_type) :: wf_r
783 TYPE(qs_ks_env_type), POINTER :: ks_env
784 TYPE(qs_subsys_type), POINTER :: subsys
785
786 CALL timeset(routinen, handle)
787
788 NULLIFY (ks_env, pw_env, auxbas_pw_pool, pw_pools, particles, subsys, matrix_ks)
789
790 CALL get_qs_env(qs_env, &
791 ks_env=ks_env, &
792 subsys=subsys, &
793 pw_env=pw_env, &
794 matrix_ks=matrix_ks)
795
796 CALL qs_subsys_get(subsys, particles=particles)
797
798 ! convert the density matrix (ls style) to QS style
799 CALL dbcsr_copy(matrix_p_qs, matrix_ks(1)%matrix)
800 CALL dbcsr_set(matrix_p_qs, 0.0_dp) !zero matrix creation
801 CALL matrix_ls_to_qs(matrix_p_qs, matrix_p_ls, ls_scf_env%ls_mstruct, covariant=.false.)
802
803 ! Print total electronic density
804 CALL pw_env_get(pw_env=pw_env, &
805 auxbas_pw_pool=auxbas_pw_pool, &
806 pw_pools=pw_pools)
807 CALL auxbas_pw_pool%create_pw(pw=wf_r)
808 CALL pw_zero(wf_r)
809 CALL auxbas_pw_pool%create_pw(pw=wf_g)
810 CALL pw_zero(wf_g)
811 CALL calculate_rho_elec(matrix_p=matrix_p_qs, &
812 rho=wf_r, &
813 rho_gspace=wf_g, &
814 ks_env=ks_env)
815
816 ! write this to a cube
817 CALL cp_pw_to_cube(wf_r, unit_nr=unit_nr, title=title, &
818 particles=particles, stride=stride)
819
820 !free memory
821 CALL auxbas_pw_pool%give_back_pw(wf_r)
822 CALL auxbas_pw_pool%give_back_pw(wf_g)
823 CALL dbcsr_release(matrix_p_qs)
824
825 CALL timestop(handle)
826
827 END SUBROUTINE write_matrix_to_cube
828
829! **************************************************************************************************
830!> \brief Initialize g-space density mixing
831!> \param qs_env ...
832!> \param ls_scf_env ...
833! **************************************************************************************************
834 SUBROUTINE rho_mixing_ls_init(qs_env, ls_scf_env)
835 TYPE(qs_environment_type), POINTER :: qs_env
836 TYPE(ls_scf_env_type) :: ls_scf_env
837
838 CHARACTER(len=*), PARAMETER :: routinen = 'rho_mixing_ls_init'
839
840 INTEGER :: handle
841 TYPE(dft_control_type), POINTER :: dft_control
842 TYPE(qs_rho_type), POINTER :: rho
843 TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho_atom
844
845 CALL timeset(routinen, handle)
846
847 CALL get_qs_env(qs_env, dft_control=dft_control, rho=rho)
848
849 CALL mixing_allocate(qs_env, ls_scf_env%density_mixing_method, nspins=ls_scf_env%nspins, &
850 mixing_store=ls_scf_env%mixing_store)
851 IF (ls_scf_env%density_mixing_method >= gspace_mixing_nr) THEN
852 IF (dft_control%qs_control%gapw) THEN
853 CALL get_qs_env(qs_env, rho_atom_set=rho_atom)
854 CALL mixing_init(ls_scf_env%density_mixing_method, rho, ls_scf_env%mixing_store, &
855 ls_scf_env%para_env, rho_atom=rho_atom)
856 ELSE IF (dft_control%qs_control%dftb .OR. dft_control%qs_control%xtb) THEN
857 CALL charge_mixing_init(ls_scf_env%mixing_store)
858 ELSE IF (dft_control%qs_control%semi_empirical) THEN
859 cpabort('SE Code not possible')
860 ELSE
861 CALL mixing_init(ls_scf_env%density_mixing_method, rho, ls_scf_env%mixing_store, &
862 ls_scf_env%para_env)
863 END IF
864 END IF
865 CALL timestop(handle)
866 END SUBROUTINE rho_mixing_ls_init
867
868END MODULE dm_ls_scf_qs
Define the atomic kind types and their sub types.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_distribution_release(dist)
...
subroutine, public dbcsr_distribution_new(dist, template, group, pgrid, row_dist, col_dist, reuse_arrays)
...
subroutine, public dbcsr_distribution_hold(dist)
...
subroutine, public dbcsr_desymmetrize(matrix_a, matrix_b)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_multiply(transa, transb, alpha, matrix_a, matrix_b, beta, matrix_c, first_row, last_row, first_column, last_column, first_k, last_k, retain_sparsity, filter_eps, flop)
...
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
subroutine, public dbcsr_finalize(matrix)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_complete_redistribute(matrix, redist)
...
subroutine, public dbcsr_distribution_get(dist, row_dist, col_dist, nrows, ncols, has_threads, group, mynode, numnodes, nprows, npcols, myprow, mypcol, pgrid, subgroups_defined, prow_group, pcol_group)
...
DBCSR operations in CP2K.
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
A wrapper around pw_to_cube() which accepts particle_list_type.
subroutine, public cp_pw_to_cube(pw, unit_nr, title, particles, zeff, stride, max_file_size_mb, zero_tails, silent, mpi_io)
...
Routines for a linear scaling quickstep SCF run based on the density matrix, with a focus on the inte...
subroutine, public ls_scf_qs_atomic_guess(qs_env, ls_scf_env, energy, nonscf)
get an atomic initial guess
subroutine, public ls_nonscf_ks(qs_env, ls_scf_env, energy_new)
use the external density in ls_scf_env to compute the new KS matrix
subroutine, public matrix_ls_to_qs(matrix_qs, matrix_ls, ls_mstruct, covariant, keep_sparsity)
second link to QS, copy a LS matrix to QS matrix used to isolate QS style matrices from LS style will...
subroutine, public matrix_decluster(matrix_out, matrix_in, ls_mstruct)
Reverses molecular blocking and reduction to single precision if enabled.
subroutine, public ls_scf_dm_to_ks(qs_env, ls_scf_env, energy_new, iscf)
use the density matrix in ls_scf_env to compute the new energy and KS matrix
subroutine, public write_matrix_to_cube(qs_env, ls_scf_env, matrix_p_ls, unit_nr, title, stride)
...
subroutine, public rho_mixing_ls_init(qs_env, ls_scf_env)
Initialize g-space density mixing.
subroutine, public ls_nonscf_energy(qs_env, ls_scf_env)
use the new density matrix in ls_scf_env to compute the new energy
subroutine, public matrix_ls_create(matrix_ls, matrix_qs, ls_mstruct)
create a matrix for use (and as a template) in ls based on a qs template
subroutine, public matrix_qs_to_ls(matrix_ls, matrix_qs, ls_mstruct, covariant)
first link to QS, copy a QS matrix to LS matrix used to isolate QS style matrices from LS style will ...
subroutine, public ls_scf_init_qs(qs_env)
further required initialization of QS. Might be factored-out since this seems common code with the ot...
Types needed for a linear scaling quickstep SCF run based on the density matrix.
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public external_density_guess
integer, parameter, public ls_cluster_molecular
integer, parameter, public ls_cluster_atomic
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
Interface to the message passing library MPI.
represent a simple array based list of the given type
Define the data structure for the particle information.
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Routine to return block diagonal density matrix. Blocks correspond to the atomic densities.
subroutine, public calculate_atomic_block_dm(pmatrix, matrix_s, atomic_kind_set, qs_kind_set, nspin, nelectron_spin, ounit, para_env)
returns a block diagonal density matrix. Blocks correspond to the atomic densities.
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public calculate_rho_elec(matrix_p, matrix_p_kp, rho, rho_gspace, total_rho, ks_env, soft_valid, compute_tau, compute_grad, basis_type, der_type, idir, task_list_external, pw_env_external)
computes the density corresponding to a given density matrix on the grid
Calculation of the energies concerning the core charge distribution.
module that contains the definitions of the scf types
integer, parameter, public direct_mixing_nr
integer, parameter, public gspace_mixing_nr
Perform a QUICKSTEP wavefunction optimization (single point)
Definition qs_energy.F:14
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.
Routines to handle an external density The external density can be generic and is provided by user in...
subroutine, public read_scf_guess_density(qs_env, filename)
Read a cube density for one-time use as the first SCF input density.
subroutine, public gspace_mixing(qs_env, mixing_method, mixing_store, rho, para_env, iter_count)
Driver for the g-space mixing, calls the proper routine given the requested method.
Types needed for a for a Harris model calculation.
Harris method environment setup and handling.
subroutine, public harris_density_update(qs_env, harris_env)
...
Routines to somehow generate an initial guess.
subroutine, public calculate_mopac_dm(pmat, matrix_s, has_unit_metric, dft_control, particle_set, atomic_kind_set, qs_kind_set, nspin, nelectron_spin, para_env)
returns a block diagonal density matrix. Blocks correspond to the mopac initial guess.
Define the quickstep kind type and their sub types.
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
subroutine, public qs_ks_update_qs_env(qs_env, calculate_forces, just_energy, print_active)
updates the Kohn Sham matrix of the given qs_env (facility method)
subroutine, public set_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, exc_accint, potential_changed, forces_up_to_date, complex_ks, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, kinetic, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_vhxc, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_ks_im_kp, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, vee, neighbor_list_id, kpoints, sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, task_list, task_list_soft, subsys, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env)
...
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...
elemental subroutine, public charge_mixing_init(mixing_store)
initialiation needed when charge mixing is used
subroutine, public mixing_init(mixing_method, rho, mixing_store, para_env, rho_atom)
initialiation needed when gspace mixing is used
subroutine, public mixing_allocate(qs_env, mixing_method, p_mix_new, p_delta, nspins, mixing_store)
allocation needed when density mixing is used
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...
types that represent a quickstep subsys
subroutine, public qs_subsys_get(subsys, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell, cell_ref, use_ref_cell, energy, force, qs_kind_set, cp_subsys, nelectron_total, nelectron_spin)
...
parameters that control an scf iteration
interface to tblite
subroutine, public tb_get_energy(qs_env, tb, energy)
...
types for tblite
Provides all information about an atomic kind.
type of a logger, at the moment it contains just a print level starting at which level it should be l...
stores all the informations relevant to an mpi environment
contained for different pw related things
to create arrays of pools
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Contains information on the Harris method.
Provides all information about a quickstep kind.
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...
keeps the density in various representations, keeping track of which ones are valid.