(git:d18deda)
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-2025 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 CALL section_vals_val_get(ec_section, "DEBUG_EXTERNAL_METHOD", &
202 l_val=ec_env%debug_external)
203 ! ADMM
204 CALL section_vals_val_get(ec_section, "ADMM", l_val=ec_env%do_ec_admm)
205 ! EXTERNAL
206 CALL section_vals_val_get(ec_section, "EXTERNAL_RESPONSE_FILENAME", &
207 c_val=ec_env%exresp_fn)
208 CALL section_vals_val_get(ec_section, "EXTERNAL_RESULT_FILENAME", &
209 c_val=ec_env%exresult_fn)
210 CALL section_vals_val_get(ec_section, "ERROR_ESTIMATION", &
211 l_val=ec_env%do_error)
212
213 ec_env%do_skip = .false.
214
215 ! set basis
216 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, nkind=nkind)
217 CALL uppercase(ec_env%basis)
218 SELECT CASE (ec_env%basis)
219 CASE ("ORBITAL")
220 DO ikind = 1, nkind
221 qs_kind => qs_kind_set(ikind)
222 CALL get_qs_kind(qs_kind=qs_kind, basis_set=basis_set, basis_type="ORB")
223 IF (ASSOCIATED(basis_set)) THEN
224 NULLIFY (harris_basis)
225 CALL get_qs_kind(qs_kind=qs_kind, basis_set=harris_basis, basis_type="HARRIS")
226 IF (ASSOCIATED(harris_basis)) THEN
227 CALL remove_basis_from_container(qs_kind%basis_sets, basis_type="HARRIS")
228 END IF
229 NULLIFY (harris_basis)
230 CALL copy_gto_basis_set(basis_set, harris_basis)
231 CALL add_basis_set_to_container(qs_kind%basis_sets, harris_basis, "HARRIS")
232 END IF
233 END DO
234 CASE ("PRIMITIVE")
235 DO ikind = 1, nkind
236 qs_kind => qs_kind_set(ikind)
237 CALL get_qs_kind(qs_kind=qs_kind, basis_set=basis_set, basis_type="ORB")
238 IF (ASSOCIATED(basis_set)) THEN
239 NULLIFY (harris_basis)
240 CALL get_qs_kind(qs_kind=qs_kind, basis_set=harris_basis, basis_type="HARRIS")
241 IF (ASSOCIATED(harris_basis)) THEN
242 CALL remove_basis_from_container(qs_kind%basis_sets, basis_type="HARRIS")
243 END IF
244 NULLIFY (harris_basis)
245 CALL create_primitive_basis_set(basis_set, harris_basis)
246 CALL get_qs_env(qs_env, dft_control=dft_control)
247 eps_pgf_orb = dft_control%qs_control%eps_pgf_orb
248 CALL init_interaction_radii_orb_basis(harris_basis, eps_pgf_orb)
249 harris_basis%kind_radius = basis_set%kind_radius
250 CALL add_basis_set_to_container(qs_kind%basis_sets, harris_basis, "HARRIS")
251 END IF
252 END DO
253 CASE ("HARRIS")
254 DO ikind = 1, nkind
255 qs_kind => qs_kind_set(ikind)
256 NULLIFY (harris_basis)
257 CALL get_qs_kind(qs_kind=qs_kind, basis_set=harris_basis, basis_type="HARRIS")
258 IF (.NOT. ASSOCIATED(harris_basis)) THEN
259 cpwarn("Harris Basis not defined for all types of atoms.")
260 END IF
261 END DO
262 CASE DEFAULT
263 cpabort("Unknown basis set for energy correction (Harris functional)")
264 END SELECT
265 !
266 CALL get_qs_kind_set(qs_kind_set, maxlgto=maxlgto, basis_type="HARRIS")
267 CALL init_orbital_pointers(maxlgto + 1)
268 !
269 CALL uppercase(ec_env%basis)
270
271 ! Basis may only differ from ground-state if explicitly added
272 ec_env%basis_inconsistent = .false.
273 IF (ec_env%basis == "HARRIS") THEN
274 DO ikind = 1, nkind
275 qs_kind => qs_kind_set(ikind)
276 ! Basis sets of ground-state
277 CALL get_qs_kind(qs_kind=qs_kind, basis_set=basis_set, basis_type="ORB")
278 ! Basis sets of energy correction
279 CALL get_qs_kind(qs_kind=qs_kind, basis_set=harris_basis, basis_type="HARRIS")
280
281 IF (basis_set%name .NE. harris_basis%name) THEN
282 ec_env%basis_inconsistent = .true.
283 END IF
284 END DO
285 END IF
286
287 !Density-corrected DFT must be performed with the same basis as ground-state
288 IF (ec_env%energy_functional == ec_functional_dc .AND. ec_env%basis_inconsistent) THEN
289 CALL cp_abort(__location__, &
290 "DC-DFT: Correction and ground state need to use the same basis. "// &
291 "Checked by comparing basis set names only.")
292 END IF
293 IF (ec_env%energy_functional == ec_functional_ext .AND. ec_env%basis_inconsistent) THEN
294 CALL cp_abort(__location__, &
295 "Exteranl Energy: Correction and ground state need to use the same basis. "// &
296 "Checked by comparing basis set names only.")
297 END IF
298 !
299 ! set functional
300 SELECT CASE (ec_env%energy_functional)
302 ec_env%ec_name = "Harris"
303 CASE (ec_functional_dc)
304 ec_env%ec_name = "DC-DFT"
305 CASE (ec_functional_ext)
306 ec_env%ec_name = "External Energy"
307 CASE DEFAULT
308 cpabort("unknown energy correction")
309 END SELECT
310 ! select the XC section
311 NULLIFY (xc_section)
312 xc_section => section_vals_get_subs_vals(dft_section, "XC")
313 section1 => section_vals_get_subs_vals(ec_section, "XC")
314 section2 => section_vals_get_subs_vals(ec_section, "XC%XC_FUNCTIONAL")
315 CALL section_vals_get(section2, explicit=explicit)
316 IF (explicit) THEN
317 CALL xc_functionals_expand(section2, section1)
318 ec_env%xc_section => section1
319 ELSE
320 ec_env%xc_section => xc_section
321 END IF
322 ! Check whether energy correction requires the kinetic energy density and rebuild rho if necessary
323 CALL get_qs_env(qs_env, dft_control=dft_control, rho=rho)
324 xc_fun_section => section_vals_get_subs_vals(ec_env%xc_section, "XC_FUNCTIONAL")
325 dft_control%use_kinetic_energy_density = dft_control%use_kinetic_energy_density .OR. &
326 xc_uses_kinetic_energy_density(xc_fun_section, dft_control%lsd)
327 ! Same for density gradient
328 dft_control%drho_by_collocation = dft_control%drho_by_collocation .OR. &
329 (xc_uses_norm_drho(xc_fun_section, dft_control%lsd) .AND. &
330 (section_get_ival(xc_section, "XC_GRID%XC_DERIV") == xc_deriv_collocate))
331 ! dispersion
332 ALLOCATE (dispersion_env)
333 NULLIFY (xc_section)
334 xc_section => ec_env%xc_section
335 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, para_env=para_env)
336 CALL qs_dispersion_env_set(dispersion_env, xc_section)
337 IF (dispersion_env%type == xc_vdw_fun_pairpot) THEN
338 NULLIFY (pp_section)
339 pp_section => section_vals_get_subs_vals(xc_section, "VDW_POTENTIAL%PAIR_POTENTIAL")
340 CALL qs_dispersion_pairpot_init(atomic_kind_set, qs_kind_set, dispersion_env, pp_section, para_env)
341 ELSE IF (dispersion_env%type == xc_vdw_fun_nonloc) THEN
342 cpabort("nl-vdW functionals not available for EC calculations")
343 NULLIFY (nl_section)
344 nl_section => section_vals_get_subs_vals(xc_section, "VDW_POTENTIAL%NON_LOCAL")
345 CALL qs_dispersion_nonloc_init(dispersion_env, para_env)
346 END IF
347 ec_env%dispersion_env => dispersion_env
348
349 ! Check if hybrid functional are used
350 ec_hfx_section => section_vals_get_subs_vals(ec_section, "XC%HF")
351 CALL section_vals_get(ec_hfx_section, explicit=ec_env%do_ec_hfx)
352
353 ! Initialize Harris LS solver environment
354 ec_env%use_ls_solver = .false.
355 ec_env%use_ls_solver = (ec_env%ks_solver .EQ. ec_matrix_sign) &
356 .OR. (ec_env%ks_solver .EQ. ec_matrix_trs4) &
357 .OR. (ec_env%ks_solver .EQ. ec_matrix_tc2)
358
359 IF (ec_env%use_ls_solver) THEN
360 CALL ec_ls_create(qs_env, ec_env)
361 END IF
362
363 END IF
364
365 CALL timestop(handle)
366
367 END SUBROUTINE init_ec_env
368
369! **************************************************************************************************
370!> \brief Initializes linear scaling environment for LS based solver of
371!> Harris energy functional and parses input section
372!> \param qs_env ...
373!> \param ec_env ...
374!> \par History
375!> 2020.10 created [Fabian Belleflamme]
376!> \author Fabian Belleflamme
377! **************************************************************************************************
378 SUBROUTINE ec_ls_create(qs_env, ec_env)
379 TYPE(qs_environment_type), POINTER :: qs_env
380 TYPE(energy_correction_type), POINTER :: ec_env
381
382 CHARACTER(LEN=*), PARAMETER :: routinen = 'ec_ls_create'
383
384 INTEGER :: handle
385 REAL(kind=dp) :: mu
386 TYPE(dft_control_type), POINTER :: dft_control
387 TYPE(ls_scf_env_type), POINTER :: ls_env
388 TYPE(molecule_type), DIMENSION(:), POINTER :: molecule_set
389 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
390 TYPE(section_vals_type), POINTER :: ec_section, input
391
392 CALL timeset(routinen, handle)
393
394 ALLOCATE (ec_env%ls_env)
395 ls_env => ec_env%ls_env
396
397 NULLIFY (dft_control, input, ls_env%para_env)
398
399 CALL get_qs_env(qs_env, &
400 dft_control=dft_control, &
401 input=input, &
402 molecule_set=molecule_set, &
403 particle_set=particle_set, &
404 para_env=ls_env%para_env, &
405 nelectron_spin=ls_env%nelectron_spin)
406
407 ! copy some basic stuff
408 ls_env%nspins = dft_control%nspins
409 ls_env%natoms = SIZE(particle_set, 1)
410 CALL ls_env%para_env%retain()
411
412 ! initialize block to group to defined molecules
413 ALLOCATE (ls_env%ls_mstruct%atom_to_molecule(ls_env%natoms))
414 CALL molecule_of_atom(molecule_set, atom_to_mol=ls_env%ls_mstruct%atom_to_molecule)
415
416 ls_env%do_transport = .false.
417 ls_env%do_pao = .false.
418 ls_env%ls_mstruct%do_pao = ls_env%do_pao
419 ls_env%do_pexsi = .false.
420 ls_env%has_unit_metric = .false.
421
422 ec_section => section_vals_get_subs_vals(input, "DFT%ENERGY_CORRECTION")
423 CALL section_vals_val_get(ec_section, "EPS_FILTER", r_val=ls_env%eps_filter)
424 CALL section_vals_val_get(ec_section, "MU", r_val=mu)
425 CALL section_vals_val_get(ec_section, "FIXED_MU", l_val=ls_env%fixed_mu)
426 ls_env%mu_spin = mu
427 CALL section_vals_val_get(ec_section, "S_PRECONDITIONER", i_val=ls_env%s_preconditioner_type)
428 CALL section_vals_val_get(ec_section, "MATRIX_CLUSTER_TYPE", i_val=ls_env%ls_mstruct%cluster_type)
429 CALL section_vals_val_get(ec_section, "S_INVERSION", i_val=ls_env%s_inversion_type)
430 CALL section_vals_val_get(ec_section, "CHECK_S_INV", l_val=ls_env%check_s_inv)
431 CALL section_vals_val_get(ec_section, "REPORT_ALL_SPARSITIES", l_val=ls_env%report_all_sparsities)
432 CALL section_vals_val_get(ec_section, "SIGN_METHOD", i_val=ls_env%sign_method)
433 CALL section_vals_val_get(ec_section, "SIGN_ORDER", i_val=ls_env%sign_order)
434 CALL section_vals_val_get(ec_section, "DYNAMIC_THRESHOLD", l_val=ls_env%dynamic_threshold)
435 CALL section_vals_val_get(ec_section, "NON_MONOTONIC", l_val=ls_env%non_monotonic)
436 CALL section_vals_val_get(ec_section, "S_SQRT_METHOD", i_val=ls_env%s_sqrt_method)
437 CALL section_vals_val_get(ec_section, "S_SQRT_ORDER", i_val=ls_env%s_sqrt_order)
438 CALL section_vals_val_get(ec_section, "EPS_LANCZOS", r_val=ls_env%eps_lanczos)
439 CALL section_vals_val_get(ec_section, "MAX_ITER_LANCZOS", i_val=ls_env%max_iter_lanczos)
440
441 SELECT CASE (ec_env%ks_solver)
442 CASE (ec_matrix_sign)
443 ! S inverse required for Sign matrix algorithm,
444 ! calculated either by Hotelling or multiplying S matrix sqrt inv
445 SELECT CASE (ls_env%s_inversion_type)
447 ls_env%needs_s_inv = .true.
448 ls_env%use_s_sqrt = .true.
450 ls_env%needs_s_inv = .true.
451 ls_env%use_s_sqrt = .false.
453 ls_env%needs_s_inv = .false.
454 ls_env%use_s_sqrt = .false.
455 CASE DEFAULT
456 cpabort("")
457 END SELECT
459 ls_env%needs_s_inv = .false.
460 ls_env%use_s_sqrt = .true.
461 CASE DEFAULT
462 cpabort("")
463 END SELECT
464
465 SELECT CASE (ls_env%s_preconditioner_type)
467 ls_env%has_s_preconditioner = .false.
468 CASE DEFAULT
469 ls_env%has_s_preconditioner = .true.
470 END SELECT
471
472 ! buffer for the history of matrices, not needed here
473 ls_env%extrapolation_order = 0
474 ls_env%scf_history%nstore = 0
475 ls_env%scf_history%istore = 0
476 ALLOCATE (ls_env%scf_history%matrix(ls_env%nspins, ls_env%scf_history%nstore))
477
478 NULLIFY (ls_env%mixing_store)
479
480 CALL timestop(handle)
481
482 END SUBROUTINE ec_ls_create
483
484! **************************************************************************************************
485!> \brief Print out the energy correction input section
486!>
487!> \param ec_env ...
488!> \par History
489!> 2020.10 created [Fabian Belleflamme]
490!> \author Fabian Belleflamme
491! **************************************************************************************************
492 SUBROUTINE ec_write_input(ec_env)
493 TYPE(energy_correction_type), POINTER :: ec_env
494
495 CHARACTER(LEN=*), PARAMETER :: routinen = 'ec_write_input'
496
497 INTEGER :: handle, unit_nr
498 TYPE(cp_logger_type), POINTER :: logger
499 TYPE(ls_scf_env_type), POINTER :: ls_env
500
501 CALL timeset(routinen, handle)
502
503 logger => cp_get_default_logger()
504 IF (logger%para_env%is_source()) THEN
505 unit_nr = cp_logger_get_default_unit_nr(logger, local=.true.)
506 ELSE
507 unit_nr = -1
508 END IF
509
510 IF (unit_nr > 0) THEN
511
512 WRITE (unit_nr, '(T2,A)') &
513 "!"//repeat("-", 29)//" Energy Correction "//repeat("-", 29)//"!"
514
515 ! Type of energy correction
516 SELECT CASE (ec_env%energy_functional)
518 WRITE (unit_nr, '(T2,A,T61,A20)') "Energy Correction: ", "HARRIS FUNCTIONAL"
519 CASE (ec_functional_dc)
520 WRITE (unit_nr, '(T2,A,T61,A20)') "Energy Correction: ", "DC-DFT"
521 CASE (ec_functional_ext)
522 WRITE (unit_nr, '(T2,A,T61,A20)') "Energy Correction: ", "External"
523 END SELECT
524 WRITE (unit_nr, '()')
525
526 ! Energy correction parameters
527 WRITE (unit_nr, '(T2,A,T61,E20.3)') "eps_default:", ec_env%eps_default
528
529 CALL uppercase(ec_env%basis)
530 SELECT CASE (ec_env%basis)
531 CASE ("ORBITAL")
532 WRITE (unit_nr, '(T2,A,T61,A20)') "EC basis: ", "ORBITAL"
533 CASE ("PRIMITIVE")
534 WRITE (unit_nr, '(T2,A,T61,A20)') "EC basis: ", "PRIMITIVE"
535 CASE ("HARRIS")
536 WRITE (unit_nr, '(T2,A,T61,A20)') "EC Basis: ", "HARRIS"
537 END SELECT
538
539 ! Info how HFX in energy correction is treated
540 IF (ec_env%do_ec_hfx) THEN
541
542 WRITE (unit_nr, '(T2,A,T61,L20)') "DC-DFT with HFX", ec_env%do_ec_hfx
543 WRITE (unit_nr, '(T2,A,T61,L20)') "Reuse HFX integrals", ec_env%reuse_hfx
544 WRITE (unit_nr, '(T2,A,T61,L20)') "DC-DFT HFX with ADMM", ec_env%do_ec_admm
545
546 END IF ! ec_env%do_ec_hfx
547
548 ! Parameters for Harris functional solver
549 IF (ec_env%energy_functional == ec_functional_harris) THEN
550
551 ! Algorithm
552 SELECT CASE (ec_env%ks_solver)
553 CASE (ec_diagonalization)
554 WRITE (unit_nr, '(T2,A,T61,A20)') "Algorithm: ", "DIAGONALIZATION"
555 CASE (ec_ot_diag)
556 WRITE (unit_nr, '(T2,A,T61,A20)') "Algorithm: ", "OT DIAGONALIZATION"
557 CASE (ec_matrix_sign)
558 WRITE (unit_nr, '(T2,A,T61,A20)') "Algorithm: ", "MATRIX_SIGN"
559 CASE (ec_matrix_trs4)
560 WRITE (unit_nr, '(T2,A,T61,A20)') "Algorithm: ", "TRS4"
561 CALL cite_reference(niklasson2003)
562 CASE (ec_matrix_tc2)
563 WRITE (unit_nr, '(T2,A,T61,A20)') "Algorithm: ", "TC2"
564 CALL cite_reference(niklasson2014)
565 END SELECT
566 WRITE (unit_nr, '()')
567
568 ! MAO
569 IF (ec_env%mao) THEN
570 WRITE (unit_nr, '(T2,A,T61,L20)') "MAO:", ec_env%mao
571 WRITE (unit_nr, '(T2,A,T61,L20)') "MAO_IOLEVEL:", ec_env%mao_iolevel
572 WRITE (unit_nr, '(T2,A,T61,I20)') "MAO_MAX_ITER:", ec_env%mao_max_iter
573 WRITE (unit_nr, '(T2,A,T61,E20.3)') "MAO_EPS_GRAD:", ec_env%mao_eps_grad
574 WRITE (unit_nr, '(T2,A,T61,E20.3)') "MAO_EPS1:", ec_env%mao_eps1
575 WRITE (unit_nr, '()')
576 END IF
577
578 ! Parameters for linear response solver
579 IF (.NOT. ec_env%use_ls_solver) THEN
580
581 WRITE (unit_nr, '(T2,A)') "MO Solver"
582 WRITE (unit_nr, '()')
583
584 SELECT CASE (ec_env%ks_solver)
585 CASE (ec_diagonalization)
586
587 SELECT CASE (ec_env%factorization)
588 CASE (kg_cholesky)
589 WRITE (unit_nr, '(T2,A,T61,A20)') "Factorization: ", "CHOLESKY"
590 END SELECT
591
592 CASE (ec_ot_diag)
593
594 ! OT Diagonalization
595 ! Initial guess : 1) block diagonal initial guess
596 ! 2) GS-density matrix (might require trafo if basis diff)
597
598 SELECT CASE (ec_env%ec_initial_guess)
599 CASE (ec_ot_atomic)
600 WRITE (unit_nr, '(T2,A,T61,A20)') "OT Diag initial guess: ", "ATOMIC"
601 CASE (ec_ot_gs)
602 WRITE (unit_nr, '(T2,A,T61,A20)') "OT Diag initial guess: ", "GROUND STATE DM"
603 END SELECT
604
605 CASE DEFAULT
606 cpabort("Unknown Diagonalization algorithm for Harris functional")
607 END SELECT
608
609 ELSE
610
611 WRITE (unit_nr, '(T2,A)') "AO Solver"
612 WRITE (unit_nr, '()')
613
614 ls_env => ec_env%ls_env
615 WRITE (unit_nr, '(T2,A,T61,E20.3)') "eps_filter:", ls_env%eps_filter
616 WRITE (unit_nr, '(T2,A,T61,L20)') "fixed chemical potential (mu)", ls_env%fixed_mu
617 WRITE (unit_nr, '(T2,A,T61,L20)') "Computing inv(S):", ls_env%needs_s_inv
618 WRITE (unit_nr, '(T2,A,T61,L20)') "Computing sqrt(S):", ls_env%use_s_sqrt
619 WRITE (unit_nr, '(T2,A,T61,L20)') "Computing S preconditioner ", ls_env%has_s_preconditioner
620
621 IF (ls_env%use_s_sqrt) THEN
622 SELECT CASE (ls_env%s_sqrt_method)
623 CASE (ls_s_sqrt_ns)
624 WRITE (unit_nr, '(T2,A,T61,A20)') "S sqrt method:", "NEWTONSCHULZ"
625 CASE (ls_s_sqrt_proot)
626 WRITE (unit_nr, '(T2,A,T61,A20)') "S sqrt method:", "PROOT"
627 CASE DEFAULT
628 cpabort("Unknown sqrt method.")
629 END SELECT
630 WRITE (unit_nr, '(T2,A,T61,I20)') "S sqrt order:", ls_env%s_sqrt_order
631 END IF
632
633 SELECT CASE (ls_env%s_preconditioner_type)
635 WRITE (unit_nr, '(T2,A,T61,A20)') "S preconditioner type ", "NONE"
637 WRITE (unit_nr, '(T2,A,T61,A20)') "S preconditioner type ", "ATOMIC"
639 WRITE (unit_nr, '(T2,A,T61,A20)') "S preconditioner type ", "MOLECULAR"
640 END SELECT
641
642 SELECT CASE (ls_env%ls_mstruct%cluster_type)
643 CASE (ls_cluster_atomic)
644 WRITE (unit_nr, '(T2,A,T61,A20)') "Cluster type", adjustr("ATOMIC")
646 WRITE (unit_nr, '(T2,A,T61,A20)') "Cluster type", adjustr("MOLECULAR")
647 CASE DEFAULT
648 cpabort("Unknown cluster type")
649 END SELECT
650
651 END IF
652
653 END IF ! if ec_functional_harris
654
655 WRITE (unit_nr, '(T2,A)') repeat("-", 79)
656 WRITE (unit_nr, '()')
657
658 END IF ! unit_nr
659
660 CALL timestop(handle)
661
662 END SUBROUTINE ec_write_input
663
664END 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 copy_gto_basis_set(basis_set_in, basis_set_out)
...
subroutine, public create_primitive_basis_set(basis_set, pbasis, lmax)
...
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_functional_ext
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_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.
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, zatom, 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_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_model_file, 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, npgf_seg)
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.