代数多重网格算法库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

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;
 }

初始状态如下:

 

求解结果如下

 

参考资料

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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oceanstonetree

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值