28 USE dbcsr_api,
ONLY: dbcsr_p_type
62 #include "./base/base_uses.f90"
68 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'dm_ls_scf_create'
82 TYPE(qs_environment_type),
POINTER :: qs_env
84 CHARACTER(len=*),
PARAMETER :: routinen =
'ls_scf_create'
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
95 CALL timeset(routinen, handle)
101 IF (logger%para_env%is_source())
THEN
107 ALLOCATE (ls_scf_env)
110 CALL get_qs_env(qs_env, nelectron_total=ls_scf_env%nelectron_total, &
112 dft_control=dft_control, &
113 particle_set=particle_set, &
114 molecule_set=molecule_set, &
116 has_unit_metric=ls_scf_env%has_unit_metric, &
117 para_env=ls_scf_env%para_env, &
118 do_transport=ls_scf_env%do_transport, &
119 nelectron_spin=ls_scf_env%nelectron_spin)
122 ls_scf_env%nspins = dft_control%nspins
123 ls_scf_env%natoms =
SIZE(particle_set, 1)
124 CALL ls_scf_env%para_env%retain()
127 ALLOCATE (ls_scf_env%ls_mstruct%atom_to_molecule(ls_scf_env%natoms))
129 CALL molecule_of_atom(molecule_set, atom_to_mol=ls_scf_env%ls_mstruct%atom_to_molecule)
132 CALL ls_scf_init_read_write_input(input, ls_scf_env, unit_nr)
133 dft_control%qs_control%pao = ls_scf_env%do_pao
136 ls_scf_env%scf_history%nstore = ls_scf_env%extrapolation_order
137 ls_scf_env%scf_history%istore = 0
138 ALLOCATE (ls_scf_env%scf_history%matrix(ls_scf_env%nspins, ls_scf_env%scf_history%nstore))
140 NULLIFY (ls_scf_env%mixing_store)
142 ALLOCATE (ls_scf_env%mixing_store)
144 ls_scf_env%density_mixing_method, &
145 dft_control%qs_control%cutoff)
148 IF (ls_scf_env%do_pexsi)
THEN
149 IF (dft_control%qs_control%eps_filter_matrix .NE. 0.0_dp) &
150 cpabort(
"EPS_FILTER_MATRIX must be set to 0 for PEXSI.")
151 CALL lib_pexsi_init(ls_scf_env%pexsi, ls_scf_env%para_env, ls_scf_env%nspins)
158 CALL set_qs_env(qs_env, ls_scf_env=ls_scf_env)
160 CALL timestop(handle)
173 SUBROUTINE ls_scf_init_read_write_input(input, ls_scf_env, unit_nr)
174 TYPE(section_vals_type),
POINTER :: input
175 TYPE(ls_scf_env_type),
INTENT(INOUT) :: ls_scf_env
176 INTEGER,
INTENT(IN) :: unit_nr
178 CHARACTER(len=*),
PARAMETER :: routinen =
'ls_scf_init_read_write_input'
182 TYPE(enumeration_type),
POINTER :: enum
183 TYPE(keyword_type),
POINTER :: keyword
184 TYPE(section_type),
POINTER :: section
185 TYPE(section_vals_type),
POINTER :: chebyshev_section, curvy_section, &
186 ls_scf_section, mixing_section, &
187 pao_section, pexsi_section
189 CALL timeset(routinen, handle)
204 ls_scf_env%mu_spin = mu
207 CALL section_vals_val_get(ls_scf_section,
"S_PRECONDITIONER", i_val=ls_scf_env%s_preconditioner_type)
208 CALL section_vals_val_get(ls_scf_section,
"MATRIX_CLUSTER_TYPE", i_val=ls_scf_env%ls_mstruct%cluster_type)
211 CALL section_vals_val_get(ls_scf_section,
"REPORT_ALL_SPARSITIES", l_val=ls_scf_env%report_all_sparsities)
213 CALL section_vals_val_get(ls_scf_section,
"PURIFICATION_METHOD", i_val=ls_scf_env%purification_method)
215 CALL section_vals_val_get(ls_scf_section,
"SUBMATRIX_SIGN_METHOD", i_val=ls_scf_env%submatrix_sign_method)
218 CALL section_vals_val_get(ls_scf_section,
"DYNAMIC_THRESHOLD", l_val=ls_scf_env%dynamic_threshold)
222 CALL section_vals_val_get(ls_scf_section,
"EXTRAPOLATION_ORDER", i_val=ls_scf_env%extrapolation_order)
226 CALL section_vals_val_get(ls_scf_section,
"MAX_ITER_LANCZOS", i_val=ls_scf_env%max_iter_lanczos)
229 CALL section_vals_val_get(curvy_section,
"LINE_SEARCH", i_val=ls_scf_env%curvy_data%line_search_type)
230 CALL section_vals_val_get(curvy_section,
"N_BCH_HISTORY", i_val=ls_scf_env%curvy_data%n_bch_hist)
231 CALL section_vals_val_get(curvy_section,
"MIN_HESSIAN_SHIFT", r_val=ls_scf_env%curvy_data%min_shift)
232 CALL section_vals_val_get(curvy_section,
"FILTER_FACTOR", r_val=ls_scf_env%curvy_data%filter_factor)
233 CALL section_vals_val_get(curvy_section,
"FILTER_FACTOR_SCALE", r_val=ls_scf_env%curvy_data%scale_filter)
236 ls_scf_env%extrapolation_order = max(0, ls_scf_env%extrapolation_order)
239 CALL section_vals_get(chebyshev_section, explicit=ls_scf_env%chebyshev%compute_chebyshev)
240 IF (ls_scf_env%chebyshev%compute_chebyshev)
THEN
241 CALL section_vals_val_get(chebyshev_section,
"N_CHEBYSHEV", i_val=ls_scf_env%chebyshev%n_chebyshev)
242 CALL section_vals_val_get(chebyshev_section,
"DOS%N_GRIDPOINTS", i_val=ls_scf_env%chebyshev%n_gridpoint_dos)
244 ls_scf_env%chebyshev%print_key_dos => &
248 ls_scf_env%chebyshev%print_key_cube => &
257 IF (ls_scf_env%ls_diis .AND. ls_scf_env%do_rho_mixing) &
258 cpabort(
"LS_DIIS and RHO_MIXING are not compatible.")
263 ls_scf_env%do_pexsi = ls_scf_env%purification_method .EQ.
ls_scf_pexsi &
264 .AND. .NOT. ls_scf_env%do_transport
265 IF (ls_scf_env%do_pexsi)
THEN
276 ls_scf_env%eps_filter = 0.0_dp
280 IF (ls_scf_env%do_transport)
THEN
282 ls_scf_env%eps_filter = 0.0_dp
285 SELECT CASE (ls_scf_env%s_inversion_type)
287 ls_scf_env%needs_s_inv = .true.
288 ls_scf_env%use_s_sqrt = .true.
290 ls_scf_env%needs_s_inv = .true.
291 ls_scf_env%use_s_sqrt = .false.
293 ls_scf_env%needs_s_inv = .false.
294 ls_scf_env%use_s_sqrt = .false.
299 SELECT CASE (ls_scf_env%s_preconditioner_type)
301 ls_scf_env%has_s_preconditioner = .false.
303 ls_scf_env%has_s_preconditioner = .true.
307 IF (ls_scf_env%curvy_steps .AND. ls_scf_env%do_pexsi) &
308 cpabort(
"CURVY_STEPS cannot be used together with PEXSI.")
309 IF (ls_scf_env%curvy_steps .AND. ls_scf_env%do_transport) &
310 cpabort(
"CURVY_STEPS cannot be used together with TRANSPORT.")
311 IF (ls_scf_env%curvy_steps .AND. ls_scf_env%has_s_preconditioner) &
312 cpabort(
"S Preconditioning not implemented in combination with CURVY_STEPS.")
313 IF (ls_scf_env%curvy_steps .AND. .NOT. ls_scf_env%use_s_sqrt) &
314 cpabort(
"CURVY_STEPS requires the use of the sqrt inversion.")
322 ) .AND. .NOT. ls_scf_env%sign_symmetric) &
323 cpabort(
"DIRECT submatrix sign methods require SIGN_SYMMETRIC being set.")
324 IF (ls_scf_env%fixed_mu .AND. ( &
327 )) cpabort(
"Invalid submatrix sign method for FIXED_MU.")
330 IF (ls_scf_env%sign_symmetric) ls_scf_env%use_s_sqrt = .true.
333 IF (ls_scf_env%max_scf < 0)
THEN
334 ls_scf_env%needs_s_inv = .false.
335 ls_scf_env%use_s_sqrt = .false.
336 ls_scf_env%has_s_preconditioner = .false.
341 ls_scf_env%ls_mstruct%do_pao = ls_scf_env%do_pao
343 IF (unit_nr > 0)
THEN
344 WRITE (unit_nr,
'()')
345 WRITE (unit_nr,
'(T2,A,A,A)') repeat(
"-", 30),
" Linear scaling SCF ", repeat(
"-", 29)
346 WRITE (unit_nr,
'(T2,A,T61,E20.3)')
"eps_scf:", ls_scf_env%eps_scf
347 WRITE (unit_nr,
'(T2,A,T61,E20.3)')
"eps_filter:", ls_scf_env%eps_filter
348 IF (ls_scf_env%do_rho_mixing)
THEN
349 IF (ls_scf_env%density_mixing_method > 0)
THEN
354 WRITE (unit_nr,
"(T2,A,T61,A20)") &
355 "Density mixing in g-space:", adjustr(trim(
enum_i2c(enum, &
356 ls_scf_env%density_mixing_method)))
360 WRITE (unit_nr,
'(T2,A,T61,E20.3)')
"mixing_fraction:", ls_scf_env%mixing_fraction
362 WRITE (unit_nr,
'(T2,A,T61,I20)')
"max_scf:", ls_scf_env%max_scf
363 IF (ls_scf_env%ls_diis)
THEN
364 WRITE (unit_nr,
'(T2,A,T61,I20)')
"DIIS: max_diis:", ls_scf_env%max_diis
365 WRITE (unit_nr,
'(T2,A,T61,E20.3)')
"DIIS: eps_diis:", ls_scf_env%eps_diis
366 WRITE (unit_nr,
'(T2,A,T61,I20)')
"DIIS: ini_diis:", ls_scf_env%iter_ini_diis
367 WRITE (unit_nr,
'(T2,A,T61,I20)')
"DIIS: nmixing:", ls_scf_env%nmixing
369 WRITE (unit_nr,
'(T2,A,T61,L20)')
"fixed chemical potential (mu)", ls_scf_env%fixed_mu
370 WRITE (unit_nr,
'(T2,A,T61,L20)')
"has unit metric:", ls_scf_env%has_unit_metric
371 WRITE (unit_nr,
'(T2,A,T61,L20)')
"Computing inv(S):", ls_scf_env%needs_s_inv
372 WRITE (unit_nr,
'(T2,A,T61,L20)')
"Computing sqrt(S):", ls_scf_env%use_s_sqrt
373 WRITE (unit_nr,
'(T2,A,T61,L20)')
"Computing S preconditioner ", ls_scf_env%has_s_preconditioner
375 SELECT CASE (ls_scf_env%s_sqrt_method)
377 WRITE (unit_nr,
'(T2,A,T61,A20)')
"S sqrt method:",
"NEWTONSCHULZ"
379 WRITE (unit_nr,
'(T2,A,T61,A20)')
"S sqrt method:",
"PROOT"
381 cpabort(
"Unknown sqrt method.")
384 WRITE (unit_nr,
'(T2,A,T61,I20)')
"S sqrt order:", ls_scf_env%s_sqrt_order
385 WRITE (unit_nr,
'(T2,A,T61,I20)')
"Extrapolation order:", ls_scf_env%extrapolation_order
387 SELECT CASE (ls_scf_env%s_preconditioner_type)
389 WRITE (unit_nr,
'(T2,A,T61,A20)')
"S preconditioner type ",
"NONE"
391 WRITE (unit_nr,
'(T2,A,T61,A20)')
"S preconditioner type ",
"ATOMIC"
393 WRITE (unit_nr,
'(T2,A,T61,A20)')
"S preconditioner type ",
"MOLECULAR"
396 WRITE (unit_nr,
'(T2,A,T61,L20)')
"Polarized Atomic Orbitals (PAO) ", ls_scf_env%do_pao
398 IF (ls_scf_env%curvy_steps)
THEN
399 WRITE (unit_nr,
'(T2,A,T61,A30)')
"Using curvy steps to optimize the density matrix"
403 SELECT CASE (ls_scf_env%purification_method)
405 WRITE (unit_nr,
'(T2,A,T51,A30)')
"Purification method", adjustr(
"sign iteration")
406 SELECT CASE (ls_scf_env%sign_method)
408 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Sign method:", adjustr(
"newton schulz")
410 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Sign method:", adjustr(
"p-th root method")
412 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Sign method:", adjustr(
"submatrix method")
413 SELECT CASE (ls_scf_env%submatrix_sign_method)
415 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Submatrix sign method:", adjustr(
"newton schulz")
417 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Submatrix sign method:", adjustr(
"direct")
419 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Submatrix sign method:", adjustr(
"direct mu-adj")
421 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Submatrix sign method:", adjustr(
"direct mu-adj lowmem")
423 cpabort(
"Unkown submatrix sign method.")
426 cpabort(
"Unknown sign method.")
428 WRITE (unit_nr,
'(T2,A,T61,I20)')
"Sign order:", ls_scf_env%sign_order
429 WRITE (unit_nr,
'(T2,A,T61,L20)')
"Symmetric sign calculation:", ls_scf_env%sign_symmetric
432 WRITE (unit_nr,
'(T2,A,T51,A30)')
"Purification method", adjustr(
"Trace conserving 2nd order")
435 WRITE (unit_nr,
'(T2,A,T51,A30)')
"Purification method", adjustr(
"Trace resetting 4th order")
439 WRITE (unit_nr,
'(T2,A,T51,A20)')
"Purification method", adjustr(
"PEXSI")
444 SELECT CASE (ls_scf_env%ls_mstruct%cluster_type)
446 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Cluster type", adjustr(
"ATOMIC")
448 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Cluster type", adjustr(
"MOLECULAR")
450 cpabort(
"Unknown cluster type")
453 IF (ls_scf_env%chebyshev%compute_chebyshev)
THEN
454 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Computing Chebyshev", adjustr(
"TRUE")
455 WRITE (unit_nr,
'(T2,A,T61,I20)')
"N_CHEBYSHEV:", ls_scf_env%chebyshev%n_chebyshev
456 WRITE (unit_nr,
'(T2,A,T61,I20)')
"N_GRIDPOINT_DOS:", ls_scf_env%chebyshev%n_gridpoint_dos
458 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Computing Chebyshev", adjustr(
"FALSE")
461 WRITE (unit_nr,
'(T2,A,T61,L20)')
"Using PAO", ls_scf_env%do_pao
463 WRITE (unit_nr,
'(T2,A)') repeat(
"-", 79)
464 WRITE (unit_nr,
'()')
468 CALL timestop(handle)
470 END SUBROUTINE ls_scf_init_read_write_input
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.
Defines the basic variable types.
integer, parameter, public dp
Machine interface based on Fortran 2003 and POSIX.
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
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.
subroutine, public pao_init(qs_env, ls_scf_env)
Initialize the PAO environment.
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...
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_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, 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, 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, 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, rhs)
Set the QUICKSTEP environment.