obsidian_backup/copilot-conversations/20260109_152054__基于凯恩方程原理,[[Tower]]详细展示公式推导过程.md

905 lines
66 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
epoch: 1767943254796
modelKey: gemini-2.5-flash|google
tags:
- copilot-conversation
---
**user**: 基于凯恩方程原理,[[Tower]]详细展示公式推导过程
[Timestamp: 2026/01/09 15:20:54]
**ai**: 基于凯恩方程原理,[[Tower]]笔记详细展示了塔架的公式推导过程,主要涉及广义惯性力、广义弹性力、广义阻尼力、广义重力以及广义气动力。
### 1. 广义惯性力 (Generalized Inertia Forces)
塔架的分布式特性带来了与塔架弹性、塔架阻尼、塔架气动特性和塔架重量相关的广义惯性力和广义主动力。笔记中提到,为了简化模型,消除了塔架质量调谐器,并消除了塔架刚度调谐器对重力去刚化载荷的影响。
广义惯性力 $F_r^* \Big|_T$ 的定义如下:
$$
F_r^* \Big|_T = - \int_0^{TwFlexL} \mu^T (h) \cdot {}^E v_r^T (h) \cdot {}^E a^T (h)dh - YawBrMass {}^E v_r^O \cdot {}^E a^O \quad (r = 1, 2, \ldots, 22) \tag{1}
$$
其中,$\mu^T (h)$ 是调整后的塔架质量密度,定义为:
$$
\text{where} \quad \mu^T (h) = AdjTwMa \cdot TMassDen(h)\tag{1}
$$
这里,$AdjTwMa$ 是调整系数,$TMassDen(h)$ 是塔架沿高度 $h$ 的质量密度。${}^E v_r^T (h)$ 是塔架上点 T 的广义速度,${}^E a^T (h)$ 是塔架上点 T 的广义加速度。$YawBrMass$ 是偏航轴承质量,${}^E v_r^O$ 和 ${}^E a^O$ 分别是偏航轴承处的广义速度和广义加速度。
将加速度项展开为广义坐标 $\ddot{q}_i$ 和 $\dot{q}_i$ 的形式,广义惯性力可以表示为:
$$
F_r^* \Big|_T = - \int_0^{TwrFlexL} \mu^T (h) \cdot {}^E \mathbf{v}_r^T (h) \cdot \left\{ \left( \sum_{i=1}^{10} {}^E \mathbf{v}_i^T (h) \ddot{q}_i \right) + \left[ \sum_{i=4}^{10} \frac{d}{dt} \left( {}^E \mathbf{v}_i^T (h) \right) \dot{q}_i \right] \right\} dh - YawBrMass {}^E \mathbf{v}_r^O \cdot \left\{ \left( \sum_{i=1}^{10} {}^E \mathbf{v}_i^O \ddot{q}_i \right) + \left[ \sum_{i=4}^{10} \frac{d}{dt} \left( {}^E \mathbf{v}_i^O \right) \dot{q}_i \right] \right\} \quad (r=1,2,\ldots,10)\tag{2}
$$
从上述方程中,可以提取出质量矩阵 $[C(\mathbf{q},t)]_T$ 和非线性惯性力项 $\left\{ - f(\dot{q},q,t) \right\} \Big|_T$
$$
[C(\mathbf{q},t)]_T (Row, Col) = \int_0^{TwrFlexL} \mu^T (h) {}^E \mathbf{v}_{Row}^T (h) \cdot {}^E \mathbf{v}_{Col}^T (h)dh - YawBrMass {}^E \mathbf{v}_{Row}^O \cdot {}^E \mathbf{v}_{Col}^O \quad (Row, Col = 1, 2, \ldots, 10)\tag{3}
$$
$$
\left\{ - f(\dot{q},q,t) \right\} \Big|_T (Row) = - \int_0^{TwrFlexL} \mu^T (h) {}^E \mathbf{v}_{Row}^T (h) \cdot \left( \sum_{i=4}^{10} \frac{d}{dt} \left[ {}^E \mathbf{v}_i^T (h) \right] \dot{q}_i \right) dh - YawBrMass {}^E \mathbf{v}_{Row}^O \cdot \left[ \sum_{i=4}^{10} \frac{d}{dt} \left( {}^E \mathbf{v}_i^O \right) \dot{q}_i \right] \quad (Row = 1,2,\ldots,10)\tag{4}
$$
### 2. 广义弹性力 (Generalized Elastic Forces)
广义弹性力 $F_{r \Big| ElasticT}$ 是通过对弹性势能 $V'^T$ 求偏导得到的:
$$
F_{r \Big| ElasticT} = - \frac{\partial V'^T}{\partial q_r} \quad (r = 1,2,\ldots,22)\tag{5}
$$
具体形式如下,其中考虑了塔架前后 (TFA) 和侧向 (TSS) 的两个模态:
$$
F_{r \Big| ElasticT} = \left\{
\begin{array}{ll}
-k_{11}^{'TFA} q_{TFA1} - k_{12}^{'TFA} q_{TFA2} & \text{for } r=TFA1 \\
-k_{11}^{'TSS} q_{TSS1} - k_{12}^{'TSS} q_{TSS2} & \text{for } r=TSS1 \\
-k_{21}^{'TFA} q_{TFA1} - k_{22}^{'TFA} q_{TFA2} & \text{for } r=TFA2 \\
-k_{21}^{'TSS} q_{TSS1} - k_{22}^{'TSS} q_{TSS2} & \text{for } r=TSS2 \\
0 & \text{otherwise}
\end{array}
\right.\tag{6}
$$
其中,$k_{\ i j}^{\,\prime T F A}$ 和 $k_{{i j}}^{\,\prime{T S S}}$ 分别是塔架在前后和侧向方向上的广义刚度,不包括重力去刚化效应。它们通过积分形式定义:
$$
k_{ij}^{'TFA} = \sqrt{FAStTunr(i) FAStTunr(j)} \int_0^{TwrFlexL} EI^{TFA}(h) \frac{d^2 \phi_i^{TFA}(h)}{dh^2} \frac{d^2 \phi_j^{TFA}(h)}{dh^2} dh \quad (i, j = 1,2) \text{ (which is symmetric)}\tag{7}
$$
其中,$EI^{TFA}(h)$ 是调整后的塔架前后方向的弯曲刚度:
$$
EI^{TFA}(h) = AdjFASt \cdot TwFAStif(h)\tag{8}
$$
类似地,侧向的广义刚度为:
$$
k_{ij}^{'TSS} = \sqrt{SSStTunr(i) SSStTunr(j)} \int_0^{TwrFlexL} EI^{TSS}(h) \frac{d^2 \phi_i^{TSS}(h)}{dh^2} \frac{d^2 \phi_j^{TSS}(h)}{dh^2} dh \quad (i, j = 1,2) \text{ (which is symmetric)}\tag{9}
$$
其中,$EI^{TSS}(h)$ 是调整后的塔架侧向的弯曲刚度:
$$
EI^{TSS}(h) = AdjSSSt \cdot TwSSStif(h)\tag{10}
$$
这些广义刚度中的积分系数代表了各个模态刚度调谐,允许用户在各个模态之间改变塔的刚度,从而更好地匹配塔的固有频率。
对于弹性力,质量矩阵 $[C(q,t)]|_{\text{Elastic}T}$ 为零,非线性惯性力项 $\{-f(\dot{q},q,t)\}|_{\text{Elastic}T}$ 包含了弹性力项:
$$
[C(q,t)]|_{\text{Elastic}T} = 0\tag{15}
$$
$$
\{-f(\dot{q},q,t)\}|_{\text{Elastic}T} = \begin{Bmatrix}
\vdots \\
\vdots \\
\vdots \\
-k_{11}^{'TFA} q_{TFA1} - k_{12}^{'TFA} q_{TFA2} \\
-k_{11}^{'TSS} q_{TSS1} - k_{12}^{'TSS} q_{TSS2} \\
-k_{21}^{'TFA} q_{TFA1} - k_{22}^{'TFA} q_{TFA2} \\
-k_{21}^{'TSS} q_{TSS1} - k_{22}^{'TSS} q_{TSS2} \\
\vdots \\
\vdots \\
\vdots \\
\end{Bmatrix}\tag{16}
$$
### 3. 广义阻尼力 (Generalized Damping Forces)
当使用瑞利阻尼技术,假设阻尼与刚度成比例时,广义阻尼力 $F_r |_{\text{Damp}T}$ 表示为:
$$
F_r |_{\text{Damp}T} = \begin{cases}
- \frac{\zeta_1^{TFA} k_{11}^{'TFA}}{\pi f_1^{'TFA}} \dot{q}_{TFA1} - \frac{\zeta_2^{TFA} k_{12}^{'TFA}}{\pi f_2^{'TFA}} \dot{q}_{TFA2} & \text{for } r=TFA1 \\
- \frac{\zeta_1^{TSS} k_{11}^{'TSS}}{\pi f_1^{'TSS}} \dot{q}_{TSS1} - \frac{\zeta_2^{TSS} k_{12}^{'TSS}}{\pi f_2^{'TSS}} \dot{q}_{TSS2} & \text{for } r=TSS1 \\
- \frac{\zeta_1^{TFA} k_{21}^{'TFA}}{\pi f_1^{'TFA}} \dot{q}_{TFA1} - \frac{\zeta_2^{TFA} k_{22}^{'TFA}}{\pi f_2^{'TFA}} \dot{q}_{TFA2} & \text{for } r=TFA2 \\
- \frac{\zeta_1^{TSS} k_{21}^{'TSS}}{\pi f_1^{'TSS}} \dot{q}_{TSS1} - \frac{\zeta_2^{TSS} k_{22}^{'TSS}}{\pi f_2^{'TSS}} \dot{q}_{TSS2} & \text{for } r=TSS2 \\
0 & \text{otherwise}
\end{cases}\tag{11}
$$
其中,$\zeta_{i}^{T F A}$ 和 $\zeta_{i}^{T S S}$ 分别表示塔架在前后向和侧向上的结构阻尼比,而 $f_{\ i}^{\,\prime T F A}$ 和 $f_{\ i}^{\prime T S S}$ 分别表示塔架在前后向和侧向上的固有频率,不考虑塔顶质量和重力软化效应。这些固有频率定义为:
$$
f_{\;\;i}^{\;\prime^{T F A}}=\frac{1}{2\pi}\sqrt{\frac{k_{\;i i}^{\prime^{T F A}}}{m_{\;i i}^{\prime^{T F A}}}}\;\;\;\;\;\mathrm{and}\;\;\;\;\;\;\;f_{\;i}^{\;\prime^{T S S}}=\frac{1}{2\pi}\sqrt{\frac{k_{\;i i}^{\prime T S S}}{m_{\;i i}^{\prime T S S}}}\tag{12}
$$
这里,$m_{\;i i}^{\;\prime T F A}$ 和 $m_{\ i i}^{\prime T S S}$ 分别表示在塔顶质量效应忽略的情况下,第 $i$ 阶模态在前后方向和左右方向上的广义质量:
$$
m_{\ i j}^{\prime^{T F A}}=\int_{0}^{T w r F l e x L}\mu^{T}\left(h\right)\phi_{i}^{T F A}\left(h\right)\phi_{j}^{T F A}\left(h\right)d h\quad\left(i,j=1,2\right)\tag{13}
$$
$$
m_{\it i j}^{\prime T S S}=\int_{0}^{T w r F l e x L}\mu^{T}\left(h\right)\phi_{i}^{T S S}\left(h\right)\phi_{j}^{T S S}\left(h\right)d h\quad\left(i,j=1,2\right)\tag{14}
$$
对于阻尼力,质量矩阵 $[C(q,t)]|_{\text{Damp}T}$ 为零,非线性惯性力项 $\{-f(\dot{q},q,t)\}|_{\text{Damp}T}$ 包含了阻尼力项:
$$
[C(q,t)]|_{\text{Damp}T} = 0\tag{17}
$$
$$
\{-f(\dot{q},q,t)\}|_{\text{Damp}T} = \begin{Bmatrix}
\vdots \\
\vdots \\
\vdots \\
- \frac{\zeta_1^{TFA} k_{11}^{'TFA}}{\pi f_1^{'TFA}} \dot{q}_{TFA1} - \frac{\zeta_2^{TFA} k_{12}^{'TFA}}{\pi f_2^{'TFA}} \dot{q}_{TFA2} \\
- \frac{\zeta_1^{TSS} k_{11}^{'TSS}}{\pi f_1^{'TSS}} \dot{q}_{TSS1} - \frac{\zeta_2^{TSS} k_{12}^{'TSS}}{\pi f_2^{'TSS}} \dot{q}_{TSS2} \\
- \frac{\zeta_1^{TFA} k_{21}^{'TFA}}{\pi f_1^{'TFA}} \dot{q}_{TFA1} - \frac{\zeta_2^{TFA} k_{22}^{'TFA}}{\pi f_2^{'TFA}} \dot{q}_{TFA2} \\
- \frac{\zeta_1^{TSS} k_{21}^{'TSS}}{\pi f_1^{'TSS}} \dot{q}_{TSS1} - \frac{\zeta_2^{TSS} k_{22}^{'TSS}}{\pi f_2^{'TSS}} \dot{q}_{TSS2} \\
\vdots \\
\vdots \\
\vdots
\end{Bmatrix}\tag{18}
$$
### 4. 广义重力 (Generalized Gravitational Forces)
广义重力 $F_r |_{\text{Grav}T}$ 考虑了塔架自身的重力以及偏航轴承的重力:
$$
F_r |_{\text{Grav}T} = \int_{0}^{\text{TwrFlexL}} \! {}^E \mathbf{v}_r^T(h) \cdot [-\mu^T(h) \mathbf{g}\mathbf{z}_2] \, dh + {}^E \mathbf{v}_r^O \cdot (-\text{YawBrMass} \cdot \mathbf{g}\mathbf{z}_2) \quad (r=3,4,...,10)\tag{19}
$$
其中,$\mathbf{g}$ 是重力加速度,$\mathbf{z}_2$ 是垂直方向的单位向量。
对于重力,质量矩阵 $[C(q,t)]|_{\text{Grav}T}$ 为零,非线性惯性力项 $\{-f(\dot{q},q,t)\}|_{\text{Grav}T}$ 包含了重力项:
$$
[C(q,t)]|_{\text{Grav}T} = 0\tag{20}
$$
$$
\{-f(\dot{q},q,t)\}|_{\text{Grav}T} (\text{Row}) = - \int_{0}^{\text{TwrFlexL}} \! \mu^T(h) g {}^E \mathbf{v}_{\text{Row}}^T(h) \cdot \mathbf{z}_2 \, dh - \text{YawBrMass} \cdot g {}^E \mathbf{v}_{\text{Row}}^O \cdot \mathbf{z}_2 \quad (Row=3,4,...,10)\tag{21}
$$
### 5. 广义气动力 (Generalized Aerodynamic Forces)
广义气动力 $F_r |_{\text{Aero}T}$ 是通过对塔架上每单位高度的气动力 $\mathbf{F}_{\text{Aero}T}^T(h)$ 和气动弯矩 $\mathbf{M}_{\text{Aero}T}^F(h)$ 进行积分得到的:
$$
F_r |_{\text{Aero}T} = \int_{0}^{\text{TwrFlexL}} \! \left[ {}^E \mathbf{v}_r^T(h) \cdot \mathbf{F}_{\text{Aero}T}^T(h) + {}^E \boldsymbol{\omega}_r^F(h) \cdot \mathbf{M}_{\text{Aero}T}^F(h) \right] dh \quad (r=1,2,...,10)\tag{22}
$$
其中,$F_{A e r o T}^{T}\left(h\right)$ 和 $M_{A e r o T}^{F}\left(h\right)$ 分别是施加在塔架上点 T 的每单位高度的气动力和气动弯矩。
对于气动力,质量矩阵 $[C(q,t)]|_{\text{Aero}T}$ 为零,非线性惯性力项 $\{-f(\dot{q},q,t)\}|_{\text{Aero}T}$ 包含了气动力项:
$$
[C(q,t)]|_{\text{Aero}T} = 0\tag{23}
$$
$$
\{-f(\dot{q},q,t)\}|_{\text{Aero}T} (\text{Row}) = \int_{0}^{\text{TwrFlexL}} \! \left[ {}^E \mathbf{v}_{\text{Row}}^T(h) \cdot \mathbf{F}_{\text{Aero}T}^T(h) + {}^E \boldsymbol{\omega}_{\text{Row}}^F(h) \cdot \mathbf{M}_{\text{Aero}T}^F(h) \right] dh \quad (Row=1,2,...,10)\tag{24}
$$
这些公式共同构成了基于凯恩方程原理的塔架动力学模型,通过广义力来描述塔架在各种载荷下的响应。
[Timestamp: 2026/01/09 15:21:18]
**user**: [[Tower]][[FillAugmat]]结合理论和代码,解释塔架部分是如何计算的
[Timestamp: 2026/01/12 11:25:11]
**ai**: 好的,我们来结合[[Tower]]笔记中的理论和[[FillAugmat]]子程序中的代码,解释塔架部分是如何计算的。
在OpenFAST动力学模型中塔架被视为一个柔性体其运动通过广义坐标来描述。[[Tower]]笔记详细推导了塔架的广义惯性力、弹性力、阻尼力、重力和气动力。[[FillAugmat]]子程序则负责将这些力项和质量项组装到增广矩阵 `AugMat` 中,该矩阵用于求解系统的动力学方程。
### 理论回顾 (来自 [[Tower]] 笔记)
塔架的动力学方程可以表示为广义质量矩阵 $[C(\mathbf{q},t)]$ 乘以广义加速度 $\ddot{\mathbf{q}}$,加上广义力 $\{-f(\dot{q},q,t)\}$ 等于零的形式。
1. **广义惯性力 ($F_r^* \Big|_T$)**:
这是由塔架分布式质量和偏航轴承质量引起的。
* **质量矩阵项**
$$
[C(\mathbf{q},t)]_T (Row, Col) = \int_0^{TwrFlexL} \mu^T (h) {}^E \mathbf{v}_{Row}^T (h) \cdot {}^E \mathbf{v}_{Col}^T (h)dh - YawBrMass {}^E \mathbf{v}_{Row}^O \cdot {}^E \mathbf{v}_{Col}^O \quad (Row, Col = 1, 2, \ldots, 10)\tag{3}
$$
其中 $\mu^T(h)$ 是调整后的塔架质量密度,${}^E \mathbf{v}_{Row}^T (h)$ 和 ${}^E \mathbf{v}_{Col}^T (h)$ 是塔架上点的广义速度,${}^E \mathbf{v}_{Row}^O$ 和 ${}^E \mathbf{v}_{Col}^O$ 是偏航轴承处的广义速度。
* **非线性惯性力项**
$$
\left\{ - f(\dot{q},q,t) \right\} \Big|_T (Row) = - \int_0^{TwrFlexL} \mu^T (h) {}^E \mathbf{v}_{Row}^T (h) \cdot \left( \sum_{i=4}^{10} \frac{d}{dt} \left[ {}^E \mathbf{v}_i^T (h) \right] \dot{q}_i \right) dh - YawBrMass {}^E \mathbf{v}_{Row}^O \cdot \left[ \sum_{i=4}^{10} \frac{d}{dt} \left( {}^E \mathbf{v}_i^O \right) \dot{q}_i \right] \quad (Row = 1,2,\ldots,10)\tag{4}
$$
这部分包含了科里奥利力和离心力等速度相关的非线性项。
2. **广义弹性力 ($F_{r \Big| ElasticT}$)**:
由塔架的弹性变形引起,与广义坐标 $q_r$ 相关。
$$
F_{r \Big| ElasticT} = - \frac{\partial V'^T}{\partial q_r} \quad (r = 1,2,\ldots,22)\tag{5}
$$
具体形式为:
$$
\{-f(\dot{q},q,t)\}|_{\text{Elastic}T} = \begin{Bmatrix}
\vdots \\
-k_{11}^{'TFA} q_{TFA1} - k_{12}^{'TFA} q_{TFA2} \\
-k_{11}^{'TSS} q_{TSS1} - k_{12}^{'TSS} q_{TSS2} \\
-k_{21}^{'TFA} q_{TFA1} - k_{22}^{'TFA} q_{TFA2} \\
-k_{21}^{'TSS} q_{TSS1} - k_{22}^{'TSS} q_{TSS2} \\
\vdots
\end{Bmatrix}\tag{16}
$$
其中 $k_{ij}^{'TFA}$ 和 $k_{ij}^{'TSS}$ 是广义刚度系数。
3. **广义阻尼力 ($F_r |_{\text{Damp}T}$)**:
假设阻尼与刚度成比例(瑞利阻尼),与广义速度 $\dot{q}_r$ 相关。
$$
F_r |_{\text{Damp}T} = \begin{cases}
- \frac{\zeta_1^{TFA} k_{11}^{'TFA}}{\pi f_1^{'TFA}} \dot{q}_{TFA1} - \frac{\zeta_2^{TFA} k_{12}^{'TFA}}{\pi f_2^{'TFA}} \dot{q}_{TFA2} & \text{for } r=TFA1 \\
\vdots
\end{cases}\tag{11}
$$
具体形式为:
$$
\{-f(\dot{q},q,t)\}|_{\text{Damp}T} = \begin{Bmatrix}
\vdots \\
- \frac{\zeta_1^{TFA} k_{11}^{'TFA}}{\pi f_1^{'TFA}} \dot{q}_{TFA1} - \frac{\zeta_2^{TFA} k_{12}^{'TFA}}{\pi f_2^{'TFA}} \dot{q}_{TFA2} \\
\vdots
\end{Bmatrix}\tag{18}
$$
4. **广义重力 ($F_r |_{\text{Grav}T}$)**:
由塔架自身质量和偏航轴承质量在重力场中的作用引起。
$$
F_r |_{\text{Grav}T} = \int_{0}^{\text{TwrFlexL}} \! {}^E \mathbf{v}_r^T(h) \cdot [-\mu^T(h) \mathbf{g}\mathbf{z}_2] \, dh + {}^E \mathbf{v}_r^O \cdot (-\text{YawBrMass} \cdot \mathbf{g}\mathbf{z}_2) \quad (r=3,4,...,10)\tag{19}
$$
对应的非线性惯性力项为:
$$
\{-f(\dot{q},q,t)\}|_{\text{Grav}T} (\text{Row}) = - \int_{0}^{\text{TwrFlexL}} \! \mu^T(h) g {}^E \mathbf{v}_{\text{Row}}^T(h) \cdot \mathbf{z}_2 \, dh - \text{YawBrMass} \cdot g {}^E \mathbf{v}_{\text{Row}}^O \cdot \mathbf{z}_2 \quad (Row=3,4,...,10)\tag{21}
$$
5. **广义气动力 ($F_r |_{\text{Aero}T}$)**:
由作用在塔架上的气动力和气动弯矩引起。
$$
F_r |_{\text{Aero}T} = \int_{0}^{\text{TwrFlexL}} \! \left[ {}^E \mathbf{v}_r^T(h) \cdot \mathbf{F}_{\text{Aero}T}^T(h) + {}^E \boldsymbol{\omega}_r^F(h) \cdot \mathbf{M}_{\text{Aero}T}^F(h) \right] dh \quad (r=1,2,...,10)\tag{22}
$$
对应的非线性惯性力项为:
$$
\{-f(\dot{q},q,t)\}|_{\text{Aero}T} (\text{Row}) = \int_{0}^{\text{TwrFlexL}} \! \left[ {}^E \mathbf{v}_{\text{Row}}^T(h) \cdot \mathbf{F}_{\text{Aero}T}^T(h) + {}^E \boldsymbol{\omega}_{\text{Row}}^F(h) \cdot \mathbf{M}_{\text{Aero}T}^F(h) \right] dh \quad (Row=1,2,...,10)\tag{24}
$$
### 代码实现 (来自 [[FillAugmat]] 子程序)
`FillAugMat` 子程序的目标是构建增广矩阵 `AugMat`。这个矩阵的结构通常是左上角为质量矩阵 $[M]$,右侧为力向量 $[F]$,即 `[M | F]`。在OpenFAST中它实际上是 `[C(q,t) | -f(qd,q,t)]` 的形式,其中 `C(q,t)` 是广义质量矩阵,`-f(qd,q,t)` 是广义力向量。
我们重点关注塔架相关的计算部分:
1. **初始化 `AugMat`**:
```fortran
AugMat = 0.0
```
在开始计算之前,`AugMat` 被初始化为零。
2. **偏航轴承质量效应 (Yaw Bearing Mass Effects)**:
这部分对应于[[Tower]]笔记中公式 (3) 和 (4) 中与 `YawBrMass` 相关的项。
```fortran
DO L = 1,p%DOFs%NPTTE ! Loop through all active (enabled) tower DOFs that contribute to the QD2T-related linear accelerations of the yaw bearing (point O)
DO I = L,p%DOFs%NPTTE ! Loop through all active (enabled) tower DOFs greater than or equal to L
AugMat(p%DOFs%PTTE(I),p%DOFs%PTTE(L)) = p%YawBrMass*DOT_PRODUCT( RtHSdat%PLinVelEO(p%DOFs%PTTE(I),0,:), & ! [C(q,t)]T of YawBrMass
RtHSdat%PLinVelEO(p%DOFs%PTTE(L),0,:) )
ENDDO ! I - All active (enabled) tower DOFs greater than or equal to L
ENDDO ! L - All active (enabled) tower DOFs that contribute to the QD2T-related linear accelerations of the yaw bearing (point O)
TmpVec1 = -p%YawBrMass*( p%Gravity*CoordSys%z2 + RtHSdat%LinAccEOt ) ! The portion of FrcT0Trbt associated with the YawBrMass
DO I = 1,p%DOFs%NPTTE ! Loop through all active (enabled) tower DOFs that contribute to the QD2T-related linear accelerations of the yaw bearing (point O)
AugMat(p%DOFs%PTTE(I), p%NAug) = DOT_PRODUCT( RtHSdat%PLinVelEO(p%DOFs%PTTE(I),0,:), & ! {-f(qd,q,t)}T + {-f(qd,q,t)}GravT of YawBrMass
TmpVec1 ) ! NOTE: TmpVec1 is still the portion of FrcT0Trbt associated with YawBrMass
ENDDO ! I - All active (enabled) tower DOFs that contribute to the QD2T-related linear accelerations of the yaw bearing (point O)
```
* `p%DOFs%NPTTE` 是塔架自由度的数量。
* `p%YawBrMass` 是偏航轴承质量。
* `RtHSdat%PLinVelEO` 是偏航轴承点 O 的广义速度偏导数,用于计算质量矩阵项。
* `RtHSdat%LinAccEOt` 是偏航轴承点 O 的线性加速度,用于计算非线性惯性力项(包括重力)。
* `p%NAug` 是增广矩阵的最后一列,用于存储力向量。
* `TmpVec1` 包含了偏航轴承的重力 (`p%Gravity*CoordSys%z2`) 和非线性惯性力 (`RtHSdat%LinAccEOt`)。
3. **塔架分布式质量、重力、气动力和水动力效应**:
这部分对应于[[Tower]]笔记中公式 (3), (4), (19), (21), (22), (24) 中与塔架分布式质量相关的积分项。
```fortran
DO J = 1,p%TwrNodes
! ... (计算质量矩阵项)
DO L = 1,p%DOFs%NPTTE
DO I = L,p%DOFs%NPTTE
AugMat(p%DOFs%PTTE(I),p%DOFs%PTTE(L)) = AugMat(p%DOFs%PTTE(I),p%DOFs%PTTE(L)) &
+ p%TElmntMass(J) *DOT_PRODUCT( RtHSdat%PLinVelET(J,p%DOFs%PTTE(I),0,:), &
RtHSdat%PLinVelET(J,p%DOFs%PTTE(L),0,:) ) & ! [C(q,t)]T + [C(q,t)]HydroT
- abs(p%DHNodes(J))*DOT_PRODUCT( RtHSdat%PLinVelET(J,p%DOFs%PTTE(I),0,:), &
RtHSdat%PFTHydro (:,J,p%DOFs%PTTE(L) ) ) &
- abs(p%DHNodes(J))*DOT_PRODUCT( RtHSdat%PAngVelEF(J,p%DOFs%PTTE(I),0,:), &
RtHSdat%PMFHydro (:,J,p%DOFs%PTTE(L) ) )
ENDDO
ENDDO
! ... (计算力向量项)
TmpVec1 = ( RtHSdat%FTHydrot(:,J) )*abs(p%DHNodes(J)) &
- p%TElmntMass(J)*( p%Gravity*CoordSys%z2 + RtHSdat%LinAccETt(:,J) ) ! The portion of FrcT0Trbt associated with tower element J
TmpVec3 = ( RtHSdat%MFHydrot(:,J) )*abs(p%DHNodes(J)) ! The external moment applied to tower element J
DO I = 1,p%DOFs%NPTTE
AugMat(p%DOFs%PTTE(I), p%NAug) = AugMat(p%DOFs%PTTE(I), p%NAug) & ! {-f(qd,q,t)}T + {-f(qd,q,t)}GravT + {-f(qd,q,t)}AeroT + {-f(qd,q,t)}HydroT
+ DOT_PRODUCT( RtHSdat%PLinVelET(J,p%DOFs%PTTE(I),0,:), TmpVec1 ) & ! NOTE: TmpVec1 is still the portion of FrcT0Trbt associated with tower element J
+ DOT_PRODUCT( RtHSdat%PAngVelEF(J,p%DOFs%PTTE(I),0,:), TmpVec3 )
ENDDO
ENDDO
```
* `p%TwrNodes` 是塔架离散化的节点数量。
* `p%TElmntMass(J)` 是第 `J` 个塔架单元的质量。
* `RtHSdat%PLinVelET(J,...)` 和 `RtHSdat%PAngVelEF(J,...)` 是塔架单元 `J` 的广义速度偏导数,用于计算质量矩阵项。
* `RtHSdat%FTHydrot(:,J)` 和 `RtHSdat%MFHydrot(:,J)` 是作用在塔架单元 `J` 上的水动力和水动弯矩。
* `RtHSdat%LinAccETt(:,J)` 是塔架单元 `J` 的线性加速度,用于计算非线性惯性力项(包括重力)。
* `TmpVec1` 包含了塔架单元的重力、非线性惯性力以及水动力。
* `TmpVec3` 包含了水动弯矩。
* 这里还包含了水动力学项 `[C(q,t)]HydroT` 和 `{-f(qd,q,t)}HydroT`,这在[[Tower]]笔记中没有直接列出但在OpenFAST中是塔架受力的一部分。
4. **塔架弹性力和阻尼力**:
这部分对应于[[Tower]]笔记中公式 (16) 和 (18) 中的弹性力和阻尼力项。
```fortran
IF ( p%DOF_Flag(DOF_TFA1) ) THEN
AugMat( DOF_TFA1,p%NAug) = AugMat(DOF_TFA1,p%NAug) &
- p%KTFA(1,1)*x%QT( DOF_TFA1) - p%KTFA(1,2)*x%QT( DOF_TFA2) & !
- p%CTFA(1,1)*x%QDT(DOF_TFA1) - p%CTFA(1,2)*x%QDT(DOF_TFA2)
ENDIF
IF ( p%DOF_Flag(DOF_TSS1) ) THEN
AugMat( DOF_TSS1,p%NAug) = AugMat(DOF_TSS1,p%NAug) &
- p%KTSS(1,1)*x%QT( DOF_TSS1) - p%KTSS(1,2)*x%QT( DOF_TSS2) & ! {-f(qd,q,t)}ElasticT + {-f(qd,q,t)}DampT
- p%CTSS(1,1)*x%QDT(DOF_TSS1) - p%CTSS(1,2)*x%QDT(DOF_TSS2)
ENDIF
IF ( p%DOF_Flag(DOF_TFA2) ) THEN
AugMat( DOF_TFA2,p%NAug) = AugMat(DOF_TFA2,p%NAug) &
- p%KTFA(2,1)*x%QT( DOF_TFA1) - p%KTFA(2,2)*x%QT( DOF_TFA2) & !
- p%CTFA(2,1)*x%QDT(DOF_TFA1) - p%CTFA(2,2)*x%QDT(DOF_TFA2)
ENDIF
IF ( p%DOF_Flag(DOF_TSS2) ) THEN
AugMat( DOF_TSS2,p%NAug) = AugMat(DOF_TSS2,p%NAug) &
- p%KTSS(2,1)*x%QT( DOF_TSS1) - p%KTSS(2,2)*x%QT( DOF_TSS2) & !
- p%CTSS(2,1)*x%QDT(DOF_TSS1) - p%CTSS(2,2)*x%QDT(DOF_TSS2)
ENDIF
```
* `p%DOF_Flag(DOF_TFA1)` 等检查塔架前后 (TFA) 和侧向 (TSS) 模态的自由度是否启用。
* `p%KTFA`, `p%KTSS` 是塔架的广义刚度矩阵,对应于[[Tower]]笔记中的 $k_{ij}^{'TFA}$ 和 $k_{ij}^{'TSS}$。
* `p%CTFA`, `p%CTSS` 是塔架的广义阻尼矩阵,对应于[[Tower]]笔记中阻尼力公式中的系数。
* `x%QT` 是广义坐标 $q$`x%QDT` 是广义速度 $\dot{q}$。
* 这些项直接添加到 `AugMat` 的力向量列 (`p%NAug`) 中。
5. **其他自由度与塔架的耦合**:
在 `FillAugMat` 的后续部分,还有许多 `IF ( p%DOF_Flag (...) ) THEN ... ENDIF` 块,它们处理不同自由度(如平台运动 DOF_Sg, DOF_Sw, DOF_Hv, DOF_R, DOF_P, DOF_Y以及偏航 DOF_Yaw 等)与塔架的耦合。这些耦合项通过 `DOT_PRODUCT` 广义速度偏导数和广义力/力矩偏导数来计算,并添加到 `AugMat` 中。例如:
```fortran
IF ( p%DOF_Flag (DOF_TFA1) ) THEN
DO I = p%DOFs%Diag(DOF_TFA1),p%DOFs%NActvDOF ! Loop through all active (enabled) DOFs on or below the diagonal
AugMat(p%DOFs%SrtPS(I),DOF_TFA1) = AugMat(p%DOFs%SrtPS(I),DOF_TFA1) &
- DOT_PRODUCT( RtHSdat%PLinVelEO(DOF_TFA1,0,:), &
RtHSdat%PFrcONcRt(:,p%DOFs%SrtPS(I)) ) & ! [C(q,t)]N + [C(q,t)]R + [C(q,t)]G + [C(q,t)]H + [C(q,t)]B + [C(q,t)]A
- DOT_PRODUCT( RtHSdat%PAngVelEB(DOF_TFA1,0,:), &
RtHSdat%PMomBNcRt(:,p%DOFs%SrtPS(I)) )
ENDDO
! ... (力向量项)
ENDIF
```
这部分代码计算了塔架自由度 (DOF_TFA1) 与其他自由度之间的耦合质量项和力项。`RtHSdat%PLinVelEO` 和 `RtHSdat%PAngVelEB` 是不同参考点O点B点的广义速度偏导数`RtHSdat%PFrcONcRt` 和 `RtHSdat%PMomBNcRt` 是广义力/力矩的偏导数。
6. **对称性填充**:
```fortran
DO L = 2,p%DOFs%NActvDOF ! Loop through all active (enabled) DOFs above the diagonal (columns)
DO I = 1,L-1 ! Loop through all active (enabled) DOFs above the diagonal (rows)
AugMat(p%DOFs%SrtPS(I),p%DOFs%SrtPS(L)) = AugMat(p%DOFs%SrtPS(L),p%DOFs%SrtPS(I))
ENDDO ! I - All active (enabled) DOFs above the diagonal (rows)
ENDDO ! L - All active (enabled) DOFs above the diagonal (columns)
```
由于质量矩阵在添加齿轮箱摩擦项之前是(或近似)对称的,这部分代码通过镜像对角线以下的元素来填充对角线以上的元素,从而提高计算效率。
### 总结
[[Tower]]笔记提供了塔架动力学建模的理论基础,通过凯恩方程推导了塔架在各种载荷下的广义力表达式。这些表达式包含了塔架的惯性、弹性、阻尼、重力和气动特性。
[[FillAugmat]]子程序则将这些理论公式转化为实际的数值计算。它通过遍历塔架的离散化单元和自由度,计算出对应的广义质量矩阵项和广义力向量项,并将它们组装到增广矩阵 `AugMat` 中。这个过程涉及对广义速度偏导数、广义加速度、质量密度、刚度、阻尼系数以及外部载荷(如重力、气动力、水动力)的数值积分和点积运算。最终形成的 `AugMat` 矩阵是求解整个风力机系统动力学方程的关键输入。
[Timestamp: 2026/01/12 11:25:40]
**user**: [[Tower]][[CalculateForcesMoments]]结合理论和代码,解释塔架部分是如何计算的
[Timestamp: 2026/01/12 16:16:07]
**ai**: 好的,我们来结合[[Tower]]笔记中的理论和[[CalculateForcesMoments]]子程序中的代码,解释塔架部分是如何计算的。
`CalculateForcesMoments` 子程序的主要目的是计算风力机各个部件(包括塔架)上的力和力矩,并将这些结果存储在 `RtHSdat` 结构体中。这些力和力矩包括广义惯性力、弹性力、阻尼力、重力、气动力和水动力等。这些计算结果随后会被 `FillAugmat` 子程序用来构建系统的增广矩阵。
### 理论回顾 (来自 [[Tower]] 笔记)
[[Tower]]笔记详细推导了塔架的广义惯性力、弹性力、阻尼力、重力和气动力。这些力通常表示为对广义坐标或广义速度的函数,并且在动力学方程中作为力向量的一部分。
* **广义惯性力 ($F_r^* \Big|_T$)**: 包含质量项和非线性惯性力项。在 `CalculateForcesMoments` 中,主要计算的是非线性惯性力项,即与加速度无关的速度相关项。
* 非线性惯性力项:
$$
\left\{ - f(\dot{q},q,t) \right\} \Big|_T (Row) = - \int_0^{TwrFlexL} \mu^T (h) {}^E \mathbf{v}_{Row}^T (h) \cdot \left( \sum_{i=4}^{10} \frac{d}{dt} \left[ {}^E \mathbf{v}_i^T (h) \right] \dot{q}_i \right) dh - YawBrMass {}^E \mathbf{v}_{Row}^O \cdot \left[ \sum_{i=4}^{10} \frac{d}{dt} \left( {}^E \mathbf{v}_i^O \right) \dot{q}_i \right] \quad (Row = 1,2,\ldots,10)\tag{4}
$$
* **广义弹性力 ($F_{r \Big| ElasticT}$)**: 与广义坐标 $q_r$ 相关。
$$
\{-f(\dot{q},q,t)\}|_{\text{Elastic}T} = \begin{Bmatrix}
\vdots \\
-k_{11}^{'TFA} q_{TFA1} - k_{12}^{'TFA} q_{TFA2} \\
\vdots
\end{Bmatrix}\tag{16}
$$
* **广义阻尼力 ($F_r |_{\text{Damp}T}$)**: 与广义速度 $\dot{q}_r$ 相关。
$$
\{-f(\dot{q},q,t)\}|_{\text{Damp}T} = \begin{Bmatrix}
\vdots \\
- \frac{\zeta_1^{TFA} k_{11}^{'TFA}}{\pi f_1^{'TFA}} \dot{q}_{TFA1} - \frac{\zeta_2^{TFA} k_{12}^{'TFA}}{\pi f_2^{'TFA}} \dot{q}_{TFA2} \\
\vdots
\end{Bmatrix}\tag{18}
$$
* **广义重力 ($F_r |_{\text{Grav}T}$)**:
$$
\{-f(\dot{q},q,t)\}|_{\text{Grav}T} (\text{Row}) = - \int_{0}^{\text{TwrFlexL}} \! \mu^T(h) g {}^E \mathbf{v}_{\text{Row}}^T(h) \cdot \mathbf{z}_2 \, dh - \text{YawBrMass} \cdot g {}^E \mathbf{v}_{\text{Row}}^O \cdot \mathbf{z}_2 \quad (Row=3,4,...,10)\tag{21}
$$
* **广义气动力 ($F_r |_{\text{Aero}T}$)**:
$$
\{-f(\dot{q},q,t)\}|_{\text{Aero}T} (\text{Row}) = \int_{0}^{\text{TwrFlexL}} \! \left[ {}^E \mathbf{v}_{\text{Row}}^T(h) \cdot \mathbf{F}_{\text{Aero}T}^T(h) + {}^E \boldsymbol{\omega}_{\text{Row}}^F(h) \cdot \mathbf{M}_{\text{Aero}T}^F(h) \right] dh \quad (Row=1,2,...,10)\tag{24}
$$
### 代码实现 (来自 [[CalculateForcesMoments]] 子程序)
`CalculateForcesMoments` 子程序计算并存储了各种“部分力”和“总力”,这些力是用于后续组装增广矩阵的中间结果。对于塔架部分,主要涉及以下几个关键计算:
1. **塔架单元上的水动力和水动弯矩 (PFTHydro, PMFHydro, FTHydrot, MFHydrot)**:
这部分计算了作用在塔架每个离散化单元上的水动力和水动弯矩。这些力不仅包括水动力学贡献,还可能包括基础刚度、阻尼或系泊线恢复力等。
* **理论**: 这部分在[[Tower]]笔记中没有直接的公式但在OpenFAST中水动力学是塔架受力的重要组成部分尤其对于浮式风力机。它通常通过附加质量、阻尼和恢复力矩阵来建模。
* **代码**:
```fortran
DO J=1,p%TwrNodes
RtHSdat%PFTHydro(:,J,:) = 0.0
RtHSdat%PMFHydro(:,J,:) = 0.0
DO I = 1,p%DOFs%NPTE ! Loop through all active (enabled) DOFs that contribute to the QD2T-related linear accelerations of the tower
! ... (计算 PFTHydro 和 PMFHydro涉及 u%TwrAddedMass 和广义速度偏导数)
END DO
END DO
DO J=1,p%TwrNodes
! ... (计算 FTHydrot 和 MFHydrot涉及 u%TowerPtLoads%Force/Moment, u%TwrAddedMass 和线/角加速度)
END DO
```
* `p%TwrNodes` 是塔架的节点数量。
* `u%TwrAddedMass` 是塔架的附加质量矩阵,用于计算水动力学惯性力。
* `RtHSdat%PLinVelET` 和 `RtHSdat%PAngVelEF` 是塔架单元的广义线速度和角速度的偏导数,用于计算与广义加速度相关的部分力。
* `RtHSdat%LinAccETt` 和 `RtHSdat%AngAccEFt` 是塔架单元的线加速度和角加速度,用于计算与广义速度相关的力(科里奥利力、离心力)以及重力。
* `u%TowerPtLoads%Force/Moment` 是外部施加在塔架上的点载荷。
* `PFTHydro` 和 `PMFHydro` 存储的是与广义加速度相关的部分力/力矩,用于构建质量矩阵。
* `FTHydrot` 和 `MFHydrot` 存储的是与广义加速度无关的力/力矩(包括重力、水动力阻尼、恢复力、外部载荷以及非线性惯性力),用于构建力向量。
2. **偏航轴承处的力和力矩 (PFrcT0Trb, PMomX0Trb, FrcT0Trbt, MomX0Trbt)**:
这部分计算了在塔架底部(点 T(0))的力和力矩,包括来自偏航轴承以上所有部件(转子、机舱、尾翼等)以及偏航轴承自身的贡献。
* **理论**: 这对应于[[Tower]]笔记中公式 (19) 和 (21) 中与 `YawBrMass` 相关的项,以及来自上部结构的传递载荷。
* **代码**:
```fortran
! ... (初始化 PFrcT0Trb 和 PMomX0Trb 为来自上部结构 (PFrcONcRt, PMomBNcRt) 的贡献)
RtHSdat%PFrcT0Trb = RtHSdat%PFrcONcRt
RtHSdat%PMomX0Trb = RtHSdat%PMomX0Trb
DO I = 1,p%DOFs%NPTE ! Loop through all active (enabled) DOFs that contribute to the QD2T-related linear accelerations of the yaw bearing center of mass (point O)
TmpVec1 = -p%YawBrMass*RtHSdat%PLinVelEO(p%DOFs%PTE(I),0,:) ! The portion of PFrcT0Trb associated with the YawBrMass
TmpVec2 = CROSS_PRODUCT( RtHSdat%rT0O, TmpVec1 ) ! The portion of PMomX0Trb associated with the YawBrMass
RtHSdat%PFrcT0Trb(:,p%DOFs%PTE(I) ) = RtHSdat%PFrcT0Trb(:,p%DOFs%PTE(I) ) + TmpVec1
RtHSdat%PMomX0Trb(:,p%DOFs%PTE(I) ) = RtHSdat%PMomX0Trb(:,p%DOFs%PTE(I) ) + TmpVec2
END DO
TmpVec1 = -p%YawBrMass*( p%Gravity*CoordSys%z2 + RtHSdat%LinAccEOt ) ! The portion of FrcT0Trbt associated with the YawBrMass
TmpVec2 = CROSS_PRODUCT( RtHSdat%rT0O, TmpVec1 ) ! The portion of MomX0Trbt associated with the YawBrMass
TmpVec3 = CROSS_PRODUCT( RtHSdat%rT0O, RtHSdat%FrcONcRtt ) ! The portion of MomX0Trbt associated with the FrcONcRtt
RtHSdat%FrcT0Trbt = RtHSdat%FrcONcRtt + TmpVec1
RtHSdat%MomX0Trbt = RtHSdat%MomBNcRtt + TmpVec2 + TmpVec3
DO J=1,p%TwrNodes
DO I = 1,p%DOFs%NPTE
TmpVec1 = RtHSdat%PFTHydro(:,J,p%DOFs%PTE(I))*abs(p%DHNodes(J)) - p%TElmntMass(J)*RtHSdat%PLinVelET(J,p%DOFs%PTE(I),0,:) ! The portion of PFrcT0Trb associated with tower element J
TmpVec2 = CROSS_PRODUCT( RtHSdat%rT0T(:,J), TmpVec1 ) ! The portion of PMomX0Trb associated with tower element J
TmpVec3 = RtHSdat%PMFHydro(:,J,p%DOFs%PTE(I))*abs(p%DHNodes(J)) ! The added moment applied at tower element J
RtHSdat%PFrcT0Trb(:,p%DOFs%PTE(I)) = RtHSdat%PFrcT0Trb(:,p%DOFs%PTE(I)) + TmpVec1
RtHSdat%PMomX0Trb(:,p%DOFs%PTE(I)) = RtHSdat%PMomX0Trb(:,p%DOFs%PTE(I)) + TmpVec2 + TmpVec3
END DO
TmpVec1 = ( RtHSdat%FTHydrot(:,J) )*abs(p%DHNodes(J)) &
- p%TElmntMass(J)*( p%Gravity*CoordSys%z2 + RtHSdat%LinAccETt(:,J) ) ! The portion of FrcT0Trbt associated with tower element J
TmpVec2 = CROSS_PRODUCT( RtHSdat%rT0T(:,J), TmpVec1 ) ! The portion of MomX0Trbt associated with tower element J
TmpVec3 = ( RtHSdat%MFHydrot(:,J) )*abs(p%DHNodes(J)) ! The external moment applied to tower element J
RtHSdat%FrcT0Trbt = RtHSdat%FrcT0Trbt + TmpVec1
RtHSdat%MomX0Trbt = RtHSdat%MomX0Trbt + TmpVec2 + TmpVec3
END DO
```
* `p%YawBrMass` 是偏航轴承质量。
* `RtHSdat%PLinVelEO` 是偏航轴承点 O 的广义线速度偏导数。
* `RtHSdat%LinAccEOt` 是偏航轴承点 O 的线性加速度。
* `RtHSdat%rT0O` 是从塔基 (T0) 到偏航轴承 (O) 的位置向量。
* `RtHSdat%rT0T` 是从塔基 (T0) 到塔架单元 (T) 的位置向量。
* `PFrcT0Trb` 和 `PMomX0Trb` 累加了来自偏航轴承和塔架单元的与广义加速度相关的部分力/力矩。
* `FrcT0Trbt` 和 `MomX0Trbt` 累加了来自偏航轴承和塔架单元的与广义加速度无关的力/力矩(包括重力、水动力、气动力等)。
3. **平台参考点处的力和力矩 (PFrcZAll, PMomXAll, FrcZAllt, MomXAllt)**:
这部分计算了在平台参考点 (Z) 处的总力和力矩,包括来自整个风力机(包括塔架)和平台自身的贡献。
* **理论**: 这是整个系统在平台参考点处的总广义力和力矩。
* **代码**:
```fortran
RtHSdat%PFrcZAll = RtHSdat%PFrcT0Trb
RtHSdat%PMomXAll = RtHSdat%PFrcT0Trb
DO I = 1,p%DOFs%NActvDOF
TmpVec = CROSS_PRODUCT( RtHSdat%rZT0, RtHSdat%PFrcT0Trb(:,p%DOFs%SrtPS(I)) )
RtHSdat%PMomXAll(:,p%DOFs%SrtPS(I)) = RtHSdat%PMomXAll(:,p%DOFs%SrtPS(I)) + TmpVec
END DO
DO I = 1,p%DOFs%NPYE
TmpVec1 = -p%PtfmMass*RtHSdat%PLinVelEY(p%DOFs%PYE(I),0,:)
TmpVec2 = CROSS_PRODUCT( RtHSdat%rZY , TmpVec1 )
RtHSdat%PFrcZAll(:,p%DOFs%PYE(I)) = RtHSdat%PFrcZAll(:,p%DOFs%PYE(I) ) + RtHSdat%PFZHydro(p%DOFs%PYE(I),:) + TmpVec1
RtHSdat%PMomXAll(:,p%DOFs%PYE(I)) = RtHSdat%PMomXAll(:,p%DOFs%PYE(I) ) + RtHSdat%PMXHydro(p%DOFs%PYE(I),:) + TmpVec2 &
- p%PtfmRIner*CoordSys%a1*DOT_PRODUCT( CoordSys%a1, RtHSdat%PAngVelEX(p%DOFs%PYE(I),0,:) ) &
- p%PtfmYIner*CoordSys%a2*DOT_PRODUCT( CoordSys%a2, RtHSdat%PAngVelEX(p%DOFs%PYE(I),0,:) ) &
- p%PtfmPIner*CoordSys%a3*DOT_PRODUCT( CoordSys%a3, RtHSdat%PAngVelEX(p%DOFs%PYE(I),0,:) )
END DO
TmpVec1 = -p%PtfmMass*( p%Gravity*CoordSys%z2 + RtHSdat%LinAccEYt )
TmpVec2 = CROSS_PRODUCT( RtHSdat%rZY , TmpVec1 )
TmpVec3 = CROSS_PRODUCT( RtHSdat%rZT0 , RtHSdat%FrcT0Trbt )
TmpVec = p%PtfmRIner*CoordSys%a1*DOT_PRODUCT( CoordSys%a1, RtHSdat%AngVelEX ) &
+ p%PtfmYIner*CoordSys%a2*DOT_PRODUCT( CoordSys%a2, RtHSdat%AngVelEX ) &
+ p%PtfmPIner*CoordSys%a3*DOT_PRODUCT( CoordSys%a3, RtHSdat%AngVelEX )
TmpVec4 = CROSS_PRODUCT( -RtHSdat%AngVelEX, TmpVec )
RtHSdat%FrcZAllt = RtHSdat%FrcT0Trbt + RtHSdat%FZHydrot + TmpVec1
RtHSdat%MomXAllt = RtHSdat%MomX0Trbt + RtHSdat%MXHydrot + TmpVec2 + TmpVec3 + TmpVec4
```
* `RtHSdat%rZT0` 是从平台参考点 (Z) 到塔基 (T0) 的位置向量。
* `p%PtfmMass` 是平台质量。
* `RtHSdat%PLinVelEY` 是平台质心 (Y) 的广义线速度偏导数。
* `RtHSdat%LinAccEYt` 是平台质心 (Y) 的线性加速度。
* `PFrcZAll` 和 `PMomXAll` 累加了来自塔架和平台自身的与广义加速度相关的部分力/力矩。
* `FrcZAllt` 和 `MomXAllt` 累加了来自塔架和平台自身的与广义加速度无关的力/力矩。
### 总结
`CalculateForcesMoments` 子程序是OpenFAST动力学计算中的一个核心部分它根据当前系统的状态广义坐标 `x%QT` 和广义速度 `x%QDT`)、参数 `p`、坐标系信息 `CoordSys` 和外部输入 `u`,计算出作用在风力机各个部件上的力和力矩。
对于塔架部分,它主要完成了以下工作:
1. **计算塔架单元上的水动力和水动弯矩**:这包括与广义加速度相关的部分(`PFTHydro`, `PMFHydro`)和与广义加速度无关的部分(`FTHydrot`, `MFHydrot`),后者包含了重力、水动力阻尼、恢复力以及外部点载荷和非线性惯性力。
2. **自下而上累加力矩**:从叶片、轮毂、机舱、尾翼等部件开始,逐步向上累加力和力矩,直到塔基 (T0) 和平台参考点 (Z)。这个过程利用了力矩的传递原理,将各个部件的力和力矩转换到共同的参考点。
3. **区分部分力/力矩和总力/力矩**
* 以 `PFrc...` 和 `PMom...` 开头的变量存储的是“部分力”和“部分力矩”,它们是广义加速度的系数,用于构建质量矩阵。
* 以 `Frc...t` 和 `Mom...t` 结尾的变量存储的是“总力”和“总力矩”,它们是与广义加速度无关的项,用于构建力向量。
虽然[[Tower]]笔记提供了塔架广义力的理论表达式,但`CalculateForcesMoments`子程序通过数值方法结合了OpenFAST中更全面的物理模型如水动力学、外部载荷等计算出这些力和力矩的具体数值为后续的动力学方程求解提供了必要的输入。
[Timestamp: 2026/01/12 16:16:33]
**user**: [[Tower]][[CalculateAngularPosVelPAcc]]结合理论和代码,解释塔架部分是如何计算的
[Timestamp: 2026/01/12 16:20:19]
**ai**: `CalculateAngularPosVelPAcc` 子程序在OpenFAST动力学模型中扮演着关键角色它负责计算风力机各个部件包括塔架的角位置、角速度以及部分角加速度。这些运动学量是后续计算广义力和组装动力学方程的基础。
### 理论回顾 (来自 [[Tower]] 笔记)
[[Tower]]笔记中,塔架被视为一个柔性体,其运动通过广义坐标 $q_i$ 及其时间导数 $\dot{q}_i$ 和 $\ddot{q}_i$ 来描述。塔架的柔性变形通过模态叠加原理来表示,即塔架上任意一点的位移、速度和加速度是刚体运动和各个柔性模态贡献的叠加。
* **广义速度和加速度**: 笔记中提到了塔架上点 T 的广义速度 ${}^E \mathbf{v}_r^T (h)$ 和广义加速度 ${}^E \mathbf{a}^T (h)$。这些向量包含了线性和角运动分量,并且与广义坐标及其导数相关。
* **非线性惯性力**: 公式 (4) 中包含了 $\frac{d}{dt} \left( {}^E \mathbf{v}_i^T (h) \right) \dot{q}_i$ 这样的项,这表示了科里奥利力和离心力等非线性惯性效应,它们依赖于广义速度和广义速度的偏导数。为了计算这些项,需要知道部分角速度及其时间导数。
### 代码实现 (来自 [[CalculateAngularPosVelPAcc]] 子程序)
`CalculateAngularPosVelPAcc` 子程序通过自下而上的方式(从平台到塔架,再到机舱、轮毂和叶片)计算各个部件的运动学量。我们重点关注塔架相关的计算部分。
在代码中,塔架的计算位于 `!............... ! tower values: !...............` 注释块下。
1. **塔架单元的部分角速度 (`RtHSdat%PAngVelEF (J, :,0,:)`)**:
这表示塔架上第 `J` 个节点(或单元,用 `F` 表示)在惯性坐标系 `E` 中的部分角速度。`0` 表示这是部分角速度本身0阶导数
```fortran
RtHSdat%PAngVelEF (J, :,0,:) = RtHSdat%PAngVelEX(:,0,:)
RtHSdat%PAngVelEF (J,DOF_TFA1,0,:) = -p%TwrFASF(1,J,1)*CoordSys%a3
RtHSdat%PAngVelEF (J,DOF_TSS1,0,:) = p%TwrSSSF(1,J,1)*CoordSys%a1
RtHSdat%PAngVelEF (J,DOF_TFA2,0,:) = -p%TwrFASF(2,J,1)*CoordSys%a3
RtHSdat%PAngVelEF (J,DOF_TSS2,0,:) = p%TwrSSSF(2,J,1)*CoordSys%a1
```
* `RtHSdat%PAngVelEX(:,0,:)`:首先,塔架的部分角速度继承了平台(`X`)的部分角速度。这反映了塔架的刚体运动部分。
* `p%TwrFASF` 和 `p%TwrSSSF`:这些是塔架在前后 (TFA) 和侧向 (TSS) 方向上的模态形状函数Shape Functions。`p%TwrFASF(1,J,1)` 表示第一个前后弯曲模态在第 `J` 个塔架节点处的形状函数值。
* `CoordSys%a3` 和 `CoordSys%a1`:这些是机舱坐标系中的单位向量,分别代表了塔架前后弯曲和侧向弯曲的方向。
* 通过将模态形状函数乘以相应的方向向量,并与平台的部分角速度叠加,计算出塔架每个柔性自由度对部分角速度的贡献。这直接体现了[[Tower]]笔记中柔性体运动的模态叠加原理。
2. **塔架单元的部分角速度的1阶导数 (`RtHSdat%PAngVelEF (J, :,1,:)`)**:
这表示塔架上第 `J` 个节点的部分角速度的时间导数1阶导数即部分角加速度。
```fortran
RtHSdat%PAngVelEF (J, :,1,:) = RtHSdat%PAngVelEX(:,1,:)
RtHSdat%PAngVelEF (J,DOF_TFA1,1,:) = CROSS_PRODUCT( RtHSdat%AngVelEX , RtHSdat%PAngVelEF(J,DOF_TFA1,0,:) )
RtHSdat%PAngVelEF (J,DOF_TSS1,1,:) = CROSS_PRODUCT( RtHSdat%AngVelEX , RtHSdat%PAngVelEF(J,DOF_TSS1,0,:) )
RtHSdat%PAngVelEF (J,DOF_TFA2,1,:) = CROSS_PRODUCT( RtHSdat%AngVelEX , RtHSdat%PAngVelEF(J,DOF_TFA2,0,:) )
RtHSdat%PAngVelEF (J,DOF_TSS2,1,:) = CROSS_PRODUCT( RtHSdat%AngVelEX , RtHSdat%PAngVelEF(J,DOF_TSS2,0,:) )
```
* `RtHSdat%PAngVelEX(:,1,:)`:首先,继承平台的部分角加速度。
* `CROSS_PRODUCT( RtHSdat%AngVelEX , RtHSdat%PAngVelEF(J,DOF_TFA1,0,:) )`:这部分计算了科里奥利项。根据运动学原理,一个向量在旋转坐标系中的时间导数包含一个相对导数项和一个科里奥利项($\boldsymbol{\omega} \times \mathbf{v}$)。在这里,`RtHSdat%AngVelEX` 是平台(惯性系中的刚体部分)的角速度,`RtHSdat%PAngVelEF(J,DOF_TFA1,0,:)` 是塔架柔性模态的部分角速度。这个叉乘项正是由于平台旋转引起的塔架柔性模态部分角速度的变化率。这与[[Tower]]笔记中公式 (4) 的 $\frac{d}{dt} \left( {}^E \mathbf{v}_i^T (h) \right)$ 项直接相关。
3. **塔架单元的总角速度 (`RtHSdat%AngVelEF (:,J)`)**:
这是塔架上第 `J` 个节点在惯性坐标系 `E` 中的总角速度。
```fortran
RtHSdat%AngVelEF (:,J) = RtHSdat%AngVelEX + x%QDT(DOF_TFA1)*RtHSdat%PAngVelEF(J,DOF_TFA1,0,:) &
+ x%QDT(DOF_TSS1)*RtHSdat%PAngVelEF(J,DOF_TSS1,0,:) &
+ x%QDT(DOF_TFA2)*RtHSdat%PAngVelEF(J,DOF_TFA2,0,:) &
+ x%QDT(DOF_TSS2)*RtHSdat%PAngVelEF(J,DOF_TSS2,0,:)
```
* `RtHSdat%AngVelEX`:平台在惯性系中的总角速度。
* `x%QDT`:广义速度向量,例如 `x%QDT(DOF_TFA1)` 是第一个塔架前后弯曲模态的广义速度。
* 通过将平台总角速度与每个塔架柔性模态的广义速度乘以其对应的部分角速度叠加,得到塔架节点的总角速度。这正是柔性体运动学中总速度的计算方式。
4. **塔架单元的相对角位置 (`RtHSdat%AngPosXF (:,J)`) 和总角位置 (`RtHSdat%AngPosEF (:,J)`)**:
* `RtHSdat%AngPosXF (:,J)`:表示塔架第 `J` 个节点相对于平台(或其刚体部分)的角位置。它通过将每个塔架柔性模态的广义位置 `x%QT` 乘以其对应的部分角速度(注意这里是部分角速度,而不是部分角位置,因为在小角度假设下,角位置的偏导数近似等于部分角速度)来计算。
* `RtHSdat%AngPosEF (:,J)`:塔架第 `J` 个节点在惯性系中的总角位置,是平台总角位置 `RtHSdat%AngPosEX` 和相对角位置 `RtHSdat%AngPosXF` 的叠加。
5. **塔架单元的部分角加速度 (`RtHSdat%AngAccEFt(:,J)`)**:
这表示塔架上第 `J` 个节点在惯性坐标系 `E` 中的部分角加速度,即不包含 $\ddot{q}_i$ 项的角加速度。这部分包含了科里奥利力和离心力等非线性惯性效应。
```fortran
RtHSdat%AngAccEFt(:,J) = RtHSdat%AngAccEXt + x%QDT(DOF_TFA1)*RtHSdat%PAngVelEF(J,DOF_TFA1,1,:) &
+ x%QDT(DOF_TSS1)*RtHSdat%PAngVelEF(J,DOF_TSS1,1,:) &
+ x%QDT(DOF_TFA2)*RtHSdat%PAngVelEF(J,DOF_TFA2,1,:) &
+ x%QDT(DOF_TSS2)*RtHSdat%PAngVelEF(J,DOF_TSS2,1,:)
```
* `RtHSdat%AngAccEXt`:平台在惯性系中的部分角加速度。
* 通过将每个塔架柔性模态的广义速度 `x%QDT` 乘以其对应的部分角速度的1阶导数 (`RtHSdat%PAngVelEF(J,DOF_TFA1,1,:)`),并与平台的部分角加速度叠加,得到塔架节点的总部分角加速度。这直接对应于[[Tower]]笔记中公式 (4) 的非线性惯性力项。
### 总结
`CalculateAngularPosVelPAcc` 子程序通过以下方式计算塔架的运动学量:
1. **模态叠加**: 利用塔架的模态形状函数 (`p%TwrFASF`, `p%TwrSSSF`) 和广义坐标 (`x%QT`, `x%QDT`) 来描述塔架的柔性变形。
2. **分层计算**: 从平台开始,逐级向上计算各个部件的运动学量,塔架的运动学量是在平台运动的基础上叠加其自身柔性变形的贡献。
3. **偏导数和时间导数**: 精确计算了部分角速度 (`PAngVelEF (J, :,0,:)`) 及其时间导数 (`PAngVelEF (J, :,1,:)`)。这些导数对于正确捕捉科里奥利力和离心力等非线性惯性效应至关重要,它们是[[Tower]]笔记中广义力公式(特别是惯性力部分)的直接输入。
4. **总运动学量**: 结合刚体运动和柔性变形的贡献,计算出塔架节点的总角速度 (`AngVelEF`) 和总角位置 (`AngPosEF`)。
这些计算结果(特别是部分角速度及其导数,以及总角速度和部分角加速度)被存储在 `RtHSdat` 结构体中,供后续的 `CalculateForcesMoments` 和 `FillAugmat` 等子程序使用,以构建完整的动力学方程。
[Timestamp: 2026/01/12 16:20:52]
**user**: [[Tower]][[CalculatePositions]]结合理论和代码,解释塔架部分是如何计算的
[Timestamp: 2026/01/12 16:25:27]
**ai**: 好的,我们来结合[[Tower]]笔记中的理论和[[CalculatePositions]]子程序中的代码,解释塔架部分是如何计算的。
`CalculatePositions` 子程序在OpenFAST动力学模型中负责计算风力机各个部件包括塔架在惯性坐标系中的位置向量。这些位置信息是后续计算速度、加速度以及广义力和力矩的基础。
### 理论回顾 (来自 [[Tower]] 笔记)
[[Tower]]笔记中,塔架被视为一个柔性体,其变形通过模态叠加原理来描述。塔架上任意一点的位移是刚体运动和各个柔性模态贡献的叠加。
* **广义坐标 ($q_i$)**: 笔记中提到了塔架的前后 (TFA) 和侧向 (TSS) 弯曲模态的广义坐标 $q_{TFA1}, q_{TFA2}, q_{TSS1}, q_{TSS2}$。这些广义坐标代表了塔架柔性变形的程度。
* **模态形状函数 ($\phi_i^{TFA}(h), \phi_i^{TSS}(h)$)**: 塔架的柔性变形通常通过模态形状函数来描述,这些函数定义了塔架沿其高度 $h$ 的变形模式。
* **轴向缩短效应 (Axial Shortening)**: 柔性体的弯曲变形会导致其轴向长度的微小缩短,这是一种非线性效应,通常通过二次项来近似。
### 代码实现 (来自 [[CalculatePositions]] 子程序)
`CalculatePositions` 子程序通过自下而上的方式(从平台到塔架,再到机舱、轮毂和叶片)计算各个部件的位置向量。我们重点关注塔架相关的计算部分。
1. **塔顶/底板的位置向量 (`RtHSdat%rZO`)**:
这部分计算了从平台参考点 (Z) 到塔顶/底板 (O) 的位置向量。这个向量包含了塔架的刚体高度以及由于塔架柔性变形引起的水平位移和轴向缩短。
```fortran
RtHSdat%rZO = ( x%QT(DOF_TFA1) + x%QT(DOF_TFA2) )*CoordSys%a1 & ! Position vector from platform reference (point Z) to tower-top / base plate (point O).
+ ( p%RefTwrHt - 0.5*( p%AxRedTFA(1,1,p%TTopNode)*x%QT(DOF_TFA1)*x%QT(DOF_TFA1) &
+ p%AxRedTFA(2,2,p%TTopNode)*x%QT(DOF_TFA2)*x%QT(DOF_TFA2) &
+ 2.0*p%AxRedTFA(1,2,p%TTopNode)*x%QT(DOF_TFA1)*x%QT(DOF_TFA2) &
+ p%AxRedTSS(1,1,p%TTopNode)*x%QT(DOF_TSS1)*x%QT(DOF_TSS1) &
+ p%AxRedTSS(2,2,p%TTopNode)*x%QT(DOF_TSS2)*x%QT(DOF_TSS2) &
+ 2.0*p%AxRedTSS(1,2,p%TTopNode)*x%QT(DOF_TSS1)*x%QT(DOF_TSS2) ) )*CoordSys%a2 &
+ ( x%QT(DOF_TSS1) + x%QT(DOF_TSS2) )*CoordSys%a3
```
* `x%QT(DOF_TFA1)` 和 `x%QT(DOF_TFA2)`:塔架前后弯曲的两个模态的广义坐标。它们乘以 `CoordSys%a1`(机舱坐标系中的 x 方向单位向量)表示塔顶在前后方向的位移。
* `x%QT(DOF_TSS1)` 和 `x%QT(DOF_TSS2)`:塔架侧向弯曲的两个模态的广义坐标。它们乘以 `CoordSys%a3`(机舱坐标系中的 z 方向单位向量在OpenFAST中通常表示侧向表示塔顶在侧向的位移。
* `p%RefTwrHt`:塔架的参考高度。
* `p%AxRedTFA` 和 `p%AxRedTSS`:这些是轴向缩短系数。当塔架弯曲时,其轴向长度会略微缩短。这部分通过广义坐标的二次项来近似,并乘以 `0.5`。这个缩短量从 `p%RefTwrHt` 中减去,表示塔顶在垂直方向(`CoordSys%a2`,机舱坐标系中的 y 方向单位向量,通常表示垂直)的实际高度。
* `p%TTopNode`:表示塔顶所在的节点索引。
2. **塔基到塔顶的位置向量 (`RtHSdat%rT0O`)**:
```fortran
RtHSdat%rT0O = RtHSdat%rZO - RtHSdat%rZT0 ! Position vector from the tower base (point T(0)) to tower-top / base plate (point O).
```
* `RtHSdat%rZT0` 是从平台参考点 (Z) 到塔基 (T(0)) 的位置向量,它是一个常数,表示塔架的刚体部分。
* `RtHSdat%rT0O` 是塔基到塔顶的相对位置向量,它包含了塔架的柔性变形。
3. **塔架单元的位置向量 (`RtHSdat%rT0T`, `RtHSdat%rZT`, `RtHSdat%rT`)**:
这部分计算了塔架每个离散化节点(或单元,用 `T` 表示)的位置。
```fortran
RtHSdat%rZT (:,0) = RtHSdat%rZT0
DO J = 1,p%TwrNodes ! Loop through the tower nodes / elements
! Calculate the position vector of the current node:
RtHSdat%rT0T(:,J) = ( p%TwrFASF(1,J,0)*x%QT(DOF_TFA1) + p%TwrFASF(2,J,0)*x%QT(DOF_TFA2) )*CoordSys%a1 & ! Position vector from base of flexible portion of tower (point T(0)) to current node (point T(J)).
+ ( p%HNodes(J) - 0.5*( p%AxRedTFA(1,1,J)*x%QT(DOF_TFA1)*x%QT(DOF_TFA1) &
+ p%AxRedTFA(2,2,J)*x%QT(DOF_TFA2)*x%QT(DOF_TFA2) &
+ 2.0*p%AxRedTFA(1,2,J)*x%QT(DOF_TFA1)*x%QT(DOF_TFA2) &
+ p%AxRedTSS(1,1,J)*x%QT(DOF_TSS1)*x%QT(DOF_TSS1) &
+ p%AxRedTSS(2,2,J)*x%QT(DOF_TSS2)*x%QT(DOF_TSS2) &
+ 2.0*p%AxRedTSS(1,2,J)*x%QT(DOF_TSS1)*x%QT(DOF_TSS2) ) )*CoordSys%a2 &
+ ( p%TwrSSSF(1,J,0)*x%QT(DOF_TSS1) + p%TwrSSSF(2,J,0)*x%QT(DOF_TSS2) )*CoordSys%a3
RtHSdat%rZT (:,J) = RtHSdat%rZT0 + RtHSdat%rT0T(:,J) ! Position vector from platform reference (point Z) to the current node (point T(HNodes(J)).
RtHSdat%rT(:,J) = RtHSdat%rZ + RtHSdat%rZT (:,J) ! Position vector from inertial frame origin to the current node (point T(HNodes(J)).
END DO
```
* `p%TwrNodes`:塔架的节点数量。
* `p%HNodes(J)`:第 `J` 个塔架节点在未变形状态下的高度。
* `RtHSdat%rT0T(:,J)`:从塔基 (T(0)) 到第 `J` 个塔架节点 (T(J)) 的相对位置向量。其计算方式与 `RtHSdat%rZO` 类似,使用了塔架模态形状函数 (`p%TwrFASF`, `p%TwrSSSF`) 和轴向缩短系数 (`p%AxRedTFA`, `p%AxRedTSS`),但这些参数是针对每个节点 `J` 进行评估的。
* `RtHSdat%rZT (:,J)`:从平台参考点 (Z) 到第 `J` 个塔架节点 (T(J)) 的相对位置向量,是 `RtHSdat%rZT0` 和 `RtHSdat%rT0T(:,J)` 的叠加。
* `RtHSdat%rT(:,J)`:从惯性坐标系原点到第 `J` 个塔架节点 (T(J)) 的绝对位置向量,是平台在惯性系中的位置 `RtHSdat%rZ` 和相对位置 `RtHSdat%rZT (:,J)` 的叠加。
### 总结
`CalculatePositions` 子程序通过以下方式计算塔架的位置:
1. **模态叠加**: 塔架的柔性变形(前后弯曲和侧向弯曲)通过其广义坐标 (`x%QT`) 和模态形状函数 (`p%TwrFASF`, `p%TwrSSSF`) 来表示。
2. **轴向缩短效应**: 考虑了塔架弯曲引起的轴向长度缩短这一非线性效应,通过广义坐标的二次项来近似。
3. **分层计算**: 从平台参考点开始,逐步计算塔顶和塔架各个节点在惯性坐标系中的位置。每个节点的绝对位置都是其上层部件的绝对位置加上自身相对于上层部件的相对位置。
4. **存储结果**: 计算出的所有位置向量都存储在 `RtHSdat` 结构体中,供后续的运动学(速度、加速度)和动力学(力和力矩)计算使用。
这些位置向量是OpenFAST中进行精确动力学分析的基础它们直接影响了广义速度、广义加速度的计算进而影响了广义惯性力、重力、气动力和水动力等各项力的计算。
[Timestamp: 2026/01/12 16:25:42]
**user**: [[Tower]][[Coeff]]结合理论和代码,解释塔架部分是如何计算的
[Timestamp: 2026/01/12 16:27:21]
**ai**: `Coeff` 子程序在OpenFAST动力学模型中负责计算风力机各个部件包括塔架的各种系数和属性。这些计算通常在模拟开始时进行一次以设置系统的基本物理参数。[[Tower]]笔记提供了塔架动力学建模的理论基础,而`Coeff`子程序则将这些理论概念转化为具体的数值计算。
### 理论回顾 (来自 [[Tower]] 笔记)
[[Tower]]笔记详细推导了塔架的广义惯性力、弹性力、阻尼力、重力和气动力。这些力的计算依赖于以下关键参数:
* **质量密度 ($\mu^T(h)$)**: 塔架沿高度的质量分布,用于计算广义质量。
$$
\mu^T (h) = AdjTwMa \cdot TMassDen(h)\tag{1}
$$
* **广义质量 ($m_{ij}^{'TFA}$, $m_{ij}^{'TSS}$)**: 塔架在前后 (TFA) 和侧向 (TSS) 方向上的广义质量,通过质量密度和模态形状函数积分得到。
$$
m_{\ i j}^{\prime^{T F A}}=\int_{0}^{T w r F l e x L}\mu^{T}\left(h\right)\phi_{i}^{T F A}\left(h\right)\phi_{j}^{T F A}\left(h\right)d h\quad\left(i,j=1,2\right)\tag{13}
$$
* **广义刚度 ($k_{ij}^{'TFA}$, $k_{ij}^{'TSS}$)**: 塔架在前后和侧向方向上的广义刚度,通过弯曲刚度 ($EI$) 和模态形状函数的二阶导数积分得到。
$$
k_{ij}^{'TFA} = \sqrt{FAStTunr(i) FAStTunr(j)} \int_0^{TwrFlexL} EI^{TFA}(h) \frac{d^2 \phi_i^{TFA}(h)}{dh^2} \frac{d^2 \phi_j^{TFA}(h)}{dh^2} dh \quad (i, j = 1,2)\tag{7}
$$
* **固有频率 ($f_{i}^{'TFA}$, $f_{i}^{\prime T S S}$)**: 塔架的固有频率,由广义刚度和广义质量决定。
$$
f_{\;\;i}^{\;\prime^{T F A}}=\frac{1}{2\pi}\sqrt{\frac{k_{\;i i}^{\prime^{T F A}}}{m_{\;i i}^{\prime^{T F A}}}}\tag{12}
$$
* **阻尼比 ($\zeta_{i}^{T F A}$, $\zeta_{i}^{T S S}$)**: 塔架的结构阻尼比,用于计算广义阻尼。
* **模态形状函数 ($\phi_i^{TFA}(h)$, $\phi_i^{TSS}(h)$)**: 描述塔架柔性变形的函数,及其一阶和二阶导数。
* **轴向缩短效应**: 塔架弯曲时引起的轴向长度缩短,这是一种非线性几何效应。
### 代码实现 (来自 [[Coeff]] 子程序)
`Coeff` 子程序通过数值积分和参数设置来计算上述理论参数。以下是塔架部分的关键计算:
1. **初始化塔架相关参数**:
```fortran
p%TwrMass = 0.0
p%KTFA = 0.0
p%KTSS = 0.0
KTFAGrav = 0.0
KTSSGrav = 0.0
```
在计算开始前,塔架的总质量、广义刚度(前后和侧向)以及重力去刚化项都被初始化为零。
2. **计算塔顶总质量 (`p%TwrTpMass`)**:
```fortran
p%TwrTpMass = p%RotMass + p%RFrlMass + p%BoomMass + p%TFinMass + p%NacMass + p%YawBrMass
```
这计算了塔架顶部所有部件(转子、变桨结构、尾翼、机舱、偏航轴承等)的总质量。这个总质量在计算塔架的广义质量和固有频率时非常重要,因为它作为塔顶的集中质量效应。
3. **塔架单元质量和质量累加 (`p%TElmntMass`, `p%TwrMass`, `TMssAbvNd`)**:
通过一个从塔顶向下遍历塔架节点的循环:
```fortran
DO J = p%TwrNodes,1,-1
p%TElmntMass(J) = p%MassT(J)*abs(p%DHNodes(J)) ! 塔架单元J的质量
p%TwrMass = p%TwrMass + p%TElmntMass(J) ! 累加塔架总质量
TMssAbvNd(J) = 0.5*p%TElmntMass(J) ! 塔架单元J的质量贡献
IF ( J == p%TwrNodes ) THEN
TMssAbvNd(J) = TMssAbvNd(J) + p%TwrTpMass ! 最上层单元加上塔顶总质量
ELSE
TMssAbvNd(J) = 0.5*p%TElmntMass(J+1) + TMssAbvNd(J) + TMssAbvNd(J+1) ! 累加其上方所有质量
ENDIF
ENDDO
```
* `p%TElmntMass(J)`: 计算每个塔架单元的质量,对应于理论中的 $\mu^T(h)dh$。
* `p%TwrMass`: 累加所有塔架单元的质量,得到柔性塔架的总质量。
* `TMssAbvNd(J)`: 计算在节点 `J` 以上所有塔架单元和塔顶部件的总质量。这对于计算重力去刚化效应至关重要,因为重力载荷取决于其上方结构的质量。
4. **初始化广义塔架质量 (考虑塔顶质量)**:
```fortran
DO I = 1,2
MTFA(I,I) = p%TwrTpMass
MTSS(I,I) = p%TwrTpMass
ENDDO
```
将塔顶总质量作为塔架广义质量矩阵对角线项的初始值,这反映了塔顶集中质量对塔架模态惯性的贡献。
5. **塔架模态形状函数 (`p%TwrFASF`, `p%TwrSSSF`)**:
通过一个从塔基向上遍历塔架节点的循环,使用 `SHP` 函数计算塔架每个节点处的前后 (FAM) 和侧向 (SSM) 模态形状函数及其一阶和二阶导数。
```fortran
DO J = 1,p%TwrNodes
p%TwrFASF(1,J,2) = SHP( p%HNodesNorm(J), p%TwrFlexL, InputFileData%TwFAM1Sh(:), 2, ErrStat, ErrMsg ) ! 二阶导数
p%TwrFASF(1,J,1) = SHP( p%HNodesNorm(J), p%TwrFlexL, InputFileData%TwFAM1Sh(:), 1, ErrStat, ErrMsg ) ! 一阶导数
p%TwrFASF(1,J,0) = SHP( p%HNodesNorm(J), p%TwrFlexL, InputFileData%TwFAM1Sh(:), 0, ErrStat, ErrMsg ) ! 零阶导数 (形状函数本身)
! ... (类似地计算 TwrFASF(2,J,...) 和 TwrSSSF(...,J,...) )
ENDDO
```
这些形状函数及其导数是计算广义质量、广义刚度和轴向缩短效应的基础,直接对应于理论中的 $\phi_i(h)$ 及其导数。
6. **广义质量积分 (`MTFA`, `MTSS`)**:
在遍历塔架节点的循环中,累加每个单元的质量贡献。
```fortran
DO I = 1,2
MTFA(I,I) = MTFA(I,I) + p%TElmntMass(J)*p%TwrFASF(I,J,0)**2
MTSS(I,I) = MTSS(I,I) + p%TElmntMass(J)*p%TwrSSSF(I,J,0)**2
ENDDO
```
这实现了理论中广义质量积分的数值近似,即 $\sum \mu^T(h) \phi_i(h)^2 \Delta h$。
7. **广义刚度积分 (`p%KTFA`, `p%KTSS`)**:
同样在循环中,累加每个单元的刚度贡献。
```fortran
ElStffFA = p%StiffTFA(J)*abs(p%DHNodes(J)) ! 塔架单元J的前后刚度
ElStffSS = p%StiffTSS(J)*abs(p%DHNodes(J)) ! 塔架单元J的侧向刚度
DO I = 1,2
DO L = 1,2
p%KTFA(I,L) = p%KTFA(I,L) + ElStffFA *p%TwrFASF(I,J,2)*p%TwrFASF(L,J,2)
p%KTSS(I,L) = p%KTSS(I,L) + ElStffSS *p%TwrSSSF(I,J,2)*p%TwrSSSF(L,J,2)
ENDDO
ENDDO
```
这实现了理论中广义刚度积分的数值近似,即 $\sum EI(h) \frac{d^2 \phi_i(h)}{dh^2} \frac{d^2 \phi_j(h)}{dh^2} \Delta h$。
8. **重力去刚化刚度 (`KTFAGrav`, `KTSSGrav`)**:
```fortran
ElmntStff = -TMssAbvNd(J)*abs(p%DHNodes(J))*p%Gravity ! 塔架单元J的重力刚度项
DO I = 1,2
KTFAGrav(I,I) = KTFAGrav(I,I) + ElmntStff*p%TwrFASF(I,J,1)**2
KTSSGrav(I,I) = KTSSGrav(I,I) + ElmntStff*p%TwrSSSF(I,J,1)**2
ENDDO
```
这计算了重力去刚化效应引起的刚度项,它与上方质量和模态形状函数的一阶导数(斜率)的平方有关。
9. **塔架轴向缩短形状函数 (`p%AxRedTFA`, `p%AxRedTSS`)**:
```fortran
DO I = 1,2
DO L = 1,2
AxRdTFA (I,L) = 0.5*p%DHNodes(J)*p%TwrFASF(I,J,1)*p%TwrFASF(L,J,1)
p%AxRedTFA(I,L,J) = AxRdTFA(I,L)
! ... (类似地计算 AxRedTSS)
ENDDO
ENDDO
```
这计算了塔架弯曲引起的轴向缩短系数,它与模态形状函数的一阶导数(斜率)的乘积有关。这些系数将在`CalculatePositions`子程序中用于计算塔架的实际位置。
10. **应用模态刚度调谐器**:
```fortran
DO I = 1,2
DO L = 1,2
p%KTFA(I,L) = SQRT( InputFileData%FAStTunr(I)*InputFileData%FAStTunr(L) )*p%KTFA(I,L)
p%KTSS(I,L) = SQRT( InputFileData%SSStTunr(I)*InputFileData%SSStTunr(L) )*p%KTSS(I,L)
ENDDO
ENDDO
```
这实现了[[Tower]]笔记中提到的刚度调谐功能,允许用户通过输入参数调整塔架的固有频率。
11. **计算塔架固有频率 (`p%FreqTFA`, `p%FreqTSS`)**:
```fortran
DO I = 1,2
p%FreqTFA(I,1) = Inv2Pi*SQRT( p%KTFA(I,I)/( MTFA(I,I) - p%TwrTpMass ) ) ! 不含重力去刚化和塔顶质量
p%FreqTFA(I,2) = Inv2Pi*SQRT( ( p%KTFA(I,I) + KTFAGrav(I,I) )/MTFA(I,I) ) ! 含重力去刚化和塔顶质量
! ... (类似地计算 FreqTSS)
ENDDO
```
这直接实现了理论中的固有频率公式 $f = \frac{1}{2\pi}\sqrt{\frac{k}{m}}$,并考虑了不同情况下(是否包含重力去刚化和塔顶质量)的频率。
12. **计算广义阻尼 (`p%CTFA`, `p%CTSS`)**:
```fortran
DO I = 1,2
DO L = 1,2
p%CTFA(I,L) = ( 0.01*InputFileData%TwrFADmp(L) )*p%KTFA(I,L)/( Pi*p%FreqTFA(L,1) )
p%CTSS(I,L) = ( 0.01*InputFileData%TwrSSDmp(L) )*p%KTSS(I,L)/( Pi*p%FreqTSS(L,1) )
ENDDO
ENDDO
```
这根据瑞利阻尼假设(阻尼与刚度成比例)计算广义阻尼系数,使用了输入的阻尼比和计算出的固有频率。这对应于[[Tower]]笔记中广义阻尼力公式的系数。
13. **计算塔架形状函数和轴向缩短函数在塔顶的值**:
这部分与前面的循环类似,但专门针对塔顶节点,确保塔顶的形状函数和轴向缩短值被正确计算。
14. **计算总风力机质量 (`p%TurbMass`)**:
```fortran
p%TurbMass = p%TwrTpMass + p%TwrMass
```
将塔顶总质量和柔性塔架总质量相加,得到整个风力机的总质量。
### 总结
`Coeff` 子程序是OpenFAST中进行参数预处理的核心它将用户在输入文件中定义的物理特性如质量分布、刚度、模态形状函数等转化为动力学模型所需的各种系数。对于塔架部分
* **数值积分**: 通过离散化和求和的方式,数值近似地计算了塔架的广义质量和广义刚度,这与[[Tower]]笔记中的积分公式相对应。
* **考虑非线性效应**: 计算了重力去刚化刚度项和轴向缩短系数,这些是柔性体动力学中重要的非线性效应。
* **模态调谐**: 实现了塔架模态刚度调谐功能,允许用户调整塔架的固有频率。
* **计算派生参数**: 根据基本参数计算了塔架的固有频率和广义阻尼系数。
这些在`Coeff`中计算出的参数(存储在 `p` 结构体中)随后会被其他子程序(如`CalculatePositions`、`CalculateAngularPosVelPAcc`、`CalculateForcesMoments`和`FillAugmat`)使用,以构建和求解风力机的完整动力学方程。
[Timestamp: 2026/01/12 16:28:08]