目录
tutorials\incompressibleDenseParticleFluid\injectionChannel
tutorials\incompressibleDriftFlux\dahl
tutorials\incompressibleFluid\impeller
不同 :多出了 fvSchemes 和 fvSolution
序言
想法:我想要通过大模型生成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代码。只要保持上一步的格式不变,就能顺利地实现代码的生成。