中国振动联盟

 

 

中国振动联盟进站必读 服务使用协议 行为准则| 免责声明| 禁止行为 等级与权限 | 积分获取 | 意见建议

新的开始、新的征程—本站诚聘各版版主 加入管理队伍,更好地建设振动家园 版主管理及考核| 版主推荐| 版主申请

搜索
中国振动联盟 首页 软件应用 查看内容

再论ANSYS中的总体矩阵提取(In Python)

收藏 分享 2011-4-11 16:26| 发布者: 雪缘| 查看数: 2072| 评论数: 29|来自: 振动论坛

摘要: ============为什么折腾这个文档======== 我有一个计算线性动力学方程组的瞬态、谐响应和静力学的python程序,现希望开发一个将ANSYS组集好的总体矩阵导入该PYTHON程序中的接口。 该问题可分解为: - - -- 因此 ...
============为什么折腾这个文档========
我有一个计算线性动力学方程组的瞬态、谐响应和静力学的python程序,现希望开发一个将ANSYS组集好的总体矩阵导入该PYTHON程序中的接口。
该问题可分解为:
[STEP1]  [ANSYS]->[包含矩阵信息的文件]
[STEP2]  [包含矩阵信息的文件]->[python通用数据对象]  
[STEP3]  [python通用数据对象]->[程序特定数据对象]->[进行计算]
因此检索了一些帖子,基本上完成了这项工作,本文是对[STEP1]和[STEP2]的整理,并且利用[STEP3]对结果进行了验证

============主要内容==================
1,了解从ANSYS中提取总体矩阵和载荷向量的方法;
2,了解提取出来的矩阵是怎样表示的;
3,说明在Python中,如何读取这样的矩阵;
4,构造一个简单的算例,说明整个【建模】-【提取】-【读取】过程及其正确性;

======================================
=========站内检索综述====================
======================================

检索词:提取 矩阵
得到21个结果,代表性的帖子有下面这9个:

编号[1]
标题:ansys中怎样提取质量,刚度,阻尼矩阵?
地址:http://www.chinavib.com/forum-vi ... fromuid-159019.html
要点:pengweicai给出了一段网上最常见的提取代码,该程序以fortran写成,可以利用.full文件以及一些列约定将ANSYS中的总体矩阵读入FORTRAN中。

编号[2]
标题:如何得知HBMAT命令提取的质量、刚度矩阵对应的自由度?
地址:http://www.chinavib.com/forum-vi ... fromuid-159019.html
要点:提出了使用HBMAT命令提取稀疏矩阵时常见的问题:我们如何知道提取出来的信息是怎么储存的呢?

编号[3]
标题:[分享]ANSYS中整体、单元刚度和质量矩阵的提取
地址:http://www.chinavib.com/forum-vi ... fromuid-159019.html
要点:在该帖子的7楼,其实已经给出了帖子[2]中问题的解答,即HBMAT中提取出来的矩阵是Harwell-Boeing格式的,并且给出了该格式的细节,可惜是英文的,没引起多少关注。

编号[4]
标题:帮我看看提取的刚度与质量矩阵
地址:http://www.chinavib.com/forum-vi ... fromuid-159019.html
要点:这个帖子所示的矩阵并非是使用HBMAT命令提出出来的,而应该是SELIST命令列举出来的未压缩的矩阵,后续楼层的回帖给了大家一个提示,即有可能提取出来的矩阵是引入了边界条件的(即删除了被约束的行和列的)。

编号[5]
标题:提取刚度矩阵的问题
地址:http://www.chinavib.com/forum-vi ... fromuid-159019.html
要点:本帖作者的工作是基于单元刚度矩阵的,因此ANSYS中提取的单元刚度矩阵是否处于总体坐标系就成为问题。该问题并非本文内容,但仍值得关注。

编号[6]
标题:提取刚度矩阵丢失节点的问题
地址:http://www.chinavib.com/forum-vi ... fromuid-159019.html
要点:帖子[5]作者的又一帖,在这里帖子[5]的问题得到了欧阳中华老师的回答。

编号[7]
标题:提取刚度矩阵的ANSYS操作过程
地址:http://www.chinavib.com/forum-vi ... fromuid-159019.html
要点:实际上这就是使用HBMAT从ANSYS中提取总体矩阵的全过程!只是还有一些细节待确定。

编号[8]
标题:提取整体刚度矩阵、质量矩阵及阻尼矩阵的简单方法
地址:http://www.chinavib.com/forum-vi ... fromuid-159019.html
要点:给出了利用“不减缩的”子结构方法来得到总体矩阵的方法(这也是网络上常见的代码之一)

编号[9]
标题:质量矩阵、刚度矩阵如何提取?
地址:http://www.chinavib.com/forum-vi ... fromuid-159019.html
要点:16443在5楼的回帖中给出了提取刚度矩阵的三种方法

========================================
=======站外检索略述========================
========================================


百度检索:提取 矩阵
比较好的帖子有:

编号[10]
来源:百度文库
标题:怎样从ansys中提取单元刚度矩阵与质量矩阵
地址:http://wenku.baidu.com/view/3cf5e567f5335a8102d220d9.html
要点:这应该就是16443在帖子[9]中回复的内容了,全面的总结了在帖子[3,4,5,9]中涉及的问题。

编号[11]
来源:中华钢结构
标题:ansys刚度矩阵Harwell-Boeing格式的具体含义讨论
地址:http://okok.org/forum/viewthread.php?tid=184007
要点:如题,后续楼层给出了一些将矩阵读入ANSYS的APDL(好不容易读出来,又读进去干嘛呢……)

编号[12]
来源:simwe
标题:关于ANSYS(质量、刚度、阻尼)矩阵Harwell-boeing格式数据的说明
地址:http://forum.simwe.com/archiver/tid-924778.html
要点:比[11]更透彻的HB格式说明!

=============================================================
=======1.从ANSYS中提取总体矩阵的方法=================================
=============================================================
1,用/DEBUG命令
2,子结构法
3,HBMAT
详见帖子[10]
PS.个人感觉HBMAT方法最靠谱,一是它的格式(Harwell-boeing)在很多场合都是通用的,二是BHMAT命令是文档化的、功能就是用来提取总体刚度矩阵的命令。因此,相比于子结构法的剑走偏锋,/DEBUG命令的繁复,HBMAT命令方法更“标准”一些,因此在后文只关注此方法。

=============================================================
=======2.BH格式的矩阵是如何表示的===================================
=============================================================
HBMAT命令并不是很复杂的命令,稍复杂的地方是采用该命令提取出来的矩阵是经过压缩的,称为Harwell-boeing格式,也叫Compressed Sparse Column格式。
其具体压缩和还原方式见帖子[3](English)或[11][12](中文)

=============================================================
=======3.如何在Python中读入BH格式的矩阵===============================
=============================================================
上文说过,Harwell-boeing格式,也叫Compressed Sparse Column格式,而Python.scipy中就有这样的稀疏矩阵:

  1. class scipy.sparse.csc_matrix(arg1, shape=None, dtype=None, copy=False, dims=None, nzmax=None)
复制代码



可以通过HB文件中直接读取的行标指针,行标和数据创建,例如:
  1. >>> indptr = array([0,2,3,6])
  2. >>> indices = array([0,2,2,0,1,2])
  3. >>> data = array([1,2,3,4,5,6])
  4. >>> csc_matrix( (data,indices,indptr), shape=(3,3) ).todense()
  5. matrix([[1, 0, 4],
  6.         [0, 0, 5],
  7.         [2, 3, 6]])
复制代码


        
对应的HB文件应为(*号部分表示并非本例关注的数据):
  1. Rainyboy Testing Matrix in BH format         
  2.            ***            4           6           6            0
  3. RRA                       **          **         **            0
  4. (I14)           (I14)           (d25.15)            (d25.15)            
  5. 0
  6. 2
  7. 3
  8. 6
  9. 0
  10. 2
  11. 2
  12. 0
  13. 1
  14. 2
  15. 1
  16. 2
  17. 3
  18. 4
  19. 5
  20. 6
复制代码



由文件头可知,indptr的长度为4,因此0,2,3,6就是indotr的内容
indices的长度为6,因此后续的0,2,2,0,1,2就是indices的内容
data的长度为6,因此后续的1,2,3,4,5,6就是data的内容
=============================================================
=======4.一个【建模】-【提取】-【读取】-【计算】的例子===============
=================================================================多说无益,上例子吧!
【建模APDL】
  1. FINISH
  2. /CLEAR
  3. /TITLE,CASE STUDY _BEAM _BEAM3 BY RAINYBOY
  4. /PREP7
  5. /ESHAPE,1                 !显示壳单元厚度
  6. !**********************
  7. !几何参数表
  8. !**********************
  9. *SET,L_HORI,0.1                                                !横梁的长度
  10. *SET,TA,0.005                                                  !正方形截面的边长
  11. *SET,MESHCOUNT,2                                        !每段的分网数
  12. *SET,IZZ,TA*TA*TA*TA/12                !转动惯量
  13. *SET,IYY,TA*TA*TA*TA/12                !转动惯量
  14. !**********************
  15. !材料参数表
  16. !**********************
  17. *SET,MEX,1.78E11                                        !弹性模量
  18. *SET,MPRXY,0.3                                                !泊松比
  19. *SET,MDENS,7850                                                !密度
  20. !**********************
  21. !相关设置
  22. !**********************
  23. MP,EX,1,MEX                                                    !设置材料弹性模量
  24. MP,PRXY,1,MPRXY                                                !设置材料泊松比
  25. MP,DENS,1,MDENS                                                !设置材料密度
  26. BETAD,1E-5                                                                !BETA阻尼
  27. ET,1,BEAM3                                                    !设置平面梁单元
  28. R,1,TA*TA,IZZ,TA                                        !设置截面参数
  29. !DMPRAT,0.10000                                                !阻尼比
  30. !**********************
  31. !几何->分网
  32. !**********************
  33. TYPE,1                                                         !指定分网类型
  34. MAT,1                                                                !指定材料类型
  35. REAL,1                                                         !指定实参数
  36. K,1,0,0,0                                                      !建立三个关键点
  37. K,2,L_HORI,0,0                                                                                
  38. L,1,2                                                                !建立几何体
  39. ALLSEL,ALL
  40. LESIZE,ALL,,,MESHCOUNT          !设置线段分网数
  41. LMESH,ALL                                                      !分网
  42. !**********************
  43. !几何约束
  44. !**********************
  45. ALLSEL,ALL
  46. NSEL,S,LOC,X,0                                                !选择固定端节点
  47. D,ALL,ALL                                                      !设置为约束所有自由度
  48. ALLSEL,ALL
  49. NSEL,S,LOC,X,L_HORI
  50. F,ALL,FY,10               !力载荷
  51. ALLSEL,ALL
  52. save
复制代码







【提取APDL】

  1. !进行一次QRDAMP分析,以生成包含K、M、C和RHS的FULL文件
  2. /SOLU
  3. ANTYPE,MODAL
  4. MODOPT,QRDAMP,2,2
  5. SOLVE
  6. !将对应的矩阵提取到文件中
  7. /AUX2
  8. FILE,re,FULL
  9. HBMAT,K_RHS,txt,ASCII,,STIFF,YES
  10. HBMAT,M,txt,ASCII,,MASS,YES
  11. HBMAT,C,txt,ASCII,,DAMP,YES
  12. FINISH
复制代码



【ANSYS谐响应分析】(计算完毕后,手动把受力点的频响结果存在ree.txt中)
  1. /SOLU
  2. ANTYPE,HARM
  3. HARFRQ,0,502
  4. NSUBST,251
  5. KBC,1   
  6. HROPT,FULL  
  7. HROUT,OFF   
  8. LUMPM,0
  9. EQSLV, ,1e-008,
  10. SOLVE
复制代码





【读取&计算】(运行APP_HP_From_ANSYS.py之前在当前目录准备刚才ANSYS计算目录下的K_RHS.txt,M.txt,K.txt,ree.txt)

  1. # -*- coding: cp936 -*-
  2. #2011.4 重构动力学计算程序
  3. #使之可计算线性问题的瞬态和谐响应
  4. #使之可从文件读入矩阵
  5. #范雨 rainyboy@188.com

  6. #本文件包含:一个应用
  7. #从ANSYS中导出一个模型的M,K,C和F信息,进行谐响应分析。
  8. #与ANSYS的谐响应结果进行对比。

  9. import numpy as math;
  10. from MechanicMode import *;
  11. from HP_FullMethod import *;
  12. from ReadMatricFromFile import*;

  13. if __name__ == '__main__':
  14.     K_RHS_filename = "K_RHS.txt";
  15.     M_filename = "M.txt";
  16.     C_filename = "C.txt";
  17.     df = 2;
  18.     freqzone = (0,500);
  19.     (K,RHS) = ReadDensMatrixFromFile(K_RHS_filename,True,True);
  20.     M = ReadDensMatrixFromFile(M_filename,True,False);
  21.     C = ReadDensMatrixFromFile(C_filename,True,False);
  22.     #K*1e-5
  23.     InitCondition = math.matrix(math.zeros((RHS.shape[1],3),dtype=float));
  24.     def forceFunc(f):
  25.         return RHS;
  26.     Mode = LinearMechanicMode(M,K,C,InitCondition,forceFunc);
  27.     Method = FullMethod();
  28.     Method.setMode(Mode);
  29.     Method.solve(df,freqzone);
  30.     #读入ANSYS的求解结果y
  31.     f = open("ree.txt");
  32.     fcmp = [];
  33.     dcomp = [];
  34.     while(True):
  35.         line = f.readline();
  36.         if not line:
  37.             break;
  38.         infolist = line.split();
  39.         fcmp.append(float(infolist[0]));
  40.         dcomp.append(float(infolist[1]));
  41.     #绘对比图
  42.     Method.ComapareFreqHist(fcmp,dcomp,4);
复制代码




【结果对比图】


【控制台输出】
正在读取:K_RHS.txt
文件说明:Stiffness matrix from ANSYS FULL file dumped into Harwell-Boeing format         
行指针个数:7
行标个数:12
非零数据个数:12
右端数据个数:6


正在读取:M.txt
文件说明:     Mass matrix from ANSYS FULL file dumped into Harwell-Boeing format         
行指针个数:7
行标个数:12
非零数据个数:12
右端数据个数:6


正在读取:C.txt
文件说明:  Damping matrix from ANSYS FULL file dumped into Harwell-Boeing format         
行指针个数:7
行标个数:12
非零数据个数:12
右端数据个数:6

=============================================================
======5.值得注意的事情============================================
=============================================================
1,为什么在提取矩阵之前要进行QRDAMP的模态分析?
ANSYS帮助说,BHMAT命令中来获取DAMP参数,仅当进行考虑阻尼的模态分析时才有效:
DAMP  —  Write damping matrix to output matrix file. Only valid for damped modal analyses.
因此,我选择了QRDAMP,我只是借助该方法生成FULL文件,并不关注其求解结果

2,注意,在本例中(以及大多数场合),ANSYS导出的矩阵是对称的,即只导出了下三角(或上三角),在ReadFromFile.py中的ReadDensMatrixFromFile函数作了相应的处理,使得到的矩阵是一个对称的满阵。而ReadSparseMatrixFromFile函数则没有。

3,注意,导出的矩阵已经引入了约束条件,即固定的自由度已经被删去了,这就是为什么上述测试用例中,明明是3个BEAM3单元(每个单元3个自由度),得到的矩阵只有6*6。

====================================================
欢迎你来算法区讨论python:
http://www.chinavib.com/forum-forumdisplay-fid-25-filter-typeid-typeid-41.html





附件包含全部代码、可执行模块和测试用例:









本文内容由 Rainyboy 提供





发表评论

最新评论

sangxiaoru 2012-2-29 09:26
谢啦谢啦,换了个11.0终于可以了。。。
sangxiaoru 2012-2-27 09:29
您好,我想问一下,那个得到的矩阵对应的节点自由度怎么得到呢,用文中的方法并没有生成mapping文件啊,这是什么原因呢?
谢啦~~
realyyy 2011-12-14 18:07
整理贴啊。花了不少心血,赞一个!
tsw20031117 2011-11-16 10:48
mark一个,以后认真学习
coyota_dhj 2011-8-31 23:42
以前没接触过,学习下~
tangyong910 2011-8-29 08:50
好贴!很有用
future05 2011-7-12 10:10
我想下,权限,权限。。。。。
Rainyboy 2011-6-21 12:13
回复 22 # sun_young 的帖子

没有,但是这些信息是可以得到的。
sun_young 2011-6-19 20:06
你好,你程序中是否重新将矩阵按节点号各个自由度进行了排序?
Rainyboy 2011-6-10 08:33
回复 20 # ljq2008 的帖子

那就要看你在ANSYS中所用的质点单元是不是考虑了转动惯量的了,如果没考虑转动惯量当然不会对扭转模态产生影响
ljq2008 2011-6-9 20:25
Rainyboy 发表于 2011-6-9 16:44
回复 18 # ljq2008 的帖子

是啊,这不挺正常的么?你觉得不应该这样处理么?

如果只考虑主对角线的质量的值,对于我的这个问题【请教】两个构件模态分析频率结果
就在ANSYS讨论区里发的一个帖子
从我提出来的质量矩阵来看,由于ANSYS只是把主对角线的值进行的质量的叠加,导致第一个构件的扭转频率没有变化,而实际应该有显著水平的下降!不知道这么说你是否理解,可能我的表述有问题!
Rainyboy 2011-6-9 16:44
回复 18 # ljq2008 的帖子

是啊,这不挺正常的么?你觉得不应该这样处理么?
ljq2008 2011-6-9 14:37
Rainyboy 发表于 2011-6-9 08:42
回复 16 # ljq2008 的帖子

我所进行的计算倒还是与ANSYS挺吻合的。

恩 是这样的,我重新的计算了下,发现ansys的处理都是对质量矩阵的主对角线元素直接加上去了
Rainyboy 2011-6-9 08:42
回复 16 # ljq2008 的帖子

我所进行的计算倒还是与ANSYS挺吻合的。
端部带质量这种边界条件不需要对矩阵进行行列的删除,只是会影响质量矩阵元素的值而已。
ljq2008 2011-6-8 22:48
关于ANSYS提取的质量矩阵和刚度矩阵问题
从我的一个例子中,我发现ANSYS中得到的刚度矩阵和质量矩阵已经将位移约束的相关自由度进行了归零处理,但是对于其他的边界条件,比如悬臂梁的末端带一个附加质量,对于这种约束ANSYS得到的刚度矩阵和质量矩阵好像没有进行相应的处理,用ANSYS提出的刚度矩阵和质量矩阵进行特征值运算得到的频率和ANSYS本身得到的频率有较大差异,请问你有没有碰到过这方面的问题?ANSYS具体是如何考虑此种边界条件呢?
16443 2011-5-24 11:07
回复 14 # Rainyboy 的帖子

对,好像没什么理论性的东西,大部分都是基于实验。
现在好像有可靠性方面的国家课题
Rainyboy 2011-5-23 09:53
回复 13 # 16443 的帖子

嗯,疲劳寿命计算有一些自己的程序,经典的高低周(和各种修正)的计算方法,也有引入概率化之后的高低周寿命计算方法。不过疲劳寿命这一领域似乎没什么靠谱的理论……主要还是要大量的试验才行吧……
16443 2011-5-23 09:23
回复 12 # Rainyboy 的帖子

我毕业还没希望那,没文章到手。
我主要作一些结合面相关,想和商用有限元耦合,目前还没找到办法。
你们可靠性分析也有自己的程序?
Rainyboy 2011-5-19 18:57
回复 11 # 16443 的帖子

也是马上就要毕业了……同纠结啊
可以说说你的主要方向是什么呢?
我所在的教研室主要研究的是旋转部件的强度、振动和可靠性问题,一般的同学用ANSYS用得多,但是牛一些的师兄都还是有各自的看家程序……拿ANSYS验证验证就行了……
16443 2011-5-19 16:20
本帖最后由 16443 于 2011-5-19 16:20 编辑

回复 10 # Rainyboy 的帖子

是,正纠结着呢……

你是北航在读还是毕业 ?

查看全部评论(29)

验证问答 换一个

Archiver|中国振动联盟 ( 黑ICP备07002574号 )

GMT+8, 2012-5-18 12:28 , Processed in 0.133917 second(s), 12 queries , Eaccelerator On.

请勿发布违反中华人民共和国法律法规的言论,会员观点不代表本站官方立场。

Powered by Discuz! X1.5 © 2001-2010 Comsenz Inc.