版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、OpenFOAM常用類的一些總結(jié)OpenFOAM中有許多類,每個(gè)類的功能都很強(qiáng)大,這也使它面向?qū)ο笤O(shè)計(jì)得以實(shí)現(xiàn)。 對(duì)于程序,最常用到的,也是最底層的就是數(shù)據(jù),在OpenFOAM中引入了三類基礎(chǔ)數(shù)據(jù)類型:標(biāo)量scalar, 向量vector, 張量tensor.這三個(gè)中數(shù)據(jù)類型,也是FOAM中最基礎(chǔ)的三個(gè)類。(還有一個(gè)比較重要的就是bool和label,前者就是是非型,及對(duì)錯(cuò)型,只不過(guò)是更擴(kuò)展一些,后者是標(biāo)簽型數(shù)據(jù),相當(dāng)于c中的整型。關(guān)于更多的其它數(shù)據(jù)類型可以參看目錄.srcOpenFOAMprimitives里面) 在上述數(shù)據(jù)類的基礎(chǔ)上,增加場(chǎng)(field)的概念,就引入了
2、標(biāo)量場(chǎng)scalarField, 向量場(chǎng)vectorField, 張量場(chǎng)tensorField。 實(shí)際上這三個(gè)類又是field類的typedef,如typedef field<scalar> saclarField。這些場(chǎng)類中都有對(duì)應(yīng)的成員函數(shù)進(jìn)行加減乘除運(yùn)算,還有復(fù)雜的點(diǎn)積叉積等。說(shuō)到這field class,其實(shí)他就像是一個(gè)數(shù)據(jù)存放的區(qū)域一樣,存放上scalar,那它成了標(biāo)量場(chǎng)scalarField。這些類中可以有接口實(shí)現(xiàn)數(shù)據(jù)的計(jì)算。從field類中又派生出了FieldField類,這個(gè)就是說(shuō)場(chǎng)中場(chǎng)類,其實(shí)這個(gè)主要用于邊界條件類的一個(gè)基類。因?yàn)檫吔鐥l件算是網(wǎng)格類場(chǎng)中的一個(gè)特殊的場(chǎng)
3、,后面會(huì)介紹。 比f(wàn)ield類高一點(diǎn)的就是幾何場(chǎng)類 GeometricField class,其相比f(wàn)ield class多了紀(jì)錄場(chǎng)位置的相關(guān)信息。說(shuō)到這里請(qǐng)大家注意他和polyMesh class的區(qū)別,后者只是紀(jì)錄網(wǎng)格的結(jié)構(gòu),如點(diǎn)的位置、面的組成、體的組成等等,polyMesh class中對(duì)應(yīng)有pointMesh,surfaceMesh,volMesh等類,從字面上很容易理解其處理和記錄網(wǎng)格點(diǎn)、網(wǎng)格面、網(wǎng)格體等信息。而GeometricField類,其則是記錄了在什么樣的網(wǎng)格上有量a的相關(guān)信息或數(shù)據(jù)。它包括了內(nèi)部區(qū)域、邊界區(qū)域(GeometricBoundaryField cl
4、ass)、網(wǎng)格、尺度單位、計(jì)算的先前時(shí)間階的值等。在該類中有常用的三種(實(shí)際上還有其他的許多,可以參看OpenFOAM網(wǎng)上說(shuō)明):volScalarField體標(biāo)量場(chǎng),volVectorField體向量場(chǎng),volTensorField體張量場(chǎng)。這里說(shuō)的場(chǎng)與field有所不同,這里指的是網(wǎng)格區(qū)域上所對(duì)應(yīng)的數(shù)據(jù)信息。上述的vol就是指ployMesh中的volMesh,如volscalarField類來(lái)說(shuō):見(jiàn)下例volScalarField p( IOobject (
5、 "p", runTime.timeName(), mesh, &
6、#160; IOobject:MUST_READ, IOobject:AUTO_WRITE ), mesh );看過(guò)老蘇博客的朋友肯定都知道這是什么意思,這是讀入標(biāo)量壓力場(chǎng)文件,把壓力值存儲(chǔ)到網(wǎng)格體中心。為加深對(duì)GeometricField類的理解,貼張PG中的圖
7、片:OpenFOAM中有許多類,每個(gè)類的功能都很強(qiáng)大,這也使它面向?qū)ο笤O(shè)計(jì)得以實(shí)現(xiàn)。 對(duì)于程序,最常用到的,也是最底層的就是數(shù)據(jù),在OpenFOAM中引入了三類基礎(chǔ)數(shù)據(jù)類型:標(biāo)量scalar, 向量vector, 張量tensor.這三個(gè)中數(shù)據(jù)類型,也是FOAM中最基礎(chǔ)的三個(gè)類。(還有一個(gè)比較重要的就是bool和label,前者就是是非型,及對(duì)錯(cuò)型,只不過(guò)是更擴(kuò)展一些,后者是標(biāo)簽型數(shù)據(jù),相當(dāng)于c中的整型。關(guān)于更多的其它數(shù)據(jù)類型可以參看目錄.srcOpenFOAMprimitives里面) 在上述數(shù)據(jù)類的基礎(chǔ)上,增加場(chǎng)(field)的概念,就引入了標(biāo)量場(chǎng)scalarField
8、, 向量場(chǎng)vectorField, 張量場(chǎng)tensorField.實(shí)際上這三個(gè)類又是field類的typedef,如typedef field<scalar> saclarField。這些場(chǎng)類中都有對(duì)應(yīng)的成員函數(shù)進(jìn)行加減乘除運(yùn)算,還有復(fù)雜的點(diǎn)積叉積等。說(shuō)到這field class,其實(shí)他就像是一個(gè)數(shù)據(jù)存放的區(qū)域一樣,存放上scalar,那它成了標(biāo)量場(chǎng)scalarField。這些類中可以有接口實(shí)現(xiàn)數(shù)據(jù)的計(jì)算。從field類中又派生出了FieldField類,這個(gè)就是說(shuō)場(chǎng)中場(chǎng)類,其實(shí)這個(gè)主要用于邊界條件類的一個(gè)基類。因?yàn)檫吔鐥l件算是網(wǎng)格類場(chǎng)中的一個(gè)特殊的場(chǎng),后面會(huì)介紹。 比f(wàn)
9、ield類高一點(diǎn)的就是幾何場(chǎng)類 GeometricField class,其相比f(wàn)ield class多了紀(jì)錄場(chǎng)位置的相關(guān)信息。說(shuō)到這里請(qǐng)大家注意他和polyMesh class的區(qū)別,后者只是紀(jì)錄網(wǎng)格的結(jié)構(gòu),如點(diǎn)的位置、面的組成、體的組成等等,polyMesh class中對(duì)應(yīng)有pointMesh,surfaceMesh,volMesh等類,從字面上很容易理解其處理和記錄網(wǎng)格點(diǎn)、網(wǎng)格面、網(wǎng)格體等信息。而GeometricField類,其則是記錄了在什么樣的網(wǎng)格上有量a的相關(guān)信息或數(shù)據(jù)。它包括了內(nèi)部區(qū)域、邊界區(qū)域(GeometricBoundaryField class)、網(wǎng)格、尺度單位、計(jì)算
10、的先前時(shí)間階的值等。在該類中有常用的三種(實(shí)際上還有其他的許多,可以參看OpenFOAM網(wǎng)上說(shuō)明):volScalarField體標(biāo)量場(chǎng),volVectorField體向量場(chǎng),volTensorField體張量場(chǎng)。這里說(shuō)的場(chǎng)與field有所不同,這里指的是網(wǎng)格區(qū)域上所對(duì)應(yīng)的數(shù)據(jù)信息。上述的vol就是指ployMesh中的volMesh,如volscalarField類來(lái)說(shuō):見(jiàn)下例 volScalarField p ( IOobject
11、60; ( "p", runTime.timeName(), mesh,
12、160; IOobject:MUST_READ, IOobject:AUTO_WRITE ), mesh );看過(guò)老蘇博客的朋友肯定都知道這是什么意思,這是讀入標(biāo)量壓力場(chǎng)文件,把壓
13、力值存儲(chǔ)到網(wǎng)格體中心。為加深對(duì)GeometricField類的理解,貼張PG中的圖片: 除了體的向量標(biāo)量張量場(chǎng)外,還有面標(biāo)量場(chǎng)surfaceScalarField、面向量場(chǎng)surfaceVectorField、面張量場(chǎng)surfaceTensorField??聪旅娴睦樱?#160; surfaceScalarField phi ( IOobject (
14、0; "phi", runTime.timeName(), mesh ), &
15、#160; fvc:interpolate(alpha)*phia + fvc:interpolate(beta)*phib );這里的phi既是一個(gè)面向量場(chǎng)對(duì)象,他用來(lái)是紀(jì)錄單元體面上流過(guò)的通量值。除了常用到的標(biāo)量向量張量的幾何場(chǎng)外,還有一些特殊量的場(chǎng):surfaceSymmTensor面對(duì)稱張量幾何場(chǎng)、體球面張量場(chǎng)等等。幾何場(chǎng)里面還有一個(gè)比較重要的類就是GeometricBoundaryField,用來(lái)專門對(duì)邊界進(jìn)行處理的一個(gè)類。 如果說(shuō)數(shù)據(jù)場(chǎng)類是處
16、理數(shù)據(jù)的基礎(chǔ),那么時(shí)間類則是控制計(jì)算步進(jìn)必不可少的一部分。Time class在進(jìn)行瞬態(tài)計(jì)算,用它跟蹤時(shí)間階,并使時(shí)間按一定步長(zhǎng)或者變步長(zhǎng)累加,及輸出計(jì)算參數(shù),計(jì)算時(shí)間等。見(jiàn)下例:(相關(guān)說(shuō)明見(jiàn)老蘇博客:OpenFOAM>>solver>>incompressible>>icoFoam的說(shuō)明) Info<< "nStarting time loopn" << endl; for (runTime+; !runTime.end(); runTime
17、+) Info<< "Time = " << runTime.timeName() << nl << endl; / runTime.write();
18、; Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s"
19、160; << nl << endl; 談到時(shí)間大家很容易想到的就是空間,time and space是cfd中非常重要的概念,在離散過(guò)程中時(shí)間和空間都需要進(jìn)行離散(非穩(wěn)態(tài)情況),與空間相關(guān)的類其實(shí)上面已經(jīng)提到:ployMesh class,在這不在累述。需要附加說(shuō)明的是邊界條件類:邊界條件在OpenFOAM被定義作為場(chǎng)的一個(gè)完整部分而不是場(chǎng)上額外附加的。在fvMatrix類中并入了patch用來(lái)定義區(qū)域的外部邊界。每一個(gè)patch有一個(gè)邊界條件,再由fvm用合適的方式進(jìn)行操作處理。patch有多種類
20、型:calculated,fixed value, fixed gradient, zero gradient, symmetry, cyclic等。這些類型都繼承于基類patchField。 在求解之前,需要對(duì)偏微分方程組進(jìn)行離散,轉(zhuǎn)化為線性方程組Ax=b的形式。其中x就是我們所要求的量,他也就是咱們前面介紹的GeometricField類,而A代數(shù)方程的系數(shù),他就是我們下面所要提到的fvMatrix類。對(duì)于偏微分方程的每一項(xiàng),OpenFOAM應(yīng)用兩個(gè)類來(lái)離散:finiteVolumeMethod和finiteVolumeCalculus,分別用typedef聲明為fvm和fvc.
21、 fvm是計(jì)算隱式導(dǎo)數(shù)從而返回fvMatrix,而fvc是計(jì)算顯式導(dǎo)數(shù)或者其它隱式計(jì)算返回geometricField,該類不存儲(chǔ)私有數(shù)據(jù),僅是執(zhí)行操作從一個(gè)量map到另外一個(gè)量上。對(duì)于偏微分方程,其中有很多種導(dǎo)數(shù)形式:拉普拉斯、時(shí)間導(dǎo)數(shù)、二階時(shí)間導(dǎo)數(shù)、對(duì)流項(xiàng)、散度、梯度、梯度梯度平方、旋度、源等,在OpenFOAM中的表示見(jiàn)下圖:離散化時(shí)空之后,就是解方程,其實(shí)求解方程的過(guò)程主要分成如下幾部:1.離散偏微分方程,2.線性化方程組,3.對(duì)應(yīng)不同的倒數(shù)格式選擇差分格式,4.求解系數(shù)矩陣,5.解方程。在這就涉及到了一個(gè)重要的部分:矩陣。Matrix是OpenFOAM中的一個(gè)模板類,他是一個(gè)用來(lái)存儲(chǔ)
22、及運(yùn)算標(biāo)量張量等類型數(shù)據(jù)的2維矩陣。這個(gè)矩陣類有點(diǎn)像數(shù)學(xué)上的矩陣一樣。對(duì)于應(yīng)用于數(shù)值求解矩陣,OpenFOAM引入了fvMatrix類,這個(gè)就是有限體積(finite volume)矩陣類,他是一個(gè)特殊的矩陣類型,應(yīng)用于求解有限體積標(biāo)量方程組,該類成員函數(shù)可以實(shí)現(xiàn)給定相應(yīng)場(chǎng)的求解、通量的計(jì)算、殘差的計(jì)算和控制、方程松弛因子的實(shí)現(xiàn),方程中心系數(shù)(central coefficient, 公共成員函數(shù)A()和H操作源(H operation source,成員函數(shù)H())的計(jì)算、設(shè)定計(jì)算參考等。在此需要提到的是fvMesh類,該類和GoeMesh類差不多,不同之處在于fvMesh類它包含相應(yīng)網(wǎng)格信
23、息和拓?fù)浣Y(jié)構(gòu)的同時(shí),還對(duì)網(wǎng)格進(jìn)行實(shí)時(shí)更新(動(dòng)網(wǎng)格的時(shí)候)。這些更新包括刪除單元體面等,并按要求重新定位并計(jì)算新的信息。下面舉一些關(guān)于fvMatrix應(yīng)用的例子:(選自icoFoam) fvVectorMatrix UEqn ( fvm:ddt(U)
24、160; + fvm:div(phi, U) /div,散度是代表某量通過(guò)單元體的面積分,此處phi為一個(gè)通量場(chǎng),該場(chǎng)的值被記錄在單元體的面上,而U就是由通量所輸運(yùn)的量,而該速度值則被記錄在單元體中心點(diǎn)上。 - fvm:laplacian(nu, U) );/源項(xiàng)可以使顯式的,在離散時(shí)進(jìn)入方程的右端,當(dāng)源項(xiàng)為隱式的時(shí)候他進(jìn)入方程的系數(shù)矩
25、陣中。 solve(UEqn = -fvc:grad(p);/關(guān)于=,一直有所疑問(wèn),聽老蘇分析挺有道理,最近你看到一篇文章上說(shuō)=的定義是用來(lái)表示數(shù)學(xué)意義上的方程左右兩端的等于,這個(gè)運(yùn)算符為了使其有最低的的運(yùn)算優(yōu)先級(jí)所以采用了=,而非=,同時(shí)也強(qiáng)調(diào)了方程兩端得等的概念,而非賦值。在OpenFOAM中,對(duì)=的操作實(shí)際上是形式上的,而非實(shí)質(zhì)上有什么運(yùn)算,它自動(dòng)重排方程各項(xiàng):所有隱式項(xiàng)寫進(jìn)方程矩陣中,而所有顯式項(xiàng)則歸于方程的b中。
26、60;volScalarField rUA = 1.0/UEqn.A(); U = rUA*UEqn.H(); pEqn.setReference(pRefCell, pRefValue); pEqn.solve();例子中fvVectorMatrix為一向量有限體積矩陣類,OpenFOAM中定義 typedef f
27、vMatrix<Vector> fvVectorMatrix,其他的還有標(biāo)量、張量等。其他關(guān)于上述程序的說(shuō)明參看老蘇博客。 再看如下例子:fvMatrixScalar rhoEq( fvm:ddt(rho)+fvc:div(phi);/此處是一個(gè)關(guān)于質(zhì)量守恒方程的求解,對(duì)于phi為密度與速度的積,而此時(shí)采用fvc即表示速度通量在方程中作為已知量,出現(xiàn)在方程的b項(xiàng)中,它是計(jì)算前一時(shí)間階的值。 說(shuō)了一些常用的類,下面介紹一些比較基礎(chǔ)底層的類:IOdictionary,argList,IOobject,IOdictionary類是繼承于regI
28、Oobject類和dictionary類,其主要作于是讀入和寫入數(shù)據(jù)。如讀取PISO控制參數(shù),或讀入transportProperties參數(shù)等等。它派生出許多類: 1. basicThermo(用于基本熱力學(xué)參數(shù)讀取和計(jì)算) 2. LESModel(大渦模擬模型控制參數(shù)) 3. RASModel (RAS模型控制參數(shù))
29、0; 4. fvSchemes (離散格式參數(shù)) 5. motionSolver (動(dòng)網(wǎng)格控制參數(shù)) 6. radiationModel (輻射模型控制參數(shù)) 7. solution (求解方程控制參數(shù))
30、 8. SRFModel (SRF模型控制參數(shù)) 9. tolerances (方程殘差控制) 10. transportModel (輸運(yùn)模型參數(shù))見(jiàn)下例: IOdictionary transportProperties /在transportProperties字典中讀入?yún)?shù) (
31、; IOobject ( "transportProperties", runTime.constant(), &
32、#160; mesh, IOobject:MUST_READ, IOobject:NO_WRITE ) );IOobject類:讀入寫入數(shù)據(jù),他與IOdictionary不同之處在于后者是讀取
33、一個(gè)文件中的一個(gè)字典“”之內(nèi)的數(shù)據(jù),而IOobject則是讀入整個(gè)文件,如讀入壓力場(chǎng),速度場(chǎng)等,并且有讀入寫出的控制參數(shù),見(jiàn)上例中的“MUST_READ,NO_WRITE”等等。(老蘇博客中有詳細(xì)介紹,在此不多說(shuō)了) argList類:讀入外部命令參數(shù)的一個(gè)類,如在命令窗口鍵入icoFoam -case <dir>,則對(duì)目錄dir執(zhí)行icoFoam計(jì)算,其參數(shù)有:-case 選擇一個(gè)case目錄替代當(dāng)前工作目錄;-parallel 指定并行計(jì)算參數(shù); -doc顯式該程序文檔; -srDoc 在瀏覽器里顯示該程序的源文件; -help 顯示改程
34、序的使用方法 dimensionSet類是對(duì)基本類型的單位設(shè)定,并檢查其正確性。 tmp類是管理臨時(shí)對(duì)象的一個(gè)類。OpenFOAM的程序開發(fā)初步一.OpenFOAM應(yīng)用的類型:使用OpenFOAM進(jìn)行CAE模擬的,大致可分為三種類型:1)直接利用OpenFOAM的標(biāo)準(zhǔn)的求解器進(jìn)行模擬,把OpenFOAM替代商業(yè)軟件來(lái)使用,OpenFOAM已基本具有這樣的功能和人氣,與Fuent,Star-CD等相比較,OpenFOAM顯然具有更高的求解效率和靈活性。2)用戶自定義求解器,即利用OpenFOAM的基本類庫(kù),如finiteVolume,OpenFOAM庫(kù)來(lái)按照自己的求解流程來(lái)編
35、寫針對(duì)某類應(yīng)用的求解器。用戶需要開發(fā)的求解器就是類似于在OpenFOAM的applications中所看到的標(biāo)準(zhǔn)求解器icoFOAM,simpleFOAM等。顯然這一需求是非常大的,從OpenFOAM問(wèn)世以來(lái),已有很多用戶定義了自己的求解器。這類需求的特點(diǎn)是,并不需要特別關(guān)心,離散和求解的最底層的知識(shí),如時(shí)間項(xiàng)離散,空間項(xiàng)離散等,關(guān)注的重點(diǎn)是求解的步驟或者流程。在編程中,通常是頂層的求解流程的開發(fā),在多數(shù)情況下可以不編譯OpenFOAM的finiteVolume和OpenFOAM庫(kù)。這種頂層的求解器的開發(fā),是我們以前常常忽略的,或者是以前沒(méi)有能力做到的。需要指出的是,商業(yè)軟件中的所謂udf,u
36、ser subroutine和這是不可相比的。3)用戶自己定義離散方法等。對(duì)于研究離散格式、代數(shù)求解器等人來(lái)說(shuō),更關(guān)注時(shí)間項(xiàng)ddt,擴(kuò)散項(xiàng)Laplacian,對(duì)流項(xiàng)div是如何離散的,能否有更高效更高精度的離散方法,這需要修改finiteVolume庫(kù)和OpenFOAM庫(kù)中對(duì)應(yīng)的代碼。尤其是對(duì)流項(xiàng),盡管OpenFOAM已經(jīng)提供了基于NVD和TVD的模板和40多種有名的高階高精度格式,但可以預(yù)見(jiàn),這仍然是不夠的,畢竟對(duì)流項(xiàng)的離散仍然是目前CFD的重點(diǎn)研究方向??梢钥隙ǖ氖?,目前有很多人關(guān)注類型2的應(yīng)用,畢竟將OpenFOAM當(dāng)成Fluent或Star-CCM來(lái)使用,并不見(jiàn)得方便。但是將OpenF
37、OAM作為類庫(kù)來(lái)構(gòu)建自己的求解器,這是其它軟件無(wú)法實(shí)現(xiàn)的。二OpenFOAM程序開發(fā)的基本知識(shí)2.1OpenFOAM的基本術(shù)語(yǔ)重要的環(huán)境變量:$WM_PROJECT_USER_DIR OpenFOAM的用戶目錄$FOAM_TUTORIALS -OpenFOAM的算例目錄$ FOAM _SRC -OpenFOAM庫(kù)的源程序目錄$ FOAM_APP
38、160; - OpenFOAM的求解器目錄$ FOAM_APPBIN - OpenFOAM的求解器執(zhí)行文件目錄$ FOAM_RUN -用戶的算例目錄重要的shell:run cd to $FOAM_RUNsrc = cd to $FOAM_SRCapp =
39、60;cd to $FOAM_APPutil = cd to $FOAM_APP/utilitiessol = cd to $FOAM_APP/solverstut = cd to $FOAM_TUTORIALS求解器的基本文件結(jié)構(gòu)appName 包含求解器源代碼的目錄+appName.C 求解器主程序 CreateFields.H
40、160;場(chǎng)變量的聲明和初始化 +Make/ 編譯指令+files 編譯需要的源程序文件和生成的目標(biāo)文件+options 編譯選項(xiàng),如鏈接庫(kù)等appName/appName.C是求解器的主程序appName/createFields.H聲明變量,并從文件中讀入初值,如p,物性。appName/Make/files 所有源程序的名稱,一個(gè)文件一行,最后一行是目標(biāo)代碼的名稱和存放位置,EXE=$(FOAM_USER_APPBIN)
41、/appNameappName/Make/options設(shè)定查找頭文件和庫(kù)的路徑,EXE_INCS,和需要鏈接的庫(kù)EXE_LIBS算例的基本文件結(jié)構(gòu)case/ 算例目錄+0/ 包含初始和邊界條件+constant/
42、; 包含初次讀入后,不隨時(shí)間變化的數(shù)據(jù)+polyMesh/ 包含多面體網(wǎng)格數(shù)據(jù)+transportProperties/ 包含物性數(shù)據(jù) +system/ 包含計(jì)算控制和離散格式設(shè)定+controlDict
43、 包含計(jì)算控制,如時(shí)間步長(zhǎng)等+fvSchemes 包含離散格式設(shè)定+fvSolutions 包含代數(shù)求解器或SIMPLE,PISO算法設(shè)定具體而言case/0 每個(gè)需求解的變量需要一個(gè)文件設(shè)定其初始邊界條件case/constant/polyMesh
44、0; 網(wǎng)格數(shù)據(jù),如owner neighbour points faces boundarycase/system/transportProperties 物性數(shù)據(jù)case/system/controlDict 設(shè)定起始終止時(shí)間,時(shí)間步長(zhǎng),輸出控制case/system/fvSchemes 設(shè)定程序用到的每個(gè)微分算子的離散格式case/system/fvSolution 為每個(gè)變量選擇代數(shù)方程求解
45、器/收斂精度及PISO等算法設(shè)定三OpenFOAM程序開發(fā)的理論知識(shí)作求解開發(fā),必須能寫出需要求解的控制方程及其定解條件,并且對(duì)于如何求解方程或方程組的步驟已經(jīng)明確。這些流體力學(xué)、傳熱學(xué)以及相關(guān)的理論是必需的,所謂連續(xù)介質(zhì)力學(xué)中的數(shù)學(xué)模型,控制方程和定解條件就是表示它的語(yǔ)言。在這里是不可能說(shuō)清楚的,這要看個(gè)人的功底了。四 .OpenFOAM程序開發(fā)的最簡(jiǎn)單的例子下面采用OpenFOAM來(lái)開發(fā)一個(gè)用戶自己的求解器。主要是利用OpenFOAM的標(biāo)準(zhǔn)求解器icoFoam,用戶不需要寫任何代碼,只為為了熟悉OpenFOAM程序開發(fā)的環(huán)境和步驟。步驟:1) 將icoFoam目錄
46、拷貝到新的目錄可采用下面的Linux的命令實(shí)現(xiàn):到OpenFOAM的incompressible目錄cd applications/incompressiblecp r icoFoam myicoFoam以上只是復(fù)制目錄icoFoam到新的位置,并且新目錄名為myicoFoamcd myicoFoam進(jìn)入新的目錄,查看一下,可以看到里面的文件和icoFoam中是否一樣2) 原文件改名,并且刪除依賴文件將icoFoam.C改名myicoFoam.Cmv icoFoam.C myicoFoam.C刪除依賴文件rm icoFoam.dep3) 修改
47、編譯文件files和options進(jìn)入Make目錄,打開files文件, 將icoFoam.C 源程序文件名EXE = $(FOAM_APPBIN)/icoFoam 可執(zhí)行文件名修改為myicoFoam.C 源程序文件名EXE = $(FOAM_APPBIN)/myicoFoam 可執(zhí)行文件名此例中options不需修改,可以打開看看EXE_INC = 頭文件包含 -I$(LIB_SRC)/finiteVolume/lnInclud
48、eEXE_LIBS = 鏈接庫(kù)-lfiniteVolume4)刪除原來(lái)的obj文件 rm rf linuxGccDPOptcd .5)編譯 wmake6) 檢驗(yàn)一下 到tutorial目錄,檢驗(yàn)一下 myicoFoam . cavity六.OpenFOAM程序開發(fā)例子一:在icoFoam中加入溫度場(chǎng)求解準(zhǔn)備:能量控制方程: dT/dt+div(den*U*T)=div(a gradT)在壁面上給定值條件。需要解決的問(wèn)題:a)如何創(chuàng)建標(biāo)量場(chǎng),Tb) 如何創(chuàng)建物性,ac)如何定義溫度方程,并求解d) 如何在算例中設(shè)定T和a
49、e)如何設(shè)定T的離散格式f)如何設(shè)定T的求解器的收斂標(biāo)準(zhǔn)等步驟:1)創(chuàng)建程序需要的新物性和新變量場(chǎng)打開myicoFoam.C可以看到,程序開始運(yùn)行時(shí)調(diào)用CreateFields.H,創(chuàng)建變量場(chǎng)。打開CreateFields.H,可以看到程序首先從transportProperties文件中讀入物性, Info<< "Reading transportPropertiesn" << endl; IOdictionary transportProperties (
50、60; IOobject ( "transportProperties", 從字典文件transportProperties讀入runTime.constant(), /transportProperties文件位于目錄runTime.constant()中
51、 mesh, 網(wǎng)格對(duì)象 IOobject:MUST_READ, IOobject:NO_WRITE ); 創(chuàng)建了Iodictionary類型對(duì)象 trans
52、portProperties dimensionedScalar nu /首先讀入粘性系數(shù) ( transportProperties.lookup("nu") ); 創(chuàng)建有量綱標(biāo)量nu,nu通過(guò)從字典transportProperties查找”nu”來(lái)賦值可以加上新方程需要的物性 dimensionedScalar DT
53、 /首先讀入熱擴(kuò)散率 ( transportProperties.lookup("DT") ); 創(chuàng)建有量綱標(biāo)量DT,DT通過(guò)從字典transportProperties查找”DT”來(lái)賦值此外還要從createFields中讀入p,U場(chǎng),我們要加入的新的變量場(chǎng)為溫度場(chǎng)T,最快的加入溫度場(chǎng)的方法是拷貝p場(chǎng)的代碼,修改為 Info<< "Reading field Tn" << endl;
54、 volScalarField T ( IOobject ( "T", runTime.timeName(), mesh,
55、0;IOobject:MUST_READ, IOobject:AUTO_WRITE ), mesh );這樣,創(chuàng)建了新的vol標(biāo)量場(chǎng)T,從文件T中讀入。對(duì)于T的創(chuàng)建具體解釋如下:a)創(chuàng)建了標(biāo)量場(chǎng)Tb)T通過(guò)讀(IOobject:MUST_READ)在runTime.timeName()目錄下名稱為“T”的文件創(chuàng)建,在開始計(jì)算時(shí),runTime.timeName()是contorlDict中
56、設(shè)定的startTime值決定的。c)T將自動(dòng)寫入(IOobject:AUTO_WRITE)計(jì)算結(jié)果到runTime.timeName()目錄中,runTime.timeName()隨迭代是變化的,寫入控制由contorlDict中設(shè)定。d)T是定義在mesh對(duì)象上的,這意味著T在內(nèi)部cell上有值internalField,在邊界上還需要邊界條件,這與polyMesh/boundary中要一致。2)在求解器中加入新的求解方程 下一步回到myicoFoam.C加入新的微分方程,由于溫度場(chǎng)依賴于速度場(chǎng),可放在PISO循環(huán)后面。#
57、 include "continuityErrs.H" U -= rUA*fvc:grad(p); U.correctBoundaryConditions(); / Add the temperature equation
58、; fvScalarMatrix Teqn 溫度是標(biāo)量方程 ( fvm:ddt(T) + fvm:div(phi, T) 要用到界面流量 - f
59、vm:laplacian(DT, T) 擴(kuò)散項(xiàng) ); TEqn.solve(); 求解3)編譯wmake4)在算例中加入新方程的初始和邊界條件4.1拷貝一個(gè)cavity算例到mycavity4.2修改transportProperties字典文件,設(shè)定DTcd constant修改transportProperties文件,前面已提到DT要從該字典文件讀入。
60、設(shè)定DT=0.002m2/sDT DT 0 2 -1 0 0 0 0 0.002;4.3修改T文件,設(shè)定初始值和邊界cd 0 進(jìn)入0目錄拷貝一個(gè)T文件cp p T修改T文件為FoamFile version 2.0; format ascii; class
61、; volScalarField; object T;/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /dimensions 0 0 0 1 0 0 0;internalField uniform 300; 初始內(nèi)部點(diǎn)為300 movingWall
62、 type fixedValue;value uniform 350.; 邊界為350 fixedWalls type fixedValue;value uniform 300.;
63、0; 邊界為3005)修改離散格式和代數(shù)求解器求解控制文件A進(jìn)入system目錄由于溫度方程有非穩(wěn)態(tài)項(xiàng),對(duì)流項(xiàng),擴(kuò)散項(xiàng),分別要在ddt,div,laplacian中設(shè)置打開fvSchemes文件,添加divSchemes default none; div(phi,U) Gauss upwind; div(phi,T) Gauss upwind;laplacianSchemes&
64、#160; default none; laplacian(nu,U) Gauss linear corrected; laplacian(DT,T) Gauss linear corrected; laplacian(1|A(U),p) Gauss linear corrected;在fvSolution中設(shè)置代數(shù)求解器選項(xiàng) T PBiCG
65、preconditioner DILU; tolerance 1e-06; relTol 0; 注意T方程形成的矩陣是非對(duì)稱的,不要用PCG和DIC6)運(yùn)行myicoFoam . mycavity七.OpenFOAM程序開發(fā)求解器的詳細(xì)分析1進(jìn)入icoFoam目錄可以看到createFields.H icoFoam.C
66、160;icoFoam.dep Make/ Make/為wmake編譯所需的文件IcoFoam.C為主程序文件,它包含createFields.H編輯icoFoam.C可以看到icoFoam.C首先引入的頭文件為fvCFD.H。所以你可以看到,在編譯選項(xiàng)options中EXE_INC = -I$(LIB_SRC)/finiteVolume/lnInclude /fvCFD.H的存放目錄EXE_LIBS = -lfiniteVolume
67、 /需要鏈接的庫(kù)找到fvCFD.H,編輯,可以看出這些是主程序必須的類庫(kù)#ifndef fvCFD_H#define fvCFD_H#include "parRun.H"#include "Time.H" 時(shí)間類#include "fvMesh.H" 網(wǎng)格類#include "fvc.H"
68、; fvc類#include "fvMatrices.H" fvMatrix類#include "fvm.H" fvm類#include "linear.H"#include "calculatedFvPatchFields.H"#include "
69、fixedValueFvPatchFields.H"#include "adjustPhi.H"#include "findRefCell.H"#include "mathematicalConstants.H"#include "OSspecific.H"#include "argList.H"#ifndef namespaceFoam#define namespaceFoam using namespace Foam;#endif#endif再看看icoFo
70、am的程序體,了解一下求解程序的結(jié)構(gòu)#include "fvCFD.H" (頭文件) 通常位于main函數(shù)前,是程序所需的類的定義/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /int main(int argc, char *argv)
71、160; (包含文件)# include "setRootCase.H" # include "createTime.H"# include "createMesh.H"包含文件通常是程序片斷,如創(chuàng)建時(shí)間、創(chuàng)建網(wǎng)格等(求解器代碼)# include "createFields.H"
72、; 需要根據(jù)應(yīng)用,單獨(dú)寫的代碼,如"createFields.H"和Main,以及Ueqn,pEqn等 # include "initContinuityErrs.H" / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
73、 /。八.OpenFOAM程序開發(fā)求解器的詳細(xì)分析2a.場(chǎng)變量的定義引用前面的溫度場(chǎng) Info<< "Reading field Tn" << endl; volScalarField T ( IOobject ( "T",
74、 runTime.timeName(), mesh, IOobject:MUST_READ, IOobject:AUTO_WRITE ), mesh );例如volScalarField CO2(IOobje
75、ct("CO2",runTime.timeName(),mesh,IOobject:READ_IF_PRESENT,IOobject:AUTO_WRITE),mesh,/ Optional declaration, this can be done by accessing a file in "case/0/",量綱可在文件中讀/ dimensionedScalar("zero", dimensionSet(1,-1,-3,0,0,0,0), value);b.場(chǎng)變量的使用場(chǎng)變量有定義在內(nèi)部cell上的值,也有邊界上的值例如給組分限
76、值Example of a mass fraction limiter used in this project:/ Initialize the variable Y_i for use in a loopscalarField& CO2Internal = CO2.internalField(); 引用內(nèi)部點(diǎn)/ Loop for all mesh points 遍歷內(nèi)部點(diǎn)forAll(CO2, celli)/ Limits the mass fraction to a positive numberif (CO2Internalcelli < 0.0)
77、CO2Internalcelli = 0.0;/ Limits the mass fraction to max 1.0if (CO2Internalcelli > 1.0)CO2Internalcelli = 1.0;c.定義輸運(yùn)方程OpenFOAM 定義方程時(shí)要選擇一種類型的fvMatrix,有fvScalarMatrix和fvVectorMatrix離散格式在case/system/fvSchemes.中設(shè)定/ Define a ScalarMatrix as a objectfvScalarMatrix CO2Eqn 定義系數(shù)矩陣(fvm:div(phi, CO2)
78、 對(duì)流項(xiàng)離散fvm:div- fvm:laplacian(turbulence->nuEff(),CO2) 擴(kuò)散項(xiàng)離散fvm:div= S_CO2 源項(xiàng) );/ Apply underrelaxation to the equation/ Under relaxation factors defined in file: fvSolutionCO2Eqn.relax(); 松弛CO2Eqn.solve(); 求解運(yùn)用OpenFOAM編譯器wmake編譯自己的程序本文將OpenFoam的編譯系統(tǒng)介紹一下,并給出了如何在OpenFOAM下編譯“h
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024實(shí)習(xí)合同書范本參考
- 2024裝修工程協(xié)議合同
- 個(gè)人借款合同法律解讀
- 2024個(gè)人門面房屋租賃合同書常用版
- 經(jīng)典代理合同參考
- 企業(yè)租車協(xié)議書樣式
- 2024年度環(huán)保工程設(shè)計(jì)與施工合同
- 2024房屋抵款合同書
- 2024解除勞動(dòng)合同的賠償
- 成都市古建筑工程施工合同
- 2023年?duì)I養(yǎng)師、營(yíng)養(yǎng)指導(dǎo)員專業(yè)技能及理論知識(shí)考試題庫(kù)(附含答案)
- 斜井敷設(shè)電纜措施
- 施工機(jī)械設(shè)備租賃實(shí)施方案
- 牙膏產(chǎn)品知識(shí)課件
- 液化氣站人員勞動(dòng)合同范本
- 第一章 教育政策學(xué)概述
- 常見(jiàn)土源性寄生蟲演示文稿
- 全員育人導(dǎo)師制學(xué)生談話記錄
- 了解學(xué)前兒童科學(xué)領(lǐng)域核心經(jīng)驗(yàn)
- 幼兒園師德師風(fēng)考核表實(shí)用文檔
- 2023年職業(yè)技能-外匯業(yè)務(wù)考試歷年真題甄選版帶答案-1
評(píng)論
0/150
提交評(píng)論