(git:0de0cc2)
ec_environment.F
Go to the documentation of this file.
1 !--------------------------------------------------------------------------------------------------!
2 ! CP2K: A general program to perform molecular dynamics simulations !
3 ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 ! !
5 ! SPDX-License-Identifier: GPL-2.0-or-later !
6 !--------------------------------------------------------------------------------------------------!
7 
8 ! **************************************************************************************************
9 !> \brief Energy correction environment setup and handling
10 !> \par History
11 !> 2019.09 created
12 !> \author JGH
13 ! **************************************************************************************************
15  USE atomic_kind_types, ONLY: atomic_kind_type
20  gto_basis_set_type
21  USE bibliography, ONLY: niklasson2003,&
23  cite_reference
24  USE cp_control_types, ONLY: dft_control_type
27  cp_logger_type
28  USE dm_ls_scf_types, ONLY: ls_scf_env_type
29  USE ec_env_types, ONLY: energy_correction_type
30  USE input_constants, ONLY: &
41  section_vals_type,&
43  USE kinds, ONLY: dp
44  USE message_passing, ONLY: mp_para_env_type
45  USE molecule_types, ONLY: molecule_of_atom,&
46  molecule_type
48  USE particle_types, ONLY: particle_type
51  USE qs_dispersion_types, ONLY: qs_dispersion_type
53  USE qs_environment_types, ONLY: get_qs_env,&
54  qs_environment_type
56  USE qs_kind_types, ONLY: get_qs_kind,&
58  qs_kind_type
59  USE qs_rho_types, ONLY: qs_rho_type
60  USE string_utilities, ONLY: uppercase
64 #include "./base/base_uses.f90"
65 
66  IMPLICIT NONE
67 
68  PRIVATE
69 
70  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'ec_environment'
71 
72  PUBLIC :: ec_env_create
73  PUBLIC :: ec_write_input
74 
75 CONTAINS
76 
77 ! **************************************************************************************************
78 !> \brief Allocates and intitializes ec_env
79 !> \param qs_env The QS environment
80 !> \param ec_env The energy correction environment (the object to create)
81 !> \param dft_section The DFT section
82 !> \param ec_section The energy correction input section
83 !> \par History
84 !> 2019.09 created
85 !> \author JGH
86 ! **************************************************************************************************
87  SUBROUTINE ec_env_create(qs_env, ec_env, dft_section, ec_section)
88  TYPE(qs_environment_type), POINTER :: qs_env
89  TYPE(energy_correction_type), POINTER :: ec_env
90  TYPE(section_vals_type), POINTER :: dft_section
91  TYPE(section_vals_type), OPTIONAL, POINTER :: ec_section
92 
93  cpassert(.NOT. ASSOCIATED(ec_env))
94  ALLOCATE (ec_env)
95  CALL init_ec_env(qs_env, ec_env, dft_section, ec_section)
96 
97  END SUBROUTINE ec_env_create
98 
99 ! **************************************************************************************************
100 !> \brief Initializes energy correction environment
101 !> \param qs_env The QS environment
102 !> \param ec_env The energy correction environment
103 !> \param dft_section The DFT section
104 !> \param ec_section The energy correction input section
105 !> \par History
106 !> 2019.09 created
107 !> \author JGH
108 ! **************************************************************************************************
109  SUBROUTINE init_ec_env(qs_env, ec_env, dft_section, ec_section)
110  TYPE(qs_environment_type), POINTER :: qs_env
111  TYPE(energy_correction_type), POINTER :: ec_env
112  TYPE(section_vals_type), POINTER :: dft_section
113  TYPE(section_vals_type), OPTIONAL, POINTER :: ec_section
114 
115  CHARACTER(LEN=*), PARAMETER :: routinen = 'init_ec_env'
116 
117  INTEGER :: handle, ikind, maxlgto, nkind, unit_nr
118  LOGICAL :: explicit
119  REAL(kind=dp) :: eps_pgf_orb
120  TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
121  TYPE(cp_logger_type), POINTER :: logger
122  TYPE(dft_control_type), POINTER :: dft_control
123  TYPE(gto_basis_set_type), POINTER :: basis_set, harris_basis
124  TYPE(mp_para_env_type), POINTER :: para_env
125  TYPE(qs_dispersion_type), POINTER :: dispersion_env
126  TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
127  TYPE(qs_kind_type), POINTER :: qs_kind
128  TYPE(qs_rho_type), POINTER :: rho
129  TYPE(section_vals_type), POINTER :: ec_hfx_section, nl_section, pp_section, &
130  section1, section2, xc_fun_section, &
131  xc_section
132 
133  CALL timeset(routinen, handle)
134 
135  NULLIFY (atomic_kind_set, dispersion_env, ec_env%ls_env, para_env)
136  NULLIFY (ec_env%sab_orb, ec_env%sac_ppl, ec_env%sap_ppnl)
137  NULLIFY (ec_env%matrix_ks, ec_env%matrix_h, ec_env%matrix_s)
138  NULLIFY (ec_env%matrix_t, ec_env%matrix_p, ec_env%matrix_w)
139  NULLIFY (ec_env%task_list)
140  NULLIFY (ec_env%mao_coef)
141  NULLIFY (ec_env%force)
142  NULLIFY (ec_env%dispersion_env)
143  NULLIFY (ec_env%xc_section)
144  NULLIFY (ec_env%matrix_z)
145  NULLIFY (ec_env%matrix_hz)
146  NULLIFY (ec_env%matrix_wz)
147  NULLIFY (ec_env%z_admm)
148  NULLIFY (ec_env%p_env)
149  NULLIFY (ec_env%vxc_rspace)
150  NULLIFY (ec_env%vtau_rspace)
151  NULLIFY (ec_env%vadmm_rspace)
152  NULLIFY (ec_env%rhoout_r, ec_env%rhoz_r)
153  NULLIFY (ec_env%x_data)
154  ec_env%should_update = .true.
155  ec_env%mao = .false.
156  ec_env%do_ec_admm = .false.
157  ec_env%do_ec_hfx = .false.
158  ec_env%reuse_hfx = .false.
159 
160  IF (qs_env%energy_correction) THEN
161 
162  cpassert(PRESENT(ec_section))
163  ! get a useful output_unit
164  logger => cp_get_default_logger()
165  IF (logger%para_env%is_source()) THEN
166  unit_nr = cp_logger_get_default_unit_nr(logger, local=.true.)
167  ELSE
168  unit_nr = -1
169  END IF
170 
171  CALL section_vals_val_get(ec_section, "ALGORITHM", &
172  i_val=ec_env%ks_solver)
173  CALL section_vals_val_get(ec_section, "ENERGY_FUNCTIONAL", &
174  i_val=ec_env%energy_functional)
175  CALL section_vals_val_get(ec_section, "FACTORIZATION", &
176  i_val=ec_env%factorization)
177  CALL section_vals_val_get(ec_section, "OT_INITIAL_GUESS", &
178  i_val=ec_env%ec_initial_guess)
179  CALL section_vals_val_get(ec_section, "EPS_DEFAULT", &
180  r_val=ec_env%eps_default)
181  CALL section_vals_val_get(ec_section, "HARRIS_BASIS", &
182  c_val=ec_env%basis)
183  CALL section_vals_val_get(ec_section, "MAO", &
184  l_val=ec_env%mao)
185  CALL section_vals_val_get(ec_section, "MAO_MAX_ITER", &
186  i_val=ec_env%mao_max_iter)
187  CALL section_vals_val_get(ec_section, "MAO_EPS_GRAD", &
188  r_val=ec_env%mao_eps_grad)
189  CALL section_vals_val_get(ec_section, "MAO_EPS1", &
190  r_val=ec_env%mao_eps1)
191  CALL section_vals_val_get(ec_section, "MAO_IOLEVEL", &
192  i_val=ec_env%mao_iolevel)
193  ! Skip EC calculation if ground-state calculation did not converge
194  CALL section_vals_val_get(ec_section, "SKIP_EC", &
195  l_val=ec_env%skip_ec)
196  ! Debug output
197  CALL section_vals_val_get(ec_section, "DEBUG_FORCES", &
198  l_val=ec_env%debug_forces)
199  CALL section_vals_val_get(ec_section, "DEBUG_STRESS", &
200  l_val=ec_env%debug_stress)
201  ! ADMM
202  CALL section_vals_val_get(ec_section, "ADMM", l_val=ec_env%do_ec_admm)
203 
204  ec_env%do_skip = .false.
205 
206  ! set basis
207  CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, nkind=nkind)
208  CALL uppercase(ec_env%basis)
209  SELECT CASE (ec_env%basis)
210  CASE ("ORBITAL")
211  DO ikind = 1, nkind
212  qs_kind => qs_kind_set(ikind)
213  CALL get_qs_kind(qs_kind=qs_kind, basis_set=basis_set, basis_type="ORB")
214  IF (ASSOCIATED(basis_set)) THEN
215  NULLIFY (harris_basis)
216  CALL get_qs_kind(qs_kind=qs_kind, basis_set=harris_basis, basis_type="HARRIS")
217  IF (ASSOCIATED(harris_basis)) THEN
218  CALL remove_basis_from_container(qs_kind%basis_sets, basis_type="HARRIS")
219  END IF
220  NULLIFY (harris_basis)
221  CALL copy_gto_basis_set(basis_set, harris_basis)
222  CALL add_basis_set_to_container(qs_kind%basis_sets, harris_basis, "HARRIS")
223  END IF
224  END DO
225  CASE ("PRIMITIVE")
226  DO ikind = 1, nkind
227  qs_kind => qs_kind_set(ikind)
228  CALL get_qs_kind(qs_kind=qs_kind, basis_set=basis_set, basis_type="ORB")
229  IF (ASSOCIATED(basis_set)) THEN
230  NULLIFY (harris_basis)
231  CALL get_qs_kind(qs_kind=qs_kind, basis_set=harris_basis, basis_type="HARRIS")
232  IF (ASSOCIATED(harris_basis)) THEN
233  CALL remove_basis_from_container(qs_kind%basis_sets, basis_type="HARRIS")
234  END IF
235  NULLIFY (harris_basis)
236  CALL create_primitive_basis_set(basis_set, harris_basis)
237  CALL get_qs_env(qs_env, dft_control=dft_control)
238  eps_pgf_orb = dft_control%qs_control%eps_pgf_orb
239  CALL init_interaction_radii_orb_basis(harris_basis, eps_pgf_orb)
240  harris_basis%kind_radius = basis_set%kind_radius
241  CALL add_basis_set_to_container(qs_kind%basis_sets, harris_basis, "HARRIS")
242  END IF
243  END DO
244  CASE ("HARRIS")
245  DO ikind = 1, nkind
246  qs_kind => qs_kind_set(ikind)
247  NULLIFY (harris_basis)
248  CALL get_qs_kind(qs_kind=qs_kind, basis_set=harris_basis, basis_type="HARRIS")
249  IF (.NOT. ASSOCIATED(harris_basis)) THEN
250  cpwarn("Harris Basis not defined for all types of atoms.")
251  END IF
252  END DO
253  CASE DEFAULT
254  cpabort("Unknown basis set for energy correction (Harris functional)")
255  END SELECT
256  !
257  CALL get_qs_kind_set(qs_kind_set, maxlgto=maxlgto, basis_type="HARRIS")
258  CALL init_orbital_pointers(maxlgto + 1)
259  !
260  CALL uppercase(ec_env%basis)
261 
262  ! Basis may only differ from ground-state if explicitly added
263  ec_env%basis_inconsistent = .false.
264  IF (ec_env%basis == "HARRIS") THEN
265  DO ikind = 1, nkind
266  qs_kind => qs_kind_set(ikind)
267  ! Basis sets of ground-state
268  CALL get_qs_kind(qs_kind=qs_kind, basis_set=basis_set, basis_type="ORB")
269  ! Basis sets of energy correction
270  CALL get_qs_kind(qs_kind=qs_kind, basis_set=harris_basis, basis_type="HARRIS")
271 
272  IF (basis_set%name .NE. harris_basis%name) THEN
273  ec_env%basis_inconsistent = .true.
274  END IF
275  END DO
276  END IF
277 
278  !Density-corrected DFT must be performed with the same basis as ground-state
279  IF (ec_env%energy_functional == ec_functional_dc .AND. ec_env%basis_inconsistent) THEN
280  CALL cp_abort(__location__, &
281  "DC-DFT: Correction and ground state need to use the same basis. "// &
282  "Checked by comparing basis set names only.")
283  END IF
284  !
285  ! set functional
286  SELECT CASE (ec_env%energy_functional)
287  CASE (ec_functional_harris)
288  ec_env%ec_name = "Harris"
289  CASE (ec_functional_dc)
290  ec_env%ec_name = "DC-DFT"
291  CASE DEFAULT
292  cpabort("unknown energy correction")
293  END SELECT
294  ! select the XC section
295  NULLIFY (xc_section)
296  xc_section => section_vals_get_subs_vals(dft_section, "XC")
297  section1 => section_vals_get_subs_vals(ec_section, "XC")
298  section2 => section_vals_get_subs_vals(ec_section, "XC%XC_FUNCTIONAL")
299  CALL section_vals_get(section2, explicit=explicit)
300  IF (explicit) THEN
301  CALL xc_functionals_expand(section2, section1)
302  ec_env%xc_section => section1
303  ELSE
304  ec_env%xc_section => xc_section
305  END IF
306  ! Check whether energy correction requires the kinetic energy density and rebuild rho if necessary
307  CALL get_qs_env(qs_env, dft_control=dft_control, rho=rho)
308  xc_fun_section => section_vals_get_subs_vals(ec_env%xc_section, "XC_FUNCTIONAL")
309  dft_control%use_kinetic_energy_density = dft_control%use_kinetic_energy_density .OR. &
310  xc_uses_kinetic_energy_density(xc_fun_section, dft_control%lsd)
311  ! Same for density gradient
312  dft_control%drho_by_collocation = dft_control%drho_by_collocation .OR. &
313  (xc_uses_norm_drho(xc_fun_section, dft_control%lsd) .AND. &
314  (section_get_ival(xc_section, "XC_GRID%XC_DERIV") == xc_deriv_collocate))
315  ! dispersion
316  ALLOCATE (dispersion_env)
317  NULLIFY (xc_section)
318  xc_section => ec_env%xc_section
319  CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, para_env=para_env)
320  CALL qs_dispersion_env_set(dispersion_env, xc_section)
321  IF (dispersion_env%type == xc_vdw_fun_pairpot) THEN
322  NULLIFY (pp_section)
323  pp_section => section_vals_get_subs_vals(xc_section, "VDW_POTENTIAL%PAIR_POTENTIAL")
324  CALL qs_dispersion_pairpot_init(atomic_kind_set, qs_kind_set, dispersion_env, pp_section, para_env)
325  ELSE IF (dispersion_env%type == xc_vdw_fun_nonloc) THEN
326  cpabort("nl-vdW functionals not available for EC calculations")
327  NULLIFY (nl_section)
328  nl_section => section_vals_get_subs_vals(xc_section, "VDW_POTENTIAL%NON_LOCAL")
329  CALL qs_dispersion_nonloc_init(dispersion_env, para_env)
330  END IF
331  ec_env%dispersion_env => dispersion_env
332 
333  ! Check if hybrid functional are used
334  ec_hfx_section => section_vals_get_subs_vals(ec_section, "XC%HF")
335  CALL section_vals_get(ec_hfx_section, explicit=ec_env%do_ec_hfx)
336 
337  ! Initialize Harris LS solver environment
338  ec_env%use_ls_solver = .false.
339  ec_env%use_ls_solver = (ec_env%ks_solver .EQ. ec_matrix_sign) &
340  .OR. (ec_env%ks_solver .EQ. ec_matrix_trs4) &
341  .OR. (ec_env%ks_solver .EQ. ec_matrix_tc2)
342 
343  IF (ec_env%use_ls_solver) THEN
344  CALL ec_ls_create(qs_env, ec_env)
345  END IF
346 
347  END IF
348 
349  CALL timestop(handle)
350 
351  END SUBROUTINE init_ec_env
352 
353 ! **************************************************************************************************
354 !> \brief Initializes linear scaling environment for LS based solver of
355 !> Harris energy functional and parses input section
356 !> \param qs_env ...
357 !> \param ec_env ...
358 !> \par History
359 !> 2020.10 created [Fabian Belleflamme]
360 !> \author Fabian Belleflamme
361 ! **************************************************************************************************
362  SUBROUTINE ec_ls_create(qs_env, ec_env)
363  TYPE(qs_environment_type), POINTER :: qs_env
364  TYPE(energy_correction_type), POINTER :: ec_env
365 
366  CHARACTER(LEN=*), PARAMETER :: routinen = 'ec_ls_create'
367 
368  INTEGER :: handle
369  REAL(kind=dp) :: mu
370  TYPE(dft_control_type), POINTER :: dft_control
371  TYPE(ls_scf_env_type), POINTER :: ls_env
372  TYPE(molecule_type), DIMENSION(:), POINTER :: molecule_set
373  TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
374  TYPE(section_vals_type), POINTER :: ec_section, input
375 
376  CALL timeset(routinen, handle)
377 
378  ALLOCATE (ec_env%ls_env)
379  ls_env => ec_env%ls_env
380 
381  NULLIFY (dft_control, input, ls_env%para_env)
382 
383  CALL get_qs_env(qs_env, &
384  dft_control=dft_control, &
385  input=input, &
386  molecule_set=molecule_set, &
387  particle_set=particle_set, &
388  para_env=ls_env%para_env, &
389  nelectron_spin=ls_env%nelectron_spin)
390 
391  ! copy some basic stuff
392  ls_env%nspins = dft_control%nspins
393  ls_env%natoms = SIZE(particle_set, 1)
394  CALL ls_env%para_env%retain()
395 
396  ! initialize block to group to defined molecules
397  ALLOCATE (ls_env%ls_mstruct%atom_to_molecule(ls_env%natoms))
398  CALL molecule_of_atom(molecule_set, atom_to_mol=ls_env%ls_mstruct%atom_to_molecule)
399 
400  ls_env%do_transport = .false.
401  ls_env%do_pao = .false.
402  ls_env%ls_mstruct%do_pao = ls_env%do_pao
403  ls_env%do_pexsi = .false.
404  ls_env%has_unit_metric = .false.
405 
406  ec_section => section_vals_get_subs_vals(input, "DFT%ENERGY_CORRECTION")
407  CALL section_vals_val_get(ec_section, "EPS_FILTER", r_val=ls_env%eps_filter)
408  CALL section_vals_val_get(ec_section, "MU", r_val=mu)
409  CALL section_vals_val_get(ec_section, "FIXED_MU", l_val=ls_env%fixed_mu)
410  ls_env%mu_spin = mu
411  CALL section_vals_val_get(ec_section, "S_PRECONDITIONER", i_val=ls_env%s_preconditioner_type)
412  CALL section_vals_val_get(ec_section, "MATRIX_CLUSTER_TYPE", i_val=ls_env%ls_mstruct%cluster_type)
413  CALL section_vals_val_get(ec_section, "S_INVERSION", i_val=ls_env%s_inversion_type)
414  CALL section_vals_val_get(ec_section, "CHECK_S_INV", l_val=ls_env%check_s_inv)
415  CALL section_vals_val_get(ec_section, "REPORT_ALL_SPARSITIES", l_val=ls_env%report_all_sparsities)
416  CALL section_vals_val_get(ec_section, "SIGN_METHOD", i_val=ls_env%sign_method)
417  CALL section_vals_val_get(ec_section, "SIGN_ORDER", i_val=ls_env%sign_order)
418  CALL section_vals_val_get(ec_section, "DYNAMIC_THRESHOLD", l_val=ls_env%dynamic_threshold)
419  CALL section_vals_val_get(ec_section, "NON_MONOTONIC", l_val=ls_env%non_monotonic)
420  CALL section_vals_val_get(ec_section, "S_SQRT_METHOD", i_val=ls_env%s_sqrt_method)
421  CALL section_vals_val_get(ec_section, "S_SQRT_ORDER", i_val=ls_env%s_sqrt_order)
422  CALL section_vals_val_get(ec_section, "EPS_LANCZOS", r_val=ls_env%eps_lanczos)
423  CALL section_vals_val_get(ec_section, "MAX_ITER_LANCZOS", i_val=ls_env%max_iter_lanczos)
424 
425  SELECT CASE (ec_env%ks_solver)
426  CASE (ec_matrix_sign)
427  ! S inverse required for Sign matrix algorithm,
428  ! calculated either by Hotelling or multiplying S matrix sqrt inv
429  SELECT CASE (ls_env%s_inversion_type)
431  ls_env%needs_s_inv = .true.
432  ls_env%use_s_sqrt = .true.
434  ls_env%needs_s_inv = .true.
435  ls_env%use_s_sqrt = .false.
436  CASE (ls_s_inversion_none)
437  ls_env%needs_s_inv = .false.
438  ls_env%use_s_sqrt = .false.
439  CASE DEFAULT
440  cpabort("")
441  END SELECT
443  ls_env%needs_s_inv = .false.
444  ls_env%use_s_sqrt = .true.
445  CASE DEFAULT
446  cpabort("")
447  END SELECT
448 
449  SELECT CASE (ls_env%s_preconditioner_type)
451  ls_env%has_s_preconditioner = .false.
452  CASE DEFAULT
453  ls_env%has_s_preconditioner = .true.
454  END SELECT
455 
456  ! buffer for the history of matrices, not needed here
457  ls_env%extrapolation_order = 0
458  ls_env%scf_history%nstore = 0
459  ls_env%scf_history%istore = 0
460  ALLOCATE (ls_env%scf_history%matrix(ls_env%nspins, ls_env%scf_history%nstore))
461 
462  NULLIFY (ls_env%mixing_store)
463 
464  CALL timestop(handle)
465 
466  END SUBROUTINE ec_ls_create
467 
468 ! **************************************************************************************************
469 !> \brief Print out the energy correction input section
470 !>
471 !> \param ec_env ...
472 !> \par History
473 !> 2020.10 created [Fabian Belleflamme]
474 !> \author Fabian Belleflamme
475 ! **************************************************************************************************
476  SUBROUTINE ec_write_input(ec_env)
477  TYPE(energy_correction_type), POINTER :: ec_env
478 
479  CHARACTER(LEN=*), PARAMETER :: routinen = 'ec_write_input'
480 
481  INTEGER :: handle, unit_nr
482  TYPE(cp_logger_type), POINTER :: logger
483  TYPE(ls_scf_env_type), POINTER :: ls_env
484 
485  CALL timeset(routinen, handle)
486 
487  logger => cp_get_default_logger()
488  IF (logger%para_env%is_source()) THEN
489  unit_nr = cp_logger_get_default_unit_nr(logger, local=.true.)
490  ELSE
491  unit_nr = -1
492  END IF
493 
494  IF (unit_nr > 0) THEN
495 
496  WRITE (unit_nr, '(T2,A)') &
497  "!"//repeat("-", 29)//" Energy Correction "//repeat("-", 29)//"!"
498 
499  ! Type of energy correction
500  SELECT CASE (ec_env%energy_functional)
501  CASE (ec_functional_harris)
502  WRITE (unit_nr, '(T2,A,T61,A20)') "Energy Correction: ", "HARRIS FUNCTIONAL"
503  CASE (ec_functional_dc)
504  WRITE (unit_nr, '(T2,A,T61,A20)') "Energy Correction: ", "DC-DFT"
505  END SELECT
506  WRITE (unit_nr, '()')
507 
508  ! Energy correction parameters
509  WRITE (unit_nr, '(T2,A,T61,E20.3)') "eps_default:", ec_env%eps_default
510 
511  CALL uppercase(ec_env%basis)
512  SELECT CASE (ec_env%basis)
513  CASE ("ORBITAL")
514  WRITE (unit_nr, '(T2,A,T61,A20)') "EC basis: ", "ORBITAL"
515  CASE ("PRIMITIVE")
516  WRITE (unit_nr, '(T2,A,T61,A20)') "EC basis: ", "PRIMITIVE"
517  CASE ("HARRIS")
518  WRITE (unit_nr, '(T2,A,T61,A20)') "EC Basis: ", "HARRIS"
519  END SELECT
520 
521  ! Info how HFX in energy correction is treated
522  IF (ec_env%do_ec_hfx) THEN
523 
524  WRITE (unit_nr, '(T2,A,T61,L20)') "DC-DFT with HFX", ec_env%do_ec_hfx
525  WRITE (unit_nr, '(T2,A,T61,L20)') "Reuse HFX integrals", ec_env%reuse_hfx
526  WRITE (unit_nr, '(T2,A,T61,L20)') "DC-DFT HFX with ADMM", ec_env%do_ec_admm
527 
528  END IF ! ec_env%do_ec_hfx
529 
530  ! Parameters for Harris functional solver
531  IF (ec_env%energy_functional == ec_functional_harris) THEN
532 
533  ! Algorithm
534  SELECT CASE (ec_env%ks_solver)
535  CASE (ec_diagonalization)
536  WRITE (unit_nr, '(T2,A,T61,A20)') "Algorithm: ", "DIAGONALIZATION"
537  CASE (ec_ot_diag)
538  WRITE (unit_nr, '(T2,A,T61,A20)') "Algorithm: ", "OT DIAGONALIZATION"
539  CASE (ec_matrix_sign)
540  WRITE (unit_nr, '(T2,A,T61,A20)') "Algorithm: ", "MATRIX_SIGN"
541  CASE (ec_matrix_trs4)
542  WRITE (unit_nr, '(T2,A,T61,A20)') "Algorithm: ", "TRS4"
543  CALL cite_reference(niklasson2003)
544  CASE (ec_matrix_tc2)
545  WRITE (unit_nr, '(T2,A,T61,A20)') "Algorithm: ", "TC2"
546  CALL cite_reference(niklasson2014)
547  END SELECT
548  WRITE (unit_nr, '()')
549 
550  ! MAO
551  IF (ec_env%mao) THEN
552  WRITE (unit_nr, '(T2,A,T61,L20)') "MAO:", ec_env%mao
553  WRITE (unit_nr, '(T2,A,T61,L20)') "MAO_IOLEVEL:", ec_env%mao_iolevel
554  WRITE (unit_nr, '(T2,A,T61,I20)') "MAO_MAX_ITER:", ec_env%mao_max_iter
555  WRITE (unit_nr, '(T2,A,T61,E20.3)') "MAO_EPS_GRAD:", ec_env%mao_eps_grad
556  WRITE (unit_nr, '(T2,A,T61,E20.3)') "MAO_EPS1:", ec_env%mao_eps1
557  WRITE (unit_nr, '()')
558  END IF
559 
560  ! Parameters for linear response solver
561  IF (.NOT. ec_env%use_ls_solver) THEN
562 
563  WRITE (unit_nr, '(T2,A)') "MO Solver"
564  WRITE (unit_nr, '()')
565 
566  SELECT CASE (ec_env%ks_solver)
567  CASE (ec_diagonalization)
568 
569  SELECT CASE (ec_env%factorization)
570  CASE (kg_cholesky)
571  WRITE (unit_nr, '(T2,A,T61,A20)') "Factorization: ", "CHOLESKY"
572  END SELECT
573 
574  CASE (ec_ot_diag)
575 
576  ! OT Diagonalization
577  ! Initial guess : 1) block diagonal initial guess
578  ! 2) GS-density matrix (might require trafo if basis diff)
579 
580  SELECT CASE (ec_env%ec_initial_guess)
581  CASE (ec_ot_atomic)
582  WRITE (unit_nr, '(T2,A,T61,A20)') "OT Diag initial guess: ", "ATOMIC"
583  CASE (ec_ot_gs)
584  WRITE (unit_nr, '(T2,A,T61,A20)') "OT Diag initial guess: ", "GROUND STATE DM"
585  END SELECT
586 
587  CASE DEFAULT
588  cpabort("Unknown Diagonalization algorithm for Harris functional")
589  END SELECT
590 
591  ELSE
592 
593  WRITE (unit_nr, '(T2,A)') "AO Solver"
594  WRITE (unit_nr, '()')
595 
596  ls_env => ec_env%ls_env
597  WRITE (unit_nr, '(T2,A,T61,E20.3)') "eps_filter:", ls_env%eps_filter
598  WRITE (unit_nr, '(T2,A,T61,L20)') "fixed chemical potential (mu)", ls_env%fixed_mu
599  WRITE (unit_nr, '(T2,A,T61,L20)') "Computing inv(S):", ls_env%needs_s_inv
600  WRITE (unit_nr, '(T2,A,T61,L20)') "Computing sqrt(S):", ls_env%use_s_sqrt
601  WRITE (unit_nr, '(T2,A,T61,L20)') "Computing S preconditioner ", ls_env%has_s_preconditioner
602 
603  IF (ls_env%use_s_sqrt) THEN
604  SELECT CASE (ls_env%s_sqrt_method)
605  CASE (ls_s_sqrt_ns)
606  WRITE (unit_nr, '(T2,A,T61,A20)') "S sqrt method:", "NEWTONSCHULZ"
607  CASE (ls_s_sqrt_proot)
608  WRITE (unit_nr, '(T2,A,T61,A20)') "S sqrt method:", "PROOT"
609  CASE DEFAULT
610  cpabort("Unknown sqrt method.")
611  END SELECT
612  WRITE (unit_nr, '(T2,A,T61,I20)') "S sqrt order:", ls_env%s_sqrt_order
613  END IF
614 
615  SELECT CASE (ls_env%s_preconditioner_type)
617  WRITE (unit_nr, '(T2,A,T61,A20)') "S preconditioner type ", "NONE"
619  WRITE (unit_nr, '(T2,A,T61,A20)') "S preconditioner type ", "ATOMIC"
621  WRITE (unit_nr, '(T2,A,T61,A20)') "S preconditioner type ", "MOLECULAR"
622  END SELECT
623 
624  SELECT CASE (ls_env%ls_mstruct%cluster_type)
625  CASE (ls_cluster_atomic)
626  WRITE (unit_nr, '(T2,A,T61,A20)') "Cluster type", adjustr("ATOMIC")
627  CASE (ls_cluster_molecular)
628  WRITE (unit_nr, '(T2,A,T61,A20)') "Cluster type", adjustr("MOLECULAR")
629  CASE DEFAULT
630  cpabort("Unknown cluster type")
631  END SELECT
632 
633  END IF
634 
635  END IF ! if ec_functional_harris
636 
637  WRITE (unit_nr, '(T2,A)') repeat("-", 79)
638  WRITE (unit_nr, '()')
639 
640  END IF ! unit_nr
641 
642  CALL timestop(handle)
643 
644  END SUBROUTINE ec_write_input
645 
646 END MODULE ec_environment
Define the atomic kind types and their sub types.
subroutine, public remove_basis_from_container(container, inum, basis_type)
...
subroutine, public add_basis_set_to_container(container, basis_set, basis_set_type)
...
subroutine, public create_primitive_basis_set(basis_set, pbasis)
...
subroutine, public copy_gto_basis_set(basis_set_in, basis_set_out)
...
collects all references to literature in CP2K as new algorithms / method are included from literature...
Definition: bibliography.F:28
integer, save, public niklasson2014
Definition: bibliography.F:43
integer, save, public niklasson2003
Definition: bibliography.F:43
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
Types needed for a linear scaling quickstep SCF run based on the density matrix.
Types needed for a for a Energy Correction.
Definition: ec_env_types.F:14
Energy correction environment setup and handling.
subroutine, public ec_write_input(ec_env)
Print out the energy correction input section.
subroutine, public ec_env_create(qs_env, ec_env, dft_section, ec_section)
Allocates and intitializes ec_env.
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public ec_functional_harris
integer, parameter, public ec_functional_dc
integer, parameter, public ls_s_preconditioner_molecular
integer, parameter, public ls_s_inversion_hotelling
integer, parameter, public xc_vdw_fun_nonloc
integer, parameter, public ls_cluster_molecular
integer, parameter, public ec_ot_atomic
integer, parameter, public ls_s_preconditioner_atomic
integer, parameter, public ec_ot_diag
integer, parameter, public ec_ot_gs
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 ec_matrix_tc2
integer, parameter, public ec_diagonalization
integer, parameter, public ec_matrix_trs4
integer, parameter, public ec_matrix_sign
integer, parameter, public ls_s_inversion_sign_sqrt
integer, parameter, public xc_vdw_fun_pairpot
integer, parameter, public kg_cholesky
integer, parameter, public ls_cluster_atomic
checks the input and perform some automatic "magic" on it
subroutine, public xc_functionals_expand(functionals, xc_section)
expand a shortcutted functional section
objects that represent the structure of input sections and the data contained in an input section
integer function, public section_get_ival(section_vals, keyword_name)
...
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
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
Interface to the message passing library MPI.
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
Provides Cartesian and spherical orbital pointers and indices.
subroutine, public init_orbital_pointers(maxl)
Initialize or update the orbital pointers.
Define the data structure for the particle information.
Calculation of non local dispersion functionals Some routines adapted from: Copyright (C) 2001-2009 Q...
subroutine, public qs_dispersion_nonloc_init(dispersion_env, para_env)
...
Calculation of dispersion using pair potentials.
subroutine, public qs_dispersion_pairpot_init(atomic_kind_set, qs_kind_set, dispersion_env, pp_section, para_env)
...
Definition of disperson types for DFT calculations.
Set disperson types for DFT calculations.
subroutine, public qs_dispersion_env_set(dispersion_env, xc_section)
...
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.
Calculate the interaction radii for the operator matrix calculation.
subroutine, public init_interaction_radii_orb_basis(orb_basis_set, eps_pgf_orb, eps_pgf_short)
...
Define the quickstep kind type and their sub types.
Definition: qs_kind_types.F:23
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_r3d_rs_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, U_of_dft_plus_u, J_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, J0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, floating, name, element_symbol, pao_basis_size, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public get_qs_kind_set(qs_kind_set, all_potential_present, tnadd_potential_present, gth_potential_present, sgp_potential_present, paw_atom_present, dft_plus_u_atom_present, maxcgf, maxsgf, maxco, maxco_proj, maxgtops, maxlgto, maxlprj, maxnset, maxsgf_set, ncgf, npgf, nset, nsgf, nshell, maxpol, maxlppl, maxlppnl, maxppnl, nelectron, maxder, max_ngrid_rad, max_sph_harm, maxg_iso_not0, lmax_rho0, basis_rcut, basis_type, total_zeff_corr)
Get attributes of an atomic kind set.
superstucture that hold various representations of the density and keeps track of which ones are vali...
Definition: qs_rho_types.F:18
Utilities for string manipulations.
elemental subroutine, public uppercase(string)
Convert all lower case characters in a string to upper case.
input constants for xc
integer, parameter, public xc_deriv_collocate
Exchange and Correlation functional calculations.
Definition: xc.F:17
logical function, public xc_uses_norm_drho(xc_fun_section, lsd)
...
Definition: xc.F:111
logical function, public xc_uses_kinetic_energy_density(xc_fun_section, lsd)
...
Definition: xc.F:91