ok!经过一系列的铺垫,我们来尝试一下提取出openFOAM中的chemFoam
程序的源码,然后用Makefile
编译运行一下,这样可以帮助我们进行二次开发。
呃。。。这个怎么说呢。。。openFOAM一个单独算例的程序依赖深度超过我的预期了。首先程序编译的过程是有记录的,保存如下路径下的文件:
dyfluid@dyfluid:~/OpenFOAM/OpenFOAM-7/platforms/linux64GccDPInt32Opt/applications/solvers/combustion/chemFoam$ vim chemFoam.C.dep
打开后内容如下:
$(OBJECTS_DIR)/chemFoam.C.dep: \
chemFoam.C \
$(WM_PROJECT_DIR)/src/finiteVolume/lnInclude/fvCFD.H \
$(WM_PROJECT_DIR)/src/thermophysicalModels/reactionThermo/lnInclude/rhoReactionThermo.H \
$(WM_PROJECT_DIR)/src/thermophysicalModels/chemistryModel/lnInclude/BasicChemistryModel.H \
$(WM_PROJECT_DIR)/src/thermophysicalModels/reactionThermo/lnInclude/reactingMixture.H \
$(WM_PROJECT_DIR)/src/thermophysicalModels/chemistryModel/lnInclude/chemistrySolver.H \
$(WM_PROJECT_DIR)/src/OpenFOAM/lnInclude/OFstream.H \
$(WM_PROJECT_DIR)/src/thermophysicalModels/specie/lnInclude/thermoPhysicsTypes.H \
$(WM_PROJECT_DIR)/src/thermophysicalModels/reactionThermo/lnInclude/basicSpecieMixture.H \
...
这个文件足足一千多行,记录了所有的编译依赖。我们观察一下程序的正文,chemFoam.C
:
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Application
chemFoam
Description
Solver for chemistry problems, designed for use on single cell cases to
provide comparison against other chemistry solvers, that uses a single cell
mesh, and fields created from the initial conditions.
\*---------------------------------------------------------------------------*/
#include "fvCFD.H" //finiteVolume/lnInclude
#include "rhoReactionThermo.H" //reactionThermo/lnInclude
#include "BasicChemistryModel.H" //chemistryModel/lnInclude
#include "reactingMixture.H" //reactionThermo/lnInclude
#include "chemistrySolver.H" //chemistryModel/lnInclude
#include "OFstream.H" //OpenFOAM/lnIncldue
#include "thermoPhysicsTypes.H" //specie/lnInclude
#include "basicSpecieMixture.H" //reactionThermo/lnInclude
#include "cellModeller.H" //OpenFOAM/lnIncldue
#include "thermoTypeFunctions.H" //current dir
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
int main(int argc, char *argv[])
{
argList::noParallel();
#define CREATE_MESH createSingleCellMesh.H
#define NO_CONTROL
#include "postProcess.H" //OpenFOAM/lnInclude
#include "setRootCaseLists.H" //OpenFOAM/lnIncldue
#include "createTime.H" //OpenFOAM/lnIncldue
#include "createSingleCellMesh.H" //current dir
#include "createFields.H" //current dir
#include "createFieldRefs.H" //current dir
#include "readInitialConditions.H" //current dir
#include "createControls.H" //current dir
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Info<< "\nStarting time loop\n" << endl;
while (runTime.run())
{
#include "readControls.H" //current dir
#include "setDeltaT.H" //current dir
runTime++;
Info<< "Time = " << runTime.timeName() << nl << endl;
#include "solveChemistry.H" //current dir
#include "YEqn.H" //current dir
#include "hEqn.H" //current dir
#include "pEqn.H" //current dir
#include "output.H" //current dir
Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
<< " ClockTime = " << runTime.elapsedClockTime() << " s"
<< nl << endl;
}
Info << "Number of steps = " << runTime.timeIndex() << endl;
Info << "End" << nl << endl;
return 0;
}
// ************************************************************************* //
啊我这里本来非常天真的标记了每个头文件的路径,以为只有这些头文件。但是实际上,这些头文件中还会使用其他的头文件。最终总体使用的头文件总数还是很多的。预计总计有几万行的程序规模。
不过虽然多,但并不是完全没有规律,也并不是需要用到所有的源代码。需要使用的头文件只出现在如下几个文件夹中。
~/OpenFOAM/OpenFOAM-7/src/OpenFOAM
~/OpenFOAM/OpenFOAM-7/src/ODE
~/OpenFOAM/OpenFOAM-7/src/thermophysicalModels/basic
~/OpenFOAM/OpenFOAM-7/src/thermophysicalModels/specie
~/OpenFOAM/OpenFOAM-7/src/thermophysicalModels/chemistryModel
~/OpenFOAM/OpenFOAM-7/src/thermophysicalModels/reactionThermo
~/OpenFOAM/OpenFOAM-7/src/meshTools
~/OpenFOAM/OpenFOAM-7/src/finiteVolume
~/OpenFOAM/OpenFOAM-7/src/transportModels/compressible/
啊当然这也不少了,而且这个里面也并不是全部会用。另外,这里的文件夹中有一个规律,就是所有的代码都会出现两份,第一份分别放在各个文件夹中,表示各自的功能,然后最终所有的代码都会复制到同一个文件夹lnInclude
中,例如ODE
文件夹中的内容如下:
dyfluid@dyfluid:~/OpenFOAM/OpenFOAM-7/src/ODE$ ls
lnInclude Make ODESolvers ODESystem
理论上我们将所有文件夹中的lnInclude
都添加到chemFoam
目录中,就可以不修改路径的直接编译执行。
OK!那这个阶段算是勉强的完成了吧。