zhaopeng


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

OpenFOAM使用技巧总结

发表于 2019-04-30 | 分类于 OpenFOAM

OpenFOAM使用技巧总结(持续更新2019.01.06)

  1. 矢量数组可以新建为矢量列表形式,初始化方法为:
    List<vector> a = (n,vector::zero)
  2. 生成不同数据类型的链表并初始化:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include"Tuple2.H"
    List<Tuple2<label, List<scalar>>> complexData(100);
    forAll(complexData, i)
    {
    complexData[i].first() = rndGen.integer(0, Pstream::nProcs()-1);
    complexData[i].second().setSize(3);
    complexData[i].second()[0] = 1;
    complexData[i].second()[1] = 2;
    complexData[i].second()[2] = 3;
    }
  3. 尽量避免循环。
    例如:如果需要定义一个分段函数,可以利用pos 和neg函数:

    1
    2
    3
    4
    v = a, if x < b
    v = c if x > b
    // can be coded as
    volScalarField v = neg(x - b)*a + pos(x-b)*c;
  4. 多进程可以使用Sout或者Pout输出全部数据

  5. 从dictionary中读取vector和scalar不同:
    例如:
1
2
vector U1(dict.lookup("U1"));
scalar r1(readScalar(dict.loocup("r1")));

对于label读取没有专门函数,可以以scalar类型读取后进行强制类型转换;

dimensionedScalar以及dimenedsionVector的初始化:

1
2
dimensionedVector gravityAccele("gravityAccele",dimensionSet(0,1,-2,0,0), vector(0,0,-9.8));
dimensionedScslar gravityAccele("gravityAccele",dimensionSet(0,1,-2,0,0), -9.8);
  1. 对于并计算:
    Foam::gSum(a)可以获取不同进程中场a的加和;
    Pstream::nProcs()获取并行的进程数;
    Pstream::myProcNo()获取当前的进程数

  2. 对于已经画好的网格需要在某个方向平移,或者放大缩小可以采用transformPoints操作:

1
2
transformPoints -scale "(1 1 0.5)" 		//z方向网格点缩小0.5倍
transformPoints -translate "(0 0 0.5)" //z方向整体向上平移0.5
  1. 返回某一网格的8个顶点坐标:出自cfd-online,亲测有效
1
2
3
4
5
6
7
8
9
10
11
12
const faceList & ff = mesh.faces();
const pointField & pp = mesh.points();

forAll ( mesh.C(), celli)
{
const cell & cc = mesh.cells()[celli];
labelList pLabels(cc.labels(ff));
pointField pLocal(pLabels.size(), vector::zero);

forAll (pLabels, pointi)
pLobal[pointi] = pp[pLabels[pointi]];
}
  1. BiCGStab solver in OpenFOAM (收敛性更佳,适合rotating meshes)出自cfd-online,

    求解器网站:地址,

    注意:运行makeLib.sh(OpenFOAM-x.x.x/FoamFourierAnalysis/fftw-3.3.3/文件夹下configure加执行权限)。

  2. 输出错误并跳出执行(多用于程序调试过程中)

    1
    2
    FatalErrorIn("main.cpp pressure is unregular")
    << abort(FatalError);

虚拟机上在线安装OpenFOAMv6网络连接问题

发表于 2019-04-18 | 分类于 install

虚拟机上网络配置

在虚拟机虚拟机上安装CentOs7系统教程很多,在此不多做赘述,详情可参考.

不过需要注意的是,如果您想最小安装(无图像化界面,通过命令来操控)则选择下图的软件选择中最小安装即可

微信图片_20190418104831

如果要图像化界面,则需要点击软件选择,进去选择GNOME界面:

微信截图_20190418120145

接下来安装教程完成所有的安装以及网络设置。

可以通过在终端键入ping baidu.com来检查网络是否配置成功(如下图即为成功),

微信截图_20190418120323

若ping失败,如果您的主机是通过网线连接,则需要检查虚拟机设置中网络适配器是否通过NAT方式连接,如果不是,则需要修改

微信图片_20190418105919

修改完后返回虚拟机,在终端键入service network restart后再次ping进行测试。

如果不幸网路再次连接失败,需要点击下图的编辑->虚拟网络编辑器->更改设置界面后点击还原默认设置按照安装教程重新配置网络,当然不要忘记安装上图修改连接方式为NAT方式。

微信图片编辑_20190418110614

OpenFOAM安装

OpenFOAM安装是根据官网教程安装(特别要注意从主机往虚拟机复制文件时要采用复制粘贴 的形式,直接拖动会造成文件损坏)

具体命令摘录出来为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//检查linux操作系统版本是否是3.10或者更高
uname -r
// 安装准备以及正式安装
sudo yum -y update
curl -fsSL https://get.docker.com/ | sh
sudo systemctl enable docker.service
sudo systemctl start docker
sudo usermod -aG docker $(whoami)
sudo sh -c "wget http://dl.openfoam.org/docker/openfoam6-linux -O /usr/bin/openfoam6-linux"
sudo chmod 755 /usr/bin/openfoam6-linux
mkdir -p $HOME/OpenFOAM/${USER}-6
cd $HOME/OpenFOAM/${USER}-6
openfoam6-linux
// 装完测试
mkdir -p $FOAM_RUN
cd $FOAM_RUN
cp -r $FOAM_TUTORIALS/incompressible/simpleFoam/pitzDaily .
cd pitzDaily
blockMesh
simpleFoam
paraFoam

预祝大家安装顺利!

OpenFOAM按进程输出和输入文件

发表于 2019-03-28 | 分类于 OpenFOAM

OpenFOAM按进程输出和输入文件

在某些前处理过程中需要按进程输入或者输出某些文件,
例如输出网格中心高度大于0.2m的网格中心点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const volVectorField& C = mesh_.C();
string nProc = std::to_string(Pstream::myProcNo());//不同编译器形式不同
fileName gamma = "gamma" + "-" + nProc + ".data";
label count = 0;
forAll(C,cellI){
if(C[cellI][2]>0.2){
count++
}
}
FILE *fout = fopen(gamma.c_str(),"w");
fprintf(fout,"nGamma %d\n",count);
forAll(C,i){
if (C[i][2] <0.2){
fprintf(fout,"%f %f %f\n",C[i][0],C[i][1],C[i][2]);
}
}
fclose(fout);

在另一个程序中输入这些网格中心,并找到相应的cellID:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
char tmp[128];
int nGamma = 0;
float a = 0.0; //a,b,c必须被定义为float,不能用scalar;
float b = 0.0;
float c = 0.0;
string nProc = std::to_string(Pstream::myProcNo());
fileName gamma = "gamma" +"-" +nProc+".data";
FILE* fin = fopen(gamma.c_str(),"r");
if(fin == NULL){
Info<< "cannot find gamma file" << endl;
}
fscanf(fin,"%s %d",tmp,&nGamma);
vector listGamma;
for(int k = 0;k<nGamma;k++){
fscanf(fin,"%f %f %f",&a,&b,&c);
listGamma[0] = a ;
listGamma[1] = b ;
listGamma[2] = c ;
label cellID = mesh.findCell(listGamma);
}
fclose(fin);

需要注意的是在使用FILE输入输出文件时,最好使用C++本身函数,与openfoam自带函数有歧义时,需要添加std::。

ToLLy

发表于 2018-08-23 | 分类于 随意聊

Just for testing

Hello world!

OpenFOAM中Eular网格上的流场值插值到某一个点

发表于 2018-08-23 | 分类于 OpenFOAM

openfoam中Eular网格上的流场值插值到某一个点

在模拟气固两相鼓泡床过程中需要将场量(流体速度,压力梯度)插值到相应颗粒位置,openfoam中自带了这种插值函数源文件可点击总共有六种插值方法cell, cellPoint, cellPointFace, cellPointWallModified, cellPatchConstrained 和pointMVC详细的插值方法介绍。以cellPoint为例介绍插值流体速度U到颗粒某一位置i:
(1)只使用某一种插值方法:

1
2
3
4
5
6
7
#include "interpolationCellPoint.H"

interpolationCellPoint<vector> UInterpolate(U);
forAll(particlePosition,i){ //particlePosition为矢量数组包括颗粒坐标
label cellID = mesh.findCell(particleposition[i]); //找到该颗粒位于哪个网格内
vector UInterp = UInterpolate.interpolate(particlePosition[i], cellID); //进行插值
}

如果想使用其他方法修改头文件即可
(2)若是对不同量采用不同的插值方法,则可以写成指针形式,从字典中调用对应方法的关键字即可:

1
2
3
4
5
6
7
8
#include "interpolation.H"

dictionary interpolationDict = U.mesh().schemesDict().subDict("interpolation");
autoPtr<interpolation<vector>> UInterpolate = interpolation<vector>::New(interpolationDict,U);
forAll(particlePosition,i){
label cellID = mesh.findCell(particleposition[i]);
vector UInterp = UInterpolate->interpolate(particlePosition[i], cellID);
}

具体的方法在算例文件夹下system/fvSchemes interpolation子文件中:

1
2
3
4
interpolation
{
U cellPoint;
}

zhaopeng

5 日志
3 分类
5 标签
© 2019 zhaopeng
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4