71#include "./base/base_uses.f90" 
   79   CHARACTER(len=*), 
PARAMETER, 
PRIVATE :: moduleN = 
'qs_energy_utils' 
   97      LOGICAL, 
INTENT(IN)                                :: calc_forces
 
   99      CHARACTER(len=*), 
PARAMETER :: routinen = 
'qs_energies_properties' 
  101      INTEGER                                            :: handle, natom
 
  102      LOGICAL                                            :: do_et, do_et_proj, &
 
  103                                                            do_post_scf_bandstructure, do_tip_scan
 
  104      REAL(kind=
dp)                                      :: ekts
 
  112                                                            proj_section, rest_b_section, &
 
  115      NULLIFY (atprop, energy, pw_env)
 
  116      CALL timeset(routinen, handle)
 
  120                      dft_control=dft_control, &
 
  124                      v_hartree_rspace=v_hartree_rspace, &
 
  127      IF (atprop%energy) 
THEN 
  128         CALL qs_energies_mulliken(qs_env)
 
  130         IF (.NOT. dft_control%qs_control%semi_empirical .AND. &
 
  131             .NOT. dft_control%qs_control%xtb .AND. &
 
  132             .NOT. dft_control%qs_control%dftb) 
THEN 
  134            CALL integrate_v_core_rspace(v_hartree_rspace, qs_env)
 
  135            IF (.NOT. 
ASSOCIATED(atprop%ateb)) 
THEN 
  139            CALL ks_xc_correction(qs_env)
 
  150         ekts = energy%kts/real(natom, kind=
dp)/real(para_env%num_pe, kind=
dp)
 
  151         atprop%atener(:) = atprop%atener(:) + ekts
 
  155      NULLIFY (proj_section)
 
  165      do_et = dft_control%qs_control%et_coupling_calc
 
  167         qs_env%et_coupling%energy = energy%total
 
  168         qs_env%et_coupling%keep_matrix = .true.
 
  169         qs_env%et_coupling%first_run = .true.
 
  171         qs_env%et_coupling%first_run = .false.
 
  172         IF (dft_control%qs_control%ddapc_restraint) 
THEN 
  175                                    ddapc_restraint_section=rest_b_section)
 
  177         CALL scf(qs_env=qs_env)
 
  178         qs_env%et_coupling%keep_matrix = .true.
 
  186      IF (dft_control%do_xas_calculation) 
THEN 
  187         CALL xas(qs_env, dft_control)
 
  190      IF (dft_control%do_xas_tdp_calculation) 
THEN 
  196      IF (.NOT. qs_env%linres_run) 
THEN 
  201      IF (dft_control%tddfpt2_control%enabled) 
THEN 
  202         CALL tddfpt(qs_env, calc_forces)
 
  206      IF (qs_env%do_rixs) 
CALL rixs(qs_env)
 
  209      NULLIFY (post_scf_bands_section)
 
  211      CALL section_vals_get(post_scf_bands_section, explicit=do_post_scf_bandstructure)
 
  212      IF (do_post_scf_bandstructure) 
THEN 
  217      NULLIFY (tip_scan_section)
 
  220      IF (do_tip_scan) 
THEN 
  224      CALL timestop(handle)
 
 
  235   SUBROUTINE qs_energies_mulliken(qs_env)
 
  239      INTEGER                                            :: ispin, natom, nspin
 
  240      REAL(kind=
dp), 
ALLOCATABLE, 
DIMENSION(:)           :: atcore
 
  244      TYPE(
dbcsr_p_type), 
DIMENSION(:), 
POINTER          :: matrix_h, matrix_ks, rho_ao
 
  245      TYPE(
dbcsr_p_type), 
DIMENSION(:, :), 
POINTER       :: math, matp
 
  250      IF (atprop%energy) 
THEN 
  251         CALL get_qs_env(qs_env=qs_env, matrix_ks=matrix_ks, matrix_h=matrix_h, rho=rho)
 
  254         atprop%atener = 0._dp
 
  257            CALL atom_trace(matrix_h(1)%matrix, rho_ao(ispin)%matrix, &
 
  258                            0.5_dp, atprop%atener)
 
  259            CALL atom_trace(matrix_ks(ispin)%matrix, rho_ao(ispin)%matrix, &
 
  260                            0.5_dp, atprop%atener)
 
  263         CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
 
  264         IF (.NOT. dft_control%qs_control%semi_empirical .AND. &
 
  265             .NOT. dft_control%qs_control%xtb .AND. &
 
  266             .NOT. dft_control%qs_control%dftb) 
THEN 
  268            ALLOCATE (atcore(natom))
 
  270            ALLOCATE (core_mat(1))
 
  271            ALLOCATE (core_mat(1)%matrix)
 
  272            CALL dbcsr_create(core_mat(1)%matrix, template=matrix_h(1)%matrix)
 
  273            CALL dbcsr_copy(core_mat(1)%matrix, matrix_h(1)%matrix)
 
  274            CALL dbcsr_set(core_mat(1)%matrix, 0.0_dp)
 
  275            math(1:1, 1:1) => core_mat(1:1)
 
  276            matp(1:nspin, 1:1) => rho_ao(1:nspin)
 
  277            CALL core_matrices(qs_env, math, matp, .false., 0, atcore=atcore)
 
  278            atprop%atener = atprop%atener + 0.5_dp*atcore
 
  280               CALL atom_trace(core_mat(1)%matrix, rho_ao(ispin)%matrix, &
 
  281                               -0.5_dp, atprop%atener)
 
  285            DEALLOCATE (core_mat(1)%matrix)
 
  286            DEALLOCATE (core_mat)
 
  290   END SUBROUTINE qs_energies_mulliken
 
  296   SUBROUTINE ks_xc_correction(qs_env)
 
  299      CHARACTER(len=*), 
PARAMETER                        :: routinen = 
'ks_xc_correction' 
  301      INTEGER                                            :: handle, iatom, ispin, natom, nspins
 
  302      LOGICAL                                            :: gapw, gapw_xc
 
  303      REAL(kind=
dp)                                      :: eh1, exc1
 
  306      TYPE(
dbcsr_p_type), 
DIMENSION(:), 
POINTER          :: matrix_s, rho_ao, xcmat
 
  307      TYPE(
dbcsr_p_type), 
DIMENSION(:, :), 
POINTER       :: matrix_p
 
  318      TYPE(
qs_kind_type), 
DIMENSION(:), 
POINTER          :: qs_kind_set
 
  325      CALL timeset(routinen, handle)
 
  327      CALL get_qs_env(qs_env, ks_env=ks_env, dft_control=dft_control, pw_env=pw_env, atprop=atprop)
 
  329      IF (atprop%energy) 
THEN 
  331         nspins = dft_control%nspins
 
  335         gapw = dft_control%qs_control%gapw
 
  336         gapw_xc = dft_control%qs_control%gapw_xc
 
  339         CALL get_qs_env(qs_env, v_hartree_rspace=v_hartree_rspace)
 
  340         IF (gapw .OR. gapw_xc) 
THEN 
  341            CALL get_qs_env(qs_env=qs_env, local_rho_set=local_rho_set, &
 
  342                            rho_atom_set=rho_atom_set, ecoul_1c=ecoul_1c, &
 
  343                            natom=natom, para_env=para_env)
 
  347               CALL vh_1c_gg_integrals(qs_env, eh1, ecoul_1c, local_rho_set, para_env, tddft=.false.)
 
  348               CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set)
 
  350                                          local_rho_set=local_rho_set, atener=atprop%ateb)
 
  354         CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
 
  355         CALL auxbas_pw_pool%create_pw(xc_den)
 
  356         ALLOCATE (vxc(nspins))
 
  358            CALL auxbas_pw_pool%create_pw(vxc(ispin))
 
  360         IF (needs%tau .OR. needs%tau_spin) 
THEN 
  361            ALLOCATE (vtau(nspins))
 
  363               CALL auxbas_pw_pool%create_pw(vtau(ispin))
 
  368            CALL get_qs_env(qs_env, rho_xc=rho_struct, dispersion_env=dispersion_env)
 
  370            CALL get_qs_env(qs_env, rho=rho_struct, dispersion_env=dispersion_env)
 
  372         IF (needs%tau .OR. needs%tau_spin) 
THEN 
  373            CALL qs_xc_density(ks_env, rho_struct, xc_section, dispersion_env=dispersion_env, &
 
  374                               xc_den=xc_den, vxc=vxc, vtau=vtau)
 
  376            CALL qs_xc_density(ks_env, rho_struct, xc_section, dispersion_env=dispersion_env, &
 
  377                               xc_den=xc_den, vxc=vxc)
 
  381         CALL get_qs_env(qs_env, natom=natom, matrix_s=matrix_s)
 
  383         ALLOCATE (xcmat(nspins))
 
  385            ALLOCATE (xcmat(ispin)%matrix)
 
  386            CALL dbcsr_create(xcmat(ispin)%matrix, template=matrix_s(1)%matrix)
 
  387            CALL dbcsr_copy(xcmat(ispin)%matrix, matrix_s(1)%matrix)
 
  388            CALL dbcsr_set(xcmat(ispin)%matrix, 0.0_dp)
 
  390            CALL pw_axpy(xc_den, vxc(ispin))
 
  391            CALL pw_scale(vxc(ispin), vxc(ispin)%pw_grid%dvol)
 
  392            CALL integrate_v_rspace(qs_env=qs_env, v_rspace=vxc(ispin), hmat=xcmat(ispin), &
 
  393                                    calculate_forces=.false., gapw=(gapw .OR. gapw_xc))
 
  394            IF (needs%tau .OR. needs%tau_spin) 
THEN 
  395               CALL pw_scale(vtau(ispin), -0.5_dp*vtau(ispin)%pw_grid%dvol)
 
  396               CALL integrate_v_rspace(qs_env=qs_env, v_rspace=vtau(ispin), &
 
  397                                       hmat=xcmat(ispin), calculate_forces=.false., &
 
  398                                       gapw=(gapw .OR. gapw_xc), compute_tau=.true.)
 
  401         IF (gapw .OR. gapw_xc) 
THEN 
  403            CALL qs_rho_get(rho_struct, rho_ao_kp=matrix_p)
 
  404            CALL update_ks_atom(qs_env, xcmat, matrix_p, forces=.false., kscale=-0.5_dp)
 
  405            CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom_set)
 
  407            atprop%ate1c = 0.0_dp
 
  409               atprop%ate1c(iatom) = atprop%ate1c(iatom) + &
 
  410                                     rho_atom_set(iatom)%exc_h - rho_atom_set(iatom)%exc_s
 
  413               CALL get_qs_env(qs_env=qs_env, ecoul_1c=ecoul_1c)
 
  415                  atprop%ate1c(iatom) = atprop%ate1c(iatom) + &
 
  416                                        ecoul_1c(iatom)%ecoul_1_h - ecoul_1c(iatom)%ecoul_1_s + &
 
  417                                        ecoul_1c(iatom)%ecoul_1_z - ecoul_1c(iatom)%ecoul_1_0
 
  422            CALL atom_trace(xcmat(ispin)%matrix, rho_ao(ispin)%matrix, 1.0_dp, atprop%atexc)
 
  424            DEALLOCATE (xcmat(ispin)%matrix)
 
  428         CALL auxbas_pw_pool%give_back_pw(xc_den)
 
  430            CALL auxbas_pw_pool%give_back_pw(vxc(ispin))
 
  432         IF (needs%tau .OR. needs%tau_spin) 
THEN 
  434               CALL auxbas_pw_pool%give_back_pw(vtau(ispin))
 
  440      CALL timestop(handle)
 
  442   END SUBROUTINE ks_xc_correction
 
Define the atomic kind types and their sub types.
 
Holds information on atomic properties.
 
subroutine, public atprop_array_add(array_a, array_b)
...
 
subroutine, public atprop_array_init(atarray, natom)
...
 
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
 
Utilities to set up the control types.
 
subroutine, public read_ddapc_section(qs_control, qs_section, ddapc_restraint_section)
reads the input parameters needed for ddapc.
 
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
 
subroutine, public dbcsr_set(matrix, alpha)
...
 
subroutine, public dbcsr_release(matrix)
...
 
calculates the electron transfer coupling elements by projection-operator approach Kondov et al....
 
subroutine, public calc_et_coupling_proj(qs_env)
calculates the electron transfer coupling elements by projection-operator approach Kondov et al....
 
calculates the electron transfer coupling elements Wu, Van Voorhis, JCP 125, 164105 (2006)
 
subroutine, public calc_et_coupling(qs_env)
...
 
subroutine, public vh_1c_gg_integrals(qs_env, energy_hartree_1c, ecoul_1c, local_rho_set, para_env, tddft, local_rho_set_2nd, core_2nd)
Calculates one center GAPW Hartree energies and matrix elements Hartree potentials are input Takes po...
 
Defines the basic variable types.
 
integer, parameter, public dp
 
Interface to the message passing library MPI.
 
compute mulliken charges we (currently) define them as c_i = 1/2 [ (PS)_{ii} + (SP)_{ii} ]
 
subroutine, public atom_trace(amat, bmat, factor, atrace)
Compute partial trace of product of two matrices.
 
subroutine, public post_scf_bandstructure(qs_env, post_scf_bandstructure_section)
Perform post-SCF band structure calculations from higher level methods.
 
container for various plainwaves related things
 
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
 
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
 
Calculation of the core Hamiltonian integral matrix <a|H|b> over Cartesian Gaussian-type functions.
 
subroutine, public core_matrices(qs_env, matrix_h, matrix_p, calculate_forces, nder, ec_env, dcdr_env, ec_env_matrices, basis_type, debug_forces, debug_stress, atcore)
...
 
Definition of disperson types for DFT calculations.
 
Utility subroutine for qs energy calculation.
 
subroutine, public qs_energies_properties(qs_env, calc_forces)
Refactoring of qs_energies_scf. Moves computation of properties into separate subroutine....
 
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.
 
Integrate single or product functions over a potential on a RS grid.
 
Define the quickstep kind type and their sub types.
 
routines that build the Kohn-Sham matrix contributions coming from local atomic densities
 
subroutine, public update_ks_atom(qs_env, ksmat, pmat, forces, tddft, rho_atom_external, kind_set_external, oce_external, sab_external, kscale, kintegral, kforce, fscale)
The correction to the KS matrix due to the GAPW local terms to the hartree and XC contributions is he...
 
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
 
subroutine, public qs_ks_update_qs_env(qs_env, calculate_forces, just_energy, print_active)
updates the Kohn Sham matrix of the given qs_env (facility method)
 
Contains the setup for the calculation of properties by linear response by the application of second ...
 
subroutine, public linres_calculation_low(qs_env)
Linear response can be called as run type or as post scf calculation Initialize the perturbation envi...
 
subroutine, public integrate_vhg0_rspace(qs_env, v_rspace, para_env, calculate_forces, local_rho_set, local_rho_set_2nd, atener, kforce, my_pools, my_rs_descs)
...
 
subroutine, public zero_rho_atom_integrals(rho_atom_set)
...
 
superstucture that hold various representations of the density and keeps track of which ones are vali...
 
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
 
Routines for the Quickstep SCF run.
 
subroutine, public scf(qs_env, has_converged, total_scf_steps)
perform an scf procedure in the given qs_env
 
subroutine, public tddfpt(qs_env, calc_forces, rixs_env)
Perform TDDFPT calculation. If calc_forces then it also builds the response vector for the Z-vector m...
 
routines that build the integrals of the Vxc potential calculated for the atomic density in the basis...
 
subroutine, public calculate_vxc_atom(qs_env, energy_only, exc1, adiabatic_rescale_factor, kind_set_external, rho_atom_set_external, xc_section_external)
...
 
subroutine, public qs_xc_density(ks_env, rho_struct, xc_section, dispersion_env, xc_ener, xc_den, vxc, vtau)
calculates the XC density: E_xc(r) - V_xc(r)*rho(r) or E_xc(r)/rho(r)
 
Methods for Resonant Inelastic XRAY Scattering (RIXS) calculations.
 
subroutine, public rixs(qs_env)
Driver for RIXS calculations.
 
subroutine, public tip_scanning(qs_env, input_section)
Perform tip scanning calculation.
 
driver for the xas calculation and xas_scf for the tp method
 
subroutine, public xas(qs_env, dft_control)
Driver for xas calculations The initial mos are prepared A loop on the atoms to be excited is started...
 
Methods for X-Ray absorption spectroscopy (XAS) using TDDFPT.
 
subroutine, public xas_tdp(qs_env, rixs_env)
Driver for XAS TDDFT calculations.
 
type(xc_rho_cflags_type) function, public xc_functionals_get_needs(functionals, lsd, calc_potential)
...
 
Provides all information about an atomic kind.
 
type for the atomic properties
 
stores all the informations relevant to an mpi environment
 
contained for different pw related things
 
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
 
Provides all information about a quickstep kind.
 
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...
 
keeps the density in various representations, keeping track of which ones are valid.
 
contains a flag for each component of xc_rho_set, so that you can use it to tell which components you...