跳转至

求解器

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_ontruegravity_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/>气动与尾迹可视化"]

StaticCoupledNonLinearStaticStaticUvlm 紧耦合:

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/>气动与尾迹可视化"]

DynamicCoupledNonLinearDynamicStepUvlm 紧耦合,在每个时间步内迭代结构变形与气动力平衡。

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_solverstructural_solver_settingsaero_solveraero_solver_settingsfsi_substepsrelaxation_factor
  • NonLinearDynamic(位于 structural_solver_settings 内):dt(时间步长,本项目典型值约 \(10^{-4}\)\(10^{-3}\) s)、num_steps(总时间步数)。
  • StepUvlm(位于 aero_solver_settings 内):dtnum_stepsvelocity_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

实操建议

  1. 先从静力调试:运行 NonLinearStatic 确认结构模型正确,再逐步添加气动加载和耦合。
  2. 检查收敛:关注 log 中的收敛信息;如不收敛,尝试减小载荷、增加增量步或降低容差。
  3. 动态计算用小步长:DynamicCoupled 的初始时间步长建议取 \(dt < 1 / (20 \cdot f_{\max})\),其中 \(f_{\max}\) 为激励或关心的最高频率。
  4. 验证平衡:例如对于悬臂梁,结果应满足 \(\text{根部力} + \text{梁上外力} \approx 0\)