【LLM】【OpenFOAM】:通过LLM生成可运行的OpenFOAM算例流程测试

目录

序言

1 算例 -> 流程描述

1.1 生成流程描述

1.2 差异性比较

目录结构差异

blockMeshDIct 差异

nut 差异

p 差异

U 差异

1.3 查看其他算例

tutorials\incompressibleDenseParticleFluid\injectionChannel

tutorials\incompressibleDriftFlux\dahl

tutorials\incompressibleFluid\impeller

2 流程描述 -> python代码

2.1 生成python代码

2.2 对比

对比 1:目录结构完全相同

对比 2: blockMeshDict 相同

对比 3:U文件 相同

对比 4:p文件 相同

对比 5:nut文件 相同

对比 6:流体物性 相同

对比 7: 模型设置 相同

对比 8:控制 相同

不同 :多出了 fvSchemes 和 fvSolution

3 总结


序言

想法:我想要通过大模型生成OpenFoam的流程描述,然后通过流程描述生成可运行的python代码,通过运行python代码生成可运行的OpenFoam算例,最后通过云原生在线运行OpenFoam仿真,在线得出运行结果,后续可能在线查看运行结果或者通过paraview查看运行结果。

本次主要论证通过LLM生成可运行的OpenFoam算例的可行性

1 算例 -> 流程描述

1.1 生成流程描述

刷新gpt 后

问:

生成详细的openfoam算法示例:
tutorials\incompressibleFluid\pitzDailySteadyMappedToPart
(包括但不局限于 目录结构 构建网络 定义边界和设置边界条件 流体物性 模型设置 控制求解 仿真运行等)

答:

好的,下面是关于 OpenFOAM 中一个名为 pitzDailySteadyMappedToPart 的教程的详细示例。这个教程一般是用来模拟不可压缩流体的流动情况。下面,我们将详细介绍目录结构、构建网格、定义边界条件、流体物性、模型设置、控制求解和仿真运行等步骤。

目录结构

在 OpenFOAM 的工作目录中,通常会创建一个文件夹来存放该案例。例如:

pitzDailySteadyMappedToPart/
├── 0
│   ├── U
│   ├── p
│   └── nut
├── constant
│   ├── transportProperties
│   └── turbulenceProperties
├── system
│   ├── controlDict
│   ├── fvSchemes
│   └── fvSolution
└── Allrun

 
构建网格

网格可以使用 blockMesh 或其他网格生成工具生成。首先,在 pitzDailySteadyMappedToPart 目录中创建一个 blockMeshDict 文件。下面是一个简单的示例:

/*--------------------------------*- C++ -*----------------------------------*\
| =========                 |
| \      /  F ield         |
|  \    /   O f            |
|   \  /    A nd           |
|    \/     M anagement    |
\*---------------------------------------------------------------------------*/

FoamFile
{
    version 2.0;
    format    ascii;
    class     dictionary;
    location "system";
    object    blockMeshDict;
}

// dimensions and geometry
convertToMeters 1;

// Blocks
blocks
(
    hex (0 1 2 3 4 5 6 7) (20 1 1) simpleGrading (1 1 1)
);

// Edges
edges
(
);

// Boundary
boundary
(
    inlet
    {
        type patch;
        faces
        (
            (0 1 5 4)
        );
    }

    outlet
    {
        type patch;
        faces
        (
            (2 3 7 6)
        );
    }

    walls
    {
        type wall;
        faces
        (
            (1 2 6 5)
            (0 3 7 4)
        );
    }

    symmetryPlane
    {
        type symmetryPlane;
        faces
        (
            (0 1 3 2)
        );
    }
);

// Merge patch pairs
mergePatchPairs
(
);

 
定义边界和设置边界条件

在 0 文件夹中,定义流动变量的初始条件。这里给出 U(速度),p(压力)和 nut(动力黏度)的示例:

U 文件
/*--------------------------------*- C++ -*----------------------------------*\
|  U file for openfoam simulation |
\*---------------------------------------------------------------------------*/

dimensions [0 1 -1 0 0 0 0];

internalField uniform (0 0 0);

boundaryField
{
    inlet
    {
        type fixedValue;
        value uniform (1 0 0);
    }

    outlet
    {
        type zeroGradient;
    }

    walls
    {
        type noSlip;
    }

    symmetryPlane
    {
        type symmetryPlane;
    }
}

 
p 文件
/*--------------------------------*- C++ -*----------------------------------*\
|  p file for openfoam simulation |
\*---------------------------------------------------------------------------*/

dimensions [0 2 -2 0 0 0 0];

internalField uniform 0;

boundaryField
{
    inlet
    {
        type fixedValue;
        value uniform 0;
    }

    outlet
    {
        type totalPressure;
        p0 uniform 0;
        gamma 1.4;
        value uniform 0;
    }

    walls
    {
        type fixedValue;
        value uniform 0;
    }

    symmetryPlane
    {
        type zeroGradient;
    }
}

 
nut 文件
/*--------------------------------*- C++ -*----------------------------------*\
|  nut file for openfoam simulation |
\*---------------------------------------------------------------------------*/

dimensions [0 2 -1 0 0 0 0];

internalField uniform 0.001;

boundaryField
{
    inlet
    {
        type fixedValue;
        value uniform 0.001;
    }

    outlet
    {
        type zeroGradient;
    }

    walls
    {
        type fixedValue;
        value uniform 0.001;
    }

    symmetryPlane
    {
        type zeroGradient;
    }
}

 
流体物性

在 constant/transportProperties 文件中设置流体物性,例如:

// Transport properties
// Kinematic viscosity
nu      0.001;

 
模型设置

在 constant/turbulenceProperties 文件中设置湍流模型,例如:

// turbulence properties

simulationType RAS;

// RAS model
RAS
{
    type kEpsilon;
    fundamentals
    {
        Cmu 0.09;
    }
}

 
控制求解

在 system/controlDict 文件中设置控制参数,例如:

application     pitzDaily;

startFrom       latestTime;

stopAt          endTime;

endTime         100;

deltaT          0.1;

writeControl    timeStep;

writeInterval   10;

purgeWrite      0;

writeFormat     ascii;

 
仿真运行

在终端中进入该案例的目录并运行:

# 生成网格
blockMesh

# 运行求解器
simpleFoam

 
总结

这是一个基本的 OpenFOAM 教程示例,涵盖了不可压流体模拟的常见步骤。具体的设置可能根据需求变化,用户可根据需要自定义参数和设置。希望这个示例能帮助到你!如果你有其他问题,请随时询问。

1.2 差异性比较

目录结构差异

① 源代码中没有constant文件夹

② 源代码0文件夹下有 epsilon.orig k.orig 文件,而生成的没有

③ 源代码的system文件夹下有decompossParDict和mapFieldsDict文件,而生成的没有

④ 源代码主目录下 有Allclean Allren Allrun-parallel Allrun-serial,而生成的没有

blockMeshDIct 差异

没有 vertices,并且 blocks也不相同

nut 差异

格式是正确的,到那时内容具有一定的差异性

p 差异

格式正确,内容差异

U 差异

格式正确内容差异

1.3 查看其他算例

tutorials\incompressibleDenseParticleFluid\injectionChannel

tutorials\incompressibleDenseParticleFluid\injectionChannel
以下是对 OpenFOAM 示例 tutorials/incompressibleDenseParticleFluid/injectionChannel 的详细描述,包括目录结构、网格构建、定义边界条件及其他相关内容。

1. 目录结构

在 OpenFOAM 中,injectionChannel 示例的目录结构通常如下:

$FOAM_TUTORIALS/incompressibleDenseParticleFluid/injectionChannel/
├── 0/                               # 初始条件
│   ├── U                            # 速度场
│   ├── p                            # 压力场
│   ├── rho                          # 密度场
│   ├── k                            # 动能(可选)
│   ├── epsilon                      # 能量耗散率(可选)
├── Allrun                          # 一键执行脚本
├── constant/                        # 常数设置
│   ├── thermophysicalProperties      # 热物性参数
│   ├── properties                   # 物理属性
│   ├── turbulence/                  # 湍流模型设置
│       └── RASProperties            # RAS模型参数
│   └── polyMesh/                   # 网格信息
│       └── blockMeshDict           # 网格生成配置
├── system/                          # 系统设置
│   ├── controlDict                  # 控制仿真
│   ├── fvSchemes                    # 离散化方案
│   └── fvSolutions                  # 求解器设置
└── README                           # 示例说明文档

 
2. 构建网格

网格的生成通常通过 blockMesh 工具完成,主要配置文件为 constant/polyMesh/blockMeshDict。该示例模拟了在注射通道内流动的液体及其颗粒。

2.1 定义基本网格(blockMeshDict)

在 constant/polyMesh/blockMeshDict 中定义基础的网格。

定义顶点:
使用 vertices 部分定义流动区域的顶点坐标:
vertices
(
    (0 0 0)        // Vertex 0 (inlet bottom)
    (1 0 0)        // Vertex 1 (inlet top)
    (1 1 0)        // Vertex 2 (outlet top)
    (0 1 0)        // Vertex 3 (outlet bottom)
    (0 0 1)        // Vertex 4 (top)
    (1 0 1)        // Vertex 5 (top)
    (1 1 1)        // Vertex 6 (bottom)
    (0 1 1)        // Vertex 7 (bottom)
);

 
定义网格块:
使用 blocks 定义整个网格的形状和划分:
blocks
(
    hex (0 1 2 3 4 5 6 7) (40 20 10) simpleGrading (1 1 1)
);

 
边界定义:
在 boundary 部分定义边界条件及其类型:
boundary
{
    walls
    {
        type wall; // 壁面
        faces
        (
            (0 3 7 4)
            (1 2 6 5)
        );
    }
    inlet
    {
        type fixedValue; // 入口设置
        faces
        (
            (0 1 5 4)
        );
    }
    outlet
    {
        type zeroGradient; // 出口零梯度
        faces
        (
            (2 3 7 6)
        );
    }
    topAndBottom
    {
        type empty; // 2D假设
        faces
        (
            (1 0 3 2)
            (5 4 7 6)
        );
    }
}

 
2.2 生成网格

在命令行中运行 blockMesh 命令生成网格。

3. 定义边界条件

边界条件在 0/ 目录中的文件中设置。

3.1 速度场 (U)

文件 0/U 定义速度场的初始和边界条件:

dimensions      [0 1 -1 0 0 0 0]; // 速度的维度(m/s)
internalField   uniform (0 0 0);   // 初始速度设置为0
boundaryField
{
    walls
    {
        type noSlip; // 在墙面速度为零
    }
    inlet
    {
        type fixedValue; // 入口设置固定速度
        value uniform (1 0 0); // 水平流速为1 m/s
    }
    outlet
    {
        type zeroGradient; // 出口零梯度
    }
    topAndBottom
    {
        type empty; // 2D假设
    }
}

 
3.2 压力场 (p)

文件 0/p 定义压力的初始和边界条件:

dimensions      [0 2 -2 0 0 0 0]; // 压力的维度(Pa)
internalField   uniform 101325;    // 初始压力
boundaryField
{
    walls
    {
        type zeroGradient; // 墙面零梯度
    }
    inlet
    {
        type fixedValue; // 入口固定压力
        value uniform 101325; // 101325 Pa
    }
    outlet
    {
        type fixedValue; // 出口固定压力
        value uniform 101325; // 101325 Pa
    }
    topAndBottom
    {
        type empty; // 2D假设
    }
}

 
3.3 密度场 (rho)

文件 0/rho 定义流体的密度初始条件和边界条件:

dimensions      [0 3 -1 0 0 0 0]; // 密度的维度(kg/m³)
internalField   uniform 1000;      // 初始密度(如水的密度)
boundaryField
{
    walls
    {
        type fixedValue; // 固定墙面密度
        value uniform 1000; // 1000 kg/m³
    }
    inlet
    {
        type fixedValue; // 入口固定密度
        value uniform 1000; // 1000 kg/m³
    }
    outlet
    {
        type zeroGradient; // 出口零梯度
    }
    topAndBottom
    {
        type empty; // 2D假设
    }
}

 
4. 物理属性

在 constant/thermophysicalProperties 文件中定义流体的热物性,例如:

thermophysicalModel  incompressible;
transportModel       Newtonian;
specificHeat        constant 4181; // 水的比热容

 
5. 系统控制文件

在 system/ 目录下的控制文件有:

5.1 controlDict

设置模拟的控制参数:

application     pisoFoam;         // 使用的求解器
startFrom       latestTime;       // 从最新时间开始
endTime         5;                 // 结束时间
deltaT          0.01;              // 每个时间步的大小
writeInterval   0.5;               // 每0.5秒写入一次结果

 
5.2 fvSchemes

定义有限体积法中使用的离散化格式:

divSchemes
{
    default         Gauss linear;
}

 
5.3 fvSolutions

配置求解器及其收敛标准:

solvers
{
    p
    {
        solver          pcg; // 压力求解器
        preconditioner  DIC;
        tolerance       1e-5;
        relTol          0.1;
    }
    U
    {
        solver          smoothSolver; // 速度求解器
        smoother        GaussSeidel; // 高斯-赛德尔法
        tolerance       1e-6;
        relTol          0.1;
    }
}

 
6. 运行模拟

Allrun 脚本用于执行整个模拟,包括网格生成和求解器运行的步骤:

#!/bin/bash
blockMesh        # 生成网格
pisoFoam         # 运行求解器

 

通过运行 ./Allrun 脚本来一键启动流体流动模拟。

总结

以上是对 OpenFOAM 示例 injectionChannel 的详细描述,涵盖了目录结构、网格构建、边界条件的设置以及系统控制文件的相关内容。这些元素共同形成了一个完整的液体流动模拟示例。希望这些信息能够帮助你更好地理解这一案例。

目录结构差异

tutorials\incompressibleDriftFlux\dahl

tutorials\incompressibleDriftFlux\dahl
好的,下面是对 tutorials/incompressibleDriftFlux/dahl 示例的详细描述,包括目录结构、构建网格、定义边界设置和边界条件等方面的信息。

目录结构

以下是 incompressibleDriftFlux/dahl 目录的结构(可能与实际文件略有不同,但大致相符):

incompressibleDriftFlux
│
└── dahl
    ├── 0
    │   ├── U
    │   ├── p
    │   └── nu
    ├── system
    │   ├── controlDict
    │   ├── fvSchemes
    │   └── fvSolution
    └── constant
        └── transportProperties

 
构建网格

在 OpenFOAM 中,网格构建通常是通过 blockMesh 等工具进行的。dahl 示例的网格定义在 constant/polyMesh 目录下,涉及到的文件可能包括 blockMeshDict,该文件描述了网格的几何形状和划分:

// blockMeshDict 文件示例:
vertices
(
    (0 0 0)
    (1 0 0)
    (1 1 0)
    (0 1 0)
    (0 0 1)
    (1 0 1)
    (1 1 1)
    (0 1 1)
);

blocks
(
    hex (0 1 2 3 4 5 6 7) (10 10 1) simpleGrading (1 1 1)
);

edges
(
);

boundary
(
    // 定义边界条件
);

 

通过 blockMesh 命令生成网格,例如:

blockMesh

 
定义边界设置

在 0 目录下,边界条件定义在如 U、p 和 nu 等文件中。每个文件都包含特定变量的边界条件。例如,U 文件(速度场)可能包含如下内容:

// U 文件示例:
boundaryField
{
    fixedWall
    {
        type            fixedValue;
        value           uniform (0 0 0);
    }
    inlet
    {
        type            inflowVelocity;
        value           uniform (1 0 0);
    }
    outlet
    {
        type            zeroGradient;
    }
}

 

类似地,p 文件中定义的压力边界条件可能如下:

// p 文件示例:
boundaryField
{
    fixedWall
    {
        type            zeroGradient;
    }
    inlet
    {
        type            totalPressure;
        value           uniform 0;
    }
    outlet
    {
        type            zeroGradient;
    }
}

 
运行控制文件

在 system 目录中的 controlDict 文件中定义了仿真控制参数,例如求解时间步长、模拟结束时间等参数:

application     simpleFoam;
startFrom       latestTime;
stopAt          endTime;
endTime         10;
deltaT          1;

 
求解器设置

在 system/fvSolution 和 system/fvSchemes 中设置求解器的详细信息,如线性求解器、时间步长等。示例内容如下:

// fvSolution 示例:
solvers
{
    p
    {
        solver          PCG;
        preconditioner  DIC;
        tolerance       1e-6;
        relTol         0.1;
    }
    U
    {
        solver          smoothSolver;
        preconditioner  DIC;
        tolerance       1e-6;
        relTol         0.1;
    }
}

// fvSchemes 示例:
ddtSchemes
{
    default         Euler;
}

gradSchemes
{
    default         Gauss linear;
}

 
运行仿真

完成设置后,用以下命令启动仿真:

simpleFoam

 
总结

在 incompressibleDriftFlux/dahl 示例中,主要的步骤包括构建网格、设置初始和边界条件、配置控制和求解器参数,最后运行仿真。希望这个详细的描述可以帮助你更好地理解该示例的结构和设置。

目录结构不同

tutorials\incompressibleFluid\impeller

tutorials\incompressibleFluid\impeller
在OpenFOAM中,impeller 是一个用于模拟旋转叶轮流动的示例,重点在于旋转流体如何与旋转叶轮交互。这个示例通常涉及到不可压流体的模拟,尤其是在复杂流场和湍流的情况下。以下是对该示例的详细描述,包括目录结构、网格构建、边界定义以及设置边界条件等。

目录结构

impeller 的目录结构如下:

impeller/
├── 0/
│   ├── U
│   ├── p
│   ├── nut
│   ├── k
│   └── epsilon
├── constant/
│   ├── transportProperties
│   ├── turbulenceProperties
│   └── polyMesh/
│       ├── blockMeshDict
│       └── ...
├── system/
│   ├── controlDict
│   ├── fvSchemes
│   └── fvSolution
└── Allrun

 
构建网格

在 impeller 示例中,网格通常使用 blockMesh 或 snappyHexMesh 工具生成。网格文件定义在 constant/polyMesh/blockMeshDict 或 snappyHexMeshDict 中。

blockMeshDict 示例
vertices
(
    (0 0 0)
    (1 0 0)
    (1 1 0)
    (0 1 0)
    (0 0 1)
    (1 0 1)
    (1 1 1)
    (0 1 1)
);

blocks
(
    hex (0 1 2 3 4 5 6 7) (40 40 20) simpleGrading (1 1 1)
);

edges
(
    // 这里可以定义圆形边缘(对于叶轮边缘等)
);

// boundary
boundary
(
    inlet
    {
        type patch;
        faces
        (
            (0 3 7 4)
        );
    }

    outlet
    {
        type patch;
        faces
        (
            (1 2 6 5)
        );
    }

    rotating
    {
        type wall;
        faces
        (
            (4 5 6 7)
        );
    }

    walls
    {
        type wall;
        faces
        (
            (0 1 2 3)
        );
    }
);

 
定义边界和设置边界条件

在 OpenFOAM 中,边界条件通常在 0/ 目录中的不同文件中进行设置。

0/U 示例
boundaryField
{
    inlet
    {
        type fixedValue;
        value uniform (1 0 0); // 入口速度
    }

    outlet
    {
        type zeroGradient;
    }

    rotating
    {
        type rotatingWallVelocity;
        omega uniform 100; // 旋转叶轮的角速度
    }

    walls
    {
        type noSlip;
    }
}

 
0/p 示例
boundaryField
{
    inlet
    {
        type fixedValue;
        value uniform 0; // 入口压力
    }

    outlet
    {
        type zeroGradient;
    }

    rotating
    {
        type zeroGradient;
    }

    walls
    {
        type zeroGradient;
    }
}

 
0/nut 示例
boundaryField
{
    inlet
    {
        type fixedValue;
        value uniform 0.01; // 流体的动力粘度
    }

    outlet
    {
        type zeroGradient;
    }

    rotating
    {
        type fixedValue;
        value uniform 0.01;
    }

    walls
    {
        type fixedValue;
        value uniform 0.01;
    }
}

 
0/k 和 0/epsilon 示例(湍流模型)
boundaryField
{
    inlet
    {
        type fixedValue;
        value uniform 0.1; // 动能
    }

    outlet
    {
        type zeroGradient;
    }

    rotating
    {
        type fixedValue;
        value uniform 0.0; // 旋转叶轮处的动能
    }

    walls
    {
        type fixedValue;
        value uniform 0.0; // 壁面动能
    }
}

// epsilon 湍流耗散率
boundaryField
{
    inlet
    {
        type fixedValue;
        value uniform 0.01; // 流体的湍流能量耗散率
    }

    outlet
    {
        type zeroGradient;
    }

    rotating
    {
        type fixedValue;
        value uniform 0.0;
    }

    walls
    {
        type fixedValue;
        value uniform 0.0;
    }
}

 
流体物性和湍流模型

在 constant/ 目录下,transportProperties 文件定义了流体的物理特性,turbulenceProperties 文件定义了湍流模型。

constant/transportProperties 示例
transportType  Newtonian;
rho             1000;   // 流体密度
mu              0.001;  // 动力粘度

 
constant/turbulenceProperties 示例
simulationType  RAS;
RAS
{
    RASModel       kEpsilon; // 使用 k-epsilon 湍流模型
    turbulence      on;
    printCoeffs     on;
}

 
控制和求解设置

在 system/ 目录下,controlDict 文件用于控制求解的时间步长和输出频率,fvSchemes 和 fvSolution 文件用于定义数值求解方法和方程求解器设置。

system/controlDict 示例
application     pimpleFoam;
startFrom       latestTime;
endTime         10;
deltaT          0.01;
writeControl    timeStep;
writeInterval   1;

 
system/fvSchemes 和 system/fvSolution 示例

这些文件包含了关于数值方法、时间离散化方案、求解器设置等的配置。常见的设置包括速度、压力和湍流参数的求解器选择。

运行仿真

在 impeller 目录中,可以运行 Allrun 脚本来一键执行所有步骤,包括网格生成和求解。

./Allrun

 
总结

以上是对 OpenFOAM 中 impeller 示例的详细描述,包括目录结构、网格构建、边界条件定义以及湍流模型的设置。该示例侧重于模拟旋转叶轮对流体流动的影响。希望这些信息对你理解该示例有所帮助!如有进一步的问题,请随时提出。

目录不同

2 流程描述 -> python代码

2.1 生成python代码

在原有基础上继续问:

编写一段python代码,将上述openfoam算例实现,
包括构建目录并且文件写入相应的内容,
最后调用运行对应脚本等

答:

下面是一段 Python 脚本,它将自动创建 OpenFOAM 案例的目录结构,并将相应的文件内容写入到各个文件中。最后,该脚本将调用 blockMesh 生成网格并运行 simpleFoam 进行模拟。

请确保在运行此代码之前,您的环境中已经安装了 OpenFOAM,且相应的命令行工具可用。

import os
import subprocess

# 定义案例名称和目录
case_name = "pitzDailySteadyMappedToPart"
case_dir = os.path.join(os.getcwd(), case_name)

# 创建目录结构
directories = [
    os.path.join(case_dir, "0"),
    os.path.join(case_dir, "constant"),
    os.path.join(case_dir, "system")
]

for directory in directories:
    os.makedirs(directory, exist_ok=True)

# 文件内容
files_content = {
    os.path.join(case_dir, "0", "U"): """/*--------------------------------*- C++ -*----------------------------------*\
|  U file for openfoam simulation |
\*---------------------------------------------------------------------------*/

dimensions [0 1 -1 0 0 0 0];

internalField uniform (0 0 0);

boundaryField
{
    inlet
    {
        type fixedValue;
        value uniform (1 0 0);
    }

    outlet
    {
        type zeroGradient;
    }

    walls
    {
        type noSlip;
    }

    symmetryPlane
    {
        type symmetryPlane;
    }
}
""",

    os.path.join(case_dir, "0", "p"): """/*--------------------------------*- C++ -*----------------------------------*\
|  p file for openfoam simulation |
\*---------------------------------------------------------------------------*/

dimensions [0 2 -2 0 0 0 0];

internalField uniform 0;

boundaryField
{
    inlet
    {
        type fixedValue;
        value uniform 0;
    }

    outlet
    {
        type totalPressure;
        p0 uniform 0;
        gamma 1.4;
        value uniform 0;
    }

    walls
    {
        type fixedValue;
        value uniform 0;
    }

    symmetryPlane
    {
        type zeroGradient;
    }
}
""",

    os.path.join(case_dir, "0", "nut"): """/*--------------------------------*- C++ -*----------------------------------*\
|  nut file for openfoam simulation |
\*---------------------------------------------------------------------------*/

dimensions [0 2 -1 0 0 0 0];

internalField uniform 0.001;

boundaryField
{
    inlet
    {
        type fixedValue;
        value uniform 0.001;
    }

    outlet
    {
        type zeroGradient;
    }

    walls
    {
        type fixedValue;
        value uniform 0.001;
    }

    symmetryPlane
    {
        type zeroGradient;
    }
}
""",

    os.path.join(case_dir, "constant", "transportProperties"): """// Transport properties
// Kinematic viscosity
nu      0.001;
""",

    os.path.join(case_dir, "constant", "turbulenceProperties"): """// turbulence properties

simulationType RAS;

// RAS model
RAS
{
    type kEpsilon;
    fundamentals
    {
        Cmu 0.09;
    }
}
""",

    os.path.join(case_dir, "system", "controlDict"): """application     pitzDaily;

startFrom       latestTime;

stopAt          endTime;

endTime         100;

deltaT          0.1;

writeControl    timeStep;

writeInterval   10;

purgeWrite      0;

writeFormat     ascii;
""",

    os.path.join(case_dir, "system", "fvSchemes"): """// fvSchemes

divSchemes
{
    default         Gauss linear;
}

gradSchemes
{
    default         Gauss linear;
}

laplacianSchemes
{
    default         Gauss linear;
}

interpolationSchemes
{
    default         linear;
}

snGradSchemes
{
    default         corrected;
}
""",

    os.path.join(case_dir, "system", "fvSolution"): """// fvSolution

solvers
{
    p
    {
        solver         PCG;
        preconditioner DIC;
        tolerance      1e-6;
        relTol        0;
    }

    U
    {
        solver         PISO;
    }
}
"""
}

# 将内容写入文件
for file_path, content in files_content.items():
    with open(file_path, 'w') as file:
        file.write(content)

# 创建 blockMeshDict
blockMeshDict_content = """/*--------------------------------*- C++ -*----------------------------------*\
| =========                 |
| \      /  F ield         |
|  \    /   O f            |
|   \  /    A nd           |
|    \/     M anagement    |
\*---------------------------------------------------------------------------*/

FoamFile
{
    version 2.0;
    format    ascii;
    class     dictionary;
    location "system";
    object    blockMeshDict;
}

// dimensions and geometry
convertToMeters 1;

// Blocks
blocks
(
    hex (0 1 2 3 4 5 6 7) (20 1 1) simpleGrading (1 1 1)
);

// Edges
edges
(
);

// Boundary
boundary
(
    inlet
    {
        type patch;
        faces
        (
            (0 1 5 4)
        );
    }

    outlet
    {
        type patch;
        faces
        (
            (2 3 7 6)
        );
    }

    walls
    {
        type wall;
        faces
        (
            (1 2 6 5)
            (0 3 7 4)
        );
    }

    symmetryPlane
    {
        type symmetryPlane;
        faces
        (
            (0 1 3 2)
        );
    }
);

// Merge patch pairs
mergePatchPairs
(
);
"""

# 写入 blockMeshDict 文件
with open(os.path.join(case_dir, "system", "blockMeshDict"), 'w') as f:
    f.write(blockMeshDict_content)

# 运行命令行指令以生成网格并运行模拟
try:
    subprocess.run(["blockMesh"], cwd=case_dir, check=True)
    subprocess.run(["simpleFoam"], cwd=case_dir, check=True)
except subprocess.CalledProcessError as e:
    print(f"Error occurred: {e}")

print(f"OpenFOAM case '{case_name}' has been set up and simulation started.")

 
使用说明
确保您的环境中安装了 OpenFOAM,并且相应的命令行工具(如 blockMesh 和 simpleFoam)可用。
将上述 Python 代码保存为一个 .py 文件,例如 setup_openfoam_case.py。
在终端中导航到该 Python 文件所在的目录。
运行命令 python setup_openfoam_case.py。

运行此脚本后,它会在当前工作目录下创建一个名为 pitzDailySteadyMappedToPart 的目录,并根据上述示例将内容写入到相应的文件中。接着,它会调用 blockMesh 和 simpleFoam 进行网格生成和流体仿真。如果顺利完成,脚本会输出相应的成功信息。

python代码运行:

转义字符错误

修改之后:

import os
import subprocess

# 定义案例名称和目录
case_name = "pitzDailySteadyMappedToPart"
case_dir = os.path.join(os.getcwd(), case_name)

# 创建目录结构
directories = [
    os.path.join(case_dir, "0"),
    os.path.join(case_dir, "constant"),
    os.path.join(case_dir, "system")
]

for directory in directories:
    os.makedirs(directory, exist_ok=True)

# 文件内容
files_content = {
    os.path.join(case_dir, "0", "U"): r"""/*--------------------------------*- C++ -*----------------------------------*\
|  U file for openfoam simulation |
\*---------------------------------------------------------------------------*/

dimensions [0 1 -1 0 0 0 0];

internalField uniform (0 0 0);

boundaryField
{
    inlet
    {
        type fixedValue;
        value uniform (1 0 0);
    }

    outlet
    {
        type zeroGradient;
    }

    walls
    {
        type noSlip;
    }

    symmetryPlane
    {
        type symmetryPlane;
    }
}
""",

    os.path.join(case_dir, "0", "p"): r"""/*--------------------------------*- C++ -*----------------------------------*\
|  p file for openfoam simulation |
\*---------------------------------------------------------------------------*/

dimensions [0 2 -2 0 0 0 0];

internalField uniform 0;

boundaryField
{
    inlet
    {
        type fixedValue;
        value uniform 0;
    }

    outlet
    {
        type totalPressure;
        p0 uniform 0;
        gamma 1.4;
        value uniform 0;
    }

    walls
    {
        type fixedValue;
        value uniform 0;
    }

    symmetryPlane
    {
        type zeroGradient;
    }
}
""",

    os.path.join(case_dir, "0", "nut"): r"""/*--------------------------------*- C++ -*----------------------------------*\
|  nut file for openfoam simulation |
\*---------------------------------------------------------------------------*/

dimensions [0 2 -1 0 0 0 0];

internalField uniform 0.001;

boundaryField
{
    inlet
    {
        type fixedValue;
        value uniform 0.001;
    }

    outlet
    {
        type zeroGradient;
    }

    walls
    {
        type fixedValue;
        value uniform 0.001;
    }

    symmetryPlane
    {
        type zeroGradient;
    }
}
""",

    os.path.join(case_dir, "constant", "transportProperties"): """// Transport properties
// Kinematic viscosity
nu      0.001;
""",

    os.path.join(case_dir, "constant", "turbulenceProperties"): """// turbulence properties

simulationType RAS;

// RAS model
RAS
{
    type kEpsilon;
    fundamentals
    {
        Cmu 0.09;
    }
}
""",

    os.path.join(case_dir, "system", "controlDict"): """application     pitzDaily;

startFrom       latestTime;

stopAt          endTime;

endTime         100;

deltaT          0.1;

writeControl    timeStep;

writeInterval   10;

purgeWrite      0;

writeFormat     ascii;
""",

    os.path.join(case_dir, "system", "fvSchemes"): """// fvSchemes

divSchemes
{
    default         Gauss linear;
}

gradSchemes
{
    default         Gauss linear;
}

laplacianSchemes
{
    default         Gauss linear;
}

interpolationSchemes
{
    default         linear;
}

snGradSchemes
{
    default         corrected;
}
""",

    os.path.join(case_dir, "system", "fvSolution"): """// fvSolution

solvers
{
    p
    {
        solver         PCG;
        preconditioner DIC;
        tolerance      1e-6;
        relTol        0;
    }

    U
    {
        solver         PISO;
    }
}
"""
}

# 将内容写入文件
for file_path, content in files_content.items():
    with open(file_path, 'w') as file:
        file.write(content)

# 创建 blockMeshDict
blockMeshDict_content = r"""/*--------------------------------*- C++ -*----------------------------------*\
| =========                 |
| \      /  F ield         |
|  \    /   O f            |
|   \  /    A nd           |
|    \/     M anagement    |
\*---------------------------------------------------------------------------*/

FoamFile
{
    version 2.0;
    format    ascii;
    class     dictionary;
    location "system";
    object    blockMeshDict;
}

// dimensions and geometry
convertToMeters 1;

// Blocks
blocks
(
    hex (0 1 2 3 4 5 6 7) (20 1 1) simpleGrading (1 1 1)
);

// Edges
edges
(
);

// Boundary
boundary
(
    inlet
    {
        type patch;
        faces
        (
            (0 1 5 4)
        );
    }

    outlet
    {
        type patch;
        faces
        (
            (2 3 7 6)
        );
    }

    walls
    {
        type wall;
        faces
        (
            (1 2 6 5)
            (0 3 7 4)
        );
    }

    symmetryPlane
    {
        type symmetryPlane;
        faces
        (
            (0 1 3 2)
        );
    }
);

// Merge patch pairs
mergePatchPairs
(
);
"""

# 写入 blockMeshDict 文件
with open(os.path.join(case_dir, "system", "blockMeshDict"), 'w') as f:
    f.write(blockMeshDict_content)

# 运行命令行指令以生成网格并运行模拟
try:
    subprocess.run(["blockMesh"], cwd=case_dir, check=True)
    subprocess.run(["simpleFoam"], cwd=case_dir, check=True)
except subprocess.CalledProcessError as e:
    print(f"Error occurred: {e}")
except FileNotFoundError as fnf_error:
    print(f"FileNotFoundError: {fnf_error}. Make sure OpenFOAM is installed and accessible via the command line.")

print(f"OpenFOAM case '{case_name}' has been set up and simulation started.")

代码运行: 因为本地没有安装 openfoam所以报异常

2.2 对比

对比 1:目录结构完全相同

对比 2: blockMeshDict 相同

对比 3:U文件 相同

对比 4:p文件 相同

对比 5:nut文件 相同

对比 6:流体物性 相同

对比 7: 模型设置 相同

对比 8:控制 相同

不同 :多出了 fvSchemes 和 fvSolution

3 总结

算例 -> 流程描述: 返回的格式清晰且合理,使得下一步的流程描述能够更加准确地转化为Python代码;返回的内容存在一定差异,更加倾向于基础示例,例如八个点构成的扁平长方体,但针对其他更复杂的算例,很难在此基础上进行适度的调整;在压强、速度、粘度等小的方面,格式保持一致,但内容上可能有所不同。

流程描述 -> Python代码: 由于上一步返回了合理的格式,这使得在这一阶段能够高效且准确地生成对应的Python代码。只要保持上一步的格式不变,就能顺利地实现代码的生成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马武寨山的猴子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值