4、几何建模(上):Bladed/OpenFAST模型导出、STL/IGES格式处理、叶片翼型数据准备

各位同学,咱们今天聊聊几何建模的上半场。说实话,做CFD仿真这么多年,我最大的体会就是:模型搞不定,后面全是白忙活。很多新手一上来就急着跑求解器,结果网格画不出来,或者算出来的流场跟实际差十万八千里——十有八九是几何这一步埋了雷。

这一章,我带你走一遍从Bladed/OpenFAST导出模型,到处理STL/IGES格式,再到准备翼型数据的完整流程。嗯,都是我在项目里踩过坑、填过土的经验。

核心逻辑:几何建模不是简单的“画个形状”,而是为后续网格划分和求解器识别服务的。你给什么几何,网格就长什么样,结果就有什么精度。

几何建模(上) Bladed/OpenFAST导出 STL/IGES格式处理 翼型数据准备 .dat / .out 文件 → 几何重构 坐标点 → 样条曲线 → 截面 STL: 三角面片 / IGES: NURBS曲面

4.1 从Bladed/OpenFAST导出模型——别小看这一步

我个人习惯,拿到一个风电项目,第一件事不是开CAD,而是先看设计方给的是什么格式。如果是Bladed或者OpenFAST的模型文件,恭喜你,省了一半力气——但也可能掉进另一个坑。

Bladed模型导出,说白了就是把叶片、塔筒、机舱的几何参数提取出来。Bladed里通常存的是截面数据(弦长、扭角、翼型编号),你需要把这些数据转成三维坐标。

我记得有一次,客户给了一个Bladed项目文件,里面叶片有30个截面,但导出时忘了勾选“输出几何坐标”。结果我拿到手的只有气动参数表,没有空间位置。嗯,后来我写了个小脚本,根据弦长和扭角反算坐标——多花了两天时间。

我的建议:导出时一定确认勾选“Export Geometry Data”或类似选项。Bladed 4.8以上版本在File → Export → Geometry菜单下。

OpenFAST模型导出稍微复杂一点。OpenFAST的输入文件(.fst)里定义了叶片结构,但几何信息分散在多个文件中:

  • 主文件(.fst):引用叶片文件、塔筒文件
  • 叶片文件(.dat):包含截面位置、弦长、扭角
  • 翼型文件(.dat):每个截面的翼型坐标

你需要把这些数据拼起来。我一般用Python写个解析器,一行行读.dat文件,然后生成三维点云。代码大概长这样:

import numpy as np

def read_blade_dat(filename):
    """读取OpenFAST叶片.dat文件,返回截面数据"""
    with open(filename, 'r') as f:
        lines = f.readlines()
    
    # 跳过注释行(以!开头)
    data_lines = [l for l in lines if not l.strip().startswith('!') and l.strip() != '']
    
    # 解析截面数
    n_sections = int(data_lines[0].split()[0])
    
    sections = []
    for i in range(1, n_sections+1):
        parts = data_lines[i].split()
        r = float(parts[0])      # 展向位置
        chord = float(parts[1])  # 弦长
        twist = float(parts[2])  # 扭角(度)
        airfoil_id = int(parts[3])
        sections.append([r, chord, twist, airfoil_id])
    
    return np.array(sections)

注意:OpenFAST的坐标系统跟CFD软件可能不一致。OpenFAST通常用右手系,z轴向上;而很多CFD软件用y轴向上。导出后记得做坐标变换,否则模型会“躺”在地上。

4.2 STL/IGES格式处理——选对格式,事半功倍

模型导出来之后,下一步就是转成CFD软件能吃的格式。这里有两个主流选择:STLIGES

STL(Stereolithography),说白了就是用一堆小三角形拼出你的模型。优点是通用性强,几乎所有CFD软件都支持;缺点是精度有限——三角形越多越精细,但文件也越大。

我在项目中遇到过一件事:一个同事用STL导出了叶片,三角形数量设了500万。结果网格划分软件直接崩溃了。后来我帮他降到50万,网格质量反而更好——因为三角形太密反而引入了噪声。

格式 优点 缺点 适用场景
STL 通用、简单、轻量 精度有限、无拓扑 复杂曲面、快速验证
IGES 高精度、NURBS曲面 文件大、兼容性差 高精度仿真、翼型截面

IGES(Initial Graphics Exchange Specification)是另一种路子。它保存的是NURBS曲面,精度比STL高一个量级。你想想看,叶片前缘的曲率变化很剧烈,用STL可能产生台阶效应,而IGES能完美还原。

但IGES也有坑——不同软件之间的兼容性很差。我曾经从SolidWorks导出一个IGES文件,到Pointwise里打开,曲面直接破了个大洞。后来我试了试Parasolid格式(.x_t),反而没问题。所以我的经验是:多试几种格式,别在一棵树上吊死

我的建议:对于风电叶片这种大曲率、长展向的几何,优先用IGES或STEP格式。如果软件不支持,再转STL,但三角形数量控制在20万-100万之间。

4.3 叶片翼型数据准备——细节决定成败

最后一步,也是很多人容易忽略的一步:翼型数据准备。你从Bladed或OpenFAST导出的翼型坐标,通常是归一化的(弦长=1),而且只有几十个点。直接拿去做CFD?嗯,网格质量会很难看。

为什么?因为CFD需要光滑的曲面。原始翼型坐标点可能分布不均匀,前缘点少、后缘点多,或者有测量噪声。你需要做两件事:

  1. 插值加密:用样条曲线把点数从几十个加密到几百个
  2. 光顺处理:去除噪声,保证曲率连续

我一般用Python的scipy.interpolate库来做。代码示例如下:

from scipy.interpolate import CubicSpline
import numpy as np

def smooth_airfoil(x_orig, y_orig, n_points=200):
    """
    对翼型坐标进行样条插值和光顺
    x_orig, y_orig: 原始坐标(归一化弦长)
    n_points: 目标点数
    """
    # 按弧长参数化
    t = np.zeros(len(x_orig))
    t[1:] = np.cumsum(np.sqrt(np.diff(x_orig)**2 + np.diff(y_orig)**2))
    t = t / t[-1]
    
    # 创建均匀参数点
    t_new = np.linspace(0, 1, n_points)
    
    # 三次样条插值
    cs_x = CubicSpline(t, x_orig, bc_type='natural')
    cs_y = CubicSpline(t, y_orig, bc_type='natural')
    
    x_new = cs_x(t_new)
    y_new = cs_y(t_new)
    
    return x_new, y_new

我曾经接手过一个项目,客户给的翼型数据只有32个点,而且前缘部分明显有测量误差。我用上面的代码加密到200点,再手动调整了前缘的3个点——结果网格质量从0.3提升到了0.85(偏斜度指标)。你想想看,这差距有多大。

一个小技巧:翼型的前缘和后缘是网格质量的关键。前缘曲率大,建议加密到原始点数的3-5倍;后缘如果是钝后缘,记得保留厚度信息,不要强行收成尖点。

另外,翼型数据通常分为上表面和下表面。我建议你分开存储,因为CFD软件里需要分别定义壁面边界。格式很简单:

# 上表面(从后缘到前缘再到后缘)
x_up = [1.0, 0.9, 0.8, ..., 0.0, ..., 0.8, 0.9, 1.0]
y_up = [0.0, 0.02, 0.04, ..., 0.12, ..., 0.04, 0.02, 0.0]

# 下表面(从后缘到前缘再到后缘)
x_low = [1.0, 0.9, 0.8, ..., 0.0, ..., 0.8, 0.9, 1.0]
y_low = [0.0, -0.02, -0.04, ..., -0.12, ..., -0.04, -0.02, 0.0]

注意:翼型坐标的顺序必须一致——要么都是顺时针,要么都是逆时针。否则CFD软件在生成网格时会报“法向量反向”的错误。我曾经因为这个bug排查了一整天,最后发现是坐标顺序反了。

好了,这一章的内容就到这里。几何建模的上半场,说白了就是三件事:导出、转格式、准备数据。每一步都不难,但每一步都有坑。你按照我上面说的流程走,至少能避开80%的常见问题。

记住一句话:几何建模花的时间,会在网格划分和求解阶段加倍还给你。别图快,稳一点。


公众号:蓝海资料掘金营,微信deep3321