64#include "./base/base_uses.f90"
70 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'ec_environment'
93 cpassert(.NOT.
ASSOCIATED(ec_env))
95 CALL init_ec_env(qs_env, ec_env, dft_section, ec_section)
109 SUBROUTINE init_ec_env(qs_env, ec_env, dft_section, ec_section)
115 CHARACTER(LEN=*),
PARAMETER :: routinen =
'init_ec_env'
117 INTEGER :: handle, ikind, maxlgto, nkind, unit_nr
119 REAL(kind=
dp) :: eps_pgf_orb
126 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
130 section1, section2, xc_fun_section, &
133 CALL timeset(routinen, handle)
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.
156 ec_env%do_ec_admm = .false.
157 ec_env%do_ec_hfx = .false.
158 ec_env%reuse_hfx = .false.
160 IF (qs_env%energy_correction)
THEN
162 cpassert(
PRESENT(ec_section))
165 IF (logger%para_env%is_source())
THEN
172 i_val=ec_env%ks_solver)
174 i_val=ec_env%energy_functional)
176 i_val=ec_env%factorization)
178 i_val=ec_env%ec_initial_guess)
180 r_val=ec_env%eps_default)
186 i_val=ec_env%mao_max_iter)
188 r_val=ec_env%mao_eps_grad)
190 r_val=ec_env%mao_eps1)
192 i_val=ec_env%mao_iolevel)
195 l_val=ec_env%skip_ec)
198 l_val=ec_env%debug_forces)
200 l_val=ec_env%debug_stress)
202 l_val=ec_env%debug_external)
207 c_val=ec_env%exresp_fn)
209 c_val=ec_env%exresult_fn)
211 l_val=ec_env%do_error)
213 ec_env%do_skip = .false.
216 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, nkind=nkind)
218 SELECT CASE (ec_env%basis)
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
229 NULLIFY (harris_basis)
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
244 NULLIFY (harris_basis)
246 CALL get_qs_env(qs_env, dft_control=dft_control)
247 eps_pgf_orb = dft_control%qs_control%eps_pgf_orb
249 harris_basis%kind_radius = basis_set%kind_radius
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.")
263 cpabort(
"Unknown basis set for energy correction (Harris functional)")
266 CALL get_qs_kind_set(qs_kind_set, maxlgto=maxlgto, basis_type=
"HARRIS")
272 ec_env%basis_inconsistent = .false.
273 IF (ec_env%basis ==
"HARRIS")
THEN
275 qs_kind => qs_kind_set(ikind)
277 CALL get_qs_kind(qs_kind=qs_kind, basis_set=basis_set, basis_type=
"ORB")
279 CALL get_qs_kind(qs_kind=qs_kind, basis_set=harris_basis, basis_type=
"HARRIS")
281 IF (basis_set%name .NE. harris_basis%name)
THEN
282 ec_env%basis_inconsistent = .true.
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.")
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.")
300 SELECT CASE (ec_env%energy_functional)
302 ec_env%ec_name =
"Harris"
304 ec_env%ec_name =
"DC-DFT"
306 ec_env%ec_name =
"External Energy"
308 cpabort(
"unknown energy correction")
318 ec_env%xc_section => section1
320 ec_env%xc_section => xc_section
323 CALL get_qs_env(qs_env, dft_control=dft_control, rho=rho)
325 dft_control%use_kinetic_energy_density = dft_control%use_kinetic_energy_density .OR. &
328 dft_control%drho_by_collocation = dft_control%drho_by_collocation .OR. &
332 ALLOCATE (dispersion_env)
334 xc_section => ec_env%xc_section
335 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, para_env=para_env)
342 cpabort(
"nl-vdW functionals not available for EC calculations")
347 ec_env%dispersion_env => dispersion_env
354 ec_env%use_ls_solver = .false.
359 IF (ec_env%use_ls_solver)
THEN
360 CALL ec_ls_create(qs_env, ec_env)
365 CALL timestop(handle)
367 END SUBROUTINE init_ec_env
378 SUBROUTINE ec_ls_create(qs_env, ec_env)
382 CHARACTER(LEN=*),
PARAMETER :: routinen =
'ec_ls_create'
392 CALL timeset(routinen, handle)
394 ALLOCATE (ec_env%ls_env)
395 ls_env => ec_env%ls_env
397 NULLIFY (dft_control, input, ls_env%para_env)
400 dft_control=dft_control, &
402 molecule_set=molecule_set, &
403 particle_set=particle_set, &
404 para_env=ls_env%para_env, &
405 nelectron_spin=ls_env%nelectron_spin)
408 ls_env%nspins = dft_control%nspins
409 ls_env%natoms =
SIZE(particle_set, 1)
410 CALL ls_env%para_env%retain()
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)
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.
428 CALL section_vals_val_get(ec_section,
"MATRIX_CLUSTER_TYPE", i_val=ls_env%ls_mstruct%cluster_type)
431 CALL section_vals_val_get(ec_section,
"REPORT_ALL_SPARSITIES", l_val=ls_env%report_all_sparsities)
441 SELECT CASE (ec_env%ks_solver)
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.
459 ls_env%needs_s_inv = .false.
460 ls_env%use_s_sqrt = .true.
465 SELECT CASE (ls_env%s_preconditioner_type)
467 ls_env%has_s_preconditioner = .false.
469 ls_env%has_s_preconditioner = .true.
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))
478 NULLIFY (ls_env%mixing_store)
480 CALL timestop(handle)
482 END SUBROUTINE ec_ls_create
495 CHARACTER(LEN=*),
PARAMETER :: routinen =
'ec_write_input'
497 INTEGER :: handle, unit_nr
501 CALL timeset(routinen, handle)
504 IF (logger%para_env%is_source())
THEN
510 IF (unit_nr > 0)
THEN
512 WRITE (unit_nr,
'(T2,A)') &
513 "!"//repeat(
"-", 29)//
" Energy Correction "//repeat(
"-", 29)//
"!"
516 SELECT CASE (ec_env%energy_functional)
518 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Energy Correction: ",
"HARRIS FUNCTIONAL"
520 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Energy Correction: ",
"DC-DFT"
522 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Energy Correction: ",
"External"
524 WRITE (unit_nr,
'()')
527 WRITE (unit_nr,
'(T2,A,T61,E20.3)')
"eps_default:", ec_env%eps_default
530 SELECT CASE (ec_env%basis)
532 WRITE (unit_nr,
'(T2,A,T61,A20)')
"EC basis: ",
"ORBITAL"
534 WRITE (unit_nr,
'(T2,A,T61,A20)')
"EC basis: ",
"PRIMITIVE"
536 WRITE (unit_nr,
'(T2,A,T61,A20)')
"EC Basis: ",
"HARRIS"
540 IF (ec_env%do_ec_hfx)
THEN
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
552 SELECT CASE (ec_env%ks_solver)
554 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Algorithm: ",
"DIAGONALIZATION"
556 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Algorithm: ",
"OT DIAGONALIZATION"
558 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Algorithm: ",
"MATRIX_SIGN"
560 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Algorithm: ",
"TRS4"
563 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Algorithm: ",
"TC2"
566 WRITE (unit_nr,
'()')
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,
'()')
579 IF (.NOT. ec_env%use_ls_solver)
THEN
581 WRITE (unit_nr,
'(T2,A)')
"MO Solver"
582 WRITE (unit_nr,
'()')
584 SELECT CASE (ec_env%ks_solver)
587 SELECT CASE (ec_env%factorization)
589 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Factorization: ",
"CHOLESKY"
598 SELECT CASE (ec_env%ec_initial_guess)
600 WRITE (unit_nr,
'(T2,A,T61,A20)')
"OT Diag initial guess: ",
"ATOMIC"
602 WRITE (unit_nr,
'(T2,A,T61,A20)')
"OT Diag initial guess: ",
"GROUND STATE DM"
606 cpabort(
"Unknown Diagonalization algorithm for Harris functional")
611 WRITE (unit_nr,
'(T2,A)')
"AO Solver"
612 WRITE (unit_nr,
'()')
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
621 IF (ls_env%use_s_sqrt)
THEN
622 SELECT CASE (ls_env%s_sqrt_method)
624 WRITE (unit_nr,
'(T2,A,T61,A20)')
"S sqrt method:",
"NEWTONSCHULZ"
626 WRITE (unit_nr,
'(T2,A,T61,A20)')
"S sqrt method:",
"PROOT"
628 cpabort(
"Unknown sqrt method.")
630 WRITE (unit_nr,
'(T2,A,T61,I20)')
"S sqrt order:", ls_env%s_sqrt_order
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"
642 SELECT CASE (ls_env%ls_mstruct%cluster_type)
644 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Cluster type", adjustr(
"ATOMIC")
646 WRITE (unit_nr,
'(T2,A,T61,A20)')
"Cluster type", adjustr(
"MOLECULAR")
648 cpabort(
"Unknown cluster type")
655 WRITE (unit_nr,
'(T2,A)') repeat(
"-", 79)
656 WRITE (unit_nr,
'()')
660 CALL timestop(handle)
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.
Defines the basic variable types.
integer, parameter, public dp
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.
Exchange and Correlation functional calculations.
logical function, public xc_uses_norm_drho(xc_fun_section, lsd)
...
logical function, public xc_uses_kinetic_energy_density(xc_fun_section, lsd)
...
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.