29 use,
intrinsic :: iso_fortran_env
65 integer,
public :: solver
66 type(preconditioner_t),
public :: pre
68 type(multigrid_t),
allocatable :: mgrid
74 type(namespace_t),
pointer :: namespace
75 type(linear_solver_t),
pointer :: ls
76 type(hamiltonian_elec_t),
pointer :: hm
77 type(mesh_t),
pointer :: mesh
78 type(states_elec_t),
pointer :: st
81 real(real64) :: dshift
82 complex(real64) :: zshift
85 type(linear_solver_args_t) :: args
91 type(linear_solver_t),
intent(out) :: this
92 type(namespace_t),
intent(in) :: namespace
93 type(grid_t),
intent(inout) :: gr
94 logical,
intent(in) :: states_are_real
95 type(multicomm_t),
intent(in) :: mc
96 class(space_t),
intent(in) :: space
146 if (
conf%devel_version)
then
147 defsolver = option__linearsolver__qmr_dotp
149 if (states_are_real)
then
150 defsolver = option__linearsolver__qmr_symmetric
153 defsolver = option__linearsolver__qmr_symmetrized
157 call parse_variable(namespace,
"LinearSolver", defsolver, fsolver)
163 this%solver = mod(fsolver, 100)
180 select case (this%solver)
181 case (option__linearsolver__cg)
182 message(1)=
'Linear Solver: Conjugate Gradients'
184 case (option__linearsolver__bicgstab)
185 message(1)=
'Linear Solver: Biconjugate Gradients Stabilized'
187 case (option__linearsolver__idrs)
188 message(1)=
'Linear Solver: IDRS'
190 case (option__linearsolver__multigrid)
191 message(1)=
'Multigrid (currently only Gauss-Jacobi - EXPERIMENTAL)'
193 case (option__linearsolver__qmr_symmetric)
194 message(1)=
'Linear Solver: Quasi-Minimal Residual, for symmetric matrix'
196 case (option__linearsolver__qmr_symmetrized)
197 message(1)=
'Linear Solver: Quasi-Minimal Residual, for symmetrized matrix'
199 case (option__linearsolver__qmr_dotp)
200 message(1)=
'Linear Solver: Quasi-Minimal Residual, symmetric with conjugated dot product'
202 case (option__linearsolver__qmr_general)
203 message(1)=
'Linear Solver: Quasi-Minimal Residual, general algorithm'
205 case (option__linearsolver__sos)
206 message(1)=
'Linear Solver: Sum-over-States'
213 if (this%solver == option__linearsolver__multigrid)
then
216 safe_allocate(this%mgrid)
217 call multigrid_init(this%mgrid, namespace, space, gr, gr%der, gr%stencil, mc)
220 if (this%solver == option__linearsolver__qmr_dotp)
then
233 if (
allocated(this%mgrid))
then
235 safe_deallocate_a(this%mgrid)
245 select case (this%solver)
246 case (option__linearsolver__bicgstab)
258 character(len=*),
intent(in) :: old_prefix
259 character(len=*),
intent(in) :: new_prefix
272#include "linear_solver_inc.F90"
276#include "complex.F90"
277#include "linear_solver_inc.F90"
This module implements batches of mesh functions.
This module implements common operations on batches of mesh functions.
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
type(conf_t), public conf
Global instance of Octopus configuration.
This module implements the underlying real-space grid.
subroutine, public dlinear_solver_solve_hxey_batch(this, namespace, hm, mesh, st, xb, yb, shift, tol, residue, iter_used, occ_response, use_initial_guess)
subroutine, public zlinear_solver_solve_hxey(this, namespace, hm, mesh, st, ist, ik, x, y, shift, tol, residue, iter_used, occ_response)
This subroutine calculates the solution of (H + shift) x = y Typically shift = - eigenvalue + omega.
subroutine, public dlinear_solver_solve_hxey(this, namespace, hm, mesh, st, ist, ik, x, y, shift, tol, residue, iter_used, occ_response)
This subroutine calculates the solution of (H + shift) x = y Typically shift = - eigenvalue + omega.
integer function, public linear_solver_ops_per_iter(this)
subroutine, public linear_solver_end(this)
subroutine, public linear_solver_init(this, namespace, gr, states_are_real, mc, space)
subroutine, public zlinear_solver_solve_hxey_batch(this, namespace, hm, mesh, st, xb, yb, shift, tol, residue, iter_used, occ_response, use_initial_guess)
subroutine, public linear_solver_obsolete_variables(namespace, old_prefix, new_prefix)
This module defines functions over batches of mesh functions.
This module defines various routines, operating on mesh functions.
subroutine, public mesh_init_mesh_aux(mesh)
Initialise a pointer to the grid/mesh, that is globally exposed, such that low level mesh operations ...
This module defines the meshes, which are used in Octopus.
subroutine, public messages_print_with_emphasis(msg, iunit, namespace)
character(len=512), private msg
subroutine, public messages_obsolete_variable(namespace, name, rep)
subroutine, public messages_info(no_lines, iunit, verbose_limit, stress, all_nodes, namespace)
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_experimental(name, namespace)
This module handles the communicators for the various parallelization strategies.
subroutine, public multigrid_end(mgrid)
subroutine, public multigrid_init(mgrid, namespace, space, mesh, der, stencil, mc, nlevels)
subroutine, public preconditioner_end(this)
subroutine, public preconditioner_obsolete_variables(namespace, old_prefix, new_prefix)
subroutine, public preconditioner_init(this, namespace, gr, mc, space)
This module is intended to contain "only mathematical" functions and procedures.