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(:,:,:,:)
96 complex(real64),
allocatable :: eorb_mesh(:,:,:,:)
98 integer :: ldorbs, ldorbs_eorb
99 type(accel_mem_t) :: dbuff_orb, zbuff_orb
100 type(accel_mem_t),
allocatable :: buff_eorb (:)
102 logical :: use_submesh
103 logical :: allocated_on_mesh
107 type(poisson_t) :: poisson
115 type(orbitalset_t),
intent(inout) :: this
141 type(orbitalset_t),
intent(inout) :: this
147 safe_deallocate_a(this%phase)
148 safe_deallocate_a(this%dorb)
149 safe_deallocate_a(this%zorb)
150 safe_deallocate_a(this%eorb_submesh)
151 safe_deallocate_a(this%eorb_mesh)
155 safe_deallocate_a(this%V_ij)
156 safe_deallocate_a(this%coulomb_IIJJ)
157 safe_deallocate_a(this%map_os)
158 safe_deallocate_a(this%phase_shift)
163 if(
allocated(this%buff_eorb))
then
164 do ik = lbound(this%buff_eorb, dim=1), ubound(this%buff_eorb, dim=1)
167 safe_deallocate_a(this%buff_eorb)
176 real(real64),
intent(in) :: jj
177 integer,
intent(in) :: ll, nn
192 integer,
intent(in) :: dim
195 logical,
intent(in) :: spin_polarized
196 real(real64),
optional,
allocatable,
intent(in) :: vec_pot(:)
197 real(real64),
optional,
allocatable,
intent(in) :: vec_pot_var(:, :)
198 integer,
optional,
intent(in) :: kpt_max
200 integer :: ns, iq, is, ikpoint, im, idim, kpt_end
201 real(real64) :: kr, kpoint(1:dim), dx(1:dim)
209 if (
present(kpt_max)) kpt_end = min(kpt_max, kpt_end)
211 do iq = kpt%start, kpt_end
213 if (spin_polarized)
then
214 ikpoint = 1 + (iq - 1)/2
222 kpoint(1:dim) = kpoints%get_point(ikpoint)
228 dx = os%sphere%rel_x(1:dim, is) - os%sphere%mesh%x(1:dim, os%sphere%map(is)) + os%sphere%center(1:dim)
229 kr = dot_product(kpoint, dx)
230 if (
present(vec_pot))
then
231 if (
allocated(vec_pot)) kr = kr + dot_product(vec_pot, dx)
234 if (
present(vec_pot_var))
then
235 if (
allocated(vec_pot_var)) kr = kr + sum(vec_pot_var(1:dim, os%sphere%map(is)) &
236 *(os%sphere%rel_x(1:dim, is)+os%sphere%center))
239 os%phase(is, iq) =
exp(
m_zi*kr)
242 if (.not. os%use_submesh)
then
246 os%eorb_mesh(:, im, idim, iq) =
m_z0
248 os%eorb_mesh(os%sphere%map(is),im,idim,iq) = os%eorb_mesh(os%sphere%map(is),im,idim,iq) &
249 + os%zorb(is, idim, im) * os%phase(is, iq)
259 os%eorb_submesh(is,idim,im,iq) = os%zorb(is,idim,im)*os%phase(is, iq)
268 if(os%use_submesh)
then
269 do iorb = 1, os%norbs
270 call accel_write_buffer(os%buff_eorb(iq), ns, os%eorb_submesh(:, 1, iorb, iq), offset = (iorb - 1)*os%ldorbs_eorb)
273 do iorb = 1, os%norbs
275 os%eorb_mesh(:, iorb, 1, iq), offset = (iorb - 1)*os%ldorbs_eorb)
288 integer,
intent(in) :: dim
291 logical,
intent(in) :: spin_polarized
292 real(real64),
optional,
allocatable,
intent(in) :: vec_pot(:)
293 real(real64),
optional,
allocatable,
intent(in) :: vec_pot_var(:, :)
294 integer,
optional,
intent(in) :: kpt_max
296 integer :: iq, ikpoint
297 real(real64) :: kr, kpoint(dim), dx(dim)
298 integer :: inn, kpt_end
303 if(
present(kpt_max)) kpt_end = min(kpt_max, kpt_end)
305 do iq = kpt%start, kpt_end
307 if(spin_polarized)
then
308 ikpoint = 1 + (iq - 1)/2
316 kpoint(1:dim) = kpoints%get_point(ikpoint)
318 if (os%nneighbors > 0)
then
319 do inn = 1, os%nneighbors
320 dx(1:dim) = os%V_ij(inn,1:dim)
321 kr = sum(kpoint(1:dim)*dx(1:dim))
322 if (
present(vec_pot))
then
323 if (
allocated(vec_pot)) kr = kr + sum(vec_pot(1:dim)*dx(1:dim))
327 if (
present(vec_pot_var))
then
328 if (
allocated(vec_pot_var)) kr = kr + sum(vec_pot_var(1:dim, 1)*dx(1:dim))
332 os%phase_shift(inn, iq) =
exp(-
m_zi*kr)
349 type(
ions_t),
intent(in) :: ions
355 os%spec_index = os%spec%get_index()
356 do ja = 1, ions%natoms
357 if(ions%atom(ja)%species == os%spec)
then
358 os%spec_index = min(os%spec_index, ions%atom(ja)%species%get_index())
367#include "orbitalset_inc.F90"
370#include "complex.F90"
371#include "orbitalset_inc.F90"
double exp(double __x) __attribute__((__nothrow__
subroutine, public accel_release_buffer(this, async)
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 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_transfer_to_device(os, kpt, use_mesh)
Allocate and transfer the orbitals to the device.
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(os, ndim, psib, dot, reduce)
subroutine, public orbitalset_set_jln(this, jj, ll, nn)
subroutine, public zorbitalset_get_coeff_batch(os, ndim, psib, dot, reduce)
subroutine, public zorbitalset_transfer_to_device(os, kpt, use_mesh)
Allocate and transfer the orbitals to the device.
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....