35 use,
intrinsic :: iso_fortran_env
96 integer,
public,
parameter :: &
97 POISSON_DIRECT_SUM = -1, &
109 type(derivatives_t),
pointer,
public :: der
111 integer,
public :: kernel
112 type(cube_t),
public :: cube
113 type(mesh_cube_parallel_map_t),
public :: mesh_cube_map
114 type(poisson_mg_solver_t) :: mg
115 type(poisson_fft_t),
public :: fft_solver
116 real(real64),
public :: poisson_soft_coulomb_param
117 logical :: all_nodes_default
118 type(poisson_corr_t) :: corrector
119 type(poisson_isf_t) :: isf_solver
120 type(poisson_psolver_t) :: psolver_solver
121 type(poisson_no_t) :: no_solver
123 logical,
public :: is_dressed = .false.
124 type(photon_mode_t),
public :: photons
126 type(MPI_Comm) :: intercomm
127 type(mpi_grp_t) :: local_grp
132 integer,
parameter :: &
139 subroutine poisson_init(this, namespace, space, der, mc, stencil, qtot, label, solver, verbose, force_serial, &
140 force_cmplx, fft_batch_size, fft_batch_axis)
141 type(poisson_t),
intent(inout) :: this
142 class(space_t),
intent(in) :: space
143 type(namespace_t),
intent(in) :: namespace
144 type(derivatives_t),
target,
intent(in) :: der
145 type(multicomm_t),
intent(in) :: mc
146 type(stencil_t),
intent(in) :: stencil
147 real(real64),
optional,
intent(in) :: qtot
148 character(len=*),
optional,
intent(in) :: label
149 integer,
optional,
intent(in) :: solver
150 logical,
optional,
intent(in) :: verbose
151 logical,
optional,
intent(in) :: force_serial
152 logical,
optional,
intent(in) :: force_cmplx
153 integer,
optional,
intent(in) :: fft_batch_size
154 integer,
optional,
intent(in) :: fft_batch_axis
157 logical :: need_cube, isf_data_is_parallel
158 integer :: default_solver, default_kernel, box(space%dim), fft_type, fft_library, fft_bs, fft_ba
159 real(real64) :: fft_alpha
160 character(len=60) :: str
169 if (
present(label)) str = trim(label)
193 if (this%is_dressed)
then
194 assert(
present(qtot))
199 if(.not.
allocated(this%photons%pol_dipole))
then
202 if (this%photons%nmodes > 1)
then
207 this%all_nodes_default = .false.
220 call parse_variable(namespace,
'ParallelizationPoissonAllNodes', .
true., this%all_nodes_default)
263 if (space%dim == 3 .and. .not. space%is_periodic()) default_solver =
poisson_isf
269 if (space%dim > 3) default_solver =
poisson_no
271 if (der%mesh%use_curvilinear)
then
272 select case (space%dim)
274 default_solver = poisson_direct_sum
276 default_solver = poisson_direct_sum
282 if (this%is_dressed) default_solver = poisson_direct_sum
284 if (.not.
present(solver))
then
285 call parse_variable(namespace,
'PoissonSolver', default_solver, this%method)
291 select case (this%method)
292 case (poisson_direct_sum)
295 str =
"fast Fourier transform"
297 str =
"conjugate gradients"
299 str =
"conjugate gradients, corrected"
303 str =
"interpolating scaling functions"
305 str =
"interpolating scaling functions (from BigDFT)"
307 str =
"no Poisson solver - Hartree set to 0"
309 write(
message(1),
'(a,a,a)')
"The chosen Poisson solver is '", trim(str),
"'"
313 if (space%dim > 3 .and. this%method /=
poisson_no)
then
314 call messages_input_error(namespace,
'PoissonSolver',
'Currently no Poisson solver is available for Dimensions > 3')
321 message(1) =
'FFT batching can only be used with POISSON_FFT or POISSON_PSOLVER'
359 select case (space%dim)
361 if (.not. space%is_periodic())
then
367 if (space%periodic_dim == 2)
then
369 else if (space%is_periodic())
then
370 default_kernel = space%periodic_dim
375 default_kernel = space%periodic_dim
378 call parse_variable(namespace,
'PoissonFFTKernel', default_kernel, this%kernel)
388 message(1) =
'PoissonFFTKernel=multipole_correction is not supported on GPUs'
389 message(2) =
'Using FFTW to compute the FFTs on the CPU'
396 if (.not.
present(solver))
then
397 if (space%is_periodic() .and. this%method == poisson_direct_sum)
then
398 message(1) =
'A periodic system may not use the direct_sum Poisson solver.'
403 message(1) =
'A periodic system may not use the cg_corrected Poisson solver.'
408 select case (space%dim)
411 select case (space%periodic_dim)
413 if ((this%method /=
poisson_fft) .and. (this%method /= poisson_direct_sum))
then
414 message(1) =
'A finite 1D system may only use fft or direct_sum Poisson solvers.'
419 message(1) =
'A periodic 1D system may only use the fft Poisson solver.'
424 if (der%mesh%use_curvilinear .and. this%method /= poisson_direct_sum)
then
425 message(1) =
'If curvilinear coordinates are used in 1D, then the only working'
426 message(2) =
'Poisson solver is direct_sum.'
432 if ((this%method /=
poisson_fft) .and. (this%method /= poisson_direct_sum))
then
433 message(1) =
'A 2D system may only use fft or direct_sum solvers.'
437 if (der%mesh%use_curvilinear .and. (this%method /= poisson_direct_sum))
then
438 message(1) =
'If curvilinear coordinates are used in 2D, then the only working'
439 message(2) =
'Poisson solver is direct_sum.'
445 if (space%is_periodic() .and. this%method ==
poisson_isf)
then
446 call messages_write(
'The ISF solver can only be used for finite systems.')
450 if (space%is_periodic() .and. this%method ==
poisson_fft .and. &
451 this%kernel /= space%periodic_dim .and. this%kernel >= 0 .and. this%kernel <= 3)
then
452 write(
message(1),
'(a,i1,a)')
'The system is periodic in ', space%periodic_dim ,
' dimension(s),'
453 write(
message(2),
'(a,i1,a)')
'but Poisson solver is set for ', this%kernel,
' dimensions.'
458 write(
message(1),
'(a,i1,a)')
'PoissonFFTKernel = multipole_correction cannot be used for periodic systems.'
463 message(1) =
'If curvilinear coordinates are used, then the only working'
464 message(2) =
'Poisson solvers are cg_corrected and multigrid.'
471 select type (box => der%mesh%box)
474 message(1) =
'When using the "minimum" box shape and the "cg_corrected"'
475 message(2) =
'Poisson solver, we have observed "sometimes" some non-'
476 message(3) =
'negligible error. You may want to check that the "fft" or "cg"'
477 message(4) =
'solver are providing, in your case, the same results.'
486#if !(defined HAVE_PSOLVER)
487 message(1) =
"The PSolver Poisson solver cannot be used since the code was not compiled with the PSolver library."
503 box(:) = der%mesh%idx%ll(:)
513 call parse_variable(namespace,
'PoissonSolverPSolverParallelData', .
true., isf_data_is_parallel)
541 write(
message(1),
'(a,f12.5,a)')
"Input: '", fft_alpha, &
542 "' is not a valid DoubleFFTParameter"
543 message(2) =
'1.0 <= DoubleFFTParameter <= 3.0'
547 if (space%dim /= 3 .and. fft_library ==
fftlib_pfft)
then
551 select case (space%dim)
554 select case (this%kernel)
558 box = der%mesh%idx%ll
562 select case (this%kernel)
565 box(1:2) = maxval(box)
569 box(:) = der%mesh%idx%ll(:)
573 select case (this%kernel)
579 box(2) = maxval(box(2:3))
580 box(3) = maxval(box(2:3))
582 box(:) = der%mesh%idx%ll(:)
593 call cube_init(this%cube, box, namespace, space, der%mesh%spacing, &
594 der%mesh%coord_system, fft_type = fft_type, &
595 need_partition=.not.der%mesh%parallel_in_domains, &
596 batch_size=fft_bs, batch_axis=fft_ba)
598 if (this%cube%parallel_in_domains .and. this%method ==
poisson_fft)
then
603 if (this%is_dressed .and. .not. this%method == poisson_direct_sum)
then
604 write(
message(1),
'(a)')
'Dressed Orbital calculation currently only working with direct sum Poisson solver.'
623 select case (this%method)
651 if (this%cube%parallel_in_domains)
then
657 if (this%is_dressed)
then
660 this%is_dressed = .false.
670 complex(real64),
contiguous,
intent(inout) :: pot(:)
671 complex(real64),
contiguous,
intent(in) :: rho(:)
672 logical,
optional,
intent(in) :: all_nodes
675 real(real64),
allocatable :: aux1(:), aux2(:)
677 logical :: all_nodes_value
687 if (
present(kernel) .and. der%periodic_dim>0)
then
688 assert(.not. any(abs(kernel%qq(:))>1e-8_real64))
693 safe_allocate(aux1(1:der%mesh%np))
694 safe_allocate(aux2(1:der%mesh%np))
696 aux1(1:der%mesh%np) = real(rho(1:der%mesh%np), real64)
697 aux2(1:der%mesh%np) = real(pot(1:der%mesh%np), real64)
698 call dpoisson_solve(this, namespace, aux2, aux1, all_nodes=all_nodes_value, kernel=kernel)
699 pot(1:der%mesh%np) = aux2(1:der%mesh%np)
702 aux1(1:der%mesh%np) = aimag(rho(1:der%mesh%np))
703 aux2(1:der%mesh%np) = aimag(pot(1:der%mesh%np))
704 call dpoisson_solve(this, namespace, aux2, aux1, all_nodes=all_nodes_value, kernel=kernel)
706 do ip = 1, der%mesh%np
707 pot(ip) = pot(ip) +
m_zi*aux2(ip)
711 safe_deallocate_a(aux1)
712 safe_deallocate_a(aux2)
728 complex(real64),
contiguous,
intent(out) :: pot(:, :)
729 complex(real64),
contiguous,
intent(in) :: rho(:, :)
730 integer,
intent(in) :: view
733 real(real64),
allocatable :: rwork(:, :), pwork(:, :)
738 if (
present(kernel) .and. this%der%periodic_dim>0)
then
739 assert(.not. any(abs(kernel%qq(:))>1e-8_real64))
742 safe_allocate(rwork(1:
size(rho, 1), 1:
size(rho, 2)))
743 safe_allocate(pwork(1:
size(pot, 1), 1:
size(pot, 2)))
746 rwork = real(rho, real64)
753 pot = pot +
m_zi*pwork
755 safe_deallocate_a(rwork)
756 safe_deallocate_a(pwork)
770 integer,
optional,
intent(in) :: count
771 integer,
optional,
intent(in) :: view
775 integer(int64) :: gsizes(3), bsizes(3)
776 integer :: np, count_, np_tot
781 if (
present(kernel))
then
782 assert(.not. any(abs(kernel%qq(:)) > 1e-8_real64))
786 np = this%der%mesh%np
808 call dpoisson_solve_batch(this, pot_buffer=re_out, rho_buffer=re_in, kernel=kernel, count=count_, view=view)
809 call dpoisson_solve_batch(this, pot_buffer=im_out, rho_buffer=im_in, kernel=kernel, count=count_, view=view)
835 subroutine zpoisson_solve(this, namespace, pot, rho, all_nodes, kernel, reset)
838 complex(real64),
contiguous,
intent(inout) :: pot(:)
839 complex(real64),
contiguous,
intent(in) :: rho(:)
840 logical,
optional,
intent(in) :: all_nodes
842 logical,
optional,
intent(in) :: reset
844 logical :: all_nodes_value
850 assert(ubound(pot, dim = 1) == this%der%mesh%np_part .or. ubound(pot, dim = 1) == this%der%mesh%np)
851 assert(ubound(rho, dim = 1) == this%der%mesh%np_part .or. ubound(rho, dim = 1) == this%der%mesh%np)
856 pot(1:this%der%mesh%np) =
m_zero
860 .and. .not. this%is_dressed)
then
866 call zpoisson_fft_solve(this%fft_solver, this%der%mesh, this%cube, pot, rho, this%mesh_cube_map, kernel=kernel)
884 type(
batch_t),
intent(inout) :: potb
885 type(
batch_t),
intent(inout) :: rhob
886 logical,
optional,
intent(in) :: all_nodes
893 assert(potb%nst_linear == rhob%nst_linear)
894 assert(potb%type() == rhob%type())
897 do ii = 1, potb%nst_linear
898 call dpoisson_solve(this, namespace, potb%dff_linear(:, ii), rhob%dff_linear(:, ii), all_nodes, kernel=kernel)
901 do ii = 1, potb%nst_linear
902 call zpoisson_solve(this, namespace, potb%zff_linear(:, ii), rhob%zff_linear(:, ii), all_nodes, kernel=kernel)
930 subroutine dpoisson_solve(this, namespace, pot, rho, all_nodes, kernel, reset)
933 real(real64),
contiguous,
intent(inout) :: pot(:)
934 real(real64),
contiguous,
intent(in) :: rho(:)
938 logical,
optional,
intent(in) :: all_nodes
940 logical,
optional,
intent(in) :: reset
943 real(real64),
allocatable :: rho_corrected(:), vh_correction(:)
944 logical :: all_nodes_value
951 assert(ubound(pot, dim = 1) == der%mesh%np_part .or. ubound(pot, dim = 1) == der%mesh%np)
952 assert(ubound(rho, dim = 1) == der%mesh%np_part .or. ubound(rho, dim = 1) == der%mesh%np)
958 pot(1:der%mesh%np) =
m_zero
963 if (
present(kernel))
then
967 select case (this%method)
968 case (poisson_direct_sum)
969 if ((this%is_dressed .and. this%der%dim - 1 > 3) .or. this%der%dim > 3)
then
970 message(1) =
"Direct sum Poisson solver only available for 1, 2, or 3 dimensions."
976 call poisson_cg1(namespace, der, this%corrector, pot, rho)
979 safe_allocate(rho_corrected(1:der%mesh%np))
980 safe_allocate(vh_correction(1:der%mesh%np_part))
982 call correct_rho(this%corrector, der, rho, rho_corrected, vh_correction)
985 call poisson_cg2(namespace, der, pot, rho_corrected)
988 safe_deallocate_a(rho_corrected)
989 safe_deallocate_a(vh_correction)
996 call dpoisson_fft_solve(this%fft_solver, der%mesh, this%cube, pot, rho, this%mesh_cube_map, kernel=kernel)
998 safe_allocate(rho_corrected(1:der%mesh%np))
999 safe_allocate(vh_correction(1:der%mesh%np_part))
1001 call correct_rho(this%corrector, der, rho, rho_corrected, vh_correction)
1002 call dpoisson_fft_solve(this%fft_solver, der%mesh, this%cube, pot, rho_corrected, this%mesh_cube_map, &
1003 average_to_zero = .
true., kernel=kernel)
1006 safe_deallocate_a(rho_corrected)
1007 safe_deallocate_a(vh_correction)
1011 call poisson_isf_solve(this%isf_solver, der%mesh, this%cube, pot, rho, all_nodes_value)
1015 if (this%psolver_solver%datacode ==
"G")
then
1027 if (this%is_dressed .and. this%method /=
poisson_no)
then
1036 subroutine poisson_init_sm(this, namespace, space, main, der, sm, grp, method, force_cmplx)
1039 class(
space_t),
intent(in) :: space
1044 integer,
optional,
intent(in) :: method
1045 logical,
optional,
intent(in) :: force_cmplx
1047 integer :: default_solver, idir, iter, maxl
1048 integer :: box(space%dim)
1055 this%is_dressed = .false.
1057 this%all_nodes_default = .false.
1063 this%all_nodes_default = main%all_nodes_default
1066 default_solver = poisson_direct_sum
1067 this%method = default_solver
1068 if (
present(method)) this%method = method
1070 if (der%mesh%use_curvilinear)
then
1076 select case (this%method)
1077 case (poisson_direct_sum)
1082 assert(.not. der%mesh%parallel_in_domains)
1085 call cube_init(this%cube, box, namespace, space, sm%mesh%spacing, sm%mesh%coord_system, &
1086 fft_type =
fft_none, need_partition=.not.der%mesh%parallel_in_domains)
1088 call poisson_isf_init(this%isf_solver, namespace, der%mesh, this%cube, grp%comm, init_world = this%all_nodes_default)
1092 assert(.not. der%mesh%parallel_in_domains)
1093 if (this%all_nodes_default)
then
1094 this%cube%mpi_grp = grp
1096 this%cube%mpi_grp = this%der%mesh%mpi_grp
1100 call cube_init(this%cube, box, namespace, space, sm%mesh%spacing, sm%mesh%coord_system, &
1101 fft_type =
fft_none, need_partition=.not.der%mesh%parallel_in_domains)
1116 do idir = 1, space%dim
1117 box(idir) = (2 * (box(idir) - 1)) + 1
1120 call cube_init(this%cube, box, namespace, space, sm%mesh%spacing, sm%mesh%coord_system, &
1121 fft_type =
fft_complex, need_partition=.not.der%mesh%parallel_in_domains)
1123 call cube_init(this%cube, box, namespace, space, sm%mesh%spacing, sm%mesh%coord_system, &
1124 fft_type =
fft_real, need_partition=.not.der%mesh%parallel_in_domains)
1126 call poisson_fft_init(this%fft_solver, namespace, space, this%cube, this%kernel)
1128 call parse_variable(namespace,
'PoissonSolverMaxMultipole', 4, maxl)
1129 write(
message(1),
'(a,i2)')
'Info: Boundary conditions fixed up to L =', maxl
1131 call parse_variable(namespace,
'PoissonSolverMaxIter', 500, iter)
1151 type(multicomm_t),
intent(in) :: mc
1156 if (multicomm_have_slaves(mc))
then
1158 call mpi_grp_init(this%local_grp, mc%group_comm(p_strategy_states))
1160 this%root = (this%local_grp%is_root())
1162 this%intercomm = mc%slave_intercomm
1163 call mpi_comm_remote_size(this%intercomm, this%nslaves)
1176 type(multicomm_t),
intent(in) :: mc
1185 if (multicomm_have_slaves(mc))
then
1188 do islave = this%local_grp%rank, this%nslaves - 1, this%local_grp%size
1189 call mpi_send(m_one, 1, mpi_double_precision, islave,
cmd_finish, this%intercomm)
1203 type(namespace_t),
intent(in) :: namespace
1206 real(real64),
allocatable :: rho(:), pot(:)
1208 type(mpi_status) :: status
1209 integer :: bcast_root
1212 call profiling_in(
"SLAVE_WORK")
1214 safe_allocate(rho(1:this%der%mesh%np))
1215 safe_allocate(pot(1:this%der%mesh%np))
1218 do while(.not. done)
1220 call profiling_in(
"SLAVE_WAIT")
1221 call mpi_recv(rho(1), this%der%mesh%np, mpi_double_precision, mpi_any_source, mpi_any_tag, this%intercomm, status)
1222 call profiling_out(
"SLAVE_WAIT")
1225 select case (status%MPI_TAG)
1233 call profiling_in(
"SLAVE_BROADCAST")
1234 bcast_root = mpi_proc_null
1235 if (this%root) bcast_root = mpi_root
1236 call mpi_bcast(pot(1), this%der%mesh%np, mpi_double_precision, bcast_root, this%intercomm)
1237 call profiling_out(
"SLAVE_BROADCAST")
1243 safe_deallocate_a(pot)
1244 safe_deallocate_a(rho)
1246 call profiling_out(
"SLAVE_WORK")
1256 async = (this%nslaves > 0)
1264 type(namespace_t),
intent(in) :: namespace
1265 class(space_t),
intent(in) :: space
1266 type(fourier_space_op_t),
intent(inout) :: coulb
1267 real(real64),
intent(in) :: qq(:)
1268 type(xc_cam_t),
intent(in) :: cam
1269 real(real64),
optional,
intent(in) :: singul
1275 if (space%is_periodic())
then
1276 assert(ubound(qq, 1) >= space%periodic_dim)
1280 if (cam%omega > m_epsilon)
then
1282 write(message(1),
'(a)')
"Poisson solver with range separation is only implemented with FFT."
1283 call messages_fatal(1, namespace=namespace)
1289 if (
allocated(coulb%qq))
then
1290 reinit = any(abs(coulb%qq(1:space%periodic_dim) - qq(1:space%periodic_dim)) > m_epsilon)
1292 reinit = reinit .or. (abs(coulb%mu - cam%omega) > m_epsilon .and. cam%omega > m_epsilon)
1293 reinit = reinit .or. (abs(coulb%alpha - cam%alpha) > m_epsilon .and. cam%alpha > m_epsilon)
1294 reinit = reinit .or. (abs(coulb%beta - cam%beta) > m_epsilon .and. cam%beta > m_epsilon)
1299 select case (this%method)
1303 call fourier_space_op_end(coulb)
1304 call coulb%init(space, qq, cam, singul)
1305 call poisson_fft_get_kernel(namespace, space, this%cube, coulb, this%kernel, &
1306 this%poisson_soft_coulomb_param)
1308 call messages_not_implemented(
"poisson_build_kernel with other methods than FFT", namespace=namespace)
1326 type(xc_cam_t),
intent(in) :: cam
1328 select case (this%method)
1332 if(cam%omega < m_epsilon)
then
1334 else if(cam%alpha > m_epsilon .and. cam%beta < m_epsilon)
then
1336 else if(cam%alpha < m_epsilon .and. cam%beta > m_epsilon)
then
1344#include "poisson_init_inc.F90"
1345#include "poisson_direct_inc.F90"
1346#include "poisson_direct_sm_inc.F90"
1350#include "poisson_inc.F90"
1352#include "complex.F90"
1353#include "poisson_inc.F90"
constant times a vector plus a vector
Prints out to iunit a message in the form: ["InputVariable" = value] where "InputVariable" is given b...
subroutine, public accel_free_buffer(this, async)
subroutine, public accel_kernel_start_call(this, file_name, kernel_name, flags)
subroutine, public accel_finish()
integer, parameter, public accel_mem_read_write
pure logical function, public accel_is_enabled()
This module implements batches of mesh functions.
This module handles the calculation mode.
integer, parameter, public p_strategy_kpoints
parallelization in k-points
subroutine, public cube_end(cube)
subroutine, public cube_init(cube, nn, namespace, space, spacing, coord_system, fft_type, fft_library, dont_optimize, nn_out, mpi_grp, need_partition, tp_enlarge, blocksize, batch_size, batch_axis)
subroutine, public cube_init_cube_map(cube, mesh)
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
Fast Fourier Transform module. This module provides a single interface that works with different FFT ...
integer, parameter, public fft_none
global constants
integer, public fft_default_lib
integer, parameter, public fftlib_accel
integer, parameter, public fft_real
integer, parameter, public fft_complex
integer, parameter, public fftlib_pfft
integer, parameter, public fftlib_fftw
real(real64), parameter, public m_two
real(real64), parameter, public m_zero
complex(real64), parameter, public m_zi
real(real64), parameter, public m_one
real(real64), parameter, public m_three
This module implements the index, used for the mesh points.
This module is intended to contain "only mathematical" functions and procedures.
subroutine, public mesh_cube_parallel_map_end(this)
subroutine, public mesh_cube_parallel_map_init(this, mesh, cube)
This module defines various routines, operating on mesh functions.
This module defines the meshes, which are used in Octopus.
subroutine, public mesh_double_box(space, mesh, alpha, db)
finds the dimension of a box doubled in the non-periodic dimensions
subroutine, public messages_print_with_emphasis(msg, iunit, namespace)
subroutine, public messages_not_implemented(feature, namespace)
character(len=512), private msg
subroutine, public messages_warning(no_lines, all_nodes, namespace)
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_fatal(no_lines, only_root_writes, namespace)
subroutine, public messages_input_error(namespace, var, details, row, column)
subroutine, public messages_experimental(name, namespace)
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
This module handles the communicators for the various parallelization strategies.
logical pure function, public multicomm_strategy_is_parallel(mc, level)
logical pure function, public multicomm_have_slaves(this)
Some general things and nomenclature:
subroutine, public photon_mode_compute_dipoles(this, mesh)
Computes the polarization dipole.
subroutine, public photon_mode_add_poisson_terms(this, mesh, rho, pot)
subroutine, public photon_mode_end(this)
subroutine, public photon_mode_set_n_electrons(this, qtot)
subroutine, public photon_mode_init(this, namespace, dim, photon_free)
real(real64), public threshold
subroutine, public poisson_cg2(namespace, der, pot, rho)
subroutine, public poisson_cg1(namespace, der, corrector, pot, rho)
subroutine, public poisson_cg_init(thr, itr)
subroutine, public poisson_cg_end
subroutine, public poisson_corrections_end(this)
subroutine, public poisson_corrections_init(this, namespace, space, ml, mesh)
subroutine, public correct_rho(this, der, rho, rho_corrected, vh_correction)
integer, parameter, public poisson_fft_kernel_nocut
integer, parameter, public poisson_fft_kernel_cyl
subroutine, public zpoisson_fft_solve(this, mesh, cube, pot, rho, mesh_cube_map, average_to_zero, kernel, sm)
subroutine, public poisson_fft_end(this)
subroutine, public poisson_fft_init(this, namespace, space, cube, kernel, soft_coulb_param, fullcube)
integer, parameter, public poisson_fft_kernel_pla
integer, parameter, public poisson_fft_kernel_none
integer, parameter, public poisson_fft_kernel_corrected
integer, parameter, public poisson_fft_kernel_sph
subroutine, public dpoisson_fft_solve(this, mesh, cube, pot, rho, mesh_cube_map, average_to_zero, kernel, sm)
subroutine, public poisson_isf_end(this)
subroutine, public poisson_isf_init(this, namespace, mesh, cube, all_nodes_comm, init_world)
subroutine, public poisson_isf_solve(this, mesh, cube, pot, rho, all_nodes, sm)
subroutine, public poisson_multigrid_solver(this, namespace, der, pot, rho)
A multigrid Poisson solver with corrections at the boundaries.
subroutine, public poisson_multigrid_end(this)
subroutine, public poisson_no_solve(this, mesh, pot, rho)
subroutine, public poisson_no_end(this)
subroutine, public zpoisson_solve_sm(this, namespace, sm, pot, rho, all_nodes)
Calculates the Poisson equation. Given the density returns the corresponding potential.
integer, parameter, public poisson_multigrid
subroutine poisson_kernel_init(this, namespace, space, mc, stencil)
integer, parameter, public poisson_psolver
subroutine, public dpoisson_solve_start(this, rho)
integer, parameter cmd_finish
subroutine, public zpoisson_solve_finish(this, pot)
subroutine poisson_solve_direct(this, namespace, pot, rho)
integer, parameter, public poisson_fft
subroutine zpoisson_solve_real_and_imag_separately_accel(this, pot_buffer, rho_buffer, kernel, count, view)
Device variant of zpoisson_solve_real_and_imag_separately.
subroutine, public poisson_init(this, namespace, space, der, mc, stencil, qtot, label, solver, verbose, force_serial, force_cmplx, fft_batch_size, fft_batch_axis)
subroutine, public zpoisson_solve(this, namespace, pot, rho, all_nodes, kernel, reset)
subroutine, public poisson_init_sm(this, namespace, space, main, der, sm, grp, method, force_cmplx)
subroutine, public poisson_solve_batch(this, namespace, potb, rhob, all_nodes, kernel)
subroutine, public poisson_async_init(this, mc)
subroutine, public dpoisson_solve_sm(this, namespace, sm, pot, rho, all_nodes)
Calculates the Poisson equation. Given the density returns the corresponding potential.
subroutine zpoisson_solve_real_and_imag_separately(this, namespace, pot, rho, all_nodes, kernel)
subroutine, public zpoisson_solve_batch(this, pot, rho, kernel, view, pot_buffer, rho_buffer, count)
Solves the Poisson equation for batched quantities, using fast Fourier transforms (FFTs).
logical pure function poisson_solver_is_iterative(this)
subroutine, public poisson_slave_work(this, namespace)
subroutine zpoisson_solve_real_and_imag_separately_batch(this, pot, rho, view, kernel)
Batched analogue of zpoisson_solve_real_and_imag_separately.
subroutine, public dpoisson_solve(this, namespace, pot, rho, all_nodes, kernel, reset)
Calculates the Poisson equation. Given the density returns the corresponding potential.
integer, parameter cmd_poisson_solve
integer, parameter, public poisson_cg
subroutine, public poisson_build_kernel(this, namespace, space, coulb, qq, cam, singul)
subroutine, public dpoisson_solve_finish(this, pot)
logical function, public poisson_is_fft_batch_capable(this)
Whether this solver supports the batched FFT path (X(poisson_solve_batch)).
subroutine, public zpoisson_solve_start(this, rho)
subroutine, public poisson_async_end(this, mc)
integer, parameter, public poisson_cg_corrected
subroutine, public dpoisson_solve_batch(this, pot, rho, kernel, view, pot_buffer, rho_buffer, count)
Solves the Poisson equation for batched quantities, using fast Fourier transforms (FFTs).
integer, parameter, public poisson_isf
real(real64) function, public poisson_get_full_range_weight(this, cam)
Most Poisson solvers do not implement Coulomb attenuated potentials, and can only be used for global ...
integer, parameter, public poisson_null
integer, parameter, public poisson_no
logical pure function, public poisson_is_async(this)
subroutine, public poisson_end(this)
subroutine, public poisson_psolver_global_solve(this, mesh, cube, pot, rho, sm)
subroutine, public poisson_psolver_parallel_solve(this, mesh, cube, pot, rho, mesh_cube_map)
subroutine, public poisson_psolver_end(this)
subroutine, public poisson_psolver_get_dims(this, cube)
subroutine, public poisson_psolver_init(this, namespace, space, cube, mu, qq, force_isolated)
subroutine, public profiling_out(label)
Increment out counter and sum up difference between entry and exit time.
subroutine, public profiling_in(label, exclude)
Increment in counter and save entry time.
This module defines stencils used in Octopus.
subroutine, public submesh_init_cube_map(sm, space)
subroutine, public submesh_get_cube_dim(sm, space, db)
finds the dimension of a box containing the submesh
type(type_t), parameter, public type_float
This module defines the unit system, used for input and output.
Class defining batches of mesh functions.
Class implementing a box that is a union of spheres. We do this in a specific class instead of using ...
class representing derivatives
This is defined even when running serial.
A submesh is a type of mesh, used for the projectors in the pseudopotentials It contains points on a ...