messenger 发表于 2009-12-22 01:35:25

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

本帖最后由 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            05.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格式的文本文件。

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


**** Hidden Message *****

pp786195 发表于 2009-12-23 19:19:11

辛苦了,总结的很好

yangli604 发表于 2009-12-25 17:21:36

好东西啊! 得好好研究研究!谢谢分享!!

pp786195 发表于 2010-1-7 15:58:57

本帖最后由 pp786195 于 2010-1-7 16:34 编辑

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

messenger 发表于 2010-1-7 21:15:44

记得当时试了试,Matlab程序可以读取到右边项。可能是你哪里用错了吧,你再检查一下吧。

pp786195 发表于 2010-1-8 10:23:29

fopen('8.txt')   ;         
K3=hb2mm('8.txt');%TXT文件在附件中
fopen('2.txt')   ;         
K4=hb2mm('2.txt');
用以上命令得到的K3和K4是一样的。如果有右边项应该会多一列的吧,是不是还得另外读取?我的右边项刚好就一列数值

messenger 发表于 2010-1-8 13:06:11

原来原程序得到了右边项,但没有输出,现在更新了一下,当有右边项时,输出矩阵最后一列为右边项。重新下载hb2mm程序即可。

pp786195 发表于 2010-1-8 20:17:52

版主就是厉害,我也找到那个外国的M文件了 ,可是没发现哪段是控制右边项的。谢谢啦

vibration 发表于 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

zz-top123 发表于 2010-3-24 22:55:57

有中文的,先顶在看!!!

lixiahe 发表于 2010-6-26 21:27:22

学习了...........

asdganlan 发表于 2010-9-7 22:24:13

非常好,,,,

asdganlan 发表于 2010-9-7 22:24:33

谢谢分享,这么好的东西啊。非常感谢

dnonly 发表于 2010-9-7 22:32:04

支持分享,谢谢

darwin123 发表于 2011-5-6 15:37:35

本帖最后由 darwin123 于 2011-5-6 15:59 编辑

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

fanqiang 发表于 2011-5-23 19:39:53

很需要呀!谢谢了!

cat-151s 发表于 2011-5-25 21:22:06

正需要这个,谢谢分享

llhzllmars 发表于 2011-7-1 22:57:09

谢谢楼主,请问有人知道怎么输出特定自由度的质量矩阵的对应行吗?

zhuzhuwc 发表于 2011-9-24 20:16:41

看了一下,还是不太懂啊

luoyefeihen 发表于 2013-1-19 17:39:41

请问楼主COLPTR这一项的值是怎么确定的?
页: [1] 2
查看完整版本: 【总结】Harwell-Boeing格式矩阵转换为稀疏矩阵的方法