迁移指南:OpenFOAM → pyOpenFOAM
面向已熟悉 OpenFOAM 并希望使用 pyOpenFOAM 进行 Python CFD 工作流的工程师和研究人员。
OpenFOAM
pyOpenFOAM
说明
算例目录
Case("path/to/case")
读取所有配置和网格
system/controlDict
case.controlDict
返回 FoamDict
system/fvSchemes
case.fvSchemes
解析后的字典
system/fvSolution
case.fvSolution
解析后的字典
constant/polyMesh/
case.mesh
返回 MeshData
时间目录 0/、1/...
case.time_dirs
排序字符串列表
场文件 0/U
case.read_field("U", time=0)
返回 FieldData
from pyfoam .io .case import Case
case = Case ("pitzDaily" )
print (case .controlDict ["application" ])
print (case .list_fields (time = 0 ))
OpenFOAM
pyOpenFOAM
形状
polyMesh
PolyMesh
原始拓扑
fvMesh
FvMesh
含几何量
points
mesh.points
(n_points, 3)
faces
mesh.faces
list[Tensor]
owner
mesh.owner
(n_faces,)
neighbour
mesh.neighbour
(n_internal_faces,)
V()
mesh.cell_volumes
(n_cells,)
C()
mesh.cell_centres
(n_cells, 3)
Sf()
mesh.face_areas
(n_faces, 3)
Cf()
mesh.face_centres
(n_faces, 3)
deltaCoeffs()
mesh.delta_coefficients
(n_faces,)
weights()
mesh.face_weights
(n_faces,)
from pyfoam .mesh import FvMesh
mesh = FvMesh (points , faces , owner , neighbour , boundary )
mesh .compute_geometry () # 预计算所有几何量
OpenFOAM
pyOpenFOAM
形状
volScalarField p
volScalarField(mesh, "p")
(n_cells,)
volVectorField U
volVectorField(mesh, "U")
(n_cells, 3)
volTensorField tau
volTensorField(mesh, "tau")
(n_cells, 3, 3)
surfaceScalarField phi
原始 torch.Tensor
(n_faces,)
p.internalField()
p.internal_field
直接访问
p.boundaryField()
p.boundary_field
BoundaryField 对象
赋值 p = ...
p.assign(...)
原地更新
from pyfoam .fields import volScalarField , volVectorField
import torch
p = volScalarField (mesh , "p" )
p .assign (torch .zeros (mesh .n_cells ))
U = volVectorField (mesh , "U" )
U .assign (torch .zeros (mesh .n_cells , 3 ))
OpenFOAM 求解器
pyOpenFOAM 类
import 路径
simpleFoam
SimpleFoam
pyfoam.applications
icoFoam
IcoFoam
pyfoam.applications
pisoFoam
PisoFoam
pyfoam.applications
pimpleFoam
PimpleFoam
pyfoam.applications
rhoSimpleFoam
RhoSimpleFoam
pyfoam.applications
rhoPimpleFoam
RhoPimpleFoam
pyfoam.applications
sonicFoam
SonicFoam
pyfoam.applications
rhoCentralFoam
RhoCentralFoam
pyfoam.applications
buoyantSimpleFoam
BuoyantSimpleFoam
pyfoam.applications
buoyantPimpleFoam
BuoyantPimpleFoam
pyfoam.applications
buoyantBoussinesqSimpleFoam
BuoyantBoussinesqSimpleFoam
pyfoam.applications
laplacianFoam
LaplacianFoam
pyfoam.applications
interFoam
InterFoam
pyfoam.applications
multiphaseInterFoam
MultiphaseInterFoam
pyfoam.applications
twoPhaseEulerFoam
TwoPhaseEulerFoam
pyfoam.applications
multiphaseEulerFoam
MultiphaseEulerFoam
pyfoam.applications
cavitatingFoam
CavitatingFoam
pyfoam.applications
potentialFoam
PotentialFoam
pyfoam.applications
scalarTransportFoam
ScalarTransportFoam
pyfoam.applications
reactingFoam
ReactingFoam
pyfoam.applications
solidDisplacementFoam
SolidDisplacementFoam
pyfoam.applications
SRFSimpleFoam
SRFSimpleFoam
pyfoam.applications
porousSimpleFoam
PorousSimpleFoam
pyfoam.applications
boundaryFoam
BoundaryFoam
pyfoam.applications
chtMultiRegionFoam
ChtMultiRegionFoam
pyfoam.applications
compressibleInterFoam
CompressibleInterFoam
pyfoam.applications
使用模式:
from pyfoam .applications import SimpleFoam
solver = SimpleFoam ("path/to/case" )
solver .run ()
OpenFOAM type
pyOpenFOAM 类
注册名
fixedValue
FixedValueBC
"fixedValue"
zeroGradient
ZeroGradientBC
"zeroGradient"
fixedGradient
FixedGradientBC
"fixedGradient"
calculated
CalculatedBC
"calculated"
noSlip
NoSlipBC
"noSlip"
cyclic
CyclicBC
"cyclic"
cyclicAMI
CyclicAMIBC
"cyclicAMI"
symmetryPlane
SymmetryBC
"symmetryPlane"
empty
EmptyBC
"empty"
inletOutlet
InletOutletBC
"inletOutlet"
totalPressure
TotalPressureBC
"totalPressure"
fixedFluxPressure
FixedFluxPressureBC
"fixedFluxPressure"
advective
AdvectiveBC
"advective"
codedFixedValue
CodedFixedValueBC
"codedFixedValue"
buoyantPressure
BuoyantPressureBC
"buoyantPressure"
nutkWallFunction
NutkWallFunctionBC
"nutkWallFunction"
kqRWallFunction
KqRWallFunctionBC
"kqRWallFunction"
OpenFOAM 字典格式:
inlet
{
type fixedValue;
value uniform (1 0 0);
}
pyOpenFOAM Python API:
from pyfoam .boundary import BoundaryCondition , Patch
patch = Patch (
name = "inlet" ,
face_indices = torch .tensor ([0 , 1 , 2 ]),
face_normals = torch .tensor ([[- 1 , 0 , 0.0 ]] * 3 ),
face_areas = torch .tensor ([0.01 , 0.01 , 0.01 ]),
delta_coeffs = torch .tensor ([100.0 , 100.0 , 100.0 ]),
owner_cells = torch .tensor ([0 , 1 , 2 ]),
)
bc = BoundaryCondition .create ("fixedValue" , patch , coeffs = {"value" : 1.0 })
bc .apply (velocity_field , patch_idx = 0 )
OpenFOAM fvSchemes
pyOpenFOAM 类
linear
LinearInterpolation
upwind
UpwindInterpolation
linearUpwind
LinearUpwindInterpolation
QUICK
QuickInterpolation
harmonic
HarmonicInterpolation
LUST
LUSTInterpolation
vanLeer
VanLeerInterpolation
Gamma
GammaInterpolation
OpenFOAM
pyOpenFOAM
Gauss linear
GaussLinearGrad
leastSquares
LeastSquaresGrad
OpenFOAM
pyOpenFOAM
Euler
EulerDdt
steadyState
SteadyStateDdt
CrankNicolson
CrankNicolsonDdt
OpenFOAM RAS 模型
pyOpenFOAM 注册名
kEpsilon
"kEpsilon"
realizableKE
"realizableKE"
RNGkEpsilon
"RNGkEpsilon"
kOmega
"kOmega"
kOmegaSST
"kOmegaSST"
kOmegaSSTLM
"kOmegaSSTLM"
SpalartAllmaras
"SpalartAllmaras"
v2f
"v2f"
LRR
"LRR"
SSG
"SSG"
OpenFOAM LES 模型
pyOpenFOAM 注册名
Smagorinsky
"Smagorinsky"
WALE
"WALE"
dynamicSmagorinsky
"dynamicSmagorinsky"
dynamicLagrangian
"dynamicLagrangian"
kEqn
"kEqn"
from pyfoam .turbulence import TurbulenceModel
model = TurbulenceModel .create ("kOmegaSST" , mesh , U , phi )
model .correct ()
nut = model .nut ()
OpenFOAM:
application simpleFoam;
startFrom startTime;
startTime 0;
stopAt endTime;
endTime 1000;
deltaT 1;
writeControl timeStep;
writeInterval 100;
pyOpenFOAM 读取同一文件,返回 Python 字典:
case = Case ("path/to/case" )
app = case .controlDict ["application" ] # "simpleFoam"
dt = float (case .controlDict ["deltaT" ]) # 1.0
求解器配置保持兼容,pyOpenFOAM 解析为嵌套字典:
config = case .fvSolution
p_solver = config ["solvers" ]["p" ]["solver" ] # "PCG"
p_tol = float (config ["solvers" ]["p" ]["tolerance" ]) # 1e-6
# 原始 OpenFOAM 工作流
cd pitzDaily
blockMesh
simpleFoam
foamToVTK
# 完整 Python 工作流
from pyfoam .applications import SimpleFoam
from pyfoam .postprocessing import FoamToVTK
# 运行求解器
solver = SimpleFoam ("pitzDaily" )
solver .run ()
# 导出 VTK
FoamToVTK ("pitzDaily" ).export ()
# Python 后处理
from pyfoam .io .case import Case
case = Case ("pitzDaily" )
U = case .read_field ("U" , time = case .time_dirs [- 1 ])
print (f"最大速度: { U .data .max ()} " )
文档
路径
API 索引
docs/api/README.md
入门指南
docs/user_guide/getting_started.md
模块详细 API
docs/api/modules.md
GPU 指南
docs/zh/gpu_guide.md