董新玉,陳惟珍
(同濟大學 橋梁工程系,上海 200092)
在研究預應力混凝土結構開裂問題時,關心的是結構的局部應力,目前多采用SAP,ANSYS等有限元軟件將預應力筋離散為桿單元或索單元,將混凝土離散為實體單元進行分離式分析計算。由于要求預應力筋單元節(jié)點通過混凝土單元節(jié)點,這給曲線布筋的預應力混凝土結構網格劃分帶來了很大的困難。文獻 [1]針對有粘結預應力混凝土結構,在不考慮預應力筋滑移的前提下,提出采用嵌入模型模擬預應力筋的方法,嵌入模型見圖1。該方法在網格劃分時,允許預應力筋以任何方式穿過混凝土單元,從理論上解決了預應力混凝土結構網格劃分的難題。但是目前沒有針對嵌入模型的前處理系統(tǒng),采用常用的有限元軟件進行嵌入模型前處理非常不便。
圖1 嵌入模型Fig.1 Embedded model
本文提出了利用Visual C++和OpenGL圖形庫開發(fā)適用于嵌入模型的可視化前處理系統(tǒng)(命名為PC-Pre)的方法。Visual C++是微軟公司研發(fā)的面向對象的可視化開發(fā)工具,包括了綜合的微軟基本類庫(MFC Library),提供有復雜的資源編輯器,這使得開發(fā)Widows應用程序變得簡單高效。OpenGL是SGI公司開發(fā)的一個高性能圖形開發(fā)軟件包。作為圖形硬件的軟件接口,OpenGL包括了100多個圖形操作函數(shù),開發(fā)者可以利用這些函數(shù)構造景物模型、進行三維圖形交互軟件的開發(fā)。OpenGL已經成為開發(fā)可移植、可交互的2D和3D圖形應用程序的首選環(huán)境[2]。
PC-Pre在進行預應力混凝土結構有限元前處理時具有自身獨特的優(yōu)勢,主要內容和功能如下:
1)用戶可以在截面庫中選擇截面類型,然后利用關鍵截面建立混凝土實體模型。
2)可以建立空間預應力筋模型。
3)根據輸入的網格劃分控制參數(shù)自動對混凝土和預應力筋進行網格劃分。
4)具備圖形操作功能,提供了10個典型的觀察視圖,且可對圖形進行平移、縮放和旋轉操作。
結構體沿體內某一直線或曲線其斷面形式不變,斷面尺寸可以不同,稱這種結構為單一截面形式結構。對于這類結構可以選取結構的若干關鍵截面,利用相鄰關鍵截面上對應點的坐標通過線形插值的方法計算相鄰關鍵截面間結構體上點的坐標,即通過選取若干關鍵截面可以真實還原或近似模擬整個結構體[3]。
預應力筋線形最復雜的情況為空間曲線,將預應力筋向相互垂直的兩個平面內投影,投影線條一般由直線段和圓弧段組成,因此可用分段函數(shù)來描述。假設向yoz和xoz平面投影,xoz平面內的投影方程可表示為x(z),yoz平面內的投影方程可表示為y(z),由此可得預應力筋參數(shù)方程為:z=z;x=x(z);y=y(tǒng)(z),其中a≦z≦b。
2.3.1 混凝土單元劃分
關鍵截面將混凝土實體模型分成若干節(jié)段,網格劃分時可先將每個節(jié)段按相同的方式分割成形狀簡單、便于網格劃分的子域,再對每個子域進行網格劃分[4]。根據子域各方向分段數(shù)目,利用子域的角點坐標按線性插值的方法可求得單元節(jié)點坐標。
2.3.2 混凝土單元節(jié)點編號
將第1個單元的所有節(jié)點直接編號,后續(xù)單元需將其每個節(jié)點與所有已經編號的節(jié)點進行坐標比較。若單元的某個節(jié)點與編號為i的節(jié)點坐標相同,則將該單元的這個節(jié)點也編號為i;若與所有已經編號的節(jié)點的坐標都不相同,則賦予這個節(jié)點一個新的編號。
由于網格劃分是逐子域進行節(jié)點編號,因此最后形成的整體結構的網格節(jié)點差與子域個數(shù)以及子域編號順序等因素有關。對于大型復雜的結構,整體結構的網格帶寬較大,故需要進行帶寬優(yōu)化。帶寬優(yōu)化的方法參見文獻 [5-7]。
2.3.3 預應力筋單元劃分
對于嵌入模型,預應力筋單元劃分主要包括:計算預應力筋與混凝土單元表面的交點,將相鄰交點間的線段作為一個預應力筋單元;計算預應力筋單元所在混凝土單元的編號。
2.3.3.1 預應力筋與混凝土單元表面交點計算
數(shù)據結構是計算機存儲、組織數(shù)據的方式。PC-Pre用到的點、線、面和單元等基本元素可以通過定義數(shù)據結構進行表征。
3.1.1 點數(shù)據結構
3.1.2 線數(shù)據結構
3.1.3 面數(shù)據結構
3.1.4 以節(jié)點坐標定義單元數(shù)據結構
3.1.5 以節(jié)點編號定義單元數(shù)據結構
數(shù)組模板類CArray可以存放任意數(shù)據類型,而以其創(chuàng)建的對象能夠根據需要動態(tài)的增大或縮小。以上數(shù)據可以利用數(shù)組模板類CArray創(chuàng)建的對象進行存儲[8]。定義全局數(shù)組如下:
CArray<CPoint,CPoint&>PTS-Node;//節(jié)點數(shù)組
CArray < CXEleNodeCord,CXEleNode-Cord&>PTS-EleNodeCord;//單元節(jié)點坐標數(shù)組
CArray < CXEleNodeNum,CXEleNode-Num&>PTS-EleNodeNum;//單元節(jié)點編號數(shù)組
根據結構的復雜情況和所需的模擬精度可將結構分為若干節(jié)段來建立實體模型。節(jié)段信息對話框見圖2。對話框中節(jié)點坐標為該節(jié)段端截面局部坐標系原點在整體坐標下的坐標,單擊左、右截面按鈕分別彈出左、右截面參數(shù)對話框,在截面參數(shù)對話框中可輸入相應截面的控制參數(shù)。
圖2 節(jié)段信息對話框Fig.2 Segment dialog box
編制響應單擊截面參數(shù)對話框中確定按鈕的函數(shù),該函數(shù)首先求得截面頂點局部坐標,然后順序調用旋轉變換函數(shù)和平移變換函數(shù),通過兩次坐標變換將截面頂點局部坐標轉換為整體坐標。截面局部坐標系和整體坐標系關系如下:
截面局部坐標系x軸方向由左節(jié)點指向右節(jié)點;
當左右節(jié)點z值不等時,截面局部坐標系y軸與整體坐標系x軸方向相同;否則平行于整體坐標系xoy平面,選取與整體坐標系x軸正向夾角較小的指向。
平移變換公式簡單,不再贅述。旋轉變換公式[9]為:
其中(x′,y′,z′)為變換前坐標,(x,y,z)為變換后坐標,li,mi,ni分別為整體坐標系xi軸與截面局部坐標系x軸、y軸、z軸夾角的余弦。
預應力筋投影為平面曲線,一般由直線段和圓弧構成,可利用導線法建立。由用戶給定導線點二維坐標,對于圓弧還要給定半徑以及開口方向。
為不同類型截面設計網格劃分對話框,利用該對話框用戶可以輸入子域沿橫向和豎向的分段數(shù)目。圖3為單箱單室箱梁網格劃分參數(shù)對話框。留心的讀者可能已經發(fā)現(xiàn),子域沿縱向分段數(shù)目在節(jié)段信息對話框中輸入。
圖3 單箱單室箱梁網格劃分參數(shù)對話框Fig.3 Meshing dialog box for single cell box girder
單獨添加類,在類中添加子域劃分函數(shù)、混凝土單元節(jié)點編號函數(shù)和預應力筋劃分函數(shù)。子域劃分函數(shù)以子域角點坐標和子域沿縱向、橫向、豎向分段數(shù)目為參數(shù),按照線性插值方法計算單元節(jié)點坐標,并將每一單元所有節(jié)點坐標作為一個元素添加到混凝土單元節(jié)點坐標數(shù)組中。混凝土單元節(jié)點編號函數(shù)按照圖4編制。預應力筋劃分算法如下:
1)為所有混凝土單元表面進行編號,對應頂點坐標都相同的兩個表面認為是同一個面;
2)計算預應力筋與編號表面的交點;
3)將計算所得交點按某坐標排序,相鄰交點間的線段作為一個預應力筋單元;
4)計算預應力筋單元所在混凝土單元編號。
為網格劃分對話框添加類。在類中逐子域調用子域劃分函數(shù),然后調用混凝土單元節(jié)點編號函數(shù),最后調用預應力筋劃分函數(shù)即可實現(xiàn)整個模型的網格劃分。
OpenGL與Windows操作系統(tǒng)中的GDI相比具有靈活、方便、高效的特點。應用Visual C++與OpenGL進行聯(lián)合編程,需要構建OpenGL程序框架,實現(xiàn)Visual C++與OpenGL圖形接口的鏈接。具體實現(xiàn)方法參見文獻 [10]。
3.5.1 混凝土實體模型的繪制
OpenGL中,對于三維實體最簡單的方式是用一組包圍物體內部的平面多邊形來表示[11]。PCPre將結構模型的外表面劃分為若干個三角片元,繪制出所有的三角片元也就實現(xiàn)了結構模型的三維顯示。三角片元采用GL_TRIANGLES圖元繪制。
為使繪制的三維圖形更具真實感需要使用光照,這就要求為每個三角片元指定法向量。利用向量叉乘的方法計算三角片元法向量,然后通過gl-Normal3dv()函數(shù)告知計算機。圖5為采用PCPre建立的長10m,高5m的單箱單室箱梁幾何模型。
3.5.2 預應力筋幾何模型的繪制
在預應力筋曲線段選取足夠多的插值點,將預應力筋空間曲線轉化為空間折線。利用Open-GL中的GL_LINES圖元繪制出所有的折線段即可。
圖4 節(jié)點編號流程圖Fig.4 Flow diagram for node numbering
3.5.3 有限元模型的繪制
在繪制完成的混凝土實體模型的基礎上,采用區(qū)別于實體模型的顏色利用GL_LINES圖元將混凝土單元的楞繪制出來,就實現(xiàn)了有限元模型的繪制。OpenGL中,采用glColor()函數(shù)設置接下來的繪圖顏色。圖6為采用PC-Pre建立的長10m,高5m的單箱單室箱梁有限元模型。
圖形變換是圖形制作和顯示中的重要內容,OpenGL提供了豐富的圖形變換函數(shù)。利用Open-GL中的視點變換和模型變換可以完成視圖功能的開發(fā)。
使用三維CAD軟件時,為了觀察的需要,經常需要進行典型觀察視圖的選擇,PC-Pre定義了10個典型的觀察視圖。定義觀察視圖實際上就是定義觀察者的位置和視線的方向,可以通過視點變換來實現(xiàn)。OpenGl提供的函數(shù)gluLookAt()[12]可以方便的完成此項功能。
通過模型變換可以實現(xiàn)圖形平移、旋轉和縮放功能。OpenGL中有3個用于模型變換的函數(shù),glTranslate*()、glRotate*()和 glScale*(),他們分別通過平移、旋轉和縮放來操作一個指定的對象。利用模型變換函數(shù)并結合鼠標事件,可以實現(xiàn)以下功能:當按下鼠標左鍵時圖形跟隨鼠標平移;當按下鼠標右鍵時圖形跟隨鼠標旋轉;當轉動滾輪時圖形產生縮放。
本文利用Visual C++并結合OpenGL圖形庫完成了簡易的有限元可視化前處理系統(tǒng)開發(fā)。該系統(tǒng)實現(xiàn)了三維實體結構的參數(shù)化建模,并且具備滿足嵌入模型要求的網格劃分功能,解決了預應力混凝土結構網格劃分不便的難題。另外該系統(tǒng)具有良好的三維視圖功能,用戶可以方便直觀地觀察所建模型。
[1]王藝橋.預應力混凝土橋混凝土合理應力狀態(tài)研究[D].上海:同濟大學,2012.
[2]于 淼,焦淑紅.基于VC++與OpenGL的船舶三維模型可視化應用 [J].信息技術,2011,(6):161-163.
[3]梁 柱.預應力混凝土箱梁三維實體單元分析前處理程序開發(fā)與應用 [D].杭州:浙江大學,2005.
[4]安曉衛(wèi),邵偉平.用于二維和三維問題的有限元前處理程序 [J].機械設計與制造,1995(1):21-23.
[5]杜憲亭,夏 禾,龍佩恒,等.一種RCM有限元帶寬優(yōu)化改進算法 [J].計算力學學報,2010,27(4):694-697.
[6]Rafael Mart,Vicente Camposa,Estefan a Pi″anaa.A branch and bound algorithm for the matrix bandwidth minimization [J].Europ-ean Journal of Operational Research,2008,186(2):513-528.
[7]江雄心,萬平榮.三維有限元網格節(jié)點編號優(yōu)化 [J].工程圖學學報,2008,(4):22-26.
[8]呂希奎,周小平.實戰(zhàn)OpenGL三維可視化系統(tǒng)開發(fā)與源碼精解 [M].北京:電子工業(yè)出版社,2009.
[9]朱伯芳.有限元法的原理與應用 [M].北京:中國水利水電出版社,1998.
[10]吳 遜.VC++與OpenGL混合編程實現(xiàn)三維圖形處理 [J].軟件導航,2011,10(8):160-161.
[11]成思源,張群瞻.計算機圖形學 [M].北京:冶金工業(yè)出版社,2003.
[12]王清輝,王 彪.Visual C++CAD應用程序開發(fā)技術 [M].北京:機械工業(yè)出版社,2003.