(git:98357aa)
Loading...
Searching...
No Matches
dm_ls_scf_create.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
11!> \par History
12!> 2010.10 created [Joost VandeVondele]
13!> 2016.11 created from dm_ls_scf to avoid circular dependencies
14!> \author Joost VandeVondele
15! **************************************************************************************************
17 USE bibliography, ONLY: lin2009,&
18 lin2013,&
21 shao2003,&
23 cite_reference
25 USE cp_dbcsr_api, ONLY: dbcsr_p_type
30 USE input_constants, ONLY: &
49 USE kinds, ONLY: dp
50 USE machine, ONLY: m_flush
53 USE pao_main, ONLY: pao_init
62#include "./base/base_uses.f90"
63
64 IMPLICIT NONE
65
66 PRIVATE
67
68 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'dm_ls_scf_create'
69
70 PUBLIC :: ls_scf_create
71
72CONTAINS
73
74! **************************************************************************************************
75!> \brief Creation and basic initialization of the LS type.
76!> \param qs_env ...
77!> \par History
78!> 2012.11 created [Joost VandeVondele]
79!> \author Joost VandeVondele
80! **************************************************************************************************
81 SUBROUTINE ls_scf_create(qs_env)
82 TYPE(qs_environment_type), POINTER :: qs_env
83
84 CHARACTER(len=*), PARAMETER :: routinen = 'ls_scf_create'
85
86 INTEGER :: handle, unit_nr
87 TYPE(cp_logger_type), POINTER :: logger
88 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
89 TYPE(dft_control_type), POINTER :: dft_control
90 TYPE(ls_scf_env_type), POINTER :: ls_scf_env
91 TYPE(molecule_type), DIMENSION(:), POINTER :: molecule_set
92 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
93 TYPE(section_vals_type), POINTER :: input, mixing_section
94
95 NULLIFY (ls_scf_env)
96 CALL get_qs_env(qs_env, ls_scf_env=ls_scf_env)
97 ! we cannot rebuild ls_scf_env for each new optimization. It seems it holds some values
98 ! that need to be save between calls?
99 IF (ASSOCIATED(ls_scf_env)) RETURN
100! IF(ASSOCIATED(ls_scf_env)) THEN
101! CALL ls_scf_release(ls_scf_env)
102! END IF
103
104 CALL timeset(routinen, handle)
105
106 CALL cite_reference(vandevondele2012)
107
108 ! get a useful output_unit
109 logger => cp_get_default_logger()
110 IF (logger%para_env%is_source()) THEN
111 unit_nr = cp_logger_get_default_unit_nr(logger, local=.true.)
112 ELSE
113 unit_nr = -1
114 END IF
115
116 ALLOCATE (ls_scf_env)
117
118 ! get basic quantities from the qs_env
119 CALL get_qs_env(qs_env, nelectron_total=ls_scf_env%nelectron_total, &
120 matrix_s=matrix_s, &
121 dft_control=dft_control, &
122 particle_set=particle_set, &
123 molecule_set=molecule_set, &
124 input=input, &
125 has_unit_metric=ls_scf_env%has_unit_metric, &
126 para_env=ls_scf_env%para_env, &
127 do_transport=ls_scf_env%do_transport, &
128 nelectron_spin=ls_scf_env%nelectron_spin)
129
130 ! copy some basic stuff
131 ls_scf_env%nspins = dft_control%nspins
132 ls_scf_env%natoms = SIZE(particle_set, 1)
133 CALL ls_scf_env%para_env%retain()
134
135 ! initialize block to group to defined molecules
136 ALLOCATE (ls_scf_env%ls_mstruct%atom_to_molecule(ls_scf_env%natoms))
137
138 CALL molecule_of_atom(molecule_set, atom_to_mol=ls_scf_env%ls_mstruct%atom_to_molecule)
139
140 ! parse the ls_scf section and set derived quantities
141 CALL ls_scf_init_read_write_input(input, ls_scf_env, unit_nr)
142 dft_control%qs_control%pao = ls_scf_env%do_pao
143
144 ! set up the buffer for the history of matrices
145 ls_scf_env%scf_history%nstore = ls_scf_env%extrapolation_order
146 ls_scf_env%scf_history%istore = 0
147 ALLOCATE (ls_scf_env%scf_history%matrix(ls_scf_env%nspins, ls_scf_env%scf_history%nstore))
148
149 NULLIFY (ls_scf_env%mixing_store)
150 mixing_section => section_vals_get_subs_vals(input, "DFT%LS_SCF%RHO_MIXING")
151 ALLOCATE (ls_scf_env%mixing_store)
152 CALL mixing_storage_create(ls_scf_env%mixing_store, mixing_section, &
153 ls_scf_env%density_mixing_method, &
154 dft_control%qs_control%cutoff)
155
156 ! initialize PEXSI
157 IF (ls_scf_env%do_pexsi) THEN
158 IF (dft_control%qs_control%eps_filter_matrix /= 0.0_dp) THEN
159 cpabort("EPS_FILTER_MATRIX must be set to 0 for PEXSI.")
160 END IF
161 CALL lib_pexsi_init(ls_scf_env%pexsi, ls_scf_env%para_env, ls_scf_env%nspins)
162 END IF
163
164 ! initialize PAO
165 CALL pao_init(qs_env, ls_scf_env)
166
167 ! put the ls_scf_env in qs_env
168 CALL set_qs_env(qs_env, ls_scf_env=ls_scf_env)
169
170 CALL timestop(handle)
171
172 END SUBROUTINE ls_scf_create
173
174! **************************************************************************************************
175!> \brief parse the input section, no need to pass it around
176!> \param input ...
177!> \param ls_scf_env ...
178!> \param unit_nr ...
179!> \par History
180!> 2010.10 created [Joost VandeVondele]
181!> \author Joost VandeVondele
182! **************************************************************************************************
183 SUBROUTINE ls_scf_init_read_write_input(input, ls_scf_env, unit_nr)
184 TYPE(section_vals_type), POINTER :: input
185 TYPE(ls_scf_env_type), INTENT(INOUT) :: ls_scf_env
186 INTEGER, INTENT(IN) :: unit_nr
187
188 CHARACTER(len=*), PARAMETER :: routinen = 'ls_scf_init_read_write_input'
189
190 INTEGER :: handle
191 REAL(kind=dp) :: mu
192 TYPE(enumeration_type), POINTER :: enum
193 TYPE(keyword_type), POINTER :: keyword
194 TYPE(section_type), POINTER :: section
195 TYPE(section_vals_type), POINTER :: chebyshev_section, curvy_section, &
196 ls_scf_section, mixing_section, &
197 pao_section, pexsi_section
198
199 CALL timeset(routinen, handle)
200 CALL cite_reference(vandevondele2012)
201 ls_scf_section => section_vals_get_subs_vals(input, "DFT%LS_SCF")
202 curvy_section => section_vals_get_subs_vals(ls_scf_section, "CURVY_STEPS")
203
204 ! should come from input
205 CALL section_vals_val_get(ls_scf_section, "LS_DIIS", l_val=ls_scf_env%ls_diis)
206 CALL section_vals_val_get(ls_scf_section, "INI_DIIS", i_val=ls_scf_env%iter_ini_diis)
207 CALL section_vals_val_get(ls_scf_section, "MAX_DIIS", i_val=ls_scf_env%max_diis)
208 CALL section_vals_val_get(ls_scf_section, "NMIXING", i_val=ls_scf_env%nmixing)
209 CALL section_vals_val_get(ls_scf_section, "EPS_DIIS", r_val=ls_scf_env%eps_diis)
210 CALL section_vals_val_get(ls_scf_section, "EPS_SCF", r_val=ls_scf_env%eps_scf)
211 CALL section_vals_val_get(ls_scf_section, "EPS_FILTER", r_val=ls_scf_env%eps_filter)
212 CALL section_vals_val_get(ls_scf_section, "MU", r_val=mu)
213 CALL section_vals_val_get(ls_scf_section, "FIXED_MU", l_val=ls_scf_env%fixed_mu)
214 ls_scf_env%mu_spin = mu
215 CALL section_vals_val_get(ls_scf_section, "MIXING_FRACTION", r_val=ls_scf_env%mixing_fraction)
216 CALL section_vals_val_get(ls_scf_section, "MAX_SCF", i_val=ls_scf_env%max_scf)
217 CALL section_vals_val_get(ls_scf_section, "S_PRECONDITIONER", i_val=ls_scf_env%s_preconditioner_type)
218 CALL section_vals_val_get(ls_scf_section, "MATRIX_CLUSTER_TYPE", i_val=ls_scf_env%ls_mstruct%cluster_type)
219 CALL section_vals_val_get(ls_scf_section, "S_INVERSION", i_val=ls_scf_env%s_inversion_type)
220 CALL section_vals_val_get(ls_scf_section, "CHECK_S_INV", l_val=ls_scf_env%check_s_inv)
221 CALL section_vals_val_get(ls_scf_section, "REPORT_ALL_SPARSITIES", l_val=ls_scf_env%report_all_sparsities)
222 CALL section_vals_val_get(ls_scf_section, "PERFORM_MU_SCAN", l_val=ls_scf_env%perform_mu_scan)
223 CALL section_vals_val_get(ls_scf_section, "PURIFICATION_METHOD", i_val=ls_scf_env%purification_method)
224 CALL section_vals_val_get(ls_scf_section, "SIGN_METHOD", i_val=ls_scf_env%sign_method)
225 CALL section_vals_val_get(ls_scf_section, "SUBMATRIX_SIGN_METHOD", i_val=ls_scf_env%submatrix_sign_method)
226 CALL section_vals_val_get(ls_scf_section, "SIGN_ORDER", i_val=ls_scf_env%sign_order)
227 CALL section_vals_val_get(ls_scf_section, "SIGN_SYMMETRIC", l_val=ls_scf_env%sign_symmetric)
228 CALL section_vals_val_get(ls_scf_section, "DYNAMIC_THRESHOLD", l_val=ls_scf_env%dynamic_threshold)
229 CALL section_vals_val_get(ls_scf_section, "NON_MONOTONIC", l_val=ls_scf_env%non_monotonic)
230 CALL section_vals_val_get(ls_scf_section, "S_SQRT_METHOD", i_val=ls_scf_env%s_sqrt_method)
231 CALL section_vals_val_get(ls_scf_section, "S_SQRT_ORDER", i_val=ls_scf_env%s_sqrt_order)
232 CALL section_vals_val_get(ls_scf_section, "EXTRAPOLATION_ORDER", i_val=ls_scf_env%extrapolation_order)
233 CALL section_vals_val_get(ls_scf_section, "RESTART_READ", l_val=ls_scf_env%restart_read)
234 CALL section_vals_val_get(ls_scf_section, "RESTART_WRITE", l_val=ls_scf_env%restart_write)
235 CALL section_vals_val_get(ls_scf_section, "EPS_LANCZOS", r_val=ls_scf_env%eps_lanczos)
236 CALL section_vals_val_get(ls_scf_section, "MAX_ITER_LANCZOS", i_val=ls_scf_env%max_iter_lanczos)
237
238 CALL section_vals_get(curvy_section, explicit=ls_scf_env%curvy_steps)
239 CALL section_vals_val_get(curvy_section, "LINE_SEARCH", i_val=ls_scf_env%curvy_data%line_search_type)
240 CALL section_vals_val_get(curvy_section, "N_BCH_HISTORY", i_val=ls_scf_env%curvy_data%n_bch_hist)
241 CALL section_vals_val_get(curvy_section, "MIN_HESSIAN_SHIFT", r_val=ls_scf_env%curvy_data%min_shift)
242 CALL section_vals_val_get(curvy_section, "FILTER_FACTOR", r_val=ls_scf_env%curvy_data%filter_factor)
243 CALL section_vals_val_get(curvy_section, "FILTER_FACTOR_SCALE", r_val=ls_scf_env%curvy_data%scale_filter)
244 CALL section_vals_val_get(curvy_section, "MIN_FILTER", r_val=ls_scf_env%curvy_data%min_filter)
245
246 ls_scf_env%extrapolation_order = max(0, ls_scf_env%extrapolation_order)
247
248 chebyshev_section => section_vals_get_subs_vals(input, "DFT%LS_SCF%CHEBYSHEV")
249 CALL section_vals_get(chebyshev_section, explicit=ls_scf_env%chebyshev%compute_chebyshev)
250 IF (ls_scf_env%chebyshev%compute_chebyshev) THEN
251 CALL section_vals_val_get(chebyshev_section, "N_CHEBYSHEV", i_val=ls_scf_env%chebyshev%n_chebyshev)
252 CALL section_vals_val_get(chebyshev_section, "DOS%N_GRIDPOINTS", i_val=ls_scf_env%chebyshev%n_gridpoint_dos)
253
254 ls_scf_env%chebyshev%print_key_dos => &
255 section_vals_get_subs_vals(chebyshev_section, "DOS")
256 CALL section_vals_retain(ls_scf_env%chebyshev%print_key_dos)
257
258 ls_scf_env%chebyshev%print_key_cube => &
259 section_vals_get_subs_vals(chebyshev_section, "PRINT_SPECIFIC_E_DENSITY_CUBE")
260 CALL section_vals_retain(ls_scf_env%chebyshev%print_key_cube)
261 END IF
262
263 mixing_section => section_vals_get_subs_vals(input, "DFT%LS_SCF%RHO_MIXING")
264 CALL section_vals_get(mixing_section, explicit=ls_scf_env%do_rho_mixing)
265
266 CALL section_vals_val_get(mixing_section, "METHOD", i_val=ls_scf_env%density_mixing_method)
267 IF (ls_scf_env%ls_diis .AND. ls_scf_env%do_rho_mixing) THEN
268 cpabort("LS_DIIS and RHO_MIXING are not compatible.")
269 END IF
270
271 pexsi_section => section_vals_get_subs_vals(input, "DFT%LS_SCF%PEXSI")
272 CALL section_vals_get(pexsi_section)
273
274 ls_scf_env%do_pexsi = ls_scf_env%purification_method == ls_scf_pexsi &
275 .AND. .NOT. ls_scf_env%do_transport
276 IF (ls_scf_env%do_pexsi) THEN
277 CALL pexsi_init_read_input(pexsi_section, ls_scf_env%pexsi)
278 ! Turn off S inversion (not used for PEXSI).
279 ! Methods such as purification must thus be avoided... which is OK, as the density matrix computed in pexsi is
280 ! a finite temperature one, and thus not idempotent
281 ls_scf_env%s_inversion_type = ls_s_inversion_none
282 ! PEXSI needs the sparsity pattern of S to be fixed by the upper bound ~ Int[|phi_a||phi_b|],
283 ! they can not be filtered based on magnitude, as small elements in S (e.g. symmetry) do not necessarily
284 ! correspond to small elements in the density matrix, with non-zero contributions to the total density.
285 ! the easiest way to make sure S is untouched is to set eps_filter to zero (which should be inconsequential,
286 ! as a run based on pexsi should execute exactly zero multiplications)
287 ls_scf_env%eps_filter = 0.0_dp
288 END IF
289
290 ! Turn off S inversion and set eps_filter to zero for transport
291 IF (ls_scf_env%do_transport) THEN
292 ls_scf_env%s_inversion_type = ls_s_inversion_none
293 ls_scf_env%eps_filter = 0.0_dp
294 END IF
295
296 SELECT CASE (ls_scf_env%s_inversion_type)
298 ls_scf_env%needs_s_inv = .true.
299 ls_scf_env%use_s_sqrt = .true.
301 ls_scf_env%needs_s_inv = .true.
302 ls_scf_env%use_s_sqrt = .false.
304 ls_scf_env%needs_s_inv = .false.
305 ls_scf_env%use_s_sqrt = .false.
306 CASE DEFAULT
307 cpabort("Unknown S_INVERSION type for LS_SCF")
308 END SELECT
309
310 SELECT CASE (ls_scf_env%s_preconditioner_type)
312 ls_scf_env%has_s_preconditioner = .false.
313 CASE DEFAULT
314 ls_scf_env%has_s_preconditioner = .true.
315 END SELECT
316
317 ! verify some requirements for the curvy steps
318 IF (ls_scf_env%curvy_steps .AND. ls_scf_env%do_pexsi) THEN
319 cpabort("CURVY_STEPS cannot be used together with PEXSI.")
320 END IF
321 IF (ls_scf_env%curvy_steps .AND. ls_scf_env%do_transport) THEN
322 cpabort("CURVY_STEPS cannot be used together with TRANSPORT.")
323 END IF
324 IF (ls_scf_env%curvy_steps .AND. ls_scf_env%has_s_preconditioner) THEN
325 cpabort("S Preconditioning not implemented in combination with CURVY_STEPS.")
326 END IF
327 IF (ls_scf_env%curvy_steps .AND. .NOT. ls_scf_env%use_s_sqrt) THEN
328 cpabort("CURVY_STEPS requires the use of the sqrt inversion.")
329 END IF
330
331 ! verify requirements for direct submatrix sign methods
332 IF (ls_scf_env%sign_method == ls_scf_sign_submatrix &
333 .AND. ( &
334 ls_scf_env%submatrix_sign_method == ls_scf_submatrix_sign_direct &
335 .OR. ls_scf_env%submatrix_sign_method == ls_scf_submatrix_sign_direct_muadj &
336 .OR. ls_scf_env%submatrix_sign_method == ls_scf_submatrix_sign_direct_muadj_lowmem &
337 ) .AND. .NOT. ls_scf_env%sign_symmetric) THEN
338 cpabort("DIRECT submatrix sign methods require SIGN_SYMMETRIC being set.")
339 END IF
340 IF (ls_scf_env%fixed_mu .AND. ( &
341 ls_scf_env%submatrix_sign_method == ls_scf_submatrix_sign_direct_muadj &
342 .OR. ls_scf_env%submatrix_sign_method == ls_scf_submatrix_sign_direct_muadj_lowmem &
343 )) cpabort("Invalid submatrix sign method for FIXED_MU.")
344
345 ! sign_symmetric requires computation of s_sqrt
346 IF (ls_scf_env%sign_symmetric) ls_scf_env%use_s_sqrt = .true.
347
348 ! an undocumented feature ... allows for just doing the initial guess, no expensive stuff
349 IF (ls_scf_env%max_scf < 0) THEN
350 ls_scf_env%needs_s_inv = .false.
351 ls_scf_env%use_s_sqrt = .false.
352 ls_scf_env%has_s_preconditioner = .false.
353 END IF
354
355 pao_section => section_vals_get_subs_vals(input, "DFT%LS_SCF%PAO")
356 CALL section_vals_get(pao_section, explicit=ls_scf_env%do_pao)
357 ls_scf_env%ls_mstruct%do_pao = ls_scf_env%do_pao
358
359 IF (unit_nr > 0) THEN
360 WRITE (unit_nr, '()')
361 WRITE (unit_nr, '(T2,A,A,A)') repeat("-", 30), " Linear scaling SCF ", repeat("-", 29)
362 WRITE (unit_nr, '(T2,A,T61,E20.3)') "eps_scf:", ls_scf_env%eps_scf
363 WRITE (unit_nr, '(T2,A,T61,E20.3)') "eps_filter:", ls_scf_env%eps_filter
364 IF (ls_scf_env%do_rho_mixing) THEN
365 IF (ls_scf_env%density_mixing_method > 0) THEN
366 NULLIFY (section)
367 CALL create_mixing_section(section, ls_scf=.true.)
368 keyword => section_get_keyword(section, "METHOD")
369 CALL keyword_get(keyword, enum=enum)
370 WRITE (unit_nr, "(T2,A,T61,A20)") &
371 "Density mixing in g-space:", adjustr(trim(enum_i2c(enum, &
372 ls_scf_env%density_mixing_method)))
373 CALL section_release(section)
374 END IF
375 ELSE
376 WRITE (unit_nr, '(T2,A,T61,E20.3)') "mixing_fraction:", ls_scf_env%mixing_fraction
377 END IF
378 WRITE (unit_nr, '(T2,A,T61,I20)') "max_scf:", ls_scf_env%max_scf
379 IF (ls_scf_env%ls_diis) THEN
380 WRITE (unit_nr, '(T2,A,T61,I20)') "DIIS: max_diis:", ls_scf_env%max_diis
381 WRITE (unit_nr, '(T2,A,T61,E20.3)') "DIIS: eps_diis:", ls_scf_env%eps_diis
382 WRITE (unit_nr, '(T2,A,T61,I20)') "DIIS: ini_diis:", ls_scf_env%iter_ini_diis
383 WRITE (unit_nr, '(T2,A,T61,I20)') "DIIS: nmixing:", ls_scf_env%nmixing
384 END IF
385 WRITE (unit_nr, '(T2,A,T61,L20)') "fixed chemical potential (mu)", ls_scf_env%fixed_mu
386 WRITE (unit_nr, '(T2,A,T61,L20)') "has unit metric:", ls_scf_env%has_unit_metric
387 WRITE (unit_nr, '(T2,A,T61,L20)') "Computing inv(S):", ls_scf_env%needs_s_inv
388 WRITE (unit_nr, '(T2,A,T61,L20)') "Computing sqrt(S):", ls_scf_env%use_s_sqrt
389 WRITE (unit_nr, '(T2,A,T61,L20)') "Computing S preconditioner ", ls_scf_env%has_s_preconditioner
390
391 SELECT CASE (ls_scf_env%s_sqrt_method)
392 CASE (ls_s_sqrt_ns)
393 WRITE (unit_nr, '(T2,A,T61,A20)') "S sqrt method:", "NEWTONSCHULZ"
394 CASE (ls_s_sqrt_proot)
395 WRITE (unit_nr, '(T2,A,T61,A20)') "S sqrt method:", "PROOT"
396 CASE DEFAULT
397 cpabort("Unknown sqrt method.")
398 END SELECT
399
400 WRITE (unit_nr, '(T2,A,T61,I20)') "S sqrt order:", ls_scf_env%s_sqrt_order
401 WRITE (unit_nr, '(T2,A,T61,I20)') "Extrapolation order:", ls_scf_env%extrapolation_order
402
403 SELECT CASE (ls_scf_env%s_preconditioner_type)
405 WRITE (unit_nr, '(T2,A,T61,A20)') "S preconditioner type ", "NONE"
407 WRITE (unit_nr, '(T2,A,T61,A20)') "S preconditioner type ", "ATOMIC"
409 WRITE (unit_nr, '(T2,A,T61,A20)') "S preconditioner type ", "MOLECULAR"
410 END SELECT
411
412 WRITE (unit_nr, '(T2,A,T61,L20)') "Polarized Atomic Orbitals (PAO) ", ls_scf_env%do_pao
413
414 IF (ls_scf_env%curvy_steps) THEN
415 WRITE (unit_nr, '(T2,A,T61,A30)') "Using curvy steps to optimize the density matrix"
416 CALL cite_reference(shao2003)
417 END IF
418
419 SELECT CASE (ls_scf_env%purification_method)
420 CASE (ls_scf_sign)
421 WRITE (unit_nr, '(T2,A,T51,A30)') "Purification method", adjustr("sign iteration")
422 SELECT CASE (ls_scf_env%sign_method)
423 CASE (ls_scf_sign_ns)
424 WRITE (unit_nr, '(T2,A,T61,A20)') "Sign method:", adjustr("newton schulz")
425 CASE (ls_scf_sign_proot)
426 WRITE (unit_nr, '(T2,A,T61,A20)') "Sign method:", adjustr("p-th root method")
428 WRITE (unit_nr, '(T2,A,T61,A20)') "Sign method:", adjustr("submatrix method")
429 SELECT CASE (ls_scf_env%submatrix_sign_method)
431 WRITE (unit_nr, '(T2,A,T61,A20)') "Submatrix sign method:", adjustr("newton schulz")
433 WRITE (unit_nr, '(T2,A,T61,A20)') "Submatrix sign method:", adjustr("direct")
435 WRITE (unit_nr, '(T2,A,T61,A20)') "Submatrix sign method:", adjustr("direct mu-adj")
437 WRITE (unit_nr, '(T2,A,T61,A20)') "Submatrix sign method:", adjustr("direct mu-adj lowmem")
438 CASE DEFAULT
439 cpabort("Unkown submatrix sign method.")
440 END SELECT
441 CASE DEFAULT
442 cpabort("Unknown sign method.")
443 END SELECT
444 WRITE (unit_nr, '(T2,A,T61,I20)') "Sign order:", ls_scf_env%sign_order
445 WRITE (unit_nr, '(T2,A,T61,L20)') "Symmetric sign calculation:", ls_scf_env%sign_symmetric
446 CASE (ls_scf_tc2)
447 CALL cite_reference(niklasson2014)
448 WRITE (unit_nr, '(T2,A,T51,A30)') "Purification method", adjustr("Trace conserving 2nd order")
449 CASE (ls_scf_trs4)
450 CALL cite_reference(niklasson2003)
451 WRITE (unit_nr, '(T2,A,T51,A30)') "Purification method", adjustr("Trace resetting 4th order")
452 CASE (ls_scf_pexsi)
453 CALL cite_reference(lin2009)
454 CALL cite_reference(lin2013)
455 WRITE (unit_nr, '(T2,A,T51,A20)') "Purification method", adjustr("PEXSI")
456 CASE DEFAULT
457 cpabort("Unknown purification method for LS_SCF")
458 END SELECT
459
460 SELECT CASE (ls_scf_env%ls_mstruct%cluster_type)
461 CASE (ls_cluster_atomic)
462 WRITE (unit_nr, '(T2,A,T61,A20)') "Cluster type", adjustr("ATOMIC")
464 WRITE (unit_nr, '(T2,A,T61,A20)') "Cluster type", adjustr("MOLECULAR")
465 CASE DEFAULT
466 cpabort("Unknown cluster type")
467 END SELECT
468
469 WRITE (unit_nr, '(T2,A,T61,L20)') "Computing Chebyshev", ls_scf_env%chebyshev%compute_chebyshev
470 IF (ls_scf_env%chebyshev%compute_chebyshev) THEN
471 WRITE (unit_nr, '(T2,A,T61,I20)') "N_CHEBYSHEV:", ls_scf_env%chebyshev%n_chebyshev
472 WRITE (unit_nr, '(T2,A,T61,I20)') "N_GRIDPOINT_DOS:", ls_scf_env%chebyshev%n_gridpoint_dos
473 END IF
474
475 WRITE (unit_nr, '(T2,A)') repeat("-", 79)
476 WRITE (unit_nr, '()')
477 CALL m_flush(unit_nr)
478 END IF
479
480 CALL timestop(handle)
481
482 END SUBROUTINE ls_scf_init_read_write_input
483
484END MODULE dm_ls_scf_create
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public lin2009
integer, save, public vandevondele2012
integer, save, public lin2013
integer, save, public shao2003
integer, save, public niklasson2014
integer, save, public niklasson2003
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
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
Routines for a linear scaling quickstep SCF run based on the density matrix.
subroutine, public ls_scf_create(qs_env)
Creation and basic initialization of the LS type.
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 ls_scf_submatrix_sign_direct_muadj
integer, parameter, public ls_s_preconditioner_molecular
integer, parameter, public ls_s_inversion_hotelling
integer, parameter, public ls_cluster_molecular
integer, parameter, public ls_scf_pexsi
integer, parameter, public ls_s_preconditioner_atomic
integer, parameter, public ls_scf_sign_submatrix
integer, parameter, public ls_s_inversion_none
integer, parameter, public ls_s_sqrt_proot
integer, parameter, public ls_s_sqrt_ns
integer, parameter, public ls_s_preconditioner_none
integer, parameter, public ls_scf_sign_proot
integer, parameter, public ls_scf_trs4
integer, parameter, public ls_scf_sign
integer, parameter, public ls_scf_tc2
integer, parameter, public ls_scf_submatrix_sign_ns
integer, parameter, public ls_scf_sign_ns
integer, parameter, public ls_s_inversion_sign_sqrt
integer, parameter, public ls_scf_submatrix_sign_direct_muadj_lowmem
integer, parameter, public ls_scf_submatrix_sign_direct
integer, parameter, public ls_cluster_atomic
represents an enumeration, i.e. a mapping between integers and strings
character(len=default_string_length) function, public enum_i2c(enum, i)
maps an integer to a string
represents keywords in an input
subroutine, public keyword_get(keyword, names, usage, description, type_of_var, n_var, default_value, lone_keyword_value, repeats, enum, citations)
...
objects that represent the structure of input sections and the data contained in an input section
subroutine, public section_vals_retain(section_vals)
retains the given section values (see doc/ReferenceCounting.html)
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
recursive subroutine, public section_release(section)
releases the given keyword list (see doc/ReferenceCounting.html)
recursive type(keyword_type) function, pointer, public section_get_keyword(section, keyword_name)
returns the requested keyword
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Machine interface based on Fortran 2003 and POSIX.
Definition machine.F:17
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
Definition machine.F:124
Define the data structure for the molecule information.
subroutine, public molecule_of_atom(molecule_set, atom_to_mol)
finds for each atom the molecule it belongs to
Main module for the PAO method.
Definition pao_main.F:12
subroutine, public pao_init(qs_env, ls_scf_env)
Initialize the PAO environment.
Definition pao_main.F:78
Define the data structure for the particle information.
Methods using the PEXSI library to calculate the density matrix and related quantities using the Kohn...
subroutine, public pexsi_init_read_input(pexsi_section, pexsi_env)
Read CP2K input section PEXSI and pass it to the PEXSI environment.
Environment storing all data that is needed in order to call the DFT driver of the PEXSI library with...
Definition pexsi_types.F:18
subroutine, public lib_pexsi_init(pexsi_env, mp_group, nspin)
Initialize PEXSI.
module that contains the definitions of the scf types
subroutine, public create_mixing_section(section, ls_scf)
Create CP2K input section for the mixing of the density matrix to be used only with diagonalization m...
subroutine, public mixing_storage_create(mixing_store, mixing_section, mixing_method, ecut)
creates a mixing_storage
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.
subroutine, public set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, mimic, ewald_env, ewald_pw, mpools, rho_external, external_vxc, mask, scf_control, rel_control, qs_charges, ks_env, ks_qmmm_env, wf_history, scf_env, active_space, input, oce, rho_atom_set, rho0_atom_set, rho0_mpole, run_rtp, rtp, rhoz_set, rhoz_tot, ecoul_1c, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, efield, rhoz_cneo_set, linres_control, xas_env, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, ls_scf_env, do_transport, transport_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, harris_env, gcp_env, mp2_env, bs_env, kg_env, force, kpoints, wanniercentres, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Set the QUICKSTEP environment.
type of a logger, at the moment it contains just a print level starting at which level it should be l...
represent a keyword in the input
represent a section of the input file