72 type(submesh_t) :: sphere
73 complex(real64),
allocatable :: phase(:,:)
76 real(real64) :: Ubar, Jbar
80 real(real64),
allocatable :: V_ij(:,:)
81 real(real64),
allocatable :: coulomb_IIJJ(:,:,:,:,:)
82 complex(real64),
allocatable :: zcoulomb_IIJJ(:,:,:,:,:,:,:)
83 integer,
allocatable:: map_os(:)
84 complex(real64),
allocatable :: phase_shift(:,:)
86 real(real64) :: radius
87 class(species_t),
pointer :: spec => null()
90 real(real64),
allocatable :: dorb(:,:,:)
91 complex(real64),
allocatable :: zorb(:,:,:)
92 complex(real64),
allocatable :: eorb_submesh(:,:,:,:)
94 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
101 logical :: allocated_on_mesh
105 type(poisson_t) :: poisson
113 type(orbitalset_t),
intent(inout) :: this
139 type(orbitalset_t),
intent(inout) :: this
145 safe_deallocate_a(this%phase)
146 safe_deallocate_a(this%dorb)
147 safe_deallocate_a(this%zorb)
148 safe_deallocate_a(this%eorb_submesh)
149 safe_deallocate_a(this%eorb_mesh)
153 safe_deallocate_a(this%V_ij)
154 safe_deallocate_a(this%coulomb_IIJJ)
155 safe_deallocate_a(this%map_os)
156 safe_deallocate_a(this%phase_shift)
161 if(
allocated(this%buff_eorb))
then
162 do ik = lbound(this%buff_eorb, dim=1), ubound(this%buff_eorb, dim=1)
165 safe_deallocate_a(this%buff_eorb)
174 real(real64),
intent(in) :: jj
175 integer,
intent(in) :: ll, nn
190 integer,
intent(in) :: dim
193 logical,
intent(in) :: spin_polarized
194 real(real64),
optional,
allocatable,
intent(in) :: vec_pot(:)
195 real(real64),
optional,
allocatable,
intent(in) :: vec_pot_var(:, :)
196 integer,
optional,
intent(in) :: kpt_max
198 integer :: ns, iq, is, ikpoint, im, idim, kpt_end
199 real(real64) :: kr, kpoint(1:dim), dx(1:dim)
207 if (
present(kpt_max)) kpt_end = min(kpt_max, kpt_end)
209 do iq = kpt%start, kpt_end
211 if (spin_polarized)
then
212 ikpoint = 1 + (iq - 1)/2
220 kpoint(1:dim) = kpoints%get_point(ikpoint)
226 dx = os%sphere%rel_x(1:dim, is) - os%sphere%mesh%x(os%sphere%map(is), 1:dim) + os%sphere%center(1:dim)
227 kr = dot_product(kpoint, dx)
228 if (
present(vec_pot))
then
229 if (
allocated(vec_pot)) kr = kr + dot_product(vec_pot, dx)
232 if (
present(vec_pot_var))
then
233 if (
allocated(vec_pot_var)) kr = kr + sum(vec_pot_var(1:dim, os%sphere%map(is)) &
234 *(os%sphere%rel_x(1:dim, is)+os%sphere%center))
237 os%phase(is, iq) =
exp(
m_zi*kr)
240 if (.not. os%use_submesh)
then
244 os%eorb_mesh(:, im, idim, iq) =
m_z0
246 os%eorb_mesh(os%sphere%map(is),im,idim,iq) = os%eorb_mesh(os%sphere%map(is),im,idim,iq) &
247 + os%zorb(is, idim, im) * os%phase(is, iq)
257 os%eorb_submesh(is,idim,im,iq) = os%zorb(is,idim,im)*os%phase(is, iq)
266 if(os%use_submesh)
then
267 do iorb = 1, os%norbs
268 call accel_write_buffer(os%buff_eorb(iq), ns, os%eorb_submesh(:, 1, iorb, iq), offset = (iorb - 1)*os%ldorbs)
271 do iorb = 1, os%norbs
273 os%eorb_mesh(:, iorb, 1, iq), offset = (iorb - 1)*os%ldorbs)
286 integer,
intent(in) :: dim
289 logical,
intent(in) :: spin_polarized
290 real(real64),
optional,
allocatable,
intent(in) :: vec_pot(:)
291 real(real64),
optional,
allocatable,
intent(in) :: vec_pot_var(:, :)
292 integer,
optional,
intent(in) :: kpt_max
294 integer :: iq, ikpoint
295 real(real64) :: kr, kpoint(dim), dx(dim)
296 integer :: inn, kpt_end
301 if(
present(kpt_max)) kpt_end = min(kpt_max, kpt_end)
303 do iq = kpt%start, kpt_end
305 if(spin_polarized)
then
306 ikpoint = 1 + (iq - 1)/2
314 kpoint(1:dim) = kpoints%get_point(ikpoint)
316 if (os%nneighbors > 0)
then
317 do inn = 1, os%nneighbors
318 dx(1:dim) = os%V_ij(inn,1:dim)
319 kr = sum(kpoint(1:dim)*dx(1:dim))
320 if (
present(vec_pot))
then
321 if (
allocated(vec_pot)) kr = kr + sum(vec_pot(1:dim)*dx(1:dim))
325 if (
present(vec_pot_var))
then
326 if (
allocated(vec_pot_var)) kr = kr + sum(vec_pot_var(1:dim, 1)*dx(1:dim))
330 os%phase_shift(inn, iq) =
exp(-
m_zi*kr)
347 type(
ions_t),
intent(in) :: ions
353 os%spec_index = os%spec%get_index()
354 do ja = 1, ions%natoms
355 if(ions%atom(ja)%species == os%spec)
then
356 os%spec_index = min(os%spec_index, ions%atom(ja)%species%get_index())
365#include "orbitalset_inc.F90"
368#include "complex.F90"
369#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_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_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....