(git:374b731)
Loading...
Searching...
No Matches
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! **************************************************************************************************
21 USE bibliography, ONLY: niklasson2003,&
23 cite_reference
30 USE input_constants, ONLY: &
43 USE kinds, ONLY: dp
56 USE qs_kind_types, ONLY: get_qs_kind,&
59 USE qs_rho_types, ONLY: qs_rho_type
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
75CONTAINS
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)
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.
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)
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")
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
646END 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...
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
Types needed for a linear scaling quickstep SCF run based on the density matrix.
Types needed for a for a Energy Correction.
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.
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...
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
Provides all information about an atomic kind.
type of a logger, at the moment it contains just a print level starting at which level it should be l...
Contains information on the energy correction functional for KG.
stores all the informations relevant to an mpi environment
Provides all information about a quickstep kind.
keeps the density in various representations, keeping track of which ones are valid.