(git:ed6f26b)
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-2025 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 .NE. 0.0_dp) &
159 cpabort("EPS_FILTER_MATRIX must be set to 0 for PEXSI.")
160 CALL lib_pexsi_init(ls_scf_env%pexsi, ls_scf_env%para_env, ls_scf_env%nspins)
161 END IF
162
163 ! initialize PAO
164 CALL pao_init(qs_env, ls_scf_env)
165
166 ! put the ls_scf_env in qs_env
167 CALL set_qs_env(qs_env, ls_scf_env=ls_scf_env)
168
169 CALL timestop(handle)
170
171 END SUBROUTINE ls_scf_create
172
173! **************************************************************************************************
174!> \brief parse the input section, no need to pass it around
175!> \param input ...
176!> \param ls_scf_env ...
177!> \param unit_nr ...
178!> \par History
179!> 2010.10 created [Joost VandeVondele]
180!> \author Joost VandeVondele
181! **************************************************************************************************
182 SUBROUTINE ls_scf_init_read_write_input(input, ls_scf_env, unit_nr)
183 TYPE(section_vals_type), POINTER :: input
184 TYPE(ls_scf_env_type), INTENT(INOUT) :: ls_scf_env
185 INTEGER, INTENT(IN) :: unit_nr
186
187 CHARACTER(len=*), PARAMETER :: routinen = 'ls_scf_init_read_write_input'
188
189 INTEGER :: handle
190 REAL(kind=dp) :: mu
191 TYPE(enumeration_type), POINTER :: enum
192 TYPE(keyword_type), POINTER :: keyword
193 TYPE(section_type), POINTER :: section
194 TYPE(section_vals_type), POINTER :: chebyshev_section, curvy_section, &
195 ls_scf_section, mixing_section, &
196 pao_section, pexsi_section
197
198 CALL timeset(routinen, handle)
199 CALL cite_reference(vandevondele2012)
200 ls_scf_section => section_vals_get_subs_vals(input, "DFT%LS_SCF")
201 curvy_section => section_vals_get_subs_vals(ls_scf_section, "CURVY_STEPS")
202
203 ! should come from input
204 CALL section_vals_val_get(ls_scf_section, "LS_DIIS", l_val=ls_scf_env%ls_diis)
205 CALL section_vals_val_get(ls_scf_section, "INI_DIIS", i_val=ls_scf_env%iter_ini_diis)
206 CALL section_vals_val_get(ls_scf_section, "MAX_DIIS", i_val=ls_scf_env%max_diis)
207 CALL section_vals_val_get(ls_scf_section, "NMIXING", i_val=ls_scf_env%nmixing)
208 CALL section_vals_val_get(ls_scf_section, "EPS_DIIS", r_val=ls_scf_env%eps_diis)
209 CALL section_vals_val_get(ls_scf_section, "EPS_SCF", r_val=ls_scf_env%eps_scf)
210 CALL section_vals_val_get(ls_scf_section, "EPS_FILTER", r_val=ls_scf_env%eps_filter)
211 CALL section_vals_val_get(ls_scf_section, "MU", r_val=mu)
212 CALL section_vals_val_get(ls_scf_section, "FIXED_MU", l_val=ls_scf_env%fixed_mu)
213 ls_scf_env%mu_spin = mu
214 CALL section_vals_val_get(ls_scf_section, "MIXING_FRACTION", r_val=ls_scf_env%mixing_fraction)
215 CALL section_vals_val_get(ls_scf_section, "MAX_SCF", i_val=ls_scf_env%max_scf)
216 CALL section_vals_val_get(ls_scf_section, "S_PRECONDITIONER", i_val=ls_scf_env%s_preconditioner_type)
217 CALL section_vals_val_get(ls_scf_section, "MATRIX_CLUSTER_TYPE", i_val=ls_scf_env%ls_mstruct%cluster_type)
218 CALL section_vals_val_get(ls_scf_section, "S_INVERSION", i_val=ls_scf_env%s_inversion_type)
219 CALL section_vals_val_get(ls_scf_section, "CHECK_S_INV", l_val=ls_scf_env%check_s_inv)
220 CALL section_vals_val_get(ls_scf_section, "REPORT_ALL_SPARSITIES", l_val=ls_scf_env%report_all_sparsities)
221 CALL section_vals_val_get(ls_scf_section, "PERFORM_MU_SCAN", l_val=ls_scf_env%perform_mu_scan)
222 CALL section_vals_val_get(ls_scf_section, "PURIFICATION_METHOD", i_val=ls_scf_env%purification_method)
223 CALL section_vals_val_get(ls_scf_section, "SIGN_METHOD", i_val=ls_scf_env%sign_method)
224 CALL section_vals_val_get(ls_scf_section, "SUBMATRIX_SIGN_METHOD", i_val=ls_scf_env%submatrix_sign_method)
225 CALL section_vals_val_get(ls_scf_section, "SIGN_ORDER", i_val=ls_scf_env%sign_order)
226 CALL section_vals_val_get(ls_scf_section, "SIGN_SYMMETRIC", l_val=ls_scf_env%sign_symmetric)
227 CALL section_vals_val_get(ls_scf_section, "DYNAMIC_THRESHOLD", l_val=ls_scf_env%dynamic_threshold)
228 CALL section_vals_val_get(ls_scf_section, "NON_MONOTONIC", l_val=ls_scf_env%non_monotonic)
229 CALL section_vals_val_get(ls_scf_section, "S_SQRT_METHOD", i_val=ls_scf_env%s_sqrt_method)
230 CALL section_vals_val_get(ls_scf_section, "S_SQRT_ORDER", i_val=ls_scf_env%s_sqrt_order)
231 CALL section_vals_val_get(ls_scf_section, "EXTRAPOLATION_ORDER", i_val=ls_scf_env%extrapolation_order)
232 CALL section_vals_val_get(ls_scf_section, "RESTART_READ", l_val=ls_scf_env%restart_read)
233 CALL section_vals_val_get(ls_scf_section, "RESTART_WRITE", l_val=ls_scf_env%restart_write)
234 CALL section_vals_val_get(ls_scf_section, "EPS_LANCZOS", r_val=ls_scf_env%eps_lanczos)
235 CALL section_vals_val_get(ls_scf_section, "MAX_ITER_LANCZOS", i_val=ls_scf_env%max_iter_lanczos)
236
237 CALL section_vals_get(curvy_section, explicit=ls_scf_env%curvy_steps)
238 CALL section_vals_val_get(curvy_section, "LINE_SEARCH", i_val=ls_scf_env%curvy_data%line_search_type)
239 CALL section_vals_val_get(curvy_section, "N_BCH_HISTORY", i_val=ls_scf_env%curvy_data%n_bch_hist)
240 CALL section_vals_val_get(curvy_section, "MIN_HESSIAN_SHIFT", r_val=ls_scf_env%curvy_data%min_shift)
241 CALL section_vals_val_get(curvy_section, "FILTER_FACTOR", r_val=ls_scf_env%curvy_data%filter_factor)
242 CALL section_vals_val_get(curvy_section, "FILTER_FACTOR_SCALE", r_val=ls_scf_env%curvy_data%scale_filter)
243 CALL section_vals_val_get(curvy_section, "MIN_FILTER", r_val=ls_scf_env%curvy_data%min_filter)
244
245 ls_scf_env%extrapolation_order = max(0, ls_scf_env%extrapolation_order)
246
247 chebyshev_section => section_vals_get_subs_vals(input, "DFT%LS_SCF%CHEBYSHEV")
248 CALL section_vals_get(chebyshev_section, explicit=ls_scf_env%chebyshev%compute_chebyshev)
249 IF (ls_scf_env%chebyshev%compute_chebyshev) THEN
250 CALL section_vals_val_get(chebyshev_section, "N_CHEBYSHEV", i_val=ls_scf_env%chebyshev%n_chebyshev)
251 CALL section_vals_val_get(chebyshev_section, "DOS%N_GRIDPOINTS", i_val=ls_scf_env%chebyshev%n_gridpoint_dos)
252
253 ls_scf_env%chebyshev%print_key_dos => &
254 section_vals_get_subs_vals(chebyshev_section, "DOS")
255 CALL section_vals_retain(ls_scf_env%chebyshev%print_key_dos)
256
257 ls_scf_env%chebyshev%print_key_cube => &
258 section_vals_get_subs_vals(chebyshev_section, "PRINT_SPECIFIC_E_DENSITY_CUBE")
259 CALL section_vals_retain(ls_scf_env%chebyshev%print_key_cube)
260 END IF
261
262 mixing_section => section_vals_get_subs_vals(input, "DFT%LS_SCF%RHO_MIXING")
263 CALL section_vals_get(mixing_section, explicit=ls_scf_env%do_rho_mixing)
264
265 CALL section_vals_val_get(mixing_section, "METHOD", i_val=ls_scf_env%density_mixing_method)
266 IF (ls_scf_env%ls_diis .AND. ls_scf_env%do_rho_mixing) &
267 cpabort("LS_DIIS and RHO_MIXING are not compatible.")
268
269 pexsi_section => section_vals_get_subs_vals(input, "DFT%LS_SCF%PEXSI")
270 CALL section_vals_get(pexsi_section)
271
272 ls_scf_env%do_pexsi = ls_scf_env%purification_method .EQ. ls_scf_pexsi &
273 .AND. .NOT. ls_scf_env%do_transport
274 IF (ls_scf_env%do_pexsi) THEN
275 CALL pexsi_init_read_input(pexsi_section, ls_scf_env%pexsi)
276 ! Turn off S inversion (not used for PEXSI).
277 ! Methods such as purification must thus be avoided... which is OK, as the density matrix computed in pexsi is
278 ! a finite temperature one, and thus not idempotent
279 ls_scf_env%s_inversion_type = ls_s_inversion_none
280 ! PEXSI needs the sparsity pattern of S to be fixed by the upper bound ~ Int[|phi_a||phi_b|],
281 ! they can not be filtered based on magnitude, as small elements in S (e.g. symmetry) do not necessarily
282 ! correspond to small elements in the density matrix, with non-zero contributions to the total density.
283 ! the easiest way to make sure S is untouched is to set eps_filter to zero (which should be inconsequential,
284 ! as a run based on pexsi should execute exactly zero multiplications)
285 ls_scf_env%eps_filter = 0.0_dp
286 END IF
287
288 ! Turn off S inversion and set eps_filter to zero for transport
289 IF (ls_scf_env%do_transport) THEN
290 ls_scf_env%s_inversion_type = ls_s_inversion_none
291 ls_scf_env%eps_filter = 0.0_dp
292 END IF
293
294 SELECT CASE (ls_scf_env%s_inversion_type)
296 ls_scf_env%needs_s_inv = .true.
297 ls_scf_env%use_s_sqrt = .true.
299 ls_scf_env%needs_s_inv = .true.
300 ls_scf_env%use_s_sqrt = .false.
302 ls_scf_env%needs_s_inv = .false.
303 ls_scf_env%use_s_sqrt = .false.
304 CASE DEFAULT
305 cpabort("")
306 END SELECT
307
308 SELECT CASE (ls_scf_env%s_preconditioner_type)
310 ls_scf_env%has_s_preconditioner = .false.
311 CASE DEFAULT
312 ls_scf_env%has_s_preconditioner = .true.
313 END SELECT
314
315 ! verify some requirements for the curvy steps
316 IF (ls_scf_env%curvy_steps .AND. ls_scf_env%do_pexsi) &
317 cpabort("CURVY_STEPS cannot be used together with PEXSI.")
318 IF (ls_scf_env%curvy_steps .AND. ls_scf_env%do_transport) &
319 cpabort("CURVY_STEPS cannot be used together with TRANSPORT.")
320 IF (ls_scf_env%curvy_steps .AND. ls_scf_env%has_s_preconditioner) &
321 cpabort("S Preconditioning not implemented in combination with CURVY_STEPS.")
322 IF (ls_scf_env%curvy_steps .AND. .NOT. ls_scf_env%use_s_sqrt) &
323 cpabort("CURVY_STEPS requires the use of the sqrt inversion.")
324
325 ! verify requirements for direct submatrix sign methods
326 IF (ls_scf_env%sign_method .EQ. ls_scf_sign_submatrix &
327 .AND. ( &
328 ls_scf_env%submatrix_sign_method .EQ. ls_scf_submatrix_sign_direct &
329 .OR. ls_scf_env%submatrix_sign_method .EQ. ls_scf_submatrix_sign_direct_muadj &
330 .OR. ls_scf_env%submatrix_sign_method .EQ. ls_scf_submatrix_sign_direct_muadj_lowmem &
331 ) .AND. .NOT. ls_scf_env%sign_symmetric) &
332 cpabort("DIRECT submatrix sign methods require SIGN_SYMMETRIC being set.")
333 IF (ls_scf_env%fixed_mu .AND. ( &
334 ls_scf_env%submatrix_sign_method .EQ. ls_scf_submatrix_sign_direct_muadj &
335 .OR. ls_scf_env%submatrix_sign_method .EQ. ls_scf_submatrix_sign_direct_muadj_lowmem &
336 )) cpabort("Invalid submatrix sign method for FIXED_MU.")
337
338 ! sign_symmetric requires computation of s_sqrt
339 IF (ls_scf_env%sign_symmetric) ls_scf_env%use_s_sqrt = .true.
340
341 ! an undocumented feature ... allows for just doing the initial guess, no expensive stuff
342 IF (ls_scf_env%max_scf < 0) THEN
343 ls_scf_env%needs_s_inv = .false.
344 ls_scf_env%use_s_sqrt = .false.
345 ls_scf_env%has_s_preconditioner = .false.
346 END IF
347
348 pao_section => section_vals_get_subs_vals(input, "DFT%LS_SCF%PAO")
349 CALL section_vals_get(pao_section, explicit=ls_scf_env%do_pao)
350 ls_scf_env%ls_mstruct%do_pao = ls_scf_env%do_pao
351
352 IF (unit_nr > 0) THEN
353 WRITE (unit_nr, '()')
354 WRITE (unit_nr, '(T2,A,A,A)') repeat("-", 30), " Linear scaling SCF ", repeat("-", 29)
355 WRITE (unit_nr, '(T2,A,T61,E20.3)') "eps_scf:", ls_scf_env%eps_scf
356 WRITE (unit_nr, '(T2,A,T61,E20.3)') "eps_filter:", ls_scf_env%eps_filter
357 IF (ls_scf_env%do_rho_mixing) THEN
358 IF (ls_scf_env%density_mixing_method > 0) THEN
359 NULLIFY (section)
360 CALL create_mixing_section(section, ls_scf=.true.)
361 keyword => section_get_keyword(section, "METHOD")
362 CALL keyword_get(keyword, enum=enum)
363 WRITE (unit_nr, "(T2,A,T61,A20)") &
364 "Density mixing in g-space:", adjustr(trim(enum_i2c(enum, &
365 ls_scf_env%density_mixing_method)))
366 CALL section_release(section)
367 END IF
368 ELSE
369 WRITE (unit_nr, '(T2,A,T61,E20.3)') "mixing_fraction:", ls_scf_env%mixing_fraction
370 END IF
371 WRITE (unit_nr, '(T2,A,T61,I20)') "max_scf:", ls_scf_env%max_scf
372 IF (ls_scf_env%ls_diis) THEN
373 WRITE (unit_nr, '(T2,A,T61,I20)') "DIIS: max_diis:", ls_scf_env%max_diis
374 WRITE (unit_nr, '(T2,A,T61,E20.3)') "DIIS: eps_diis:", ls_scf_env%eps_diis
375 WRITE (unit_nr, '(T2,A,T61,I20)') "DIIS: ini_diis:", ls_scf_env%iter_ini_diis
376 WRITE (unit_nr, '(T2,A,T61,I20)') "DIIS: nmixing:", ls_scf_env%nmixing
377 END IF
378 WRITE (unit_nr, '(T2,A,T61,L20)') "fixed chemical potential (mu)", ls_scf_env%fixed_mu
379 WRITE (unit_nr, '(T2,A,T61,L20)') "has unit metric:", ls_scf_env%has_unit_metric
380 WRITE (unit_nr, '(T2,A,T61,L20)') "Computing inv(S):", ls_scf_env%needs_s_inv
381 WRITE (unit_nr, '(T2,A,T61,L20)') "Computing sqrt(S):", ls_scf_env%use_s_sqrt
382 WRITE (unit_nr, '(T2,A,T61,L20)') "Computing S preconditioner ", ls_scf_env%has_s_preconditioner
383
384 SELECT CASE (ls_scf_env%s_sqrt_method)
385 CASE (ls_s_sqrt_ns)
386 WRITE (unit_nr, '(T2,A,T61,A20)') "S sqrt method:", "NEWTONSCHULZ"
387 CASE (ls_s_sqrt_proot)
388 WRITE (unit_nr, '(T2,A,T61,A20)') "S sqrt method:", "PROOT"
389 CASE DEFAULT
390 cpabort("Unknown sqrt method.")
391 END SELECT
392
393 WRITE (unit_nr, '(T2,A,T61,I20)') "S sqrt order:", ls_scf_env%s_sqrt_order
394 WRITE (unit_nr, '(T2,A,T61,I20)') "Extrapolation order:", ls_scf_env%extrapolation_order
395
396 SELECT CASE (ls_scf_env%s_preconditioner_type)
398 WRITE (unit_nr, '(T2,A,T61,A20)') "S preconditioner type ", "NONE"
400 WRITE (unit_nr, '(T2,A,T61,A20)') "S preconditioner type ", "ATOMIC"
402 WRITE (unit_nr, '(T2,A,T61,A20)') "S preconditioner type ", "MOLECULAR"
403 END SELECT
404
405 WRITE (unit_nr, '(T2,A,T61,L20)') "Polarized Atomic Orbitals (PAO) ", ls_scf_env%do_pao
406
407 IF (ls_scf_env%curvy_steps) THEN
408 WRITE (unit_nr, '(T2,A,T61,A30)') "Using curvy steps to optimize the density matrix"
409 CALL cite_reference(shao2003)
410 END IF
411
412 SELECT CASE (ls_scf_env%purification_method)
413 CASE (ls_scf_sign)
414 WRITE (unit_nr, '(T2,A,T51,A30)') "Purification method", adjustr("sign iteration")
415 SELECT CASE (ls_scf_env%sign_method)
416 CASE (ls_scf_sign_ns)
417 WRITE (unit_nr, '(T2,A,T61,A20)') "Sign method:", adjustr("newton schulz")
418 CASE (ls_scf_sign_proot)
419 WRITE (unit_nr, '(T2,A,T61,A20)') "Sign method:", adjustr("p-th root method")
421 WRITE (unit_nr, '(T2,A,T61,A20)') "Sign method:", adjustr("submatrix method")
422 SELECT CASE (ls_scf_env%submatrix_sign_method)
424 WRITE (unit_nr, '(T2,A,T61,A20)') "Submatrix sign method:", adjustr("newton schulz")
426 WRITE (unit_nr, '(T2,A,T61,A20)') "Submatrix sign method:", adjustr("direct")
428 WRITE (unit_nr, '(T2,A,T61,A20)') "Submatrix sign method:", adjustr("direct mu-adj")
430 WRITE (unit_nr, '(T2,A,T61,A20)') "Submatrix sign method:", adjustr("direct mu-adj lowmem")
431 CASE DEFAULT
432 cpabort("Unkown submatrix sign method.")
433 END SELECT
434 CASE DEFAULT
435 cpabort("Unknown sign method.")
436 END SELECT
437 WRITE (unit_nr, '(T2,A,T61,I20)') "Sign order:", ls_scf_env%sign_order
438 WRITE (unit_nr, '(T2,A,T61,L20)') "Symmetric sign calculation:", ls_scf_env%sign_symmetric
439 CASE (ls_scf_tc2)
440 CALL cite_reference(niklasson2014)
441 WRITE (unit_nr, '(T2,A,T51,A30)') "Purification method", adjustr("Trace conserving 2nd order")
442 CASE (ls_scf_trs4)
443 CALL cite_reference(niklasson2003)
444 WRITE (unit_nr, '(T2,A,T51,A30)') "Purification method", adjustr("Trace resetting 4th order")
445 CASE (ls_scf_pexsi)
446 CALL cite_reference(lin2009)
447 CALL cite_reference(lin2013)
448 WRITE (unit_nr, '(T2,A,T51,A20)') "Purification method", adjustr("PEXSI")
449 CASE DEFAULT
450 cpabort("")
451 END SELECT
452
453 SELECT CASE (ls_scf_env%ls_mstruct%cluster_type)
454 CASE (ls_cluster_atomic)
455 WRITE (unit_nr, '(T2,A,T61,A20)') "Cluster type", adjustr("ATOMIC")
457 WRITE (unit_nr, '(T2,A,T61,A20)') "Cluster type", adjustr("MOLECULAR")
458 CASE DEFAULT
459 cpabort("Unknown cluster type")
460 END SELECT
461
462 IF (ls_scf_env%chebyshev%compute_chebyshev) THEN
463 WRITE (unit_nr, '(T2,A,T61,A20)') "Computing Chebyshev", adjustr("TRUE")
464 WRITE (unit_nr, '(T2,A,T61,I20)') "N_CHEBYSHEV:", ls_scf_env%chebyshev%n_chebyshev
465 WRITE (unit_nr, '(T2,A,T61,I20)') "N_GRIDPOINT_DOS:", ls_scf_env%chebyshev%n_gridpoint_dos
466 ELSE
467 WRITE (unit_nr, '(T2,A,T61,A20)') "Computing Chebyshev", adjustr("FALSE")
468 END IF
469
470 WRITE (unit_nr, '(T2,A,T61,L20)') "Using PAO", ls_scf_env%do_pao
471
472 WRITE (unit_nr, '(T2,A)') repeat("-", 79)
473 WRITE (unit_nr, '()')
474 CALL m_flush(unit_nr)
475 END IF
476
477 CALL timestop(handle)
478
479 END SUBROUTINE ls_scf_init_read_write_input
480
481END 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:130
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:75
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, 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, 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, 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, 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, ecoul_1c, rho0_s_rs, rho0_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)
Get the QUICKSTEP environment.
subroutine, public set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, 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, 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)
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