41 use,
intrinsic :: iso_fortran_env
100 class(space_t),
intent(in) :: space
101 class(namespace_t),
intent(in) :: namespace
102 type(grid_t),
intent(in) :: gr
103 type(ions_t),
intent(in) :: ions
104 type(hamiltonian_elec_t),
intent(in) :: hm
105 type(states_elec_t),
intent(in) :: st
106 real(real64),
contiguous,
intent(inout) :: x(:)
125 type(grid_t),
intent(in) :: gr
126 type(namespace_t),
intent(in) :: namespace
127 type(ions_t),
intent(inout) :: ions
128 type(hamiltonian_elec_t),
intent(in) :: hm
129 type(states_elec_t),
intent(in) :: psi
130 type(states_elec_t),
intent(in) :: chi
131 real(real64),
contiguous,
intent(inout) :: ff(:, :)
132 real(real64),
intent(in) :: qq(:, :)
134 integer :: jatom, idim, jdim
135 integer,
target :: j, ist, ik, iatom
136 real(real64) :: rr, w2r, w1r, xx(ions%space%dim), dq, pdot3p, pdot3m, pdot3p2, pdot3m2, dforce1, dforce2
137 complex(real64),
allocatable :: zpsi(:, :), derpsi(:, :, :)
138 real(real64),
allocatable :: forceks1p(:), forceks1m(:), forceks1p2(:), forceks1m2(:), dforceks1(:)
146 do iatom = 1, ions%natoms
147 do jatom = 1, ions%natoms
148 if (jatom == iatom) cycle
149 xx(1:ions%space%dim) = ions%pos(:, jatom) - ions%pos(:, iatom)
150 rr = norm2(xx(1:ions%space%dim))
151 w1r = - ions%charge(iatom) * ions%charge(jatom) / rr**2
152 w2r =
m_two * ions%charge(iatom) * ions%charge(jatom) / rr**3
153 do idim = 1, ions%space%dim
154 do jdim = 1, ions%space%dim
155 ff(iatom, idim) = ff(iatom, idim) + (qq(jatom, jdim) - qq(iatom, jdim)) * w2r * (
m_one/rr**2) * xx(idim) * xx(jdim)
156 ff(iatom, idim) = ff(iatom, idim) - (qq(jatom, jdim) - qq(iatom, jdim)) * w1r * (
m_one/rr**3) * xx(idim) * xx(jdim)
157 if (jdim == idim)
then
158 ff(iatom, idim) = ff(iatom, idim) + (qq(jatom, jdim) - qq(iatom, jdim)) * w1r * (
m_one/rr)
165 safe_allocate(derpsi(1:gr%np_part, 1:ions%space%dim, 1:psi%d%dim))
169 safe_allocate(forceks1p(1:ions%space%dim))
170 safe_allocate(forceks1m(1:ions%space%dim))
171 safe_allocate(forceks1p2(1:ions%space%dim))
172 safe_allocate(forceks1m2(1:ions%space%dim))
173 safe_allocate(dforceks1(1:ions%space%dim))
174 safe_allocate(zpsi(1:gr%np_part, 1:psi%d%dim))
181 do iatom = 1, ions%natoms
182 do j = 1, ions%space%dim
183 call force1(ions%pos(j, iatom) + dq, forceks1p, pdot3p)
184 call force1(ions%pos(j, iatom) - dq, forceks1m, pdot3m)
185 call force1(ions%pos(j, iatom) + dq/
m_two, forceks1p2, pdot3p2)
186 call force1(ions%pos(j, iatom) - dq/
m_two, forceks1m2, pdot3m2)
187 dforceks1 = ((
m_four/
m_three) * (forceks1p2 - forceks1m2) - (
m_one / 6.0_real64) * (forceks1p - forceks1m)) / dq
188 dforce1 = sum(qq(iatom, :) * dforceks1(:))
189 dforce2 = ((
m_four/
m_three) * (pdot3p2 - pdot3m2) - (
m_one / 6.0_real64) * (pdot3p - pdot3m)) / dq
190 ff(iatom, j) = ff(iatom, j) -
m_two * psi%occ(ist, ik) * dforce1 +
m_two * dforce2
196 safe_deallocate_a(zpsi)
197 safe_deallocate_a(forceks1p)
198 safe_deallocate_a(forceks1m)
199 safe_deallocate_a(forceks1p2)
200 safe_deallocate_a(forceks1m2)
201 safe_deallocate_a(dforceks1)
202 safe_deallocate_a(derpsi)
209 subroutine force1(qq, res, pdot3)
210 real(real64),
intent(in) :: qq
211 real(real64),
contiguous,
intent(inout) :: res(:)
212 real(real64),
intent(inout) :: pdot3
216 complex(real64),
allocatable :: viapsi(:, :), zpsi(:, :)
218 qold = ions%pos(j, iatom)
219 ions%pos(j, iatom) = qq
220 safe_allocate(viapsi(1:gr%np_part, 1:psi%d%dim))
221 safe_allocate(zpsi(1:gr%np_part, 1:psi%d%dim))
225 ions%pos(:, iatom), iatom, gr, zpsi, viapsi)
228 do m = 1, ubound(res, 1)
229 res(m) = real(
zmf_dotp(gr, viapsi(:, 1), derpsi(:, m, 1), reduce = .false.), real64)
231 call gr%allreduce(res)
234 pdot3 = real(
m_zi *
zmf_dotp(gr, zpsi(:, 1), viapsi(:, 1)), real64)
235 ions%pos(j, iatom) = qold
237 safe_deallocate_a(viapsi)
245 subroutine forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, vhxc_old, t, dt)
246 type(
grid_t),
intent(in) :: gr
248 type(
ions_t),
intent(inout) :: ions
252 type(
v_ks_t),
intent(in) :: ks
253 real(real64),
contiguous,
optional,
intent(in) :: vhxc_old(:,:)
254 real(real64),
optional,
intent(in) :: t
255 real(real64),
optional,
intent(in) :: dt
257 integer :: j, iatom, idir
258 real(real64) :: xx(ions%space%dim), time, global_force(ions%space%dim)
259 real(real64),
allocatable :: force(:, :), force_loc(:, :), force_nl(:, :), force_u(:, :)
260 real(real64),
allocatable :: force_nlcc(: ,:)
261 real(real64),
allocatable :: force_scf(:, :)
269 if (hm%ep%requires_generalized_overlap .and. hm%ep%reltype ==
spin_orbit)
then
274 if (
present(t)) time = t
277 do iatom = 1, ions%natoms
278 ions%atom(iatom)%f_ii(1:ions%space%dim) =
m_zero
279 ions%atom(iatom)%f_vdw(1:ions%space%dim) =
m_zero
280 ions%atom(iatom)%f_loc(1:ions%space%dim) =
m_zero
281 ions%atom(iatom)%f_nl(1:ions%space%dim) =
m_zero
282 ions%atom(iatom)%f_u(1:ions%space%dim) =
m_zero
283 ions%atom(iatom)%f_fields(1:ions%space%dim) =
m_zero
284 ions%atom(iatom)%f_nlcc(1:ions%space%dim) =
m_zero
285 ions%atom(iatom)%f_scf(1:ions%space%dim) =
m_zero
286 ions%atom(iatom)%f_photons(1:ions%space%dim) =
m_zero
291 if (ks%vdw%vdw_correction == option__vdwcorrection__vdw_ts)
then
295 do iatom = 1, ions%natoms
296 ions%tot_force(:, iatom) = hm%ep%fii(1:ions%space%dim, iatom) + hm%ep%vdw_forces(1:ions%space%dim, iatom)
297 if (ks%v_ks_photons%active())
then
298 ions%tot_force(:, iatom) = ions%tot_force(:, iatom) &
299 -
p_proton_charge*ions%charge(iatom)*hm%ep%photon_forces(1:ions%space%dim)
301 ions%atom(iatom)%f_ii(1:ions%space%dim) = hm%ep%fii(1:ions%space%dim, iatom)
302 ions%atom(iatom)%f_vdw(1:ions%space%dim) = hm%ep%vdw_forces(1:ions%space%dim, iatom)
303 ions%atom(iatom)%f_photons(1:ions%space%dim) = -
p_proton_charge*ions%charge(iatom)*hm%ep%photon_forces(1:ions%space%dim)
307 global_force = ions%global_force(time)
310 do iatom = 1, ions%natoms
311 ions%tot_force(:, iatom) = ions%tot_force(:, iatom) + global_force
312 ions%atom(iatom)%f_ii(1:ions%space%dim) = ions%atom(iatom)%f_ii(1:ions%space%dim) + global_force
316 safe_allocate(force(1:ions%space%dim, 1:ions%natoms))
317 safe_allocate(force_loc(1:ions%space%dim, 1:ions%natoms))
318 safe_allocate(force_nl(1:ions%space%dim, 1:ions%natoms))
319 safe_allocate(force_u(1:ions%space%dim, 1:ions%natoms))
320 safe_allocate(force_scf(1:ions%space%dim, 1:ions%natoms))
321 safe_allocate(force_nlcc(1:ions%space%dim, 1:ions%natoms))
330 .and. ks%theory_level /=
hartree .and. ks%theory_level /=
rdmft)
then
331 call forces_from_nlcc(gr, ions, st%d%spin_channels, hm%ks_pot%vxc, force_nlcc)
335 if (
present(vhxc_old))
then
336 call forces_from_scf(gr, ions, st%d%spin_channels, hm%ks_pot%vhxc, vhxc_old, force_scf)
341 if (ions%force_total_enforce)
then
350 do iatom = 1, ions%natoms
351 do idir = 1, ions%space%dim
352 ions%tot_force(idir, iatom) = ions%tot_force(idir, iatom) + force(idir, iatom) &
353 + force_scf(idir, iatom) + force_nlcc(idir, iatom)
354 ions%atom(iatom)%f_loc(idir) = force_loc(idir, iatom)
355 ions%atom(iatom)%f_nl(idir) = force_nl(idir, iatom)
356 ions%atom(iatom)%f_u(idir) = force_u(idir, iatom)
357 ions%atom(iatom)%f_nlcc(idir) = force_nlcc(idir, iatom)
358 ions%atom(iatom)%f_scf(idir) = force_scf(idir, iatom)
362 safe_deallocate_a(force)
363 safe_deallocate_a(force_loc)
364 safe_deallocate_a(force_nl)
365 safe_deallocate_a(force_u)
366 safe_deallocate_a(force_nlcc)
367 safe_deallocate_a(force_scf)
371 if (
present(t) .and.
associated(lasers))
then
372 do j = 1, lasers%no_lasers
377 do iatom = 1, ions%natoms
379 ions%tot_force(:, iatom) = ions%tot_force(:, iatom) + ions%charge(iatom)*xx(:)
380 ions%atom(iatom)%f_fields(1:ions%space%dim) = ions%atom(iatom)%f_fields(1:ions%space%dim) &
381 + ions%charge(iatom)*xx(:)
393 do iatom = 1, ions%natoms
395 ions%tot_force(:, iatom) = ions%tot_force(:, iatom) + ions%charge(iatom)*xx(:)
396 ions%atom(iatom)%f_fields(1:ions%space%dim) = ions%atom(iatom)%f_fields(1:ions%space%dim) &
397 + ions%charge(iatom)*xx(:)
401 write(
message(1),
'(a)')
'The forces are currently not supported for nondipole '
402 write(
message(2),
'(a)')
'strong-field approximation Hamiltonian approach.'
407 write(
message(1),
'(a)')
'The forces are currently not properly calculated if time-dependent'
408 write(
message(2),
'(a)')
'magnetic fields are present.'
414 if (
allocated(hm%ep%e_field))
then
415 do iatom = 1, ions%natoms
417 ions%tot_force(:, iatom) = ions%tot_force(:, iatom) + ions%charge(iatom)*hm%ep%e_field(1:ions%space%dim)
418 ions%atom(iatom)%f_fields(1:ions%space%dim) = ions%atom(iatom)%f_fields(1:ions%space%dim) &
419 + ions%charge(iatom)*hm%ep%e_field(1:ions%space%dim)
423 if (
allocated(hm%ep%b_field) .or.
allocated(hm%ep%a_static))
then
424 write(
message(1),
'(a)')
'The forces are currently not properly calculated if static'
425 write(
message(2),
'(a)')
'magnetic fields or static vector potentials are present.'
430 write(
message(1),
'(a)')
'The forces are currently not properly calculated if gauge-field'
431 write(
message(2),
'(a)')
'is applied.'
440 if (hm%kpoints%use_symmetries .or. st%symmetrize_density)
then
445 if (ions%space%is_periodic())
then
457 type(
ions_t),
intent(in) :: ions
458 real(real64),
contiguous,
intent(inout) :: force(:, :)
460 real(real64),
allocatable :: total_force(:)
465 safe_allocate(total_force(1:ions%space%dim))
467 total_force(1:ions%space%dim) = sum(force, dim=2) / ions%natoms
469 do iatom = 1, ions%natoms
470 force(1:ions%space%dim, iatom) = force(1:ions%space%dim, iatom) - total_force(1:ions%space%dim)
473 safe_deallocate_a(total_force)
480 type(
ions_t),
intent(in) :: ions
481 real(real64),
contiguous,
intent(inout) :: total_torque(:)
483 real(real64) :: center_of_mass(ions%space%dim), rr(3), ff(3)
488 center_of_mass = ions%center_of_mass()
493 do iatom = 1, ions%natoms
494 rr(1:ions%space%dim) = ions%pos(1:ions%space%dim, iatom) - center_of_mass
495 ff(1:ions%space%dim) = ions%tot_force(1:ions%space%dim, iatom)
506 integer,
intent(in) :: iunit
507 type(
ions_t),
intent(in) :: ions
508 character(len=*),
intent(in) :: dir
511 integer :: iatom, idir, ii, iunit2
512 real(real64) :: torque(1:3)
514 if (.not. ions%grp%is_root())
return
519 write(iunit,
'(a,10x,99(14x,a))')
' Ion', (
index2axis(idir), idir = 1, ions%space%dim)
520 do iatom = 1, ions%natoms
521 write(iunit,
'(i4,a10,10es17.8)') iatom, trim(ions%atom(iatom)%species%get_label()), &
524 write(iunit,
'(1x,100a1)') (
"-", ii = 1, 13 + ions%space%dim * 15)
525 write(iunit,
'(a14, 10es17.8)')
" Max abs force", &
527 write(iunit,
'(a14, 10es17.8)')
" Total force", &
530 if ((ions%space%dim == 2 .or. ions%space%dim == 3) .and. .not. ions%space%is_periodic())
then
532 write(iunit,
'(a14, 10es17.8)')
' Total torque', &
538 iunit2 =
io_open(trim(dir)//
'/forces', namespace, action=
'write', position=
'asis')
539 write(iunit2,
'(a)') &
540 ' # Total force (x,y,z) Ion-Ion (x,y,z) VdW (x,y,z) Local (x,y,z) NL (x,y,z)' // &
541 ' Fields (x,y,z) Hubbard(x,y,z) SCF(x,y,z) NLCC(x,y,z) Phot (x,y,z)'
542 do iatom = 1, ions%natoms
543 write(iunit2,
'(i4,a10,30es17.8)') iatom, trim(ions%atom(iatom)%species%get_label()), &
567 type(
grid_t),
intent(in) :: mesh
568 type(
ions_t),
intent(inout) :: ions
569 integer,
intent(in) :: spin_channels
570 real(real64),
contiguous,
intent(in) :: vxc(:,:)
571 real(real64),
contiguous,
intent(out) :: force_nlcc(:, :)
573 integer :: is, iatom, idir
574 real(real64),
allocatable :: pot(:), grad_vxc(:, :)
580 safe_allocate(pot(1:mesh%np_part))
581 safe_allocate(grad_vxc(1:mesh%np, 1:ions%space%dim))
584 do is = 2, spin_channels
592 do iatom = ions%atoms_dist%start, ions%atoms_dist%end
593 call species_get_nlcc(ions%atom(iatom)%species, ions%space, ions%latt, ions%pos(:, iatom), mesh, pot)
595 do idir = 1, ions%space%dim
596 force_nlcc(idir, iatom) = force_nlcc(idir, iatom) &
597 -
dmf_dotp(mesh, pot(:), grad_vxc(:, idir), reduce = .false.)
601 safe_deallocate_a(pot)
602 safe_deallocate_a(grad_vxc)
604 if (ions%atoms_dist%parallel)
call dforces_gather(ions, force_nlcc)
607 call mesh%allreduce(force_nlcc)
620 subroutine forces_from_scf(mesh, ions, spin_channels, vhxc, vhxc_old, force_scf)
621 class(
mesh_t),
intent(in) :: mesh
622 type(
ions_t),
intent(inout) :: ions
623 integer,
intent(in) :: spin_channels
624 real(real64),
contiguous,
intent(in) :: vhxc(:,:)
625 real(real64),
contiguous,
intent(in) :: vhxc_old(:,:)
626 real(real64),
contiguous,
intent(out) :: force_scf(:, :)
628 integer :: is, iatom, idir, ip
629 real(real64),
allocatable :: dvhxc(:,:), drho(:,:,:)
635 safe_allocate(dvhxc(1:mesh%np, 1:spin_channels))
636 safe_allocate(drho(1:mesh%np, 1:spin_channels, 1:ions%space%dim))
640 do is = 1, spin_channels
643 dvhxc(ip, is) = vhxc(ip, is) - vhxc_old(ip, is)
650 do iatom = ions%atoms_dist%start, ions%atoms_dist%end
651 select type(spec=>ions%atom(iatom)%species)
657 ions%pos(:, iatom), mesh, spin_channels, drho)
659 do idir = 1, ions%space%dim
660 do is = 1, spin_channels
661 force_scf(idir, iatom) = force_scf(idir, iatom) &
662 -
dmf_dotp(mesh, drho(:,is,idir), dvhxc(:,is), reduce = .false.)
669 safe_deallocate_a(dvhxc)
670 safe_deallocate_a(drho)
672 if (ions%atoms_dist%parallel)
call dforces_gather(ions, force_scf)
675 call mesh%allreduce(force_scf)
685 class(
mesh_t),
intent(in) :: mesh
686 class(
space_t),
intent(in) :: space
687 real(real64),
contiguous,
intent(in) :: vpsl(:)
688 real(real64),
contiguous,
intent(in) :: gdensity(:, :)
689 real(real64),
contiguous,
intent(inout) :: force(:)
692 real(real64) :: force_tmp(1:space%dim)
696 do idir = 1, space%dim
697 force_tmp(idir) =
dmf_dotp(mesh, vpsl(1:mesh%np), gdensity(:, idir), reduce = .false.)
700 call mesh%allreduce(force_tmp)
702 force(1:space%dim) = force(1:space%dim) + force_tmp(1:space%dim)
710 type(
ions_t),
intent(in) :: ions
711 real(real64),
contiguous,
intent(inout) :: force(:,:)
713 integer :: iatom, iop, iatom_symm
714 real(real64) :: symmetrized_force(ions%space%dim), force_tmp(ions%space%dim)
715 real(real64),
allocatable :: force_sym(:,:)
719 safe_allocate(force_sym(1:ions%space%dim,1:ions%natoms))
720 do iatom = 1, ions%natoms
721 symmetrized_force =
m_zero
722 do iop = 1, ions%symm%nops
723 iatom_symm = ions%inv_map_symm_atoms(iatom, iop)
725 symmetrized_force = symmetrized_force + force_tmp
728 do iop = 1, ions%symm%nops_nonsymmorphic
729 iatom_symm = ions%inv_map_symm_atoms(iatom, iop + ions%symm%nops)
731 symmetrized_force = symmetrized_force + force_tmp
734 force_sym(:, iatom) = symmetrized_force / (ions%symm%nops + ions%symm%nops_nonsymmorphic)
738 safe_deallocate_a(force_sym)
749 type(
ions_t),
intent(in) :: ions
750 complex(real64),
contiguous,
intent(inout) :: charge(:, :, :)
752 integer :: iatom, iop, iatom_symm, dim
753 real(real64) :: rot(ions%space%dim, ions%space%dim)
754 complex(real64),
allocatable :: charge_sym(:, :, :)
759 safe_allocate(charge_sym(1:dim, 1:dim, 1:ions%natoms))
761 do iatom = 1, ions%natoms
762 do iop = 1, ions%symm%nops
763 iatom_symm = ions%inv_map_symm_atoms(iatom, iop)
765 charge_sym(:, :, iatom) = charge_sym(:, :, iatom) + &
766 matmul(transpose(rot), matmul(charge(:, :, iatom_symm), rot))
770 do iop = 1, ions%symm%nops_nonsymmorphic
771 iatom_symm = ions%inv_map_symm_atoms(iatom, iop + ions%symm%nops)
773 charge_sym(:, :, iatom) = charge_sym(:, :, iatom) + &
774 matmul(transpose(rot), matmul(charge(:, :, iatom_symm), rot))
777 charge = charge_sym / (ions%symm%nops + ions%symm%nops_nonsymmorphic)
779 safe_deallocate_a(charge_sym)
787#include "forces_inc.F90"
790#include "complex.F90"
791#include "forces_inc.F90"
subroutine force1(qq, res, pdot3)
constant times a vector plus a vector
Copies a vector x, to a vector y.
scales a vector by a constant
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 dderivatives_grad(der, ff, op_ff, ghost_update, set_bc, to_cartesian)
apply the gradient to a mesh function
subroutine, public zderivatives_grad(der, ff, op_ff, ghost_update, set_bc, to_cartesian)
apply the gradient to a mesh function
integer, parameter, public spin_orbit
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 dforces_derivative(gr, namespace, space, ions, ep, st, kpoints, lr, lr2, force_deriv, lda_u_level, vxc_response)
Computes the derivative of the ionic forces with respect to the strength of an external perturbation...
subroutine, public forces_costate_calculate(gr, namespace, ions, hm, psi, chi, ff, qq)
subroutine, public zforces_derivative(gr, namespace, space, ions, ep, st, kpoints, lr, lr2, force_deriv, lda_u_level, vxc_response)
Computes the derivative of the ionic forces with respect to the strength of an external perturbation...
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 symmetrize_born_charges(ions, charge)
Symmetrizes the Born charge tensors using symmorphic and non-symmorphic operations.
subroutine forces_compute_total_torque(ions, total_torque)
Computes the total torque acting on the system.
subroutine, public zforces_born_charges(gr, namespace, space, ions, ep, st, kpoints, lr, lr2, born_charges, lda_u_level, vxc_response)
lr, lr2 are wfns from electric perturbation; lr is for +omega, lr2 is for -omega. for each atom,...
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 forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, vhxc_old, t, dt)
subroutine, public dforces_born_charges(gr, namespace, space, ions, ep, st, kpoints, lr, lr2, born_charges, lda_u_level, vxc_response)
lr, lr2 are wfns from electric perturbation; lr is for +omega, lr2 is for -omega. for each atom,...
subroutine dtotal_force_from_potential(space, namespace, gr, ions, hm, st, x)
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)
/* To use the profiling module, call profiling_in and profiling_out with the label of the region as a...
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_atom_density_grad(species, namespace, space, latt, pos, mesh, spin_channels, drho)
subroutine, public species_get_nlcc(species, space, latt, pos, mesh, rho_core, accumulate)
pure logical function, public states_are_real(st)
This module handles spin dimensions of the states and the k-point distribution.
real(real64) function, dimension(1:this%dim, 1:this%dim), public symm_op_rotation_matrix_cart(this)
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.