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 .and. .not. hm%exxop%useACE )
then
119 xst, hm%kpoints, hm%energy%exchange_hf)
122 xst, hm%kpoints, hm%energy%exchange_hf)
125 hm%energy%exchange_hf = hm%energy%exchange_hf + hm%exxop%singul%energy
127 if(.not. hm%exxop%useACE) hm%energy%exchange_hf =
m_zero
130 if (hm%pcm%run_pcm)
then
131 hm%pcm%counter = hm%pcm%counter + 1
132 if (hm%pcm%localf)
then
133 call pcm_elect_energy(hm%ions, hm%pcm, hm%energy%int_ee_pcm, hm%energy%int_en_pcm, &
134 hm%energy%int_ne_pcm, hm%energy%int_nn_pcm, &
135 e_int_e_ext = hm%energy%int_e_ext_pcm, &
136 e_int_n_ext = hm%energy%int_n_ext_pcm )
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 )
143 select case (hm%theory_level)
145 hm%energy%total = hm%ep%eii + hm%energy%eigenvalues
148 hm%energy%total = hm%ep%eii +
m_half * (hm%energy%eigenvalues + hm%energy%kinetic + hm%energy%extern)
151 hm%energy%total = hm%ep%eii + &
152 m_half*(hm%energy%eigenvalues + hm%energy%kinetic + hm%energy%extern - hm%energy%intnvxc &
153 - hm%energy%int_dft_u) &
154 + hm%energy%exchange + hm%energy%exchange_hf + hm%energy%correlation &
155 + hm%energy%vdw - hm%energy%intnvstatic + hm%energy%dft_u
160 hm%energy%total = hm%ep%eii + hm%energy%eigenvalues &
161 - hm%energy%hartree + hm%energy%exchange + hm%energy%correlation + hm%energy%vdw - hm%energy%intnvxc &
162 - hm%energy%pcm_corr + hm%energy%int_ee_pcm + hm%energy%int_en_pcm &
163 + hm%energy%int_nn_pcm + hm%energy%int_ne_pcm &
164 + hm%energy%int_e_ext_pcm + hm%energy%int_n_ext_pcm &
165 + hm%energy%dft_u - hm%energy%int_dft_u - hm%energy%intnvstatic &
166 + hm%energy%photon_exchange
172 hm%energy%entropy =
smear_calc_entropy(st%smear, st%eigenval, st%nik, st%nst, st%kweights, st%occ)
176 hm%energy%TS = st%smear%dsmear * hm%energy%entropy
182 if (
allocated(hm%vberry))
then
183 hm%energy%total = hm%energy%total + hm%energy%berry
190 hm%energy%total = hm%energy%total + hm%magnetic_constrain%energy
196 write(
message(3),
'(6x,a)')
'-----------'
203 write(
message(5),
'(6x,a, f18.8)')
'Exchange = ', &
208 write(
message(9),
'(6x,a, f18.8)')
'Entropy = ', hm%energy%entropy
213 if (hm%pcm%run_pcm)
then
215 hm%energy%int_en_pcm + &
216 hm%energy%int_e_ext_pcm)
218 hm%energy%int_ne_pcm + &
219 hm%energy%int_n_ext_pcm)
221 hm%energy%int_ee_pcm + hm%energy%int_en_pcm + &
222 hm%energy%int_nn_pcm + hm%energy%int_ne_pcm + &
223 hm%energy%int_e_ext_pcm + hm%energy%int_n_ext_pcm)
234 if (
allocated(hm%vberry) .and. space%is_periodic())
then
270 real(real64),
intent(in) :: vxc(:,:)
272 real(real64),
intent(out) :: ex
274 integer :: idir, ip, isp
275 real(real64),
allocatable :: gradvx(:,:), nrgradvx(:)
276 real(real64) :: rr, xx(der%dim)
282 safe_allocate(nrgradvx(1:der%mesh%np_part))
283 safe_allocate(gradvx(1:der%mesh%np, 1:der%dim))
286 do isp = 1, st%d%nspin
288 nrgradvx(1:der%mesh%np) = vxc(1:der%mesh%np,isp)
292 do ip = 1, der%mesh%np
293 call mesh_r(der%mesh, ip, rr, coords=xx)
294 nrgradvx(ip) = nrgradvx(ip) - gradvx(ip, idir) * st%rho(ip, isp) * xx(idir)
300 safe_deallocate_a(gradvx)
301 safe_deallocate_a(nrgradvx)
309#include "energy_calc_inc.F90"
312#include "complex.F90"
313#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, ex, F_out)
subroutine, public dexchange_operator_compute_potentials(this, namespace, space, gr, st, xst, kpoints, ex, F_out)
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
real(real64), parameter, public m_half
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 hartree
integer, parameter, public hartree_fock
integer, parameter, public independent_particles
integer, parameter, public generalized_kohn_sham_dft
integer, parameter, public kohn_sham_dft
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.