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