26 #ifndef TILEDARRAY_ALGEBRA_CONJGRAD_H__INCLUDED 27 #define TILEDARRAY_ALGEBRA_CONJGRAD_H__INCLUDED 32 #include "../dist_array.h" 55 template <
typename D,
typename F>
70 std::size_t n =
size(x);
71 assert(n ==
size(preconditioner));
73 const bool use_diis =
false;
90 const value_type cond_number = precond_max / precond_min;
93 if (convergence_target < 0.0) {
94 convergence_target = 1e-15 * cond_number;
97 if (convergence_target < 1e-15 * cond_number)
98 std::cout <<
"WARNING: ConjugateGradient convergence target (" << convergence_target
99 <<
") may be too low for 64-bit precision" << std::endl;
102 bool converged =
false;
103 const unsigned int max_niter = n;
105 const std::size_t rhs_size =
size(b);
126 unsigned int iter = 0;
127 while (not converged) {
137 axpy(XX_i, alpha_i, PP_i);
140 axpy(RR_i, -alpha_i, APP_i);
146 if (r_ip1_norm < convergence_target) {
157 const value_type beta_i = rz_ip1_norm2 / rz_norm2;
163 axpy(PP_i, 1.0, ZZ_i);
168 if (iter >= max_niter) {
170 throw std::domain_error(
"ConjugateGradient: max # of iterations exceeded");
182 #endif // TILEDARRAY_ALGEBRA_CONJGRAD_H__INCLUDED
DistArray< Tile, Policy >::scalar_type norm2(const DistArray< Tile, Policy > &a)
void scale(DistArray< Tile, Policy > &a, typename DistArray< Tile, Policy >::element_type scaling_factor)
value_type operator()(F &a, const D &b, D &x, const D &preconditioner, value_type convergence_target=-1.0)
DistArray< Tile, Policy >::element_type maxabs_value(const DistArray< Tile, Policy > &a)
size_t size(const DistArray< Tile, Policy > &a)
DistArray< Tile, Policy > clone(const DistArray< Tile, Policy > &arg)
Create a deep copy of an array.
void axpy(DistArray< Tile, Policy > &y, typename DistArray< Tile, Policy >::element_type a, const DistArray< Tile, Policy > &x)
void vec_multiply(DistArray< Tile, Policy > &a1, const DistArray< Tile, Policy > &a2)
DistArray< Tile, Policy > copy(const DistArray< Tile, Policy > &a)
D::element_type value_type
DIIS (‘‘direct inversion of iterative subspace’’) extrapolation.
void extrapolate(D &x, D &error, bool extrapolate_error=false)
DistArray< Tile, Policy >::element_type minabs_value(const DistArray< Tile, Policy > &a)
DistArray< Tile, Policy >::element_type dot_product(const DistArray< Tile, Policy > &a1, const DistArray< Tile, Policy > &a2)
void assign(DistArray< Tile, Policy > &m1, const DistArray< Tile, Policy > &m2)