73 subroutine energy_calc_total(namespace, space, hm, gr, st, ext_partners, iunit, full)
74 type(namespace_t),
intent(in) :: namespace
75 class(space_t),
intent(in) :: space
76 type(hamiltonian_elec_t),
intent(inout) :: hm
77 type(grid_t),
intent(in) :: gr
78 type(states_elec_t),
intent(inout) :: st
79 type(partner_list_t),
intent(in) :: ext_partners
80 integer,
optional,
intent(in) :: iunit
81 logical,
optional,
intent(in) :: full
84 type(states_elec_t) :: xst
86 type(gauge_field_t),
pointer :: gfield
91 if (
present(full)) full_ = full
101 hm%energy%extern = hm%energy%extern_local + hm%energy%extern_non_local
108 hm%energy%extern = hm%energy%extern_local + hm%energy%extern_non_local
115 if (.not. hm%exxop%useACE)
then
127 hm%energy%exchange_hf = hm%energy%exchange_hf + hm%exxop%singul%energy
132 hm%energy%exchange_hf =
m_zero
135 if (hm%pcm%run_pcm)
then
136 hm%pcm%counter = hm%pcm%counter + 1
137 if (hm%pcm%localf)
then
138 call pcm_elect_energy(hm%ions, hm%pcm, hm%energy%int_ee_pcm, hm%energy%int_en_pcm, &
139 hm%energy%int_ne_pcm, hm%energy%int_nn_pcm, &
140 e_int_e_ext = hm%energy%int_e_ext_pcm, &
141 e_int_n_ext = hm%energy%int_n_ext_pcm )
143 call pcm_elect_energy(hm%ions, hm%pcm, hm%energy%int_ee_pcm, hm%energy%int_en_pcm, &
144 hm%energy%int_ne_pcm, hm%energy%int_nn_pcm )
148 select case (hm%theory_level)
150 hm%energy%total = hm%ep%eii + hm%energy%eigenvalues
153 hm%energy%total = hm%ep%eii +
m_half * (hm%energy%eigenvalues + hm%energy%kinetic + hm%energy%extern)
156 hm%energy%total = hm%ep%eii + &
157 m_half*(hm%energy%eigenvalues + hm%energy%kinetic + hm%energy%extern - hm%energy%intnvxc &
158 - hm%energy%int_dft_u) &
159 + hm%energy%exchange + hm%energy%exchange_hf + hm%energy%correlation &
160 + hm%energy%vdw - hm%energy%intnvstatic + hm%energy%dft_u
165 hm%energy%total = hm%ep%eii + hm%energy%eigenvalues &
166 - hm%energy%hartree + hm%energy%exchange + hm%energy%correlation + hm%energy%vdw - hm%energy%intnvxc &
167 - hm%energy%pcm_corr + hm%energy%int_ee_pcm + hm%energy%int_en_pcm &
168 + hm%energy%int_nn_pcm + hm%energy%int_ne_pcm &
169 + hm%energy%int_e_ext_pcm + hm%energy%int_n_ext_pcm &
170 + hm%energy%dft_u - hm%energy%int_dft_u - hm%energy%intnvstatic &
171 + hm%energy%photon_exchange
177 hm%energy%entropy =
smear_calc_entropy(st%smear, st%eigenval, st%nik, st%nst, st%kweights, st%occ)
181 hm%energy%TS = st%smear%dsmear * hm%energy%entropy
187 if (
allocated(hm%vberry))
then
188 hm%energy%total = hm%energy%total + hm%energy%berry
195 hm%energy%total = hm%energy%total + hm%magnetic_constrain%energy
201 write(
message(3),
'(6x,a)')
'-----------'
208 write(
message(5),
'(6x,a, f18.8)')
'Exchange = ', &
213 write(
message(9),
'(6x,a, f18.8)')
'Entropy = ', hm%energy%entropy
218 if (hm%pcm%run_pcm)
then
220 hm%energy%int_en_pcm + &
221 hm%energy%int_e_ext_pcm)
223 hm%energy%int_ne_pcm + &
224 hm%energy%int_n_ext_pcm)
226 hm%energy%int_ee_pcm + hm%energy%int_en_pcm + &
227 hm%energy%int_nn_pcm + hm%energy%int_ne_pcm + &
228 hm%energy%int_e_ext_pcm + hm%energy%int_n_ext_pcm)
239 if (
allocated(hm%vberry) .and. space%is_periodic())
then
275 real(real64),
intent(in) :: vxc(:,:)
277 real(real64),
intent(out) :: ex
279 integer :: idir, ip, isp
280 real(real64),
allocatable :: gradvx(:,:), nrgradvx(:)
281 real(real64) :: rr, xx(der%dim)
287 safe_allocate(nrgradvx(1:der%mesh%np_part))
288 safe_allocate(gradvx(1:der%mesh%np, 1:der%dim))
291 do isp = 1, st%d%nspin
293 nrgradvx(1:der%mesh%np) = vxc(1:der%mesh%np,isp)
297 do ip = 1, der%mesh%np
298 call mesh_r(der%mesh, ip, rr, coords=xx)
299 nrgradvx(ip) = nrgradvx(ip) - gradvx(ip, idir) * st%rho(ip, isp) * xx(idir)
305 safe_deallocate_a(gradvx)
306 safe_deallocate_a(nrgradvx)
314#include "energy_calc_inc.F90"
317#include "complex.F90"
318#include "energy_calc_inc.F90"
This module implements batches of mesh functions.
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
subroutine, public dderivatives_grad(der, ff, op_ff, ghost_update, set_bc, to_cartesian)
apply the gradient to a mesh function
integer, parameter, public spinors
subroutine, public energy_calc_total(namespace, space, hm, gr, st, ext_partners, iunit, full)
This subroutine calculates the total energy of the system. Basically, it adds up the KS eigenvalues,...
real(real64) function, public zenergy_calc_electronic(namespace, hm, der, st, terms)
subroutine dcalculate_eigenvalues(namespace, hm, der, st)
calculates the eigenvalues of the orbitals
subroutine, public energy_calc_virial_ex(der, vxc, st, ex)
subroutine zcalculate_eigenvalues(namespace, hm, der, st)
calculates the eigenvalues of the orbitals
real(real64) function, public denergy_calc_electronic(namespace, hm, der, st, terms)
subroutine, public energy_calc_eigenvalues(namespace, hm, der, st)
subroutine, public zexchange_operator_compute_potentials(this, namespace, space, gr, st, xst, kpoints, F_out)
subroutine, public dexchange_operator_compute_potentials(this, namespace, space, gr, st, xst, kpoints, F_out)
real(real64) function, public dexchange_operator_compute_ex(mesh, st, xst)
Compute the exact exchange energy.
real(real64) function, public zexchange_operator_compute_ex(mesh, st, xst)
Compute the exact exchange energy.
type(gauge_field_t) function, pointer, public list_get_gauge_field(partners)
real(real64) function, public gauge_field_get_energy(this)
real(real64), parameter, public m_zero
integer, parameter, public hartree_fock
integer, parameter, public independent_particles
Theory level.
integer, parameter, public generalized_kohn_sham_dft
integer, parameter, public kohn_sham_dft
real(real64), parameter, public m_half
integer, parameter, public hartree
This module implements the underlying real-space grid.
integer, parameter, public term_local_external
integer, parameter, public term_non_local_potential
integer, parameter, public term_kinetic
This module defines classes and functions for interaction partners.
A module to handle KS potential, without the external potential.
integer, parameter, public dft_u_none
This modules implements the routines for doing constrain DFT for noncollinear magnetism.
integer, parameter, public constrain_none
This module defines functions over batches of mesh functions.
This module defines various routines, operating on mesh functions.
This module defines the meshes, which are used in Octopus.
pure subroutine, public mesh_r(mesh, ip, rr, origin, coords)
return the distance to the origin for a given grid point
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
subroutine, public pcm_elect_energy(ions, pcm, E_int_ee, E_int_en, E_int_ne, E_int_nn, E_int_e_ext, E_int_n_ext)
Calculates the solute-solvent electrostatic interaction energy .
real(real64) function, public smear_calc_entropy(this, eigenvalues, nik, nst, kweights, occ)
integer, parameter, public smear_fixed_occ
pure logical function, public states_are_real(st)
This module handles spin dimensions of the states and the k-point distribution.
subroutine, public states_elec_end(st)
finalize the states_elec_t object
real(real64) function, public states_elec_eigenvalues_sum(st, alt_eig)
function to calculate the eigenvalues sum using occupations as weights
brief This module defines the class unit_t which is used by the unit_systems_oct_m module.
This module defines the unit system, used for input and output.
type(unit_system_t), public units_out
logical pure function, public family_is_hybrid(xcs)
Returns true if the functional is an hybrid functional.
class representing derivatives
The states_elec_t class contains all electronic wave functions.