25 use,
intrinsic :: iso_fortran_env
43 real(real64),
public :: threshold
44 integer,
public :: maxiter
51 integer,
intent(in) :: itr
52 real(real64),
intent(in) :: thr
68 subroutine poisson_cg1(namespace, der, corrector, pot, rho)
69 type(namespace_t),
intent(in) :: namespace
70 type(derivatives_t),
target,
intent(in) :: der
71 type(poisson_corr_t),
intent(in) :: corrector
72 real(real64),
intent(inout) :: pot(:)
73 real(real64),
intent(in) :: rho(:)
77 real(real64),
allocatable :: wk(:), lwk(:), zk(:), pk(:)
81 safe_allocate( wk(1:der%mesh%np_part))
82 safe_allocate(lwk(1:der%mesh%np_part))
83 safe_allocate( zk(1:der%mesh%np_part))
84 safe_allocate( pk(1:der%mesh%np_part))
87 wk(1:der%mesh%np) = pot(1:der%mesh%np)
91 zk(1:der%mesh%np) = -
m_four*
m_pi*rho(1:der%mesh%np) - lwk(1:der%mesh%np)
93 safe_deallocate_a(lwk)
98 pk(der%mesh%np + 1:) =
m_zero
101 if (res >= threshold)
then
102 message(1) =
'Conjugate-gradients Poisson solver did not converge.'
103 write(
message(2),
'(a,i8)')
' Iter = ',iter
104 write(
message(3),
'(a,e14.6)')
' Res = ', res
108 pot(1:der%mesh%np) = pot(1:der%mesh%np) + pk(1:der%mesh%np)
110 safe_deallocate_a(zk)
111 safe_deallocate_a(pk)
118 type(namespace_t),
intent(in) :: namespace
119 type(derivatives_t),
target,
intent(in) :: der
120 real(real64),
contiguous,
intent(inout) :: pot(:)
121 real(real64),
intent(in) :: rho(:)
124 real(real64),
allocatable :: potc(:), rhs(:)
133 safe_allocate(rhs(1:der%mesh%np))
134 safe_allocate(potc(1:der%mesh%np_part))
136 do ip = 1, der%mesh%np
137 rhs(ip) = -4.0_real64*
m_pi*rho(ip)
143 if (res >= threshold)
then
144 message(1) =
'Conjugate-gradients Poisson solver did not converge.'
145 write(
message(2),
'(a,i8)')
' Iter = ', iter
146 write(
message(3),
'(a,e14.6)')
' Res = ', res
154 safe_deallocate_a(rhs)
155 safe_deallocate_a(potc)
Copies a vector x, to a vector y.
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
subroutine, public dderivatives_lapl(der, ff, op_ff, ghost_update, set_bc, factor)
apply the Laplacian to a mesh function
real(real64), parameter, public m_zero
real(real64), parameter, public m_four
real(real64), parameter, public m_pi
some mathematical constants
This module defines the meshes, which are used in Octopus.
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 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 internal_laplacian_op(xx, yy)
real(real64) function, public internal_dotp(xx, yy)
subroutine, public poisson_boundary_conditions(this, mesh, rho, pot)
type(mesh_t), pointer, public mesh_pointer
type(derivatives_t), pointer, public der_pointer
This module is intended to contain "only mathematical" functions and procedures.