Merge remote-tracking branch 'origin/master'

This commit is contained in:
aGYZ 2026-01-09 07:45:34 +08:00
commit 833e229fbe
12 changed files with 3498 additions and 58 deletions

View File

@ -172,6 +172,20 @@
"stream": true,
"displayName": "gemini-2.5-flash-balance",
"enableCors": true
},
{
"name": "ministral-3:14b",
"provider": "ollama",
"enabled": true,
"isBuiltIn": false,
"baseUrl": "https://possibly-engaged-filly.ngrok-free.app/",
"apiKey": "",
"isEmbeddingModel": false,
"capabilities": [
"vision"
],
"stream": true,
"enableCors": true
}
],
"activeEmbeddingModels": [
@ -302,7 +316,7 @@
"name": "Translate to Chinese",
"prompt": "<instruction>Translate the text below into Chinese:\n 1. Preserve the meaning and tone\n 2. Maintain appropriate cultural context\n 3. Keep formatting and structure\n \n </instruction>\n\n<text>{copilot-selection}</text>\n<restrictions>\n1. Blade翻译为叶片flapwise翻译为挥舞edgewise翻译为摆振pitch angle翻译成变桨角度twist angle翻译为扭角rotor翻译为风轮turbine、wind turbine翻译为机组、风电机组span翻译为展向deflection翻译为变形mode翻译为模态normal mode翻译为简正模态jacket 翻译为导管架superelement翻译为超单元shaft翻译为主轴azimuth、azimuth angle翻译为方位角neutral axes 翻译为中性轴\n2. Return only the translated text.\n</restrictions>",
"showInContextMenu": true,
"modelKey": "gemini-2.5-flash|google"
"modelKey": "ministral-3:14b|ollama"
},
{
"name": "Summarize",

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,175 @@
The distributed properties of blade 1 bring about generalized inertia forces and generalized active forces associated with blade elasticity, blade damping, blade weight, and blade aerodynamics.
叶片1的分布式特性导致与叶片弹性、叶片阻尼、叶片重量及叶片气动力相关的广义惯性力和广义主动力。
$$
F_{r}^{*}\big|_{B1} = -\int_{0}^{BldFlexL} \mu^{B1}(r) \, {}^E \, \boldsymbol{v}_{r}^{S1}(r) \cdot {}^E \, \boldsymbol{a}^{S1}(r) \, dr - m^{BldTip} \, {}^E \, \boldsymbol{v}_{r}^{S1}(BldFlexL) \cdot {}^E \, \boldsymbol{a}^{S1}(BldFlexL) \quad (r = 1, 2, \ldots, 22) \tag{1}
$$
其中
$$
\mu^{B1}(r) = AdjBlMs^{B1} \cdot BMassDen^{B1}(r) \tag{2}
$$
$$
m^{B1Tip} = TipMass(1) \tag{3}
$$
or,
$$
F_{r}^{*}\big|_{B1} = -\int_{0}^{BldFlexL} \mu^{B1}(r) \, {}^E\boldsymbol{v}_{r}^{S1}(r) \cdot \left\{
\begin{array}{l}
\left( \sum_{i=1}^{14} {}^{E}\boldsymbol{v}_{i}^{S1}(r) \ddot{q}_{i} \right) + \left( \sum_{i=16}^{18} {}^{E}\boldsymbol{v}_{i}^{S1}(r) \ddot{q}_{i} \right) + {}^{E}\boldsymbol{v}_{Teet}^{S1}(r) \ddot{q}_{Teet} \\
+ \left[ \sum_{i=4}^{14} \frac{d}{dt} \left( {}^{E}\boldsymbol{v}_{i}^{S1}(r) \right) \dot{q}_{i} \right] + \left[ \sum_{i=16}^{18} \frac{d}{dt} \left( {}^{E}\boldsymbol{v}_{i}^{S1}(r) \right) \dot{q}_{i} \right] + \frac{d}{dt} \left( {}^{E}\boldsymbol{v}_{Teet}^{S1}(r) \right) \dot{q}_{Teet}
\end{array}
\right\} dr \\
- m^{B1Tip} {}^{E}\boldsymbol{v}_{r}^{S1}(BldFlexL) \cdot \left\{
\begin{array}{l}
\left( \sum_{i=1}^{14} {}^{E}\boldsymbol{v}_{i}^{S1}(BldFlexL) \ddot{q}_{i} \right) + \left( \sum_{i=16}^{18} {}^{E}\boldsymbol{v}_{i}^{S1}(BldFlexL) \ddot{q}_{i} \right) + {}^{E}\boldsymbol{v}_{Teet}^{S1}(BldFlexL) \ddot{q}_{Teet} \\
+ \left[ \sum_{i=4}^{14} \frac{d}{dt} \left( {}^{E}\boldsymbol{v}_{i}^{S1}(BldFlexL) \right) \dot{q}_{i} \right] + \left[ \sum_{i=16}^{18} \frac{d}{dt} \left( {}^{E}\boldsymbol{v}_{i}^{S1}(BldFlexL) \right) \dot{q}_{i} \right] \\
+ \frac{d}{dt} \left( {}^{E}\boldsymbol{v}_{Teet}^{S1}(BldFlexL) \right) \dot{q}_{Teet}
\end{array}
\right\} \quad (r = 1, 2, \ldots, 14; 16, 17, 18; Teet) \tag{4}
$$
因此,
$$
\left[C(q,t)\right]_{B1} (\text{Row,Col}) = \int_{0}^{BldFlexL} \mu^{B1}(r) \, {}^{E}\boldsymbol{v}_{\text{Row}}^{S1}(r) \cdot {}^{E}\boldsymbol{v}_{\text{Col}}^{S1}(r) \, dr + m^{B1Tip} {}^{E}\boldsymbol{v}_{\text{Row}}^{S1}(BldFlexL) \cdot {}^{E}\boldsymbol{v}_{\text{Col}}^{S1}(BldFlexL) \quad (\text{Row, Col} = 1,2,\ldots,14;16,17,18;22) \tag{5}
$$
$$
\left\{-f(\dot{q},q,t)\right\}_{B1} (\text{Row}) = -\int_{0}^{BldFlexL} \mu^{B1}(r) \, {}^{E}\boldsymbol{v}_{\text{Row}}^{S1}(r) \cdot \left\{ \left[ \sum_{i=4}^{14} \frac{d}{dt} \left( {}^{E}\boldsymbol{v}_{i}^{S1}(r) \right) \dot{q}_{i} \right] + \left[ \sum_{i=16}^{18} \frac{d}{dt} \left( {}^{E}\boldsymbol{v}_{i}^{S1}(r) \right) \dot{q}_{i} \right] + \frac{d}{dt} \left( {}^{E}\boldsymbol{v}_{Teet}^{S1}(r) \right) \dot{q}_{Teet} \right\} dr \\
- m^{B1Tip} {}^{E}\boldsymbol{v}_{\text{Row}}^{S1}(BldFlexL) \cdot \left\{ \left[ \sum_{i=4}^{14} \frac{d}{dt} \left( {}^{E}\boldsymbol{v}_{i}^{S1}(BldFlexL) \right) \dot{q}_{i} \right] + \left[ \sum_{i=16}^{18} \frac{d}{dt} \left( {}^{E}\boldsymbol{v}_{i}^{S1}(BldFlexL) \right) \dot{q}_{i} \right] + \frac{d}{dt} \left( {}^{E}\boldsymbol{v}_{Teet}^{S1}(BldFlexL) \right) \dot{q}_{Teet} \right\} \quad (\text{Row} = 1,2,\ldots,14;16,17,18;22) \tag{6}
$$
$$
F_{r}\big|_{ElasticB1} = -\frac{\partial V'^{B1}}{\partial q_r} \quad (r = 1, 2, \ldots, 22) \tag{7}
$$
$$
\left. F_{r} \right|_{ElasticB1} =
\begin{cases}
- {k'}_{11}^{B1F} q_{B1F1} - {k'}_{12}^{B1F} q_{B1F2}
& \text{for } r = B1F1 \\
- {k'}_{11}^{B1E} q_{B1E1}
& \text{for } r = B1E1 \\
- {k'}_{21}^{B1F} q_{B1F1} - {k'}_{22}^{B1F} q_{B1F2}
& \text{for } r = B1F2 \\
0
& \text{otherwise}
\end{cases} \tag{8}
$$
where $k_{\ i j}^{\,\prime B I F}$ and $\boldsymbol{k\,}_{I I}^{\prime B I E}$ are the generalized stiffnesses of blade 1 in the local flap and local edge directions respectively when centrifugal-stiffening effects are not included as follows:
其中,$k_{ij}^{\,\prime BIF}$ 和 $\boldsymbol{k}_{II}^{\prime BIE}$ 分别为未考虑离心刚化效应时叶片1在局部挥舞方向和局部摆振方向的广义刚度具体如下
$$
{k'}_{ij}^{B1F} = \sqrt{FlStTunr^{B1}(i) \, FlStTunr^{B1}(j)} \int_{0}^{BldFlexL} EI^{B1F}(r) \frac{d^2 \phi_i^{B1F}(r)}{dr^2} \frac{d^2 \phi_j^{B1F}(r)}{dr^2} dr \quad (i, j = 1, 2) \tag{9}
$$
其中,
$$
EI^{B1F}(r) = AdjFlSt^{B1} \cdot FlpStff^{B1}(r) \tag{10}
$$
$$
{k'}_{11}^{B1E} = \int_{0}^{BldFlexL} EI^{B1E}(r) \left[ \frac{d^2 \phi_{1}^{B1E}(r)}{dr^2} \right]^2 dr \tag{11}
$$
其中,
$$
EI^{B1E}(r) = AdjEdSt^{B1} \cdot EdgStff^{B1}(r) \tag{12}
$$
Similarly, when using the Rayleigh damping technique where the damping is assumed proportional to the stiffness, then
同样,在使用瑞利阻尼技术(假设阻尼与刚度成正比)时,则
$$
\left. F_r \right|_{DampB1} =
\begin{cases}
-\frac{\zeta_1^{B1F} {k'}_{11}^{B1F}}{\pi f^{\prime B 1 F}_1} \dot{q}_{B1F1} - \frac{\zeta_2^{B1F} {k'}_{12}^{B1F}}{\pi f^{\prime B 1 F}_2} \dot{q}_{B1F2} & \text{for } r = B1F1 \\
-\frac{\zeta_1^{B1E} {k'}_{11}^{B1E}}{\pi f^{\prime B 1 E}_1} \dot{q}_{B1E1} & \text{for } r = B1E1 \\
-\frac{\zeta_1^{B1F} {k'}_{21}^{B1F}}{\pi f^{\prime B 1 F}_1} \dot{q}_{B1F1} - \frac{\zeta_2^{B1F} {k'}_{22}^{B1F}}{\pi f^{\prime B 1 F}_2} \dot{q}_{B1F2} & \text{for } r = B1F2 \\
0 & \text{otherwise}
\end{cases} \tag{13}
$$
where $\zeta_{i}^{B I F}$ and $\zeta_{i}^{B I E}$ represent the structural damping ratio of blade 1 for the $i^{\mathrm{th}}$ mode in the local flap and edge directions, $B l d F l D m p^{B 1}(i)/100$ and $B l d E d D m p^{B 1}\left(i\right)/100$ respectively. Also, ${f^{\prime}}_{i}^{B I F}$ and $\boldsymbol{f}_{\ i}^{\prime B I E}$ represent the natural frequency of blade 1 for the $i^{\mathrm{th}}$ mode in the local flap and edge directions respectively without centrifugal-stiffening effects. That is,
其中,$\zeta_{i}^{BIF}$ 和 $\zeta_{i}^{BIE}$ 分别代表叶片1在第 $i$ 阶模态下在**挥舞**方向和**摆振**方向的结构阻尼比,对应表达式为 $BldFlDmp^{B1}(i)/100$ 和 $BldEdDmp^{B1}(i)/100$。此外,${f^{\prime}}_{i}^{B I F}$ 和 $\boldsymbol{f}_{\ i}^{\prime B I E}$ 分别表示叶片1在第 $i$ 阶模态下,**不考虑离心刚度效应**时的**挥舞**方向和**摆振**方向的固有频率。也就是说,
$$
f_i^{\prime B1F} = \frac{1}{2\pi} \sqrt{\frac{k_{ii}^{\prime B1F}}{m_{ii}^{\prime B1F}}} \tag{14}
$$
$$
f_i^{\prime B1E} = \frac{1}{2\pi} \sqrt{\frac{k_{ii}^{\prime B1E}}{m_{ii}^{\prime B1E}}} \tag{15}
$$
where $m_{\ i i}^{\prime B I F}$ and $m_{\ i i}^{\prime B I E}$ represent the generalized mass of blade 1 for the $i^{\mathrm{th}}$ mode in the local flap and edge directions respectively without centrifugal-stiffening and tip mass effects as follows:
其中,$m_{ii}^{\prime BIF}$ 和 $m_{ii}^{\prime BIE}$ 分别表示在未考虑离心刚化和叶尖质量效应的情况下,第 $i$ 阶模态下叶片1在**挥舞方向**和**摆振方向**的广义质量,具体定义如下:
$$
m_{ij}^{\prime B1F} = \int_{0}^{BldFlexL} \mu^{B1}(r) \phi_i^{B1F}(r) \phi_j^{B1F}(r) \, dr \quad (i, j = 1, 2) \tag{16}
$$
$$
m_{11}^{\prime B1E} = \int_{0}^{BldFlexL} \mu^{B1}(r) \left[ \phi_1^{B1E}(r) \right]^2 dr \tag{17}
$$
Thus
$$
[C(q,t)]|_{ElasticB1} = 0 \quad \text{and} \quad [C(q,t)]|_{DampB1} = 0 \tag{18}
$$
$$
\left. \left\{ -f(\dot{q},q,t) \right\} \right|_{ElasticB1} =
\begin{pmatrix}
\vdots \\
\vdots \\
\vdots \\
-k_{11}^{\prime B1F} q_{B1F1} - k_{12}^{\prime B1F} q_{B1F2} \\
-k_{11}^{\prime B1E} q_{B1E1} \\
-k_{21}^{\prime B1F} q_{B1F1} - k_{22}^{\prime B1F} q_{B1F2} \\
\vdots \\
\vdots \\
\vdots
\end{pmatrix} \tag{19}
$$
$$
\left. \left\{ -f(\dot{q},q,t) \right\} \right|_{DampB1} =
\begin{pmatrix}
\vdots \\
\vdots \\
\vdots \\
-\frac{\zeta_1^{B1F} k_{11}^{\prime B1F}}{\pi f_1^{\prime B1F}} \dot{q}_{B1F1} - \frac{\zeta_2^{B1F} k_{12}^{\prime B1F}}{\pi f_2^{\prime B1F}} \dot{q}_{B1F2} \\
-\frac{\zeta_1^{B1E} k_{11}^{\prime B1E}}{\pi f_1^{\prime B1E}} \dot{q}_{B1E1} \\
-\frac{\zeta_1^{B1F} k_{21}^{\prime B1F}}{\pi f_1^{\prime B1F}} \dot{q}_{B1F1} - \frac{\zeta_2^{B1F} k_{22}^{\prime B1F}}{\pi f_2^{\prime B1F}} \dot{q}_{B1F2} \\
\vdots \\
\vdots \\
\vdots
\end{pmatrix} \tag{20}
$$$$
F_{r}\big|_{GravB1} = -\int_{0}^{BldFlexL} \mu^{B1}(r) \, \boldsymbol{g}^{E}\boldsymbol{v}_{r}^{S1}(r) \cdot \boldsymbol{{z}}_2 \, dr - m^{B1Tip} \boldsymbol{g}^{E}\boldsymbol{v}_{r}^{S1}(BldFlexL) \cdot \boldsymbol{{z}}_2 \quad (r = 3,4,\ldots,14;16,17,18;Teet)\tag{21}
$$
Thus,
$$
[C(q,t)]|_{GravB1} = 0\tag{22}
$$
$$
\left\{ -f(\dot{q}, q, t) \right\}|_{GravB1} (\text{Row}) = -\int_{0}^{BldFlexL} \mu^{B1}(r) \, g \, {}^E\boldsymbol{v}_{Row}^{S1}(r) \cdot \boldsymbol{z}_2 \, dr - m^{B1Tip} \, g \, {}^E\boldsymbol{v}_{Row}^{S1}(BldFlexL) \cdot \boldsymbol{z}_2 \quad (\text{Row} = 3, 4, \ldots, 14; 16, 17, 18; 22)\tag{23}
$$
$$
\boldsymbol{F}_r \big|_{AeroB1} = \int_{0}^{BldFlexL} \left[ {}^E\boldsymbol{v}_r^{S1}(r) \cdot \boldsymbol{F}_{AeroB1}^{S1}(r) + {}^E\boldsymbol{\omega}_r^{M1}(r) \cdot \boldsymbol{M}_{AeroB1}^{M1}(r) \right] dr + {}^E\boldsymbol{v}_r^{S1}(BldFlexL) \cdot \boldsymbol{F}_{TipDragB1}^{S1}(BldFlexL)(r = 1, 2, \ldots, 14; 16, 17, 18; Teet)\tag{24}
$$
where $F_{A e r o B 1}^{S 1}(r)$ and $M_{A e r o B 1}^{M 1}\left(r\right)$ are aerodynamic forces and pitching moments applied to point S1 on blade 1 respectively expressed per unit span. Note that $M_{A e r o B 1}^{M 1}\left(r\right)$ can include effects of both direct aerodynamic pitching moments (i.e., $\mathrm{Cm})$ ) and aerodynamic pitching moments caused by an aerodynamic offset (i.e., moments due to aerodynamic lift and drag forces acting at a distance away from the center of mass of the blade element along the aerodynamic chord).
其中,$F_{\text{AeroB1}}^{S1}(r)$ 和 $M_{\text{AeroB1}}^{M1}(r)$ 分别表示作用于叶片1上点S1处的单位展向长度上的气动力和气动俯仰力矩。需要注意的是$M_{\text{AeroB1}}^{M1}(r)$ 可包含两部分气动俯仰力矩的影响:一是直接气动俯仰力矩(即 $\mathrm{Cm}$),二是由气动力(升力和阻力)在叶片元素气动弦线上相对于质心产生的偏移距离所引起的气动俯仰力矩。
$$
[C(q,t)]|_{AeroB1} = 0\tag{25}
$$
$$
\left\{ -f(\dot{q}, q, t) \right\}|_{AeroB1} (\text{Row}) = \int_{0}^{BldFlexL} \left[ {}^E\boldsymbol{v}_{Row}^{S1}(r) \cdot \boldsymbol{F}_{AeroB1}^{S1}(r) + {}^E\boldsymbol{\omega}_{Row}^{M1}(r) \cdot \boldsymbol{M}_{AeroB1}^{M1}(r) \right] dr + {}^E\boldsymbol{v}_{Row}^{S1}(BldFlexL) \cdot \boldsymbol{F}_{TipDragB1}^{S1}(BldFlexL) \quad (\text{Row} = 1, 2, \ldots, 14; 16, 17, 18; 22)\tag{26}
$$

View File

@ -0,0 +1,222 @@
```fortran
SUBROUTINE CalculateAngularPosVelPAcc( p, x, CoordSys, RtHSdat )
!..................................................................................................................................
! Passed variables
TYPE(ED_ParameterType), INTENT(IN ) :: p !< Parameters
TYPE(ED_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at Time
TYPE(ED_CoordSys), INTENT(IN ) :: CoordSys !< The coordinate systems that have been set for these states/time
TYPE(ED_RtHndSide), INTENT(INOUT) :: RtHSdat !< data from the RtHndSid module (contains positions to be set)
!Local variables
REAL(ReKi) :: AngVelHM (3) ! Angular velocity of eleMent J of blade K (body M) in the hub (body H).
! REAL(ReKi) :: AngVelEN (3) ! Angular velocity of the nacelle (body N) in the inertia frame (body E for earth).
REAL(ReKi) :: AngAccELt (3) ! Portion of the angular acceleration of the low-speed shaft (body L) in the inertia frame (body E for earth) associated with everything but the QD2T()'s.
INTEGER(IntKi) :: J ! Counter for elements
INTEGER(IntKi) :: K ! Counter for blades
!-------------------------------------------------------------------------------------------------
! Angular and partial angular velocities
!-------------------------------------------------------------------------------------------------
! Define the angular and partial angular velocities of all of the rigid bodies in the inertia frame:
! NOTE: PAngVelEN(I,D,:) = the Dth-derivative of the partial angular velocity of DOF I for body N in body E.
RtHSdat%PAngVelEX( :,0,:) = 0.0
RtHSdat%PAngVelEX(DOF_R ,0,:) = CoordSys%z1
RtHSdat%PAngVelEX(DOF_P ,0,:) = -CoordSys%z3
RtHSdat%PAngVelEX(DOF_Y ,0,:) = CoordSys%z2
RtHSdat%AngVelEX = x%QDT(DOF_R )*RtHSdat%PAngVelEX(DOF_R ,0,:) &
+ x%QDT(DOF_P )*RtHSdat%PAngVelEX(DOF_P ,0,:) &
+ x%QDT(DOF_Y )*RtHSdat%PAngVelEX(DOF_Y ,0,:)
RtHSdat%AngPosEX = x%QT (DOF_R )*RtHSdat%PAngVelEX(DOF_R ,0,:) &
+ x%QT (DOF_P )*RtHSdat%PAngVelEX(DOF_P ,0,:) &
+ x%QT (DOF_Y )*RtHSdat%PAngVelEX(DOF_Y ,0,:)
RtHSdat%PAngVelEB( :,0,:) = RtHSdat%PAngVelEX(:,0,:)
RtHSdat%PAngVelEB(DOF_TFA1,0,:) = -p%TwrFASF(1,p%TTopNode,1)*CoordSys%a3
RtHSdat%PAngVelEB(DOF_TSS1,0,:) = p%TwrSSSF(1,p%TTopNode,1)*CoordSys%a1
RtHSdat%PAngVelEB(DOF_TFA2,0,:) = -p%TwrFASF(2,p%TTopNode,1)*CoordSys%a3
RtHSdat%PAngVelEB(DOF_TSS2,0,:) = p%TwrSSSF(2,p%TTopNode,1)*CoordSys%a1
RtHSdat%AngVelEB = RtHSdat%AngVelEX + x%QDT(DOF_TFA1)*RtHSdat%PAngVelEB(DOF_TFA1,0,:) &
+ x%QDT(DOF_TSS1)*RtHSdat%PAngVelEB(DOF_TSS1,0,:) &
+ x%QDT(DOF_TFA2)*RtHSdat%PAngVelEB(DOF_TFA2,0,:) &
+ x%QDT(DOF_TSS2)*RtHSdat%PAngVelEB(DOF_TSS2,0,:)
RtHSdat%AngPosXB = x%QT (DOF_TFA1)*RtHSdat%PAngVelEB(DOF_TFA1,0,:) &
+ x%QT (DOF_TSS1)*RtHSdat%PAngVelEB(DOF_TSS1,0,:) &
+ x%QT (DOF_TFA2)*RtHSdat%PAngVelEB(DOF_TFA2,0,:) &
+ x%QT (DOF_TSS2)*RtHSdat%PAngVelEB(DOF_TSS2,0,:)
RtHSdat%PAngVelEN( :,0,:)= RtHSdat%PAngVelEB(:,0,:)
RtHSdat%PAngVelEN(DOF_Yaw ,0,:)= CoordSys%d2
RtHSdat%AngVelEN = RtHSdat%AngVelEB + x%QDT(DOF_Yaw )*RtHSdat%PAngVelEN(DOF_Yaw ,0,:)
RtHSdat%PAngVelER( :,0,:)= RtHSdat%PAngVelEN(:,0,:)
RtHSdat%PAngVelER(DOF_RFrl,0,:)= CoordSys%rfa
RtHSdat%AngVelER = RtHSdat%AngVelEN + x%QDT(DOF_RFrl)*RtHSdat%PAngVelER(DOF_RFrl,0,:)
RtHSdat%PAngVelEL( :,0,:)= RtHSdat%PAngVelER(:,0,:)
RtHSdat%PAngVelEL(DOF_GeAz,0,:)= CoordSys%c1
RtHSdat%PAngVelEL(DOF_DrTr,0,:)= CoordSys%c1
RtHSdat%AngVelEL = RtHSdat%AngVelER + x%QDT(DOF_GeAz)*RtHSdat%PAngVelEL(DOF_GeAz,0,:) &
+ x%QDT(DOF_DrTr)*RtHSdat%PAngVelEL(DOF_DrTr,0,:)
RtHSdat%PAngVelEH( :,0,:)= RtHSdat%PAngVelEL(:,0,:)
RtHSdat%AngVelEH = RtHSdat%AngVelEL
IF ( p%NumBl == 2 ) THEN ! 2-blader
RtHSdat%PAngVelEH(DOF_Teet,0,:)= CoordSys%f2
RtHSdat%AngVelEH = RtHSdat%AngVelEH + x%QDT(DOF_Teet)*RtHSdat%PAngVelEH(DOF_Teet,0,:)
ENDIF
RtHSdat%PAngVelEG( :,0,:) = RtHSdat%PAngVelER(:,0,:)
RtHSdat%PAngVelEG(DOF_GeAz,0,:) = p%GBRatio*CoordSys%c1
RtHSdat%AngVelEG = RtHSdat%AngVelER + x%QDT(DOF_GeAz)*RtHSdat%PAngVelEG(DOF_GeAz,0,:)
RtHSdat%PAngVelEA( :,0,:) = RtHSdat%PAngVelEN(:,0,:)
RtHSdat%PAngVelEA(DOF_TFrl,0,:) = CoordSys%tfa
RtHSdat%AngVelEA = RtHSdat%AngVelEN + x%QDT(DOF_TFrl)*RtHSdat%PAngVelEA(DOF_TFrl,0,:)
! Define the 1st derivatives of the partial angular velocities of all
! of the rigid bodies in the inertia frame and the portion of the angular
! acceleration of the rigid bodies in the inertia frame associated with
! everything but the QD2T()'s:
RtHSdat%PAngVelEX( :,1,:) = 0.0
RtHSdat%AngAccEXt = 0.0
RtHSdat%PAngVelEB( :,1,:) = RtHSdat%PAngVelEX(:,1,:)
RtHSdat%PAngVelEB(DOF_TFA1,1,:) = CROSS_PRODUCT( RtHSdat%AngVelEX, RtHSdat%PAngVelEB(DOF_TFA1,0,:) )
RtHSdat%PAngVelEB(DOF_TSS1,1,:) = CROSS_PRODUCT( RtHSdat%AngVelEX, RtHSdat%PAngVelEB(DOF_TSS1,0,:) )
RtHSdat%PAngVelEB(DOF_TFA2,1,:) = CROSS_PRODUCT( RtHSdat%AngVelEX, RtHSdat%PAngVelEB(DOF_TFA2,0,:) )
RtHSdat%PAngVelEB(DOF_TSS2,1,:) = CROSS_PRODUCT( RtHSdat%AngVelEX, RtHSdat%PAngVelEB(DOF_TSS2,0,:) )
RtHSdat%AngAccEBt = RtHSdat%AngAccEXt + x%QDT(DOF_TFA1)*RtHSdat%PAngVelEB(DOF_TFA1,1,:) &
+ x%QDT(DOF_TSS1)*RtHSdat%PAngVelEB(DOF_TSS1,1,:) &
+ x%QDT(DOF_TFA2)*RtHSdat%PAngVelEB(DOF_TFA2,1,:) &
+ x%QDT(DOF_TSS2)*RtHSdat%PAngVelEB(DOF_TSS2,1,:)
RtHSdat%PAngVelEN( :,1,:) = RtHSdat%PAngVelEB(:,1,:)
RtHSdat%PAngVelEN(DOF_Yaw ,1,:) = CROSS_PRODUCT( RtHSdat%AngVelEB, RtHSdat%PAngVelEN(DOF_Yaw ,0,:) )
RtHSdat%AngAccENt = RtHSdat%AngAccEBt + x%QDT(DOF_Yaw )*RtHSdat%PAngVelEN(DOF_Yaw ,1,:)
RtHSdat%PAngVelER( :,1,:) = RtHSdat%PAngVelEN(:,1,:)
RtHSdat%PAngVelER(DOF_RFrl,1,:) = CROSS_PRODUCT( RtHSdat%AngVelEN, RtHSdat%PAngVelER(DOF_RFrl,0,:) )
RtHSdat%AngAccERt = RtHSdat%AngAccENt + x%QDT(DOF_RFrl)*RtHSdat%PAngVelER(DOF_RFrl,1,:)
RtHSdat%PAngVelEL( :,1,:) = RtHSdat%PAngVelER(:,1,:)
RtHSdat%PAngVelEL(DOF_GeAz,1,:) = CROSS_PRODUCT( RtHSdat%AngVelER, RtHSdat%PAngVelEL(DOF_GeAz,0,:) )
RtHSdat%PAngVelEL(DOF_DrTr,1,:) = CROSS_PRODUCT( RtHSdat%AngVelER, RtHSdat%PAngVelEL(DOF_DrTr,0,:) )
AngAccELt = RtHSdat%AngAccERt + x%QDT(DOF_GeAz)*RtHSdat%PAngVelEL(DOF_GeAz,1,:) &
+ x%QDT(DOF_DrTr)*RtHSdat%PAngVelEL(DOF_DrTr,1,:)
RtHSdat%PAngVelEH( :,1,:) = RtHSdat%PAngVelEL(:,1,:)
RtHSdat%AngAccEHt = AngAccELt
IF ( p%NumBl == 2 ) THEN ! 2-blader
RtHSdat%PAngVelEH(DOF_Teet,1,:) = CROSS_PRODUCT( RtHSdat%AngVelEH, RtHSdat%PAngVelEH(DOF_Teet,0,:) )
RtHSdat%AngAccEHt = RtHSdat%AngAccEHt + x%QDT(DOF_Teet)*RtHSdat%PAngVelEH(DOF_Teet,1,:)
ENDIF
RtHSdat%PAngVelEG( :,1,:) = RtHSdat%PAngVelER(:,1,:)
RtHSdat%PAngVelEG(DOF_GeAz,1,:) = CROSS_PRODUCT( RtHSdat%AngVelER, RtHSdat%PAngVelEG(DOF_GeAz,0,:) )
RtHSdat%AngAccEGt = RtHSdat%AngAccERt + x%QDT(DOF_GeAz)*RtHSdat%PAngVelEG(DOF_GeAz,1,:)
RtHSdat%PAngVelEA( :,1,:) = RtHSdat%PAngVelEN(:,1,:)
RtHSdat%PAngVelEA(DOF_TFrl,1,:) = CROSS_PRODUCT( RtHSdat%AngVelEN, RtHSdat%PAngVelEA(DOF_TFrl,0,:) )
RtHSdat%AngAccEAt = RtHSdat%AngAccENt + x%QDT(DOF_TFrl)*RtHSdat%PAngVelEA(DOF_TFrl,1,:)
DO K = 1,p%NumBl ! Loop through all blades
DO J = 0,p%TipNode ! Loop through the blade nodes / elements
! Define the partial angular velocities of the current node (body M(RNodes(J))) in the inertia frame:
! NOTE: PAngVelEM(K,J,I,D,:) = the Dth-derivative of the partial angular velocity
! of DOF I for body M of blade K, element J in body E.
RtHSdat%PAngVelEM(K,J, :,0,:) = RtHSdat%PAngVelEH(:,0,:)
RtHSdat%PAngVelEM(K,J,DOF_BF(K,1),0,:) = - p%TwistedSF(K,2,1,J,1)*CoordSys%j1(K,:) &
+ p%TwistedSF(K,1,1,J,1)*CoordSys%j2(K,:)
RtHSdat%PAngVelEM(K,J,DOF_BF(K,2),0,:) = - p%TwistedSF(K,2,2,J,1)*CoordSys%j1(K,:) &
+ p%TwistedSF(K,1,2,J,1)*CoordSys%j2(K,:)
RtHSdat%PAngVelEM(K,J,DOF_BE(K,1),0,:) = - p%TwistedSF(K,2,3,J,1)*CoordSys%j1(K,:) &
+ p%TwistedSF(K,1,3,J,1)*CoordSys%j2(K,:)
AngVelHM = x%QDT(DOF_BF(K,1))*RtHSdat%PAngVelEM(K,J,DOF_BF(K,1),0,:) &
+ x%QDT(DOF_BF(K,2))*RtHSdat%PAngVelEM(K,J,DOF_BF(K,2),0,:) &
+ x%QDT(DOF_BE(K,1))*RtHSdat%PAngVelEM(K,J,DOF_BE(K,1),0,:)
RtHSdat%AngVelEM(:,J,K ) = RtHSdat%AngVelEH + AngVelHM
RtHSdat%AngPosHM(:,K,J ) = x%QT (DOF_BF(K,1))*RtHSdat%PAngVelEM(K,J,DOF_BF(K,1),0,:) &
+ x%QT (DOF_BF(K,2))*RtHSdat%PAngVelEM(K,J,DOF_BF(K,2),0,:) &
+ x%QT (DOF_BE(K,1))*RtHSdat%PAngVelEM(K,J,DOF_BE(K,1),0,:)
RtHSdat%AngAccEKt(:,J ,K) = RtHSdat%AngAccEHt + x%QDT(DOF_BF(K,1))*RtHSdat%PAngVelEM(K,J,DOF_BF(K,1),1,:) &
+ x%QDT(DOF_BF(K,2))*RtHSdat%PAngVelEM(K,J,DOF_BF(K,2),1,:) &
+ x%QDT(DOF_BE(K,1))*RtHSdat%PAngVelEM(K,J,DOF_BE(K,1),1,:)
! Define the 1st derivatives of the partial angular velocities of the current node (body M(RNodes(J))) in the inertia frame:
! NOTE: These are currently unused by the code, therefore, they need not
! be calculated. Thus, they are currently commented out. If it
! turns out that they are ever needed (i.e., if inertias of the
! blade elements are ever added, etc...) simply uncomment out these computations:
! RtHSdat%PAngVelEM(K,J, :,1,:) = RtHSdat%PAngVelEH(:,1,:)
! RtHSdat%PAngVelEM(K,J,DOF_BF(K,1),1,:) = CROSS_PRODUCT( RtHSdat%AngVelEH, PAngVelEM(K,J,DOF_BF(K,1),0,:) )
! RtHSdat%PAngVelEM(K,J,DOF_BF(K,2),1,:) = CROSS_PRODUCT( RtHSdat%AngVelEH, PAngVelEM(K,J,DOF_BF(K,2),0,:) )
! RtHSdat%PAngVelEM(K,J,DOF_BE(K,1),1,:) = CROSS_PRODUCT( RtHSdat%AngVelEH, PAngVelEM(K,J,DOF_BE(K,1),0,:) )
END DO !J = 1,p%BldNodes ! Loop through the blade nodes / elements
END DO !K = 1,p%NumBl
!...............
! tower values:
!...............
DO J = 0,p%TwrNodes ! Loop through the tower nodes / elements
! Define the partial angular velocities (and their 1st derivatives) of the
! current node (body F(HNodes(J)) in the inertia frame.
! Also define the overall angular velocity of the current node in the inertia frame.
! Also, define the portion of the angular acceleration of the current node
! in the inertia frame associated with everything but the QD2T()'s:
! NOTE: PAngVelEF(J,I,D,:) = the Dth-derivative of the partial angular velocity
! of DOF I for body F of element J in body E.
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%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%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%AngPosXF (:,J) = x%QT (DOF_TFA1)*RtHSdat%PAngVelEF(J,DOF_TFA1,0,:) &
+ x%QT (DOF_TSS1)*RtHSdat%PAngVelEF(J,DOF_TSS1,0,:) &
+ x%QT (DOF_TFA2)*RtHSdat%PAngVelEF(J,DOF_TFA2,0,:) &
+ x%QT (DOF_TSS2)*RtHSdat%PAngVelEF(J,DOF_TSS2,0,:)
RtHSdat%AngPosEF (:,J) = RtHSdat%AngPosEX + RtHSdat%AngPosXF(:,J)
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,:)
END DO ! J
END SUBROUTINE CalculateAngularPosVelPAcc
```

View File

@ -0,0 +1,634 @@
```fortran
SUBROUTINE CalculateForcesMoments( p, x, CoordSys, u, RtHSdat )
!..................................................................................................................................
! Passed variables
TYPE(ED_ParameterType), INTENT(IN ) :: p !< Parameters
TYPE(ED_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at Time
TYPE(ED_CoordSys), INTENT(IN ) :: CoordSys !< The coordinate systems that have been set for these states/time
TYPE(ED_InputType), INTENT(IN ) :: u !< The aero (blade) & nacelle forces/moments
TYPE(ED_RtHndSide), INTENT(INOUT) :: RtHSdat !< data from the RtHndSid module (contains positions to be set)
! Local variables
REAL(ReKi) :: TmpVec (3) ! A temporary vector used in various computations.
REAL(ReKi) :: TmpVec1 (3) ! A temporary vector used in various computations.
REAL(ReKi) :: TmpVec2 (3) ! A temporary vector used in various computations.
REAL(ReKi) :: TmpVec3 (3) ! A temporary vector used in various computations.
REAL(ReKi) :: TmpVec4 (3) ! A temporary vector used in various computations.
REAL(ReKi) :: TmpVec5 (3) ! A temporary vector used in various computations.
REAL(ReKi) :: Force(3) ! External force (e.g. from AeroDyn)
REAL(ReKi) :: Moment(3) ! External moment (e.g. from AeroDyn)
INTEGER(IntKi) :: I ! Loops through some or all of the DOFs
INTEGER(IntKi) :: J ! Counter for elements
INTEGER(IntKi) :: K ! Counter for blades
INTEGER(IntKi) :: NodeNum ! Node number for blade element (on a single mesh)
!.....................................
! Compute forces and moments from properties related to Aero inputs
!FSTipDrag
!FSAero and MMAero
!.....................................
DO K = 1,p%NumBl ! Loop through all blades
! Calculate the tip drag forces if necessary:
!bjj: add this back when we've figured out how to handle the tip brakes:
!RtHSdat%FSTipDrag(:,K) = m%CoordSys%m2(K,p%BldNodes,:)*SIGN( 0.5*p%AirDens*(RtHSdat%LinVelESm2(K)**2)*u%TBDrCon(K), -1.*RtHSdat%LinVelESm2(K) )
RtHSdat%FSTipDrag = 0.0_ReKi ! Calculate the tip drag forces if necessary
! Calculate the normal and tangential aerodynamic forces and the aerodynamic
! pitching moment at the current element per unit span by calling AeroDyn,
! if necessary:
DO J = 1,p%BldNodes ! Loop through the blade nodes / elements
! Calculate the aerodynamic pitching moment arm (i.e., the position vector
! from point S on the blade to the aerodynamic center of the element):
RtHSdat%rSAerCen(:,J,K) = p%rSAerCenn1(K,J)*CoordSys%n1(K,J,:) + p%rSAerCenn2(K,J)*CoordSys%n2(K,J,:)
! rPAerCen = m%RtHS%rPQ + m%RtHS%rQS(:,K,J) + m%RtHS%rSAerCen(:,J,K) ! Position vector from teeter pin (point P) to blade analysis node aerodynamic center.
! rAerCen = m%RtHS%rS (:,K,J) + m%RtHS%rSAerCen(:,J,K) ! Position vector from inertial frame origin to blade analysis node aerodynamic center.
! fill FSAero() and MMAero() with the forces resulting from inputs u%BladeLn2Mesh(K)%Force(1:2,:) and u%BladeLn2Mesh(K)%Moment(3,:):
! [except, we're ignoring the additional nodes we added on the mesh end points]
NodeNum = J ! we're ignoring the root and tip
if (p%UseAD14) then
RtHSdat%FSAero(:,K,J) = ( u%BladePtLoads(K)%Force(1,NodeNum) * CoordSys%te1(K,J,:) &
+ u%BladePtLoads(K)%Force(2,NodeNum) * CoordSys%te2(K,J,:) ) / p%DRNodes(J)
RtHSdat%MMAero(:,K,J) = CROSS_PRODUCT( RtHSdat%rSAerCen(:,J,K), RtHSdat%FSAero(:,K,J) )&
+ u%BladePtLoads(K)%Moment(3,NodeNum)/p%DRNodes(J) * CoordSys%te3(K,J,:)
else
RtHSdat%FSAero(1,K,J) = u%BladePtLoads(K)%Force(1,NodeNum) / p%DRNodes(J)
RtHSdat%FSAero(2,K,J) = u%BladePtLoads(K)%Force(3,NodeNum) / p%DRNodes(J)
RtHSdat%FSAero(3,K,J) = -u%BladePtLoads(K)%Force(2,NodeNum) / p%DRNodes(J)
RtHSdat%MMAero(1,K,J) = u%BladePtLoads(K)%Moment(1,NodeNum) / p%DRNodes(J)
RtHSdat%MMAero(2,K,J) = u%BladePtLoads(K)%Moment(3,NodeNum) / p%DRNodes(J)
RtHSdat%MMAero(3,K,J) = -u%BladePtLoads(K)%Moment(2,NodeNum) / p%DRNodes(J)
end if
END DO !J
END DO ! K
!.....................................
! PFrcS0B and PMomH0B
!.....................................
! RtHSdat%PFrcS0B = 0.0
! RtHSdat%PMomH0B = 0.0
DO K = 1,p%NumBl ! Loop through all blades
! Initialize the partial forces and moments (including those associated
! with the QD2T()'s and those that are not) at the blade root (point S(0))
! using the tip brake effects:
RtHSdat%PFrcS0B(:,K,:) = 0.0 ! Initialize these partial
RtHSdat%PMomH0B(:,K,:) = 0.0 ! forces and moments to zero
DO I = 1,p%DOFs%NPSE(K) ! Loop through all active (enabled) DOFs that contribute to the QD2T-related linear accelerations of blade K
TmpVec1 = -p%TipMass(K)*RtHSdat%PLinVelES(K,p%TipNode,p%DOFs%PSE(K,I),0,:) ! The portion of PFrcS0B associated with the tip brake
RtHSdat%PFrcS0B(:,K,p%DOFs%PSE(K,I)) = TmpVec1
RtHSdat%PMomH0B(:,K,p%DOFs%PSE(K,I)) = CROSS_PRODUCT( RtHSdat%rS0S(:,K,p%TipNode), TmpVec1 ) ! The portion of PMomH0B associated with the tip brake
ENDDO ! I - All active (enabled) DOFs that contribute to the QD2T-related linear accelerations of blade K
DO J = 1,p%BldNodes ! Loop through the blade nodes / elements
! Integrate to find the partial forces and moments (including those associated
! with the QD2T()'s and those that are not) at the blade root (point S(0)):
DO I = 1,p%DOFs%NPSE(K) ! Loop through all active (enabled) DOFs that contribute to the QD2T-related linear accelerations of blade K
TmpVec1 = -p%BElmntMass(J,K)*RtHSdat%PLinVelES(K,J,p%DOFs%PSE(K,I),0,:) ! The portion of PFrcS0B associated with blade element J
RtHSdat%PFrcS0B(:,K,p%DOFs%PSE(K,I)) = RtHSdat%PFrcS0B(:,K,p%DOFs%PSE(K,I)) + TmpVec1
RtHSdat%PMomH0B(:,K,p%DOFs%PSE(K,I)) = RtHSdat%PMomH0B(:,K,p%DOFs%PSE(K,I)) + &
CROSS_PRODUCT( RtHSdat%rS0S(:,K,J), TmpVec1 ) ! The portion of PMomH0B associated with blade element J
ENDDO ! I - All active (enabled) DOFs that contribute to the QD2T-related linear accelerations of blade K
END DO
END DO
!.....................................
! FrcS0Bt and MomH0Bt
!.....................................
DO K = 1,p%NumBl ! Loop through all blades
TmpVec1 = RtHSdat%FSTipDrag(:,K) - p%TipMass(K)*( p%Gravity*CoordSys%z2 + RtHSdat%LinAccESt(:,K,p%TipNode) ) ! The portion of FrcS0Bt associated with the tip brake
RtHSdat%FrcS0Bt(:,K) = TmpVec1
RtHSdat%MomH0Bt(:,K) = CROSS_PRODUCT( RtHSdat%rS0S(:,K,p%TipNode), TmpVec1 ) ! The portion of MomH0Bt associated with the tip brake
DO J = 1,p%BldNodes ! Loop through the blade nodes / elements
TmpVec1 = RtHSdat%FSAero(:,K,J)*p%DRNodes(J) - p%BElmntMass(J,K)*( p%Gravity*CoordSys%z2 + RtHSdat%LinAccESt(:,K,J) ) ! The portion of FrcS0Bt associated with blade element J
TmpVec2 = CROSS_PRODUCT( RtHSdat%rS0S(:,K,J), TmpVec1 ) ! The portion of MomH0Bt associated with blade element J
TmpVec3 = RtHSdat%MMAero(:,K,J)*p%DRNodes(J) ! The total external moment applied to blade element J
RtHSdat%FrcS0Bt(:,K) = RtHSdat%FrcS0Bt(:,K) + TmpVec1
RtHSdat%MomH0Bt(:,K) = RtHSdat%MomH0Bt(:,K) + TmpVec2 + TmpVec3
END DO !J
END DO !K
!.....................................
! PFrcPRot AND PMomLPRot:
! ( requires PFrcS0B and PMomH0B)
!.....................................
! Initialize the partial forces and moments (including those associated
! with the QD2T()'s and those that are not) at the teeter pin (point P) using the hub mass effects:
RtHSdat%PFrcPRot = 0.0 ! Initialize these partial
RtHSdat%PMomLPRot = 0.0 ! forces and moments to zero
DO I = 1,p%DOFs%NPCE ! Loop through all active (enabled) DOFs that contribute to the QD2T-related linear accelerations of the hub center of mass (point C)
TmpVec1 = -p%HubMass*RtHSdat%PLinVelEC(p%DOFs%PCE(I),0,:) ! The portion of PFrcPRot associated with the HubMass
TmpVec2 = CROSS_PRODUCT( RtHSdat%rPC, TmpVec1 ) ! The portion of PMomLPRot associated with the HubMass
RtHSdat%PFrcPRot (:,p%DOFs%PCE(I)) = TmpVec1
RtHSdat%PMomLPRot(:,p%DOFs%PCE(I)) = TmpVec2 - p%Hubg1Iner*CoordSys%g1*DOT_PRODUCT( CoordSys%g1, RtHSdat%PAngVelEH(p%DOFs%PCE(I),0,:) ) &
- p%Hubg2Iner*CoordSys%g2*DOT_PRODUCT( CoordSys%g2, RtHSdat%PAngVelEH(p%DOFs%PCE(I),0,:) )
ENDDO ! I - All active (enabled) DOFs that contribute to the QD2T-related linear accelerations of the hub center of mass (point C)
DO K = 1,p%NumBl ! Loop through all blades
! Calculate the position vector from the teeter pin to the blade root:
!rPS0(:,K) = RtHSdat%rPQ + p%HubRad*CoordSys%j3(K,:) ! Position vector from teeter pin (point P) to blade root (point S(0)).
! Add the blade effects to the partial forces and moments (including those associated with the QD2T()'s and those that are
! not) at the teeter pin (point P):
DO I = 1,p%DOFs%NPSE(K) ! Loop through all active (enabled) DOFs that contribute to the QD2T-related linear accelerations of blade K
TmpVec = CROSS_PRODUCT( RtHSdat%rPS0(:,K), RtHSdat%PFrcS0B(:,K,p%DOFs%PSE(K,I)) ) ! The portion of PMomLPRot associated with PFrcS0B.
RtHSdat%PFrcPRot (:,p%DOFs%PSE(K,I)) = RtHSdat%PFrcPRot (:,p%DOFs%PSE(K,I)) + RtHSdat%PFrcS0B(:,K,p%DOFs%PSE(K,I))
RtHSdat%PMomLPRot(:,p%DOFs%PSE(K,I)) = RtHSdat%PMomLPRot(:,p%DOFs%PSE(K,I)) + RtHSdat%PMomH0B(:,K,p%DOFs%PSE(K,I))+TmpVec
ENDDO ! I - All active (enabled) DOFs that contribute to the QD2T-related linear accelerations of blade K
END DO ! K
!PRINT '(F30.20)', RtHSdat%PMomLPRot(:,11)
!.....................................
! FrcPRott and MomLPRott:
! (requires FrcS0Bt and MomH0Bt)
!.....................................
TmpVec1 = -p%HubMass*( p%Gravity*CoordSys%z2 + RtHSdat%LinAccECt ) ! The portion of FrcPRott associated with the HubMass
TmpVec2 = CROSS_PRODUCT( RtHSdat%rPC, TmpVec1 ) ! The portion of MomLPRott associated with the HubMass
TmpVec = p%Hubg1Iner*CoordSys%g1*DOT_PRODUCT( CoordSys%g1, RtHSdat%AngVelEH ) & ! = ( Hub inertia dyadic ) dot ( angular velocity of hub in the inertia frame )
+ p%Hubg2Iner*CoordSys%g2*DOT_PRODUCT( CoordSys%g2, RtHSdat%AngVelEH )
TmpVec3 = CROSS_PRODUCT( -RtHSdat%AngVelEH, TmpVec ) ! = ( -angular velocity of hub in the inertia frame ) cross ( TmpVec )
RtHSdat%FrcPRott(1) = TmpVec1(1) + u%HubPtLoad%Force(1,1)
RtHSdat%FrcPRott(2) = TmpVec1(2) + u%HubPtLoad%Force(3,1)
RtHSdat%FrcPRott(3) = TmpVec1(3) - u%HubPtLoad%Force(2,1)
RtHSdat%MomLPRott = TmpVec2 + TmpVec3 - p%Hubg1Iner*CoordSys%g1*DOT_PRODUCT( CoordSys%g1, RtHSdat%AngAccEHt ) &
- p%Hubg2Iner*CoordSys%g2*DOT_PRODUCT( CoordSys%g2, RtHSdat%AngAccEHt )
RtHSdat%MomLPRott(1) = RtHSdat%MomLPRott(1) + u%HubPtLoad%Moment(1,1)
RtHSdat%MomLPRott(2) = RtHSdat%MomLPRott(2) + u%HubPtLoad%Moment(3,1)
RtHSdat%MomLPRott(3) = RtHSdat%MomLPRott(3) - u%HubPtLoad%Moment(2,1)
DO K = 1,p%NumBl ! Loop through all blades
! Calculate the position vector from the teeter pin to the blade root:
!rPS0 = RtHSdat%rPQ + p%HubRad*m%CoordSys%j3(K,:) ! Position vector from teeter pin (point P) to blade root (point S(0)).
TmpVec = CROSS_PRODUCT( RtHSdat%rPS0(:,K), RtHSdat%FrcS0Bt(:,K) ) ! The portion of MomLPRott associated with FrcS0Bt.
RtHSdat%FrcPRott = RtHSdat%FrcPRott + RtHSdat%FrcS0Bt(:,K)
RtHSdat%MomLPRott = RtHSdat%MomLPRott + RtHSdat%MomH0Bt(:,K) + TmpVec
END DO ! K
! Define the partial forces and moments (including those associated with
! the QD2T()'s and those that are not) at the specified point on the
! rotor-furl axis (point V) / nacelle (body N) using the structure that
! furls with the rotor, generator, and rotor effects.
!.....................................
! PMomNGnRt and PFrcVGnRt
! (requires PMomLPRot and PFrcPRot)
!.....................................
RtHSdat%PFrcVGnRt = RtHSdat%PFrcPRot ! Initialize these partial forces and
RtHSdat%PMomNGnRt = RtHSdat%PMomLPRot ! moments using the rotor effects
DO I = 1,p%DOFs%NActvDOF ! Loop through all active (enabled) DOFs
TmpVec = CROSS_PRODUCT( RtHSdat%rVP, RtHSdat%PFrcPRot(:,p%DOFs%SrtPS(I)) ) ! The portion of PMomNGnRt associated with the PFrcPRot
RtHSdat%PMomNGnRt(:,p%DOFs%SrtPS(I)) = RtHSdat%PMomNGnRt(:,p%DOFs%SrtPS(I)) + TmpVec
ENDDO ! I - All active (enabled) DOFs
DO I = 1,p%DOFs%NPDE ! Loop through all active (enabled) DOFs that contribute to the QD2T-related linear accelerations of the center of mass of the structure that furls with the rotor (not including rotor) (point D)
TmpVec1 = -p%RFrlMass*RtHSdat%PLinVelED(p%DOFs%PDE(I) ,0,:) ! The portion of PFrcVGnRt associated with the RFrlMass
TmpVec2 = CROSS_PRODUCT( RtHSdat%rVD, TmpVec1 ) ! The portion of PMomNGnRt associated with the RFrlMass
RtHSdat%PFrcVGnRt(:,p%DOFs%PDE(I) ) = RtHSdat%PFrcVGnRt(:,p%DOFs%PDE(I) ) + TmpVec1
RtHSdat%PMomNGnRt(:,p%DOFs%PDE(I) ) = RtHSdat%PMomNGnRt(:,p%DOFs%PDE(I) ) + TmpVec2 &
- p%RrfaIner*CoordSys%rfa*DOT_PRODUCT( CoordSys%rfa, RtHSdat%PAngVelER(p%DOFs%PDE(I) ,0,:) ) &
- p%GenIner*CoordSys%c1 *DOT_PRODUCT( CoordSys%c1 , RtHSdat%PAngVelEG(p%DOFs%PDE(I) ,0,:) )
ENDDO ! I - All active (enabled) DOFs that contribute to the QD2T-related linear accelerations of the center of mass of the structure that furls with the rotor (not including rotor) (point D)
IF ( p%DOF_Flag(DOF_GeAz) ) THEN
RtHSdat%PMomNGnRt(:,DOF_GeAz) = RtHSdat%PMomNGnRt(:,DOF_GeAz) & ! The previous loop (DO I = 1,NPDE) misses the DOF_GeAz-contribution to: ( Generator inertia dyadic ) dot ( partial angular velocity of the generator in the inertia frame )
- p%GenIner*CoordSys%c1 *DOT_PRODUCT( CoordSys%c1, RtHSdat%PAngVelEG(DOF_GeAz,0,:) ) ! Thus, add this contribution if necessary.
ENDIF
!.....................................
! FrcVGnRtt and MomNGnRtt
! (requires FrcPRott and MomLPRott)
!.....................................
TmpVec1 = -p%RFrlMass*( p%Gravity*CoordSys%z2 + RtHSdat%LinAccEDt ) ! The portion of FrcVGnRtt associated with the RFrlMass
TmpVec2 = CROSS_PRODUCT( RtHSdat%rVD , TmpVec1 ) ! The portion of MomNGnRtt associated with the RFrlMass
TmpVec3 = CROSS_PRODUCT( RtHSdat%rVP , RtHSdat%FrcPRott ) ! The portion of MomNGnRtt associated with the FrcPRott
TmpVec = p%RrfaIner*CoordSys%rfa*DOT_PRODUCT( CoordSys%rfa, RtHSdat%AngVelER ) ! = ( R inertia dyadic ) dot ( angular velocity of structure that furls with the rotor in the inertia frame )
TmpVec4 = CROSS_PRODUCT( -RtHSdat%AngVelER, TmpVec ) ! = ( -angular velocity of structure that furls with the rotor in the inertia frame ) cross ( TmpVec )
TmpVec = p%GenIner*CoordSys%c1* DOT_PRODUCT( CoordSys%c1 , RtHSdat%AngVelEG ) ! = ( Generator inertia dyadic ) dot ( angular velocity of generator in the inertia frame )
TmpVec5 = CROSS_PRODUCT( -RtHSdat%AngVelEG, TmpVec ) ! = ( -angular velocity of generator in the inertia frame ) cross ( TmpVec )
RtHSdat%FrcVGnRtt = RtHSdat%FrcPRott + TmpVec1
RtHSdat%MomNGnRtt = RtHSdat%MomLPRott + TmpVec2 + TmpVec3 + TmpVec4 + TmpVec5 &
- p%RrfaIner*CoordSys%rfa*DOT_PRODUCT( CoordSys%rfa, RtHSdat%AngAccERt ) &
- p%GenIner*CoordSys%c1 *DOT_PRODUCT( CoordSys%c1 , RtHSdat%AngAccEGt )
!.....................................
! PFrcWTail and PMomNTail
!.....................................
! Define the partial forces and moments (including those associated with the QD2T()'s and
! those that are not) at the specified point on the tail-furl axis (point W) / nacelle (body N) using the tail effects.
RtHSdat%PFrcWTail = 0.0 ! Initialize these partial
RtHSdat%PMomNTail = 0.0 ! forces and moments to zero
DO I = 1,p%DOFs%NPIE ! Loop through all active (enabled) DOFs that contribute to the QD2T-related linear accelerations of the tail boom center of mass (point I)
TmpVec1 = -p%BoomMass*RtHSdat%PLinVelEI(p%DOFs%PIE(I),0,:) ! The portion of PFrcWTail associated with the BoomMass
TmpVec2 = -p%TFinMass*RtHSdat%PLinVelEJ(p%DOFs%PIE(I),0,:) ! The portion of PFrcWTail associated with the TFinMass
TmpVec3 = CROSS_PRODUCT( RtHSdat%rWI, TmpVec1 ) ! The portion of PMomNTail associated with the BoomMass
TmpVec4 = CROSS_PRODUCT( RtHSdat%rWJ, TmpVec2 ) ! The portion of PMomNTail associated with the TFinMass
RtHSdat%PFrcWTail(:,p%DOFs%PIE(I)) = TmpVec1 + TmpVec2
RtHSdat%PMomNTail(:,p%DOFs%PIE(I)) = TmpVec3 + TmpVec4 - p%AtfaIner*CoordSys%tfa* &
DOT_PRODUCT( CoordSys%tfa, RtHSdat%PAngVelEA(p%DOFs%PIE(I),0,:) )
ENDDO ! I - All active (enabled) DOFs that contribute to the QD2T-related linear accelerations of the tail boom center of mass (point I)
!.....................................
! FrcWTailt and MomNTailt - Forces on the tailfin
!.....................................
! Aerodynamic loads on TailFin CM (point K), with change of coordinate system
Force(1:3) = (/ u%TFinCMLoads%Force (1,1), u%TFinCMLoads%Force (3,1), -u%TFinCMLoads%Force (2,1) /)
Moment(1:3) = (/ u%TFinCMLoads%Moment(1,1), u%TFinCMLoads%Moment(3,1), -u%TFinCMLoads%Moment(2,1) /)
TmpVec1 = -p%BoomMass*( p%Gravity*CoordSys%z2 + RtHSdat%LinAccEIt ) ! The portion of FrcWTailt associated with the BoomMass
TmpVec2 = -p%TFinMass*( p%Gravity*CoordSys%z2 + RtHSdat%LinAccEJt ) ! The portion of FrcWTailt associated with the TFinMass
TmpVec3 = CROSS_PRODUCT( RtHSdat%rWI , TmpVec1 ) ! The portion of MomNTailt associated with the BoomMass
TmpVec4 = CROSS_PRODUCT( RtHSdat%rWJ , TmpVec2 ) ! The portion of MomNTailt associated with the TFinMass
TmpVec = p%AtfaIner*CoordSys%tfa*DOT_PRODUCT( CoordSys%tfa, RtHSdat%AngVelEA ) ! = ( A inertia dyadic ) dot ( angular velocity of the tail in the inertia frame )
TmpVec5 = CROSS_PRODUCT( -RtHSdat%AngVelEA, TmpVec ) ! = ( -angular velocity of the tail in the inertia frame ) cross ( TmpVec )
RtHSdat%FrcWTailt = Force + TmpVec1 + TmpVec2
RtHSdat%MomNTailt = Moment + TmpVec3 + TmpVec4 + TmpVec5 &
+ CROSS_PRODUCT( RtHSdat%rWJ , Force ) & ! The portion of MomNTailt associated with Force with lever arm WK
- p%AtfaIner*CoordSys%tfa*DOT_PRODUCT( CoordSys%tfa, RtHSdat%AngAccEAt )
!.....................................
! PFrcONcRt and PMomBNcRt
! (requires PFrcVGnRt, PMomNGnRt, PFrcWTail, PMomNTail, )
!.....................................
! Define the partial forces and moments (including those associated with
! the QD2T()'s and those that are not) at the yaw bearing (point O) /
! base plate (body B) using the nacelle, generator, rotor, and tail effects.
RtHSdat%PFrcONcRt = RtHSdat%PFrcVGnRt + RtHSdat%PFrcWTail ! Initialize these partial forces and moments using
RtHSdat%PMomBNcRt = RtHSdat%PMomNGnRt + RtHSdat%PMomNTail ! the rotor, rotor-furl, generator, and tail effects
DO I = 1,p%DOFs%NActvDOF ! Loop through all active (enabled) DOFs
TmpVec = CROSS_PRODUCT( RtHSdat%rOV, RtHSdat%PFrcVGnRt(:,p%DOFs%SrtPS(I)) ) ! The portion of PMomBNcRt associated with the PFrcVGnRt
RtHSdat%PMomBNcRt(:,p%DOFs%SrtPS(I)) = RtHSdat%PMomBNcRt(:,p%DOFs%SrtPS(I)) + TmpVec
ENDDO ! I - All active (enabled) DOFs
DO I = 1,p%DOFs%NPIE ! Loop through all active (enabled) DOFs that contribute to the QD2T-related linear accelerations of the tail boom center of mass (point I)
TmpVec = CROSS_PRODUCT( RtHSdat%rOW, RtHSdat%PFrcWTail(:,p%DOFs%PIE(I) ) ) ! The portion of PMomBNcRt associated with the PFrcWTail
RtHSdat%PMomBNcRt(:,p%DOFs%PIE(I) ) = RtHSdat%PMomBNcRt(:,p%DOFs%PIE(I) ) + TmpVec
ENDDO ! I - All active (enabled) DOFs that contribute to the QD2T-related linear accelerations of the tail boom center of mass (point I)
DO I = 1,p%DOFs%NPUE ! Loop through all active (enabled) DOFs that contribute to the QD2T-related linear accelerations of the nacelle center of mass (point U)
TmpVec1 = -p%NacMass*RtHSdat%PLinVelEU(p%DOFs%PUE(I),0,:) ! The portion of PFrcONcRt associated with the NacMass
TmpVec2 = CROSS_PRODUCT( RtHSdat%rOU, TmpVec1 ) ! The portion of PMomBNcRt associated with the NacMass
RtHSdat%PFrcONcRt(:,p%DOFs%PUE(I) ) = RtHSdat%PFrcONcRt(:,p%DOFs%PUE(I) ) + TmpVec1
RtHSdat%PMomBNcRt(:,p%DOFs%PUE(I) ) = RtHSdat%PMomBNcRt(:,p%DOFs%PUE(I) ) + TmpVec2 - p%Nacd2Iner*CoordSys%d2* &
DOT_PRODUCT( CoordSys%d2, RtHSdat%PAngVelEN(p%DOFs%PUE(I),0,:) )
ENDDO ! I - All active (enabled) DOFs that contribute to the QD2T-related linear accelerations of the nacelle center of mass (point U)
!.....................................
! FrcONcRtt and MomBNcRtt
! (requires FrcVGnRtt, MomNGnRtt, FrcWTailt, MomNTailt)
!.....................................
TmpVec1 = -p%NacMass*( p%Gravity*CoordSys%z2 + RtHSdat%LinAccEUt ) ! The portion of FrcONcRtt associated with the NacMass
TmpVec2 = CROSS_PRODUCT( RtHSdat%rOU, TmpVec1 ) ! The portion of MomBNcRtt associated with the NacMass
TmpVec3 = CROSS_PRODUCT( RtHSdat%rOV, RtHSdat%FrcVGnRtt ) ! The portion of MomBNcRtt associated with the FrcVGnRtt
TmpVec4 = CROSS_PRODUCT( RtHSdat%rOW, RtHSdat%FrcWTailt ) ! The portion of MomBNcRtt associated with the FrcWTailt
TmpVec = p%Nacd2Iner*CoordSys%d2*DOT_PRODUCT( CoordSys%d2, RtHSdat%AngVelEN ) ! = ( Nacelle inertia dyadic ) dot ( angular velocity of nacelle in the inertia frame )
RtHSdat%FrcONcRtt = RtHSdat%FrcVGnRtt + RtHSdat%FrcWTailt + TmpVec1 + (/ u%NacelleLoads%Force(1,1), u%NacelleLoads%Force(3,1), -u%NacelleLoads%Force(2,1) /)
RtHSdat%MomBNcRtt = RtHSdat%MomNGnRtt + RtHSdat%MomNTailt + TmpVec2 + TmpVec3 + TmpVec4 &
+ CROSS_PRODUCT( -RtHSdat%AngVelEN, TmpVec ) & ! = ( -angular velocity of nacelle in the inertia frame ) cross ( TmpVec ) &
- p%Nacd2Iner*CoordSys%d2*DOT_PRODUCT( CoordSys%d2, RtHSdat%AngAccENt ) &
+ (/ u%NacelleLoads%Moment(1,1), u%NacelleLoads%Moment(3,1), -u%NacelleLoads%Moment(2,1) /)
!.....................................
! PFTHydro and PMFHydro
! (requires TwrAddedMass)
!.....................................
! Compute the partial hydrodynamic forces and moments per unit length
! (including those associated with the QD2T()'s and those that are not) at the current tower element (point T) / (body F):
! NOTE: These forces are named PFTHydro, PMFHydro, FTHydrot, and MFHydrot. However, the names should not imply that the
! forces are a result of hydrodynamic contributions only. These tower forces contain contributions from any external
! load acting on the tower other than loads transmitted from aerodynamics. For example, these tower forces contain
! contributions from foundation stiffness and damping [not floating] or mooring line restoring and damping,
! as well as hydrostatic and hydrodynamic contributions [offshore].
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
RtHSdat%PFTHydro(:,J,p%DOFs%PTE(I)) = &
CoordSys%z1*( - u%TwrAddedMass(DOF_Sg,DOF_Sg,J)*RtHSdat%PLinVelET(J,p%DOFs%PTE(I),0,1) &
+ u%TwrAddedMass(DOF_Sg,DOF_Sw,J)*RtHSdat%PLinVelET(J,p%DOFs%PTE(I),0,3) &
- u%TwrAddedMass(DOF_Sg,DOF_Hv,J)*RtHSdat%PLinVelET(J,p%DOFs%PTE(I),0,2) &
- u%TwrAddedMass(DOF_Sg,DOF_R ,J)*RtHSdat%PAngVelEF(J,p%DOFs%PTE(I),0,1) &
+ u%TwrAddedMass(DOF_Sg,DOF_P ,J)*RtHSdat%PAngVelEF(J,p%DOFs%PTE(I),0,3) &
- u%TwrAddedMass(DOF_Sg,DOF_Y ,J)*RtHSdat%PAngVelEF(J,p%DOFs%PTE(I),0,2) ) &
- CoordSys%z3*( - u%TwrAddedMass(DOF_Sw,DOF_Sg,J)*RtHSdat%PLinVelET(J,p%DOFs%PTE(I),0,1) &
+ u%TwrAddedMass(DOF_Sw,DOF_Sw,J)*RtHSdat%PLinVelET(J,p%DOFs%PTE(I),0,3) &
- u%TwrAddedMass(DOF_Sw,DOF_Hv,J)*RtHSdat%PLinVelET(J,p%DOFs%PTE(I),0,2) &
- u%TwrAddedMass(DOF_Sw,DOF_R ,J)*RtHSdat%PAngVelEF(J,p%DOFs%PTE(I),0,1) &
+ u%TwrAddedMass(DOF_Sw,DOF_P ,J)*RtHSdat%PAngVelEF(J,p%DOFs%PTE(I),0,3) &
- u%TwrAddedMass(DOF_Sw,DOF_Y ,J)*RtHSdat%PAngVelEF(J,p%DOFs%PTE(I),0,2) ) &
+ CoordSys%z2*( - u%TwrAddedMass(DOF_Hv,DOF_Sg,J)*RtHSdat%PLinVelET(J,p%DOFs%PTE(I),0,1) &
+ u%TwrAddedMass(DOF_Hv,DOF_Sw,J)*RtHSdat%PLinVelET(J,p%DOFs%PTE(I),0,3) &
- u%TwrAddedMass(DOF_Hv,DOF_Hv,J)*RtHSdat%PLinVelET(J,p%DOFs%PTE(I),0,2) &
- u%TwrAddedMass(DOF_Hv,DOF_R ,J)*RtHSdat%PAngVelEF(J,p%DOFs%PTE(I),0,1) &
+ u%TwrAddedMass(DOF_Hv,DOF_P ,J)*RtHSdat%PAngVelEF(J,p%DOFs%PTE(I),0,3) &
- u%TwrAddedMass(DOF_Hv,DOF_Y ,J)*RtHSdat%PAngVelEF(J,p%DOFs%PTE(I),0,2) )
RtHSdat%PMFHydro(:,J,p%DOFs%PTE(I)) = &
CoordSys%z1*( - u%TwrAddedMass(DOF_R ,DOF_Sg,J)*RtHSdat%PLinVelET(J,p%DOFs%PTE(I),0,1) &
+ u%TwrAddedMass(DOF_R ,DOF_Sw,J)*RtHSdat%PLinVelET(J,p%DOFs%PTE(I),0,3) &
- u%TwrAddedMass(DOF_R ,DOF_Hv,J)*RtHSdat%PLinVelET(J,p%DOFs%PTE(I),0,2) &
- u%TwrAddedMass(DOF_R ,DOF_R ,J)*RtHSdat%PAngVelEF(J,p%DOFs%PTE(I),0,1) &
+ u%TwrAddedMass(DOF_R ,DOF_P ,J)*RtHSdat%PAngVelEF(J,p%DOFs%PTE(I),0,3) &
- u%TwrAddedMass(DOF_R ,DOF_Y ,J)*RtHSdat%PAngVelEF(J,p%DOFs%PTE(I),0,2) ) &
- CoordSys%z3*( - u%TwrAddedMass(DOF_P ,DOF_Sg,J)*RtHSdat%PLinVelET(J,p%DOFs%PTE(I),0,1) &
+ u%TwrAddedMass(DOF_P ,DOF_Sw,J)*RtHSdat%PLinVelET(J,p%DOFs%PTE(I),0,3) &
- u%TwrAddedMass(DOF_P ,DOF_Hv,J)*RtHSdat%PLinVelET(J,p%DOFs%PTE(I),0,2) &
- u%TwrAddedMass(DOF_P ,DOF_R ,J)*RtHSdat%PAngVelEF(J,p%DOFs%PTE(I),0,1) &
+ u%TwrAddedMass(DOF_P ,DOF_P ,J)*RtHSdat%PAngVelEF(J,p%DOFs%PTE(I),0,3) &
- u%TwrAddedMass(DOF_P ,DOF_Y ,J)*RtHSdat%PAngVelEF(J,p%DOFs%PTE(I),0,2) ) &
+ CoordSys%z2*( - u%TwrAddedMass(DOF_Y ,DOF_Sg,J)*RtHSdat%PLinVelET(J,p%DOFs%PTE(I),0,1) &
+ u%TwrAddedMass(DOF_Y ,DOF_Sw,J)*RtHSdat%PLinVelET(J,p%DOFs%PTE(I),0,3) &
- u%TwrAddedMass(DOF_Y ,DOF_Hv,J)*RtHSdat%PLinVelET(J,p%DOFs%PTE(I),0,2) &
- u%TwrAddedMass(DOF_Y ,DOF_R ,J)*RtHSdat%PAngVelEF(J,p%DOFs%PTE(I),0,1) &
+ u%TwrAddedMass(DOF_Y ,DOF_P ,J)*RtHSdat%PAngVelEF(J,p%DOFs%PTE(I),0,3) &
- u%TwrAddedMass(DOF_Y ,DOF_Y ,J)*RtHSdat%PAngVelEF(J,p%DOFs%PTE(I),0,2) )
END DO ! I - All active (enabled) DOFs that contribute to the QD2T-related linear accelerations of the tower
END DO !J
!.....................................
! FTHydrot and MFHydrot
! (requires TwrAddedMass)
!.....................................
DO J=1,p%TwrNodes
RtHSdat%FTHydrot(:,J) = CoordSys%z1*( u%TowerPtLoads%Force(DOF_Sg,J)/abs(p%DHNodes(J)) &
- u%TwrAddedMass(DOF_Sg,DOF_Sg,J)*RtHSdat%LinAccETt(1,J) &
+ u%TwrAddedMass(DOF_Sg,DOF_Sw,J)*RtHSdat%LinAccETt(3,J) &
- u%TwrAddedMass(DOF_Sg,DOF_Hv,J)*RtHSdat%LinAccETt(2,J) &
- u%TwrAddedMass(DOF_Sg,DOF_R ,J)*RtHSdat%AngAccEFt(1,J) &
+ u%TwrAddedMass(DOF_Sg,DOF_P ,J)*RtHSdat%AngAccEFt(3,J) &
- u%TwrAddedMass(DOF_Sg,DOF_Y ,J)*RtHSdat%AngAccEFt(2,J) ) &
- CoordSys%z3*( u%TowerPtLoads%Force(DOF_Sw,J)/abs(p%DHNodes(J)) &
- u%TwrAddedMass(DOF_Sw,DOF_Sg,J)*RtHSdat%LinAccETt(1,J) &
+ u%TwrAddedMass(DOF_Sw,DOF_Sw,J)*RtHSdat%LinAccETt(3,J) &
- u%TwrAddedMass(DOF_Sw,DOF_Hv,J)*RtHSdat%LinAccETt(2,J) &
- u%TwrAddedMass(DOF_Sw,DOF_R ,J)*RtHSdat%AngAccEFt(1,J) &
+ u%TwrAddedMass(DOF_Sw,DOF_P ,J)*RtHSdat%AngAccEFt(3,J) &
- u%TwrAddedMass(DOF_Sw,DOF_Y ,J)*RtHSdat%AngAccEFt(2,J) ) &
+ CoordSys%z2*( u%TowerPtLoads%Force(DOF_Hv,J)/abs(p%DHNodes(J)) &
- u%TwrAddedMass(DOF_Hv,DOF_Sg,J)*RtHSdat%LinAccETt(1,J) &
+ u%TwrAddedMass(DOF_Hv,DOF_Sw,J)*RtHSdat%LinAccETt(3,J) &
- u%TwrAddedMass(DOF_Hv,DOF_Hv,J)*RtHSdat%LinAccETt(2,J) &
- u%TwrAddedMass(DOF_Hv,DOF_R ,J)*RtHSdat%AngAccEFt(1,J) &
+ u%TwrAddedMass(DOF_Hv,DOF_P ,J)*RtHSdat%AngAccEFt(3,J) &
- u%TwrAddedMass(DOF_Hv,DOF_Y ,J)*RtHSdat%AngAccEFt(2,J) )
RtHSdat%MFHydrot(:,J) = CoordSys%z1*( u%TowerPtLoads%Moment(DOF_R-3,J)/abs(p%DHNodes(J)) &
- u%TwrAddedMass(DOF_R ,DOF_Sg,J)*RtHSdat%LinAccETt(1,J) &
+ u%TwrAddedMass(DOF_R ,DOF_Sw,J)*RtHSdat%LinAccETt(3,J) &
- u%TwrAddedMass(DOF_R ,DOF_Hv,J)*RtHSdat%LinAccETt(2,J) &
- u%TwrAddedMass(DOF_R ,DOF_R ,J)*RtHSdat%AngAccEFt(1,J) &
+ u%TwrAddedMass(DOF_R ,DOF_P ,J)*RtHSdat%AngAccEFt(3,J) &
- u%TwrAddedMass(DOF_R ,DOF_Y ,J)*RtHSdat%AngAccEFt(2,J) ) &
- CoordSys%z3*( u%TowerPtLoads%Moment(DOF_P-3 ,J)/abs(p%DHNodes(J)) &
- u%TwrAddedMass(DOF_P ,DOF_Sg,J)*RtHSdat%LinAccETt(1,J) &
+ u%TwrAddedMass(DOF_P ,DOF_Sw,J)*RtHSdat%LinAccETt(3,J) &
- u%TwrAddedMass(DOF_P ,DOF_Hv,J)*RtHSdat%LinAccETt(2,J) &
- u%TwrAddedMass(DOF_P ,DOF_R ,J)*RtHSdat%AngAccEFt(1,J) &
+ u%TwrAddedMass(DOF_P ,DOF_P ,J)*RtHSdat%AngAccEFt(3,J) &
- u%TwrAddedMass(DOF_P ,DOF_Y ,J)*RtHSdat%AngAccEFt(2,J) ) &
+ CoordSys%z2*( u%TowerPtLoads%Moment(DOF_Y-3 ,J)/abs(p%DHNodes(J)) &
- u%TwrAddedMass(DOF_Y ,DOF_Sg,J)*RtHSdat%LinAccETt(1,J) &
+ u%TwrAddedMass(DOF_Y ,DOF_Sw,J)*RtHSdat%LinAccETt(3,J) &
- u%TwrAddedMass(DOF_Y ,DOF_Hv,J)*RtHSdat%LinAccETt(2,J) &
- u%TwrAddedMass(DOF_Y ,DOF_R ,J)*RtHSdat%AngAccEFt(1,J) &
+ u%TwrAddedMass(DOF_Y ,DOF_P ,J)*RtHSdat%AngAccEFt(3,J) &
- u%TwrAddedMass(DOF_Y ,DOF_Y ,J)*RtHSdat%AngAccEFt(2,J) )
END DO !J
!.....................................
! PFrcT0Trb and PMomX0Trb
! (requires PFrcONcRt, PMomBNcRt, PFrcT0Trb, PMomX0Trb, PFTHydro, PMFHydro)
!.....................................
! Initialize the partial forces and moments (including those associated
! with the QD2T()'s and those that are not) at the tower base (point T(0)) using everything but the tower:
RtHSdat%PFrcT0Trb = RtHSdat%PFrcONcRt ! Initialize these partial forces and moments
RtHSdat%PMomX0Trb = RtHSdat%PMomBNcRt ! using all of the effects above the yaw bearing
DO I = 1,p%DOFs%NActvDOF ! Loop through all active (enabled) DOFs
TmpVec = CROSS_PRODUCT( RtHSdat%rT0O, RtHSdat%PFrcONcRt(:,p%DOFs%SrtPS(I)) ) ! The portion of PMomX0Trb associated with the PFrcONcRt
RtHSdat%PMomX0Trb(:,p%DOFs%SrtPS(I)) = RtHSdat%PMomX0Trb(:,p%DOFs%SrtPS(I)) + TmpVec
ENDDO ! I - All active (enabled) DOFs
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
ENDDO ! I - All active (enabled) DOFs that contribute to the QD2T-related linear accelerations of the yaw bearing center of mass (point O)
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
! Integrate to find the total partial forces and moments (including those
! associated with the QD2T()'s and those that are not) at the tower base (point T(0)):
DO J=1,p%TwrNodes
DO I = 1,p%DOFs%NPTE ! Loop through all active (enabled) DOFs that contribute to the QD2T-related linear accelerations of the tower
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
ENDDO ! I - All active (enabled) DOFs that contribute to the QD2T-related linear accelerations of the tower
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 !J
!.....................................
! PFZHydro and PMXHydro
! ( requires PtfmAddedMass )
!.....................................
!..................................................................................................................................
! Compute the partial platform forces and moments (including those associated with the QD2T()'s and those that are not) at the
! platform reference (point Z) / (body X).
!
! NOTE: These forces are named PFZHydro, PMXHydro, FZHydrot, and MXHydrot. However, the names should not imply that the forces
! are a result of hydrodynamic contributions only. These platform forces contain contributions from any external load acting
! on the platform other than loads transmitted from the wind turbine. For example, these platform forces contain contributions
! from foundation stiffness and damping [not floating] or mooring line restoring and damping [floating], as well as hydrostatic
! and hydrodynamic contributions [offshore].
!bjj: m%RtHS%PFZHydro, %PMXHydro, %FZHydrot, and %MXHydrot are not used in the output routine anymore
! (because of their dependence on inputs, u)
RtHSdat%PFZHydro = 0.0
RtHSdat%PMXHydro = 0.0
DO I = 1,p%DOFs%NPYE ! Loop through all active (enabled) DOFs that contribute to the QD2T-related linear accelerations of the platform center of mass (point Y)
RtHSdat%PFZHydro(p%DOFs%PYE(I),:) = - u%PtfmAddedMass(DOF_Sg,p%DOFs%PYE(I))*RtHSdat%PLinVelEZ(DOF_Sg,0,:) &
- u%PtfmAddedMass(DOF_Sw,p%DOFs%PYE(I))*RtHSdat%PLinVelEZ(DOF_Sw,0,:) &
- u%PtfmAddedMass(DOF_Hv,p%DOFs%PYE(I))*RtHSdat%PLinVelEZ(DOF_Hv,0,:)
RtHSdat%PMXHydro(p%DOFs%PYE(I),:) = - u%PtfmAddedMass(DOF_R ,p%DOFs%PYE(I))*RtHSdat%PAngVelEX(DOF_R ,0,:) &
- u%PtfmAddedMass(DOF_P ,p%DOFs%PYE(I))*RtHSdat%PAngVelEX(DOF_P ,0,:) &
- u%PtfmAddedMass(DOF_Y ,p%DOFs%PYE(I))*RtHSdat%PAngVelEX(DOF_Y ,0,:)
ENDDO ! I - All active (enabled) DOFs that contribute to the QD2T-related linear accelerations of the platform center of mass (point Y)
RtHSdat%FZHydrot = u%PlatformPtMesh%Force(DOF_Sg,1)*RtHSdat%PLinVelEZ(DOF_Sg,0,:) &
+ u%PlatformPtMesh%Force(DOF_Sw,1)*RtHSdat%PLinVelEZ(DOF_Sw,0,:) &
+ u%PlatformPtMesh%Force(DOF_Hv,1)*RtHSdat%PLinVelEZ(DOF_Hv,0,:)
RtHSdat%MXHydrot = u%PlatformPtMesh%Moment(DOF_R-3,1)*RtHSdat%PAngVelEX(DOF_R ,0,:) &
+ u%PlatformPtMesh%Moment(DOF_P-3,1)*RtHSdat%PAngVelEX(DOF_P ,0,:) &
+ u%PlatformPtMesh%Moment(DOF_Y-3,1)*RtHSdat%PAngVelEX(DOF_Y ,0,:)
!.....................................
! PFrcZAll and PMomXAll
! (requires PFrcT0Trb, PMomX0Trb, PFZHydro, PMXHydro )
!.....................................
! Define the partial forces and moments (including those associated with the QD2T()'s and those that are not) at the
! platform reference (point Z) / (body X) using the turbine and platform effects:
RtHSdat%PFrcZAll = RtHSdat%PFrcT0Trb ! Initialize these partial forces and moments
RtHSdat%PMomXAll = RtHSdat%PMomX0Trb ! using the effects from the wind turbine
DO I = 1,p%DOFs%NActvDOF ! Loop through all active (enabled) DOFs
TmpVec = CROSS_PRODUCT( RtHSdat%rZT0, RtHSdat%PFrcT0Trb(:,p%DOFs%SrtPS(I)) ) ! The portion of PMomXAll associated with the PFrcT0Trb
RtHSdat%PMomXAll(:,p%DOFs%SrtPS(I)) = RtHSdat%PMomXAll(:,p%DOFs%SrtPS(I)) + TmpVec
ENDDO ! I - All active (enabled) DOFs
DO I = 1,p%DOFs%NPYE ! Loop through all active (enabled) DOFs that contribute to the QD2T-related linear accelerations of the platform center of mass (point Y)
TmpVec1 = -p%PtfmMass*RtHSdat%PLinVelEY(p%DOFs%PYE(I),0,:) ! The portion of PFrcZAll associated with the PtfmMass
TmpVec2 = CROSS_PRODUCT( RtHSdat%rZY , TmpVec1 ) ! The portion of PMomXAll associated with the PtfmMass
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,:) )
ENDDO ! I - All active (enabled) DOFs that contribute to the QD2T-related linear accelerations of the platform center of mass (point Y)
!.....................................
! FrcZAllt and MomXAllt
! (requires FrcT0Trbt, MomX0Trbt)
!.....................................
TmpVec1 = -p%PtfmMass*( p%Gravity*CoordSys%z2 + RtHSdat%LinAccEYt ) ! The portion of FrcZAllt associated with the PtfmMass
TmpVec2 = CROSS_PRODUCT( RtHSdat%rZY , TmpVec1 ) ! The portion of MomXAllt associated with the PtfmMass
TmpVec3 = CROSS_PRODUCT( RtHSdat%rZT0 , RtHSdat%FrcT0Trbt ) ! The portion of MomXAllt associated with the FrcT0Trbt
TmpVec = p%PtfmRIner*CoordSys%a1*DOT_PRODUCT( CoordSys%a1, RtHSdat%AngVelEX ) & ! = ( Platform inertia dyadic ) dot ( angular velocity of platform in the inertia frame )
+ 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 ) ! = ( -angular velocity of platform in the inertia frame ) cross ( TmpVec )
RtHSdat%FrcZAllt = RtHSdat%FrcT0Trbt + RtHSdat%FZHydrot + TmpVec1
RtHSdat%MomXAllt = RtHSdat%MomX0Trbt + RtHSdat%MXHydrot + TmpVec2 + TmpVec3 + TmpVec4
END SUBROUTINE CalculateForcesMoments
```

View File

@ -0,0 +1,143 @@
```fortran
SUBROUTINE CalculatePositions( p, x, CoordSys, RtHSdat )
!..................................................................................................................................
! Passed variables
TYPE(ED_ParameterType), INTENT(IN ) :: p !< Parameters
TYPE(ED_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at Time
TYPE(ED_CoordSys), INTENT(IN ) :: CoordSys !< The coordinate systems that have been set for these states/time
TYPE(ED_RtHndSide), INTENT(INOUT) :: RtHSdat !< data from the RtHndSid module (contains positions to be set)
!Local variables
!REAL(R8Ki) :: rQ (3) ! Position vector from inertial frame origin to apex of rotation (point Q).
INTEGER(IntKi) :: J ! Counter for elements
INTEGER(IntKi) :: K ! Counter for blades
!-------------------------------------------------------------------------------------------------
! Positions
!-------------------------------------------------------------------------------------------------
! Define the position vectors between the various points on the wind turbine
! that are not dependent on the distributed tower or blade parameters:
RtHSdat%rZ = x%QT(DOF_Sg)* CoordSys%z1 + x%QT(DOF_Hv)* CoordSys%z2 - x%QT(DOF_Sw)* CoordSys%z3 ! Position vector from inertia frame origin to platform reference (point Z).
RtHSdat%rZY = p%rZYzt* CoordSys%a2 + p%PtfmCMxt*CoordSys%a1 - p%PtfmCMyt*CoordSys%a3 ! Position vector from platform reference (point Z) to platform mass center (point Y).
RtHSdat%rZT0 = p%rZT0zt* CoordSys%a2 ! Position vector from platform reference (point Z) to tower base (point T(0))
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
RtHSdat%rOU = p%NacCMxn*CoordSys%d1 + p%NacCMzn *CoordSys%d2 - p%NacCMyn *CoordSys%d3 ! Position vector from tower-top / base plate (point O) to nacelle center of mass (point U).
RtHSdat%rOV = p%RFrlPnt_n(1)*CoordSys%d1 + p%RFrlPnt_n(3)*CoordSys%d2 - p%RFrlPnt_n(2)*CoordSys%d3 ! Position vector from tower-top / base plate (point O) to specified point on rotor-furl axis (point V).
RtHSdat%rVIMU = p%rVIMUxn*CoordSys%rf1 + p%rVIMUzn *CoordSys%rf2 - p%rVIMUyn *CoordSys%rf3 ! Position vector from specified point on rotor-furl axis (point V) to nacelle IMU (point IMU).
RtHSdat%rVD = p%rVDxn*CoordSys%rf1 + p%rVDzn *CoordSys%rf2 - p%rVDyn *CoordSys%rf3 ! Position vector from specified point on rotor-furl axis (point V) to center of mass of structure that furls with the rotor (not including rotor) (point D).
RtHSdat%rVP = p%rVPxn*CoordSys%rf1 + p%rVPzn *CoordSys%rf2 - p%rVPyn *CoordSys%rf3 + p%OverHang*CoordSys%c1 ! Position vector from specified point on rotor-furl axis (point V) to teeter pin (point P).
RtHSdat%rPQ = -p%UndSling*CoordSys%g1 ! Position vector from teeter pin (point P) to apex of rotation (point Q).
RtHSdat%rQC = p%HubCM*CoordSys%g1 ! Position vector from apex of rotation (point Q) to hub center of mass (point C).
RtHSdat%rOW = p%TFrlPnt_n(1)*CoordSys%d1 + p%TFrlPnt_n(3) *CoordSys%d2 - p%TFrlPnt_n(2)*CoordSys%d3 ! Position vector from tower-top / base plate (point O) to specified point on tail-furl axis (point W).
RtHSdat%rWI = p%rWIxn*CoordSys%tf1 + p%rWIzn*CoordSys%tf2 - p%rWIyn*CoordSys%tf3 ! Position vector from specified point on tail-furl axis (point W) to tail boom center of mass (point I).
RtHSdat%rWJ = p%rWJxn*CoordSys%tf1 + p%rWJzn*CoordSys%tf2 - p%rWJyn*CoordSys%tf3 ! Position vector from specified point on tail-furl axis (point W) to tail fin center of mass (point J).
RtHSdat%rPC = RtHSdat%rPQ + RtHSdat%rQC ! Position vector from teeter pin (point P) to hub center of mass (point C).
RtHSdat%rT0O = RtHSdat%rZO - RtHSdat%rZT0 ! Position vector from the tower base (point T(0)) to tower-top / base plate (point O).
RtHSdat%rO = RtHSdat%rZ + RtHSdat%rZO ! Position vector from inertial frame origin to tower-top / base plate (point O).
RtHSdat%rV = RtHSdat%rO + RtHSdat%rOV ! Position vector from inertial frame origin to specified point on rotor-furl axis (point V)
!RtHSdat%rP = RtHSdat%rO + RtHSdat%rOV + RtHSdat%rVP ! Position vector from inertial frame origin to teeter pin (point P).
RtHSdat%rP = RtHSdat%rV + RtHSdat%rVP ! Position vector from inertial frame origin to teeter pin (point P).
RtHSdat%rQ = RtHSdat%rP + RtHSdat%rPQ ! Position vector from inertial frame origin to apex of rotation (point Q).
RtHSdat%rJ = RtHSdat%rO + RtHSdat%rOW + RtHSdat%rWJ ! Position vector from inertial frame origin to tail fin center of mass (point J).
DO K = 1,p%NumBl ! Loop through all blades
! Calculate the position vector of the tip:
RtHSdat%rS0S(:,K,p%TipNode) = ( p%TwistedSF(K,1,1,p%TipNode,0)*x%QT( DOF_BF(K,1) ) & ! Position vector from the blade root (point S(0)) to the blade tip (point S(p%BldFlexL)).
+ p%TwistedSF(K,1,2,p%TipNode,0)*x%QT( DOF_BF(K,2) ) &
+ p%TwistedSF(K,1,3,p%TipNode,0)*x%QT( DOF_BE(K,1) ) )*CoordSys%j1(K,:) &
+ ( p%TwistedSF(K,2,1,p%TipNode,0)*x%QT( DOF_BF(K,1) ) &
+ p%TwistedSF(K,2,2,p%TipNode,0)*x%QT( DOF_BF(K,2) ) &
+ p%TwistedSF(K,2,3,p%TipNode,0)*x%QT( DOF_BE(K,1) ) )*CoordSys%j2(K,:) &
+ ( p%BldFlexL - 0.5* &
( p%AxRedBld(K,1,1,p%TipNode)*x%QT( DOF_BF(K,1) )*x%QT( DOF_BF(K,1) ) &
+ p%AxRedBld(K,2,2,p%TipNode)*x%QT( DOF_BF(K,2) )*x%QT( DOF_BF(K,2) ) &
+ p%AxRedBld(K,3,3,p%TipNode)*x%QT( DOF_BE(K,1) )*x%QT( DOF_BE(K,1) ) &
+ 2.*p%AxRedBld(K,1,2,p%TipNode)*x%QT( DOF_BF(K,1) )*x%QT( DOF_BF(K,2) ) &
+ 2.*p%AxRedBld(K,2,3,p%TipNode)*x%QT( DOF_BF(K,2) )*x%QT( DOF_BE(K,1) ) &
+ 2.*p%AxRedBld(K,1,3,p%TipNode)*x%QT( DOF_BF(K,1) )*x%QT( DOF_BE(K,1) ) ) )*CoordSys%j3(K,:)
RtHSdat%rQS (:,K,p%TipNode) = RtHSdat%rS0S(:,K,p%TipNode) + p%HubRad*CoordSys%j3(K,:) ! Position vector from apex of rotation (point Q) to the blade tip (point S(p%BldFlexL)).
RtHSdat%rS (:,K,p%TipNode) = RtHSdat%rQS (:,K,p%TipNode) + RtHSdat%rQ ! Position vector from inertial frame origin to the blade tip (point S(p%BldFlexL)).
! position vectors for blade root node:
RtHSdat%rQS (:,K,0) = p%HubRad*CoordSys%j3(K,:)
RtHSdat%rS (:,K,0) = p%HubRad*CoordSys%j3(K,:) + RtHSdat%rQ
! Calculate the position vector from the teeter pin to the blade root:
RtHSdat%rPS0(:,K) = RtHSdat%rPQ + p%HubRad*CoordSys%j3(K,:) ! Position vector from teeter pin (point P) to blade root (point S(0)).
DO J = 1,p%BldNodes ! Loop through the blade nodes / elements
! Calculate the position vector of the current node:
RtHSdat%rS0S(:,K,J) = ( p%TwistedSF(K,1,1,J,0)*x%QT( DOF_BF(K,1) ) & ! Position vector from the blade root (point S(0)) to the current node (point S(RNodes(J)).
+ p%TwistedSF(K,1,2,J,0)*x%QT( DOF_BF(K,2) ) &
+ p%TwistedSF(K,1,3,J,0)*x%QT( DOF_BE(K,1) ) )*CoordSys%j1(K,:) &
+ ( p%TwistedSF(K,2,1,J,0)*x%QT( DOF_BF(K,1) ) &
+ p%TwistedSF(K,2,2,J,0)*x%QT( DOF_BF(K,2) ) &
+ p%TwistedSF(K,2,3,J,0)*x%QT( DOF_BE(K,1) ) )*CoordSys%j2(K,:) &
+ ( p%RNodes(J) - 0.5* &
( p%AxRedBld(K,1,1,J)*x%QT( DOF_BF(K,1) )*x%QT( DOF_BF(K,1) ) &
+ p%AxRedBld(K,2,2,J)*x%QT( DOF_BF(K,2) )*x%QT( DOF_BF(K,2) ) &
+ p%AxRedBld(K,3,3,J)*x%QT( DOF_BE(K,1) )*x%QT( DOF_BE(K,1) ) &
+ 2.0*p%AxRedBld(K,1,2,J)*x%QT( DOF_BF(K,1) )*x%QT( DOF_BF(K,2) ) &
+ 2.0*p%AxRedBld(K,2,3,J)*x%QT( DOF_BF(K,2) )*x%QT( DOF_BE(K,1) ) &
+ 2.0*p%AxRedBld(K,1,3,J)*x%QT( DOF_BF(K,1) )*x%QT( DOF_BE(K,1) ) ) )*CoordSys%j3(K,:)
RtHSdat%rQS (:,K,J) = RtHSdat%rS0S(:,K,J) + p%HubRad*CoordSys%j3(K,:) ! Position vector from apex of rotation (point Q) to the current node (point S(RNodes(J)).
RtHSdat%rS (:,K,J) = RtHSdat%rQS (:,K,J) + RtHSdat%rQ ! Position vector from inertial frame origin to the current node (point S(RNodes(J)).
END DO !J = 1,p%BldNodes ! Loop through the blade nodes / elements
END DO !K = 1,p%NumBl
!----------------------------------------------------------------------------------------------------
! Get the tower element positions
!----------------------------------------------------------------------------------------------------
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
END SUBROUTINE CalculatePositions
```

View File

@ -0,0 +1,678 @@
```fortran
SUBROUTINE Coeff(p,InputFileData, ErrStat, ErrMsg)
!..................................................................................................................................
! Passed variables
TYPE(ED_ParameterType), INTENT(INOUT) :: p !< Parameters of the structural dynamics module
TYPE(ED_InputFile), INTENT(IN) :: InputFileData !< all the data in the ElastoDyn input file
INTEGER(IntKi), INTENT(OUT) :: ErrStat !< Error status
CHARACTER(*), INTENT(OUT) :: ErrMsg !< Error message when ErrStat =/ ErrID_None
! Local variables.
REAL(ReKi) :: AxRdBld (3,3) ! Temporary result holding the current addition to the p%AxRedBld() array.
REAL(ReKi) :: AxRdBldOld(3,3) ! Previous AxRdBld (i.e., AxRdBld from the previous node)
REAL(ReKi) :: AxRdTFA (2,2) ! Temporary result holding the current addition to the AxRedTFA() array.
REAL(ReKi) :: AxRdTFAOld(2,2) ! Previous AxRdTFA (i.e., AxRdTFA from the previous node)
REAL(ReKi) :: AxRdTSS (2,2) ! Temporary result holding the current addition to the AxRedTSS() array.
REAL(ReKi) :: AxRdTSSOld(2,2) ! Previous AxRdTSS (i.e., AxRdTSS from the previous node)
REAL(ReKi) :: TmpDist ! Temporary distance used in the calculation of the aero center locations.
REAL(ReKi) :: TmpDistj1 ! Temporary distance used in the calculation of the aero center locations.
REAL(ReKi) :: TmpDistj2 ! Temporary distance used in the calculation of the aero center locations.
REAL(ReKi) :: ElmntStff ! (Temporary) stiffness of an element.
REAL(ReKi) :: ElStffFA ! (Temporary) tower fore-aft stiffness of an element
REAL(ReKi) :: ElStffSS ! (Temporary) tower side-to-side stiffness of an element
REAL(ReKi) :: FMomAbvNd (p%NumBl,p%BldNodes) ! FMomAbvNd(K,J) = portion of the first moment of blade K about the rotor centerline (not root, like FirstMom(K)) associated with everything above node J (including tip brake masses).
REAL(ReKi) :: KBECent (p%NumBl,1,1) ! Centrifugal-term of generalized edgewise stiffness of the blades.
REAL(ReKi) :: KBFCent (p%NumBl,2,2) ! Centrifugal-term of generalized flapwise stiffness of the blades.
REAL(ReKi) :: KTFAGrav (2,2) ! Gravitational-term of generalized fore-aft stiffness of the tower.
REAL(ReKi) :: KTSSGrav (2,2) ! Gravitational-term of generalized side-to-side stiffness of the tower.
REAL(ReKi) :: MBE (p%NumBl,1,1) ! Generalized edgewise mass of the blades.
REAL(ReKi) :: MBF (p%NumBl,2,2) ! Generalized flapwise mass of the blades.
REAL(ReKi) :: MTFA (2,2) ! Generalized fore-aft mass of the tower.
REAL(ReKi) :: MTSS (2,2) ! Generalized side-to-side mass of the tower.
REAL(ReKi) :: Shape ! Temporary result holding a value from the SHP function
REAL(ReKi) :: Shape1 ! Temporary result holding a value from the SHP function
REAL(ReKi) :: Shape2 ! Temporary result holding a value from the SHP function
REAL(ReKi) :: TMssAbvNd (p%TwrNodes) ! Portion of the tower mass associated with everything above node J (including tower-top effects)
REAL(ReKi) :: TwstdSF (2,3,0:1) ! Temperory result holding the current addition to the TwistedSF() array.
REAL(ReKi) :: TwstdSFOld(2,3,0:1) ! Previous TwstdSF (i.e., TwstdSF from the previous node)
INTEGER(IntKi) :: I ! Generic index.
INTEGER(IntKi) :: J ! Loops through nodes / elements.
INTEGER(IntKi) :: K ! Loops through blades.
INTEGER(IntKi) :: L ! Generic index
ErrStat = ErrID_None
ErrMsg = ''
!...............................................................................................................................
! Calculate the distances from point S on a blade to the aerodynamic center in the j1 and j2 directions:
!...............................................................................................................................
DO K = 1,p%NumBl ! Loop through the blades
DO J = 1,p%BldNodes ! Loop through the blade nodes / elements
TmpDist = ( 0.25 - p%PitchAxis(K,J) )*p%Chord(J) ! Distance along the chordline from point S (25% chord) to the aerodynamic center of the blade element J--positive towards the trailing edge.
TmpDistj1 = TmpDist*p%SAeroTwst(J) ! Distance along the j1-axis from point S (25% chord) to the aerodynamic center of the blade element J
TmpDistj2 = TmpDist*p%CAeroTwst(J) ! Distance along the j2-axis from point S (25% chord) to the aerodynamic center of the blade element J
p%rSAerCenn1(K,J) = TmpDistj1*p%CThetaS(K,J) - TmpDistj2*p%SThetaS(K,J)
p%rSAerCenn2(K,J) = TmpDistj1*p%SThetaS(K,J) + TmpDistj2*p%CThetaS(K,J)
ENDDO ! J - Blade nodes / elements
ENDDO ! K - Blades
!...............................................................................................................................
! Calculate the structure that furls with the rotor inertia term:
!...............................................................................................................................
p%RrfaIner = InputFileData%RFrlIner - p%RFrlMass*( (p%rVDxn**2 )*( 1.0 - p%CRFrlSkw2*p%CRFrlTlt2 ) &
+ (p%rVDzn**2 )* p%CRFrlTlt2 &
+ (p%rVDyn**2 )*( 1.0 - p%SRFrlSkw2*p%CRFrlTlt2 ) &
- 2.0*p%rVDxn*p%rVDzn* p%CRFrlSkew*p%CSRFrlTlt &
- 2.0*p%rVDxn*p%rVDyn* p%CSRFrlSkw*p%CRFrlTlt2 &
- 2.0*p%rVDzn*p%rVDyn* p%SRFrlSkew*p%CSRFrlTlt )
IF ( p%RrfaIner < 0.0 ) THEN
ErrStat = ErrID_Fatal
ErrMsg = ' RFrlIner must not be less than RFrlMass*( perpendicular distance between rotor-furl'// &
' axis and CM of the structure that furls with the rotor [not including rotor] )^2.'
RETURN
END IF
!...............................................................................................................................
! Calculate the tail boom inertia term:
!...............................................................................................................................
p%AtfaIner = p%TFrlIner - p%BoomMass*( p%rWIxn*p%rWIxn*( 1.0 - p%CTFrlSkw2*p%CTFrlTlt2 ) &
+ p%rWIzn*p%rWIzn* p%CTFrlTlt2 &
+ p%rWIyn*p%rWIyn*( 1.0 - p%STFrlSkw2*p%CTFrlTlt2 ) &
- 2.0*p%rWIxn*p%rWIzn* p%CTFrlSkew*p%CSTFrlTlt &
- 2.0*p%rWIxn*p%rWIyn* p%CSTFrlSkw*p%CTFrlTlt2 &
- 2.0*p%rWIzn*p%rWIyn* p%STFrlSkew*p%CSTFrlTlt )
IF ( p%AtfaIner < 0.0 ) THEN
ErrStat = ErrID_Fatal
ErrMsg = ' TFrlIner must not be less than BoomMass*( perpendicular distance between tail-furl'// &
' axis and tail boom CM )^2.'
RETURN
ENDIF
!...............................................................................................................................
! Calculate the nacelle inertia terms:
!...............................................................................................................................
p%Nacd2Iner = InputFileData%NacYIner - p%NacMass*( p%NacCMxn**2 + p%NacCMyn**2 ) ! Nacelle inertia about the d2-axis
IF ( p%Nacd2Iner < 0.0 ) THEN
ErrStat = ErrID_Fatal
ErrMsg = ' NacYIner must not be less than NacMass*( NacCMxn^2 + NacCMyn^2 ).'
RETURN
END IF
! Calculate hub inertia about its centerline passing through its c.g..
! This calculation assumes that the hub for a 2-blader is essentially
! a uniform cylinder whose centerline is transverse through the cylinder
! passing through its c.g.. That is, for a 2-blader, Hubg1Iner =
! Hubg2Iner is the inertia of the hub about both the g1- and g2- axes. For
! 3-bladers, Hubg1Iner is simply equal to HubIner and Hubg2Iner is zero.
! Also, Initialize RotMass and RotIner to associated hub properties:
IF ( p%NumBl == 2 ) THEN ! 2-blader
p%Hubg1Iner = ( InputFileData%HubIner - p%HubMass*( ( p%UndSling - p%HubCM )**2 ) )/( p%CosDel3**2 )
p%Hubg2Iner = p%Hubg1Iner
IF ( p%Hubg1Iner < 0.0 ) THEN
ErrStat = ErrID_Fatal
ErrMsg = ' HubIner must not be less than HubMass*( UndSling - HubCM )^2 for 2-blader.'
RETURN
END IF
ELSE ! 3-blader
p%Hubg1Iner = InputFileData%HubIner
p%Hubg2Iner = 0.0
ENDIF
p%RotMass = p%HubMass
p%RotIner = p%Hubg1Iner
!...............................................................................................................................
! Initialize several variables to 0.0:
p%KBF = 0.0
p%KBE = 0.0
KBFCent = 0.0
KBECent = 0.0
p%TwrMass = 0.0
p%KTFA = 0.0
p%KTSS = 0.0
KTFAGrav = 0.0
KTSSGrav = 0.0
DO K = 1,p%NumBl ! Loop through the blades
! Initialize BldMass(), FirstMom(), and SecondMom() using TipMass() effects:
p%BldMass (K) = p%TipMass(K)
p%FirstMom (K) = p%TipMass(K)*p%BldFlexL
p%SecondMom(K) = p%TipMass(K)*p%BldFlexL*p%BldFlexL
DO J = p%BldNodes,1,-1 ! Loop through the blade nodes / elements in reverse
! Calculate the mass of the current element
p%BElmntMass(J,K) = p%MassB(K,J)*p%DRNodes(J) ! Mass of blade element J
! Integrate to find some blade properties which will be output in .fsm
p%BldMass (K) = p%BldMass (K) + p%BElmntMass(J,K)
p%FirstMom (K) = p%FirstMom (K) + p%BElmntMass(J,K)*p%RNodes(J)
p%SecondMom(K) = p%SecondMom(K) + p%BElmntMass(J,K)*p%RNodes(J)*p%RNodes(J)
! Integrate to find FMomAbvNd:
FMomAbvNd (K,J) = ( 0.5*p%BElmntMass(J,K) )*( p%HubRad + p%RNodes(J ) + 0.5*p%DRNodes(J ) )
IF ( J == p%BldNodes ) THEN ! Outermost blade element
! Add the TipMass() effects:
FMomAbvNd(K,J) = FmomAbvNd(K,J) + p%TipMass(K)*p%TipRad
ELSE ! All other blade elements
! Add to FMomAbvNd(K,J) the effects from the (not yet used) portion of element J+1
FMomAbvNd(K,J) = FMomAbvNd(K,J) + FMomAbvNd(K,J+1) &
+ ( 0.5*p%BElmntMass(J+1,K) )*( p%HubRad + p%RNodes(J+1) - 0.5*p%DRNodes(J+1) )
ENDIF
ENDDO ! J - Blade nodes / elements in reverse
IF (.NOT. p%BD4Blades) THEN
! Calculate BldCG() using FirstMom() and BldMass(); and calculate
! RotMass and RotIner:
p%BldCG (K) = p%FirstMom (K) / p%BldMass (K)
p%RotMass = p%RotMass + p%BldMass (K)
p%RotIner = p%RotIner + ( p%SecondMom(K) + p%BldMass (K)*p%HubRad*( 2.0*p%BldCG(K) + p%HubRad ) )*( p%CosPreC(K)**2 )
END IF
ENDDO ! K - Blades
DO K = 1,p%NumBl ! Loop through the blades
! Initialize the generalized blade masses using tip mass effects:
MBF(K,1,1) = p%TipMass(K)
MBF(K,2,2) = p%TipMass(K)
MBE(K,1,1) = p%TipMass(K)
DO J = 1,p%BldNodes ! Loop through the blade nodes / elements
! Integrate to find the generalized mass of the blade (including tip mass effects).
! Ignore the cross-correlation terms of MBF (i.e. MBF(i,j) where i /= j) since
! these terms will never be used.
Shape1 = SHP( p%RNodesNorm(J), p%BldFlexL, p%BldFl1Sh(:,K), 0, ErrStat, ErrMsg )
Shape2 = SHP( p%RNodesNorm(J), p%BldFlexL, p%BldFl2Sh(:,K), 0, ErrStat, ErrMsg )
MBF (K,1,1) = MBF (K,1,1) + p%BElmntMass(J,K)*Shape1*Shape1
MBF (K,2,2) = MBF (K,2,2) + p%BElmntMass(J,K)*Shape2*Shape2
Shape = SHP( p%RNodesNorm(J), p%BldFlexL, p%BldEdgSh(:,K), 0, ErrStat, ErrMsg )
MBE (K,1,1) = MBE (K,1,1) + p%BElmntMass(J,K)*Shape *Shape
! Integrate to find the generalized stiffness of the blade (not including centrifugal
! effects).
ElmntStff = p%StiffBF(K,J)*p%DRNodes(J) ! Flapwise stiffness of blade element J
Shape1 = SHP( p%RNodesNorm(J), p%BldFlexL, p%BldFl1Sh(:,K), 2, ErrStat, ErrMsg )
Shape2 = SHP( p%RNodesNorm(J), p%BldFlexL, p%BldFl2Sh(:,K), 2, ErrStat, ErrMsg )
p%KBF (K,1,1) = p%KBF (K,1,1) + ElmntStff*Shape1*Shape1
p%KBF (K,1,2) = p%KBF (K,1,2) + ElmntStff*Shape1*Shape2
p%KBF (K,2,1) = p%KBF (K,2,1) + ElmntStff*Shape2*Shape1
p%KBF (K,2,2) = p%KBF (K,2,2) + ElmntStff*Shape2*Shape2
ElmntStff = p%StiffBE(K,J)*p%DRNodes(J) ! Edgewise stiffness of blade element J
Shape = SHP( p%RNodesNorm(J), p%BldFlexL, p%BldEdgSh(:,K), 2, ErrStat, ErrMsg )
p%KBE (K,1,1) = p%KBE (K,1,1) + ElmntStff*Shape *Shape
! Integrate to find the centrifugal-term of the generalized flapwise and edgewise
! stiffness of the blades. Ignore the cross-correlation terms of KBFCent (i.e.
! KBFCent(i,j) where i /= j) since these terms will never be used.
ElmntStff = FMomAbvNd(K,J)*p%DRNodes(J)*p%RotSpeed**2 ! Centrifugal stiffness of blade element J
Shape1 = SHP( p%RNodesNorm(J), p%BldFlexL, p%BldFl1Sh(:,K), 1, ErrStat, ErrMsg )
Shape2 = SHP( p%RNodesNorm(J), p%BldFlexL, p%BldFl2Sh(:,K), 1, ErrStat, ErrMsg )
KBFCent(K,1,1) = KBFCent(K,1,1) + ElmntStff*Shape1*Shape1
KBFCent(K,2,2) = KBFCent(K,2,2) + ElmntStff*Shape2*Shape2
Shape = SHP( p%RNodesNorm(J), p%BldFlexL, p%BldEdgSh(:,K), 1, ErrStat, ErrMsg )
KBECent(K,1,1) = KBECent(K,1,1) + ElmntStff*Shape *Shape
! Calculate the 2nd derivatives of the twisted shape functions:
Shape = SHP( p%RNodesNorm(J), p%BldFlexL, p%BldFl1Sh(:,K), 2, ErrStat, ErrMsg )
p%TwistedSF(K,1,1,J,2) = Shape*p%CThetaS(K,J) ! 2nd deriv. of Phi1(J) for blade K
p%TwistedSF(K,2,1,J,2) = -Shape*p%SThetaS(K,J) ! 2nd deriv. of Psi1(J) for blade K
Shape = SHP( p%RNodesNorm(J), p%BldFlexL, p%BldFl2Sh(:,K), 2, ErrStat, ErrMsg )
p%TwistedSF(K,1,2,J,2) = Shape*p%CThetaS(K,J) ! 2nd deriv. of Phi2(J) for blade K
p%TwistedSF(K,2,2,J,2) = -Shape*p%SThetaS(K,J) ! 2nd deriv. of Psi2(J) for blade K
Shape = SHP( p%RNodesNorm(J), p%BldFlexL, p%BldEdgSh(:,K), 2, ErrStat, ErrMsg )
p%TwistedSF(K,1,3,J,2) = Shape*p%SThetaS(K,J) ! 2nd deriv. of Phi3(J) for blade K
p%TwistedSF(K,2,3,J,2) = Shape*p%CThetaS(K,J) ! 2nd deriv. of Psi3(J) for blade K
! Integrate to find the 1st derivatives of the twisted shape functions:
DO I = 1,2 ! Loop through Phi and Psi
DO L = 1,3 ! Loop through all blade DOFs
TwstdSF ( I,L, 1) = p%TwistedSF(K,I,L,J,2)*0.5*p%DRNodes(J)
p%TwistedSF (K,I,L,J,1) = TwstdSF ( I,L, 1)
ENDDO ! L - All blade DOFs
ENDDO ! I - Phi and Psi
IF ( J /= 1 ) THEN ! All but the innermost blade element
! Add the effects from the (not yet used) portion of element J-1
DO I = 1,2 ! Loop through Phi and Psi
DO L = 1,3 ! Loop through all blade DOFs
p%TwistedSF(K,I,L,J,1) = p%TwistedSF(K,I,L,J,1) + p%TwistedSF(K,I,L,J-1,1) &
+ TwstdSFOld( I,L, 1)
ENDDO ! L - All blade DOFs
ENDDO ! I - Phi and Psi
ENDIF
! Integrate to find the twisted shape functions themselves (i.e., their zeroeth derivative):
DO I = 1,2 ! Loop through Phi and Psi
DO L = 1,3 ! Loop through all blade DOFs
TwstdSF ( I,L, 0) = p%TwistedSF(K,I,L,J,1)*0.5*p%DRNodes(J)
p%TwistedSF (K,I,L,J,0) = TwstdSF ( I,L, 0)
ENDDO ! L - All blade DOFs
ENDDO ! I - Phi and Psi
IF ( J /= 1 ) THEN ! All but the innermost blade element
! Add the effects from the (not yet used) portion of element J-1
DO I = 1,2 ! Loop through Phi and Psi
DO L = 1,3 ! Loop through all blade DOFs
p%TwistedSF(K,I,L,J,0) = p%TwistedSF(K,I,L,J,0) + p%TwistedSF(K,I,L,J-1,0) &
+ TwstdSFOld( I,L, 0)
ENDDO ! L - All blade DOFs
ENDDO ! I - Phi and Psi
ENDIF
! Integrate to find the blade axial reduction shape functions:
DO I = 1,3 ! Loop through all blade DOFs
DO L = 1,3 ! Loop through all blade DOFs
AxRdBld ( I,L ) = 0.5*p%DRNodes(J)*( &
p%TwistedSF(K,1,I,J,1)*p%TwistedSF(K,1,L,J,1) &
+ p%TwistedSF(K,2,I,J,1)*p%TwistedSF(K,2,L,J,1) )
p%AxRedBld (K,I,L,J) = AxRdBld(I,L)
ENDDO ! L - All blade DOFs
ENDDO ! I - All blade DOFs
IF ( J /= 1 ) THEN ! All but the innermost blade element
! Add the effects from the (not yet used) portion of element J-1
DO I = 1,3 ! Loop through all blade DOFs
DO L = 1,3 ! Loop through all blade DOFs
p%AxRedBld(K,I,L,J) = p%AxRedBld(K,I,L,J) + p%AxRedBld(K,I,L,J-1) &
+ AxRdBldOld(I,L)
ENDDO ! L - All blade DOFs
ENDDO ! I - All blade DOFs
ENDIF
! Store the TwstdSF and AxRdBld terms of the current element (these will be used for the next element)
TwstdSFOld = TwstdSF
AxRdBldOld = AxRdBld
ENDDO ! J - Blade nodes / elements
IF (p%BD4Blades) THEN
!p%KBF ( K,:,: ) = 0.0_ReKi
! the 1st and zeroeth derivatives of the twisted shape functions at the blade root:
p%TwistedSF(K,:,:,:,1) = 0.0_ReKi
p%TwistedSF(K,:,:,:,0) = 0.0_ReKi
p%AxRedBld( K,:,:,: ) = 0.0_ReKi
ELSE
! Apply the flapwise modal stiffness tuners of the blades to KBF():
DO I = 1,2 ! Loop through flap DOFs
DO L = 1,2 ! Loop through flap DOFs
p%KBF(K,I,L) = SQRT( p%FStTunr(K,I)*p%FStTunr(K,L) )*p%KBF(K,I,L)
ENDDO ! L - Flap DOFs
ENDDO ! I - Flap DOFs
! Calculate the blade natural frequencies:
DO I = 1,NumBF ! Loop through flap DOFs
p%FreqBF(K,I,1) = Inv2Pi*SQRT( p%KBF(K,I,I) /( MBF(K,I,I) - p%TipMass(K) ) ) ! Natural blade I-flap frequency w/o centrifugal stiffening nor tip mass effects
p%FreqBF(K,I,2) = Inv2Pi*SQRT( p%KBF(K,I,I) / MBF(K,I,I) ) ! Natural blade I-flap frequency w/o centrifugal stiffening, but w/ tip mass effects
p%FreqBF(K,I,3) = Inv2Pi*SQRT( ( p%KBF(K,I,I) + KBFCent(K,I,I) )/ MBF(K,I,I) ) ! Natural blade I-flap frequency w/ centrifugal stiffening and tip mass effects
ENDDO ! I - Flap DOFs
p%FreqBE (K,1,1) = Inv2Pi*SQRT( p%KBE(K,1,1) /( MBE(K,1,1) - p%TipMass(K) ) ) ! Natural blade 1-edge frequency w/o centrifugal stiffening nor tip mass effects
p%FreqBE (K,1,2) = Inv2Pi*SQRT( p%KBE(K,1,1) / MBE(K,1,1) ) ! Natural Blade 1-edge frequency w/o centrifugal stiffening, but w/ tip mass effects
p%FreqBE (K,1,3) = Inv2Pi*SQRT( ( p%KBE(K,1,1) + KBECent(K,1,1) )/ MBE(K,1,1) ) ! Natural Blade 1-edge frequency w/ centrifugal stiffening and tip mass effects
! Calculate the generalized damping of the blades:
DO I = 1,NumBF ! Loop through flap DOFs
DO L = 1,NumBF ! Loop through flap DOFs
p%CBF(K,I,L) = ( 0.01*p%BldFDamp(K,L) )*p%KBF(K,I,L)/( Pi*p%FreqBF(K,L,1) )
ENDDO ! L - Flap DOFs
ENDDO ! I - Flap DOFs
p%CBE (K,1,1) = ( 0.01*p%BldEDamp(K,1) )*p%KBE(K,1,1)/( Pi*p%FreqBE(K,1,1) )
! Calculate the 2nd derivatives of the twisted shape functions at the blade root:
Shape = SHP( 0.0_ReKi, p%BldFlexL, p%BldFl1Sh(:,K), 2, ErrStat, ErrMsg )
p%TwistedSF(K,1,1,0,2) = Shape*p%CThetaS(K,0) ! 2nd deriv. of Phi1(0) for blade K
p%TwistedSF(K,2,1,0,2) = -Shape*p%SThetaS(K,0) ! 2nd deriv. of Psi1(0) for blade K
Shape = SHP( 0.0_ReKi, p%BldFlexL, p%BldFl2Sh(:,K), 2, ErrStat, ErrMsg )
p%TwistedSF(K,1,2,0,2) = Shape*p%CThetaS(K,0) ! 2nd deriv. of Phi2(0) for blade K
p%TwistedSF(K,2,2,0,2) = -Shape*p%SThetaS(K,0) ! 2nd deriv. of Psi2(0) for blade K
Shape = SHP( 0.0_ReKi, p%BldFlexL, p%BldEdgSh(:,K), 2, ErrStat, ErrMsg )
p%TwistedSF(K,1,3,0,2) = Shape*p%SThetaS(K,0) ! 2nd deriv. of Phi3(0) for blade K
p%TwistedSF(K,2,3,0,2) = Shape*p%CThetaS(K,0) ! 2nd deriv. of Psi3(0) for blade K
! Calculate the 2nd derivatives of the twisted shape functions at the tip:
Shape = SHP( 1.0_ReKi, p%BldFlexL, p%BldFl1Sh(:,K), 2, ErrStat, ErrMsg )
p%TwistedSF(K,1,1,p%TipNode,2) = Shape*p%CThetaS(K,p%TipNode) ! 2nd deriv. of Phi1(p%TipNode) for blade K
p%TwistedSF(K,2,1,p%TipNode,2) = -Shape*p%SThetaS(K,p%TipNode) ! 2nd deriv. of Psi1(p%TipNode) for blade K
Shape = SHP( 1.0_ReKi, p%BldFlexL, p%BldFl2Sh(:,K), 2, ErrStat, ErrMsg )
p%TwistedSF(K,1,2,p%TipNode,2) = Shape*p%CThetaS(K,p%TipNode) ! 2nd deriv. of Phi2(p%TipNode) for blade K
p%TwistedSF(K,2,2,p%TipNode,2) = -Shape*p%SThetaS(K,p%TipNode) ! 2nd deriv. of Psi2(p%TipNode) for blade K
Shape = SHP( 1.0_ReKi, p%BldFlexL, p%BldEdgSh(:,K), 2, ErrStat, ErrMsg )
p%TwistedSF(K,1,3,p%TipNode,2) = Shape*p%SThetaS(K,p%TipNode) ! 2nd deriv. of Phi3(p%TipNode) for blade K
p%TwistedSF(K,2,3,p%TipNode,2) = Shape*p%CThetaS(K,p%TipNode) ! 2nd deriv. of Psi3(p%TipNode) for blade K
! Integrate to find the 1st and zeroeth derivatives of the twisted shape functions
! at the tip:
DO I = 1,2 ! Loop through Phi and Psi
DO L = 1,3 ! Loop through all blade DOFs
p%TwistedSF(K,I,L,p%TipNode,1) = p%TwistedSF(K,I,L,p%BldNodes,1) + TwstdSFOld(I,L,1)
p%TwistedSF(K,I,L,p%TipNode,0) = p%TwistedSF(K,I,L,p%BldNodes,0) + TwstdSFOld(I,L,0)
ENDDO ! L - All blade DOFs
ENDDO ! I - Phi and Psi
! the 1st and zeroeth derivatives of the twisted shape functions at the blade root:
p%TwistedSF(K,:,:,0,1) = 0.0_ReKi
p%TwistedSF(K,:,:,0,0) = 0.0_ReKi
p%AxRedBld( K,:,:,0 ) = 0.0_ReKi
! Integrate to find the blade axial reduction shape functions at the tip:
DO I = 1,3 ! Loop through all blade DOFs
DO L = 1,3 ! Loop through all blade DOFs
p%AxRedBld(K,I,L,p%TipNode) = p%AxRedBld(K,I,L,p%BldNodes) + AxRdBldOld(I,L)
ENDDO ! L - All blade DOFs
ENDDO ! I - All blade DOFs
END IF ! p%BD4Blades
ENDDO ! K - Blades
! Calculate the tower-top mass:
p%TwrTpMass = p%RotMass + p%RFrlMass + p%BoomMass + p%TFinMass + p%NacMass + p%YawBrMass
DO J = p%TwrNodes,1,-1 ! Loop through the tower nodes / elements in reverse
! Calculate the mass of the current element
p%TElmntMass(J) = p%MassT(J)*abs(p%DHNodes(J)) ! Mass of tower element J
! Integrate to find the tower mass which will be output in .fsm
p%TwrMass = p%TwrMass + p%TElmntMass(J)
! Integrate to find TMssAbvNd:
TMssAbvNd (J) = 0.5*p%TElmntMass(J)
IF ( J == p%TwrNodes ) THEN ! Uppermost tower element
! Add the TwrTpMass effects:
TMssAbvNd(J) = TMssAbvNd(J) + p%TwrTpMass
ELSE ! All other tower elements
! Add to TMssAbvNd(J) the effects from the (not yet used) portion of element J+1
TMssAbvNd(J) = 0.5*p%TElmntMass(J+1) + TMssAbvNd(J) + TMssAbvNd(J+1)
ENDIF
ENDDO ! J - Tower nodes / elements in reverse
! Initialize the generalized tower masses using tower-top mass effects:
DO I = 1,2 ! Loop through all tower modes in a single direction
MTFA(I,I) = p%TwrTpMass
MTSS(I,I) = p%TwrTpMass
ENDDO ! I - All tower modes in a single direction
! set values for tower base (note that we haven't corrctly defined the values for (:,0,2) in the arrays below):
p%TwrFASF( :,0,0:1) = 0.0_ReKi
p%TwrSSSF( :,0,0:1) = 0.0_ReKi
p%AxRedTFA(:,:,0) = 0.0_ReKi
p%AxRedTSS(:,:,0) = 0.0_ReKi
DO J = 1,p%TwrNodes ! Loop through the tower nodes / elements
! Calculate the tower shape functions (all derivatives):
p%TwrFASF(1,J,2) = SHP( p%HNodesNorm(J), p%TwrFlexL, InputFileData%TwFAM1Sh(:), 2, ErrStat, ErrMsg )
p%TwrFASF(2,J,2) = SHP( p%HNodesNorm(J), p%TwrFlexL, InputFileData%TwFAM2Sh(:), 2, ErrStat, ErrMsg )
p%TwrFASF(1,J,1) = SHP( p%HNodesNorm(J), p%TwrFlexL, InputFileData%TwFAM1Sh(:), 1, ErrStat, ErrMsg )
p%TwrFASF(2,J,1) = SHP( p%HNodesNorm(J), p%TwrFlexL, InputFileData%TwFAM2Sh(:), 1, ErrStat, ErrMsg )
p%TwrFASF(1,J,0) = SHP( p%HNodesNorm(J), p%TwrFlexL, InputFileData%TwFAM1Sh(:), 0, ErrStat, ErrMsg )
p%TwrFASF(2,J,0) = SHP( p%HNodesNorm(J), p%TwrFlexL, InputFileData%TwFAM2Sh(:), 0, ErrStat, ErrMsg )
p%TwrSSSF(1,J,2) = SHP( p%HNodesNorm(J), p%TwrFlexL, InputFileData%TwSSM1Sh(:), 2, ErrStat, ErrMsg )
p%TwrSSSF(2,J,2) = SHP( p%HNodesNorm(J), p%TwrFlexL, InputFileData%TwSSM2Sh(:), 2, ErrStat, ErrMsg )
p%TwrSSSF(1,J,1) = SHP( p%HNodesNorm(J), p%TwrFlexL, InputFileData%TwSSM1Sh(:), 1, ErrStat, ErrMsg )
p%TwrSSSF(2,J,1) = SHP( p%HNodesNorm(J), p%TwrFlexL, InputFileData%TwSSM2Sh(:), 1, ErrStat, ErrMsg )
p%TwrSSSF(1,J,0) = SHP( p%HNodesNorm(J), p%TwrFlexL, InputFileData%TwSSM1Sh(:), 0, ErrStat, ErrMsg )
p%TwrSSSF(2,J,0) = SHP( p%HNodesNorm(J), p%TwrFlexL, InputFileData%TwSSM2Sh(:), 0, ErrStat, ErrMsg )
! Integrate to find the generalized mass of the tower (including tower-top mass effects).
! Ignore the cross-correlation terms of MTFA (i.e. MTFA(i,j) where i /= j) and MTSS
! since these terms will never be used.
DO I = 1,2 ! Loop through all tower DOFs in one direction
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 ! I - through all tower DOFs in one direction
! Integrate to find the generalized stiffness of the tower (not including gravitational
! effects).
ElStffFA = p%StiffTFA(J)*abs(p%DHNodes(J)) ! Fore-aft stiffness of tower element J
ElStffSS = p%StiffTSS(J)*abs(p%DHNodes(J)) ! Side-to-side stiffness of tower element J
DO I = 1,2 ! Loop through all tower DOFs in one direction
DO L = 1,2 ! Loop through all tower DOFs in one direction
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 ! L - All tower DOFs in one direction
ENDDO ! I - through all tower DOFs in one direction
! Integrate to find the gravitational-term of the generalized stiffness of the tower.
! Ignore the cross-correlation terms of KTFAGrav (i.e. KTFAGrav(i,j) where i /= j)
! and KTSSGrav since these terms will never be used.
ElmntStff = -TMssAbvNd(J)*abs(p%DHNodes(J))*p%Gravity ! Gravitational stiffness of tower element J
DO I = 1,2 ! Loop through all tower DOFs in one direction
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
! Integrate to find the tower axial reduction shape functions:
DO I = 1,2 ! Loop through all tower DOFs in one direction
DO L = 1,2 ! Loop through all tower DOFs in one direction
AxRdTFA (I,L) = 0.5*p%DHNodes(J)*p%TwrFASF(I,J,1)*p%TwrFASF(L,J,1)
AxRdTSS (I,L) = 0.5*p%DHNodes(J)*p%TwrSSSF(I,J,1)*p%TwrSSSF(L,J,1)
p%AxRedTFA(I,L,J) = AxRdTFA(I,L)
p%AxRedTSS(I,L,J) = AxRdTSS(I,L)
ENDDO ! L - All tower DOFs in one direction
ENDDO
IF ( J /= 1 ) THEN ! All but the lowermost tower element
! Add the effects from the (not yet used) portion of element J-1
DO I = 1,2 ! Loop through all tower DOFs in one direction
DO L = 1,2 ! Loop through all tower DOFs in one direction
p%AxRedTFA(I,L,J) = p%AxRedTFA(I,L,J) + p%AxRedTFA(I,L,J-1)+ AxRdTFAOld(I,L)
p%AxRedTSS(I,L,J) = p%AxRedTSS(I,L,J) + p%AxRedTSS(I,L,J-1)+ AxRdTSSOld(I,L)
ENDDO ! L - All tower DOFs in one direction
ENDDO
ENDIF
! Store the AxRdTFA and AxRdTSS terms of the current element (these will be used for the next element)
AxRdTFAOld = AxRdTFA
AxRdTSSOld = AxRdTSS
ENDDO ! J - Tower nodes / elements
! Apply the modal stiffness tuners of the tower to KTFA() and KTSS():
DO I = 1,2 ! Loop through all tower DOFs in one direction
DO L = 1,2 ! Loop through all tower DOFs in one direction
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 ! L - All tower DOFs in one direction
ENDDO ! I - through all tower DOFs in one direction
! Calculate the tower natural frequencies:
DO I = 1,2 ! Loop through all tower DOFs in one direction
if ( EqualRealNos(( MTFA(I,I) - p%TwrTpMass ), 0.0_ReKi) ) then
p%FreqTFA(I,1) = NaN ! Avoid creating a divide by zero signal, but set p%FreqTFA(I,1) = NaN
else
p%FreqTFA(I,1) = Inv2Pi*SQRT( p%KTFA(I,I)/( MTFA(I,I) - p%TwrTpMass ) ) ! Natural tower I-fore-aft frequency w/o gravitational destiffening nor tower-top mass effects
end if
if ( EqualRealNos(( MTSS(I,I) - p%TwrTpMass ), 0.0_ReKi) ) then
p%FreqTSS(I,1) = NaN ! Avoid creating a divide by zero signal, but set p%FreqTFS(I,1) = NaN
else
p%FreqTSS(I,1) = Inv2Pi*SQRT( p%KTSS(I,I)/( MTSS(I,I) - p%TwrTpMass ) ) ! Natural tower I-side-to-side frequency w/o gravitational destiffening nor tower-top mass effects
end if
p%FreqTFA(I,2) = Inv2Pi*SQRT( ( p%KTFA(I,I) + KTFAGrav(I,I) )/MTFA(I,I) ) ! Natural tower I-fore-aft frequency w/ gravitational destiffening and tower-top mass effects
p%FreqTSS(I,2) = Inv2Pi*SQRT( ( p%KTSS(I,I) + KTSSGrav(I,I) )/MTSS(I,I) ) ! Natural tower I-side-to-side frequency w/ gravitational destiffening and tower-top mass effects
ENDDO ! I - All tower DOFs in one direction
! Calculate the generalized damping of the tower:
DO I = 1,2 ! Loop through all tower DOFs in one direction
DO L = 1,2 ! Loop through all tower DOFs in one direction
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 ! L - All tower DOFs in one direction
ENDDO ! I - All tower DOFs in one direction
! Calculate the tower shape functions (all derivatives) at the tower-top:
p%TwrFASF(1,p%TTopNode,2) = SHP( 1.0_ReKi, p%TwrFlexL, InputFileData%TwFAM1Sh(:), 2, ErrStat, ErrMsg )
p%TwrFASF(2,p%TTopNode,2) = SHP( 1.0_ReKi, p%TwrFlexL, InputFileData%TwFAM2Sh(:), 2, ErrStat, ErrMsg )
p%TwrFASF(1,p%TTopNode,1) = SHP( 1.0_ReKi, p%TwrFlexL, InputFileData%TwFAM1Sh(:), 1, ErrStat, ErrMsg )
p%TwrFASF(2,p%TTopNode,1) = SHP( 1.0_ReKi, p%TwrFlexL, InputFileData%TwFAM2Sh(:), 1, ErrStat, ErrMsg )
p%TwrFASF(1,p%TTopNode,0) = SHP( 1.0_ReKi, p%TwrFlexL, InputFileData%TwFAM1Sh(:), 0, ErrStat, ErrMsg )
p%TwrFASF(2,p%TTopNode,0) = SHP( 1.0_ReKi, p%TwrFlexL, InputFileData%TwFAM2Sh(:), 0, ErrStat, ErrMsg )
p%TwrSSSF(1,p%TTopNode,2) = SHP( 1.0_ReKi, p%TwrFlexL, InputFileData%TwSSM1Sh(:), 2, ErrStat, ErrMsg )
p%TwrSSSF(2,p%TTopNode,2) = SHP( 1.0_ReKi, p%TwrFlexL, InputFileData%TwSSM2Sh(:), 2, ErrStat, ErrMsg )
p%TwrSSSF(1,p%TTopNode,1) = SHP( 1.0_ReKi, p%TwrFlexL, InputFileData%TwSSM1Sh(:), 1, ErrStat, ErrMsg )
p%TwrSSSF(2,p%TTopNode,1) = SHP( 1.0_ReKi, p%TwrFlexL, InputFileData%TwSSM2Sh(:), 1, ErrStat, ErrMsg )
p%TwrSSSF(1,p%TTopNode,0) = SHP( 1.0_ReKi, p%TwrFlexL, InputFileData%TwSSM1Sh(:), 0, ErrStat, ErrMsg )
p%TwrSSSF(2,p%TTopNode,0) = SHP( 1.0_ReKi, p%TwrFlexL, InputFileData%TwSSM2Sh(:), 0, ErrStat, ErrMsg )
! Integrate to find the tower axial reduction shape functions at the tower-top:
DO I = 1,2 ! Loop through all tower DOFs in one direction
DO L = 1,2 ! Loop through all tower DOFs in one direction
p%AxRedTFA(I,L,p%TTopNode) = p%AxRedTFA(I,L,p%TwrNodes)+ AxRdTFAOld(I,L)
p%AxRedTSS(I,L,p%TTopNode) = p%AxRedTSS(I,L,p%TwrNodes)+ AxRdTSSOld(I,L)
ENDDO ! L - All tower DOFs in one direction
ENDDO
! Calculate the turbine mass:
p%TurbMass = p%TwrTpMass + p%TwrMass
RETURN
END SUBROUTINE Coeff
```

View File

@ -1,55 +0,0 @@
{
"nodes":[
{"id":"9461f7dd96103316","type":"text","text":"Kane方法","x":-120,"y":-280,"width":250,"height":50},
{"id":"0c8534c8ba68c9a6","type":"text","text":"**广义**主动力","x":-280,"y":-140,"width":250,"height":50},
{"id":"5eaa425c204bf600","type":"text","text":"**广义**惯性力","x":40,"y":-140,"width":250,"height":50},
{"id":"e398416e55019686","type":"text","text":"运动学","x":-210,"y":220,"width":250,"height":60},
{"id":"38d3d1a313c094ee","type":"text","text":"广义坐标","x":-280,"y":340,"width":250,"height":60},
{"id":"8ec17237cebe7433","type":"text","text":"广义速率","x":60,"y":340,"width":250,"height":60},
{"id":"7351d2bbb065d539","type":"text","text":"动力学 ","x":-210,"y":110,"width":250,"height":60},
{"id":"da500b2b12ed0901","type":"text","text":"填充augmat矩阵","x":290,"y":-30,"width":250,"height":60},
{"id":"20ce8d75f0f35588","type":"text","text":"解出来q_dot ---u","x":580,"y":-30,"width":250,"height":60},
{"id":"6094c53caf966263","type":"text","text":"由F + F^* 的形式转换到 [C(q,t)]{-f(qd,q,t)}形式 ","x":-165,"y":-40,"width":340,"height":80},
{"id":"c20eeff7484d8a39","type":"text","text":"叠加法","x":-275,"y":560,"width":250,"height":60},
{"id":"a729b7930412f0b1","type":"text","text":"需要保持边界条件一致","x":60,"y":560,"width":250,"height":60},
{"id":"d405163cb9ecd804","type":"text","text":"叶片多段拆分,小段做模态叠加?","x":60,"y":670,"width":250,"height":60},
{"id":"4a08e20366911d68","type":"text","text":"v1pt_theory","x":290,"y":140,"width":250,"height":60},
{"id":"6e5a6a3cdd47bd52","type":"text","text":"v2pt_theory","x":290,"y":207,"width":250,"height":60},
{"id":"4bfacdf3ddedbdec","type":"text","text":"柔性体 / 连续体","x":-340,"y":960,"width":250,"height":60},
{"id":"ae48e80ccd92bffa","type":"text","text":"连续体振动","x":60,"y":960,"width":250,"height":60},
{"id":"ed5a265dc4b72aaa","type":"text","text":"连续体动力学","x":420,"y":960,"width":250,"height":60},
{"id":"fc13b731983ac384","type":"text","text":"浮动坐标系","x":-340,"y":1181,"width":250,"height":60},
{"id":"df8e8a93ea4af203","x":984,"y":-235,"width":250,"height":60,"type":"text","text":"叶片"},
{"id":"7dc483819d8b527b","x":1280,"y":-235,"width":250,"height":60,"type":"text","text":"轮毂"},
{"id":"c02c22667637367f","x":1580,"y":-235,"width":250,"height":60,"type":"text","text":"机舱"},
{"id":"623ac90ce5bad160","x":1580,"y":-60,"width":250,"height":60,"type":"text","text":"塔架"},
{"id":"0324f23e7dc78d68","x":1580,"y":55,"width":250,"height":60,"type":"text","text":"机舱"},
{"id":"ba5c15a27611709c","x":1580,"y":-150,"width":250,"height":60,"type":"text","text":"偏航轴承"},
{"id":"6c3a6982a53e7df9","x":984,"y":177,"width":250,"height":60,"type":"text","text":"刚体部件:"},
{"id":"f3c36900dd3ed9d1","x":1280,"y":177,"width":250,"height":60,"type":"text","text":"刚体的广义主动力、惯性力公式"},
{"id":"b624e8c6302b9a1c","x":984,"y":310,"width":250,"height":60,"type":"text","text":"叶片、塔架"},
{"id":"1054909d642ce071","x":1280,"y":310,"width":250,"height":60,"type":"text","text":"广义惯性力:质点广义惯性力公式 积分"},
{"id":"1e1a1a0d67920443","x":1280,"y":420,"width":250,"height":60,"type":"text","text":"广义主动力由势能dV/dq_r"},
{"id":"092cf6719d47d01d","x":1280,"y":530,"width":250,"height":60,"type":"text","text":"弹性恢复力、阻尼、重力、气动力"},
{"id":"32b762bd2a4b0d66","x":984,"y":640,"width":250,"height":60,"type":"text","text":"传动链、偏航"},
{"id":"14a4450243ca9953","x":1620,"y":530,"width":250,"height":60,"type":"text","text":"原理呢?"}
],
"edges":[
{"id":"647c1b45edc92b02","fromNode":"9461f7dd96103316","fromSide":"bottom","toNode":"0c8534c8ba68c9a6","toSide":"top"},
{"id":"e3d4293dd3262f2d","fromNode":"9461f7dd96103316","fromSide":"bottom","toNode":"5eaa425c204bf600","toSide":"top"},
{"id":"9a803fcaec81414e","fromNode":"38d3d1a313c094ee","fromSide":"right","toNode":"8ec17237cebe7433","toSide":"left"},
{"id":"7ff52c30a0b0347d","fromNode":"a729b7930412f0b1","fromSide":"bottom","toNode":"d405163cb9ecd804","toSide":"top"},
{"id":"d97ef554530b15b5","fromNode":"c20eeff7484d8a39","fromSide":"right","toNode":"a729b7930412f0b1","toSide":"left"},
{"id":"034d145edd7cfce0","fromNode":"0c8534c8ba68c9a6","fromSide":"bottom","toNode":"6094c53caf966263","toSide":"top"},
{"id":"da18b7fa4859fa6f","fromNode":"5eaa425c204bf600","fromSide":"bottom","toNode":"6094c53caf966263","toSide":"top"},
{"id":"5d5f4fef281a656e","fromNode":"6094c53caf966263","fromSide":"right","toNode":"da500b2b12ed0901","toSide":"left"},
{"id":"5573fa12a3a02ee0","fromNode":"da500b2b12ed0901","fromSide":"right","toNode":"20ce8d75f0f35588","toSide":"left"},
{"id":"c4828432b71fd99a","fromNode":"4bfacdf3ddedbdec","fromSide":"right","toNode":"ae48e80ccd92bffa","toSide":"left"},
{"id":"8ded09c7902a30b6","fromNode":"ae48e80ccd92bffa","fromSide":"right","toNode":"ed5a265dc4b72aaa","toSide":"left"},
{"id":"4818c7bc8aa99b57","fromNode":"b624e8c6302b9a1c","fromSide":"right","toNode":"1054909d642ce071","toSide":"left"},
{"id":"d58b296db32dc932","fromNode":"1054909d642ce071","fromSide":"bottom","toNode":"1e1a1a0d67920443","toSide":"top"},
{"id":"f88001eedfed69b8","fromNode":"1e1a1a0d67920443","fromSide":"bottom","toNode":"092cf6719d47d01d","toSide":"top"},
{"id":"d0bfe0faa41e4e2f","fromNode":"6c3a6982a53e7df9","fromSide":"right","toNode":"f3c36900dd3ed9d1","toSide":"left"},
{"id":"14130329273bf6fc","fromNode":"092cf6719d47d01d","fromSide":"right","toNode":"14a4450243ca9953","toSide":"left"}
]
}

View File

@ -0,0 +1,147 @@
{
"nodes":[
{"id":"9461f7dd96103316","type":"text","text":"Kane方法","x":-120,"y":-280,"width":250,"height":50},
{"id":"0c8534c8ba68c9a6","type":"text","text":"**广义**主动力","x":-280,"y":-140,"width":250,"height":50},
{"id":"5eaa425c204bf600","type":"text","text":"**广义**惯性力","x":40,"y":-140,"width":250,"height":50},
{"id":"e398416e55019686","type":"text","text":"运动学","x":-210,"y":220,"width":250,"height":60},
{"id":"38d3d1a313c094ee","type":"text","text":"广义坐标","x":-280,"y":340,"width":250,"height":60},
{"id":"8ec17237cebe7433","type":"text","text":"广义速率","x":60,"y":340,"width":250,"height":60},
{"id":"7351d2bbb065d539","type":"text","text":"动力学 ","x":-210,"y":110,"width":250,"height":60},
{"id":"da500b2b12ed0901","type":"text","text":"填充augmat矩阵","x":290,"y":-30,"width":250,"height":60},
{"id":"20ce8d75f0f35588","type":"text","text":"解出来q_dot ---u","x":580,"y":-30,"width":250,"height":60},
{"id":"6094c53caf966263","type":"text","text":"由F + F* 的形式转换到 [C(q,t)]{-f(qd,q,t)}形式 ","x":-165,"y":-40,"width":340,"height":80},
{"id":"c20eeff7484d8a39","type":"text","text":"叠加法","x":-275,"y":560,"width":250,"height":60},
{"id":"a729b7930412f0b1","type":"text","text":"需要保持边界条件一致","x":60,"y":560,"width":250,"height":60},
{"id":"d405163cb9ecd804","type":"text","text":"叶片多段拆分,小段做模态叠加?","x":60,"y":670,"width":250,"height":60},
{"id":"4a08e20366911d68","type":"text","text":"v1pt_theory","x":290,"y":140,"width":250,"height":60},
{"id":"6e5a6a3cdd47bd52","type":"text","text":"v2pt_theory","x":290,"y":207,"width":250,"height":60},
{"id":"4bfacdf3ddedbdec","type":"text","text":"柔性体 / 连续体","x":-340,"y":960,"width":250,"height":60},
{"id":"ae48e80ccd92bffa","type":"text","text":"连续体振动","x":60,"y":960,"width":250,"height":60},
{"id":"ed5a265dc4b72aaa","type":"text","text":"连续体动力学","x":420,"y":960,"width":250,"height":60},
{"id":"fc13b731983ac384","type":"text","text":"浮动坐标系","x":-340,"y":1181,"width":250,"height":60},
{"id":"df8e8a93ea4af203","type":"text","text":"叶片","x":984,"y":-235,"width":250,"height":60},
{"id":"7dc483819d8b527b","type":"text","text":"轮毂","x":1280,"y":-235,"width":250,"height":60},
{"id":"c02c22667637367f","type":"text","text":"机舱","x":1580,"y":-235,"width":250,"height":60},
{"id":"623ac90ce5bad160","type":"text","text":"塔架","x":1580,"y":-60,"width":250,"height":60},
{"id":"0324f23e7dc78d68","type":"text","text":"机舱","x":1580,"y":55,"width":250,"height":60},
{"id":"ba5c15a27611709c","type":"text","text":"偏航轴承","x":1580,"y":-150,"width":250,"height":60},
{"id":"6c3a6982a53e7df9","type":"text","text":"刚体部件:","x":984,"y":177,"width":250,"height":60},
{"id":"f3c36900dd3ed9d1","type":"text","text":"刚体的广义主动力、惯性力公式","x":1280,"y":177,"width":250,"height":60},
{"id":"b624e8c6302b9a1c","type":"text","text":"叶片、塔架","x":984,"y":310,"width":250,"height":60},
{"id":"1054909d642ce071","type":"text","text":"广义惯性力:质点广义惯性力公式 积分","x":1280,"y":310,"width":250,"height":60},
{"id":"1e1a1a0d67920443","type":"text","text":"广义主动力由势能dV/dq_r","x":1280,"y":420,"width":250,"height":60},
{"id":"092cf6719d47d01d","type":"text","text":"弹性恢复力、阻尼、重力、气动力","x":1280,"y":530,"width":250,"height":60},
{"id":"32b762bd2a4b0d66","type":"text","text":"传动链、偏航","x":984,"y":640,"width":250,"height":60},
{"id":"14a4450243ca9953","type":"text","text":"原理呢?","x":1620,"y":530,"width":250,"height":60},
{"id":"5ed3765756616b02","type":"text","text":"叶片","x":-936,"y":1420,"width":250,"height":60},
{"id":"9a7256948b4e439c","type":"text","text":"轮毂","x":-640,"y":1420,"width":250,"height":60},
{"id":"db5161e16a8e2c3f","type":"text","text":"机舱","x":-340,"y":1420,"width":250,"height":60},
{"id":"95eb99b9b0299f2f","type":"text","text":"塔架","x":-340,"y":1595,"width":250,"height":60},
{"id":"a2e90c49290ecb52","type":"text","text":"偏航轴承","x":-340,"y":1505,"width":250,"height":60},
{"id":"cccd4482e817fca4","type":"text","text":"$$\n{k'}_{ij}^{B1F} = \\sqrt{FlStTunr^{B1}(i) \\, FlStTunr^{B1}(j)} \\int_{0}^{BldFlexL} EI^{B1F}(r) \\frac{d^2 \\phi_i^{B1F}(r)}{dr^2} \\frac{d^2 \\phi_j^{B1F}(r)}{dr^2} dr \\quad (i, j = 1, 2) \\tag{9}\n$$","x":-180,"y":1855,"width":980,"height":130},
{"id":"722e4b9c310e6d2a","type":"text","text":"$$\nEI^{B1F}(r) = AdjFlSt^{B1} \\cdot FlpStff^{B1}(r) \\tag{10}\n$$","x":-180,"y":2050,"width":980,"height":80},
{"id":"50e241bef2144ea1","type":"text","text":"$$\n\\frac{d^2 \\phi_i^{B1F}(r)}{dr^2} \\frac{d^2 \\phi_j^{B1F}(r)}{dr^2}\n$$","x":200,"y":2190,"width":220,"height":120},
{"id":"f65edb48b74e18d7","type":"text","text":"叶片广义挥舞刚度","x":-540,"y":1904,"width":250,"height":32},
{"id":"e0d016f4bb106554","type":"text","text":"- 需要叶片挥舞刚度","x":-540,"y":2072,"width":250,"height":36},
{"id":"a9889437875a9263","type":"text","text":"- 模态形状二阶导","x":-540,"y":2232,"width":250,"height":36},
{"id":"da8b0f86919e99d9","type":"text","text":"$$\n\\left[ \\frac{d^2 \\phi_{1}^{B1E}(r)}{dr^2} \\right]^2\n$$","x":10,"y":2710,"width":220,"height":120},
{"id":"6454ea0b5f37aafa","type":"text","text":"- 模态形状二阶导","x":-540,"y":2752,"width":250,"height":36},
{"id":"36c9ab3fd7a0a402","type":"text","text":"- 需要叶片挥舞刚度","x":-540,"y":2592,"width":250,"height":36},
{"id":"ab5c75b7401fb031","type":"text","text":"叶片广义摆振刚度","x":-540,"y":2424,"width":250,"height":32},
{"id":"da00f9548457388f","type":"text","text":"$$\n{k'}_{11}^{B1E} = \\int_{0}^{BldFlexL} EI^{B1E}(r) \\left[ \\frac{d^2 \\phi_{1}^{B1E}(r)}{dr^2} \\right]^2 dr \\tag{11}\n$$","x":-180,"y":2380,"width":600,"height":120},
{"id":"a20bd9b934093730","type":"text","text":"$$\nEI^{B1E}(r) = AdjEdSt^{B1} \\cdot EdgStff^{B1}(r) \\tag{12}\n$$","x":-180,"y":2570,"width":560,"height":80},
{"id":"c477cd2a76cd46fb","x":-540,"y":3101,"width":250,"height":60,"type":"text","text":"- 模态形状一阶导"},
{"id":"2ee598faf0603188","x":-540,"y":2921,"width":250,"height":83,"type":"text","text":"离心刚化效应引起的刚度项"},
{"id":"dcd9236bd7c84bd4","type":"text","text":"叶片质量属性","x":-540,"y":3356,"width":250,"height":32},
{"id":"ebc5c6d7451acc3b","type":"text","text":"- 叶片质量","x":-540,"y":3454,"width":250,"height":36},
{"id":"a49465d6a6a3c3c2","type":"text","text":"- 叶片一阶矩","x":-540,"y":3534,"width":250,"height":36},
{"id":"11e198e842aadec4","type":"text","text":"- 叶片质心","x":-540,"y":3853,"width":250,"height":36},
{"id":"7f6f9185b340d930","type":"text","text":"- 风轮质量","x":-540,"y":3954,"width":250,"height":36},
{"id":"5a48574ff6eeda7e","type":"text","text":"- 风轮惯性","x":-540,"y":4054,"width":250,"height":36},
{"id":"987e81ef1f1995b3","type":"text","text":"- 叶片二阶矩","x":-540,"y":3614,"width":250,"height":36},
{"id":"c4978e46cf739ba4","x":-180,"y":2885,"width":820,"height":346,"type":"text","text":"```rust\nelmnt_stff = f_mom_abv_nd[[k, j]] * p.dr_nodes[j] * p.rot_speed.powi(2);\n\nshape1 = shp_array(p.r_nodes_norm[j], p.bld_flex_l, &p.bld_fl1_sh.slice(s![.., k]).to_owned(), 1);\n\nshape2 = shp_array(p.r_nodes_norm[j], p.bld_flex_l, &p.bld_fl2_sh.slice(s![.., k]).to_owned(), 1);\n\nk_bf_cent[[k, 0, 0]] += elmnt_stff * shape1 * shape1;\n\nk_bf_cent[[k, 1, 1]] += elmnt_stff * shape2 * shape2;\n\nshape = shp_array(p.r_nodes_norm[j], p.bld_flex_l, &p.bld_edg_sh.slice(s![.., k]).to_owned(), 1);\n\nk_be_cent[[k, 0, 0]] += elmnt_stff * shape * shape;\n```"},
{"id":"c29809ca3c70881b","type":"text","text":" ```fortran\n p%BldMass (K) = p%TipMass(K)\n p%FirstMom (K) = p%TipMass(K)*p%BldFlexL\n p%SecondMom(K) = p%TipMass(K)*p%BldFlexL*p%BldFlexL\n ...\n p%BElmntMass(J,K) = p%MassB(K,J)*p%DRNodes(J)\n ...\n p%BldMass (K) = p%BldMass (K) + p%BElmntMass(J,K)\n p%FirstMom (K) = p%FirstMom (K) + p%BElmntMass(J,K)*p%RNodes(J)\n p%SecondMom(K) = p%SecondMom(K) + p%BElmntMass(J,K)*p%RNodes(J)*p%RNodes(J)\n \n ```","x":-180,"y":3320,"width":789,"height":460},
{"id":"253044dc6cebe206","type":"text","text":"```rust\np.bld_cg[k] = p.first_mom[k] / p.bld_mass[k];\n\np.rot_mass += p.bld_mass[k];\n\np.rot_iner += (p.second_mom[k] + p.bld_mass[k] * p.hub_rad * (2.0 * p.bld_cg[k] + p.hub_rad)) * p.cos_pre_c[k].powi(2);\n```\n","x":-156,"y":3853,"width":796,"height":237},
{"id":"9a824939bad661d2","x":-2120,"y":2252,"width":250,"height":36,"type":"text","text":"- 摆振广义质量"},
{"id":"8fa04043b651b57e","x":-2120,"y":2394,"width":250,"height":36,"type":"text","text":"- 模态形状0阶导"},
{"id":"34fed438f96dfa4c","x":-2120,"y":2540,"width":250,"height":60,"type":"text","text":"固有频率"},
{"id":"9005abbfdd8f3246","x":-2120,"y":2660,"width":250,"height":60,"type":"text","text":"挥舞固有频率"},
{"id":"8944328366cdad0c","x":-2120,"y":2780,"width":250,"height":69,"type":"text","text":"考虑叶尖质量、离心刚化"},
{"id":"a96110788e264552","x":-2120,"y":3180,"width":250,"height":60,"type":"text","text":"摆振固有频率"},
{"id":"6f03c475fcf16a01","type":"text","text":"考虑叶尖质量、离心刚化","x":-2120,"y":3320,"width":250,"height":69},
{"id":"f1cd43613a1fdfa5","type":"text","text":"广义质量","x":-2120,"y":1996,"width":250,"height":32},
{"id":"5b82d2f5eb26eefc","type":"text","text":"- 挥舞广义质量","x":-2120,"y":2094,"width":250,"height":36},
{"id":"d89b6477389b9a45","x":-2856,"y":2214,"width":476,"height":112,"type":"text","text":"$$\nm_{11}^{\\prime B1E} = \\int_{0}^{BldFlexL} \\mu^{B1}(r) \\left[ \\phi_1^{B1E}(r) \\right]^2 dr \\tag{17}\n$$"},
{"id":"5d4daed7f83a3fa5","x":-2938,"y":2057,"width":640,"height":110,"type":"text","text":"$$\nm_{ij}^{\\prime B1F} = \\int_{0}^{BldFlexL} \\mu^{B1}(r) \\phi_i^{B1F}(r) \\phi_j^{B1F}(r) \\, dr \\quad (i, j = 1, 2) \\tag{16}\n$$"},
{"id":"44300ab8ae0139cc","x":-2618,"y":2630,"width":320,"height":120,"type":"text","text":"$$\nf_i^{\\prime B1F} = \\frac{1}{2\\pi} \\sqrt{\\frac{k_{ii}^{\\prime B1F}}{m_{ii}^{\\prime B1F}}} \\tag{14}\n$$"},
{"id":"0bc6d2d448f012fd","x":-3014,"y":2780,"width":716,"height":315,"type":"text","text":"```rust\n// Natural blade I-flap frequency w/o centrifugal stiffening nor     tip mass effects\n\np.freq_bf[[k, i, 0]] = INV2PI * (p.kbf[[k, i, i]] / (m_bf[[k, i, i]] - p.tip_mass[k])).sqrt();\n\n// Natural blade I-flap frequency w/o centrifugal stiffening, but w/ tip mass effects\n\np.freq_bf[[k, i, 1]] = INV2PI * (p.kbf[[k, i, i]] / m_bf[[k, i, i]]).sqrt();\n\n// Natural blade I-flap frequency w/  centrifugal stiffening and     tip mass effects\n\np.freq_bf[[k, i, 2]] = INV2PI * ((p.kbf[[k, i, i]] + k_bf_cent[[k, i, i]]) / m_bf[[k, i, i]]).sqrt();\n```"},
{"id":"5047212eb42c9e69","type":"text","text":"$$\nf_i^{\\prime B1E} = \\frac{1}{2\\pi} \\sqrt{\\frac{k_{ii}^{\\prime B1E}}{m_{ii}^{\\prime B1E}}} \\tag{15}\n$$","x":-2618,"y":3150,"width":320,"height":120},
{"id":"f5ccbef2e5e250b9","type":"text","text":"```rust\n// Natural blade 1-edge frequency w/o centrifugal stiffening nor      tip mass effects\n\np.freq_be[[k, 0, 0]] = INV2PI * (p.kbe[[k, 0, 0]] / (m_be[[k, 0, 0]] - p.tip_mass[k])).sqrt();\n\n// Natural Blade 1-edge frequency w/o  centrifugal stiffening, but w/ tip mass effects\n\np.freq_be[[k, 0, 1]] = INV2PI * (p.kbe[[k, 0, 0]] / m_be[[k, 0, 0]]).sqrt();\n\n// Natural Blade 1-edge frequency w/  centrifugal stiffening and      tip mass effects\n\np.freq_be[[k, 0, 2]] = INV2PI * ((p.kbe[[k, 0, 0]] + k_be_cent[[k, 0, 0]]) / m_be[[k, 0, 0]]).sqrt();\n```","x":-3014,"y":3320,"width":716,"height":315},
{"id":"b5bee6a3e7c29d31","type":"text","text":"叶片广义参数计算","x":-1440,"y":2916,"width":250,"height":93},
{"id":"204d6c2f3ec03ac0","x":-2120,"y":3740,"width":250,"height":60,"type":"text","text":"广义阻尼"},
{"id":"1684e3f8b6f17829","type":"text","text":"广义阻尼","x":-2120,"y":3860,"width":250,"height":60}
],
"edges":[
{"id":"647c1b45edc92b02","fromNode":"9461f7dd96103316","fromSide":"bottom","toNode":"0c8534c8ba68c9a6","toSide":"top"},
{"id":"e3d4293dd3262f2d","fromNode":"9461f7dd96103316","fromSide":"bottom","toNode":"5eaa425c204bf600","toSide":"top"},
{"id":"9a803fcaec81414e","fromNode":"38d3d1a313c094ee","fromSide":"right","toNode":"8ec17237cebe7433","toSide":"left"},
{"id":"7ff52c30a0b0347d","fromNode":"a729b7930412f0b1","fromSide":"bottom","toNode":"d405163cb9ecd804","toSide":"top"},
{"id":"d97ef554530b15b5","fromNode":"c20eeff7484d8a39","fromSide":"right","toNode":"a729b7930412f0b1","toSide":"left"},
{"id":"034d145edd7cfce0","fromNode":"0c8534c8ba68c9a6","fromSide":"bottom","toNode":"6094c53caf966263","toSide":"top"},
{"id":"da18b7fa4859fa6f","fromNode":"5eaa425c204bf600","fromSide":"bottom","toNode":"6094c53caf966263","toSide":"top"},
{"id":"5d5f4fef281a656e","fromNode":"6094c53caf966263","fromSide":"right","toNode":"da500b2b12ed0901","toSide":"left"},
{"id":"5573fa12a3a02ee0","fromNode":"da500b2b12ed0901","fromSide":"right","toNode":"20ce8d75f0f35588","toSide":"left"},
{"id":"c4828432b71fd99a","fromNode":"4bfacdf3ddedbdec","fromSide":"right","toNode":"ae48e80ccd92bffa","toSide":"left"},
{"id":"8ded09c7902a30b6","fromNode":"ae48e80ccd92bffa","fromSide":"right","toNode":"ed5a265dc4b72aaa","toSide":"left"},
{"id":"4818c7bc8aa99b57","fromNode":"b624e8c6302b9a1c","fromSide":"right","toNode":"1054909d642ce071","toSide":"left"},
{"id":"d58b296db32dc932","fromNode":"1054909d642ce071","fromSide":"bottom","toNode":"1e1a1a0d67920443","toSide":"top"},
{"id":"f88001eedfed69b8","fromNode":"1e1a1a0d67920443","fromSide":"bottom","toNode":"092cf6719d47d01d","toSide":"top"},
{"id":"d0bfe0faa41e4e2f","fromNode":"6c3a6982a53e7df9","fromSide":"right","toNode":"f3c36900dd3ed9d1","toSide":"left"},
{"id":"14130329273bf6fc","fromNode":"092cf6719d47d01d","fromSide":"right","toNode":"14a4450243ca9953","toSide":"left"},
{"id":"4d588dd609ceeb1e","fromNode":"f65edb48b74e18d7","fromSide":"right","toNode":"cccd4482e817fca4","toSide":"left"},
{"id":"2e2be072d2f0e10f","fromNode":"e0d016f4bb106554","fromSide":"right","toNode":"722e4b9c310e6d2a","toSide":"left"},
{"id":"8c75af2dfe500f7c","fromNode":"f65edb48b74e18d7","fromSide":"left","toNode":"e0d016f4bb106554","toSide":"left"},
{"id":"ffb790d799b2ad82","fromNode":"f65edb48b74e18d7","fromSide":"left","toNode":"a9889437875a9263","toSide":"left"},
{"id":"cdc9289e799ecaaf","fromNode":"a9889437875a9263","fromSide":"right","toNode":"50e241bef2144ea1","toSide":"left"},
{"id":"7f1bc02337b44a20","fromNode":"36c9ab3fd7a0a402","fromSide":"right","toNode":"a20bd9b934093730","toSide":"left"},
{"id":"8785ed74e88adf4e","fromNode":"6454ea0b5f37aafa","fromSide":"right","toNode":"da8b0f86919e99d9","toSide":"left"},
{"id":"7ed2af81de878d33","fromNode":"ab5c75b7401fb031","fromSide":"right","toNode":"da00f9548457388f","toSide":"left"},
{"id":"b9462798dc7ea087","fromNode":"ab5c75b7401fb031","fromSide":"left","toNode":"36c9ab3fd7a0a402","toSide":"left"},
{"id":"6e6a4a6a3c31137f","fromNode":"ab5c75b7401fb031","fromSide":"left","toNode":"6454ea0b5f37aafa","toSide":"left"},
{"id":"c23bb251830336d5","fromNode":"b5bee6a3e7c29d31","fromSide":"right","toNode":"f65edb48b74e18d7","toSide":"left"},
{"id":"9ab29f4b57e27b0d","fromNode":"b5bee6a3e7c29d31","fromSide":"right","toNode":"ab5c75b7401fb031","toSide":"left"},
{"id":"f54ee3299cbf7265","fromNode":"b5bee6a3e7c29d31","fromSide":"right","toNode":"dcd9236bd7c84bd4","toSide":"left"},
{"id":"61aa378205c46b26","fromNode":"dcd9236bd7c84bd4","fromSide":"left","toNode":"ebc5c6d7451acc3b","toSide":"left"},
{"id":"28f6e87b0c7eea26","fromNode":"dcd9236bd7c84bd4","fromSide":"left","toNode":"a49465d6a6a3c3c2","toSide":"left"},
{"id":"ff4d8f82fdfdb90d","fromNode":"dcd9236bd7c84bd4","fromSide":"left","toNode":"987e81ef1f1995b3","toSide":"left"},
{"id":"92f9ed21804f53e2","fromNode":"987e81ef1f1995b3","fromSide":"bottom","toNode":"11e198e842aadec4","toSide":"top"},
{"id":"b3ec4450d2d0a73b","fromNode":"11e198e842aadec4","fromSide":"top","toNode":"7f6f9185b340d930","toSide":"top"},
{"id":"dffde18030232f37","fromNode":"7f6f9185b340d930","fromSide":"bottom","toNode":"5a48574ff6eeda7e","toSide":"top"},
{"id":"257676f063ba93a2","fromNode":"ebc5c6d7451acc3b","fromSide":"right","toNode":"c29809ca3c70881b","toSide":"left"},
{"id":"a19f6c3e9df6f3c6","fromNode":"a49465d6a6a3c3c2","fromSide":"right","toNode":"c29809ca3c70881b","toSide":"left"},
{"id":"9b20ae7ad0081184","fromNode":"987e81ef1f1995b3","fromSide":"right","toNode":"c29809ca3c70881b","toSide":"left"},
{"id":"f093013ff0a96dd0","fromNode":"11e198e842aadec4","fromSide":"right","toNode":"253044dc6cebe206","toSide":"left"},
{"id":"02244e836b50d487","fromNode":"7f6f9185b340d930","fromSide":"right","toNode":"253044dc6cebe206","toSide":"left"},
{"id":"99cf66af0f6ec6d3","fromNode":"5a48574ff6eeda7e","fromSide":"right","toNode":"253044dc6cebe206","toSide":"left"},
{"id":"3f71b0b7e384a8be","fromNode":"b5bee6a3e7c29d31","fromSide":"right","toNode":"2ee598faf0603188","toSide":"left"},
{"id":"56f5f551d20be422","fromNode":"2ee598faf0603188","fromSide":"left","toNode":"c477cd2a76cd46fb","toSide":"left"},
{"id":"cc3407d414603eb8","fromNode":"2ee598faf0603188","fromSide":"right","toNode":"c4978e46cf739ba4","toSide":"left"},
{"id":"b6160496e46a4eae","fromNode":"c477cd2a76cd46fb","fromSide":"right","toNode":"c4978e46cf739ba4","toSide":"left"},
{"id":"3368bcd74ba9e4fb","fromNode":"9005abbfdd8f3246","fromSide":"bottom","toNode":"8944328366cdad0c","toSide":"top"},
{"id":"6909067532cb91bc","fromNode":"a96110788e264552","fromSide":"bottom","toNode":"6f03c475fcf16a01","toSide":"top"},
{"id":"321843e8dd3be858","fromNode":"5b82d2f5eb26eefc","fromSide":"left","toNode":"5d4daed7f83a3fa5","toSide":"right"},
{"id":"3925cae98ff11bdc","fromNode":"9a824939bad661d2","fromSide":"left","toNode":"d89b6477389b9a45","toSide":"right"},
{"id":"88b616e16f0fd305","fromNode":"f1cd43613a1fdfa5","fromSide":"right","toNode":"5b82d2f5eb26eefc","toSide":"right"},
{"id":"68f5cf5a18a17801","fromNode":"f1cd43613a1fdfa5","fromSide":"right","toNode":"9a824939bad661d2","toSide":"right"},
{"id":"ebac050a172817ba","fromNode":"f1cd43613a1fdfa5","fromSide":"right","toNode":"8fa04043b651b57e","toSide":"right"},
{"id":"c6940f9a6f6ed020","fromNode":"9005abbfdd8f3246","fromSide":"left","toNode":"44300ab8ae0139cc","toSide":"right"},
{"id":"90f4d6c4e8f93b32","fromNode":"8944328366cdad0c","fromSide":"left","toNode":"0bc6d2d448f012fd","toSide":"right"},
{"id":"9854bbe1c5c3932e","fromNode":"a96110788e264552","fromSide":"left","toNode":"5047212eb42c9e69","toSide":"right"},
{"id":"16d9a0e220097480","fromNode":"6f03c475fcf16a01","fromSide":"left","toNode":"f5ccbef2e5e250b9","toSide":"right"},
{"id":"d52e7f0275237844","fromNode":"34fed438f96dfa4c","fromSide":"right","toNode":"9005abbfdd8f3246","toSide":"right"},
{"id":"63ad29914f63862d","fromNode":"34fed438f96dfa4c","fromSide":"right","toNode":"a96110788e264552","toSide":"right"},
{"id":"c58c7b2bd323e581","fromNode":"b5bee6a3e7c29d31","fromSide":"left","toNode":"f1cd43613a1fdfa5","toSide":"right"},
{"id":"b427c81d66172385","fromNode":"b5bee6a3e7c29d31","fromSide":"left","toNode":"34fed438f96dfa4c","toSide":"right"},
{"id":"eaf4a6506bae5f72","fromNode":"b5bee6a3e7c29d31","fromSide":"left","toNode":"204d6c2f3ec03ac0","toSide":"right"}
]
}

View File

@ -4,4 +4,16 @@
关闭叶片柔性,转速不发散
思路: 判断是否由于叶片变形量为负导致转速发散,尝试从叶片方程探究为什么变形量为负
思路: 判断是否由于叶片变形量为负导致转速发散,尝试从叶片方程探究为什么变形量为负
p.kbf
p.cbf
数太大了
明阳机型是nrel 5mw的100倍
p.ktfa
p.ctfa
p.ktss
p.ctss
明阳机型是nrel 5mw的1000倍

View File

@ -6,7 +6,7 @@
{"id":"82708a439812fdc7","type":"text","text":"# 1月已完成\n\n\n\n","x":-220,"y":134,"width":440,"height":560},
{"id":"505acb3e6b119076","type":"text","text":"# 12月已完成\n\nP1 明阳机型验证\n\n- 商业机型建模 done\n- 正常发电工况对故障工况支持 故障建模 done\n\t- 超速n4 普通超速 多体设fault结构体 \n\t- 卡桨、 控制设fault结构体\n\n- 故障工况检查 done\n- 批量计算更新配置文件,风文件,程序版本,再计算 done\n\nP1 稳态工况init_with_yaml检查 done\n\nP1 前端\n- 所有simulation功能测试及对接 done\n\nP1 演示ppt补充内容 再补充\n- 补充steady operational loads / steady parked loads 缺结果 done\n- 6个算例的跑通 找一个与bladed对比 缺结果 done \n- 内部控制器 pass\n- batch 并行计算 单个工况是否快 多工况并行 暂时不做\n\nP1 前端\n- steady输出的名字改掉 done\n- 批量计算 改成并行计算 功能界面\n- 瞬态计算更新控制器 测试 done\n- 简单内控\n- 比较Bladed与正常发电工况速度总时间短一点 multicase done\n- 是否需要增加相对路径问题 done\n\nP1 dlc 71 done\n\nP1 输出量更新到Bladed相同命名 done\n\nP1 专利 done\n- 做出solidworks模型写专利\n\n","x":-700,"y":134,"width":440,"height":560},
{"id":"30cb7486dc4e224c","type":"text","text":"# 2月已完成\n\n\n","x":260,"y":134,"width":440,"height":560},
{"id":"c18d25521d773705","type":"text","text":"# 计划\n这周要做的3~5件重要的事情这些事情能有效推进实现OKR。\n\nP1 必须做。P2 应该做\n\n\nP2 柔性部件 叶片、塔架变形算法 主线\n- 变形体动力学 简略看看ing\n- 柔性梁弯曲变形振动学习,主线 \n\t- 广义质量 刚度矩阵及含义\n\t\n- 梳理bladed动力学框架\n\t- 子结构文献阅读\n\t- 叶片模型建模 done\n- 共旋方法学习\n- DTU 变形量计算方法学习\n\n\nP1 线性化方法编写 ing\n\n- 开始编写扰动代码\n- 形成系统矩阵-输出矩阵\n\n\nP1 明阳机型验证 \n\n- 商业机型模型验证 气动建模有问题\n- 动态失速计算慢\n- 叶片发散\n\n\nP2 气动、多体、控制、水动联调\n\n\n\nP1 服务器网络申请 ing\nP1 报告更新到0.6版本 ing\n\nP2 bladed对比--稳态运行载荷,产出报告\n- 气动参与模块对比\n- 模态对比 两种描述方法不同bladed方向更多x y z deflection, x y z rotation不好对比\n- 气动对比 aerodynamic info 轴向切向诱导因子,根部,尖部差距较大\n\nP2 yaw 自由度再bug确认 已知原理了\n","x":-597,"y":-803,"width":453,"height":457},
{"id":"c18d25521d773705","type":"text","text":"# 计划\n这周要做的3~5件重要的事情这些事情能有效推进实现OKR。\n\nP1 必须做。P2 应该做\n\n\nP2 柔性部件 叶片、塔架变形算法 主线\n- 变形体动力学 简略看看ing\n- 柔性梁弯曲变形振动学习,主线 \n\t- 广义质量 刚度矩阵及含义\n\t\n- 梳理bladed动力学框架\n\t- 子结构文献阅读\n\t- 叶片模型建模 done\n- 共旋方法学习\n- DTU 变形量计算方法学习\n\n\nP1 线性化方法编写 ing\n\n- 开始编写扰动代码\n- 形成系统矩阵-输出矩阵\n\n\nP1 明阳机型验证 \n\n- 商业机型模型验证 气动建模有问题\n- 动态失速计算慢 done\n- 叶片发散 叶片往前位移\n\n\nP1 服务器网络申请 ing\n- 等待自托管机架信息\n\n\nP1 报告更新到0.6版本 ing\n\nP2 bladed对比--稳态运行载荷,产出报告\n- 气动参与模块对比\n- 模态对比 两种描述方法不同bladed方向更多x y z deflection, x y z rotation不好对比\n- 气动对比 aerodynamic info 轴向切向诱导因子,根部,尖部差距较大\n\nP2 yaw 自由度再bug确认 已知原理了\n","x":-597,"y":-803,"width":453,"height":457},
{"id":"86ab96a25a3bf82e","type":"text","text":" 湍流风+ 控制的联调bladed也算一个算例\n- 加水动的联调\n- 8月份底完成这两个\n- 9月份完成停机等工况测试\n- 10月份明阳实际机型测试","x":580,"y":-803,"width":480,"height":220},
{"id":"e355f33c92cf18ea","type":"text","text":"9月份定常计算对接前端\n非定常测试完也对接前端","x":580,"y":-500,"width":480,"height":100},
{"id":"859e6853b7f1b92b","type":"text","text":"年底考核:\n专利\n线性化模块","x":1200,"y":-803,"width":320,"height":110},

3
未命名 1.base Normal file
View File

@ -0,0 +1,3 @@
views:
- type: table
name: 表格