想搞懂openFOAM整個程序的結構,瞭解程序開發過程中幾個命名的文件夾的作用比較重要。這裏單獨瞭解一下。
openFOAM7的全部文件夾羅列如下:
dyfluid@dyfluid:~/OpenFOAM/OpenFOAM-7$ ls
Allwmake bin doc platforms src tutorials
applications COPYING etc README.org test wmake
其中Allwmake
爲openFOAM中的編譯命令,類似make。而COPYING
爲配置文件。README.ory
文件則類似軟件開發日誌。最重要的是幾個主要的文件夾的作用。
tutorials
這個是openFOAM教程中最早介紹的文件夾,內容如下:
dyfluid@dyfluid:~/OpenFOAM/OpenFOAM-7/tutorials$ ls
Allclean combustion electromagnetics IO resources
Allrun compressible financial lagrangian stressAnalysis
Alltest discreteMethods heatTransfer mesh
basic DNS incompressible multiphase
其實對應的是所有的標準算例,每個文件夾的名字就對應了問題的類型。比如筆者現在比較關注的燃燒,就對應文件夾combustion
applications
對應內容如下:
dyfluid@dyfluid:~/OpenFOAM/OpenFOAM-7/applications$ ls
Allwmake solvers test utilities
在打開一層:
dyfluid@dyfluid:~/OpenFOAM/OpenFOAM-7/applications/solvers$ ls
basic discreteMethods financial lagrangian
combustion DNS heatTransfer multiphase
compressible electromagnetics incompressible stressAnalysis
對應的是前面tutorials
文件夾中的所有算例的程序的源代碼,比如現在我們關注的是0維的純化學燃燒。在標準算例中的路徑如下:
dyfluid@dyfluid:~/OpenFOAM/OpenFOAM-7/tutorials/combustion/chemFoam$ ls
gri h2 ic8h18 ic8h18_TDAC nc7h16 README
我們執行其中的算例使用的是chemFoam
,這個命令的源碼來自:
dyfluid@dyfluid:~/OpenFOAM/OpenFOAM7/applications/solvers/combustion/chemFoam$ ls
chemFoam.C hEqn.H setDeltaT.H
createBaseFields.H Make solveChemistry.H
createControls.H output.H thermoTypeFunctions.H
createFieldRefs.H pEqn.H YEqn.H
createFields.H readControls.H
createSingleCellMesh.H readInitialConditions.H
我們注意到其中只有一個.C
文件chemFoam.C
,這是當前這個源碼的主函數,剩下的部分通過頭文件的方式添加代碼段。
但是需要注意的是當前這個文件夾中並不包含chemFoam
這個程序所有的源碼段。我們打開其中的Make
文件夾,其中還記錄了當前源碼使用的外鏈庫:
dyfluid@dyfluid:~/OpenFOAM/OpenFOAM-7/applications/solvers/combustion/chemFoam/Make$ vim options
EXE_INC = \
-I$(LIB_SRC)/thermophysicalModels/specie/lnInclude \
-I$(LIB_SRC)/thermophysicalModels/reactionThermo/lnInclude \
-I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
-I$(LIB_SRC)/transportModels/compressible/lnInclude \
-I$(LIB_SRC)/ODE/lnInclude\
-I$(LIB_SRC)/thermophysicalModels/chemistryModel/lnInclude \
-I$(LIB_SRC)/finiteVolume/lnInclude \
-I$(LIB_SRC)/meshTools/lnInclude
EXE_LIBS = \
-lchemistryModel \
-lfiniteVolume \
-lmeshTools
這裏的$(LIB_SRC)
其實是指根目錄下的src
這個文件夾,即對應路徑:
dyfluid@dyfluid:~/OpenFOAM/OpenFOAM-7/src$
下面我們再看看這個文件夾
src
內容如下:
dyfluid@dyfluid:~/OpenFOAM/OpenFOAM-7/src$ ls
Allwmake genericPatchFields rigidBodyDynamics
atmosphericModels lagrangian rigidBodyMeshMotion
combustionModels mesh rigidBodyState
conversion meshTools sampling
dummyThirdParty ODE semiPermeableBaffle
dynamicFvMesh OpenFOAM sixDoFRigidBodyMotion
dynamicMesh OSspecific sixDoFRigidBodyState
engine parallel surfMesh
fileFormats Pstream thermophysicalModels
finiteVolume radiationModels topoChangerFvMesh
functionObjects randomProcesses transportModels
fvAgglomerationMethods regionCoupled triSurface
fvMotionSolver regionModels TurbulenceModels
fvOptions renumber waves
我們剛纔的option
配置文件中就使用了其中的部分源碼,比如說:
-I$(LIB_SRC)/thermophysicalModels/specie/lnInclude \
就對應瞭如下這些文件(太多了只羅列了一部分):
dyfluid@dyfluid:~/OpenFOAM/OpenFOAM7/src/thermophysicalModels/specie/lnInclude$ ls
absoluteEnthalpy.H logPolynomialTransportI.H
absoluteInternalEnergy.H makeLangmuirHinshelwoodReactions.C
adiabaticPerfectFluid.C makeMichaelisMentenReactions.C
adiabaticPerfectFluid.H makeReaction.H
adiabaticPerfectFluidI.H makeReactions.C
...
當然這裏只是提供了一個路徑,告訴源碼找頭文件可以從這裏找,並不是所有的頭文件都會被使用。具體使用了哪些需要閱讀chemFoam.C
的具體內容
我們再查看其中的其他文件,類似的提供了大量的源碼。就是說當前文件夾將共用的代碼提取到這裏作爲外鏈的源文件。
platforms
那麼配置文件中的options
選項對應哪裏,這裏就需要看下這個文件夾,首先來看下有什麼內容:
dyfluid@dyfluid:~/OpenFOAM/OpenFOAM-7/platforms$ l
linux64GccDPInt32Opt/ linux64GccDPInt32OptSYSTEMOPENMPI/
第二個既然標記了openMPI
那大概是對應了並行的部分,我們進入第一個文件夾:
dyfluid@dyfluid:~/OpenFOAM/OpenFOAM-7/platforms/linux64GccDPInt32Opt$ ls
applications bin lib src
再進入其中的lib
文件夾:
dyfluid@dyfluid:~/OpenFOAM/OpenFOAM-7/platforms/linux64GccDPInt32Opt/lib$ ls
dummy
libatmosphericModels.so
libbarotropicCompressibilityModel.so
libblockMesh.so
libchemistryModel.so
libcoalCombustion.so
libcombustionModels.so
libcompressibleEulerianInterfacialModels.so
...
給了非常非常多的.so
文件,這裏其實就對應我們所要鏈接的動態庫,比如我們使用了配置
-lfiniteVolume \
就對應了動態庫文件
libfiniteVolume.so
我們再查看文件的其他部分,有
dyfluid@dyfluid:~/OpenFOAM/OpenFOAM-7/platforms/linux64GccDPInt32Opt/applications/solvers/combustion/chemFoam$ ls
chemFoam.C.dep chemFoam.o options sourceFiles variables
我們可以看到這裏有.o
文件,就是說openFOAM
安裝的時候編譯好的可執行文件都放在platforms
這個文件夾中,當前對應了串行和並行兩個版本。
doc
首先看下內容
dyfluid@dyfluid:~/OpenFOAM/OpenFOAM-7/doc$ ls
codingStyleGuide.org Doxygen Guides tools
主要是用戶手冊之類的文件,Doxygen
是一個幫助閱讀的軟件,有空了解之後再來詳細說明
bin
內容如下:
dyfluid@dyfluid:~/OpenFOAM/OpenFOAM-7/bin$ ls
buoyantBoussinesqPimpleFoam foamSequenceVTKFiles
buoyantBoussinesqSimpleFoam foamTags
cavitatingDyMFoam icoUncoupledKinematicParcelDyMFoam
compressibleInterDyMFoam interDyMFoam
...
其實就是預先編譯好的可執行程序,不過並不是具體的算例。比如其中的foamCloneCase
,是進行初值的複製的。就是說功能性的命令都保存在這裏。
etc
百度了一下etc
通常用來存儲雜項內容,這裏適合也是這樣,主要是一系列的控制文件:
dyfluid@dyfluid:~/OpenFOAM/OpenFOAM-7/etc$ ls
bashrc cellModels config.csh controlDict paraFoam templates
caseDicts codeTemplates config.sh cshrc README.org thermoData
test
功能似乎類似$FOAM_RUN
wmake
wmake
是用Makfile
進行功能擴展得到的,其中的源碼就寫在這個文件夾中:
dyfluid@dyfluid:~/OpenFOAM/OpenFOAM-7/wmake$ ls
makefiles wclean wmakeCheckPwd wmakePrintBuild
platforms wcleanLnIncludeAll wmakeCollect wmakeScheduler
rules wcleanPlatform wmakeFilesAndOptions wmakeSchedulerUptime
scripts wdep wmakeLnInclude wrmdep
src wmake wmakeLnIncludeAll wrmo
具體的細節要在更加仔細的閱讀Makefile
用法之後再來閱讀。