提取ansys单元刚度矩阵
因研究需要,试图从ansys中提取刚度矩阵。参照王新敏老师编写的《ANSYS工程结构数值分析》,在命令流中加入/debug语句即可以将所有单元的刚度矩阵输出到自定义输出文件elemstiff.txt之中。 /solu /output,elemstiff,txt /debug,-1,,,1 solve /output然而elemstiff.txt里面并非只是单元刚度矩阵的数值,还有很多文字信息。如下图所示,只有红色框内是第1个单元的刚度矩阵,以下为其它单元的刚度阵。这种情况与很久以前我尝试进行SAP90结果文件后处理类似,那时是用C实现的,现在改用C#。显然,C#的string使得读取字符串、识别和删除子字符串、字符串与数字转换等操作相比于C/C++变得容易多了。选择C#也使得非专业的程序写手只能苟安于Windows平台的Visual Studio了。 //单元刚度矩阵提取 public void ReadStiffness() { string filename = workpath + "elemstiff.txt"; StreamReader rd = new StreamReader(filename); while (!rd.EndOfStream) { string tmp = rd.ReadLine(); int s = tmp.IndexOf("STIFFNESS MATRIX FOR ELEMENT"; // 寻找含子字符串的一行文字 double[,] k = new double; int enumber = 0; if (s == 6) // 子字符串的起始位置为6,这当然是观察到单元刚度矩阵部分的特征 { string ss = tmp.Remove(0, 34); //去掉文件部分,34是子字符串结束的位置,识别后即可去掉,仅留下单元号。 enumber = int.Parse(ss); //单元号转为整数 for (int i = 0; i < 6; i++) //读接下来的6行矩阵数值 { tmp = rd.ReadLine(); tmp = tmp.Remove(0, 4); //去除前4位子串 for (int j = 0; j < 6; j++) // 逐一提取当前行矩阵元素数值 { int pos = tmp.IndexOf('E'); //从字符串中寻找字符'E',这是每个矩阵元素的特征 string substring = tmp.Substring(0, pos + 4); //提取当前字符串中第1个数值 k = double.Parse(substring); tmp = tmp.Remove(0, pos + 4); //去掉当前字符串中第1个数值 } } //单元刚度矩阵赋值 foreach (Stage istage in stages) { foreach (Element iele in istage.element) { if (iele.nNumber == enumber) { iele.GetStiffness(k, 6, 6); //将刚度矩阵传递给单元对象。当然,这里只是简陋地假定刚度阵是6×6的,其实是可以在读取时就确定刚度阵的维数的。限于时间,没有理会这个问题。 goto EXIT; } } } EXIT: continue; } } rd.Close(); return; } 谢谢分享~ 非常好1
页:
[1]