32 use,
intrinsic :: iso_fortran_env
102 real(real64),
allocatable :: dmatrix(:, :)
103 complex(real64),
allocatable :: zmatrix(:, :)
110 type(states_elec_t),
intent(inout) :: st
111 class(space_t),
intent(in) :: space
112 type(grid_t),
intent(in) :: gr
113 type(lr_t),
intent(inout) :: lr
114 type(lr_t),
optional,
intent(inout) :: lr_m
116 integer :: idir, ist, ispin, idim, ndim, np
118 complex(real64),
allocatable :: psi(:, :), gpsi(:,:), gdl_psi(:,:), gdl_psi_m(:,:)
122 if (.not.
allocated(lr%dl_j))
then
123 safe_allocate(lr%dl_j(1:gr%np, 1:space%dim, 1:st%d%nspin))
129 safe_allocate(psi(1:gr%np_part, 1:ndim))
130 safe_allocate(gpsi(1:np, 1:ndim))
131 safe_allocate(gdl_psi(1:np, 1:ndim))
132 if (
present(lr_m))
then
133 safe_allocate(gdl_psi_m(1:np, 1:ndim))
138 do ispin = 1, st%d%nspin
143 do idim = 1, st%d%dim
148 if (
present(lr_m))
then
152 do idir = 1, space%dim
154 lr%dl_j(1:np, idir, ispin) = lr%dl_j(1:np, idir, ispin) + ( &
155 + conjg(psi(1:np, idim))*gdl_psi(1:np, idir) &
156 - psi(1:np, idim)*conjg(gdl_psi_m(1:np, idir)) &
157 + conjg(lr_m%zdl_psi(1:np, idim, ist, ispin)) * gpsi(1:np, idir) &
158 - lr%zdl_psi (1:np, idim, ist, ispin) * conjg(gpsi(1:np, idir)) &
164 do idir = 1, space%dim
166 lr%dl_j(1:np, idir, ispin) = lr%dl_j(1:np, idir, ispin) + ( &
167 + conjg(psi(1:np, idim))*gdl_psi(1:np, idir) &
168 - psi(1:np, idim)*conjg(gdl_psi(1:np, idir)) &
169 + conjg(lr%zdl_psi(1:np, idim, ist, ispin)) * gpsi(1:np, idir) &
170 - lr%zdl_psi(1:np, idim, ist, ispin) * conjg(gpsi(1:np, idir)) &
181 safe_deallocate_a(psi)
182 safe_deallocate_a(gpsi)
183 safe_deallocate_a(gdl_psi)
184 if (
present(lr_m))
then
185 safe_deallocate_a(gdl_psi_m)
194 character(len=12) function freq2str(freq)
result(str)
195 real(real64),
intent(in) :: freq
202 write(str,
'(f11.4)') freq
205 if (freq >=
m_zero .and. str(1:1) /=
'0') str =
"0"//trim(str)
206 if (freq <
m_zero .and. str(2:2) /=
'0') str =
"-0"//trim(str(2:))
208 str = trim(adjustl(str))
216 character(len=100) function em_rho_tag(freq, dir, dir2, ipert)
result(str)
217 real(real64),
intent(in) :: freq
218 integer,
intent(in) :: dir
219 integer,
optional,
intent(in) :: dir2
220 integer,
optional,
intent(in) :: ipert
222 character(len=12) :: str_tmp
229 write(str,
'(3a,i1)')
'rho_', trim(str_tmp),
'_', dir
230 if (
present(dir2))
write(str,
'(2a,i1)') trim(str),
"_", dir2
231 if (
present(ipert))
write(str,
'(3a)') trim(str),
"_",
index2pert(ipert)
239 character(len=100) function em_wfs_tag(idir, ifactor, idir2, ipert)
result(str)
240 integer,
intent(in) :: idir
241 integer,
intent(in) :: ifactor
242 integer,
optional,
intent(in) :: idir2
243 integer,
optional,
intent(in) :: ipert
247 write(str,
'(3a,i1)')
"wfs_",
index2axis(idir),
"_f", ifactor
248 if (
present(idir2))
write(str,
'(3a)') trim(str),
"_",
index2axis(idir2)
249 if (
present(ipert))
write(str,
'(3a)') trim(str),
"_",
index2pert(ipert)
261 integer pure function
magn_dir(dir, ind) result(dir_out)
262 integer,
intent(in) :: dir, ind
292 character(len=2) pure function
index2pert(ipert) result(ch)
293 integer,
intent(in) :: ipert
312#include "em_resp_calc_inc.F90"
315#include "complex.F90"
316#include "em_resp_calc_inc.F90"
This module implements batches of mesh functions.
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
subroutine, public dinhomog_kb_tot(sh, namespace, space, gr, st, hm, ions, idir, idir1, idir2, lr_k, lr_b, lr_k1, lr_k2, lr_kk1, lr_kk2, psi_out)
subroutine, public zlr_calc_magneto_optics_finite(sh, sh_mo, namespace, space, gr, st, hm, ions, nsigma, nfactor, lr_e, lr_b, chi)
subroutine, public dlr_calc_magnetization_periodic(namespace, space, mesh, st, hm, lr_k, magn)
integer pure function, public magn_dir(dir, ind)
subroutine, public dpost_orthogonalize(space, mesh, st, nfactor, nsigma, freq_factor, omega, eta, em_lr, kdotp_em_lr)
subroutine, public zlr_calc_magneto_optics_periodic(sh, sh2, namespace, space, gr, st, hm, ions, nsigma, nfactor, nfactor_ke, freq_factor, lr_e, lr_b, lr_k, lr_ke, lr_kb, frequency, zpol, zpol_kout)
subroutine, public zinhomog_k2_tot(namespace, space, gr, st, hm, ions, idir1, idir2, lr_k1, lr_k2, psi_out)
subroutine, public dlr_calc_beta(sh, namespace, space, gr, st, hm, xc, em_lr, dipole, beta, kdotp_lr, kdotp_em_lr, occ_response, dl_eig)
See (16) in X Andrade et al., J. Chem. Phys. 126, 184106 (2006) for finite systems and (10) in A Dal ...
subroutine, public dlr_calc_susceptibility(namespace, space, gr, st, hm, lr, nsigma, pert, chi_para, chi_dia)
subroutine, public lr_calc_current(st, space, gr, lr, lr_m)
subroutine, public dinhomog_ke_tot(sh, namespace, space, gr, st, hm, ions, idir, nsigma, lr_k, lr_e, lr_kk, psi_out)
subroutine, public dlr_calc_elf(st, space, gr, kpoints, lr, lr_m)
subroutine, public dem_resp_calc_eigenvalues(space, mesh, latt, st, dl_eig)
subroutine, public zinhomog_b(sh, namespace, space, gr, st, hm, ions, idir1, idir2, lr_k1, lr_k2, psi_out)
subroutine, public zcalc_polarizability_periodic(space, mesh, symm, st, em_lr, kdotp_lr, nsigma, zpol, ndir, zpol_k)
alpha_ij(w) = -e sum(m occ, k) [(<u_mk(0)|-id/dk_i)|u_mkj(1)(w)> + <u_mkj(1)(-w)|(-id/dk_i|u_mk(0)>)]
subroutine, public dinhomog_b(sh, namespace, space, gr, st, hm, ions, idir1, idir2, lr_k1, lr_k2, psi_out)
subroutine, public zlr_calc_elf(st, space, gr, kpoints, lr, lr_m)
character(len=2) pure function index2pert(ipert)
subroutine, public dcalc_polarizability_periodic(space, mesh, symm, st, em_lr, kdotp_lr, nsigma, zpol, ndir, zpol_k)
alpha_ij(w) = -e sum(m occ, k) [(<u_mk(0)|-id/dk_i)|u_mkj(1)(w)> + <u_mkj(1)(-w)|(-id/dk_i|u_mk(0)>)]
subroutine, public zpost_orthogonalize(space, mesh, st, nfactor, nsigma, freq_factor, omega, eta, em_lr, kdotp_em_lr)
character(len=100) function, public em_wfs_tag(idir, ifactor, idir2, ipert)
subroutine, public zlr_calc_magnetization_periodic(namespace, space, mesh, st, hm, lr_k, magn)
subroutine, public zinhomog_ke_tot(sh, namespace, space, gr, st, hm, ions, idir, nsigma, lr_k, lr_e, lr_kk, psi_out)
character(len=12) function, public freq2str(freq)
subroutine, public dlr_calc_susceptibility_periodic(namespace, space, symm, mesh, st, hm, lr_k, lr_b, lr_kk, lr_kb, magn)
subroutine, public zlr_calc_susceptibility_periodic(namespace, space, symm, mesh, st, hm, lr_k, lr_b, lr_kk, lr_kb, magn)
subroutine, public zlr_calc_susceptibility(namespace, space, gr, st, hm, lr, nsigma, pert, chi_para, chi_dia)
subroutine, public dlr_calc_magneto_optics_finite(sh, sh_mo, namespace, space, gr, st, hm, ions, nsigma, nfactor, lr_e, lr_b, chi)
character(len=100) function, public em_rho_tag(freq, dir, dir2, ipert)
subroutine, public dinhomog_k2_tot(namespace, space, gr, st, hm, ions, idir1, idir2, lr_k1, lr_k2, psi_out)
subroutine, public zlr_calc_beta(sh, namespace, space, gr, st, hm, xc, em_lr, dipole, beta, kdotp_lr, kdotp_em_lr, occ_response, dl_eig)
See (16) in X Andrade et al., J. Chem. Phys. 126, 184106 (2006) for finite systems and (10) in A Dal ...
subroutine, public zcalc_polarizability_finite(namespace, space, gr, st, hm, lr, nsigma, pert, zpol, doalldirs, ndir)
alpha_ij(w) = - sum(m occ) [<psi_m(0)|r_i|psi_mj(1)(w)> + <psi_mj(1)(-w)|r_i|psi_m(0)>] minus sign is...
subroutine, public dcalc_polarizability_finite(namespace, space, gr, st, hm, lr, nsigma, pert, zpol, doalldirs, ndir)
alpha_ij(w) = - sum(m occ) [<psi_m(0)|r_i|psi_mj(1)(w)> + <psi_mj(1)(-w)|r_i|psi_m(0)>] minus sign is...
subroutine, public dlr_calc_magneto_optics_periodic(sh, sh2, namespace, space, gr, st, hm, ions, nsigma, nfactor, nfactor_ke, freq_factor, lr_e, lr_b, lr_k, lr_ke, lr_kb, frequency, zpol, zpol_kout)
subroutine, public zinhomog_kb_tot(sh, namespace, space, gr, st, hm, ions, idir, idir1, idir2, lr_k, lr_b, lr_k1, lr_k2, lr_kk1, lr_kk2, psi_out)
subroutine, public zem_resp_calc_eigenvalues(space, mesh, latt, st, dl_eig)
real(real64), parameter, public m_two
real(real64), parameter, public m_zero
complex(real64), parameter, public m_zi
real(real64), parameter, public m_one
This module implements the underlying real-space grid.
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.
This module handles spin dimensions of the states and the k-point distribution.
This module is intended to contain simple general-purpose utility functions and procedures.
character pure function, public index2axis(idir)