40 use,
intrinsic :: iso_fortran_env
99 class(space_t),
intent(in) :: space
100 type(grid_t),
intent(in) :: gr
101 type(ions_t),
intent(in) :: ions
102 type(epot_t),
intent(in) :: ep
103 type(states_elec_t),
intent(in) :: st
104 type(phase_t),
intent(in) :: phase
105 real(real64),
intent(inout) :: x(:)
106 integer,
intent(in) :: lda_u
126 type(grid_t),
intent(in) :: gr
127 type(namespace_t),
intent(in) :: namespace
128 type(ions_t),
intent(inout) :: ions
129 type(hamiltonian_elec_t),
intent(in) :: hm
130 type(states_elec_t),
intent(in) :: psi
131 type(states_elec_t),
intent(in) :: chi
132 real(real64),
intent(inout) :: ff(:, :)
133 real(real64),
intent(in) :: qq(:, :)
135 integer :: jatom, idim, jdim
136 integer,
target :: j, ist, ik, iatom
137 real(real64) :: rr, w2r, w1r, xx(ions%space%dim), dq, pdot3p, pdot3m, pdot3p2, pdot3m2, dforce1, dforce2
138 complex(real64),
allocatable :: zpsi(:, :), derpsi(:, :, :)
139 real(real64),
allocatable :: forceks1p(:), forceks1m(:), forceks1p2(:), forceks1m2(:), dforceks1(:)
147 do iatom = 1, ions%natoms
148 do jatom = 1, ions%natoms
149 if (jatom == iatom) cycle
150 xx(1:ions%space%dim) = ions%pos(:, jatom) - ions%pos(:, iatom)
151 rr = norm2(xx(1:ions%space%dim))
152 w1r = - ions%charge(iatom) * ions%charge(jatom) / rr**2
153 w2r =
m_two * ions%charge(iatom) * ions%charge(jatom) / rr**3
154 do idim = 1, ions%space%dim
155 do jdim = 1, ions%space%dim
156 ff(iatom, idim) = ff(iatom, idim) + (qq(jatom, jdim) - qq(iatom, jdim)) * w2r * (
m_one/rr**2) * xx(idim) * xx(jdim)
157 ff(iatom, idim) = ff(iatom, idim) - (qq(jatom, jdim) - qq(iatom, jdim)) * w1r * (
m_one/rr**3) * xx(idim) * xx(jdim)
158 if (jdim == idim)
then
159 ff(iatom, idim) = ff(iatom, idim) + (qq(jatom, jdim) - qq(iatom, jdim)) * w1r * (
m_one/rr)
166 safe_allocate(derpsi(1:gr%np_part, 1:ions%space%dim, 1:psi%d%dim))
170 safe_allocate(forceks1p(1:ions%space%dim))
171 safe_allocate(forceks1m(1:ions%space%dim))
172 safe_allocate(forceks1p2(1:ions%space%dim))
173 safe_allocate(forceks1m2(1:ions%space%dim))
174 safe_allocate(dforceks1(1:ions%space%dim))
175 safe_allocate(zpsi(1:gr%np_part, 1:psi%d%dim))
182 do iatom = 1, ions%natoms
183 do j = 1, ions%space%dim
184 call force1(ions%pos(j, iatom) + dq, forceks1p, pdot3p)
185 call force1(ions%pos(j, iatom) - dq, forceks1m, pdot3m)
186 call force1(ions%pos(j, iatom) + dq/
m_two, forceks1p2, pdot3p2)
187 call force1(ions%pos(j, iatom) - dq/
m_two, forceks1m2, pdot3m2)
188 dforceks1 = ((
m_four/
m_three) * (forceks1p2 - forceks1m2) - (
m_one / 6.0_real64) * (forceks1p - forceks1m)) / dq
189 dforce1 = sum(qq(iatom, :) * dforceks1(:))
190 dforce2 = ((
m_four/
m_three) * (pdot3p2 - pdot3m2) - (
m_one / 6.0_real64) * (pdot3p - pdot3m)) / dq
191 ff(iatom, j) = ff(iatom, j) -
m_two * psi%occ(ist, ik) * dforce1 +
m_two * dforce2
197 safe_deallocate_a(zpsi)
198 safe_deallocate_a(forceks1p)
199 safe_deallocate_a(forceks1m)
200 safe_deallocate_a(forceks1p2)
201 safe_deallocate_a(forceks1m2)
202 safe_deallocate_a(dforceks1)
203 safe_deallocate_a(derpsi)
210 subroutine force1(qq, res, pdot3)
211 real(real64),
intent(in) :: qq
212 real(real64),
contiguous,
intent(inout) :: res(:)
213 real(real64),
intent(inout) :: pdot3
217 complex(real64),
allocatable :: viapsi(:, :), zpsi(:, :)
219 qold = ions%pos(j, iatom)
220 ions%pos(j, iatom) = qq
221 safe_allocate(viapsi(1:gr%np_part, 1:psi%d%dim))
222 safe_allocate(zpsi(1:gr%np_part, 1:psi%d%dim))
226 ions%pos(:, iatom), iatom, gr, zpsi, viapsi)
229 do m = 1, ubound(res, 1)
230 res(m) = real(
zmf_dotp(gr, viapsi(:, 1), derpsi(:, m, 1), reduce = .false.), real64)
232 call gr%allreduce(res)
235 pdot3 = real(
m_zi *
zmf_dotp(gr, zpsi(:, 1), viapsi(:, 1)), real64)
236 ions%pos(j, iatom) = qold
238 safe_deallocate_a(viapsi)
246 subroutine forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, vhxc_old, t, dt)
247 type(
grid_t),
intent(in) :: gr
249 type(
ions_t),
intent(inout) :: ions
253 type(
v_ks_t),
intent(in) :: ks
254 real(real64),
optional,
intent(in) :: vhxc_old(:,:)
255 real(real64),
optional,
intent(in) :: t
256 real(real64),
optional,
intent(in) :: dt
258 integer :: j, iatom, idir
259 real(real64) :: xx(ions%space%dim), time, global_force(ions%space%dim)
260 real(real64),
allocatable :: force(:, :), force_loc(:, :), force_nl(:, :), force_u(:, :)
261 real(real64),
allocatable :: force_nlcc(: ,:)
262 real(real64),
allocatable :: force_scf(:, :)
269 if (
present(t)) time = t
272 do iatom = 1, ions%natoms
273 ions%atom(iatom)%f_ii(1:ions%space%dim) =
m_zero
274 ions%atom(iatom)%f_vdw(1:ions%space%dim) =
m_zero
275 ions%atom(iatom)%f_loc(1:ions%space%dim) =
m_zero
276 ions%atom(iatom)%f_nl(1:ions%space%dim) =
m_zero
277 ions%atom(iatom)%f_u(1:ions%space%dim) =
m_zero
278 ions%atom(iatom)%f_fields(1:ions%space%dim) =
m_zero
279 ions%atom(iatom)%f_nlcc(1:ions%space%dim) =
m_zero
280 ions%atom(iatom)%f_scf(1:ions%space%dim) =
m_zero
281 ions%atom(iatom)%f_photons(1:ions%space%dim) =
m_zero
286 if (ks%vdw%vdw_correction == option__vdwcorrection__vdw_ts)
then
290 do iatom = 1, ions%natoms
291 ions%tot_force(:, iatom) = hm%ep%fii(1:ions%space%dim, iatom) + hm%ep%vdw_forces(1:ions%space%dim, iatom)
292 if (ks%has_photons)
then
293 ions%tot_force(:, iatom) = ions%tot_force(:, iatom) &
294 -
p_proton_charge*ions%charge(iatom)*hm%ep%photon_forces(1:ions%space%dim)
296 ions%atom(iatom)%f_ii(1:ions%space%dim) = hm%ep%fii(1:ions%space%dim, iatom)
297 ions%atom(iatom)%f_vdw(1:ions%space%dim) = hm%ep%vdw_forces(1:ions%space%dim, iatom)
298 ions%atom(iatom)%f_photons(1:ions%space%dim) = -
p_proton_charge*ions%charge(iatom)*hm%ep%photon_forces(1:ions%space%dim)
302 global_force = ions%global_force(time)
305 do iatom = 1, ions%natoms
306 ions%tot_force(:, iatom) = ions%tot_force(:, iatom) + global_force
307 ions%atom(iatom)%f_ii(1:ions%space%dim) = ions%atom(iatom)%f_ii(1:ions%space%dim) + global_force
311 safe_allocate(force(1:ions%space%dim, 1:ions%natoms))
312 safe_allocate(force_loc(1:ions%space%dim, 1:ions%natoms))
313 safe_allocate(force_nl(1:ions%space%dim, 1:ions%natoms))
314 safe_allocate(force_u(1:ions%space%dim, 1:ions%natoms))
315 safe_allocate(force_scf(1:ions%space%dim, 1:ions%natoms))
316 safe_allocate(force_nlcc(1:ions%space%dim, 1:ions%natoms))
325 .and. ks%theory_level /=
hartree .and. ks%theory_level /=
rdmft)
then
326 call forces_from_nlcc(gr, ions, st%d%spin_channels, hm%ks_pot%vxc, force_nlcc)
330 if (
present(vhxc_old))
then
331 call forces_from_scf(gr, ions, st%d%spin_channels, hm%ks_pot%vhxc, vhxc_old, force_scf)
336 if (ions%force_total_enforce)
then
345 do iatom = 1, ions%natoms
346 do idir = 1, ions%space%dim
347 ions%tot_force(idir, iatom) = ions%tot_force(idir, iatom) + force(idir, iatom) &
348 + force_scf(idir, iatom) + force_nlcc(idir, iatom)
349 ions%atom(iatom)%f_loc(idir) = force_loc(idir, iatom)
350 ions%atom(iatom)%f_nl(idir) = force_nl(idir, iatom)
351 ions%atom(iatom)%f_u(idir) = force_u(idir, iatom)
352 ions%atom(iatom)%f_nlcc(idir) = force_nlcc(idir, iatom)
353 ions%atom(iatom)%f_scf(idir) = force_scf(idir, iatom)
357 safe_deallocate_a(force)
358 safe_deallocate_a(force_loc)
359 safe_deallocate_a(force_nl)
360 safe_deallocate_a(force_u)
361 safe_deallocate_a(force_nlcc)
362 safe_deallocate_a(force_scf)
366 if (
present(t) .and.
associated(lasers))
then
367 do j = 1, lasers%no_lasers
372 do iatom = 1, ions%natoms
374 ions%tot_force(:, iatom) = ions%tot_force(:, iatom) + ions%charge(iatom)*xx(:)
375 ions%atom(iatom)%f_fields(1:ions%space%dim) = ions%atom(iatom)%f_fields(1:ions%space%dim) &
376 + ions%charge(iatom)*xx(:)
388 do iatom = 1, ions%natoms
390 ions%tot_force(:, iatom) = ions%tot_force(:, iatom) + ions%charge(iatom)*xx(:)
391 ions%atom(iatom)%f_fields(1:ions%space%dim) = ions%atom(iatom)%f_fields(1:ions%space%dim) &
392 + ions%charge(iatom)*xx(:)
396 write(
message(1),
'(a)')
'The forces are currently not supported for nondipole '
397 write(
message(2),
'(a)')
'strong-field approximation Hamiltonian approach.'
402 write(
message(1),
'(a)')
'The forces are currently not properly calculated if time-dependent'
403 write(
message(2),
'(a)')
'magnetic fields are present.'
409 if (
allocated(hm%ep%e_field))
then
410 do iatom = 1, ions%natoms
412 ions%tot_force(:, iatom) = ions%tot_force(:, iatom) + ions%charge(iatom)*hm%ep%e_field(1:ions%space%dim)
413 ions%atom(iatom)%f_fields(1:ions%space%dim) = ions%atom(iatom)%f_fields(1:ions%space%dim) &
414 + ions%charge(iatom)*hm%ep%e_field(1:ions%space%dim)
418 if (
allocated(hm%ep%b_field) .or.
allocated(hm%ep%a_static))
then
419 write(
message(1),
'(a)')
'The forces are currently not properly calculated if static'
420 write(
message(2),
'(a)')
'magnetic fields or static vector potentials are present.'
425 write(
message(1),
'(a)')
'The forces are currently not properly calculated if gauge-field'
426 write(
message(2),
'(a)')
'is applied.'
435 if (hm%kpoints%use_symmetries .or. st%symmetrize_density)
then
440 if (ions%space%is_periodic())
then
452 type(
ions_t),
intent(in) :: ions
453 real(real64),
intent(inout) :: force(:, :)
455 real(real64),
allocatable :: total_force(:)
460 safe_allocate(total_force(1:ions%space%dim))
462 total_force(1:ions%space%dim) = sum(force, dim=2) / ions%natoms
464 do iatom = 1, ions%natoms
465 force(1:ions%space%dim, iatom) = force(1:ions%space%dim, iatom) - total_force(1:ions%space%dim)
468 safe_deallocate_a(total_force)
475 type(
ions_t),
intent(in) :: ions
476 real(real64),
intent(inout) :: total_torque(:)
478 real(real64) :: center_of_mass(ions%space%dim), rr(3), ff(3)
483 center_of_mass = ions%center_of_mass()
488 do iatom = 1, ions%natoms
489 rr(1:ions%space%dim) = ions%pos(1:ions%space%dim, iatom) - center_of_mass
490 ff(1:ions%space%dim) = ions%tot_force(1:ions%space%dim, iatom)
501 integer,
intent(in) :: iunit
502 type(
ions_t),
intent(in) :: ions
503 character(len=*),
intent(in) :: dir
506 integer :: iatom, idir, ii, iunit2
507 real(real64) :: torque(1:3)
514 write(iunit,
'(a,10x,99(14x,a))')
' Ion', (
index2axis(idir), idir = 1, ions%space%dim)
515 do iatom = 1, ions%natoms
516 write(iunit,
'(i4,a10,10es17.8)') iatom, trim(ions%atom(iatom)%species%get_label()), &
519 write(iunit,
'(1x,100a1)') (
"-", ii = 1, 13 + ions%space%dim * 15)
520 write(iunit,
'(a14, 10es17.8)')
" Max abs force", &
522 write(iunit,
'(a14, 10es17.8)')
" Total force", &
525 if (ions%space%dim == 2 .or. ions%space%dim == 3 .and. .not. ions%space%is_periodic())
then
527 write(iunit,
'(a14, 10es17.8)')
' Total torque', &
533 iunit2 =
io_open(trim(dir)//
'/forces', namespace, action=
'write', position=
'asis')
534 write(iunit2,
'(a)') &
535 ' # Total force (x,y,z) Ion-Ion (x,y,z) VdW (x,y,z) Local (x,y,z) NL (x,y,z)' // &
536 ' Fields (x,y,z) Hubbard(x,y,z) SCF(x,y,z) NLCC(x,y,z) Phot (x,y,z)'
537 do iatom = 1, ions%natoms
538 write(iunit2,
'(i4,a10,30es17.8)') iatom, trim(ions%atom(iatom)%species%get_label()), &
560 class(
mesh_t),
intent(in) :: mesh
561 type(
ions_t),
intent(inout) :: ions
562 integer,
intent(in) :: spin_channels
563 real(real64),
intent(in) :: vxc(:,:)
564 real(real64),
contiguous,
intent(out) :: force_nlcc(:, :)
566 integer :: is, iatom, idir
567 real(real64),
allocatable :: drho(:,:)
574 safe_allocate(drho(1:mesh%np, 1:ions%space%dim))
578 do iatom = ions%atoms_dist%start, ions%atoms_dist%end
579 call species_get_nlcc_grad(ions%atom(iatom)%species, ions%space, ions%latt, ions%pos(:, iatom), mesh, drho)
581 do idir = 1, ions%space%dim
582 do is = 1, spin_channels
583 force_nlcc(idir, iatom) = force_nlcc(idir, iatom) &
584 -
dmf_dotp(mesh, drho(:,idir), vxc(1:mesh%np, is), reduce = .false.)/spin_channels
589 safe_deallocate_a(drho)
591 if (ions%atoms_dist%parallel)
call dforces_gather(ions, force_nlcc)
594 call mesh%allreduce(force_nlcc)
607 subroutine forces_from_scf(mesh, ions, spin_channels, vhxc, vhxc_old, force_scf)
608 class(
mesh_t),
intent(in) :: mesh
609 type(
ions_t),
intent(inout) :: ions
610 integer,
intent(in) :: spin_channels
611 real(real64),
intent(in) :: vhxc(:,:)
612 real(real64),
intent(in) :: vhxc_old(:,:)
613 real(real64),
contiguous,
intent(out) :: force_scf(:, :)
615 integer :: is, iatom, idir
616 real(real64),
allocatable :: dvhxc(:,:), drho(:,:,:)
622 safe_allocate(dvhxc(1:mesh%np, 1:spin_channels))
623 safe_allocate(drho(1:mesh%np, 1:spin_channels, 1:ions%space%dim))
626 do is = 1, spin_channels
627 dvhxc(1:mesh%np, is) = vhxc(1:mesh%np, is) - vhxc_old(1:mesh%np, is)
632 do iatom = ions%atoms_dist%start, ions%atoms_dist%end
633 select type(spec=>ions%atom(iatom)%species)
639 ions%pos(:, iatom), mesh, spin_channels, drho)
641 do idir = 1, ions%space%dim
642 do is = 1, spin_channels
643 force_scf(idir, iatom) = force_scf(idir, iatom) &
644 -
dmf_dotp(mesh, drho(:,is,idir), dvhxc(:,is), reduce = .false.)
651 safe_deallocate_a(dvhxc)
652 safe_deallocate_a(drho)
657 call mesh%allreduce(force_scf)
667 class(
mesh_t),
intent(in) :: mesh
668 class(
space_t),
intent(in) :: space
669 real(real64),
intent(in) :: vpsl(:)
670 real(real64),
intent(in) :: gdensity(:, :)
671 real(real64),
intent(inout) :: force(:)
674 real(real64) :: force_tmp(1:space%dim)
678 do idir = 1, space%dim
679 force_tmp(idir) =
dmf_dotp(mesh, vpsl(1:mesh%np), gdensity(:, idir), reduce = .false.)
682 call mesh%allreduce(force_tmp)
684 force(1:space%dim) = force(1:space%dim) + force_tmp(1:space%dim)
692 type(
ions_t),
intent(in) :: ions
693 real(real64),
intent(inout) :: force(:,:)
695 integer :: iatom, iop, iatom_symm
696 real(real64) :: symmetrized_force(ions%space%dim), force_tmp(ions%space%dim)
697 real(real64),
allocatable :: force_sym(:,:)
701 safe_allocate(force_sym(1:ions%space%dim,1:ions%natoms))
702 do iatom = 1, ions%natoms
703 symmetrized_force =
m_zero
704 do iop = 1, ions%symm%nops
705 iatom_symm = ions%inv_map_symm_atoms(iatom, iop)
707 symmetrized_force = symmetrized_force + force_tmp
710 do iop = 1, ions%symm%nops_nonsymmorphic
711 iatom_symm = ions%inv_map_symm_atoms(iatom, iop + ions%symm%nops)
713 symmetrized_force = symmetrized_force + force_tmp
716 force_sym(:, iatom) = symmetrized_force / (ions%symm%nops + ions%symm%nops_nonsymmorphic)
720 safe_deallocate_a(force_sym)
728#include "forces_inc.F90"
731#include "complex.F90"
732#include "forces_inc.F90"
subroutine force1(qq, res, pdot3)
This module implements batches of mesh functions.
This module implements common operations on batches of mesh functions.
Module implementing boundary conditions in Octopus.
This module implements a calculator for the density and defines related functions.
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
subroutine, public zderivatives_grad(der, ff, op_ff, ghost_update, set_bc, to_cartesian)
apply the gradient to a mesh function
logical function, public list_has_gauge_field(partners)
type(lasers_t) function, pointer, public list_get_lasers(partners)
subroutine, public zforces_from_potential(gr, namespace, space, ions, hm, st, force, force_loc, force_nl, force_u)
Ref: Kikuji Hirose, Tomoya Ono, Yoshitaka Fujimoto, and Shigeru Tsukamoto, First-principles calculati...
subroutine, public forces_costate_calculate(gr, namespace, ions, hm, psi, chi, ff, qq)
subroutine forces_from_scf(mesh, ions, spin_channels, vhxc, vhxc_old, force_scf)
subroutine symmetrize_force(ions, force)
Given the forces on all atoms, this symmetrizes them using symmorphic and non-symmorphic operations.
subroutine, public zforces_born_charges(gr, namespace, space, ions, ep, st, kpoints, lr, lr2, born_charges, lda_u_level)
lr, lr2 are wfns from electric perturbation; lr is for +omega, lr2 is for -omega. for each atom,...
subroutine forces_compute_total_torque(ions, total_torque)
Computes the total torque acting on the system.
subroutine, public forces_write_info(iunit, ions, dir, namespace)
subroutine, public forces_set_total_to_zero(ions, force)
subroutine, public dforces_from_potential(gr, namespace, space, ions, hm, st, force, force_loc, force_nl, force_u)
Ref: Kikuji Hirose, Tomoya Ono, Yoshitaka Fujimoto, and Shigeru Tsukamoto, First-principles calculati...
subroutine, public zforces_derivative(gr, namespace, space, ions, ep, st, kpoints, lr, lr2, force_deriv, lda_u_level)
subroutine dtotal_force_from_potential(space, gr, ions, ep, st, phase, x, lda_u_level)
subroutine, public forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, vhxc_old, t, dt)
subroutine, public total_force_calculate(space, gr, ions, ep, st, phase, x, lda_u)
This computes the total forces on the ions created by the electrons (it excludes the force due to pos...
subroutine, public dforces_derivative(gr, namespace, space, ions, ep, st, kpoints, lr, lr2, force_deriv, lda_u_level)
subroutine ztotal_force_from_potential(space, gr, ions, ep, st, phase, x, lda_u_level)
subroutine, public dforces_born_charges(gr, namespace, space, ions, ep, st, kpoints, lr, lr2, born_charges, lda_u_level)
lr, lr2 are wfns from electric perturbation; lr is for +omega, lr2 is for -omega. for each atom,...
subroutine total_force_from_local_potential(mesh, space, vpsl, gdensity, force)
subroutine dforces_gather(ions, force)
subroutine forces_from_nlcc(mesh, ions, spin_channels, vxc, force_nlcc)
real(real64), parameter, public m_two
real(real64), parameter, public p_proton_charge
real(real64), parameter, public m_zero
real(real64), parameter, public m_four
complex(real64), parameter, public m_z0
complex(real64), parameter, public m_zi
real(real64), parameter, public m_one
real(real64), parameter, public m_three
This module implements the underlying real-space grid.
subroutine, public zhamiltonian_elec_apply_atom(hm, namespace, space, latt, species, pos, ia, mesh, psi, vpsi)
This module defines classes and functions for interaction partners.
subroutine, public io_close(iunit, grp)
integer function, public io_open(file, namespace, action, status, form, position, die, recl, grp)
A module to handle KS potential, without the external potential.
integer, parameter, public rdmft
integer, parameter, public hartree
integer, parameter, public independent_particles
logical function, public lasers_with_nondipole_field(lasers)
Check if a nondipole SFA correction should be computed for the given laser.
integer, parameter, public e_field_electric
integer, parameter, public e_field_vector_potential
subroutine, public laser_electric_field(laser, field, time, dt)
Returns a vector with the electric field, no matter whether the laser is described directly as an ele...
integer, parameter, public e_field_scalar_potential
integer pure elemental function, public laser_kind(laser)
subroutine, public laser_field(laser, field, time)
Retrieves the value of either the electric or the magnetic field. If the laser is given by a scalar p...
integer, parameter, public e_field_magnetic
This modules implements the routines for doing constrain DFT for noncollinear magnetism.
integer, parameter, public constrain_none
This module is intended to contain "only mathematical" functions and procedures.
pure real(real64) function, dimension(1:3), public dcross_product(a, b)
This module defines various routines, operating on mesh functions.
This module defines the meshes, which are used in Octopus.
subroutine, public messages_not_implemented(feature, namespace)
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_fatal(no_lines, only_root_writes, namespace)
type(mpi_grp_t), public mpi_world
subroutine, public profiling_out(label)
Increment out counter and sum up difference between entry and exit time.
subroutine, public profiling_in(label, exclude)
Increment in counter and save entry time.
pure logical function, public ps_has_density(ps)
subroutine, public species_get_nlcc_grad(species, space, latt, pos, mesh, rho_core_grad, gnlcc_x)
subroutine, public species_atom_density_grad(species, namespace, space, latt, pos, mesh, spin_channels, drho)
pure logical function, public states_are_real(st)
This module handles spin dimensions of the states and the k-point distribution.
brief This module defines the class unit_t which is used by the unit_systems_oct_m module.
character(len=20) pure function, public units_abbrev(this)
This module defines the unit system, used for input and output.
type(unit_system_t), public units_out
This module is intended to contain simple general-purpose utility functions and procedures.
character pure function, public index2axis(idir)
Tkatchenko-Scheffler pairwise method for van der Waals (vdW, dispersion) interactions.
subroutine, public vdw_ts_force_calculate(this, force_vdw, ions, mesh, nspin, density)
Description of the grid, containing information on derivatives, stencil, and symmetries.
Describes mesh distribution to nodes.
The states_elec_t class contains all electronic wave functions.