



版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
摘要對(duì)流擴(kuò)散問題的數(shù)值求解是傳熱、傳質(zhì)學(xué)的重要研究課題。研究對(duì)流擴(kuò)散問題的數(shù)值解,尋找一種快速、穩(wěn)定而又實(shí)用的數(shù)值算法,具有重要的理論和實(shí)際意義。目前,用來求解這…類問題的數(shù)值解法有很多,研究的角度也有所不同。在各種數(shù)值方法的求解中,其程序開發(fā)的具體實(shí)現(xiàn)一般都采用結(jié)構(gòu)化語言,用面向?qū)ο蟮某绦蛟O(shè)計(jì)語言來開發(fā)的相對(duì)較少。本文研究的課題是面向?qū)ο蟮娜S對(duì)流擴(kuò)散問題有限元分析程序的設(shè)計(jì)與實(shí)現(xiàn),主要研究Peclet數(shù)較小時(shí),三維定常的對(duì)流擴(kuò)散方程的有限元解法,用面向?qū)ο蟮腃++程序設(shè)計(jì)語言開發(fā)出有應(yīng)用價(jià)值的通用程序,對(duì)相關(guān)的對(duì)流擴(kuò)散問題進(jìn)行數(shù)值模擬。本文的主要內(nèi)容總結(jié)如下:.闡述了本文的研究背景,綜述了面向?qū)ο蟪绦蛟O(shè)計(jì)的基本原理。.采用四結(jié)點(diǎn)四面體單元和八結(jié)點(diǎn)六面體等參數(shù)單元進(jìn)行三維定常對(duì)流擴(kuò)散方程的有限元分析。.用面向?qū)ο蟮某绦蛟O(shè)計(jì)語言C++來具體實(shí)現(xiàn)三維定常對(duì)流擴(kuò)散問題的有限元程序的開發(fā),融入用C++編制的大型通用有限元科學(xué)和工程計(jì)算軟件。.給出了四個(gè)算例,并對(duì)分析結(jié)果進(jìn)行初步討論和評(píng)價(jià),從而驗(yàn)證本文方法的有效性和實(shí)用性。關(guān)鍵詞:對(duì)流擴(kuò)散方程,有限元,面向?qū)ο蠓椒ǎ绦蛟O(shè)計(jì)ABSTRACTNumericalsolutionofconvection-diffusionproblemisanimportantsubjectinheatandmasstransfer.Tothisproblem,itprovidesimportanttheoreticandpracticalsignificancetoseekafast,stableandpracticalnumericalmethod.Atpresent,therearemanymethodstosolvethisclassofproblems,withitsdiflferentpoints.Amongthesemethods,designandimplementationofprogramsweredevelopedbystructurelanguagesmostly,andlessbyobject-orientedprogramcomparatively.Thesubjectofthispaperistodevelopanobject-orientedfiniteelementanalysisprogramofthree-dimensionalconvection-diffusionequation.Wemainlystudythefiniteelementmethodforthree-dimensionalsteady-stateconvection-diffusionequationinthecaseofthevalueofPecletissmall,andthendevelopageneralprogramwithobject-orientedC++languageandgivethenumericalsimulationtothecorrespondingconvection-diffusionproblems.Themainofthispaperisoutlinedasfollows:.Thebackgroundofthispaperisdescribed,andthebasictheoryofobject-orientedprogramissummarized..Thefiniteelementanalysisofthree-dimensionalsteady-stateconvection-diffusionequationisgivenbyusing4-nodetetrahedralelementsand8-nodehexahedralelements..Thefiniteelementprogramofthree-dimensionalsteady-stateconvection-diffusionproblemsisdevelopedbyusingtheobject-orientedC++language,whichcanbeappliedtoalargegeneralfiniteelementscienceandengineeringcomputationsoftware..Theprimarydiscussionandtheremarksabouttheresultsoffournumericalexamplesaremade,andthenthevalidityandutilityofthemethodproposedinthispaperisverified.Keywords:Convection-diffusionequation,Finiteelementmethod,Object-orientedmethod,Programming1緒論對(duì)流擴(kuò)散方程是一類基本的運(yùn)動(dòng)方程,它可以用來描述河流污染、大氣污染、核廢物污染中污染物質(zhì)的分布,流體的流動(dòng)和流體中熱的傳導(dǎo)等眾多物理現(xiàn)象。對(duì)于同時(shí)伴有物質(zhì)輸運(yùn)和分子擴(kuò)散的物理過程以及粘性流體的流動(dòng),其數(shù)學(xué)模型通常為對(duì)流擴(kuò)散方程或含有此類方程的偏微分方程組的定解問題。對(duì)流擴(kuò)散問題數(shù)值計(jì)算方法的研究具有重要的理論和實(shí)際意義,可用于環(huán)境科學(xué)、能源開發(fā)、流體力學(xué)和電子科學(xué)等許多領(lǐng)域。對(duì)流擴(kuò)散問題的有效數(shù)值解法一直是計(jì)算數(shù)學(xué)中重要的研究內(nèi)容,求解對(duì)流擴(kuò)散方程的數(shù)值方法主要是有限差分法(FDM)、有限元法(FEM)、有限體積法(FVM)、有限解析法(FAM)、邊界元法(BEM)、譜方法(SM)等多種方法。但是對(duì)于對(duì)流占優(yōu)問題,用通常的差分法或有限元法進(jìn)行求解將出現(xiàn)數(shù)值震蕩。為了克服數(shù)值震蕩,80年代,J.Douglas,Jr.和T.F.Russell等提出特征修正技術(shù)求解對(duì)流擴(kuò)散占優(yōu)的對(duì)流擴(kuò)散問題,與其它方法相結(jié)合,提出了特征有限元方法、特征有限差分方法、特征混合元方法;T.J.Hughes和A.Brooks提出過一種沿流線方向附加人工黏性的間斷有限元法,稱為流線擴(kuò)散方法(SDM)。有限差分法、有限元法、有限體積法是工程應(yīng)用中的主要方法。本文所研究是低Peclet數(shù)下,粘性不可壓縮流體的流動(dòng)中,三維定常的對(duì)流擴(kuò)散問題的有限元解法。驗(yàn)證Peclet數(shù)較小時(shí),三維定常的對(duì)流擴(kuò)散方程的有限元解法的有效性,用面向?qū)ο蟮腃++程序設(shè)計(jì)語言開發(fā)出有應(yīng)用價(jià)值的通用程序,對(duì)相關(guān)的對(duì)流擴(kuò)散問題進(jìn)行數(shù)值模擬。對(duì)于對(duì)流占優(yōu)對(duì)流擴(kuò)散問題的求解,采用本文方法,要得到穩(wěn)定解,則要通過加密有限元網(wǎng)格來實(shí)現(xiàn)。對(duì)流擴(kuò)散方程的背景及其特點(diǎn)對(duì)流擴(kuò)散問題,又稱彌散(Dispersion)問題。它主要是研究流體中由流體質(zhì)點(diǎn)所攜帶的某種物理量,如溫度或溶解于流體中的物質(zhì)的濃度在流動(dòng)過程中的變化規(guī)律。這些變化一般包括對(duì)流、擴(kuò)散以及由于某種物理化學(xué)的原因引起的物理量自身衰減或增長的過程。對(duì)流擴(kuò)散方程的背景四假定u=u(x,y,z,t)是流體中單位體積所攜帶的物理量。如物理量是流體介質(zhì)的質(zhì)量,則u表示密度;如物理量是某種污染物的含量,則u是表示污染濃度;如物理量是熱能,則u是熱量或溫度。為研究物理量u的變化規(guī)律,在流場中任取一個(gè)有限區(qū)域丫,其邊界為SoV中流體所攜帶的物理量u的變化,由下列三方面物理過程組成。(1)對(duì)流過程由于流體處于宏觀的流動(dòng)狀態(tài),丫中U的總量因?qū)α鞫l(fā)生變化,可以認(rèn)為它由兩方面組成:一項(xiàng)是在u中V隨著時(shí)間的增長而產(chǎn)生的變化;另一項(xiàng)是區(qū)域V中由于流體流動(dòng),位置發(fā)生變化所引起流體中u的變化(圖1.1)o也就是V中u的積分量的隨體導(dǎo)數(shù)V(r+Ar) SVnV(r)圖1.1對(duì)流過程Figure1.1Processofconvectiondtdu
dtdt其中Vn=v-n是流體速度在S面上的法向分量。利用Green-Gauss公式Nmv/iJS=\div(uv)dV應(yīng)有dt(2)擴(kuò)散過程擴(kuò)散過程包含有分子布朗運(yùn)動(dòng)形成的分子擴(kuò)散以及流體湍流運(yùn)動(dòng)形成的湍流擴(kuò)散。這種擴(kuò)散使得物理量u在流場中由高值向低值方向移動(dòng)。若擴(kuò)散的速率用q表示,它是單位時(shí)間內(nèi)通過單位面積的物理量,F(xiàn)ick定律給出了物理量在流場中的擴(kuò)散速率公式q="Kgradu其中張量K=Km+K'm的各個(gè)分量值取決于含有物理量u的流體的狀態(tài)與性質(zhì)。-一般地說,企圖在理論在確定K值是非常困難的,通常是通過實(shí)驗(yàn)測定。如果擴(kuò)散是各向同性的,則可寫成q="kgradu其中k是擴(kuò)散系數(shù),它可以是M或其它物理量的函數(shù),也可以是常數(shù)。由于擴(kuò)散作用,使區(qū)域V中U的增加量為,K是分子擴(kuò)散系數(shù)張量,K,是湍流擴(kuò)散系數(shù)張量。K-N?qdS=N?KgradudS=Jdiv{Kgradu)dV(3)源和匯流場中物理量u的自身增長與衰減,一般是通過分布在流場中的源和匯來描述。這種源和匯是場的分布函數(shù),記為。。。>0表示源,它將使u增長;。V0表示匯,它將使u減小。m增長或減小的速率由源或匯的強(qiáng)度,即。絕對(duì)值的大小來反映。在區(qū)域V中,由于源匯的作用使M的增加量為通常我們將Q分為源增長項(xiàng)和匯衰減項(xiàng)。線性衰減類型的表達(dá)式為其中7>0是源分布函數(shù),PN0是衰減函數(shù)。另一種常用的衰減類型的時(shí)間的指數(shù)規(guī)律Q=f-uoe7其中wo是初始時(shí)刻物理量〃的濃度,t是時(shí)間變量,y是衰減常數(shù)。1.1.2對(duì)流擴(kuò)散方程的導(dǎo)出?則根據(jù)守恒原理,單位時(shí)間內(nèi)丫中M的變化應(yīng)滿足:[由于對(duì)流M的增加量]=[由于擴(kuò)散進(jìn)入V中的M的增加量]+[由于源匯作用U的增加量]也就是由于V是任意的,上面的守恒方程可寫成cu一+div(uv)=div(Kgradu)+Q (Lia)a .或?qū)懗杉?74-vgradu=div(Kgradu)+Q (1.1b)立這個(gè)方程通常稱為對(duì)流擴(kuò)散方程。方程(1.1)的邊界條件分為兩種類型:(1)在邊界口上給出本質(zhì)邊界條件(2)在邊界n上給出自然邊界條件,3CU(Jn=Sx,rii=qnJl初+div(uv)|JdV=Jdiv(Kgradu)dV+jQdV總邊界「=BU「2。上述邊界條件也可統(tǒng)一寫成:在邊界「上SuUokij n:+a,M+az=0加式中a。、ai、a2是已知函數(shù)。初始條件為:在t=0時(shí),給出〃的分布H(X,0)=H(X)方程(1.1)式中的速度V一般有兩種情況:一種是U對(duì)于流場中的密度P或速度V沒有直接影響,或者影響很小可以忽略,此時(shí)V可以獨(dú)立通過流體力學(xué)的主流方程(即連續(xù)性方程和運(yùn)動(dòng)方程)求出。另外--種是U和流場中的密度P或速度V有直接的關(guān)系,必須耦合求解。本文進(jìn)行的有限元分析,考慮前面一種情形,并認(rèn)為已經(jīng)給出了速度場Vo另外由于本文是研究三維定常的對(duì)流擴(kuò)散方程的有限元解法,則流體中所攜帶的物理量M與時(shí)間t無關(guān),此時(shí),在方程(1.1)中也=0
a對(duì)流擴(kuò)散方程是流體力學(xué)中的典型方程,連續(xù)方程、動(dòng)量方程、能量方程都可以寫成對(duì)流擴(kuò)散方程的形式。1.1.3對(duì)流擴(kuò)散方程的特點(diǎn)啪⑸對(duì)流擴(kuò)散方程(Lia)和(1.1b)右端第一項(xiàng)為擴(kuò)散項(xiàng),左端第二項(xiàng)則是對(duì)流項(xiàng)。由于其方程本身的特點(diǎn),給建立準(zhǔn)確有效的數(shù)值求解方法帶來一定的困難。對(duì)流和擴(kuò)散給流體中由流體攜帶的某種物理量的變化過程,可以通過一個(gè)無量綱的特征參數(shù)(Peclet數(shù))來描述,Peclet數(shù)Pe的定義為:Pe="
D這里v是來流速度,L是特征長度,D是物質(zhì)的擴(kuò)散系數(shù)。如果Pe數(shù)較小,即對(duì)流效應(yīng)相對(duì)較弱,這類問題中,擴(kuò)散占主導(dǎo)地位,方程(1.1a)和(1.1b)是橢圓型或拋物線型;如果Pe數(shù)較大,即溶質(zhì)分子的擴(kuò)散相對(duì)于流體速度而言是緩慢的,這類問題中,對(duì)流占優(yōu),方程(LIa)和(1.1b)具有雙曲型方程的特點(diǎn)。對(duì)于對(duì)流占優(yōu)問題的求解,采用常規(guī)的Galerkin有限元方法,為了避免求解結(jié)果產(chǎn)生數(shù)值振蕩,獲得穩(wěn)定解,則應(yīng)使每個(gè)單元的局部Peclet數(shù)p此<2
Peh=&zD這里h為單元的最大尺寸,|v|為單元中的最大速度分量值。因此,用本文方法求解對(duì)流占優(yōu)對(duì)流擴(kuò)散問題,要得到穩(wěn)定解,則要通過加密有限元網(wǎng)格來實(shí)現(xiàn)。有限元法簡述121有限元法的發(fā)展概況血閉網(wǎng)有限單元法最初是在20世紀(jì)50年代作為處理結(jié)構(gòu)力學(xué)問題的方法出現(xiàn)的。追溯歷史,早在1943年,庫蘭特(Courant)已應(yīng)用了“單元”的概念。在1945~1955年,阿吉里斯(Argyris)等人在結(jié)構(gòu)矩陣分析方面有很大發(fā)展。1956年,特勒(Turner)、克拉夫(Clough)等人把剛架位移法的解題思路推廣應(yīng)用于彈性力學(xué)平面問題:他們把連續(xù)體劃分成三角形和矩形單元,單元中位移函數(shù)首先采用了近似表達(dá)式,推導(dǎo)單元的剛度矩陣,建立結(jié)點(diǎn)位移與結(jié)點(diǎn)力之間的單元?jiǎng)偠确匠?。i960年,克拉夫首次把這種解決彈性力學(xué)問題的方法,給予特定的名詞,稱為“有限元法在我國,60年代初期馮康等人獨(dú)立地建立了有限元方法的數(shù)學(xué)理論并應(yīng)用于工程實(shí)際問題。有限單元法是基于變分原理和分片多項(xiàng)式插值,結(jié)合電子計(jì)算機(jī)的發(fā)展與推廣而迅速發(fā)展起來的一種求解微分方程的數(shù)值方法。由于有了現(xiàn)代化的、先進(jìn)的計(jì)算工具,使得有限單元法在應(yīng)用上已遠(yuǎn)遠(yuǎn)超過了原來的范圍。它已由彈性力學(xué)平面問題擴(kuò)展到空間問題和板殼問題,能對(duì)原子能反應(yīng)堆、拱壩、飛機(jī)、船體、渦輪葉片等復(fù)雜結(jié)構(gòu)進(jìn)行應(yīng)力分析;它已由平衡問題擴(kuò)展到穩(wěn)定問題和動(dòng)力問題,能對(duì)結(jié)構(gòu)在地震力與波浪力作用下的動(dòng)力反應(yīng)進(jìn)行分析;它已由彈性問題擴(kuò)展到彈塑性與粘彈性問題,能解決土力學(xué)、巖石力學(xué)、斷裂力學(xué)等問題;它已由結(jié)構(gòu)的應(yīng)力分析擴(kuò)展到結(jié)構(gòu)的優(yōu)化設(shè)計(jì)。除此,它在流體力學(xué)、熱傳導(dǎo)、磁學(xué)、建筑聲學(xué)、生物力學(xué)等等方面都有不同程度的應(yīng)用??傊瑑汉跛械倪B續(xù)介質(zhì)問題和場問題都可以用它求得滿意的數(shù)值結(jié)果。可以預(yù)計(jì),隨著現(xiàn)代力學(xué)、計(jì)算數(shù)學(xué)和計(jì)算機(jī)技術(shù)的發(fā)展,有限單元法作為一個(gè)具有鞏固理論基礎(chǔ)和廣泛應(yīng)用效力的數(shù)值分析方法,必將在國民經(jīng)濟(jì)建設(shè)和科學(xué)技術(shù)發(fā)展中發(fā)揮更大的作用,其自身亦將得到進(jìn)一步的發(fā)展和完善。122有限元法解題步驟有限元法求解數(shù)學(xué)物理問題的主要步驟如下:.寫出變分表達(dá)式根據(jù)最小位能原理或虛功原理等變分原理或加權(quán)余量(方程余量與權(quán)函數(shù)正交化)原理,建立起與微分方程初邊值問題等價(jià)的變分方程(區(qū)域上的積分表達(dá)式)。這是有限元方法解題的出發(fā)點(diǎn)。.區(qū)域剖分為了把積分表達(dá)式離散化,根據(jù)求解區(qū)域的形狀以及實(shí)際問題的物理特點(diǎn),將區(qū)域剖分成若干大小不一、兒何形狀規(guī)則的單元,并確定單元中的結(jié)點(diǎn)數(shù)目與位置;然后對(duì)單元、結(jié)點(diǎn)按一定要求進(jìn)行編號(hào),以便在單元上進(jìn)行插值。.確定單元基函數(shù)根據(jù)對(duì)近似解可微性要求,選擇滿足一定插值條件的有局部支集的分片插值函數(shù)為單元基函數(shù),確定單元中結(jié)點(diǎn)數(shù)目及單元形狀函數(shù)。.單元分析單元分析的目的是建立單元有限元方程。將單元中的近似解表示為單元基函數(shù)的線性組合,再將它代入積分表達(dá)式中,并對(duì)單元區(qū)域進(jìn)行積分,就可獲得含有待定系數(shù)的代數(shù)方程組(或常微分方程組)。這個(gè)方程組一般稱為單元有限元方程。實(shí)際做法是采用單元形狀函數(shù)來推導(dǎo)單元有限元方程的系數(shù)矩陣(也稱單元?jiǎng)偠染仃嚕┖陀叶隧?xiàng)(也稱為單元荷載向量)。.總體合成所謂總體合成,就是將區(qū)域中所有單元有限元方程按一定法則進(jìn)行累加,形成總體有限元方程。實(shí)質(zhì)是將分解開的單元積分表達(dá)式重新組合起來,形成總體區(qū)域上的積分表達(dá)式。總體有限元方程中的未知數(shù)正是求解函數(shù)在各個(gè)結(jié)點(diǎn)上的參量(函數(shù)值或其導(dǎo)數(shù)值)。目的就是將單元系數(shù)矩陣合成為總體系數(shù)矩陣。.邊界條件處理自然邊界條件一般在積分表達(dá)式中得到滿足。邊界條件處理主要是如何使本質(zhì)邊界條件上結(jié)點(diǎn)的函數(shù)值滿足指定的本質(zhì)邊界條件。這可以通過對(duì)總體有限元方程按一定法則進(jìn)行修正而實(shí)現(xiàn)。.解總體有限元方程,計(jì)算有關(guān)物理量根據(jù)本質(zhì)邊界條件修正后的總體有限元方程,是含有全部未知量的封閉方程組,可采用合適的數(shù)值計(jì)算方法求解。當(dāng)求出全部待定量后,即可獲得近似解的表達(dá)式,就可根據(jù)題意計(jì)算有關(guān)物理量。面向?qū)ο蟪绦蛟O(shè)計(jì)簡述面向過程的編程方法和面向?qū)ο蟪绦蛟O(shè)計(jì)皿聞近年來,面向?qū)ο蟮募夹g(shù)正在成為一種先進(jìn)的軟件開發(fā)方法,它是一種運(yùn)用對(duì)象、類、繼承、封裝、聚合、消息傳遞、多態(tài)性等概念來構(gòu)造系統(tǒng)的軟件開發(fā)方法,有利于克服基于過程的有限元程序在編制及維護(hù)等許多方面的不足,在系統(tǒng)的可維護(hù)、可重復(fù)使用和可擴(kuò)充方面有了很大的益處,在友好界面及可視化方面也有較好的效果。目前國際上一些非常著名的有限元分析軟件大多數(shù)采用結(jié)構(gòu)化程序(通常采用Fortran語言)來進(jìn)行設(shè)計(jì)。傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計(jì)思想將整個(gè)程序分成若干個(gè)相互獨(dú)立的程序段構(gòu)成一些功能模塊,每個(gè)模塊又可以由若干個(gè)子程序構(gòu)成,用若干個(gè)只有一個(gè)入口和一個(gè)出口的控制結(jié)構(gòu)編寫。程序的定律是:程序=(算法)+(數(shù)據(jù)結(jié)構(gòu))。即算法是程序的獨(dú)立體,數(shù)據(jù)結(jié)構(gòu)也是一個(gè)獨(dú)立的整體。兩者分開設(shè)計(jì),以算法為主。這種傳統(tǒng)的結(jié)構(gòu)化編程模式被稱作是“面向過程”的編程方法。這種方法的優(yōu)點(diǎn)是:程序具有良好的結(jié)構(gòu),易于設(shè)計(jì)、易于理解、易于調(diào)試修改,從而提高程序設(shè)計(jì)和維護(hù)的效率。但是隨著程序編制規(guī)模的增大,其弊端便顯示出來。它把數(shù)據(jù)和過程作為兩個(gè)相互獨(dú)立的實(shí)體。在編寫程序時(shí),必須時(shí)刻考慮所要處理的數(shù)據(jù)格式與算法函數(shù)的調(diào)用關(guān)系。對(duì)于有限元軟件開發(fā)者來說,每次增加舊版軟件的功能(如增加新的分析類型、新算法、新單元等)就要對(duì)原有程序碼進(jìn)行修改和擴(kuò)充。必須再次花很多精力弄清楚原有代碼和隱藏在其中的數(shù)據(jù)與函數(shù)錯(cuò)綜復(fù)雜的關(guān)系,從中分辨出那些代碼在新版軟件中是可保留的,哪些是要修改和補(bǔ)充的,并精心對(duì)上述代碼進(jìn)行重新組合,在保證數(shù)據(jù)安全調(diào)用的基礎(chǔ)上,盡可能提高已有代碼的重復(fù)利用率。隨著軟件功能的增強(qiáng),程序代碼和編程工作量也往往大幅度增加。由于數(shù)據(jù)和代碼的分離,總存在使用錯(cuò)誤的數(shù)據(jù)調(diào)用正確的程序模塊,或使用正確的數(shù)據(jù)調(diào)用錯(cuò)誤的程序模塊的危險(xiǎn)。這樣,使數(shù)據(jù)和程序保持一致便成為軟件開發(fā)者的一個(gè)沉重負(fù)擔(dān)。80年代后期出現(xiàn)的面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP:Object-OrientedProgramming)注重于系統(tǒng)整體關(guān)系的表示和數(shù)據(jù)模型技術(shù),即把數(shù)據(jù)結(jié)構(gòu)與算法作為一個(gè)獨(dú)立功能模塊。程序定律被重新認(rèn)識(shí)為:程序=(算法+數(shù)據(jù)結(jié)構(gòu))。即算法與數(shù)據(jù)結(jié)構(gòu)是一個(gè)整體,算法總是離不開數(shù)據(jù)結(jié)構(gòu),算法含有對(duì)數(shù)據(jù)結(jié)構(gòu)的訪問,算法只能適用于特定的數(shù)據(jù)結(jié)構(gòu)。這是面向?qū)ο蟮某绦蛟O(shè)計(jì)的基礎(chǔ),在面向?qū)ο笾兴惴ㄅc數(shù)據(jù)結(jié)構(gòu)被捆綁成一個(gè)類,從這樣的角度看問題,就不用為如何實(shí)現(xiàn)通盤的程序功能費(fèi)盡心機(jī)。面向?qū)ο蟪绦蛟O(shè)計(jì)所擁有的數(shù)據(jù)抽象和信息隱蔽等機(jī)理以及面向?qū)ο蟮睦^承性、封裝性、多態(tài)性等特性為軟件開發(fā)提供了理想的模塊化機(jī)制和比較理想的軟件可重用成分,現(xiàn)已廣泛應(yīng)用于屏幕界面、數(shù)據(jù)庫、文件管理系統(tǒng)以及其它一些非數(shù)值計(jì)算領(lǐng)域。132目前國內(nèi)外對(duì)OOP編程在工程計(jì)算方面的探索國外將OOP引入有限元的工作大致是從1990年開始的,它們針對(duì)有限元的典型分析步驟提出了各種各樣的類設(shè)計(jì)的方案,這些思想還不夠成熟,也不統(tǒng)一。國內(nèi)在采用面向?qū)ο蠓椒ㄔO(shè)計(jì)有限元程序方面的研究目前正在起步,僅有個(gè)別文獻(xiàn)涉足該領(lǐng)域。文獻(xiàn)[21]主要介紹了面向?qū)ο蟪绦蛟O(shè)計(jì)方法具有的意義和發(fā)展,以及面向?qū)ο笤谟邢拊绦蛑械膽?yīng)用前景。文獻(xiàn)[22]主要以板單元的有限元為例,闡述了采用面向?qū)ο蠓椒ê蚔C++語言進(jìn)行有限元程序開發(fā)的過程。國內(nèi)一些院校如西南交通大學(xué)、大連理工大學(xué)、同濟(jì)大學(xué)、武漢理工大學(xué)等多所高等院校也都在這方面做了比較深入和具體的工作,而求解三維對(duì)流擴(kuò)散方程的面向?qū)ο笥邢拊绦蛟O(shè)計(jì)的文章還相對(duì)較少。本文研究的主要內(nèi)容在傳熱、傳質(zhì)學(xué)研究中,對(duì)流擴(kuò)散問題的數(shù)值求解具有重要的理論和實(shí)際意義。目前,用來求解這一類問題的數(shù)值解法有很多,研究的角度也有所不同。對(duì)于三維定常的對(duì)流擴(kuò)散方程的求解,國內(nèi)外許多學(xué)者也給出了各種數(shù)值方法的求解,但是很多程序開發(fā)的具體實(shí)現(xiàn)一般都采用結(jié)構(gòu)化語言,用面向?qū)ο蟮某绦蛟O(shè)計(jì)語言來開發(fā)相對(duì)較少。本文主要研究Peclet數(shù)較小時(shí),三維定常的對(duì)流擴(kuò)散方程的有限元解法,用面向?qū)ο蟮腃++程序設(shè)計(jì)語言開發(fā)出有應(yīng)用價(jià)值的通用程序,對(duì)相關(guān)的對(duì)流擴(kuò)散問題進(jìn)行數(shù)值模擬。本文的主要內(nèi)容總結(jié)如下:.闡述了本文的研究背景,綜述了面向?qū)ο蟪绦蛟O(shè)計(jì)的基本原理。.采用四結(jié)點(diǎn)四面體單元和八結(jié)點(diǎn)六面體等參數(shù)單元進(jìn)行三維定常對(duì)流擴(kuò)散方程的有限元分析。.用面向?qū)ο蟮某绦蛟O(shè)計(jì)語言C++來具體實(shí)現(xiàn)三維定常對(duì)流擴(kuò)散問題的有限元程序的開發(fā),融入用C++編制的大型通用有限元科學(xué)和工程計(jì)算軟件。.給出了四個(gè)算例,并對(duì)分析結(jié)果進(jìn)行初步討論和評(píng)價(jià),從而驗(yàn)證本文方法的有效性和實(shí)用性。2面向?qū)ο蟪绦蛟O(shè)計(jì)基本原理面向?qū)ο笫且环N試圖模仿現(xiàn)實(shí)世界的方法,它遵循認(rèn)識(shí)方法學(xué)的基本原理,運(yùn)用我們已形成了的對(duì)現(xiàn)實(shí)世界的概念、分類和抽象方法,將現(xiàn)實(shí)世界分成不同的對(duì)象類(class),如“人”、“汽車”、“建筑”等,不同的對(duì)象的組合及其相互作用構(gòu)成了我們要研究分析和構(gòu)造的客觀世界。類與對(duì)象阿2財(cái)類(class)就是種類,是具有共同行為的若干對(duì)象(object)的統(tǒng)一描述體,是對(duì)象的抽象描述。每一類對(duì)象均享有一組屬性(attribute)或行為特征,比如每個(gè)結(jié)構(gòu)構(gòu)件的都有長度、截面積、材料特性等。類是抽象數(shù)據(jù)類型的實(shí)現(xiàn)。一個(gè)類的所有對(duì)象都有相同的數(shù)據(jù)結(jié)構(gòu),并且共享相同的實(shí)現(xiàn)操作的代碼,而各個(gè)對(duì)象的屬性可根據(jù)施加在對(duì)象上的各種因素而變更。因此,類是所有對(duì)象的共同的行為和不同狀態(tài)的集合體。對(duì)象是一種事物,是正在創(chuàng)建的系統(tǒng)中的一個(gè)實(shí)體。從實(shí)現(xiàn)形式上講,對(duì)象是狀態(tài)和操作(或方法)的封裝體。對(duì)象對(duì)于實(shí)現(xiàn)系統(tǒng)的完整功能都是必不可少的。你永遠(yuǎn)不會(huì)寵愛貓的定義,你只會(huì)將單個(gè)貓作為寵物。你會(huì)在貓的概念和在你的起居室到處跑的特定的貓之間化一條明確的界限。各個(gè)類的對(duì)象間通過消息進(jìn)行通信。所謂消息,實(shí)際上是一個(gè)類的對(duì)象要求另一個(gè)類的對(duì)象執(zhí)行某個(gè)服務(wù)指令,指明要求哪一個(gè)對(duì)象執(zhí)行這個(gè)服務(wù),必要時(shí)還要傳遞調(diào)用參數(shù)。系統(tǒng)功能的實(shí)現(xiàn),就是通過一系列對(duì)象消息的傳遞,執(zhí)行--系列服務(wù)達(dá)到的。對(duì)象類和對(duì)象兩者是不同的,對(duì)象類是對(duì)具體對(duì)象的抽象(abstraction),對(duì)象是對(duì)象類的實(shí)例化(instance)。比如,你、我、他是人類,我們每一個(gè)人是人類這個(gè)對(duì)象類的單個(gè)實(shí)例。面向?qū)ο蟮幕咎卣骶W(wǎng)封裝(encapsulation)封裝是將數(shù)據(jù)和對(duì)該數(shù)據(jù)進(jìn)行合法操作的函數(shù)封裝在一起作為一個(gè)類的定義。封裝的類有一個(gè)類名,程序中由類名說明對(duì)象實(shí)例。由于對(duì)象的封裝性,外界只能看到對(duì)象界面上的消息,或稱接口(功能函數(shù)),對(duì)象內(nèi)部(數(shù)據(jù)和功能函數(shù)的具體代碼)對(duì)外界是隱藏的,其目的是將對(duì)象的使用者和對(duì)象的設(shè)計(jì)者分開,使用者不必知道對(duì)象功能實(shí)現(xiàn)的細(xì)節(jié),而只需用設(shè)計(jì)者提供的消息來訪問對(duì)象。就如同你可以使用冰箱而不必關(guān)心其壓縮機(jī)的工作原理一樣,用戶也可以使用一個(gè)設(shè)計(jì)優(yōu)良的對(duì)象而不必了解其內(nèi)部的數(shù)據(jù)成員。封裝的另一個(gè)好處是類的內(nèi)部改造不會(huì)影響外界其他部分。繼承(inheritance)繼承提供了創(chuàng)建新類的一種方法,這種方法就是說,一個(gè)新類可以通過對(duì)已有類進(jìn)行修改或擴(kuò)充來滿足新類的要求。新類共享已有類的行為,而自己還具有修改的或額外添加的行為。因此,可以說繼承的本質(zhì)特征是行為共享。一個(gè)類從另一個(gè)類繼承特征,稱為派生一個(gè)類,所派生的類稱為派生類或子類(subclass)。其上一?層的那個(gè)類稱為基類或父類(superclass)。類的派生過程可以無限下去。派生類從基類中繼承特征,從而實(shí)現(xiàn)已有功能模塊的可重用性。派生類在繼承基類所有方法和屬性的同時(shí),還可以加入其自身的方法和屬性,從而實(shí)現(xiàn)功能模塊的可擴(kuò)充性。比如,我們可以通過建立一個(gè)單元類(基類)來派生出各種具體的單元類(子類),如平面單元類、梁單元類等等,而平面單元類(這時(shí)是基類)又可以派生出三結(jié)點(diǎn)平面單元類、四結(jié)點(diǎn)平面單元類等子類。繼承可以讓你重用父類的代碼,專注于為子類編寫新代碼。多態(tài)性(polymorphism)多態(tài)性就是同種操作具有多種形態(tài),在C++中,多態(tài)性乂被直觀的稱為“?個(gè)名字,多個(gè)函數(shù)它主要是通過函數(shù)名重載實(shí)現(xiàn)的。重載函數(shù)是指程序中對(duì)同名函數(shù)進(jìn)行調(diào)用時(shí),編譯器會(huì)根據(jù)函數(shù)參數(shù)的類型和個(gè)數(shù),決定該調(diào)用哪一段函數(shù)代碼來處理這個(gè)函數(shù)調(diào)用。在C++中,多態(tài)性的實(shí)現(xiàn)與聯(lián)編這一概念相關(guān)。一個(gè)操作函數(shù)的調(diào)用與適當(dāng)函數(shù)代碼相對(duì)應(yīng)的動(dòng)作,叫做聯(lián)編。聯(lián)編分為靜態(tài)聯(lián)編和動(dòng)態(tài)聯(lián)編。在程序編譯時(shí)就確定哪個(gè)重載函數(shù)被調(diào)用的,稱為靜態(tài)聯(lián)編。直到程序運(yùn)行時(shí)才能確定哪個(gè)重載函數(shù)被調(diào)用的,稱為動(dòng)態(tài)聯(lián)編。多態(tài)性也分為靜態(tài)和動(dòng)態(tài)兩種。靜態(tài)多態(tài)性是指定義在一個(gè)類或一個(gè)函數(shù)中存在的同名函數(shù),它們可根據(jù)參數(shù)表(類型及個(gè)數(shù))區(qū)別語義,并通過靜態(tài)聯(lián)編實(shí)現(xiàn)。例如,常用的加法,整數(shù)相加得到整數(shù),復(fù)數(shù)相加得到復(fù)數(shù),矩陣相加得到矩陣。同樣是加法操作,針對(duì)不同的對(duì)象可有不同的操作形態(tài)而產(chǎn)生不同的執(zhí)行結(jié)果。動(dòng)態(tài)多態(tài)性是指定義在同一個(gè)類層次中的不同類中的重載函數(shù),它們一般具有相同的參數(shù)表,因而要根據(jù)指針指向的對(duì)象所在類來區(qū)別語義,并通過動(dòng)態(tài)聯(lián)編實(shí)現(xiàn)。例如,對(duì)于從同一個(gè)基類圖形類派生出來的兩個(gè)子類三角形類和圓形類,有名稱相同的操作(函數(shù))求面積,但三角形和圓形要采用各自的計(jì)算公式。10面向?qū)ο蟮某绦蛟O(shè)計(jì)?算法與數(shù)據(jù)結(jié)構(gòu)面向?qū)ο蟮某绦蛟O(shè)計(jì)的本質(zhì)時(shí)把數(shù)據(jù)和處理數(shù)據(jù)的過程當(dāng)成一個(gè)整體——對(duì)象,因此,面向?qū)ο蟮某绦蛟O(shè)計(jì)的基礎(chǔ)是類。類是C++的基本單元,它是由結(jié)構(gòu)型數(shù)據(jù)演化而來的。結(jié)構(gòu)型數(shù)據(jù)是將事物用兒種基本數(shù)據(jù)類型作為整體來描述某一事物。如人的結(jié)構(gòu)型數(shù)據(jù)可描述為:structperson{charname[20];intage;floatweight;floathight;卜結(jié)構(gòu)型數(shù)據(jù)是一般結(jié)構(gòu)化語言對(duì)事物的描述方式,它比用基本的實(shí)數(shù)、整數(shù)來描述事物要先進(jìn)一步。類是結(jié)構(gòu)型數(shù)據(jù)的進(jìn)一步演化。類結(jié)構(gòu)是將描述事物的數(shù)據(jù)和處理數(shù)據(jù)的函數(shù)作為整體來描述事物。圖2.1算法與數(shù)據(jù)結(jié)構(gòu)關(guān)系類結(jié)構(gòu)是軟件方法的發(fā)展必然。較早的軟件開發(fā)用結(jié)構(gòu)圖2.1算法與數(shù)據(jù)結(jié)構(gòu)關(guān)系程序=(算法)+(數(shù)據(jù)結(jié)構(gòu))。即算法是一個(gè)獨(dú)立的整體,數(shù)據(jù)結(jié)構(gòu)也是一個(gè)獨(dú)立的整體。兩者分開設(shè)計(jì),以算法(函數(shù)或過程)為主。見圖2.1o圖中的虛線表示上面的算法與下面的數(shù)據(jù)分離。雙箭頭表示作為黑盒的函數(shù)輸入輸出的數(shù)據(jù)。隨著時(shí)間的流逝,軟件工程師越來越注重于系統(tǒng)整體關(guān)系的表示和數(shù)據(jù)模型技術(shù),即把數(shù)據(jù)結(jié)構(gòu)與算法作為一個(gè)獨(dú)立功能模塊。程序定律被重新認(rèn)識(shí)為:程序=(算法+數(shù)據(jù)結(jié)構(gòu))。即算法與數(shù)據(jù)結(jié)構(gòu)是一個(gè)整體,算法總是離不開數(shù)據(jù)結(jié)構(gòu),算法含有對(duì)數(shù)據(jù)結(jié)構(gòu)的訪問,算法只能適用于特定的數(shù)據(jù)結(jié)構(gòu)。這是面向?qū)ο蟮某绦蛟O(shè)計(jì)的基礎(chǔ),在面向?qū)ο笾兴惴ㄅc數(shù)據(jù)結(jié)構(gòu)被捆綁成一個(gè)類,從這樣的角度看問題,就不用為如何實(shí)現(xiàn)通盤的程圖2.2構(gòu)成程序的對(duì)象Fig.2.2Theobjectsofprogram序功能費(fèi)盡心機(jī)?,F(xiàn)實(shí)世界本身就是一個(gè)對(duì)象的世界,任何對(duì)象都具有一定的屬性與操作,也就總是能用數(shù)據(jù)結(jié)構(gòu)與算法兩者合一地來描述。這時(shí)候,程序被再次另眼相看:對(duì)象=(算法+數(shù)據(jù)結(jié)構(gòu)),程序=(對(duì)象+對(duì)象+…)。即程序就是許多的對(duì)象的組合,而對(duì)象又是一個(gè)個(gè)程序?qū)嶓w。人們不再靜止的去看待數(shù)據(jù),而把它看成是程序的單位,一個(gè)程序的分子或?qū)ο?。它本身不但包含算法而且包含?shù)據(jù)結(jié)構(gòu)。對(duì)象中可以包含小的對(duì)象,它也可能含于其它對(duì)象之中。見圖2.2o2.3.2面向?qū)ο蠓治龊驮O(shè)計(jì).面向?qū)ο蠓治?OOA-objectorientedAnalysis)面向?qū)ο蠓治龅哪康氖峭瓿蓪?duì)問題空間的分析和建立系統(tǒng)模型。其具體任務(wù)是確定和描述系統(tǒng)中的對(duì)象、對(duì)象的靜態(tài)特性和動(dòng)態(tài)特性。對(duì)象間的關(guān)系及對(duì)象的行為約束等。其主要內(nèi)容歸結(jié)為靜態(tài)結(jié)構(gòu)分析和動(dòng)態(tài)行為分析。a.靜態(tài)結(jié)構(gòu)分析靜態(tài)結(jié)構(gòu)描述對(duì)象、類以及類間的相互關(guān)系。靜態(tài)結(jié)構(gòu)分析首先要確定對(duì)象和對(duì)象類。對(duì)象是一種具有簡明界面及應(yīng)用意義的實(shí)體的抽象。所有對(duì)象都具有唯一的標(biāo)識(shí),可予以區(qū)分。對(duì)象類描述的是一組具有共同屬性、操作和語義特征的對(duì)象,其中屬性是對(duì)象的性質(zhì),操作是對(duì)象的行為。在確定了對(duì)象和對(duì)象類的基礎(chǔ)上,還要確定對(duì)象類之間的關(guān)系。對(duì)象類之間的關(guān)系主要有:層次關(guān)系和聚合關(guān)系。在分析過程中根據(jù)類的共性及個(gè)性將類組織成不同層次。高層次的類表達(dá)共性形成基類;低層次的類表達(dá)個(gè)性,形成子類。子類通過繼承機(jī)制來獲得基類的屬性和操作。這就是層次關(guān)系。聚合關(guān)系是對(duì)象之間的組合構(gòu)造關(guān)系。例如,單元對(duì)象中涉及到剛度矩陣的計(jì)算,同時(shí)單元對(duì)象的許多數(shù)據(jù)都來自結(jié)點(diǎn)對(duì)象,因此單元類中就包含有矩陣類和結(jié)點(diǎn)類,當(dāng)然還有材料類、荷載類等。b.動(dòng)態(tài)行為分析動(dòng)態(tài)行為描述了系統(tǒng)中對(duì)象的合法狀態(tài)序列,它包括兩方面內(nèi)容:一是單個(gè)對(duì)象自身的生命周期演化;二是整個(gè)對(duì)象系統(tǒng)中對(duì)象間的消息傳遞和協(xié)同工作。這部分內(nèi)容需要結(jié)合具體程序說明,此處不再詳述。.面向?qū)ο笤O(shè)計(jì)(OOD-ObjectOrientedDesign)面向?qū)ο蟮脑O(shè)計(jì)是確定問題的解決方案的過程。面向?qū)ο笤O(shè)計(jì)的涉及面有大有小,結(jié)構(gòu)分析軟件的設(shè)計(jì)涉及用戶界面、系統(tǒng)數(shù)據(jù)結(jié)構(gòu)、系統(tǒng)資源分配、數(shù)據(jù)交換存儲(chǔ)、圖形顯示等許多方面。綜合起來,面向?qū)ο笤O(shè)計(jì)包括對(duì)象設(shè)計(jì)和系統(tǒng)設(shè)計(jì)兩方面的內(nèi)容。a.對(duì)象設(shè)計(jì)12對(duì)象設(shè)計(jì)以對(duì)象分析為基礎(chǔ),分析過程已給出對(duì)象模型。在設(shè)計(jì)對(duì)象時(shí)可根據(jù)需要進(jìn)行擴(kuò)展,增加和優(yōu)化屬性數(shù)據(jù)及功能操作,對(duì)分析中為考慮周全的類關(guān)系進(jìn)行調(diào)整,盡可能利用繼承的優(yōu)點(diǎn),提高代碼的復(fù)用程度。b.系統(tǒng)設(shè)計(jì)系統(tǒng)設(shè)計(jì)是為了實(shí)現(xiàn)需求目標(biāo)而對(duì)程序的系統(tǒng)結(jié)構(gòu)進(jìn)行的總體設(shè)計(jì)。通過程序系統(tǒng)的調(diào)用各對(duì)象功能操作,達(dá)到解答問題的目標(biāo)。通常系統(tǒng)結(jié)構(gòu)本身也包含在對(duì)象內(nèi)部。系統(tǒng)設(shè)計(jì)主要包括下列內(nèi)容:數(shù)據(jù)的出去和處理設(shè)計(jì),用戶接口及相應(yīng)過程設(shè)計(jì),系統(tǒng)組織設(shè)計(jì)等。2.4面向?qū)ο蟪绦蚓幊毯烷_發(fā)工具面向?qū)ο蟮某绦蛟O(shè)計(jì)語言有許多,其中的C++以其高效實(shí)用性被應(yīng)用于程序設(shè)計(jì)的眾多領(lǐng)域,功能強(qiáng)大的開發(fā)環(huán)境和許多技術(shù)成熟的應(yīng)用類庫使C++編程效率大大提高。許多程序的開發(fā)和已有程序的二次開發(fā)都采用了C++。比如,Windows程序的編寫,AutoCAD二次開發(fā)工具ObjectARX等。C++由C改進(jìn)擴(kuò)充而來,包含了C的全部特征,添加了對(duì)面向?qū)ο缶幊痰娜嬷С帧V饕ǎ嚎蛇M(jìn)行類定義;為類提供了數(shù)據(jù)操作的函數(shù)及操作符;為類提供了構(gòu)造方法及析構(gòu)方法;對(duì)類內(nèi)部的數(shù)據(jù)結(jié)構(gòu)進(jìn)行了封裝性的劃分;提供了對(duì)繼承關(guān)系及多重繼承的支持;提供了對(duì)多態(tài)性及函數(shù)重載的支持等。因此,本文采用VisualC++6.0來進(jìn)行三維對(duì)流擴(kuò)散問題的有限元分析程序的開發(fā)。133三維對(duì)流擴(kuò)散問題的有限元分析對(duì)流擴(kuò)散現(xiàn)象在研究環(huán)境保護(hù)的流體力學(xué)中是經(jīng)常遇到的。流體中的污染物包括化學(xué)的、生物的或熱的污染,在流體介質(zhì)中的彌散是環(huán)境保護(hù)問題中越來越重要的研究課題。本章將研究三維定常的對(duì)流擴(kuò)散方程的有限元數(shù)值解法,主要闡述三維定常的對(duì)流擴(kuò)散方程的有限元分析過程。概述三維對(duì)流擴(kuò)散方程對(duì)流擴(kuò)散方程是流體力學(xué)中的典型方程,連續(xù)方程、動(dòng)量方程、能量方程都可以寫成對(duì)流擴(kuò)散方程的形式。根據(jù)方程(1.1),在定常的粘性不可壓縮流體流動(dòng)的對(duì)流擴(kuò)散問題中,假定求溶解于流體中的物質(zhì)的濃度U在流動(dòng)過程中的變化規(guī)律,則U所滿足的控制方程為:TOC\o"1-5"\h\zJ(包、 8uD ——ku=finQ,i=1,2,3, (3.1)&Idxi) 加邊界條件為:U=UoonTi,(3.2)duq=Di ni=q。ox,on「2,(3.3)TOC\o"1-5"\h\z其中具有光滑邊界,r.ir2=0的區(qū)域CU33R3,邊界「上的單位外法向r r,幾,n ,v,v數(shù),物質(zhì)的分解速率系數(shù)為k,這里〃。,q。,/為已知函數(shù)。本文不妨設(shè)方程(3.1)中的坐標(biāo)系(Xi,X2,X3)為三維笛卡兒直角坐標(biāo)系(”z),則在直角坐標(biāo)系(蒼乂z)中,三維定常的對(duì)流擴(kuò)散方程為:d(du、d( 3( duonTi, (3.5)onronTi, (3.5)onr2, (3.6)u(x,y,z)=uo(x,y,z)du a“ a”p.dx dy 6z聯(lián)立(3.4)、(3.5)和(3.6)式,就是三維對(duì)流擴(kuò)散問題的定解問題。此時(shí)具有光滑邊I-Vi量〃=(〃l23),流場中流體的速度為V=(V.23),物質(zhì)在三個(gè)方向上的擴(kuò)散系I-ku=/inQ,I-ku=/inQ,(3.4)山+。 盟+。*妊伏(工,y,z),v,v ,D,D質(zhì)的分解速率系數(shù)為&,且有〃。,歟,/為已知函數(shù)。3.1.2變分方程.散度定理設(shè)「是m維空間區(qū)域C的邊界,且邊界「是分片光滑閉曲面。如果函數(shù)P(X)[i=l,2,L,zn,X=(孫X2,Lx“)]及其一階偏導(dǎo)數(shù)在閉區(qū)域。上連續(xù),則有m mcos(n, (3.7)則可寫成向量形式(3.8)此式稱為散度定理(Divergencetheorem).變分方程設(shè)任意口(x,y,z)wCi(C),且(p(x,y,z)h=00用中乘方程(3.4)的兩端,并在C上求積分。)(pdfldm d)(pdfl(D,dxi dyi dZ2這里,d2Ud2iid2U0x2dyi0Z2dd(u此時(shí)根據(jù)散度定理(3.8),則可得到,I(Dm,n.+Du,小+°必)峭r界「=「11£,rjr2=0的區(qū)域qu*R3,邊界「上的單位外法向量〃=(%,:),流場中流體的速度為「=(口>「),物質(zhì)在三個(gè)方向上的擴(kuò)散系數(shù)(D,,力,物0普dC=j£p,)d「n是「的外法線。式(3.7)是m維情況下的高斯(Gauss)公式。如果用P表示向量,VgPJQ=\pgndV?▽”?(pdC-JktupJQ=J/(pdQ+D\u?▽〃?(pdC—Jku中dQ=J/(pdC+Dy+Dz豆3<p)+用軀。-J(-J(Dxxxyyy而q)(x,y,z)h=0,所以1q(pd==1q(pd「+Lq(pd「=Ji:qo(pd「因此,邊值問題(3.413.6)的變分方程為,(£)vWt(Pv+£)v?y(Py4-D〃傘)dfl(3.9)四面體單元為了把變分表達(dá)式離散化,根據(jù)求解區(qū)域的形狀以及實(shí)際問題的物理特點(diǎn),將區(qū)域剖分成若干大小不--、兒何形狀規(guī)則的單元,并確定單元中的結(jié)點(diǎn)數(shù)目與位置;然后對(duì)單元、結(jié)點(diǎn)按一定要求進(jìn)行編號(hào),以便在單元上進(jìn)行插值。首先對(duì)三維對(duì)流擴(kuò)散問題采用四結(jié)點(diǎn)四面體單元進(jìn)行單元分析,建立單元?jiǎng)偠染仃嚺c單元載荷向量。321位移函數(shù)最簡單的三維單元是四結(jié)點(diǎn)四面體單元。我們對(duì)區(qū)域c作四面體單元剖分,單元e.(”=1,2,L,NE),結(jié)點(diǎn)(四面體頂點(diǎn))p,(x,,y,z,)(i=1,2,L,NP)。設(shè)m(X/,y-,Zi)=w(pi)=m,(i=l,2,L,NP),任取單元e,它的四個(gè)頂點(diǎn)是pt,P),pm,pi,記為e=(pi,pj,pm,pl)o它們的排列順序按右手準(zhǔn)則,即p>,pj,pm按右手螺旋旋轉(zhuǎn)時(shí),p,在拇指方向(如圖3.1所示)。P'P,J(D邛甲武?!暧?方8也?|\,?Vw,(pdQ-Jku^dQ=J/(pdC^Dxxxyyyzzz^Dxxxyyyzzz)</Q+pmv-V”?(pdC+Jku(pdQ=Jq(pdf-]/(pdC圖3.1圖3.1四面體單元Figure3.1Thetetrahedralelement由u在四頂點(diǎn)的值,恰好祚單元內(nèi)可以隼定一線性單值。即茸令
+Jy?V〃(pdQ+Jk〃(pdQ=Jq()(pdT-jf(pdQu=aix+a?y+oi3z+oi4 (J.1U)16則它滿足[m;=CLtXi+CLiy,+a.3Zi+cu\uj=aixj+a.2yj+a?zj+oi41ui=aix/+azy/+a?z/+ou解出ai、a?、ou、a4代入(3.10)再適當(dāng)整理可得U=Ni〃i+NjUj+NmUm+NlUl=IN]{3}e (3.11)其中1xyz 1xyt11Xj yjh 11x yINi= , Nj= ,6Ve1Xin y(n& 6Ve1Xm Z?ix, y : i x, y :1Xi yt v 1 Xi y> Zi11Xj yj: 11Xj yjZjNm= , Nl=6Ve1X y' 6Ve1Xm Z>nt\Xi yi 1 yzX此處匕代表四面體e的體積,1Xi y. Zi11Xj Vj ZjV,二一 (3.12)61Xm ym Z"i1Xi yi Zt[N]=[N Nj iV.Ni]{8}e=[Ui Uj Um Ul]r若記| 「 iM=6],[ax+b,y+c,z+d<] = (3.13)則1 yj Zj 1 Xj zjUi——1y>n Z>n9 bi—1 XmZ91 yi Zl 1 Xi zi1 Xj yj Xj yj ZjCi——1Xm ym, di—Xm y”i1 Xi yi Xi y, N其余的G,b,,a,乩(S=_/,"/)亦可照此排列方式類似寫出。但必須注意不能I=aiXm+a2 +ouzm+ou
Clmdlj像平面問題那樣循環(huán)轉(zhuǎn),因?yàn)樗荒鼙WC適合右手準(zhǔn)則。例如就不適合。凡在原排列中排序?yàn)榕紨?shù)的(例如j排序?yàn)?),若以它為首開始循環(huán),則剛好反向,這時(shí)只要按原公式乘(-1)Clmdlj1ymZm1XmZmaj=1 yiZi,bj=-IXiZi,1yt尊1XiZi1Xm*XmymZfMCj=1 Xiy/,dj=Xi1日,1XiXy霹Zi1XlZIam=1y>Zi,bm—1XiZi,Zi1XjZj1XiVXIyiztCm=—1Xiy,dm-Xi■Zi,1XjyiXjZj1yZi1XiZiai=\ yjZj,bi=-1XjZj,1ymZm1XmZm1XiyXi小Cl=1 Xjy,,di=XjyjZJ1XmymXmyM的梯度向量V"=[g"dxduSy]可表為:「1fjMSNidNmM1Idxdx11SyduI1dNidNjdNmSydy洲1{5b=[B]{5}e1(3.14)1. dN_idNmI1dzdzi不妨令「dN,LdeGNidedNmdNi^de(c=X,y,z)(3.15)則叼=6;依durdzTOC\o"1-5"\h\zII\dx dxI尸產(chǎn) ay I_j迪 dNi IIL&U\_dz dz JdeJ
TOC\o"1-5"\h\z\o"CurrentDocument"1 I[^]=e[b.bjb,nbi], [B:]=[aCjCmct]ol> OK「BJ b|「8、[「加[fi]=11By111 UILb.-U因此,■:
I1118-31118-3一〃一(3.16)一=[B.]{3}<.(c=x,y,z)曲(3.16)322單元?jiǎng)偠染仃囎兎址匠?3.9)按剖分單元改寫為NE NEu(p+£)〃(p+。〃(pen en(3.17)單兀e:ptp>p?,pi,函數(shù)“(x,y,z),別為Us> ?,?,o〃(x,y,z)=[N]{3}‘(p(x,y,z)=[AT]{8?}?r”r[B-]{8}ju1鬧1111l}11Ldz1JJ(Dm(P. 四 (9>?+D(9)tii+D(仰itT T Tef* 3 5rr rCU CU1 ;+V,7(p(x,y,z)在結(jié)點(diǎn)p5(s=i,j,m,l)上的函數(shù)值分{8}e=[UiUjUmUi]t*Um*u*i]rrd(p11「田,]{3小1,L1*1SyIL5zIJ*fl+v;,)dxdydz2J[Dxxxyyyn=l其中rnIdxI|&|=|B|{5}=|[fi]{5}IILr-UIL[r-"」zz二)dC+ZJv-Vw-(pr/Q,=1+ZJku(pdQ=ZJ<7?<pdr-ZJ/(pJQn=l n=l“I「2,若「2與 不相交,則jqo(pd「=0{3*}f=[uiu*IdxI IdxIlal=l[8]{3}I V(p=| |=|[Bv]{5},IIL&'U 曳|I[叼{&J」+Oyyy工工二)dxdydz~j(。*xxyyyzzz)(lxdydz=@}〃[J(dM]W丹2【4][p[+2[8][8])dxdydZ]sesu048v-Vw?(pdxdydz=TOC\o"1-5"\h\z={3,}小],{3}‘這里[k]e為單元?jiǎng)偠染仃嘥 T Te(3.18)T T T T(3.18)e e很顯然伙卜是4x4矩陣kitekije kime hIK kejj kejm,kmjeLkli履h||4x4h=I(D,dxdx0ydy
dzdz)dxdydz+vN323單元荷載向量f<pdxdydz=I(<p)rfdxdydz={6>}tlf[N]rdxdydz={5-}r{F},(3.20)(3.21){Fi}r=I/[]rdxdydz=[Fi,F\e)F\(mFnr(3.20)(3.21)Fi?=[fN,dxdydz=如果單元e不是邊界單元或者單元e是邊界單元,且若「與de不相交,則單元荷載向量{尸},=-{尸?。喝绻麊卧猠是邊界單元,且若R與灰相交,設(shè)r=de\Vi是其邊界,則有o qods={3,}rJ飲[N]rds={3*}r{B}c={3.}〃[J(v』N]叫「[NJ[BJ+“N][B])dxdydz\{5}Jk〃(pdxdydz=jk(<p)udxdydz(Ll[N][N]dxdydz){6},[(DvK<P即P〃*10(M<PVw?(p)+(Z〃(p)]dxdydz={6?卜[][B.]+Dt[B>][]+D[B;][B;])dxdydz+](v.[N][B,]+v,[/V][B,]+v;[N][B:])dxdydz+\k[N][N]dxdydz]{^>},=J(dI4][41+0UJ[B]+D[微分以+J(v,[N]x[B]+v[/V][B]+J]^^|此+\k[N][N]dxdydzkmlc|單元?jiǎng)偠认禂?shù)k為如辿+於@」加迎f8N,dN,dN, f+JW- +丫… :, )dxdydz+JkN,,dxdydz(s,t=i,j,mJ)(3.19)[q(pd「=J(<p)[^]rJ5=[FF勿 [^]rJ5=[FF勿 Fie1]r(3.22)"Mze(3.23)Fze=JrOoN,ds(s=i,j,m,l)如果單元荷載向量統(tǒng)一記為{用‘,則有(3.23)(1)如果單元e不是邊界單元或單元e是邊界單元,且若「與良不相交,則{尸一{E},;(2)如果單元e是邊界單元,且若口與加相交,貝IJ{用,={氏}‘-{R},。整體分析為了形成總剛度矩陣和總荷載向量,把單元?jiǎng)偠染仃?,單元荷載向量的表達(dá)式代入(3.17)式,為了便于疊加,對(duì){3},,{用,和[kh進(jìn)行擴(kuò)充,擴(kuò)充為NP維向量和NPxNP階方陣。對(duì)某一個(gè)單元e來說,頂點(diǎn)p,,p/,p“,p,保持為原如圖順序,但編號(hào)也可能不依次了,即i,/大小不定。如j<i<m<I其中沒寫完整,中間其它不是系數(shù)的為Oo在擴(kuò)充以后,我們可以疊加:(3.24)NE NE〃=l n=l元?jiǎng)偠染仃嚭蛦卧d荷向量的元素按腳標(biāo)編號(hào)對(duì)號(hào)入座放到總剛度矩陣和總載荷向量的相應(yīng)位置上去,進(jìn)行疊加而成。leiIl 的l11TOC\o"1-5"\h\z{用,=|M| [口‘="’ ’e eU LLJ£{>}〃"[&]“{3},"=Z{3}“”{F},“加}(Z伙卜){3}={3?}(Z{用 Q{5-}([*]{5}-{F})=0這里伙]=2伙]“ {F}=Z{F},“分別為總剛度矩陣和總荷載向量。它們都是由單約束條件的處理自然邊界條件一般已在變分方程中得到滿足,本質(zhì)邊界條件需要通過對(duì)總體有限元方程的修正,使其滿足。實(shí)質(zhì)上是在近似解表示為總體基函數(shù)線性組合的表達(dá)式中構(gòu)造一個(gè)滿足本質(zhì)邊界條件的特解。如果結(jié)點(diǎn)p,G「(r=1,2,L,NP)即要使u(pr)=Uo(pr)@UOr則 l:=k,r0:=的,& (_/=l,2,L,NPr)r
QF-kirUo:=F (i*r)如果另有點(diǎn),繼續(xù)采用類似的方法來處理。按此想法,約束邊界條件也可以這樣來處理,就是將已給出本質(zhì)邊界值UOr的所在行列的全部元素去掉,右端項(xiàng)元素中將第r個(gè)元素去掉,其余元素仍按前面方法處理為F-k,rU0(i=l,2,L,NP,且,如果有兩個(gè)以上本質(zhì)邊界結(jié)點(diǎn),則按上述規(guī)則逐個(gè)進(jìn)行。這個(gè)方法可以使系數(shù)矩陣的階數(shù)減小,但是由于縮減后的矩陣,原先的下標(biāo)序號(hào)已經(jīng)打亂,應(yīng)重新編號(hào)。最后,解線性代數(shù)方程組,求結(jié)點(diǎn)的值。再求單元內(nèi)u(x,y,z)的值?(x,y,z)=Nm+Njuj+L+Niui (x,y,z)we“,但是u|n=uo。八結(jié)點(diǎn)六面體等參數(shù)單元對(duì)于空間問題,經(jīng)常使用等參數(shù)單元,而且效果顯著。這里研究經(jīng)常采用的八結(jié)點(diǎn)六面體等參數(shù)單元。從局部坐標(biāo)系化E")下的母單元開始,它是一個(gè)將單元的中心設(shè)為坐標(biāo)原點(diǎn)、邊長為2的正立方體,正立方體的八個(gè)頂點(diǎn)取為單元的結(jié)點(diǎn),如圖3.2所示。Iq 1m n圖3.2六面體單元Figure3.2ThehexahedronelementU:-Fru(x,y,z)=[N]eum6ew6f (3.25)其中,[N]=[N,NiNtMNmN?NPTV,]{8}<?=[ttiUjUkUiUrnUnUpUi]r并且,N*=N.也,T|,q)(s=i,j,k,l,m,n,p,q),M(3,T], (s,t=i,j,k,1,m,n,p,q)10(5豐t)1(s=i,j,n,p,q)(3.26)8在空間任給八個(gè)對(duì)應(yīng)結(jié)點(diǎn)的整體坐標(biāo)值,則由上述形函數(shù)便可決定一個(gè)八結(jié)點(diǎn)等參數(shù)單元。相應(yīng)的坐標(biāo)變換是1 (3.27)I其中(x,,ys,z.)(s=i,j,k,l,m,n,p,q)是給定的單元八個(gè)結(jié)點(diǎn)的整體坐標(biāo)。當(dāng)一個(gè)自變量固定時(shí),四位移函數(shù)是另外兩個(gè)自變量的雙線性函數(shù),因此,在立方體單元的每個(gè)側(cè)面上,該插值函數(shù)由該側(cè)面上四個(gè)結(jié)點(diǎn)的函數(shù)值惟--確定。因而,在相鄰單元的公共面上,只要在其四個(gè)公共點(diǎn)上的函數(shù)值相同,位移函數(shù)一定是連續(xù)的,即在局部坐標(biāo)下滿足協(xié)調(diào)性的要求。由插值函數(shù)式的協(xié)調(diào)性即可保證坐標(biāo)變換式的協(xié)調(diào)性,同時(shí)保證了整體坐標(biāo)下位移函數(shù)的協(xié)調(diào)性。?的梯度向量V“=[乎]可表為:oxdy「色1「磔dNidNkdNidiLndNndNj,碼]18xdxdxdxdxdx1du11dNi8NidNkdNidNn,dNndNP碼'/XISyBySySySySy118N,dNkdNidN.dNn迦1.1dzdzdzdzdzdz1=[B]{8h一“ dN,迦dNkdN1SNadNndNr\遠(yuǎn)不妨令=[_ _ _ —oc de oc dededededeJ(c=x,y,z)(3.28)m&,rj,q)=(i+)(i+H'H)(1+GC)fx=Zm化,n,q)x,[),=ZM,《,n,4)y:尿ji;i:dxI
dydxI
dyI&JIdxI|qxIcbII?'IL^UL-
r8j網(wǎng)=11By||ILb-Ub1「8Ju因此,I1du11Ldz\一du~=[Be]{8}e(c=x,y,z) (3.29)在空間問題中,位移u是整體坐標(biāo)x,y,z的函數(shù),又x,y,z又是局部坐標(biāo)匕,r),。的函數(shù),形函數(shù)N,化,“工)是用局部坐標(biāo)給出的,根據(jù)偏微分法則,可知(3.30)同理可寫出皿制如,集合起來,得到3r| /「SNsl「@「SNsl「@I11IdMII_6xIII優(yōu)出dx\dzl11 1II加11 1111dN,I1 1UII出dz11IIdNs1111加1%II&11dz1(3.31)由于形函數(shù)是用局部坐標(biāo)給出的,上式左端可根據(jù)Mg,n,c)求出。另外,由坐標(biāo)變換公式可求出矩陣叫,此矩陣稱為雅可比矩陣,即[8x出&~l「一皿1小1她 型\dx西dy奧11dz11-I *加la心恥彷}=囑]㈤118r\dv\西111b:11*M{弭IJl@出dz\\_dNs dN, 洲,1叉照」L-424dN,dN,dxdNsdydM&閨優(yōu)I西1=1的La;J[%&~1「8Ml 「閨優(yōu)I西1=1的La;J[%dE,Idx?-dx-\Sr|IIII""分?-JLJLJ1死11Z比X5X比X比[小11=1Z的■工即Xsr|L-IlZ/Xs工式Eaqj「一狙T膽11 比LIyi必1I 狙L制為1L !1yjziLL|1=M[x](3.32),狙1L丫口411生或生IJrdN,dNi皿1|更奧IIiytz11dN迦1dxy為L 1,1.t zLLII(3.33),迦T IhzILa;買Lku對(duì)矩陣[J]求逆后,由式(3.31)可得到形函數(shù)在整體坐標(biāo)中的導(dǎo)數(shù)如下:「Ml1 1「迦]1 11 11dN.|=1 11 1J-JdNs|1 1(3.34)111dN?11 11年I根據(jù)(3.17)式,與四面體單元類似,可求出采用八結(jié)點(diǎn)六面體等參數(shù)單元時(shí)的單元?jiǎng)偠染仃嚭蛦卧奢d向量。1比1則1Sr]比11「的dN,IIXj3r)||LdNdN,IILx? J1%[y]=i(Ml y」||劭I葉心Ml 必,UIdyI[]Mt]IILazUILazUL區(qū)」4面向?qū)ο蟮娜S對(duì)流擴(kuò)散問題有限元分析程序?qū)崿F(xiàn)面向?qū)ο蟪绦蛟O(shè)計(jì)方法是一種新興的程序設(shè)計(jì)方法,或者說是一種新的程序設(shè)計(jì)范型。該方法強(qiáng)調(diào)直接以問題域中的事物為中心來思考問題、認(rèn)識(shí)問題,并根據(jù)這些事物的本質(zhì)特征,把它們表示為系統(tǒng)中對(duì)象,作為系統(tǒng)的基本構(gòu)成單位。它對(duì)描述事物的屬性、特點(diǎn)及事物之間的關(guān)系具有一套較完整的系統(tǒng)分析方法,并填平了語言上的鴻溝。由于本論文是在袁政強(qiáng)老師所編的有限元計(jì)算程序平臺(tái)上進(jìn)行的,其程序類已在口7][23]中有較詳細(xì)的介紹。本章簡要介紹數(shù)值計(jì)算類、數(shù)據(jù)結(jié)構(gòu)類和有限元分析程序的基本框架,系統(tǒng)地闡述采用面向?qū)ο蟮某绦蛟O(shè)計(jì)語言C++實(shí)現(xiàn)三維對(duì)流擴(kuò)散問題有限元程序的開發(fā)過程。數(shù)值計(jì)算類由于在有限單元法計(jì)算中要大量處理應(yīng)力張量、應(yīng)變張量、向量、矩陣等數(shù)據(jù)。根據(jù)需要,在編制有限元程序時(shí),編制了通用的數(shù)值計(jì)算類,包括向量類(Vector),矩陣類(Matrix)、點(diǎn)向量類(Point)以及張量類(Tensor)等。這使得對(duì)張量、向量、矩陣、的運(yùn)算就像我們通常習(xí)慣的變量那樣簡單明了,同時(shí)使程序結(jié)構(gòu)緊湊、代碼簡潔、可讀性強(qiáng)。同時(shí),這些類的定義大都采用模板類,這樣可以勝任各種類型的數(shù)據(jù),如int,float,double等,程序可根據(jù)要求自動(dòng)生成相應(yīng)數(shù)據(jù)類型的向量、矩陣及張量等對(duì)象,從而使程序的通用性更好。數(shù)據(jù)結(jié)構(gòu)類利用數(shù)組或順序方式來組織數(shù)據(jù)結(jié)構(gòu),其優(yōu)點(diǎn)是存儲(chǔ)利用率高,存儲(chǔ)速度快。但是,對(duì)于數(shù)據(jù)元素個(gè)數(shù)動(dòng)態(tài)增長的情形,由于數(shù)組的元素個(gè)數(shù)不能自由擴(kuò)充(除動(dòng)態(tài)數(shù)組外),一旦空間用完就不能再向里加入新的元素,否則就會(huì)導(dǎo)致系統(tǒng)停工。另外,在表中插入新元素或刪除無用的元素時(shí),為了保持其它元素的相對(duì)次序不變,平均需要移動(dòng)一半元素,效率很低。對(duì)于有n個(gè)長度變化的有序表分配到同一存儲(chǔ)空間情況,按每個(gè)表的最大可能長度分配空間就會(huì)造成空間的巨大浪費(fèi)。為了解決這些問題,程序采用了鏈表(List)類,鏈表結(jié)點(diǎn)類(ListNode)以及鏈表游標(biāo)類(Listiterator)。基本程序框架根據(jù)結(jié)構(gòu)有限元分析方法,在具體結(jié)構(gòu)分析過程中,可以將整個(gè)結(jié)構(gòu)作為一個(gè)對(duì)象,稱作整體結(jié)構(gòu)對(duì)象,它包含了多種成分對(duì)象。將成分對(duì)象抽象歸類時(shí),26要遵循各類“分工明確,各行其責(zé)''的原則,明確對(duì)象類所描述的內(nèi)容及其操作功能。根據(jù)這一原則,從整體結(jié)構(gòu)中可細(xì)分出單元對(duì)象、結(jié)點(diǎn)對(duì)象、荷載對(duì)象和材料對(duì)象等。對(duì)這些對(duì)象進(jìn)行描述和建模,形成所謂的結(jié)構(gòu)對(duì)象類。結(jié)構(gòu)對(duì)象類由抽象單元類(Element),結(jié)點(diǎn)類(NodeData),荷載類(Load),抽象材料類(Material)和有限元方法類(FinMethod)構(gòu)成。(1)有限元方法類有限元方法類是有限元分析最基礎(chǔ)的類,它提供了有限元分析所需的最基本的內(nèi)容:分析數(shù)據(jù)和分析方法。因此,有限元方法類的成員變量就是結(jié)點(diǎn)數(shù)據(jù)、單元數(shù)據(jù)、材料數(shù)據(jù)、荷載數(shù)據(jù)、約束條件等,它們分別由下面介紹的各個(gè)類提供。大多數(shù)以鏈表的方式存儲(chǔ)在有限元方法類中。有限元方法類成員函數(shù)則是有限元分析最基本的一系列步驟,如數(shù)據(jù)輸入、計(jì)算單元參數(shù)、計(jì)算單元?jiǎng)偠染仃嚒卧獎(jiǎng)偠染仃囘M(jìn)入總剛度矩陣、計(jì)算等效結(jié)點(diǎn)力、計(jì)算方程組右端力向量、解方程得到結(jié)點(diǎn)位移、結(jié)果后處理等。結(jié)點(diǎn)指針(1)指針(2)指針(3)指針(4)指針(5)指針(6)指針(n)指針NULL單元(1)(2)(3)(4)(5)(6)(n)NULL指針指針指針指針指針指針指針指針材料(1)(2)(3)(4)(5)(6)(n)NULL指針指針指針指針指針指針指針指針圖4.1結(jié)點(diǎn)集合、單元集合、材料集合之間的關(guān)系圖Fig4.1Graphofarelationwithnodesset、elementssetandmaterialset有限元方法類中的結(jié)點(diǎn)集合類是有限元單元的兒何結(jié)點(diǎn)的集合,包括了分析模型中的所有結(jié)點(diǎn),以鏈表形式存儲(chǔ),稱為結(jié)點(diǎn)總鏈表。而每一個(gè)單元中都包含了一個(gè)存儲(chǔ)本單元所有結(jié)點(diǎn)的鏈表,稱為單元結(jié)點(diǎn)鏈表,它通過初始數(shù)據(jù)(結(jié)點(diǎn)編號(hào))與結(jié)點(diǎn)總鏈表中相應(yīng)結(jié)點(diǎn)建立一一對(duì)應(yīng)的關(guān)系。因?yàn)殒湵碇写鎯?chǔ)的都是結(jié)點(diǎn)指針,所以這種對(duì)應(yīng)關(guān)系實(shí)際上是共用同一段內(nèi)存地址。這樣,無論在后面的有限元分析中結(jié)點(diǎn)總鏈表發(fā)生插入或刪除操作,因而改變結(jié)點(diǎn)的編號(hào),每個(gè)單元都仍然可以根據(jù)結(jié)點(diǎn)指針準(zhǔn)確的在結(jié)點(diǎn)總鏈表中找到自己的結(jié)點(diǎn)。這種對(duì)應(yīng)關(guān)系見圖4.1o因此,這是一種動(dòng)態(tài)對(duì)應(yīng)關(guān)系。同樣,每一單元還對(duì)應(yīng)一個(gè)單元所使用的材料類,也是通過與結(jié)點(diǎn)相似的方式建立的。方法類中的函數(shù)只能對(duì)該類中的數(shù)據(jù)進(jìn)行操作,不能對(duì)它數(shù)據(jù)的下一級(jí)數(shù)據(jù)進(jìn)行操作,這種層次性的數(shù)據(jù)操作體現(xiàn)了C++對(duì)數(shù)據(jù)的先進(jìn)管理方式。如方法類中的總體剛度矩陣計(jì)算,只對(duì)單元集合鏈表進(jìn)行操作。如果統(tǒng)一對(duì)單元類發(fā)出計(jì)算單元?jiǎng)偠染仃嚥⒎湃肟倓偠染仃囍械闹噶睿骸痩ei.Next()->GetStiffMatrix(K,*F),,單元類就會(huì)根據(jù)單元的類型,采用相應(yīng)的單元?jiǎng)偠染仃囉?jì)算函數(shù)進(jìn)行計(jì)算,計(jì)算出的單元?jiǎng)偠染仃囯S著單元類型的不同有不同的階數(shù),然后根據(jù)單元所對(duì)應(yīng)的結(jié)點(diǎn)放入到總剛度矩陣之中。在方法類中并不關(guān)心單元的類型是什么以及采用何種方法執(zhí)行指令,這些都屬于它的下屬單元類數(shù)據(jù)處理的事。方法類中采用這樣的處理方式使程序的編寫和調(diào)試都變得簡單容易,且函數(shù)的結(jié)構(gòu)形式也完全相同。(2)抽象單元類抽象單元類包含了具體單元所共有的數(shù)據(jù)、函數(shù)和函數(shù)接口。其任務(wù)就是派生具體的單元類以實(shí)現(xiàn)C++的多態(tài)性,以及在有限元方法類和具體單元類之間建立聯(lián)系橋梁。首先,具體單元有不同的類型,具體類型的單元都是抽象單元的繼承。C++的繼承性允許把對(duì)象作為它本身的類型或它的基類類型來處理。這就意味著允許很多類型(從同一個(gè)基類派生的)被等價(jià)地看待,就像是一個(gè)類型,而且允許同一段代碼工作在所有這些不同類型上。虛函數(shù)(函數(shù)接口)就是這樣的一段程序,而這個(gè)基類派生的不同具體類型之間的區(qū)別,就在于每個(gè)具體類型中都含有這個(gè)虛函數(shù)的一個(gè)具體重載函數(shù),只是函數(shù)的實(shí)現(xiàn)不同,這樣,C++的多態(tài)性會(huì)根據(jù)具體的對(duì)象類型調(diào)用相應(yīng)的重載函數(shù),這種編程方式更符合我們的邏輯思維習(xí)慣。如虛函數(shù)Stiff()剛度矩陣的計(jì)算,對(duì)于不同的單元,剛度矩陣的計(jì)算方法和計(jì)算的結(jié)果都是不相同的。但在單元集合類中并不區(qū)分單元的類型,都按統(tǒng)一的方式混合放入單元集合中。當(dāng)調(diào)用剛度矩陣計(jì)算時(shí),C++的多態(tài)性會(huì)根據(jù)具體的單元調(diào)用具體的單元?jiǎng)偠染仃囉?jì)算函數(shù)。虛函數(shù)在抽象單元中是不用編寫的,它只是具體單元的計(jì)算接口。在編寫具體單元時(shí),才對(duì)虛函數(shù)進(jìn)行重載,不同的重載就是不同單元的計(jì)算方法。在抽象單元中給出了許多這樣的虛函數(shù)計(jì)算接口,如:單元?jiǎng)偠染仃囉?jì)算等。其次,通過鏈表形式來處理單元,可以方便的實(shí)現(xiàn)單元在計(jì)算過程中的增加或使單元退出計(jì)算。在計(jì)算過程中,有些單元會(huì)因?yàn)閴核槭偠榷顺鲇?jì)算,有時(shí)會(huì)因?yàn)閱卧炎冇梢粋€(gè)大單元裂變?yōu)閹讉€(gè)小單元,單元會(huì)在計(jì)算過程中不斷的增加。由于鏈表結(jié)構(gòu)方便的增加減少方式為處理這類問題提供了極大的方便。下面介紹抽象單元類的成員函數(shù)和成員變量。抽象單元類的成員函數(shù)除了一些輔助功能函數(shù)外大多是虛函數(shù),它們是具體單元的計(jì)算接口,都要在具體單元中重載。由此可以看出,抽象單元類是具體單28元類和方法類之間的橋梁,通過它來實(shí)現(xiàn)C++的多態(tài)性和繼承功能。采用從基類按層次繼承來建立單元類的方法,除了可重用父類的代碼以外,另一個(gè)很重要的優(yōu)點(diǎn)是可以運(yùn)用面向?qū)ο笥?jì)算中的多態(tài)性,即動(dòng)態(tài)聯(lián)編技術(shù)。通過指向單元基類的對(duì)象的指針,調(diào)用各派生單元類的成員函數(shù)。這樣做的好處在于,需要增加新的單元類時(shí),只要在其他相關(guān)類中增加新單元類的說明,即包含類定義頭文件,而不必改動(dòng)相關(guān)的類,從而大大提高編程效率及代碼的重用率。(3)結(jié)點(diǎn)類結(jié)點(diǎn)類封裝了結(jié)點(diǎn)的信息,包括自由度、坐標(biāo)、結(jié)點(diǎn)位移、約束條件等。結(jié)點(diǎn)序號(hào)是在輸入結(jié)點(diǎn)時(shí)的排列順序,由于在計(jì)算過程中要不斷加入單元和結(jié)點(diǎn),因此不能直接依據(jù)這個(gè)序號(hào)來將單元?jiǎng)偠染仃嚡B加到總剛度矩陣中去。為了解決這個(gè)問題,引入了結(jié)點(diǎn)在方程中的開始編號(hào)Nequation,由程序自動(dòng)計(jì)算,它的作用就是指示結(jié)點(diǎn)的每一個(gè)沒有受約束的自由度正確的進(jìn)入總剛度矩陣。每一個(gè)結(jié)點(diǎn)存儲(chǔ)著自己的約束條件,分為邊界條件標(biāo)識(shí)和邊界條件值。有約束的自由度標(biāo)識(shí)為1,否則為其它,在有約束的自由度上給出約束值。(4)抽象材料類每一種具體單元在應(yīng)用中都需要賦予一個(gè)具體的材料屬性,這用材料類來表示,正如上面介紹的抽象單元類中含有一個(gè)材料類指針,就是用來實(shí)現(xiàn)這個(gè)屬性。材料的種類繁多,其中有些材料又有不同的等級(jí),可以細(xì)分成不同的材料。既便是同種材料,在分析過程中也可能發(fā)生變化,如材料非線性問題中的材料退化等。因此,我們有必要像設(shè)置抽象單元類一樣,設(shè)置抽象材料類,然后通過繼承的方式創(chuàng)建具體的材料類。在結(jié)構(gòu)化程序設(shè)計(jì)中,大多數(shù)軟件都將材料和單元放在同一函數(shù)中處理。我們將單元和材料分開的目的是讓單元能對(duì)應(yīng)不同的材料,同時(shí)一種材料能應(yīng)用在不同的單元中,這種多對(duì)多的關(guān)系增加了單元和材料的應(yīng)用類型。(5)荷載類這里荷載類定義的是單元荷載,其成員變量用來對(duì)荷載情況進(jìn)行描述,如荷載類型、大小、作用位置和方向等。單元荷載在計(jì)算時(shí)需要先轉(zhuǎn)換成等效結(jié)點(diǎn)荷載,在計(jì)算單元?jiǎng)偠染仃嚥⒎湃肟倓偠染仃嚂r(shí)一同放入方程右端的荷載向量中,而初始結(jié)點(diǎn)荷載在此時(shí)直接進(jìn)入方程右端的荷載向量中。三維對(duì)流擴(kuò)散問題程序類設(shè)計(jì)面向?qū)ο蟮某绦蛟O(shè)計(jì),歸結(jié)為類的設(shè)計(jì)。根據(jù)第三章和前面介紹的面向?qū)ο蟮挠邢拊治龀绦蚧究蚣埽瑢?duì)于三維對(duì)流擴(kuò)散問題,我們只須依據(jù)具體問題在程序中增加新的類,來實(shí)現(xiàn)三維對(duì)流擴(kuò)散問題有限元程序的開發(fā)。29對(duì)流擴(kuò)散問題有限元分析方法類對(duì)流擴(kuò)散問題有限元分析方法類是有限元方法類的派生類,它繼承了抽象方法類已經(jīng)定義的所有成員變量和成員函數(shù),主要用來控制整個(gè)程序的流程,實(shí)現(xiàn)三維對(duì)流擴(kuò)散問題的有限元分析。classFConDiff:publicFinMethod{public:F_ConDiff();?F_ConDifR){};intConDiffAnlysis();//對(duì)流擴(kuò)散分析程序通過調(diào)用函數(shù)intConDiffAnlysis(),就可以實(shí)現(xiàn)三維對(duì)流擴(kuò)散問題有限元分析的一系列步驟。三維對(duì)流擴(kuò)散問題有限元分析程序執(zhí)行順序:.執(zhí)行:CreateNodeDateChain();〃讀入結(jié)點(diǎn)數(shù)據(jù),創(chuàng)建結(jié)點(diǎn)鏈表.執(zhí)行:CreateMaterialChain();〃讀入材料數(shù)據(jù),創(chuàng)建材料鏈表.執(zhí)行:CreateElementChain();〃讀入單元數(shù)據(jù),創(chuàng)建單元鏈表.執(zhí)行:OutputMaterial();outputCoor();outputElement();outputBC();//初始數(shù)據(jù)輸出.執(zhí)行:Counter();〃計(jì)算結(jié)點(diǎn)方程編號(hào),確定總剛度矩陣和右端向量維數(shù).執(zhí)行:GenStiffMatrix();〃計(jì)算單元?jiǎng)偠染仃嚥⒎湃肟倓偠染仃?執(zhí)行:solver();〃求解方程.執(zhí)行:outputDisplace();//輸出結(jié)點(diǎn)位移以上1?3步是在三維對(duì)流擴(kuò)散問題有限元分析類的構(gòu)造函數(shù)F_ConDiff()中完成的,也就是說,對(duì)一個(gè)具體問題分析時(shí),就已經(jīng)將這個(gè)問題一些基本數(shù)據(jù)存放在這個(gè)方法類中了,這正符合面向?qū)ο笏枷搿獙?duì)象=數(shù)據(jù)+算法。4~8步則在voidStaticAnlysis()中完成。結(jié)點(diǎn)類結(jié)點(diǎn)類封裝了結(jié)點(diǎn)的信息,包括自由度、坐標(biāo)、結(jié)點(diǎn)位移、約束條件等。對(duì)于三維對(duì)流擴(kuò)散問題,我們要依據(jù)結(jié)點(diǎn)類的定義來輸入所有結(jié)點(diǎn)的相關(guān)信息。根據(jù)三維對(duì)流擴(kuò)散方程組的特點(diǎn),要確定結(jié)點(diǎn)序號(hào)、結(jié)點(diǎn)自由度、結(jié)點(diǎn)維數(shù)、結(jié)點(diǎn)約束條件、結(jié)點(diǎn)約束值、結(jié)點(diǎn)坐標(biāo)和結(jié)點(diǎn)處的速度值。結(jié)點(diǎn)序號(hào)是輸入結(jié)點(diǎn)時(shí)的排列順序。結(jié)點(diǎn)自由度為lo結(jié)點(diǎn)維數(shù)為3O結(jié)點(diǎn)約束條件包括三種條件:一、結(jié)點(diǎn)屬于區(qū)域Q內(nèi)點(diǎn),用0來標(biāo)識(shí);二、結(jié)點(diǎn)在邊界B上,用1來標(biāo)識(shí);三、結(jié)點(diǎn)30在「上,用2來標(biāo)識(shí)。再分別給出在口和「2上的約束值,另外還要輸入結(jié)點(diǎn)的三個(gè)坐標(biāo)分量和結(jié)點(diǎn)處的速度在三個(gè)方向上的分量值。結(jié)點(diǎn)類是數(shù)據(jù)輸入的關(guān)鍵,同時(shí)對(duì)結(jié)點(diǎn)鏈表和單元鏈表的創(chuàng)建也起著非常重要的作用。結(jié)點(diǎn)信息的輸入通過成員函數(shù)NodeData(intilndjntiNodeFree,intiDimjntflage)來實(shí)現(xiàn)。NodeData::NodeData(intilndjntiNodeFree,intiDim,intflage
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 文科科研課題項(xiàng)目申報(bào)書
- 市級(jí)重點(diǎn)課題申報(bào)書模板
- 課題立項(xiàng)申報(bào)書丟了
- 高職病理課題申報(bào)書
- 傳統(tǒng)文化相關(guān)課題申報(bào)書
- 廣東省課題申報(bào)書重復(fù)率
- 山東省課題申報(bào)書范文
- 出租雜物小倉庫合同范本
- 單位食堂蔬菜配送合同范例
- 怎么拿到省級(jí)課題申報(bào)書
- 海智工作站申報(bào)計(jì)劃書
- 托管崗前培訓(xùn)教學(xué)課件
- 機(jī)房運(yùn)維管理制度
- 消渴病中醫(yī)護(hù)理的方案
- 昆明撫仙湖鰭魚灣棋盤山度假娛樂旅游區(qū)總體規(guī)劃方案樣本
- 突發(fā)疾病時(shí)的安全駕駛方法
- 污水處理廠入河排污口設(shè)置論證報(bào)告
- T-SHNA 0005-2023 成人住院患者腸外營養(yǎng)輸注護(hù)理
- 課件:認(rèn)識(shí)鏡頭語言1:運(yùn)鏡方式和常用的鏡頭術(shù)語
- 職業(yè)道德(Professionalethics)教學(xué)課件
- 提升醫(yī)療質(zhì)量減少醫(yī)療糾紛
評(píng)論
0/150
提交評(píng)論