首页/文章/ 详情

图-七桥问题-稀疏矩阵与区域划分开源库METIS

1月前浏览716
图是一种描述节点相互连接关系的结构,其具有广泛的应用。例如,常见的“七桥问题”:
(图源自知乎)
上面图中蓝色部分表示河流,粉色 区域表示被河流分割的区域,黄色的是桥。待解决的问题是“能否每座桥仅通过一次而经过所有区域”。
当时的知名数学家欧拉,就通过图的方式证明了实际上无法实现。欧拉采用的方式就是将该问题抽象为一个图的问题:
将每个区域作为图的节点,每座桥作为图的“边”,那么实际上该问题就转换称为了一个喜闻乐见的“一笔画”问题,即能否一笔画出对应的图的形状。而此时存在以下推论“如果有节点所连的边为奇数,则无法一笔画”,上图中的每个点连3个边或者5个边,因此无法“一笔画”,所以七桥问题的结论是“无法每座桥均通过一次而经过所有区域”。
以上简要介绍了图的一个简单应用,实际上,图与稀疏矩阵有着密切的联系。图可以通过邻接矩阵来表示,而该邻接矩阵实际上经常就是一个稀疏矩阵,稀疏矩阵的非零元素表达了图的连接,以上面的七桥问题形成的图为例:共有A,B,C,D四个节点,将其对应稀疏矩阵的1-4行,A与BCD相邻,因此第一行的非0元素是2,3,4;同理,第二行的非0元素是1,4...
最终形成的稀疏矩阵非0元素分布如下:
以上是一些简单的图与稀疏矩阵关系的介绍。Metis是一个专门针对稀疏矩阵进行操作的库,其可以把图分成多个区域,或者把有限元的网格分成多个区域。在多进程并行编程MPI中,需要将单元进行区域划分,再将每个区域的单元分配到各个进程,每个进程仅对该进程内的单元进行单元刚度矩阵计算等操作,在刚度矩阵组装时,对每个进程内的单元刚度矩阵进行组装,再在进程间进行通信完成区域共有的节点处的组装,从而得到整体刚度矩阵。
在Metis中,实现功能通常有两种函数,一种是单独编译好的直接可运行的函数,一种是用于在代码里嵌入的API。
(一)以有限元网格分区为例,其进行网格分区采用单独的编译好的直接可运行的函数是mpmetis,具体例子如下:
以该100x100的二维网格为例,将其单元连接写入到文件中,文件内容如下:





































































































1001,   2,  13,  122,   3,  14,  133,   4,  15,  144,   5,  16,  155,   6,  17,  166,   7,  18,  177,   8,  19,  188,   9,  20,  199,  10,  21,  2010,  11,  22,  2112,  13,  24,  2313,  14,  25,  2414,  15,  26,  2515,  16,  27,  2616,  17,  28,  2717,  18,  29,  2818,  19,  30,  2919,  20,  31,  3020,  21,  32,  3121,  22,  33,  3223,  24,  35,  3424,  25,  36,  3525,  26,  37,  3626,  27,  38,  3727,  28,  39,  3828,  29,  40,  3929,  30,  41,  4030,  31,  42,  4131,  32,  43,  4232,  33,  44,  4334,  35,  46,  4535,  36,  47,  4636,  37,  48,  4737,  38,  49,  4838,  39,  50,  4939,  40,  51,  5040,  41,  52,  5141,  42,  53,  5242,  43,  54,  5343,  44,  55,  5445,  46,  57,  5646,  47,  58,  5747,  48,  59,  5848,  49,  60,  5949,  50,  61,  6050,  51,  62,  6151,  52,  63,  6252,  53,  64,  6353,  54,  65,  6454,  55,  66,  6556,  57,  68,  6757,  58,  69,  6858,  59,  70,  6959,  60,  71,  7060,  61,  72,  7161,  62,  73,  7262,  63,  74,  7363,  64,  75,  7464,  65,  76,  7565,  66,  77,  7667,  68,  79,  7868,  69,  80,  7969,  70,  81,  8070,  71,  82,  8171,  72,  83,  8272,  73,  84,  8373,  74,  85,  8474,  75,  86,  8575,  76,  87,  8676,  77,  88,  8778,  79,  90,  8979,  80,  91,  9080,  81,  92,  9181,  82,  93,  9282,  83,  94,  9383,  84,  95,  9484,  85,  96,  9585,  86,  97,  9686,  87,  98,  9787,  88,  99,  9889,  90, 101, 10090,  91, 102, 10191,  92, 103, 10292,  93, 104, 10393,  94, 105, 10494,  95, 106, 10595,  96, 107, 10696,  97, 108, 10797,  98, 109, 10898,  99, 110, 109100, 101, 112, 111101, 102, 113, 112102, 103, 114, 113103, 104, 115, 114104, 105, 116, 115105, 106, 117, 116106, 107, 118, 117107, 108, 119, 118108, 109, 120, 119109, 110, 121, 120
内容很简单,第一行是单元个数,后续的每一行是每个单元的节点连接。将其保存为a.txt,并拷贝到metis的安装目录中编译好的目录下:
可以看到目录下已经有一些函数,在这个目录下运行命令行,并运行mpmetis.exe,输入文件和要划分的份数:
运行之后在该路径下就生成了a.txt.epart.5和a.txt.npart.5两个文件,我们仅需要epart文件,这个文件表明了各个单元被分配到的区域号上,比如下图中就表明单元1-2被分配到区域0,单元3分配到了区域1;单元4分配到了区域2...。在并行有限元MPI中,我们可以把区域号作为进程号,从而确定各个进程中所包含的单元。
如果采用API进行有限元网格区域划分,对应的函数是METIS_PartMeshDual或者METIS_PartMeshNodal

以下是在非线性有限元代码HANFEM中采用METIS_PartMeshNodal对100x100二维四边形单元进行区域划分10个区域的分布:
以上,即是本文的全部内容,感谢您的阅读!欢迎关注公众 号 有限元术



来源:易木木响叮当
非线性通信
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-10-20
最近编辑:1月前
易木木响叮当
硕士 有限元爱好者
获赞 221粉丝 266文章 351课程 2
点赞
收藏
作者推荐
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈