OpenFOAM常用類的一些總結(jié)_第1頁(yè)
OpenFOAM常用類的一些總結(jié)_第2頁(yè)
OpenFOAM常用類的一些總結(jié)_第3頁(yè)
OpenFOAM常用類的一些總結(jié)_第4頁(yè)
OpenFOAM常用類的一些總結(jié)_第5頁(yè)
已閱讀5頁(yè),還剩38頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論