74 type(submesh_t) :: sphere
75 complex(real64),
allocatable :: phase(:,:)
78 real(real64) :: Ubar, Jbar
82 real(real64),
allocatable :: V_ij(:,:)
83 real(real64),
allocatable :: coulomb_IIJJ(:,:,:,:,:)
84 complex(real64),
allocatable :: zcoulomb_IIJJ(:,:,:,:,:,:,:)
85 integer,
allocatable:: map_os(:)
86 complex(real64),
allocatable :: phase_shift(:,:)
88 real(real64) :: radius
89 class(species_t),
pointer :: spec => null()
92 real(real64),
allocatable :: dorb(:,:,:)
93 complex(real64),
allocatable :: zorb(:,:,:)
94 complex(real64),
allocatable :: eorb_submesh(:,:,:,:)
95 complex(real64),
allocatable :: eorb_mesh(:,:,:,:)
97 type(accel_mem_t) :: dbuff_orb, zbuff_orb
98 type(accel_mem_t),
allocatable :: buff_eorb (:)
100 logical :: use_submesh
102 type(poisson_t) :: poisson
110 type(orbitalset_t),
intent(inout) :: this
136 type(orbitalset_t),
intent(inout) :: this
142 safe_deallocate_a(this%phase)
143 safe_deallocate_a(this%dorb)
144 safe_deallocate_a(this%zorb)
145 safe_deallocate_a(this%eorb_submesh)
146 safe_deallocate_a(this%eorb_mesh)
150 safe_deallocate_a(this%V_ij)
151 safe_deallocate_a(this%coulomb_IIJJ)
152 safe_deallocate_a(this%map_os)
153 safe_deallocate_a(this%phase_shift)
158 if(
allocated(this%buff_eorb))
then
159 do ik = lbound(this%buff_eorb, dim=1), ubound(this%buff_eorb, dim=1)
162 safe_deallocate_a(this%buff_eorb)
171 real(real64),
intent(in) :: jj
172 integer,
intent(in) :: ll, nn
187 integer,
intent(in) :: dim
190 logical,
intent(in) :: spin_polarized
191 real(real64),
optional,
allocatable,
intent(in) :: vec_pot(:)
192 real(real64),
optional,
allocatable,
intent(in) :: vec_pot_var(:, :)
193 integer,
optional,
intent(in) :: kpt_max
195 integer :: ns, iq, is, ikpoint, im, idim, kpt_end
196 real(real64) :: kr, kpoint(1:dim), dx(1:dim)
204 if (
present(kpt_max)) kpt_end = min(kpt_max, kpt_end)
206 do iq = kpt%start, kpt_end
208 if (spin_polarized)
then
209 ikpoint = 1 + (iq - 1)/2
217 kpoint(1:dim) = kpoints%get_point(ikpoint)
223 dx = os%sphere%rel_x(1:dim, is) - os%sphere%mesh%x(os%sphere%map(is), 1:dim) + os%sphere%center(1:dim)
224 kr = dot_product(kpoint, dx)
225 if (
present(vec_pot))
then
226 if (
allocated(vec_pot)) kr = kr + dot_product(vec_pot, dx)
229 if (
present(vec_pot_var))
then
230 if (
allocated(vec_pot_var)) kr = kr + sum(vec_pot_var(1:dim, os%sphere%map(is)) &
231 *(os%sphere%rel_x(1:dim, is)+os%sphere%center))
234 os%phase(is, iq) =
exp(
m_zi*kr)
237 if (.not. os%use_submesh)
then
241 os%eorb_mesh(:, im, idim, iq) =
m_z0
243 os%eorb_mesh(os%sphere%map(is),im,idim,iq) = os%eorb_mesh(os%sphere%map(is),im,idim,iq) &
244 + os%zorb(is, idim, im) * os%phase(is, iq)
254 os%eorb_submesh(is,idim,im,iq) = os%zorb(is,idim,im)*os%phase(is, iq)
263 if(os%use_submesh)
then
264 do iorb = 1, os%norbs
265 call accel_write_buffer(os%buff_eorb(iq), ns, os%eorb_submesh(:, 1, iorb, iq), offset = (iorb - 1)*os%ldorbs)
268 do iorb = 1, os%norbs
270 os%eorb_mesh(:, iorb, 1, iq), offset = (iorb - 1)*os%ldorbs)
283 integer,
intent(in) :: dim
286 logical,
intent(in) :: spin_polarized
287 real(real64),
optional,
allocatable,
intent(in) :: vec_pot(:)
288 real(real64),
optional,
allocatable,
intent(in) :: vec_pot_var(:, :)
289 integer,
optional,
intent(in) :: kpt_max
291 integer :: iq, ikpoint
292 real(real64) :: kr, kpoint(dim), dx(dim)
293 integer :: inn, kpt_end
298 if(
present(kpt_max)) kpt_end = min(kpt_max, kpt_end)
300 do iq = kpt%start, kpt_end
302 if(spin_polarized)
then
303 ikpoint = 1 + (iq - 1)/2
311 kpoint(1:dim) = kpoints%get_point(ikpoint)
313 if (os%nneighbors > 0)
then
314 do inn = 1, os%nneighbors
315 dx(1:dim) = os%V_ij(inn,1:dim)
316 kr = sum(kpoint(1:dim)*dx(1:dim))
317 if (
present(vec_pot))
then
318 if (
allocated(vec_pot)) kr = kr + sum(vec_pot(1:dim)*dx(1:dim))
322 if (
present(vec_pot_var))
then
323 if (
allocated(vec_pot_var)) kr = kr + sum(vec_pot_var(1:dim, 1)*dx(1:dim))
327 os%phase_shift(inn, iq) =
exp(-
m_zi*kr)
344 type(
ions_t),
intent(in) :: ions
350 os%spec_index = os%spec%get_index()
351 do ja = 1, ions%natoms
352 if(ions%atom(ja)%species == os%spec)
then
353 os%spec_index = min(os%spec_index, ions%atom(ja)%species%get_index())
362#include "orbitalset_inc.F90"
365#include "complex.F90"
366#include "orbitalset_inc.F90"
double exp(double __x) __attribute__((__nothrow__
subroutine, public accel_release_buffer(this)
pure logical function, public accel_is_enabled()
This module implements batches of mesh functions.
This module implements common operations on batches of mesh functions.
This module contains interfaces for BLAS routines You should not use these routines directly....
real(real64), parameter, public m_zero
complex(real64), parameter, public m_z0
complex(real64), parameter, public m_zi
real(real64), parameter, public m_one
integer pure function, public kpoints_number(this)
This module is intended to contain "only mathematical" functions and procedures.
This module defines various routines, operating on mesh functions.
This module defines the meshes, which are used in Octopus.
subroutine, public zorbitalset_get_position_matrix_elem(os, ndim, psib, idir, dot)
subroutine, public orbitalset_update_phase_shift(os, dim, kpt, kpoints, spin_polarized, vec_pot, vec_pot_var, kpt_max)
Build the phase shift for the intersite interaction.
subroutine, public dorbitalset_get_coeff_batch(os, ndim, psib, dot)
subroutine orbitalset_set_species_index(os, ions)
Set the species index for a given orbital set.
subroutine, public orbitalset_init(this)
subroutine, public orbitalset_end(this)
subroutine, public dorbitalset_add_to_batch(os, ndim, psib, weight)
subroutine, public dorbitalset_get_position_matrix_elem(os, ndim, psib, idir, dot)
subroutine, public zorbitalset_add_to_batch(os, ndim, psib, weight)
subroutine, public orbitalset_update_phase(os, dim, kpt, kpoints, spin_polarized, vec_pot, vec_pot_var, kpt_max)
Build the phase correction to the global phase in case the orbital crosses the border of the simulato...
subroutine, public dorbitalset_get_coefficients(os, ndim, psi, ik, has_phase, dot, reduce)
subroutine, public dorbitalset_get_coeff_batch_accel(os, ndim, psib, dot)
subroutine, public orbitalset_set_jln(this, jj, ll, nn)
subroutine, public zorbitalset_get_coeff_batch_accel(os, ndim, psib, dot)
subroutine, public zorbitalset_get_coeff_batch(os, ndim, psib, dot)
subroutine, public zorbitalset_get_coefficients(os, ndim, psi, ik, has_phase, dot, reduce)
subroutine, public submesh_end(this)
Distribution of N instances over mpi_grpsize processes, for the local rank mpi_grprank....