有了这个东西可以把更多的精力放在建立方程,而不是求解方程
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
o Boost tuple 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()) ) );
o Boost.uBLAS adapter
namespace ublas = boost::numeric::ublas; ublas::compressed_matrix<double> A; ... Solver solve(A); ublas::vector<double> rhs, x; ... solve(rhs, x);
o Zero copy adapter
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 Conjugate Gradient
o BiConjugate Gradient Stabilized (BiCGSTAB)
o BiCGSTAB(L)
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; }
初始状态如下:
求解结果如下
这里测试用的c 版的,如果对python熟悉,也可以用python版,叫做pyamgcl
参考资料
Demidov, D. (2019). AMGCL : An E ffi cient , Flexible , and Extensible Algebraic. 40(5), 535–546. https://doi.org/10.1134/S1995080219050056
https://github.com/ddemidov/amgcl.git
https://pypi.org/project/pyamgcl/
点击原文看它的github官网链接
声明:转载于数学地质。