(git:936074a)
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! **************************************************************************************************
22 USE bibliography, ONLY: niklasson2003,&
24 cite_reference
31 USE input_constants, ONLY: &
44 USE kinds, ONLY: dp
57 USE qs_kind_types, ONLY: get_qs_kind,&
60 USE qs_rho_types, ONLY: qs_rho_type
66#include "./base/base_uses.f90"
67
68 IMPLICIT NONE
69
70 PRIVATE
71
72 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'ec_environment'
73
74 PUBLIC :: ec_env_create
75 PUBLIC :: ec_write_input
76
77CONTAINS
78
79! **************************************************************************************************
80!> \brief Allocates and intitializes ec_env
81!> \param qs_env The QS environment
82!> \param ec_env The energy correction environment (the object to create)
83!> \param dft_section The DFT section
84!> \param ec_section The energy correction input section
85!> \par History
86!> 2019.09 created
87!> \author JGH
88! **************************************************************************************************
89 SUBROUTINE ec_env_create(qs_env, ec_env, dft_section, ec_section)
90 TYPE(qs_environment_type), POINTER :: qs_env
91 TYPE(energy_correction_type), POINTER :: ec_env
92 TYPE(section_vals_type), POINTER :: dft_section
93 TYPE(section_vals_type), OPTIONAL, POINTER :: ec_section
94
95 cpassert(.NOT. ASSOCIATED(ec_env))
96 ALLOCATE (ec_env)
97 CALL init_ec_env(qs_env, ec_env, dft_section, ec_section)
98
99 END SUBROUTINE ec_env_create
100
101! **************************************************************************************************
102!> \brief Initializes energy correction environment
103!> \param qs_env The QS environment
104!> \param ec_env The energy correction environment
105!> \param dft_section The DFT section
106!> \param ec_section The energy correction input section
107!> \par History
108!> 2019.09 created
109!> \author JGH
110! **************************************************************************************************
111 SUBROUTINE init_ec_env(qs_env, ec_env, dft_section, ec_section)
112 TYPE(qs_environment_type), POINTER :: qs_env
113 TYPE(energy_correction_type), POINTER :: ec_env
114 TYPE(section_vals_type), POINTER :: dft_section
115 TYPE(section_vals_type), OPTIONAL, POINTER :: ec_section
116
117 CHARACTER(LEN=*), PARAMETER :: routinen = 'init_ec_env'
118
119 INTEGER :: handle, ikind, maxlgto, nkind, unit_nr
120 LOGICAL :: explicit, gpw, paw_atom
121 REAL(kind=dp) :: eps_pgf_orb, rc
122 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
123 TYPE(cp_logger_type), POINTER :: logger
124 TYPE(dft_control_type), POINTER :: dft_control
125 TYPE(gto_basis_set_type), POINTER :: basis_set, harris_basis, &
126 harris_soft_basis
127 TYPE(mp_para_env_type), POINTER :: para_env
128 TYPE(qs_dispersion_type), POINTER :: dispersion_env
129 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
130 TYPE(qs_kind_type), POINTER :: qs_kind
131 TYPE(qs_rho_type), POINTER :: rho
132 TYPE(section_vals_type), POINTER :: ec_hfx_section, nl_section, pp_section, &
133 section1, section2, xc_fun_section, &
134 xc_section
135
136 CALL timeset(routinen, handle)
137
138 NULLIFY (atomic_kind_set, dispersion_env, ec_env%ls_env, para_env)
139 NULLIFY (ec_env%sab_orb, ec_env%sac_ae, ec_env%sac_ppl, ec_env%sap_ppnl)
140 NULLIFY (ec_env%matrix_ks, ec_env%matrix_h, ec_env%matrix_s)
141 NULLIFY (ec_env%matrix_t, ec_env%matrix_p, ec_env%matrix_w)
142 NULLIFY (ec_env%task_list)
143 NULLIFY (ec_env%mao_coef)
144 NULLIFY (ec_env%force)
145 NULLIFY (ec_env%dispersion_env)
146 NULLIFY (ec_env%xc_section)
147 NULLIFY (ec_env%matrix_z)
148 NULLIFY (ec_env%matrix_hz)
149 NULLIFY (ec_env%matrix_wz)
150 NULLIFY (ec_env%z_admm)
151 NULLIFY (ec_env%p_env)
152 NULLIFY (ec_env%vxc_rspace)
153 NULLIFY (ec_env%vtau_rspace)
154 NULLIFY (ec_env%vadmm_rspace)
155 NULLIFY (ec_env%rhoout_r, ec_env%rhoz_r)
156 NULLIFY (ec_env%x_data)
157 ec_env%should_update = .true.
158 ec_env%mao = .false.
159 ec_env%do_ec_admm = .false.
160 ec_env%do_ec_hfx = .false.
161 ec_env%reuse_hfx = .false.
162
163 IF (qs_env%energy_correction) THEN
164
165 cpassert(PRESENT(ec_section))
166 ! get a useful output_unit
167 logger => cp_get_default_logger()
168 IF (logger%para_env%is_source()) THEN
169 unit_nr = cp_logger_get_default_unit_nr(logger, local=.true.)
170 ELSE
171 unit_nr = -1
172 END IF
173
174 CALL section_vals_val_get(ec_section, "ALGORITHM", &
175 i_val=ec_env%ks_solver)
176 CALL section_vals_val_get(ec_section, "ENERGY_FUNCTIONAL", &
177 i_val=ec_env%energy_functional)
178 CALL section_vals_val_get(ec_section, "FACTORIZATION", &
179 i_val=ec_env%factorization)
180 CALL section_vals_val_get(ec_section, "OT_INITIAL_GUESS", &
181 i_val=ec_env%ec_initial_guess)
182 CALL section_vals_val_get(ec_section, "EPS_DEFAULT", &
183 r_val=ec_env%eps_default)
184 CALL section_vals_val_get(ec_section, "HARRIS_BASIS", &
185 c_val=ec_env%basis)
186 CALL section_vals_val_get(ec_section, "MAO", &
187 l_val=ec_env%mao)
188 CALL section_vals_val_get(ec_section, "MAO_MAX_ITER", &
189 i_val=ec_env%mao_max_iter)
190 CALL section_vals_val_get(ec_section, "MAO_EPS_GRAD", &
191 r_val=ec_env%mao_eps_grad)
192 CALL section_vals_val_get(ec_section, "MAO_EPS1", &
193 r_val=ec_env%mao_eps1)
194 CALL section_vals_val_get(ec_section, "MAO_IOLEVEL", &
195 i_val=ec_env%mao_iolevel)
196 ! Skip EC calculation if ground-state calculation did not converge
197 CALL section_vals_val_get(ec_section, "SKIP_EC", &
198 l_val=ec_env%skip_ec)
199 ! Debug output
200 CALL section_vals_val_get(ec_section, "DEBUG_FORCES", &
201 l_val=ec_env%debug_forces)
202 CALL section_vals_val_get(ec_section, "DEBUG_STRESS", &
203 l_val=ec_env%debug_stress)
204 CALL section_vals_val_get(ec_section, "DEBUG_EXTERNAL_METHOD", &
205 l_val=ec_env%debug_external)
206 ! ADMM
207 CALL section_vals_val_get(ec_section, "ADMM", l_val=ec_env%do_ec_admm)
208 ! EXTERNAL
209 CALL section_vals_val_get(ec_section, "EXTERNAL_RESPONSE_FILENAME", &
210 c_val=ec_env%exresp_fn)
211 CALL section_vals_val_get(ec_section, "EXTERNAL_RESULT_FILENAME", &
212 c_val=ec_env%exresult_fn)
213 CALL section_vals_val_get(ec_section, "ERROR_ESTIMATION", &
214 l_val=ec_env%do_error)
215
216 ec_env%do_skip = .false.
217
218 ! set basis
219 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, nkind=nkind)
220 CALL uppercase(ec_env%basis)
221 SELECT CASE (ec_env%basis)
222 CASE ("ORBITAL")
223 DO ikind = 1, nkind
224 qs_kind => qs_kind_set(ikind)
225 CALL get_qs_kind(qs_kind=qs_kind, basis_set=basis_set, basis_type="ORB")
226 IF (ASSOCIATED(basis_set)) THEN
227 NULLIFY (harris_basis)
228 CALL get_qs_kind(qs_kind=qs_kind, basis_set=harris_basis, basis_type="HARRIS")
229 IF (ASSOCIATED(harris_basis)) THEN
230 CALL remove_basis_from_container(qs_kind%basis_sets, basis_type="HARRIS")
231 END IF
232 NULLIFY (harris_basis)
233 CALL copy_gto_basis_set(basis_set, harris_basis)
234 CALL add_basis_set_to_container(qs_kind%basis_sets, harris_basis, "HARRIS")
235 END IF
236 END DO
237 CASE ("PRIMITIVE")
238 DO ikind = 1, nkind
239 qs_kind => qs_kind_set(ikind)
240 CALL get_qs_kind(qs_kind=qs_kind, basis_set=basis_set, basis_type="ORB")
241 IF (ASSOCIATED(basis_set)) THEN
242 NULLIFY (harris_basis)
243 CALL get_qs_kind(qs_kind=qs_kind, basis_set=harris_basis, basis_type="HARRIS")
244 IF (ASSOCIATED(harris_basis)) THEN
245 CALL remove_basis_from_container(qs_kind%basis_sets, basis_type="HARRIS")
246 END IF
247 NULLIFY (harris_basis)
248 CALL create_primitive_basis_set(basis_set, harris_basis)
249 CALL get_qs_env(qs_env, dft_control=dft_control)
250 eps_pgf_orb = dft_control%qs_control%eps_pgf_orb
251 CALL init_interaction_radii_orb_basis(harris_basis, eps_pgf_orb)
252 harris_basis%kind_radius = basis_set%kind_radius
253 CALL add_basis_set_to_container(qs_kind%basis_sets, harris_basis, "HARRIS")
254 END IF
255 END DO
256 CASE ("HARRIS")
257 DO ikind = 1, nkind
258 qs_kind => qs_kind_set(ikind)
259 NULLIFY (harris_basis)
260 CALL get_qs_kind(qs_kind=qs_kind, basis_set=harris_basis, basis_type="HARRIS")
261 IF (.NOT. ASSOCIATED(harris_basis)) THEN
262 cpwarn("Harris Basis not defined for all types of atoms.")
263 END IF
264 END DO
265 CASE DEFAULT
266 cpabort("Unknown basis set for energy correction (Harris functional)")
267 END SELECT
268 !
269 CALL get_qs_kind_set(qs_kind_set, maxlgto=maxlgto, basis_type="HARRIS")
270 CALL init_orbital_pointers(maxlgto + 1)
271 ! GAPW: Generate soft version of Harris basis
272 CALL get_qs_env(qs_env, dft_control=dft_control)
273 IF (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc) THEN
274 eps_pgf_orb = dft_control%qs_control%eps_pgf_orb
275 DO ikind = 1, nkind
276 qs_kind => qs_kind_set(ikind)
277 NULLIFY (harris_basis)
278 CALL get_qs_kind(qs_kind, basis_set=harris_basis, basis_type="HARRIS")
279 CALL get_qs_kind(qs_kind, hard_radius=rc, gpw_type_forced=gpw)
280 NULLIFY (harris_soft_basis)
281 CALL allocate_gto_basis_set(harris_soft_basis)
282 CALL create_soft_basis(harris_basis, harris_soft_basis, &
283 dft_control%qs_control%gapw_control%eps_fit, &
284 rc, paw_atom, &
285 dft_control%qs_control%gapw_control%force_paw, gpw)
286 CALL init_interaction_radii_orb_basis(harris_soft_basis, eps_pgf_orb)
287 CALL add_basis_set_to_container(qs_kind%basis_sets, harris_soft_basis, "HARRIS_SOFT")
288 END DO
289 END IF
290 !
291 CALL uppercase(ec_env%basis)
292
293 ! Basis may only differ from ground-state if explicitly added
294 ec_env%basis_inconsistent = .false.
295 IF (ec_env%basis == "HARRIS") THEN
296 DO ikind = 1, nkind
297 qs_kind => qs_kind_set(ikind)
298 ! Basis sets of ground-state
299 CALL get_qs_kind(qs_kind=qs_kind, basis_set=basis_set, basis_type="ORB")
300 ! Basis sets of energy correction
301 CALL get_qs_kind(qs_kind=qs_kind, basis_set=harris_basis, basis_type="HARRIS")
302
303 IF (basis_set%name /= harris_basis%name) THEN
304 ec_env%basis_inconsistent = .true.
305 END IF
306 END DO
307 END IF
308
309 !Density-corrected DFT must be performed with the same basis as ground-state
310 IF (ec_env%energy_functional == ec_functional_dc .AND. ec_env%basis_inconsistent) THEN
311 CALL cp_abort(__location__, &
312 "DC-DFT: Correction and ground state need to use the same basis. "// &
313 "Checked by comparing basis set names only.")
314 END IF
315 IF (ec_env%energy_functional == ec_functional_ext .AND. ec_env%basis_inconsistent) THEN
316 CALL cp_abort(__location__, &
317 "Exteranl Energy: Correction and ground state need to use the same basis. "// &
318 "Checked by comparing basis set names only.")
319 END IF
320 !
321 ! set functional
322 SELECT CASE (ec_env%energy_functional)
324 ec_env%ec_name = "Harris"
325 CASE (ec_functional_dc)
326 ec_env%ec_name = "DC-DFT"
327 CASE (ec_functional_ext)
328 ec_env%ec_name = "External Energy"
329 CASE DEFAULT
330 cpabort("unknown energy correction")
331 END SELECT
332 ! select the XC section
333 NULLIFY (xc_section)
334 xc_section => section_vals_get_subs_vals(dft_section, "XC")
335 section1 => section_vals_get_subs_vals(ec_section, "XC")
336 section2 => section_vals_get_subs_vals(ec_section, "XC%XC_FUNCTIONAL")
337 CALL section_vals_get(section2, explicit=explicit)
338 IF (explicit) THEN
339 CALL xc_functionals_expand(section2, section1)
340 ec_env%xc_section => section1
341 ELSE
342 ec_env%xc_section => xc_section
343 END IF
344 ! Check whether energy correction requires the kinetic energy density and rebuild rho if necessary
345 CALL get_qs_env(qs_env, dft_control=dft_control, rho=rho)
346 xc_fun_section => section_vals_get_subs_vals(ec_env%xc_section, "XC_FUNCTIONAL")
347 dft_control%use_kinetic_energy_density = dft_control%use_kinetic_energy_density .OR. &
348 xc_uses_kinetic_energy_density(xc_fun_section, dft_control%lsd)
349 ! Same for density gradient
350 dft_control%drho_by_collocation = dft_control%drho_by_collocation .OR. &
351 (xc_uses_norm_drho(xc_fun_section, dft_control%lsd) .AND. &
352 (section_get_ival(xc_section, "XC_GRID%XC_DERIV") == xc_deriv_collocate))
353 ! dispersion
354 ALLOCATE (dispersion_env)
355 NULLIFY (xc_section)
356 xc_section => ec_env%xc_section
357 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, para_env=para_env)
358 CALL qs_dispersion_env_set(dispersion_env, xc_section)
359 IF (dispersion_env%type == xc_vdw_fun_pairpot) THEN
360 NULLIFY (pp_section)
361 pp_section => section_vals_get_subs_vals(xc_section, "VDW_POTENTIAL%PAIR_POTENTIAL")
362 CALL qs_dispersion_pairpot_init(atomic_kind_set, qs_kind_set, dispersion_env, pp_section, para_env)
363 ELSE IF (dispersion_env%type == xc_vdw_fun_nonloc) THEN
364 cpabort("nl-vdW functionals not available for EC calculations")
365 NULLIFY (nl_section)
366 nl_section => section_vals_get_subs_vals(xc_section, "VDW_POTENTIAL%NON_LOCAL")
367 CALL qs_dispersion_nonloc_init(dispersion_env, para_env)
368 END IF
369 ec_env%dispersion_env => dispersion_env
370
371 ! Check if hybrid functional are used
372 ec_hfx_section => section_vals_get_subs_vals(ec_section, "XC%HF")
373 CALL section_vals_get(ec_hfx_section, explicit=ec_env%do_ec_hfx)
374
375 ! Initialize Harris LS solver environment
376 ec_env%use_ls_solver = .false.
377 ec_env%use_ls_solver = (ec_env%ks_solver == ec_matrix_sign) &
378 .OR. (ec_env%ks_solver == ec_matrix_trs4) &
379 .OR. (ec_env%ks_solver == ec_matrix_tc2)
380
381 IF (ec_env%use_ls_solver) THEN
382 CALL ec_ls_create(qs_env, ec_env)
383 END IF
384
385 END IF
386
387 CALL timestop(handle)
388
389 END SUBROUTINE init_ec_env
390
391! **************************************************************************************************
392!> \brief Initializes linear scaling environment for LS based solver of
393!> Harris energy functional and parses input section
394!> \param qs_env ...
395!> \param ec_env ...
396!> \par History
397!> 2020.10 created [Fabian Belleflamme]
398!> \author Fabian Belleflamme
399! **************************************************************************************************
400 SUBROUTINE ec_ls_create(qs_env, ec_env)
401 TYPE(qs_environment_type), POINTER :: qs_env
402 TYPE(energy_correction_type), POINTER :: ec_env
403
404 CHARACTER(LEN=*), PARAMETER :: routinen = 'ec_ls_create'
405
406 INTEGER :: handle
407 REAL(kind=dp) :: mu
408 TYPE(dft_control_type), POINTER :: dft_control
409 TYPE(ls_scf_env_type), POINTER :: ls_env
410 TYPE(molecule_type), DIMENSION(:), POINTER :: molecule_set
411 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
412 TYPE(section_vals_type), POINTER :: ec_section, input
413
414 CALL timeset(routinen, handle)
415
416 ALLOCATE (ec_env%ls_env)
417 ls_env => ec_env%ls_env
418
419 NULLIFY (dft_control, input, ls_env%para_env)
420
421 CALL get_qs_env(qs_env, &
422 dft_control=dft_control, &
423 input=input, &
424 molecule_set=molecule_set, &
425 particle_set=particle_set, &
426 para_env=ls_env%para_env, &
427 nelectron_spin=ls_env%nelectron_spin)
428
429 ! copy some basic stuff
430 ls_env%nspins = dft_control%nspins
431 ls_env%natoms = SIZE(particle_set, 1)
432 CALL ls_env%para_env%retain()
433
434 ! initialize block to group to defined molecules
435 ALLOCATE (ls_env%ls_mstruct%atom_to_molecule(ls_env%natoms))
436 CALL molecule_of_atom(molecule_set, atom_to_mol=ls_env%ls_mstruct%atom_to_molecule)
437
438 ls_env%do_transport = .false.
439 ls_env%do_pao = .false.
440 ls_env%ls_mstruct%do_pao = ls_env%do_pao
441 ls_env%do_pexsi = .false.
442 ls_env%has_unit_metric = .false.
443
444 ec_section => section_vals_get_subs_vals(input, "DFT%ENERGY_CORRECTION")
445 CALL section_vals_val_get(ec_section, "EPS_FILTER", r_val=ls_env%eps_filter)
446 CALL section_vals_val_get(ec_section, "MU", r_val=mu)
447 CALL section_vals_val_get(ec_section, "FIXED_MU", l_val=ls_env%fixed_mu)
448 ls_env%mu_spin = mu
449 CALL section_vals_val_get(ec_section, "S_PRECONDITIONER", i_val=ls_env%s_preconditioner_type)
450 CALL section_vals_val_get(ec_section, "MATRIX_CLUSTER_TYPE", i_val=ls_env%ls_mstruct%cluster_type)
451 CALL section_vals_val_get(ec_section, "S_INVERSION", i_val=ls_env%s_inversion_type)
452 CALL section_vals_val_get(ec_section, "CHECK_S_INV", l_val=ls_env%check_s_inv)
453 CALL section_vals_val_get(ec_section, "REPORT_ALL_SPARSITIES", l_val=ls_env%report_all_sparsities)
454 CALL section_vals_val_get(ec_section, "SIGN_METHOD", i_val=ls_env%sign_method)
455 CALL section_vals_val_get(ec_section, "SIGN_ORDER", i_val=ls_env%sign_order)
456 CALL section_vals_val_get(ec_section, "DYNAMIC_THRESHOLD", l_val=ls_env%dynamic_threshold)
457 CALL section_vals_val_get(ec_section, "NON_MONOTONIC", l_val=ls_env%non_monotonic)
458 CALL section_vals_val_get(ec_section, "S_SQRT_METHOD", i_val=ls_env%s_sqrt_method)
459 CALL section_vals_val_get(ec_section, "S_SQRT_ORDER", i_val=ls_env%s_sqrt_order)
460 CALL section_vals_val_get(ec_section, "EPS_LANCZOS", r_val=ls_env%eps_lanczos)
461 CALL section_vals_val_get(ec_section, "MAX_ITER_LANCZOS", i_val=ls_env%max_iter_lanczos)
462
463 SELECT CASE (ec_env%ks_solver)
464 CASE (ec_matrix_sign)
465 ! S inverse required for Sign matrix algorithm,
466 ! calculated either by Hotelling or multiplying S matrix sqrt inv
467 SELECT CASE (ls_env%s_inversion_type)
469 ls_env%needs_s_inv = .true.
470 ls_env%use_s_sqrt = .true.
472 ls_env%needs_s_inv = .true.
473 ls_env%use_s_sqrt = .false.
475 ls_env%needs_s_inv = .false.
476 ls_env%use_s_sqrt = .false.
477 CASE DEFAULT
478 cpabort("")
479 END SELECT
481 ls_env%needs_s_inv = .false.
482 ls_env%use_s_sqrt = .true.
483 CASE DEFAULT
484 cpabort("")
485 END SELECT
486
487 SELECT CASE (ls_env%s_preconditioner_type)
489 ls_env%has_s_preconditioner = .false.
490 CASE DEFAULT
491 ls_env%has_s_preconditioner = .true.
492 END SELECT
493
494 ! buffer for the history of matrices, not needed here
495 ls_env%extrapolation_order = 0
496 ls_env%scf_history%nstore = 0
497 ls_env%scf_history%istore = 0
498 ALLOCATE (ls_env%scf_history%matrix(ls_env%nspins, ls_env%scf_history%nstore))
499
500 NULLIFY (ls_env%mixing_store)
501
502 CALL timestop(handle)
503
504 END SUBROUTINE ec_ls_create
505
506! **************************************************************************************************
507!> \brief Print out the energy correction input section
508!>
509!> \param ec_env ...
510!> \par History
511!> 2020.10 created [Fabian Belleflamme]
512!> \author Fabian Belleflamme
513! **************************************************************************************************
514 SUBROUTINE ec_write_input(ec_env)
515 TYPE(energy_correction_type), POINTER :: ec_env
516
517 CHARACTER(LEN=*), PARAMETER :: routinen = 'ec_write_input'
518
519 INTEGER :: handle, unit_nr
520 TYPE(cp_logger_type), POINTER :: logger
521 TYPE(ls_scf_env_type), POINTER :: ls_env
522
523 CALL timeset(routinen, handle)
524
525 logger => cp_get_default_logger()
526 IF (logger%para_env%is_source()) THEN
527 unit_nr = cp_logger_get_default_unit_nr(logger, local=.true.)
528 ELSE
529 unit_nr = -1
530 END IF
531
532 IF (unit_nr > 0) THEN
533
534 WRITE (unit_nr, '(T2,A)') &
535 "!"//repeat("-", 29)//" Energy Correction "//repeat("-", 29)//"!"
536
537 ! Type of energy correction
538 SELECT CASE (ec_env%energy_functional)
540 WRITE (unit_nr, '(T2,A,T61,A20)') "Energy Correction: ", "HARRIS FUNCTIONAL"
541 CASE (ec_functional_dc)
542 WRITE (unit_nr, '(T2,A,T61,A20)') "Energy Correction: ", "DC-DFT"
543 CASE (ec_functional_ext)
544 WRITE (unit_nr, '(T2,A,T61,A20)') "Energy Correction: ", "External"
545 END SELECT
546 WRITE (unit_nr, '()')
547
548 ! Energy correction parameters
549 WRITE (unit_nr, '(T2,A,T61,E20.3)') "eps_default:", ec_env%eps_default
550
551 CALL uppercase(ec_env%basis)
552 SELECT CASE (ec_env%basis)
553 CASE ("ORBITAL")
554 WRITE (unit_nr, '(T2,A,T61,A20)') "EC basis: ", "ORBITAL"
555 CASE ("PRIMITIVE")
556 WRITE (unit_nr, '(T2,A,T61,A20)') "EC basis: ", "PRIMITIVE"
557 CASE ("HARRIS")
558 WRITE (unit_nr, '(T2,A,T61,A20)') "EC Basis: ", "HARRIS"
559 END SELECT
560
561 ! Info how HFX in energy correction is treated
562 IF (ec_env%do_ec_hfx) THEN
563
564 WRITE (unit_nr, '(T2,A,T61,L20)') "DC-DFT with HFX", ec_env%do_ec_hfx
565 WRITE (unit_nr, '(T2,A,T61,L20)') "Reuse HFX integrals", ec_env%reuse_hfx
566 WRITE (unit_nr, '(T2,A,T61,L20)') "DC-DFT HFX with ADMM", ec_env%do_ec_admm
567
568 END IF ! ec_env%do_ec_hfx
569
570 ! Parameters for Harris functional solver
571 IF (ec_env%energy_functional == ec_functional_harris) THEN
572
573 ! Algorithm
574 SELECT CASE (ec_env%ks_solver)
575 CASE (ec_diagonalization)
576 WRITE (unit_nr, '(T2,A,T61,A20)') "Algorithm: ", "DIAGONALIZATION"
577 CASE (ec_ot_diag)
578 WRITE (unit_nr, '(T2,A,T61,A20)') "Algorithm: ", "OT DIAGONALIZATION"
579 CASE (ec_matrix_sign)
580 WRITE (unit_nr, '(T2,A,T61,A20)') "Algorithm: ", "MATRIX_SIGN"
581 CASE (ec_matrix_trs4)
582 WRITE (unit_nr, '(T2,A,T61,A20)') "Algorithm: ", "TRS4"
583 CALL cite_reference(niklasson2003)
584 CASE (ec_matrix_tc2)
585 WRITE (unit_nr, '(T2,A,T61,A20)') "Algorithm: ", "TC2"
586 CALL cite_reference(niklasson2014)
587 END SELECT
588 WRITE (unit_nr, '()')
589
590 ! MAO
591 IF (ec_env%mao) THEN
592 WRITE (unit_nr, '(T2,A,T61,L20)') "MAO:", ec_env%mao
593 WRITE (unit_nr, '(T2,A,T61,L20)') "MAO_IOLEVEL:", ec_env%mao_iolevel
594 WRITE (unit_nr, '(T2,A,T61,I20)') "MAO_MAX_ITER:", ec_env%mao_max_iter
595 WRITE (unit_nr, '(T2,A,T61,E20.3)') "MAO_EPS_GRAD:", ec_env%mao_eps_grad
596 WRITE (unit_nr, '(T2,A,T61,E20.3)') "MAO_EPS1:", ec_env%mao_eps1
597 WRITE (unit_nr, '()')
598 END IF
599
600 ! Parameters for linear response solver
601 IF (.NOT. ec_env%use_ls_solver) THEN
602
603 WRITE (unit_nr, '(T2,A)') "MO Solver"
604 WRITE (unit_nr, '()')
605
606 SELECT CASE (ec_env%ks_solver)
607 CASE (ec_diagonalization)
608
609 SELECT CASE (ec_env%factorization)
610 CASE (kg_cholesky)
611 WRITE (unit_nr, '(T2,A,T61,A20)') "Factorization: ", "CHOLESKY"
612 END SELECT
613
614 CASE (ec_ot_diag)
615
616 ! OT Diagonalization
617 ! Initial guess : 1) block diagonal initial guess
618 ! 2) GS-density matrix (might require trafo if basis diff)
619
620 SELECT CASE (ec_env%ec_initial_guess)
621 CASE (ec_ot_atomic)
622 WRITE (unit_nr, '(T2,A,T61,A20)') "OT Diag initial guess: ", "ATOMIC"
623 CASE (ec_ot_gs)
624 WRITE (unit_nr, '(T2,A,T61,A20)') "OT Diag initial guess: ", "GROUND STATE DM"
625 END SELECT
626
627 CASE DEFAULT
628 cpabort("Unknown Diagonalization algorithm for Harris functional")
629 END SELECT
630
631 ELSE
632
633 WRITE (unit_nr, '(T2,A)') "AO Solver"
634 WRITE (unit_nr, '()')
635
636 ls_env => ec_env%ls_env
637 WRITE (unit_nr, '(T2,A,T61,E20.3)') "eps_filter:", ls_env%eps_filter
638 WRITE (unit_nr, '(T2,A,T61,L20)') "fixed chemical potential (mu)", ls_env%fixed_mu
639 WRITE (unit_nr, '(T2,A,T61,L20)') "Computing inv(S):", ls_env%needs_s_inv
640 WRITE (unit_nr, '(T2,A,T61,L20)') "Computing sqrt(S):", ls_env%use_s_sqrt
641 WRITE (unit_nr, '(T2,A,T61,L20)') "Computing S preconditioner ", ls_env%has_s_preconditioner
642
643 IF (ls_env%use_s_sqrt) THEN
644 SELECT CASE (ls_env%s_sqrt_method)
645 CASE (ls_s_sqrt_ns)
646 WRITE (unit_nr, '(T2,A,T61,A20)') "S sqrt method:", "NEWTONSCHULZ"
647 CASE (ls_s_sqrt_proot)
648 WRITE (unit_nr, '(T2,A,T61,A20)') "S sqrt method:", "PROOT"
649 CASE DEFAULT
650 cpabort("Unknown sqrt method.")
651 END SELECT
652 WRITE (unit_nr, '(T2,A,T61,I20)') "S sqrt order:", ls_env%s_sqrt_order
653 END IF
654
655 SELECT CASE (ls_env%s_preconditioner_type)
657 WRITE (unit_nr, '(T2,A,T61,A20)') "S preconditioner type ", "NONE"
659 WRITE (unit_nr, '(T2,A,T61,A20)') "S preconditioner type ", "ATOMIC"
661 WRITE (unit_nr, '(T2,A,T61,A20)') "S preconditioner type ", "MOLECULAR"
662 END SELECT
663
664 SELECT CASE (ls_env%ls_mstruct%cluster_type)
665 CASE (ls_cluster_atomic)
666 WRITE (unit_nr, '(T2,A,T61,A20)') "Cluster type", adjustr("ATOMIC")
668 WRITE (unit_nr, '(T2,A,T61,A20)') "Cluster type", adjustr("MOLECULAR")
669 CASE DEFAULT
670 cpabort("Unknown cluster type")
671 END SELECT
672
673 END IF
674
675 END IF ! if ec_functional_harris
676
677 WRITE (unit_nr, '(T2,A)') repeat("-", 79)
678 WRITE (unit_nr, '()')
679
680 END IF ! unit_nr
681
682 CALL timestop(handle)
683
684 END SUBROUTINE ec_write_input
685
686END 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 allocate_gto_basis_set(gto_basis_set)
...
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, sab_cneo, 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, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_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, do_rixs, tb_tblite)
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, cneo_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, monovalent, 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, cneo_potential_present, nkind_q, natom_q)
Get attributes of an atomic kind set.
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public create_soft_basis(orb_basis, soft_basis, eps_fit, rc, paw_atom, paw_type_forced, gpw_r3d_rs_type_forced)
create the soft basis from a GTO basis
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.