首页/文章/ 详情

快速多级子算法(FMM)介绍和实现

6月前浏览8576

本文摘要(由AI生成):

本文用简洁的语言介绍了快速多级算法(FMM)的原理和实现,并展示了使用C++开发的FMM模块,用户可以自定义核函数等参数,适用于解决大规模工程问题。FMM通过树形结构减少计算量,提高计算效率。文章还介绍了FMM与边界元方法、矩量法结合解决大规模声场、电磁场问题的应用,并展示了使用Laplace核函数的性能比较,显示了FMM在解决大规模问题时的优势。


国内对FMM(Fast Multipole Method)的介绍都比较复杂,涉及大量的计算公式。


本文试图用最简单的语言介绍FMM的原理和实现,并介绍使用C  开发的快速多级算法模块,用户可自定义核函数,收敛标准,截断系数等参数,可用于实际工程,后续会介绍FMM与边界元方法(Boundary Element Method)/ 矩量法(Method of Moment)结合解决大规模声场,电磁场问题。


在前面简单介绍了快速多级算法 FMM。快速多级子算法能加快解决非对称满秩矩阵,扩展了矩量法,边界元等方法的应用规模,使其能解决较大规模的实际工程问题。


以下是电磁计算软件FEKO中关于多层快速多级算法(MultiLevelFMM)的介绍,是对FMM的一种改进:

https://www.feko.info/product-detail/numerical_methods/mlfmm
 

1. 概述

FMM算法的提出来源于多粒子系统相互作用的势场计算,比如带电粒子或者天体之间引力等。以静电场为例,空间中N个带点离子构成的系统,第i个离子所在位置的静电势 A(xi) 表示为:

图片

其中 

1. i不等于j;

2. xi是第i个粒子所在的坐标;

3. mj是第j个粒子所占的权重,与带电量呈正比;
4. rij是第i个粒子和第j个粒子之间的距离;

按照常规计算方法,对N个粒子实现求和问题,计算量达到O(N^2);

在BEM MOM 等数值计算中,一次这样的求和也就是一次矩阵和向量的乘法迭代。

图片

FMM的实现基本思想是以树形结构为基础,通过多级展开和局部展开,把原对象进行分层分组,将N*N的关系转换为少数组对象之间的关系(如上图),从而减少计算量。该算法实现的核心是如何把每个对象归纳到一组对象中,这个主要是通过动态树结构来实现的。


计算过程如下:

1. 多级展开:

多级展开将叶子节点内(每个小方块内)所有多级展开系数累加,即可以得到该叶子节点的多级展开系数,展开节点为叶子节点的中心。

图片

2.多级-多级转换(Level-2)

将源点和目标点系数进行转换

图片

3.多级-局部转换(Level-2)

利用多级展开向局部展开系数的传递关系式,将该节点的“相互作用表”(紫色直线连接区域部分即为左上角点的相互作用表)中所有节点的多级展开系数传递,并累加到该节点的局部展开系数,局部展开点是该点的中心


4.局部-局部转换(Level-2)

图片

5. 多级-局部转换(Level-3)

6. 最终求和

图片


2. 实现

FMM基础模块,该模块采用C  开发,使用面向对象思想,定义了基础的核函数,并实现了几种简单的核函数,用户可以继承定义自己的核函数,从而应用到流体,电磁,声场等各种需要计算非对称满秩矩阵的数值计算方法中。

基本函数和数据结构:

主要函数:

CreateFMMTree       //递归的方法构建节点,生成四叉树或者八叉树结构;

L2L/Local2Local              //局部到局部转换;

M2L/Moment2Local        //多级到局部转换;

M2M/Moment2Moment     //多级到多级转换;

UpwardPass             //树结构向上遍历;

DownwardPass        //树结构向下遍历;


下图显示了采用Laplace核函数,一次迭代即 矩阵*向量FMM和高斯迭代 所用的时间比较,可以看出FMM所用时间与N几乎呈线性,而且精度很高。考虑到求解线性方程组时需要计算N次,在N达到几万以后,高斯迭代法在PC上基本求不出结果。


图片

声明:原创文章,欢迎留言与我讨论,如需转载留言

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