25 use iso_c_binding,
only: c_loc
26 use,
intrinsic :: iso_fortran_env
46 real(real64),
public :: threshold
47 integer,
public :: maxiter
54 integer,
intent(in) :: itr
55 real(real64),
intent(in) :: thr
71 subroutine poisson_cg1(namespace, der, corrector, pot, rho)
72 type(namespace_t),
intent(in) :: namespace
73 type(derivatives_t),
target,
intent(in) :: der
74 type(poisson_corr_t),
intent(in) :: corrector
75 real(real64),
intent(inout) :: pot(:)
76 real(real64),
intent(in) :: rho(:)
80 real(real64),
allocatable :: wk(:), lwk(:), zk(:), pk(:)
84 safe_allocate( wk(1:der%mesh%np_part))
85 safe_allocate(lwk(1:der%mesh%np_part))
86 safe_allocate( zk(1:der%mesh%np_part))
87 safe_allocate( pk(1:der%mesh%np_part))
90 wk(1:der%mesh%np) = pot(1:der%mesh%np)
95 zk(1:der%mesh%np) = (
m_four*
m_pi*rho(1:der%mesh%np) + lwk(1:der%mesh%np))
97 safe_deallocate_a(lwk)
102 pk(der%mesh%np + 1:) =
m_zero
105 if (res >= threshold)
then
106 message(1) =
'Conjugate-gradients Poisson solver did not converge.'
107 write(
message(2),
'(a,i8)')
' Iter = ',iter
108 write(
message(3),
'(a,e14.6)')
' Res = ', res
112 pot(1:der%mesh%np) = pot(1:der%mesh%np) + pk(1:der%mesh%np)
114 safe_deallocate_a(zk)
115 safe_deallocate_a(pk)
122 type(namespace_t),
intent(in) :: namespace
123 type(derivatives_t),
target,
intent(in) :: der
124 real(real64),
contiguous,
intent(inout) :: pot(:)
125 real(real64),
intent(in) :: rho(:)
128 real(real64),
allocatable :: potc(:), rhs(:)
137 safe_allocate(rhs(1:der%mesh%np))
138 safe_allocate(potc(1:der%mesh%np_part))
141 do ip = 1, der%mesh%np
142 rhs(ip) = 4.0_real64*
m_pi*rho(ip)
148 if (res >= threshold)
then
149 message(1) =
'Conjugate-gradients Poisson solver did not converge.'
150 write(
message(2),
'(a,i8)')
' Iter = ', iter
151 write(
message(3),
'(a,e14.6)')
' Res = ', res
159 safe_deallocate_a(rhs)
160 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
Computes and , suitable as an operator callback for iterative solvers (CG, QMR, etc....
subroutine, public dlaplacian_op(x, hx, userdata)
Computes the negative Laplacian operator action: .
This module defines various routines, operating on mesh functions.
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
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.