• 极简OpenFoam编程


    简介

    OpenFoam可以用于处理场类型的数据,但是如果采用“求解器”手脚架(见OpenFOAM编程基本结构)将会引入"setRootCase.H"、“createTime.H”、"createMesh.H"三个代码片段文件,引入了严重的“副作用”,难以将代码模块化。如果同时在多个线程上并行计算往往会出现严重错误
    本文将编写极简的OpenFoam源文件,剔除不必要的“副作用”,为并行计算提供条件

    代码

    #include "fvCFD.H"
    
    int main()
    {
        //第一步:构造runTime对象,用于控制时间
        Foam::Time runTime(
            fileName("."),            //可执行程序的根目录
            fileName("./pitzDaily")); //案例文件的相对目录
    
        //第二步:构造mesh对象,用于读取网格
        const Foam::fvMesh mesh(
            Foam::IOobject(
                Foam::fvMesh::defaultRegion,
                runTime.timeName(),
                runTime,
                Foam::IOobject::MUST_READ));
    
        //第三步:开始计算
        for (int i = 0; i < 20; i++) //以i为自变量步进
        {
            //初始化自定义场(均匀场)
            volScalarField IndexOfCell(
                IOobject(
                    "IndexOfCell",
                    runTime.timeName(),
                    mesh,
                    IOobject::NO_READ, //不从文件中读取,而是直接在代码中生成
                    IOobject::AUTO_WRITE),
                mesh,
                dimensionedScalar("tmp", dimless, 0), //初始化为无量纲的0场
                "zeroGradient");                      //初始化为自然边界条件(零通量边界条件)
    
            //用户自定义的计算,这里给每个单元的数值赋值为单元序号
            forAll(IndexOfCell, cellI)
            {
                IndexOfCell[cellI] = cellI;
            }
            IndexOfCell.correctBoundaryConditions(); //更新边界处的结果
    
            //输出场
            runTime.setTime(i, i);   //设置时间
            runTime.writeTimeDict(); //输出时间
            IndexOfCell.write();     //输出场
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    代码的核心思想是,对于固定网格问题,我们只需要完成一次runTime初始化和mesh初始化,之后在每一步计算中生成我们需要的场,使用各种方法加工这个场,再将结果输出为文件。

    本代码使用官方pitzDaily案例,计算完成后,案例文件目录如下

    .
    ├── 0
    │   ├── IndexOfCell
    │   ├── T
    │   ├── U
    │   └── uniform
    │       └── time
    ├── 1
    │   ├── IndexOfCell
    │   └── uniform
    │       └── time
    ├── 10
    │   ├── IndexOfCell
    │   └── uniform
    │       └── time
    ├── 11
    │   ├── IndexOfCell
    │   └── uniform
    │       └── time
    ├── 12
    │   ├── IndexOfCell
    │   └── uniform
    │       └── time
    ├── 13
    │   ├── IndexOfCell
    │   └── uniform
    │       └── time
    ├── 14
    │   ├── IndexOfCell
    │   └── uniform
    │       └── time
    ├── 15
    │   ├── IndexOfCell
    │   └── uniform
    │       └── time
    ├── 16
    │   ├── IndexOfCell
    │   └── uniform
    │       └── time
    ├── 17
    │   ├── IndexOfCell
    │   └── uniform
    │       └── time
    ├── 18
    │   ├── IndexOfCell
    │   └── uniform
    │       └── time
    ├── 19
    │   ├── IndexOfCell
    │   └── uniform
    │       └── time
    ├── 2
    │   ├── IndexOfCell
    │   └── uniform
    │       └── time
    ├── 3
    │   ├── IndexOfCell
    │   └── uniform
    │       └── time
    ├── 4
    │   ├── IndexOfCell
    │   └── uniform
    │       └── time
    ├── 5
    │   ├── IndexOfCell
    │   └── uniform
    │       └── time
    ├── 6
    │   ├── IndexOfCell
    │   └── uniform
    │       └── time
    ├── 7
    │   ├── IndexOfCell
    │   └── uniform
    │       └── time
    ├── 8
    │   ├── IndexOfCell
    │   └── uniform
    │       └── time
    ├── 9
    │   ├── IndexOfCell
    │   └── uniform
    │       └── time
    ├── constant
    │   ├── polyMesh
    │   │   ├── boundary
    │   │   ├── faces
    │   │   ├── neighbour
    │   │   ├── owner
    │   │   └── points
    │   └── transportProperties
    └── system
        ├── blockMeshDict
        ├── controlDict
        ├── fvSchemes
        └── fvSolution
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97

    可以看出我们已经将IndexOfCell场输出到了对应的时间文件夹,使用paraview实现可视化,如下图
    在这里插入图片描述在这里插入图片描述
    该图可视化地显示了每个单元的标号

  • 相关阅读:
    第一章 概论
    基础:html5、html、htm、xhtml、dhtml、shtml、shtm、xml、xsl、xslt
    【Qt】Qt定时器类QTimer
    TikTok平台广告调研分析
    线上云酒馆是什么?线上云酒馆怎么开发?
    【starters】springboot-starter整合阿里云datahub
    深度学习:yolov3的使用--建立模型
    Qt toolbar 的使用:
    golang语言和JAVA对比
    从零开始配置 vim(14)——目录管理插件
  • 原文地址:https://blog.csdn.net/weixin_43325228/article/details/126689950