吾生有涯 学海无涯
析模有界 知识无界

OpenFOAM编程案例|05 并行编程

本案例演示利用OpenFOAM进行并行计算的基础方法。

CFD计算自然离不开并行计算,在对大规模问题进行计算时,OpenFOAM也可以使用并行模式。然而利用并行模式进行计算时,可能需要修改一些程序代码,尤其是在需要获取全场信息时。本文以一个简单的案例演示并行程序编写时需要注意的一些问题。

1 文件准备

利用下面的命令准备文件:

run
foamNewApp demo5
cd demo5 && touch createFields.H

如下图所示。

2 程序代码

  • 头文件createFields.H
// 定义一些物理量
 
Info << "读取transportProperties文件" << endl;
IOdictionary transportProperties
(
    IOobject
    (
        "transportProperties"//文件名
        runTime.constant(),     //文件路径
        mesh,
        IOobject::MUST_READ_IF_MODIFIED,
        IOobject::NO_WRITE
    )
)
;
// 读取物理属性nu
dimensionedScalar nu
(
    "nu",
    dimViscosity,
    transportProperties
)
;
 
 
Info << "读取速度U" << endl;
volVectorField U
(
    IOobject
    (
        "U",
        runTime.timeName(),
        mesh,
        IOobject::MUST_READ,
        IOobject::AUTO_WRITE
    ),
    mesh
)
;
 
Info << "读取压力场p" << endl;
volScalarField p
(
    IOobject
    (
        "p",
        runTime.timeName(),
        mesh,
        IOobject::MUST_READ,
        IOobject::AUTO_WRITE
    ),
    mesh
)
;
 
  • 源文件demo5.C
#include "fvCFD.H"
// * * * * * * * * * * * * * * * * * * * * //
int main(int argc, char *argv[])
{
    // 检查案例文件组织结构
    #include "setRootCase.H"
    // 创建runTime对象
    #include "createTime.H"
    // 创建fvMesh对象
    #include "createMesh.H"
 
    /*
    对于并行运行的案例,计算域被分解成若干个processor网格。
    每个子域都在单独的处理器中运行,并保存网格、U或p等对象的实例,就像串行计算一样。
    Pout是每个处理器都可以写入的流,而Info只能由head进程(Processor0)使用。
    在并行计算时,若想要输出计算节点的信息,需要使用Pout流
    */

    Pout << "这是处理器No:" << Pstream::myProcNo() << ",网格数量:" << mesh.C().size() << endl;
 
    // 在处理器之间交换信息,需要调用特殊的OpenMPI进程
    // 计算子域的体积
    scalar meshVolume;
    forAll(mesh.V(), cellI)
    {
        meshVolume += mesh.V()[cellI];
    }
    Pout << "本处理器上的网格体积:" << meshVolume << endl;
 
    // 计算所有的子域的网格体积,使用全局约简函数reduce
    reduce(meshVolume, sumOp());
    // 利用Info在head节点上输出信息
    Info << "所有处理器上的总网格数量:" << returnReduce(mesh.C().size(), sumOp

利用命令wmake编译程序,确保没有错误或警告信息,如下图所示。

3 测试程序

这里使用cavity的案例,并行计算需要添加decomposeParDict字典。进入案例根路径,运行下面的命令添加字典文件:

foamGetDict decomposeParDict

利用decomposeParDict字典文件指定并行分区方式。这里使用的字典文件如下:

FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    location    "system";
    object      decomposeParDict;
}
// * * * * * * * * * * * * * * * * * //
 
numberOfSubdomains 4;
method hierarchical;
hierarchicalCoeffs
{
    n               (4 1 1);
    delta 0.0001;
    order           xyz;
}

进入案例根路径,运行下面的命令运行案例:

blockMesh
decomposePar
mpirun -np 4 demo5 -parallel

运行结果如下图所示,可以看到并行模式获取了正确的信息。


(完毕)

本篇文章来源于微信公众号: CFD之道

赞(2) 打赏
版权声明:未经允许,请勿随意用于商业用途。
文章名称:《OpenFOAM编程案例|05 并行编程》
文章链接:https://www.topcfd.cn/18658/
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
分享到

说两句 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者吧

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册