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. 尽量避免循环。
    例如:如果需要定义一个分段函数,可以利用posneg函数:

    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中读取vectorscalar不同:
    例如:
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);