40 use,
intrinsic :: iso_fortran_env
99 class(space_t),
intent(in) :: space
100 class(namespace_t),
intent(in) :: namespace
101 type(grid_t),
intent(in) :: gr
102 type(ions_t),
intent(in) :: ions
103 type(hamiltonian_elec_t),
intent(in) :: hm
104 type(states_elec_t),
intent(in) :: st
105 real(real64),
intent(inout) :: x(:)
124 type(grid_t),
intent(in) :: gr
125 type(namespace_t),
intent(in) :: namespace
126 type(ions_t),
intent(inout) :: ions
127 type(hamiltonian_elec_t),
intent(in) :: hm
128 type(states_elec_t),
intent(in) :: psi
129 type(states_elec_t),
intent(in) :: chi
130 real(real64),
intent(inout) :: ff(:, :)
131 real(real64),
intent(in) :: qq(:, :)
133 integer :: jatom, idim, jdim
134 integer,
target :: j, ist, ik, iatom
135 real(real64) :: rr, w2r, w1r, xx(ions%space%dim), dq, pdot3p, pdot3m, pdot3p2, pdot3m2, dforce1, dforce2
136 complex(real64),
allocatable :: zpsi(:, :), derpsi(:, :, :)
137 real(real64),
allocatable :: forceks1p(:), forceks1m(:), forceks1p2(:), forceks1m2(:), dforceks1(:)
145 do iatom = 1, ions%natoms
146 do jatom = 1, ions%natoms
147 if (jatom == iatom) cycle
148 xx(1:ions%space%dim) = ions%pos(:, jatom) - ions%pos(:, iatom)
149 rr = norm2(xx(1:ions%space%dim))
150 w1r = - ions%charge(iatom) * ions%charge(jatom) / rr**2
151 w2r =
m_two * ions%charge(iatom) * ions%charge(jatom) / rr**3
152 do idim = 1, ions%space%dim
153 do jdim = 1, ions%space%dim
154 ff(iatom, idim) = ff(iatom, idim) + (qq(jatom, jdim) - qq(iatom, jdim)) * w2r * (
m_one/rr**2) * xx(idim) * xx(jdim)
155 ff(iatom, idim) = ff(iatom, idim) - (qq(jatom, jdim) - qq(iatom, jdim)) * w1r * (
m_one/rr**3) * xx(idim) * xx(jdim)
156 if (jdim == idim)
then
157 ff(iatom, idim) = ff(iatom, idim) + (qq(jatom, jdim) - qq(iatom, jdim)) * w1r * (
m_one/rr)
164 safe_allocate(derpsi(1:gr%np_part, 1:ions%space%dim, 1:psi%d%dim))
168 safe_allocate(forceks1p(1:ions%space%dim))
169 safe_allocate(forceks1m(1:ions%space%dim))
170 safe_allocate(forceks1p2(1:ions%space%dim))
171 safe_allocate(forceks1m2(1:ions%space%dim))
172 safe_allocate(dforceks1(1:ions%space%dim))
173 safe_allocate(zpsi(1:gr%np_part, 1:psi%d%dim))
180 do iatom = 1, ions%natoms
181 do j = 1, ions%space%dim
182 call force1(ions%pos(j, iatom) + dq, forceks1p, pdot3p)
183 call force1(ions%pos(j, iatom) - dq, forceks1m, pdot3m)
184 call force1(ions%pos(j, iatom) + dq/
m_two, forceks1p2, pdot3p2)
185 call force1(ions%pos(j, iatom) - dq/
m_two, forceks1m2, pdot3m2)
186 dforceks1 = ((
m_four/
m_three) * (forceks1p2 - forceks1m2) - (
m_one / 6.0_real64) * (forceks1p - forceks1m)) / dq
187 dforce1 = sum(qq(iatom, :) * dforceks1(:))
188 dforce2 = ((
m_four/
m_three) * (pdot3p2 - pdot3m2) - (
m_one / 6.0_real64) * (pdot3p - pdot3m)) / dq
189 ff(iatom, j) = ff(iatom, j) -
m_two * psi%occ(ist, ik) * dforce1 +
m_two * dforce2
195 safe_deallocate_a(zpsi)
196 safe_deallocate_a(forceks1p)
197 safe_deallocate_a(forceks1m)
198 safe_deallocate_a(forceks1p2)
199 safe_deallocate_a(forceks1m2)
200 safe_deallocate_a(dforceks1)
201 safe_deallocate_a(derpsi)
208 subroutine force1(qq, res, pdot3)
209 real(real64),
intent(in) :: qq
210 real(real64),
contiguous,
intent(inout) :: res(:)
211 real(real64),
intent(inout) :: pdot3
215 complex(real64),
allocatable :: viapsi(:, :), zpsi(:, :)
217 qold = ions%pos(j, iatom)
218 ions%pos(j, iatom) = qq
219 safe_allocate(viapsi(1:gr%np_part, 1:psi%d%dim))
220 safe_allocate(zpsi(1:gr%np_part, 1:psi%d%dim))
224 ions%pos(:, iatom), iatom, gr, zpsi, viapsi)
227 do m = 1, ubound(res, 1)
228 res(m) = real(
zmf_dotp(gr, viapsi(:, 1), derpsi(:, m, 1), reduce = .false.), real64)
230 call gr%allreduce(res)
233 pdot3 = real(
m_zi *
zmf_dotp(gr, zpsi(:, 1), viapsi(:, 1)), real64)
234 ions%pos(j, iatom) = qold
236 safe_deallocate_a(viapsi)
244 subroutine forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, vhxc_old, t, dt)
245 type(
grid_t),
intent(in) :: gr
247 type(
ions_t),
intent(inout) :: ions
251 type(
v_ks_t),
intent(in) :: ks
252 real(real64),
optional,
intent(in) :: vhxc_old(:,:)
253 real(real64),
optional,
intent(in) :: t
254 real(real64),
optional,
intent(in) :: dt
256 integer :: j, iatom, idir
257 real(real64) :: xx(ions%space%dim), time, global_force(ions%space%dim)
258 real(real64),
allocatable :: force(:, :), force_loc(:, :), force_nl(:, :), force_u(:, :)
259 real(real64),
allocatable :: force_nlcc(: ,:)
260 real(real64),
allocatable :: force_scf(:, :)
267 if (
present(t)) time = t
270 do iatom = 1, ions%natoms
271 ions%atom(iatom)%f_ii(1:ions%space%dim) =
m_zero
272 ions%atom(iatom)%f_vdw(1:ions%space%dim) =
m_zero
273 ions%atom(iatom)%f_loc(1:ions%space%dim) =
m_zero
274 ions%atom(iatom)%f_nl(1:ions%space%dim) =
m_zero
275 ions%atom(iatom)%f_u(1:ions%space%dim) =
m_zero
276 ions%atom(iatom)%f_fields(1:ions%space%dim) =
m_zero
277 ions%atom(iatom)%f_nlcc(1:ions%space%dim) =
m_zero
278 ions%atom(iatom)%f_scf(1:ions%space%dim) =
m_zero
279 ions%atom(iatom)%f_photons(1:ions%space%dim) =
m_zero
284 if (ks%vdw%vdw_correction == option__vdwcorrection__vdw_ts)
then
288 do iatom = 1, ions%natoms
289 ions%tot_force(:, iatom) = hm%ep%fii(1:ions%space%dim, iatom) + hm%ep%vdw_forces(1:ions%space%dim, iatom)
290 if (ks%has_photons)
then
291 ions%tot_force(:, iatom) = ions%tot_force(:, iatom) &
292 -
p_proton_charge*ions%charge(iatom)*hm%ep%photon_forces(1:ions%space%dim)
294 ions%atom(iatom)%f_ii(1:ions%space%dim) = hm%ep%fii(1:ions%space%dim, iatom)
295 ions%atom(iatom)%f_vdw(1:ions%space%dim) = hm%ep%vdw_forces(1:ions%space%dim, iatom)
296 ions%atom(iatom)%f_photons(1:ions%space%dim) = -
p_proton_charge*ions%charge(iatom)*hm%ep%photon_forces(1:ions%space%dim)
300 global_force = ions%global_force(time)
303 do iatom = 1, ions%natoms
304 ions%tot_force(:, iatom) = ions%tot_force(:, iatom) + global_force
305 ions%atom(iatom)%f_ii(1:ions%space%dim) = ions%atom(iatom)%f_ii(1:ions%space%dim) + global_force
309 safe_allocate(force(1:ions%space%dim, 1:ions%natoms))
310 safe_allocate(force_loc(1:ions%space%dim, 1:ions%natoms))
311 safe_allocate(force_nl(1:ions%space%dim, 1:ions%natoms))
312 safe_allocate(force_u(1:ions%space%dim, 1:ions%natoms))
313 safe_allocate(force_scf(1:ions%space%dim, 1:ions%natoms))
314 safe_allocate(force_nlcc(1:ions%space%dim, 1:ions%natoms))
323 .and. ks%theory_level /=
hartree .and. ks%theory_level /=
rdmft)
then
324 call forces_from_nlcc(gr, ions, st%d%spin_channels, hm%ks_pot%vxc, force_nlcc)
328 if (
present(vhxc_old))
then
329 call forces_from_scf(gr, ions, st%d%spin_channels, hm%ks_pot%vhxc, vhxc_old, force_scf)
334 if (ions%force_total_enforce)
then
343 do iatom = 1, ions%natoms
344 do idir = 1, ions%space%dim
345 ions%tot_force(idir, iatom) = ions%tot_force(idir, iatom) + force(idir, iatom) &
346 + force_scf(idir, iatom) + force_nlcc(idir, iatom)
347 ions%atom(iatom)%f_loc(idir) = force_loc(idir, iatom)
348 ions%atom(iatom)%f_nl(idir) = force_nl(idir, iatom)
349 ions%atom(iatom)%f_u(idir) = force_u(idir, iatom)
350 ions%atom(iatom)%f_nlcc(idir) = force_nlcc(idir, iatom)
351 ions%atom(iatom)%f_scf(idir) = force_scf(idir, iatom)
355 safe_deallocate_a(force)
356 safe_deallocate_a(force_loc)
357 safe_deallocate_a(force_nl)
358 safe_deallocate_a(force_u)
359 safe_deallocate_a(force_nlcc)
360 safe_deallocate_a(force_scf)
364 if (
present(t) .and.
associated(lasers))
then
365 do j = 1, lasers%no_lasers
370 do iatom = 1, ions%natoms
372 ions%tot_force(:, iatom) = ions%tot_force(:, iatom) + ions%charge(iatom)*xx(:)
373 ions%atom(iatom)%f_fields(1:ions%space%dim) = ions%atom(iatom)%f_fields(1:ions%space%dim) &
374 + ions%charge(iatom)*xx(:)
386 do iatom = 1, ions%natoms
388 ions%tot_force(:, iatom) = ions%tot_force(:, iatom) + ions%charge(iatom)*xx(:)
389 ions%atom(iatom)%f_fields(1:ions%space%dim) = ions%atom(iatom)%f_fields(1:ions%space%dim) &
390 + ions%charge(iatom)*xx(:)
394 write(
message(1),
'(a)')
'The forces are currently not supported for nondipole '
395 write(
message(2),
'(a)')
'strong-field approximation Hamiltonian approach.'
400 write(
message(1),
'(a)')
'The forces are currently not properly calculated if time-dependent'
401 write(
message(2),
'(a)')
'magnetic fields are present.'
407 if (
allocated(hm%ep%e_field))
then
408 do iatom = 1, ions%natoms
410 ions%tot_force(:, iatom) = ions%tot_force(:, iatom) + ions%charge(iatom)*hm%ep%e_field(1:ions%space%dim)
411 ions%atom(iatom)%f_fields(1:ions%space%dim) = ions%atom(iatom)%f_fields(1:ions%space%dim) &
412 + ions%charge(iatom)*hm%ep%e_field(1:ions%space%dim)
416 if (
allocated(hm%ep%b_field) .or.
allocated(hm%ep%a_static))
then
417 write(
message(1),
'(a)')
'The forces are currently not properly calculated if static'
418 write(
message(2),
'(a)')
'magnetic fields or static vector potentials are present.'
423 write(
message(1),
'(a)')
'The forces are currently not properly calculated if gauge-field'
424 write(
message(2),
'(a)')
'is applied.'
433 if (hm%kpoints%use_symmetries .or. st%symmetrize_density)
then
438 if (ions%space%is_periodic())
then
450 type(
ions_t),
intent(in) :: ions
451 real(real64),
intent(inout) :: force(:, :)
453 real(real64),
allocatable :: total_force(:)
458 safe_allocate(total_force(1:ions%space%dim))
460 total_force(1:ions%space%dim) = sum(force, dim=2) / ions%natoms
462 do iatom = 1, ions%natoms
463 force(1:ions%space%dim, iatom) = force(1:ions%space%dim, iatom) - total_force(1:ions%space%dim)
466 safe_deallocate_a(total_force)
473 type(
ions_t),
intent(in) :: ions
474 real(real64),
intent(inout) :: total_torque(:)
476 real(real64) :: center_of_mass(ions%space%dim), rr(3), ff(3)
481 center_of_mass = ions%center_of_mass()
486 do iatom = 1, ions%natoms
487 rr(1:ions%space%dim) = ions%pos(1:ions%space%dim, iatom) - center_of_mass
488 ff(1:ions%space%dim) = ions%tot_force(1:ions%space%dim, iatom)
499 integer,
intent(in) :: iunit
500 type(
ions_t),
intent(in) :: ions
501 character(len=*),
intent(in) :: dir
504 integer :: iatom, idir, ii, iunit2
505 real(real64) :: torque(1:3)
512 write(iunit,
'(a,10x,99(14x,a))')
' Ion', (
index2axis(idir), idir = 1, ions%space%dim)
513 do iatom = 1, ions%natoms
514 write(iunit,
'(i4,a10,10es17.8)') iatom, trim(ions%atom(iatom)%species%get_label()), &
517 write(iunit,
'(1x,100a1)') (
"-", ii = 1, 13 + ions%space%dim * 15)
518 write(iunit,
'(a14, 10es17.8)')
" Max abs force", &
520 write(iunit,
'(a14, 10es17.8)')
" Total force", &
523 if (ions%space%dim == 2 .or. ions%space%dim == 3 .and. .not. ions%space%is_periodic())
then
525 write(iunit,
'(a14, 10es17.8)')
' Total torque', &
531 iunit2 =
io_open(trim(dir)//
'/forces', namespace, action=
'write', position=
'asis')
532 write(iunit2,
'(a)') &
533 ' # Total force (x,y,z) Ion-Ion (x,y,z) VdW (x,y,z) Local (x,y,z) NL (x,y,z)' // &
534 ' Fields (x,y,z) Hubbard(x,y,z) SCF(x,y,z) NLCC(x,y,z) Phot (x,y,z)'
535 do iatom = 1, ions%natoms
536 write(iunit2,
'(i4,a10,30es17.8)') iatom, trim(ions%atom(iatom)%species%get_label()), &
558 class(
mesh_t),
intent(in) :: mesh
559 type(
ions_t),
intent(inout) :: ions
560 integer,
intent(in) :: spin_channels
561 real(real64),
intent(in) :: vxc(:,:)
562 real(real64),
contiguous,
intent(out) :: force_nlcc(:, :)
564 integer :: is, iatom, idir
565 real(real64),
allocatable :: drho(:,:)
572 safe_allocate(drho(1:mesh%np, 1:ions%space%dim))
576 do iatom = ions%atoms_dist%start, ions%atoms_dist%end
577 call species_get_nlcc_grad(ions%atom(iatom)%species, ions%space, ions%latt, ions%pos(:, iatom), mesh, drho)
579 do idir = 1, ions%space%dim
580 do is = 1, spin_channels
581 force_nlcc(idir, iatom) = force_nlcc(idir, iatom) &
582 -
dmf_dotp(mesh, drho(:,idir), vxc(1:mesh%np, is), reduce = .false.)/spin_channels
587 safe_deallocate_a(drho)
589 if (ions%atoms_dist%parallel)
call dforces_gather(ions, force_nlcc)
592 call mesh%allreduce(force_nlcc)
605 subroutine forces_from_scf(mesh, ions, spin_channels, vhxc, vhxc_old, force_scf)
606 class(
mesh_t),
intent(in) :: mesh
607 type(
ions_t),
intent(inout) :: ions
608 integer,
intent(in) :: spin_channels
609 real(real64),
intent(in) :: vhxc(:,:)
610 real(real64),
intent(in) :: vhxc_old(:,:)
611 real(real64),
contiguous,
intent(out) :: force_scf(:, :)
613 integer :: is, iatom, idir
614 real(real64),
allocatable :: dvhxc(:,:), drho(:,:,:)
620 safe_allocate(dvhxc(1:mesh%np, 1:spin_channels))
621 safe_allocate(drho(1:mesh%np, 1:spin_channels, 1:ions%space%dim))
624 do is = 1, spin_channels
625 dvhxc(1:mesh%np, is) = vhxc(1:mesh%np, is) - vhxc_old(1:mesh%np, is)
630 do iatom = ions%atoms_dist%start, ions%atoms_dist%end
631 select type(spec=>ions%atom(iatom)%species)
637 ions%pos(:, iatom), mesh, spin_channels, drho)
639 do idir = 1, ions%space%dim
640 do is = 1, spin_channels
641 force_scf(idir, iatom) = force_scf(idir, iatom) &
642 -
dmf_dotp(mesh, drho(:,is,idir), dvhxc(:,is), reduce = .false.)
649 safe_deallocate_a(dvhxc)
650 safe_deallocate_a(drho)
655 call mesh%allreduce(force_scf)
665 class(
mesh_t),
intent(in) :: mesh
666 class(
space_t),
intent(in) :: space
667 real(real64),
intent(in) :: vpsl(:)
668 real(real64),
intent(in) :: gdensity(:, :)
669 real(real64),
intent(inout) :: force(:)
672 real(real64) :: force_tmp(1:space%dim)
676 do idir = 1, space%dim
677 force_tmp(idir) =
dmf_dotp(mesh, vpsl(1:mesh%np), gdensity(:, idir), reduce = .false.)
680 call mesh%allreduce(force_tmp)
682 force(1:space%dim) = force(1:space%dim) + force_tmp(1:space%dim)
690 type(
ions_t),
intent(in) :: ions
691 real(real64),
intent(inout) :: force(:,:)
693 integer :: iatom, iop, iatom_symm
694 real(real64) :: symmetrized_force(ions%space%dim), force_tmp(ions%space%dim)
695 real(real64),
allocatable :: force_sym(:,:)
699 safe_allocate(force_sym(1:ions%space%dim,1:ions%natoms))
700 do iatom = 1, ions%natoms
701 symmetrized_force =
m_zero
702 do iop = 1, ions%symm%nops
703 iatom_symm = ions%inv_map_symm_atoms(iatom, iop)
705 symmetrized_force = symmetrized_force + force_tmp
708 do iop = 1, ions%symm%nops_nonsymmorphic
709 iatom_symm = ions%inv_map_symm_atoms(iatom, iop + ions%symm%nops)
711 symmetrized_force = symmetrized_force + force_tmp
714 force_sym(:, iatom) = symmetrized_force / (ions%symm%nops + ions%symm%nops_nonsymmorphic)
718 safe_deallocate_a(force_sym)
726#include "forces_inc.F90"
729#include "complex.F90"
730#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, public total_force_calculate(space, namespace, gr, ions, hm, st, x)
This computes the total forces on the ions created by the electrons (it excludes the force due to pos...
subroutine forces_from_scf(mesh, ions, spin_channels, vhxc, vhxc_old, force_scf)
subroutine ztotal_force_from_potential(space, namespace, gr, ions, hm, st, x)
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, public forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, vhxc_old, t, dt)
subroutine dtotal_force_from_potential(space, namespace, gr, ions, hm, st, x)
subroutine, public dforces_derivative(gr, namespace, space, ions, ep, st, kpoints, lr, lr2, force_deriv, 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
integer, parameter, public rdmft
integer, parameter, public independent_particles
Theory level.
complex(real64), parameter, public m_z0
complex(real64), parameter, public m_zi
real(real64), parameter, public m_one
real(real64), parameter, public m_three
integer, parameter, public hartree
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.
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.