1. 主框架
./allclean.sh
清理所有的不需要的,可以修改前面的判断条件,yes or no,判断清理的文件夹及文件有:
- boundbox
- init
- boundary
- mapping
- constant/polyMesh
- executable files
- OpenFOAM data: cellDist, cellDecomposition, processor*, 0.* 1* 2*....., VTK, *.stl
- MPPIC data: results/
- other files: log
./allmake.sh
make各部分,前面也是可以修改判断条件,yes or no。还要判断是否使用-parallel。要make的文件:
- Generate mesh files for OpenFOAM: blockMesh,判断是否用blockMesh,如果已经生成网格,就是NO
- Decompose mesh files when using parallel simulation: decomposePar
- Make boundbox for the simulation domain: 运行boundbox下的make.sh文件,后面详细读解,要判断是否parallel
- Generate wall to cell binary relationship file: 运行boudary下的make.sh文件和run.sh文件,要判断是否parallel
- Initialize parcel positions: init下面的make.sh文件和run.sh文件,要判断是否parallel
- Initialize mapping rules: mapping下面的make.sh文件和run.sh文件,要判断是否parallel
- Make mppic: mppic编译和链接executable file到当前路径
2. make.sh文件
举例boundbox下的: makd boundbox for the simulation domain
!/bin/bash
###--- Record current directory. ---###
dir=$(pwd)
###--- Make basic links. ---###
ln -s ../0/ .
ln -s ../constant/ .
ln -s ../system/ .
if [ "$1" = "-parallel" ]; then
ln -s ../processor* .
fi
###--- Make links for processor* and make box files. ---###
if [ "$1" = "-parallel" ]; then
for folder in `ls -1 -d processor* | grep -v ini`
do
echo ${folder}
cd ${dir}/${folder}
num=${folder:9:3}
checkMesh | grep box | grep -v Tool | grep -v Case > boundbox$num.ini
mv *.ini ${dir}
done
else
checkMesh | grep box | grep -v Tool | grep -v Case > boundbox0.ini
fi
###--- Remove. ---###
cd ${dir}
rm 0
rm constant
rm system
if [ "$1" = "-parallel" ]; then
ls -1 -d processor* | grep -v ini | xargs rm
fi
下面详细解读
一开始两部分是:
设置当下路径是dir,便于后面代码;
设置基本链接,连接0, constant, system下的文件到当下路径,方便调用读取。如果设置了-parallel,则要链接processor*到当下路径
第三部分:
如果-parallel,则要从processor*的名字读取数字到num,如0,1,2...来命名boundbox$num.ini,这个文件里面就展示了box的范围,如:
如果没有-parallel,则直接生成boundbox0.ini就行。
下面是具体语句解读:
for folder in `ls -1 -d processor* | grep -v ini`
- 这是一个循环,读取当下文件夹下的processor*的名字,按行输出列出文件夹名字,并且要排除掉还有ini的名字(可能有processor*.ini的文件?),folder就是这些名字的循环。
echo ${folder}
cd ${dir}/${folder}
num=${folder:9:3}
checkMesh | grep box | grep -v Tool | grep -v Case > boundbox$num.ini
mv *.ini ${dir}
- 在端口echo输出folder的名字,告诉你到了这一步
- 然后cd到folder的位置,链接过来的processor*文件夹下
- 从processor*下读取第9个字节右边的3位字节,等值给num
- 在processor*文件夹下,checkMesh之后,在输出语句中查找含有box的语句,并且要排除掉Tool和Case,然后输出到文件boundbox$num.ini内,后面举例checkMesh输出语句标红那句就是我们找的。
- 移动这个ini文件到前面定义的dir的路径,这里是指boundbox文件夹下。
最后的部分:
cd到boundbox文件夹下,把前面生成的链接什么的都删了。
checkMesh都输出些啥:
The output will be explained based on the checkMesh output for the tutorial $FOAM_TUTORIALS/incompressible/icoFoam/cavity.
1. Mesh statistics
points: 882 internal points: 0 faces: 1640 internal faces: 760 cells: 400 boundary patches: 3 point zones: 0 face zones: 0 cell zones: 0 Overall number of cells of each type: hexahedra: 400 prisms: 0 wedges: 0 pyramids: 0 tet wedges: 0 tetrahedra: 0 polyhedra: 0
2. Checking topology...
Boundary definition OK. Cell to face addressing OK. Point usage OK. Upper triangular ordering OK. Face vertices OK. Number of regions: 1 (OK). Checking patch topology for multiply connected surfaces ... Patch Faces Points Surface topology movingWall 20 42 ok (non-closed singly connected) fixedWalls 60 122 ok (non-closed singly connected) frontAndBack 800 882 ok (non-closed singly connected)
3. Checking geometry...
Overall domain bounding box (0 0 0) (0.1 0.1 0.01)
Mesh (non-empty, non-wedge) directions (1 1 0)
Mesh (non-empty) directions (1 1 0)
All edges aligned with or perpendicular to non-empty directions.
Boundary openness (8.47033e-18 -8.47033e-18 -5.901e-17) OK.
Max cell openness = 1.35525e-16 OK.
Max aspect ratio = 1 OK.
Minimum face area = 2.5e-05. Maximum face area = 5e-05. Face area magnitudes OK.
Min volume = 2.5e-07. Max volume = 2.5e-07. Total volume = 0.0001. Cell volumes OK.
Mesh non-orthogonality Max: 0 average: 0
Non-orthogonality check OK.
Face pyramids OK.
Max skewness = 1e-08 OK.
Coupled point location match (average 0) OK.
4. Conclusion
Mesh OK.
boundary文件夹下的一些特别语句解释: generate wall to cell binary relationship file
make.sh
思路:
- 定义dir,设置基本链接
- 生成boundary types,调用了name2type.py运行。运行完name2type.py,输出name2type.ini,删掉tempfile2。
- 生成wall_stl file,如果-parallel,则根据processor循环,如果没有,则直接运行foamToSurface boundary0.stl. (Write the boundaries of a foam mesh in surface format,然后输出boundary0.stl或者带processor数字的stl文件)
- rebuild 'Make' 文件夹,wmakeFilesAndOptions在openfoam的wmake文件夹中,这里应该是对里面文件内容进行一些修改,重建了Make文件夹。调用rebuild.sh
打开了wmakeFilesAndOptions看一下。
$WM_DIR就是openfoam源代码的位置。打开了makeFiles和makeOptions看
wmake
是用Makfile
进行功能扩展得到的,其中的源码就写在openfoam的wmake文件夹中,对前一步修改之后的cpp文件等都再编译一次,生成了boundary这个可执行文件?###--- Make. ---### wmake -s .
调用了make运行wmake下的Makefile,和在scripts下的Make,Makefile里面设编译器的rules代码为linux64Icc,这是个啥哦:
make 一个工具程序,它会读 makefile 脚木来确定程序中的哪个部分需要编泽和连接,然后发布 必要的命令。它读出的脚木(叫做 makefile 或 Makefile)定义了文件关系和依赖关系 The icc and icpc commands resemble the GNU equivalents gcc and g++.
发现编译器好像是icc
- remove各种链接和dep文件等,还有Make文件
checkMesh | grep "singly connected" > tempfile1
awk '{print $1}' tempfile1 > tempfile2
rm tempfile1
checkMesh之后,从输出语句中找singly connected这个词的句子,输出到tempfile1,
将tempfile1里面的每行按空格或TAB分割,输出文本中的第1项到tempfile2(前面checkMesh文件标黄的部分)
删除tempfile1
name2type.py
args = sys.argv[0:]
把所有输入都赋值给args,是一个列表
小知识:python中:
Python中[ : n]、[m : ]、[-1]、[:-1]、[::-1]、[2::-1]和[1:]的含义_SpringRolls的博客-CSDN博客_python是什么意思
[m : ] 代表列表中的第m+1项到最后一项
[ : n] 代表列表中的第一项到第n项
Python中 sys.argv[]的用法简明解释 - 覆手为云p - 博客园 (cnblogs.com)
sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个“外部”很关键,所以那些试图从代码来说明它作用的解释一直没看明白。因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可以看作是一个列表,所以才能用[]提取其中的元素。其第一个元素是程序本身,随后才依次是外部给予的参数。
从tempfile2里读patch的名字,然后输出让我们手动输入是什么types,输出到name2type.ini文件
首先输出提示语句,准备一个可写文件name2type.ini:
print('Please input boundary types: (wall(w) or outlet(o) or proc(p))')
print('Default type is \'wall\'')
ofile = open('name2type.ini', 'w')
打开tempfile2可读模式,读key和输入value,然后输出到name2tyep.ini中,如果用-parallel,则还要输入procBoundary proc的一行,内容如下截图:
ifile = open('tempfile2', 'r')
for key in ifile.readlines():
key = key.strip('\n')
stmp = key + ': '
value = raw_input(stmp)
if (value != 'wall' and value != 'outlet'):
value = 'wall'
pair = key + '\t' + value + '\n'
ofile.writelines(pair)
if args == '-parallel':
pair = 'procBoundary' + '\t' + 'proc' + '\n'
ofile.writelines(pair)
ifile.close()
ofile.close()
rebuild.sh
#!/bin/bash
wmakeFilesAndOptions
for all in `ls *.cpp`;
do
sed -i '1i\'${all} Make/files
done
sed -i 's/$(FOAM_APPBIN)\///g' Make/files
patch -s Make/options options.patch
sed在进行一些正则化运算,修改Make/files文件内容,然后patch,升级options文件为options.patch文件。
Linux patch命令用于修补文件。patch指令让用户利用设置修补文件的方式,修改,更新原始文件。倘若一次仅修改一个文件,可直接在指令列中下达指令依序执行。如果配合修补文件的方式则能一次修补大批文件,这也是Linux系统核心的升级方法之一。
Linux patch命令 | 菜鸟教程 (runoob.com)
run.sh
链接各种需要文件夹,判断是不是parallel,运行前面编译好的可执行文件boundary,(具体内容可以读cpp文件),然后删掉链接的文件夹等。
bound_main.cpp
主要干事情:读stl和ini文件的参数,计算neighbour lists,调用其他cpp代码写文件,然后free memory。
init文件夹: initialize parcel position
make.sh
export WM_NCOMPPROCS=8
这句话是设定多线程的编译,###--- Use parallel compilation. ---###
思路:和前面的make.sh一样,设定dir路径,rebuild.sh,然后wmake重建的Make,然后删除不要的。
rebuild.sh
和前面的也一样,重建Make/files, Make/options
run.sh
和前面相似
- 建立各种链接
- 运行前面wmake出来的init程序,有parallel就并行,不过它需要parcel_000_00000000.vtk,然后生成各种parcel_000_00000000.vtk.tmp,删掉parcel_000_00000000.vtk之后,然后重命名parcel_***_00000000.vtk.tmp成parcel_***_00000000.vtk
- 移走删除不要的链接和文件
init_main.cpp
const double PI = 3.1415926535897932; /**< PI */
const double UMAX = 2; /**< Maximum parcel velocity. */
主要计算:
- 如果无-parallel,则load mesh,一直到第10步
- get total volume of fluid domain
- 读parameter.ini的参数,输出参数
- 读取parcel number in domain,nr
nr = int(vdomain * prmt.esavg / prmt.cp / (PI * pow(prmt.dp, 3) / 6));
- 写parcel positions和velocities到vtk文件
- 获得parcels的随机位置 POINTS, VERTICES
double xp = rand() / double(RAND_MAX) * prmt.lx * prmt.xini + prmt.xmin; double yp = rand() / double(RAND_MAX) * prmt.ly * prmt.yini + prmt.ymin; double zp = rand() / double(RAND_MAX) * prmt.lz * prmt.zini + prmt.zmin; Foam::vector position; position[0] = xp; position[1] = yp; position[2] = zp; label cellid = myMeshSearch.findCell(position);
- 获得随机或者0速度,这里是0速度
/* double ux = UMAX * (rand() / double(RAND_MAX) - 0.5); double uy = UMAX * (rand() / double(RAND_MAX) - 0.5); double uz = UMAX * (rand() / double(RAND_MAX) - 0.5); */ double ux = 0.0; double uy = 0.0; double uz = 0.0;
- 输出一些基本信息到"parcel_000_00000000.vtk"
- 如果-parallel,则load mesh,从"parcel_000_00000000.vtk"读串行初始parcel位置,写入"parcel_%03d_00000000.vtk.tmp",那parallel之前不是得有"parcel_000_00000000.vtk"吗?
mapping文件夹:initialize mapping rules
make.sh
和前面的一样,rebuild.sh,wmake编译,rm
rebuild.sh
和前面也一样,重建Make
run.sh
建立链接,运行前面编译的程序mapping,生成映射关系,删掉各种链接
map_main.cpp
/**
* @file mapping/map_main.cpp
* @brief Main program of mapping.
* @note Monte Carlo method is used here to obtain the mapping relations
* between fluid irregular cells and solid regular Cartisian cells or
* grids. Generate a mass of points in the begining, and then statistic
* points number and positions of each intersection of fluid cell and
* solid cell. Based on this method, the volume, barycentre of each
* intersection can be easily obtained, and the mapping relations
* between fluid cells and solid cells as well as the fluid cells and
* solid grids can be inferred from the volume and barycentre. Besides,
* boundary corrections are concerned here, including corrections for
* solid cells and solid grids.
* @author Jiang Yong [chiangyung@aliyun.com]
* @version 1.3.s
* @date Wed 17 Jan 2018 01:02:34 PM CST
******************************************************************************/
mppic文件夹
(1条消息) 【转载】C/C++完整编译过程详解 (拿来读懂makefile文件)_imastrid的博客-CSDN博客
后面的例子就是这个的makefile
根据不同要求用不同编译器: