趙 宇,張 迅,韓 鋒,顧 穎,古 松
(1.西南交通大學土木工程學院,成都 610031; 2.中鐵建設集團有限公司基礎事業(yè)部,北京 100131; 3.西南科技大學土木工程與建筑學院,四川綿陽 621010)
作為鐵路交通網(wǎng)絡的交匯點,鐵路客站伴隨著客運鐵路的發(fā)展而迅速發(fā)展。如今,高速鐵路站房的結構形式日趨復雜多樣。如何準確、高效地建立有限元模型已成為結構設計領域的熱點問題[1-2]。
在大型特殊結構設計中,一般應采用多款軟件進行對比分析[3]。沈磊等[4]利用C#語言結合面向對象編程的思想,編制了有限元模型轉換程序,以實現(xiàn)MIDAS Gen和SAP 2000兩種模型的相互轉換。張月強等[5]通過自編程序,實現(xiàn)了ABAQUS和SAP 2000兩種模型的相互轉換,并將其應用到上海中心大廈的建模分析中。文獻[6-8]對船舶、飛機等結構的快速建模技術進行了研究。文獻[9-11]對建筑信息模型進行了探討。
近年來,ANSYS憑借其功能強大的前后處理和分析能力在結構分析中得到廣泛的應用[12]。對于大型鐵路站房結構,在建立ANSYS模型時首先需要對梁柱進行定位,依次計算并記錄各節(jié)點的坐標,然后確定單元節(jié)點編號以及截面編號,此過程極其繁瑣費時,且難以保證精度。
本文提出一種基于Matlab[13]快速建立大型鐵路站房結構ANSYS模型的方法。該方法以簡便、直觀的方式對梁柱進行定位,并將建立節(jié)點、單元編號、賦予截面等工作以電算形式完成,從而大幅度提高建模效率。此外,程序中的可視化窗口可實現(xiàn)快速糾錯,并確保模型與圖紙相匹配。
基于Matlab編制的程序主要包含3個模塊:CAD圖紙信息識別和轉換;單元交叉分割得到節(jié)點、單元、截面矩陣;生成ANSYS命令流。程序的總流程如圖1所示,包括:(1)通過人工方式記錄CAD圖紙中梁柱的位置和截面信息;(2)讀取梁柱信息,轉換得到單元節(jié)點的絕對坐標;(3)對單元進行交叉分割,得到節(jié)點、單元、截面矩陣;(4)生成ANSYS命令流,程序結束。
圖1 程序總流程
對于梁柱,錄入的主要內(nèi)容包含端點的位置信息和截面信息。對于梁柱端點的定位,可利用圖紙中的既有軸線和相對于軸線的偏移量予以實現(xiàn)。對于圖紙中的任意位置,可由兩條垂直的軸線以及與各軸線的偏移量來確定。
如圖2所示,線段(a)的位置信息為:[(10,L1),(J,-M1),(11,-K1),(J,-N1)]。其中:前兩組代表一個端點,后兩組代表另一個端點;每一組的第一個參數(shù)為參考軸線的編號,后一個參數(shù)為相對于軸線的偏移量。線段(b)和(c)的位置信息分別為:[(10,L2),(H,M2),(11,-K2),(H,N2)]和[(11,-L3),(H,M3),(11,-K3),(H,N3)]。由于線段(b)和(c)平行于軸線,使得每個位置信息中都存在著兩組相同的參數(shù)??紤]到站房結構中幾乎所有的梁都平行于軸線,因此可將相同的參數(shù)放在首位作為兩端點的共有參數(shù)。此時,線段(b)和(c)的位置信息變?yōu)閇(H,M2),(10,L2),(11,-K2)]和[(11,-L3),(H,M3),(H,N3)]。
圖2 單元位置信息示意
需要說明的是:在進行位置信息錄入時,對于軸網(wǎng)平行的規(guī)則框架結構,可仿照線段(b)和(c)進行錄入,個別不與軸網(wǎng)平行的梁柱可仿照線段(a)進行錄入。對于異型軸網(wǎng)或無規(guī)則結構,直接采用人工進行定位。
通過“對號入座”的方式將位置信息中的軸線編號轉化為軸線坐標,再疊加偏移量后得到梁柱端點的絕對坐標。具體流程如圖3所示。部分程序代碼如下(限于篇幅,代碼中的“$”表示換行)。
for ii=1∶dygs
if isnumeric(dqz{ii})==0 %橫軸對齊
R1=find(strcmp(HZZ,dqz{ii,1}));
zz=HZ(R1)+PY(ii);%兩端點縱坐標
r1=find(ZZZ==qs{ii,1}); $ r2=find(ZZZ==zd{ii,1});
ijd=[ZZ(r1,1)+py1(ii),zz]; $ jjd=[ZZ(r2,1)+py2(ii),zz];
else $ R2=find(ZZZ==dqz{ii,1});
hz=ZZ(R2)+PY(ii);%兩端點橫坐標
r1=find(strcmp(HZZ,qs{ii,1}));
r2=find(strcmp(HZZ,zd{ii,1}));
ijd=[hz,HZ(r1,1)+py1(ii)]; $ jjd=[hz,HZ(r2,1)+py2(ii)];
end $ %記錄截面信息
if decide(jmm,jm(ii,:))==0 $ jmm=[jmm;jm(ii,:)];
end $ jmbh=decide(jmm,jm(ii,:));%單元截面編號
dyzb(ii,:)=[ijd,jjd,jmbh]; $ end
圖3 坐標轉換流程
此模塊可實現(xiàn)錄入梁柱信息時,在每個交叉點進行單元分割,可減少工作量并保證單元間的正確連接。具體流程如圖4所示。程序代碼如下。
%單元相交,生成并記錄新的節(jié)點
for ii=1:size(dyzb,1)-1 $ for jj=ii+1:size(dyzb,1)
[x1,y1]=xj(dyzb(ii,1∶4),dyzb(jj,1∶4));
if (x1~=0)&(y1~=0) $ if decide(jd,[x1,y1])==0
jd=[jd;x1,y1]; $ end $ end $ end $ end
dyfg=[];%分割后的新單元
%分割單元
for ii=1:size(dyzb,1) $ bhjd=[];%單元所包含節(jié)點
for jj=1:size(jd,1) $ if djxj(dyzb(ii,1∶4), jd(jj,1∶2))==1
bhjd=[bhjd,jj]; $ end $ end $ bh=[]; $ if dyzb(ii,1)==dyzb(ii,3)
for i=1:size(bhjd,2) $ bh=[bh,jd(bhjd(i),2)];%將單元中包含節(jié)點的y坐標合成一個向量 $ end $ else
for j=1:size(bhjd,2) $ bh=[bh,jd(bhjd(j),1)];%將單元中包含節(jié)點的x坐標合成一個向量 $ end $ end
[B,ind]=sort(bh);%對所包含節(jié)點按坐標排序
for i1=1:length(bhjd)-1%分割的單元數(shù)比節(jié)點數(shù)小1
dyfg=[dyfg;bhjd(ind(i1)),bhjd(ind(i1+1)),dyzb(ii,5)];
end $ end
圖4 單元交叉分割流程
該模塊中存在著兩個技術難點:根據(jù)兩個單元的端點坐標判斷其是否相交;判定單元與節(jié)點是否相交。判斷兩單元交點坐標的流程如圖5所示。判斷單元與節(jié)點是否相交的流程如圖6所示。
圖5 判斷單元相交流程
圖6 判斷單元與節(jié)點相交情況流程
值得注意的是,在存儲節(jié)點坐標形成節(jié)點矩陣、存儲截面信息形成截面矩陣、存儲節(jié)點編號、截面編號形成單元矩陣等過程中,應先判斷某個向量在矩陣中是否已經(jīng)存在。如果已存在,則返回其索引;如未包含,則在矩陣末尾添加該向量。具體的流程如圖7所示,代碼如下。
function [c]=decide(a,b)
%判斷矩陣a中是否已含有行向量b
%如果含有則返回其行數(shù),否則為0
c=0; $ for i=1:size(a,1) $ if(sum(abs(a(i,:)-b))==0) $
c=i; $ break; $ end $ end $ end }
圖7 判別函數(shù)流程
按照ANSYS命令流格式[14]依次生成建立截面、節(jié)點、單元的命令流,并將其寫入到文本中。
具體的代碼如下:
fid=fopen('kmnz.txt','w');
%建立截面
for i1=1:size(jm,1)
fprintf(fid,'%s ',['sectype',',',num2str(i1),',beam,rect',',secc',…
num2str(i1)]);%以secc為前綴命令截面
fprintf(fid,'%s ',['secdata',',',num2str(jm(i1,1)),',',…
num2str(jm(i1,2))]);%賦予截面參數(shù) $ end
%建立節(jié)點
for i2=1:size(jd, 1)
fprintf(fid,'%s ',['n,',num2str(i2),',',num2str(jd(i2,1)),',',…
num2str(jd(i2,2)),',',num2str(jd(i2,3))]); $ end
%建立單元
fprintf(fid,'%s ','type,1'); $ fprintf(fid,'%s ','mat,1');
for i3=1:size(dyfg,1)
fprintf(fid,'%s ',['secnum,',num2str(dyfg(i3,3))]);
fprintf(fid,'%s ',['en,',num2str(dyfg(i3,1)),',',…
num2str(dyfg(i3,2)),',',num2str(dyfg(i3,2))]); $ end
fclose(fid);
鐵路昆明南站(圖8)位于呈貢新區(qū)吳家營片區(qū),是采用“橋建合一”結構形式的大型高鐵站房。昆明南站設計總規(guī)模為16站臺30條到發(fā)線(含正線),鐵路車場布置渝昆場、滬昆場、云桂場。昆明南站建筑是新建昆明南站工程中的核心項目,它包括了客運站房(約12萬m2)、站臺雨棚(約8萬m2)、北側軌行區(qū)下部架空停車場及換乘空間(約7萬m2)。
昆明南站站房為地上三層,地下一層。首層為地下一層,地面高程為-10.500 m,主要為地下停車場、出站廳、地鐵入口。二層為站臺層,站臺面高程為0.000 m,主要柱網(wǎng)尺寸為10.75 m×22 m。三層(高程9.500 m)為高架候車室。站房順軌方向為226 m,垂直于軌道方向為430.5 m,主要柱網(wǎng)尺寸為21.5 m×22 m[15]。
圖8 昆明南站效果圖
以B2區(qū)高程-2.276 m的K~L,8~9軸范圍(圖9)為例,以下詳細介紹其建模過程。
圖9 B2區(qū)高程-2.276 m部分的局部(單位:mm)
以“先橫梁后縱梁”、“從上到下”、“從左到右”的順序,依次將梁單元位置信息和截面信息錄入到Excel表格中,如圖10所示。其中:A列為分區(qū)和高程信息;B~G列為梁的位置參數(shù);B、C兩列為平行軸線的編號與偏移量;D~G列為垂直軸線的編號與偏移量;H、I兩列為截面參數(shù)。顯然,2~4行為橫梁,5~11行為縱梁。
圖10 錄入信息部分示意
利用程序的繪圖功能繪制出各梁的位置,并以錄入的先后順序對其編號,同時將編號標記在各梁的中心位置處便于檢查,如圖11所示。
圖11 初次運行程序得到的結果
從圖11可以看出,編號為6的梁有誤。此時,根據(jù)其編號可快速返回到Excel中找到其對應位置,再根據(jù)其位置信息返回到CAD圖紙糾錯。糾錯后的程序運行結果如圖12所示。
圖12 程序更正后的結果
按照此過程依次在Excel中記錄每個分區(qū)的信息,此過程中很可能出現(xiàn)公共邊重復錄入的情況。因此,先利用程序檢查并輸出重復單元的編號,再返回到圖紙和表格中進行檢查,以刪除重復單元。
最后,在生成的命令流中添加材料信息以及板單元的建模命令,得到如圖13所示的ANSYS模型,該模型有24 157個節(jié)點、54 277個梁單元、9 011個板單元。
將程序中生成命令流的模塊按照MIDAS軟件的命令流格式進行修改[16],即可得到MIDAS有限元模型,如圖14所示。
圖13 ANSYS有限元模型
圖14 MIDAS有限元模型
利用兩個軟件分別計算站房結構的自振特性,對比結果見表1。此外,圖15和圖16給出了振型圖。
表1 兩種軟件計算得到的自振頻率對比 Hz
圖15 ANSYS有限元模型得到的振型
圖16 MIDAS有限元模型得到的振型
從表1以及圖15~圖16可以看出,利用本文方法建立的ANSYS模型和MIDAS模型的自振特性及振型基本一致,證明了該程序的準確性。
從建模效率上來看,以建立一根梁為例,所需要進行的工作僅為人工識別并且在Excel表中輸入6個位置參數(shù)和2個截面參數(shù),其工作量遠遠小于直接在軟件中進行交互式建模。
(1)本文提出的方法使建模過程中的多個環(huán)節(jié)得到簡化。利用定位軸線和偏移量的方法使得定位工作直觀、高效,并且方便檢查;節(jié)點編號、截面編號以及匹配單元節(jié)點編號的工作由電算來完成,省時省力,并且避免了人為疏忽造成的錯誤。
(2)該程序具有良好的糾錯能力,在建模過程中可以隨時檢查并更正錯誤(例如重復單元),保證了模型的正確性。
(3)本文提出的方法僅需對生成命令流的模塊稍加修改后,即可得到其他有限元軟件(如ABAQUS等)的命令流,以方便對多個軟件的計算結果進行對比。