Openfoam MPPIC make过程

1. 主框架

./allclean.sh

清理所有的不需要的,可以修改前面的判断条件,yes or no,判断清理的文件夹及文件有:

  1. boundbox
  2. init
  3. boundary
  4. mapping
  5. constant/polyMesh
  6. executable files
  7. OpenFOAM data: cellDist, cellDecomposition, processor*, 0.* 1* 2*....., VTK, *.stl
  8. MPPIC data: results/
  9. other files: log
./allmake.sh

make各部分,前面也是可以修改判断条件,yes or no。还要判断是否使用-parallel。要make的文件:

  1. Generate mesh files for OpenFOAM: blockMesh,判断是否用blockMesh,如果已经生成网格,就是NO
  2. Decompose mesh files when using parallel simulation: decomposePar
  3. Make boundbox for the simulation domain: 运行boundbox下的make.sh文件,后面详细读解,要判断是否parallel
  4. Generate wall to cell binary relationship file: 运行boudary下的make.sh文件和run.sh文件,要判断是否parallel
  5. Initialize parcel positions: init下面的make.sh文件和run.sh文件,要判断是否parallel
  6. Initialize mapping rules: mapping下面的make.sh文件和run.sh文件,要判断是否parallel
  7. 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}
  1. 在端口echo输出folder的名字,告诉你到了这一步
  2. 然后cd到folder的位置,链接过来的processor*文件夹下
  3. 从processor*下读取第9个字节右边的3位字节,等值给num
  4. 在processor*文件夹下,checkMesh之后,在输出语句中查找含有box的语句,并且要排除掉Tool和Case,然后输出到文件boundbox$num.ini内,后面举例checkMesh输出语句标红那句就是我们找的。
  5. 移动这个ini文件到前面定义的dir的路径,这里是指boundbox文件夹下。

最后的部分:

cd到boundbox文件夹下,把前面生成的链接什么的都删了。

checkMesh都输出些啥:

CheckMesh - OpenFOAMWiki

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

思路:

  1. 定义dir,设置基本链接
  2. 生成boundary types,调用了name2type.py运行。运行完name2type.py,输出name2type.ini,删掉tempfile2。
  3. 生成wall_stl file,如果-parallel,则根据processor循环,如果没有,则直接运行foamToSurface boundary0.stl. (Write the boundaries of a foam mesh in surface format,然后输出boundary0.stl或者带processor数字的stl文件)
  4. rebuild 'Make' 文件夹,wmakeFilesAndOptions在openfoam的wmake文件夹中,这里应该是对里面文件内容进行一些修改,重建了Make文件夹。调用rebuild.sh

     打开了wmakeFilesAndOptions看一下。

     $WM_DIR就是openfoam源代码的位置。打开了makeFiles和makeOptions看

  5. 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

     深入理解 OpenFOAM 环境变量与编译 - li12242 - 博客园 (cnblogs.com)

  6. 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

和前面相似

  1. 建立各种链接
  2. 运行前面wmake出来的init程序,有parallel就并行,不过它需要parcel_000_00000000.vtk,然后生成各种parcel_000_00000000.vtk.tmp,删掉parcel_000_00000000.vtk之后,然后重命名parcel_***_00000000.vtk.tmp成parcel_***_00000000.vtk
  3. 移走删除不要的链接和文件

init_main.cpp

const double PI = 3.1415926535897932;   /**< PI */
const double UMAX = 2;                  /**< Maximum parcel velocity. */

主要计算:

  1. 如果无-parallel,则load mesh,一直到第10步
  2. get total volume of fluid domain
  3. 读parameter.ini的参数,输出参数
  4. 读取parcel number in domain,nr
     nr = int(vdomain * prmt.esavg / prmt.cp / (PI * pow(prmt.dp, 3) / 6));
  5. 写parcel positions和velocities到vtk文件
  6. 获得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);
    

  7. 获得随机或者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;
     

  8. 输出一些基本信息到"parcel_000_00000000.vtk"
  9. 如果-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

根据不同要求用不同编译器:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值