OpenFOAM 使用技巧总结

13 篇文章 12 订阅

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

  1. 矢量数组可以新建为矢量列表形式,初始化方法为:
    List<vector> a = (n,vector::zero)
    vector a(vector::zero)
  2. 生成不同数据类型的链表并初始化:
#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;
        }
  1. 尽量避免循环。
    例如:如果需要定义一个分段函数,可以利用posneg函数:
v = a, if x < b
v = c if x > b
// can be coded as 
volScalarField v = neg(x - b)*a + pos(x-b)*c;
  1. 多进程可以使用Sout或者Pout输出全部数据
  2. dictionary中读取vectorscalar不同:
    例如:
vector U1(dict.lookup("U1"));
scalar r1(readScalar(dict.loocup("r1")));

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

  1. 对于并计算:
    Foam::gSum(a)可以获取不同进程中场a的加和;
    Pstream::nProcs()获取并行的进程数;
    Pstream::myProcNo()获取当前的进程数

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

transformPoints -scale "(1 1 0.5)" 		//z方向网格点缩小0.5倍
transformPoints -translate  "(0 0 0.5)"	//z方向整体向上平移0.5 
  1. 返回某一网格的8个顶点坐标:出自cfd-online,亲测有效
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)
           pLocal[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加执行权限)。

  1. 输出错误并跳出执行(多用于程序调试过程中)
FatalErrorIn("main.cpp pressure is unregular")
    << abort(FatalError);
  1. 使用rhoPimpleFoam求解器出现棋盘效应时可以通过检查残差曲线,检查计算是否收敛,若未收敛,可以通过增加system/fvSolution下PIMPLE子文件中求解循环次数来解决。
  2. 获取矢量场的一个方向组分值:
volScalarField Ux
(
 		IOobject
 		(
 			"Ux",
 			runTime.timeName(),
 			mesh,
 			IOobject::NO_READ,
 			IOobject::AUTO_WRITE
 			),
 			U.component(vector::X)
 );
  1. 获取某一边界的压力及面积:
label patchId = mesh.boundaryMesh().findPatchID("inlet");
if(patchId == -1){
      FatalErrorIn("main.cpp the patch name 'in' was not founded")
            << abort(FatalError);
      }
const scalarField p_inlet = p.boundaryField()[patchId];
const scalarField area_face_inlet = mesh.magSf().boundaryField()[patchId];
  1. 写出某些patch
IOField<vector> cfOut
(
    IOobject
    (
        "cf",
        mesh.time().timeName(),
        mesh,
        IOobject::NO_READ,
        IOobject::NO_WRITE
    ),
    mesh.Cf().boundaryField()[ patchID ]
);

cfOut.write();

参考自cfd-online

  1. 将xy平面旋转至xz平面
rotateMesh “(0 1 0)” “(0 0 1)”
  1. 显示polyMesh/sets/里边的faceList
foamToVTK -faceSet nonOrthoFaces -time 0
  • 8
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenFOAM 是一个开源的计算流体力学(CFD)软件包,用于模拟和求解各种流体流动问题。OpenFOAM 使用手册是一本详细的文档,介绍了如何安装、配置和使用 OpenFOAM 软件。 OpenFOAM 使用手册的翻译对于那些想要学习和使用 OpenFOAM 的人来说非常重要。通过手册的翻译,用户可以更容易地理解软件的使用方法和技术细节。翻译手册可以帮助用户学习如何进行模拟、求解以及分析他们感兴趣的各类流体流动问题。 手册的翻译应该包括软件的基本介绍,如何安装配置软件环境,以及各种物理模型和数值方案的详细说明。此外,还应该提供用户界面的截图和示例,以帮助用户更好地理解软件的各个功能和工具。在翻译中,还需要注意清晰明确的语言和标准化的术语,以确保用户能够准确地理解和使用手册中的内容。 OpenFOAM 使用手册的翻译对于不擅长阅读英文的用户来说尤为重要。通过翻译手册,用户可以更快地上手并充分利用 OpenFOAM 的强大功能。手册的翻译也是推广 OpenFOAM 在全球范围内的重要一步,有助于吸引更多的用户和研究人员加入 OpenFOAM 的开发和应用。 总而言之,OpenFOAM 使用手册的翻译是为了帮助用户更好地理解和使用这款软件。手册的翻译应该包括软件的基本介绍、安装配置说明、物理模型和数值方案的详细说明以及用户界面的示例。通过手册的翻译,用户可以更快地上手并充分利用 OpenFOAM 的强大功能。手册的翻译也有助于推广和普及 OpenFOAM 软件的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值