找回密码
 注册
Simdroid-非首页
查看: 908|回复: 25

【总结】Harwell-Boeing格式矩阵转换为稀疏矩阵的方法

[复制链接]
发表于 2009-12-22 01:35:25 | 显示全部楼层 |阅读模式 来自 浙江杭州
本帖最后由 messenger 于 2010-1-9 03:10 编辑


     ANSYS在8.2版及以后,增加了按照Harwell-Boeing格式输出整体矩阵(刚度、质量及阻尼矩阵)的功能。 HBMAT命令法比较简单(具体方法可参见ANSYS工程结构数值分析(王新敏,2007)一书),因而大家比较喜欢用这种方法。但是如果想将整体矩阵导入其他软件(如Matlab)进行其他运算,就有一个将Harwell-Boeing格式矩阵转换的问题。

1、Harwell-Boeing的文件格式

    用HBMAT命令可输出结构刚度矩阵、质量矩阵和阻尼矩阵,其文件记录格式为大型稀疏矩阵的标准交换格式,采用索引存储方法记录矩阵的非零元素。文件基本格式是前面有4或5行描述数据,其后为单列矩阵元素值,说明如下:
    第1行:格式(A72),为文件头的字符型解释,如刚度矩阵或质量矩阵等标题。
    第2行:格式(5I14),分别表示该文件的总行数(不包括文件头)、矩阵列指针的总行数、矩阵行索引的总行数、矩阵元素数值的总行数、右边项总行数。
    第3行:格式(A3,11X,4I14),分别为矩阵类型、矩阵行数、矩阵列数、矩阵行索引数(对组装后的矩阵,该值等于矩阵行索引数)、单元元素数(对组装后的矩阵此值为0)。
    第4行:格式(2A16,2A20),分别表示列指针格式、行索引格式、系数矩阵数值格式、右边项数值格式。
    第5行:格式(A3,11X,2I14),A3各列分别表示右边项格式、应用高斯起始矢量、应用eXact求解矢量;两个整数分别表示右边项列数、行索引数。三个字符中的第1个字符可取:F——全部存贮(如节点荷载向量的全部元素)、M——与系数矩阵相同方法。
    第6行后:矩阵元素值(单列)。
    矩阵类型用3个字符表示,第1个字符可取:R——实数矩阵、C——复数矩阵、P——仅矩阵结构(无元素数值);第2个字符可取:S——对称矩阵、 U——不对称矩阵、H——Hermitian矩阵、Z——病态对称矩阵;R——带状矩阵;第3个字符可取:A——组装的矩阵、E——单元矩阵(未组装)。对称矩阵只存储下三角元素,如结构刚度矩阵为对称矩阵,Harwell-Boeing格式则仅记录下三角元素。

    根据Harwell-Boeing文件格式,可读取矩阵的任意行列元素的数值,也可编程还原为满矩阵存储,以便它用,很显然这种提取方式比较方便。如当生成.FULL文件后,可采用命令/AUX2$FILE,mywork,full$HBMAT,mystiff,txt,ASCII,STIFF,YES$ FINISH将二进制mywork.full文件输出为ASCII码文件mystiff.txt,并输出右边项。

                                                                                                    —— 引自 ANSYS工程结构数值分析(王新敏,2007),P357

例如:
Stiffness matrix from ANSYS FULL file dumped into Harwell-Boeing format         
                              21             7             7             7             0
RUA                        6             6             7             0
(I14)           (I14)           (d25.15)            (d25.15)            
             1
             3
             4
             5
             6
             7
             8
             1
             4
             2
             3
             4
             5
             6
    0.106666666666667D+08
   -0.533333333333333D+07
    0.100000000000000D+00
    0.000000000000000D+00
    0.533333333333333D+07
    0.200000000000000D+00
    0.300000000000000D+00     

其相应的含义为:
第1行为解释性文件头。
第2行的数字分别表示:该文件共有21行数据,7行列指针数据,7行矩阵行索引数据,7个矩阵元素,右边项为0行数据。
第3行:RUA表示实数矩阵、非对称、组集矩阵;该矩阵为6行6列,有7个非零元素。
第4行:指针和索引数据的输出格式均为I14,矩阵Y和右边项元素输出格式为d25.15。
第5行:因为没有右边项数据,所以没有相应的第5行。
其后为7行列指针数据、7行矩阵行索引数据,7个矩阵元素。


2、Harwell-Boeing的矩阵格式


Harwell-Boeing的矩阵的储存方法是将矩阵中的零元素去掉,然后组成一个个以列为单位的数组。
比如,上例中的矩阵的满矩阵为,
  1.0667e+007             0             0            0            0            0
            0                   0.1            0            0            0            0
            0                     0          0.2            0            0            0
-5.3333e+006              0            0  5.3333e+006    0            0
            0                     0            0            0          0.3            0
            0                     0            0            0            0          0.4

去掉零元素后的格式为,

  1.0667e+007           0.1         0.2       5.3333e+006      0.3         0.4
-5.3333e+006      

要描述上面格式的数据,主要用3个量

    * COLPTR —— 每一个列向量第一个元素的位置;
    * ROWIND —— 每一个元素的行号;
    * VALUES —— 元素值。
                     
则,

排序位置:        1                2                3                4                5                6                7

COLPTR:        1                3                4                5                6                7                8

ROWIND:        1                4                2                3                4                5                6

VALUES:  1.0667e+007        -5.3333e+006                0.1                0.2                5.3333e+006        0.3                0.4


3、Harwell-Boeing的格式的矩阵转换为Matlab的稀疏矩阵


知道了Harwell-Boeing的矩阵的储存格式以后,就可以将按照Matlab稀疏矩阵的格式转换为稀疏矩阵。
可以采用下面网址的m文件进行上述转换,http://people.sc.fsu.edu/~burkardt/m_src/hb_to_mm/hb_to_mm.m
但这个m文件只是输出一个文本文件。
为了可以在Matlab中直接应用,对其进行了稍微修改,修改后的命令有3种形式:

kkk=hb2mm('kkk_HB.txt','kkk_mm.txt');
kkk=hb2mm('kkk_HB.txt');
hb2mm('kkk_HB.txt','kkk_mm.txt');

其中,kkk即为Matlab格式的稀疏矩阵。kkk_mm.txt为输出的含有稀疏矩阵的文本文件。kkk_HB.txt为Harwell-Boeing格式的文本文件。

再次修改:当有右边项时,原程序不能输出右边项。修改以后,当有右边项时,输出矩阵的最后一列即为右边项。


游客,本帖隐藏的内容需要积分高于 7 才可浏览,您当前积分为 0

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

发表于 2009-12-23 19:19:11 | 显示全部楼层 来自 江苏苏州
Simdroid开发平台
辛苦了,总结的很好
回复 不支持

使用道具 举报

发表于 2009-12-25 17:21:36 | 显示全部楼层 来自 重庆大学
好东西啊! 得好好研究研究!谢谢分享!!
回复 不支持

使用道具 举报

发表于 2010-1-7 15:58:57 | 显示全部楼层 来自 江苏苏州
本帖最后由 pp786195 于 2010-1-7 16:34 编辑

再请教楼主:我用ANSYS提取的Harwell-Boeing刚度矩阵,其中输出右边项(载荷)了,但好像用MATLAB读的时候没有右边项数据?
右边项列数为1
自己试的结果:
在Harwell-Boeing文本中,MATLAB读取到数值a(刚度矩阵的最后一个数值),则a以下的数值貌似就是我要的右边项,个数也刚好是第五行F 1  **  的数字。不知对否
回复 不支持

使用道具 举报

 楼主| 发表于 2010-1-7 21:15:44 | 显示全部楼层 来自 浙江杭州
记得当时试了试,Matlab程序可以读取到右边项。可能是你哪里用错了吧,你再检查一下吧。
回复 不支持

使用道具 举报

发表于 2010-1-8 10:23:29 | 显示全部楼层 来自 江苏苏州
fopen('8.txt')   ;         
K3=hb2mm('8.txt');%TXT文件在附件中
fopen('2.txt')   ;           
K4=hb2mm('2.txt');
用以上命令得到的K3和K4是一样的。如果有右边项应该会多一列的吧,是不是还得另外读取?我的右边项刚好就一列数值

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

 楼主| 发表于 2010-1-8 13:06:11 | 显示全部楼层 来自 浙江杭州
原来原程序得到了右边项,但没有输出,现在更新了一下,当有右边项时,输出矩阵最后一列为右边项。重新下载hb2mm程序即可。
回复 不支持

使用道具 举报

发表于 2010-1-8 20:17:52 | 显示全部楼层 来自 江苏苏州
版主就是厉害,我也找到那个外国的M文件了 ,可是没发现哪段是控制右边项的。谢谢啦
回复 不支持

使用道具 举报

发表于 2010-2-1 19:32:52 | 显示全部楼层 来自 英国
本帖最后由 vibration 于 2010-2-1 19:48 编辑

你的矩阵例子解释里面可能有问题,ansys中第八个entry(COLPTR(7)=8) 应该是结束标记(其意义在于给出Scaning 的上界),你给到第七个元素(Value=0.4)上了应该是错误的。这里是HB格式的权威性说明http://people.sc.fsu.edu/~burkardt/pdf/hbsmc.pdf

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-3-24 22:55:57 | 显示全部楼层 来自 江苏南京
有中文的,先顶在看!!!
回复 不支持

使用道具 举报

发表于 2010-6-26 21:27:22 | 显示全部楼层 来自 广东广州
学习了...........
回复 不支持

使用道具 举报

发表于 2010-9-7 22:24:13 | 显示全部楼层 来自 湖南长沙
非常好,,,,

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-9-7 22:24:33 | 显示全部楼层 来自 湖南长沙
谢谢分享,这么好的东西啊。非常感谢

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-9-7 22:32:04 | 显示全部楼层 来自 湖南长沙
支持分享,谢谢

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-5-6 15:37:35 | 显示全部楼层 来自 陕西西安
本帖最后由 darwin123 于 2011-5-6 15:59 编辑

右边项是KU=F的这个F
看了一下,将这个HARWELL-BOEING格式转化为N*N的整体刚阵还是有点复杂啊
回复 不支持

使用道具 举报

发表于 2011-5-23 19:39:53 | 显示全部楼层 来自 浙江杭州
很需要呀!谢谢了!
回复 不支持

使用道具 举报

发表于 2011-5-25 21:22:06 | 显示全部楼层 来自 北京大兴
正需要这个,谢谢分享
回复 不支持

使用道具 举报

发表于 2011-7-1 22:57:09 | 显示全部楼层 来自 德国
谢谢楼主,请问有人知道怎么输出特定自由度的质量矩阵的对应行吗?
回复 不支持

使用道具 举报

发表于 2011-9-24 20:16:41 | 显示全部楼层 来自 陕西西安
看了一下,还是不太懂啊
回复 不支持

使用道具 举报

发表于 2013-1-19 17:39:41 | 显示全部楼层 来自 北京
请问楼主COLPTR这一项的值是怎么确定的?
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-5-19 06:25 , Processed in 0.061106 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表