31 use,
intrinsic :: iso_fortran_env
99 real(real64),
allocatable :: dmatrix(:, :)
100 complex(real64),
allocatable :: zmatrix(:, :)
107 type(states_elec_t),
intent(inout) :: st
108 class(space_t),
intent(in) :: space
109 type(grid_t),
intent(in) :: gr
110 type(lr_t),
intent(inout) :: lr
111 type(lr_t),
optional,
intent(inout) :: lr_m
113 integer :: idir, ist, ispin, idim, ndim, np, ip
115 complex(real64),
allocatable :: psi(:, :), gpsi(:,:), gdl_psi(:,:), gdl_psi_m(:,:)
119 if (.not.
allocated(lr%dl_j))
then
120 safe_allocate(lr%dl_j(1:gr%np, 1:space%dim, 1:st%d%nspin))
123 assert(
allocated(lr%zdl_psi))
128 safe_allocate(psi(1:gr%np_part, 1:ndim))
129 safe_allocate(gpsi(1:np, 1:ndim))
130 safe_allocate(gdl_psi(1:np, 1:ndim))
131 if (
present(lr_m))
then
132 safe_allocate(gdl_psi_m(1:np, 1:ndim))
137 do ispin = 1, st%d%nspin
142 do idim = 1, st%d%dim
147 if (
present(lr_m))
then
152 do idir = 1, space%dim
156 lr%dl_j(ip, idir, ispin) = lr%dl_j(ip, idir, ispin) + ( &
157 + conjg(psi(ip, idim))*gdl_psi(ip, idir) &
158 - psi(ip, idim)*conjg(gdl_psi_m(ip, idir)) &
159 + conjg(lr_m%zdl_psi(ip, idim, ist, ispin)) * gpsi(ip, idir) &
160 - lr%zdl_psi (ip, idim, ist, ispin) * conjg(gpsi(ip, idir)) &
169 do idir = 1, space%dim
173 lr%dl_j(ip, idir, ispin) = lr%dl_j(ip, idir, ispin) + ( &
174 + conjg(psi(ip, idim))*gdl_psi(ip, idir) &
175 - psi(ip, idim)*conjg(gdl_psi(ip, idir)) &
176 + conjg(lr%zdl_psi(ip, idim, ist, ispin)) * gpsi(ip, idir) &
177 - lr%zdl_psi(ip, idim, ist, ispin) * conjg(gpsi(ip, idir)) &
190 safe_deallocate_a(psi)
191 safe_deallocate_a(gpsi)
192 safe_deallocate_a(gdl_psi)
193 if (
present(lr_m))
then
194 safe_deallocate_a(gdl_psi_m)
203 character(len=12) function freq2str(freq)
result(str)
204 real(real64),
intent(in) :: freq
211 write(str,
'(f11.4)') freq
213 if (abs(freq) <
m_one)
then
214 if (freq >=
m_zero .and. str(1:1) /=
'0') str =
"0"//trim(str)
215 if (freq <
m_zero .and. str(2:2) /=
'0') str =
"-0"//trim(str(2:))
217 str = trim(adjustl(str))
225 character(len=100) function em_rho_tag(freq, dir, dir2, ipert)
result(str)
226 real(real64),
intent(in) :: freq
227 integer,
intent(in) :: dir
228 integer,
optional,
intent(in) :: dir2
229 integer,
optional,
intent(in) :: ipert
231 character(len=12) :: str_tmp
238 write(str,
'(3a,i1)')
'rho_', trim(str_tmp),
'_', dir
239 if (
present(dir2))
write(str,
'(2a,i1)') trim(str),
"_", dir2
240 if (
present(ipert))
write(str,
'(3a)') trim(str),
"_",
index2pert(ipert)
248 character(len=100) function em_wfs_tag(idir, ifactor, idir2, ipert)
result(str)
249 integer,
intent(in) :: idir
250 integer,
intent(in) :: ifactor
251 integer,
optional,
intent(in) :: idir2
252 integer,
optional,
intent(in) :: ipert
256 write(str,
'(3a,i1)')
"wfs_",
index2axis(idir),
"_f", ifactor
257 if (
present(idir2))
write(str,
'(3a)') trim(str),
"_",
index2axis(idir2)
258 if (
present(ipert))
write(str,
'(3a)') trim(str),
"_",
index2pert(ipert)
270 integer pure function
magn_dir(dir, ind) result(dir_out)
271 integer,
intent(in) :: dir, ind
301 character(len=2) pure function
index2pert(ipert) result(ch)
302 integer,
intent(in) :: ipert
321#include "em_resp_calc_inc.F90"
324#include "complex.F90"
325#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 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)
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)