ANSYS剛度矩陣的提取與解析(python解析)
2017-09-15 by:CAE仿真在線 來源:互聯(lián)網
在workbench中實現(xiàn)整個過程的參數化過程除了前幾次文章介紹的模型與網格,還應該包括材料參數的參數化定義。利用Python進行二次開發(fā)能夠實現(xiàn)材料參數的自由定義,比如來源于excel表格或者文檔的數據,通過Python代碼的自動讀取,參與到實際的有限元分析進程中。
結構有限元最后的求解過程總是歸結到求解一個大型矩陣方程Ax=b,對于一些情況還需要考慮質量矩陣M和阻尼矩陣C。有限元程序在組裝完所有單元的剛度矩陣后,考慮模型所施加的約束和載荷,最終將剛度矩陣進行一些處理,例如乘大數法,變成Ax=b的形式,其中A是剛度矩陣,b是節(jié)點載荷,x為待求的節(jié)點位移,A和b全為已知量。
基本上各類有限元軟件均能夠提取模型的剛度矩陣,此次針對剛度矩陣的提取與解析做一個例子,采用的軟件是ANSYS經典。
在ANSYS中建立一個簡單的模型,劃分網格后共12個節(jié)點,定義材料參數,施加約束和載荷后求解。有限元模型如下所示。

圖1
待求解結束后,會在工作目錄下生成一個后綴為full的文件,之后即可進行剛度矩陣的提取。
通過主菜單,如下所示。

圖2
選擇Matrix后,彈出如下所示的界面。

圖3
其中,File to be read需要指定工作目錄下生成的full文件,Name of file to write為所導出剛度矩陣的文件名稱;Output matrix file format表示文件格式,還有Binary,生成的是文檔文件,選擇Ascii即可;Matrix to write表示輸出的是剛度矩陣/質量矩陣還是阻尼矩陣;RHS選項表示是否同時輸出右端項,也即是Ax=b中的b。
打開生成的剛度矩陣文檔,如下所示。

圖4
該文件的第1行:格式A72,解釋性文字。
第2行:一共5個數值,格式5I14,其中585表示文件的總行數(不包括頭文件,也即是前面5行不算);25表示矩陣列指針的總行數,通常是矩陣的階數+1,其具體的數值位置是從第6行到30行;268表示矩陣行索引的總行數;第二個268表示矩陣元素的總行數;24表示右端項的數值總行數。
第3行:RSA表示矩陣的形式,其中R表示實數矩陣,S表示為對稱矩陣,A表示為組裝的矩陣;后面的兩個24分別表示矩陣行數、矩陣列數,268表示矩陣的元素。
第4行:格式說明
第5行:幾個數表示右端項的輸出說明,F表示全部存儲。
搞清楚頭文件中的各個參數的實際意義,再結合各行的內容,能夠清楚地知道矩陣的所有元素的數值。
通過簡單的程序就可以將該文件進行解析,生成自己想要的格式。
這里補充說明一下,對于對稱稀疏矩陣,在儲存的時候只保留下三角非零元素。
本次解析所用的語言為python.
#!user/bin/python
#-* -coding:UTF-8 -*-
#打開矩陣文件
inpfile = open("E:\CAE_Tech\process_files\232Files\matrix.txt")
#讀取所有內容
lines = inpfile.readlines()
inpfile.close()
#打開輸出文件
outfile = open("E:\CAE_Tech\process_files\232Files\outmatrix.txt",’w’)
#解析矩陣文件的第二行
row_second = lines[1].split()
#得到矩陣的總行數(扣除頭文件),此次實例中為585
Tol_content = int(row_second[0])
#得到列指針的總行數
Col_tol = int(row_second[1])
#得到矩陣元素總數
Row_tol = int(row_second[3])
#得到右端項的行數
Rhs_tol = int(row_second[4])
#初始化矩陣每列非零元素的起始行數
Star_row_num = [1] * Col_tol
#獲取行起始數組
for i in range (Col_tol):
temp = lines[i+5].split()
Star_row_num[i] = int(temp[0])
for i in range (Rhs_tol):
temp_len = Star_row_num[i+1] - Star_row_num[i]
temp_len1 = Star_row_num[1] - Star_row_num[0]
temp_len2 = Star_row_num[i] - Star_row_num[0]
row_start_num = 5 + Col_tol + temp_len2
Each_col_num = i + 1
Each_col_num_str = str(Each_col_num)
for j in range (temp_len):
Each_row_num_str = lines[row_start_num + j].split()
Each_row_num = int(Each_row_num_str[0])
Each_row_num_str = str(Each_row_num)
Each_ele_num = Row_tol +5 + Col_tol + temp_len2 + j
Each_ele_str = lines[Each_ele_num].split()
Each_ele_value = Each_ele_str[0]
#得到每一行應該輸出的列號,行號以及元素值
Each_row_list = Each_row_num_str,Each_col_num_str,Each_ele_value,'\n'
a = ' '
Each_line = a.join(Each_row_list)
outfile.write(Each_line)
#輸出右端項
for i in range (Rhs_tol):
Rhs_num = Tol_content + 5 -Rhs_tol +i
Rhs_each_row = lines[Rhs_num]
#去掉字符串前面的空格
Rhs_each_row = Rhs_each_row.lstrip()
outfile.write(Rhs_each_row)
outfile.close()
解析后生成的文件如下所示:

圖5
相關標簽搜索:ANSYS剛度矩陣的提取與解析(python解析) Ansys有限元培訓 Ansys workbench培訓 ansys視頻教程 ansys workbench教程 ansys APDL經典教程 ansys資料下載 ansys技術咨詢 ansys基礎知識 ansys代做 Fluent、CFX流體分析 HFSS電磁分析 Abaqus培訓