求解器¶
SHARPy 通过 .sharpy 配置文件中的 flow 列表串联求解器,从模型加载一直运行到结果输出。本章说明常用的求解器及其常见组合方式。
求解器总览¶
以下为求解器功能的大致介绍,对于求解器的具体原理和其输入输出,请参考官方文档。
| 求解器 | 类型 | 用途 |
|---|---|---|
BeamLoader |
加载器 | 加载梁结构 FEM 模型(.fem.h5) |
AerogridLoader |
加载器 | 加载气动面模型(.aero.h5) |
NonLinearStatic |
结构求解器 | 非线性静态平衡求解 |
NonLinearDynamic |
结构求解器 | 非线性时域推进 |
StaticUvlm |
气动求解器 | 稳态涡格法求解 |
StepUvlm |
气动求解器 | 时域推进涡格法求解 |
StaticCoupled |
耦合求解器 | 静态气动弹性紧耦合迭代 |
DynamicCoupled |
耦合求解器 | 动态气动弹性紧耦合推进 |
Modal |
结构求解器 | 模态分析(固有频率与振型) |
BeamLoads |
后处理 | 梁载荷输出 |
BeamPlot |
后处理 | 梁变形与载荷可视化(VTK) |
AerogridPlot |
后处理 | 气动网格与尾迹可视化(VTK) |
SaveData |
后处理 | 结果数据保存(HDF5) |
典型求解流水线¶
纯结构静态求解¶
适用场景:悬臂梁在集中力、分布力、仅重力等工况下的稳态变形计算。
flowchart LR
A["BeamLoader<br/>加载结构模型"] --> B["NonLinearStatic<br/>非线性静力平衡"]
B --> C["BeamLoads<br/>提取梁载荷"]
C --> D["BeamPlot<br/>输出梁 VTK"]
输入文件:
| 文件 | 内容 |
|---|---|
.fem.h5 |
节点坐标、单元连接、刚度数据库、质量数据库、边界条件、外加载荷 |
.sharpy |
flow 定义、求解器参数 |
主要参数:
NonLinearStatic.gravity_on:是否开启重力。NonLinearStatic.num_load_steps:载荷增量步数,0 表示一次性施加。NonLinearStatic.min_delta:收敛容差。
StaticCoupled 静气动弹性¶
适用场景:静态气动弹性耦合求解,包含结构重力但不包含动态激励;求解气动力、结构变形和重力的联合平衡。
flowchart LR
A["BeamLoader<br/>加载 .fem.h5"] --> C["StaticCoupled<br/>静态气动弹性平衡"]
B["AerogridLoader<br/>加载 .aero.h5"] --> C
C --> D["BeamLoads<br/>梁载荷输出"]
D --> E["BeamPlot<br/>梁变形可视化"]
D --> F["AerogridPlot<br/>气动网格可视化"]
输入文件:
| 文件 | 内容 |
|---|---|
.fem.h5 |
结构模型(含刚度、质量、边界条件) |
.aero.h5 |
气动节点、弦长、扭转角(迎角)、翼型数据、弹性轴位置 |
.sharpy |
flow 定义、耦合求解器参数、重力开关与方向 |
主要参数:
StaticCoupled.max_iter:最大耦合迭代次数。StaticCoupled.tolerance:耦合收敛容差。NonLinearStatic.gravity_on:true,gravity_dir=[0,0,1]。
StaticCoupled 气动弹性耦合¶
适用场景:柔性机翼在给定迎角和空速下的静气动弹性平衡。
flowchart LR
A["BeamLoader<br/>结构模型"] --> C["StaticCoupled<br/>静气动弹性耦合"]
B["AerogridLoader<br/>气动面模型"] --> C
C --> D["BeamLoads<br/>梁载荷输出"]
C --> E["BeamPlot<br/>梁变形可视化"]
C --> F["AerogridPlot<br/>气动与尾迹可视化"]
StaticCoupled 将 NonLinearStatic 与 StaticUvlm 紧耦合:
flowchart LR
A["未变形构型"] --> B["StaticUvlm<br/>求解气动力"]
B --> C["气动力映射到结构节点"]
C --> D["NonLinearStatic<br/>求解结构变形"]
D --> E["更新气动网格"]
E --> F{"力与位移收敛?"}
F -- 否 --> B
F -- 是 --> G["静态平衡结果"]
主要参数:
StaticCoupled.max_iter:最大耦合迭代次数。StaticCoupled.tolerance:耦合收敛容差。StaticCoupled.relaxation_factor:松弛因子(0 表示关闭松弛)。
DynamicCoupled 气动弹性动态¶
适用场景:时变载荷作用下的气动弹性动态响应。
flowchart LR
A["BeamLoader<br/>结构模型与初始条件"] --> D["DynamicCoupled<br/>动态气动弹性推进"]
B["AerogridLoader<br/>气动模型"] --> D
C[".dyn.h5<br/>动态载荷时间序列"] --> D
D --> E["BeamLoads<br/>梁载荷输出"]
D --> F["BeamPlot<br/>梁响应可视化"]
D --> G["AerogridPlot<br/>气动与尾迹可视化"]
DynamicCoupled 将 NonLinearDynamic 与 StepUvlm 紧耦合,在每个时间步内迭代结构变形与气动力平衡。
flowchart LR
A["当前时间步"] --> B["StepUvlm<br/>推进气动状态"]
B --> C["气动力映射到结构节点"]
C --> D["NonLinearDynamic<br/>推进结构状态"]
D --> E{"FSI 子迭代收敛?"}
E -- 否 --> B
E -- 是 --> F["进入下一时间步"]
输入文件:
| 文件 | 内容 |
|---|---|
.fem.h5 |
结构模型(含初始条件) |
.aero.h5 |
气动模型 |
.dyn.h5 |
动态载荷时间序列(如翼尖周期力) |
.sharpy |
flow 定义、求解器参数、时间步长 |
主要参数(项目 .sharpy 生成器实际使用的字段):
DynamicCoupled级别:structural_solver、structural_solver_settings、aero_solver、aero_solver_settings、fsi_substeps、relaxation_factor。NonLinearDynamic(位于structural_solver_settings内):dt(时间步长,本项目典型值约 \(10^{-4}\)–\(10^{-3}\) s)、num_steps(总时间步数)。StepUvlm(位于aero_solver_settings内):dt、num_steps、velocity_field_generator等。.dyn.h5中的dynamic_forces:(num_steps, num_nodes, 6)数组,格式为 \([F_x, F_y, F_z, M_x, M_y, M_z]\)。
模态分析¶
适用场景:计算悬臂梁无阻尼固有频率和振型。
flowchart LR
A["BeamLoader<br/>加载质量与刚度矩阵"] --> B["Modal<br/>求解固有频率与振型"]
SHARPy Modal 求解器使用 .fem.h5 中的质量矩阵(mass_db)和刚度矩阵(stiffness_db),求解广义特征值问题:
\[
\mathbf{K} \boldsymbol{\phi} = \omega^2 \mathbf{M} \boldsymbol{\phi}
\]
固有频率 \(f = \omega / (2\pi)\),振型 \(\boldsymbol{\phi}\) 按质量归一化或最大位移归一化。
输入输出总览¶
flowchart LR
subgraph 输入文件
A[.fem.h5<br/>结构模型]
B[.aero.h5<br/>气动模型]
C[.dyn.h5<br/>动态载荷]
D[.sharpy<br/>求解器配置]
end
subgraph 求解器
E[SHARPy<br/>solver chain]
end
subgraph 输出文件
F[raw_results.json<br/>原始响应]
G[beam/*.vtp<br/>梁变形可视化]
H[aero/*.vtp<br/>气动与尾迹可视化]
I[logs/<br/>运行日志]
end
A --> E
B --> E
C --> E
D --> E
E --> F
E --> G
E --> H
E --> I
实操建议¶
- 先从静力调试:运行
NonLinearStatic确认结构模型正确,再逐步添加气动加载和耦合。 - 检查收敛:关注 log 中的收敛信息;如不收敛,尝试减小载荷、增加增量步或降低容差。
- 动态计算用小步长:DynamicCoupled 的初始时间步长建议取 \(dt < 1 / (20 \cdot f_{\max})\),其中 \(f_{\max}\) 为激励或关心的最高频率。
- 验证平衡:例如对于悬臂梁,结果应满足 \(\text{根部力} + \text{梁上外力} \approx 0\)。