首页/文章/ 详情

代数多重网格C 算法库AMGCL

3年前浏览2310

有了这个东西可以把更多的精力放在建立方程,而不是求解方程

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官网链接

声明:转载于数学地质。

科普理论求解技术代码&命令其他软件
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2021-05-07
最近编辑:3年前
多物理场仿真技术
www.cae-sim.com
获赞 126粉丝 318文章 220课程 0
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈