OF:OpenFOAM记录
之前在折腾OpenFOAM的过程中的一点笔记,在这记录备份一下,比较杂乱
OpenFOAM学习笔记
0、ubuntu的有用命令
1、重启Ubuntu网卡命令
service network restart
2、Ubuntu安装中文汉化包
sudo apt install language-pack-zh-hans
3、批量kill进程
ps -ef|grep 进程名称 |awk '{print $2}'|xargs kill”
4、更改source list 源
备份source list
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
打开source list
sudo gedit /etc/apt/sources.list
添加清华大学镜像源
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
1、安装
1.1. OpenFOAM安装
OpenFOAM安装摘抄自李东岳网站的安装笔记
以下安装过程适用于Ubuntu20.04/19.10/18.10/18.04系统,以及原生OpenFOAM-3.0以上的版本,其他各版本可能会出现若干问题。
(1)安装好ubuntu系统,并确保ubuntu可以联网
、确保内存最好在10G以上
。
(2)安装依赖库:
sudo apt update
sudo apt-get install build-essential flex bison git-core cmake zlib1g-dev libboost-system-dev libboost-thread-dev libopenmpi-dev openmpi-bin gnuplot libreadline-dev libncurses-dev libxt-dev
(3)从Github
上下载源代码OpenFOAM-8以及第三方库ThirdParty-8
(4)配置环境变量,在.bashrc
文件中添加环境变量
gedit $HOME/.bashrc
#添加源 bashrc中存有openFOAM中定义的变量
source $HOME/OpenFOAM/OpenFOAM-8/etc/bashrc
#定义环境变量
export FOAM_RUN=/home/ctw/OpenFOAM_run
关闭终端,$HOME/.bashrc
中定义的变量在Terminal
打开前生效。
(5)编译OpenFOAM:打开终端,输入(即切换到OpenFOAM-8目录下):
cd $HOME/OpenFOAM/OpenFOAM-8/
然后输入:
./Allwmake -j
这时候会输出大量的信息,并行编译开始(大约需要几十分钟)。编译之后请尝试运行以下命令生成网格:
blockMesh
如果显示如下信息:
1.2. ParaView(后处理工具)安装
1.3. 编译版paraFoam
(1)键入:
cd $HOME/OpenFOAM/ThirdParty-8
sudo apt install libqt5x11extras5-dev libxt-dev qt5-default qttools5-dev curl
(2)终端键入:
./makeParaView
其中会自动下载ParaView-5.6.3并开始编译,编译过程较长。编译完成后会显示Installation complete for paraview-5.6.3等信息。
(2)分四次键入
wmRefresh
cd $FOAM_UTILITIES/postProcessing/graphics/PVReaders
./Allwclean
./Allwmake
将会再次开始编译过程。几分钟即编译完成。然后键入paraFoam即可运行。
1.4. 多版本共存
不同大厂的OpenFOAM版本各有特性,因此用户可能具有多版本OpenFOAM共存的需求。多版本OpenFOAM共存非常简单。举例说明:如果用户打算在Ubuntu系统上安装OpenFOAM-8以及OpenFOAM-7,可在终端输入:
gedit $HOME/.bashrc
会打开一个文件,在文件的最底部重新取一行添加下述两行文字:
alias of8="source ~/OpenFOAM/OpenFOAM-8/etc/bashrc"
alias of7="source ~/OpenFOAM/OpenFOAM-7/etc/bashrc"
保存并关闭。重新打开新的终端的时候,环境变量自动生效。这时如果用户键入:
of8
则调用OpenFOAM-8环境,类似的,键入:
of7
则调用OpenFOAM-7环境。
2、模拟步骤
2.1. 算例文件结构设置:
3、OpenFOAM第三方工具
3.1 网格转换工具
3.1.1 CCM+转OpenFoam格式
Star-CCM+生成格式导出为OpenFoam可用格式工具localCCM26ToFOAM.
mkdir -p $WM_PROJECT_USER_DIR
cd $WM_PROJECT_USER_DIR
下载对应版本按装文件
# If you want to download in tar format
wget "https://github.com/wyldckat/localCCM26ToFOAM/archive/of4.tar.gz"
tar -xf of4.tar.gz
编译安装
./ccm26local
查看帮助提示
ccm26ToFoam -help
使用命令(使用前先备份CCM网格文件)
ccm26ToFoam *.ccm
3.2 造波工具库
3.2.1 olaFlow编译与使用
git源代码以及编译
cd $FOAM_SOLVERS
git clone git://github.com/phicau/olaFlow.git
cd olaFlow
./allMake
3.3 fftw库编译
Linux下FFTW库的安装
FFTW(the Fastest Fourier Transform in the West)库是由MIT(Massachusetts Institute of Technology)的Matteo Frigo和Steven G. Johnson开发的,用于一维和多维实数或复数的离散傅里叶变换。
-
下载 fftw-2_1_3_tar.gz (www.fftw.org, or www.rpmfind.net )
-
tar zxvf fftw-2_1_3_tar.gz 展开压缩文件
-
在Linux中安装FFTW:
a../configure --enable-type-prefix --prefix=/usr/local/fftw --with-gcc --disable-fortran --enable-i386-hacks
其中,--enable-type-prefix 参数是为了同时使用single precision(单精度)和double precision(双精度),如果不使用它,最后只有以rfftw开头的文件被安装(real fftw);
--prefix= 参数是设定安装目录;
--with-gcc 使用gcc编译器;
--disable-fortran 参数为了不包含Fortran调用的机制;
--enable-i386-hacks 为Pentium和x86以后的CPU优化gcc的编译速度。
b.make 编译
c.make install 安装,这一次安装完后,在安装目录中存在以dfftw和drfftw开头文件,但没有sfftw开头的文件
d.make clean 还需要安装一次,先清除
e../configure --enable-float --enable-type-prefix --prefix=/usr/local/fftw --with-gcc --disable-fortran --enable-i386-hacks
其中,--enable-float 为了生成单精度计算的头文件和库文件,即以sfftw开头的文件。
f.make 重新编译
g.make install 再一次安装,安装完后,目录中便会同时存在sfftw和dfftw开头的文件(用于复数函数/complex function的FFT变换)和srfftw与drfftw开头的文件(用于实数函数的FFT变换)
例如,如果需要用到双精度的实数FFT变换/FFTs,那么在编译的链接命令中需要按如下顺序加入
-ldrfftw -ldfftw参数
fftw3库测试函数
/*****************************
* filename: test_fftw.cpp
* author : Tiao Lu
* Company : School of Mathematical Sciences, Peking University
* 编译命令: g++ -o test_fftw.exe test_fftw.cpp -lfftw3
* Date : September 30th, 2007
* Description: This code is an example to show the use of the free code FFTW, which implements the Fast Fourier Trasformation algorithm.
*/
#include <complex>
#include <fftw3.h>
#include <math.h>
#include <iostream>
#define N 10
using namespace std;
int main(int argc, char * argv[]){
fftw_complex in[N], out[N];
fftw_plan p;
//一维dft,in 输入,out输出,FFTW_FORWARD 表示 exp 上指数是负号
// out = F in
//where out and in are two vectors of the same length n, and F is a n-by-n matrix with the (j,k) element
// F jk = exp(-i 2 pi j k /n). i 是虚数单位.
p=fftw_plan_dft_1d(N,in,out,FFTW_FORWARD,FFTW_MEASURE);
for(int i=0;i <N;i ++) {
in[i][0]=i;
in[i][1]=0.0;
}
fftw_execute(p);
for(int i=0;i <N;i ++){
cout<<out[i][0]<<" "<<out[i][1]<<endl;
}
//验证是否 out[3] = \sum_{k=0}^{N-1}exp(-i 2pi 3 k/N)in[k]
complex<double> temp = 0.0;
for(int k =0; k < N; k ++){
double pi = 4*atan(1.0);
temp += exp(complex<double>(0.0,-2.0*pi*3*k/N))*complex<double>(in[k][0],in[k][1]);
}
cout<<"out[3] is "<<temp<<endl;
fftw_complex out1[N];
fftw_plan p1;
//一维dft,in 输入,out输出,FFTW_BACKWARD 表示 exp 上指数是正号
// out = IF in
//where out and in are two vectors of the same length n, and IF is a n-by-n matrix with the (j,k) element
// IF jk = exp( +i 2 pi jk/n). i 是虚数单位.
p1=fftw_plan_dft_1d(N,out1,in,FFTW_BACKWARD,FFTW_MEASURE);
for(int i=0;i <N;i ++){
out1[i][0]=out[i][0];
out1[i][1]=out[i][1];
}
fftw_execute(p1);
//注意这里得到的 in 并不是和原来的in 的数值不同,比较之后发现,现在的in
// 是原来的 in 的 N 倍。原因是这里的定义的逆傅立叶变换没有除以 N.
//这和课本中定义的逆傅立叶变换不同。
for(int i=0;i <N;i ++){
cout<<in[i][0]<<" "<<in[i][1]<<endl;
}
fftw_destroy_plan(p);
fftw_destroy_plan(p1);
return 1;
}
4、动态编译自定义库
建立个人的库文件夹
mkdir -p $WM_PROJECT_USER_DIR
cd $WM_PROJECT_USER_DIR
4.1 基于OpenFoam平台的编译库/EXE的文件结构
mkdir myFirstLib
cd myFirstLib
mkdir Make
cd Make
touch options
touch files
- myFirstLib
- Make
- options
- files
- myFirstLib.C
- myFirstLib.H
- Make
4.2 例子:
c文件
#include <iostream>
#include "myClass.C"
#include "fvCFD.H"
using namespace std;
int main()
{
myClass myClass1;
myClass1.assignA(4);
myClass1.assignB(10);
myClass1.output();
myClass1.sum();
myClass1.output();
return 0;
}
#files文件
myLibTest.C
EXE = $(FOAM_USER_APPBIN)/myFirstLibTest
EXE_INC链接头文件地址
EXE_LIBS链接库文件
#options文件
EXE_INC = \
-I$(LIB_SRC)/finiteVolume/lnInclude \
-I$(LIB_SRC)/meshTools/lnInclude \
-I/home/ctw/OpenFOAM_run/build_lib/lnInclude
EXE_LIBS = -L$(FOAM_USER_LIBBIN) \
-lmyFirstLib
4.3 编译库与编译EXE的区别
4.3.1 files文件区别
#链接生成Lib
myHOSLib.C
LIB = $(FOAM_USER_LIBBIN)/libmyHOSLib
#链接生成EXE
HOS_usercode.C main.C
EXE = $(FOAM_USER_APPBIN)/HOS
4.3.2 options文件区别
#链接生成Lib
LIB_INC = \
-I$(LIB_SRC)/finiteVolume/lnInclude \
-I$(LIB_SRC)/meshTools/lnInclude \
-I/home/ctw/OpenFOAM_run/build_lib/lnInclude \
-I/usr/include
LIB_LIBS = -L/usr/lib/x86_64-linux-gnu \
-lfftw3
#链接生成EXE
EXE_INC = \
-I$(LIB_SRC)/finiteVolume/lnInclude \
-I$(LIB_SRC)/meshTools/lnInclude \
-I/home/ctw/OpenFOAM_run/build_lib/lnInclude \
-I/usr/include
EXE_LIBS = -L/usr/lib/x86_64-linux-gnu \
-lfftw3
注意
:
1、编译Lib文件时需要以 **lib **开头
2、链接自定义库时,首先需要在EXE_INC包含头文件,其次需要在EXE_LIBS包含动态库(.so文件)
例如
#options文件
EXE_INC = \
-I$(LIB_SRC)/finiteVolume/lnInclude \
-I$(LIB_SRC)/meshTools/lnInclude \
-I/home/ctw/OpenFOAM_run/build_HOS_Lib/lnInclude \
-I/usr/include
EXE_LIBS = -L/home/ctw/OpenFOAM/ctw-8/platforms/linux64GccDPInt32Opt/lib \
-lmyHOSLib