代数多重网格算法库AMGCL
AMGCL是仅包含头文件的C ++库,用于使用代数多重网格(AMG)方法求解大型稀疏线性系统。 AMG是求解方程组的最有效迭代方法之一,例如,通过在非结构化网格上离散化PDE产生。 该方法可以用作各种计算问题的黑盒求解器,因为它不需要有关基础几何的任何信息。 AMG通常不用作独立求解器,而是用作迭代求解器中的前置条件(例如,共轭梯度,BiCGStab或GMRES)。
AMGCL在CPU上构建AMG层次结构,然后将其传输到提供的后端之一。 这允许在OpenCL,CUDA或OpenMP技术的帮助下透明加速解决方案阶段。 用户可以提供自己的后端,从而可以在AMGCL和用户代码之间进行紧密集成。
AMGCL的组成:
· Matrix adapters矩阵适配器,用于把普通的矩阵转化为求解器可使用的矩阵(CRS格式,compresed row storage),在求解器的构造函数中实现,常用的三种构适配器是Boost tuple adapter、Boost.uBLAS adapter和Zero copy adapter
// boost::tie creates a tuple of references, which avoids copying. Solver solve( boost::tie(n, ptr, col, val) ); // A (cheap) copy is required when iterator ranges are created on the fly: Solver solve( boost::make_tuple( n, boost::make_iterator_range(ptr.data(), ptr.data() + ptr.size()), boost::make_iterator_range(col.data(), col.data() + col.size()), boost::make_iterator_range(val.data(), val.data() + val.size()) ) );
namespace ublas = boost::numeric::ublas; ublas::compressed_matrix<double> A; ... Solver solve(A); ublas::vector<double> rhs, x; ... solve(rhs, x);
Solver solve( amgcl::adapter::zero_copy(n, &ptr[0], &col[0], &val[0]) );
· Backends后端AMGCL中的后端是一类,用于定义矩阵和向量类型以及对其进行的几种操作,例如创建,矩阵向量乘积,逐元素向量运算,内部乘积等。内置的类型包括Builtin, VexCL
o Builtin
o VexCL
· Preconditioners预处理器
· Iterative solvers迭代求解器,AMGCL提供了多个迭代求解器,但是将AMGCL预处理器与用户提供的求解器一起使用也应该很容易。 AMGCL中的每个求解器都是一个类模板。 它的单个模板参数指定要使用的后端。 这允许在类构造时预先分配必要的资源。 显然,求解器后端必须与预处理器后端一致。下面是常用的迭代求解器。
o BiConjugate Gradient Stabilized (BiCGSTAB)
o GMRES
o LGMRES
o FGMRES
下面是一个简单的例子:
主要函数如下
int main() { std::vector<int> ptr, col; std::vector<double> val, rhs; int rows = 1000; int n = poisson(rows, ptr, col, val, rhs); Solver solve(std::tie(n, ptr, col, val)); std::vector<double> x(n, 0.0); size_t iters; double error; std::tie(iters, error) = solve(rhs, x); std::cout << "iters=" << iters << " error=" << error << std::endl; std::cout << "length of solution=" << x.size() << std::endl; /*for (int i = 0; i < x.size(); i++) std::cout << x[i] << endl;*/ ofstream fout("result.txt"); for (int j = 0; j < rows; j++) { for (int i = 0; i < rows; i++) { fout << x[j * rows + i] << " "; } fout << std::endl; } fout.close(); return EXIT_SUCCESS; }
初始状态如下:
求解结果如下
参考资料
Demidov, D. (2019). AMGCL : An E ffi cient , Flexible , and Extensible Algebraic. 40(5), 535–546. https://doi.org/10.1134/S1995080219050056