**当前实际运行控制**

程序先读 [Analyse.dat](E:\CodingTests\backup\SAToex64\SAToex64\x64\Release\Data\Input\Analyse.dat)：

```text
AFlag = 3
owt_test_mode = 1
```

含义是：

- `AFlag=3`：进入固定式风机 FEM，不走浮式 `AFlag=1/2` 链路。
- `owt_test_mode=1`：选择单桩，实际读取 `Data\Input\FEM\monopile_input.dat`。
- 若改为 `owt_test_mode=2`：选择导管架，读取 `Data\Input\FEM\jacket_input.dat`。
- `owt_test_mode=0`：不执行固定式 FEM。

入口在 [Analyse.f90](E:\CodingTests\backup\SAToex64\SourceFiles\Solve\Analyse.f90)，固定式输入解析在 [OWTInputModule.f90](E:\CodingTests\backup\SAToex64\SourceFiles\Solve\FEM\OWTInputModule.f90)，建模与计算在 [OWTFixed.f90](E:\CodingTests\backup\SAToex64\SourceFiles\Solve\FEM\OWTFixed.f90)。

目前运行的是：

```text
Analyse.dat
  -> AFlag=3
  -> owt_test_mode=1
  -> FEM\monopile_input.dat
  -> tower_nrel5mw.dat
  -> soil_profile.dat
```

---

**FEM 目录文件说明**

| 文件 | 当前是否自动使用 | 用途 |
|---|---:|---|
| `monopile_input.dat` | 是，当前 | 单桩固定式风机主输入文件。 |
| `jacket_input.dat` | 仅 `owt_test_mode=2` | 导管架固定式风机主输入文件。 |
| `tower_nrel5mw.dat` | 是 | 单桩、导管架共用的外部塔筒离散几何。 |
| `soil_profile.dat` | 是 | 单桩、导管架共用的分层土层文件。 |
| `member_property_example.dat` | 否，示例 | 构件级材料、截面、水动力、海生物、充水覆盖文件格式示例。 |
| `soil_model_curve_example.dat` | 否，示例 | 分层乘子、自定义 `p-y/t-z/m-t/q-z` 曲线覆盖文件示例。 |
| `load_case_example.dat` | 否，示例 | 基础荷载工况与组合系数文件示例。 |
| `monopile_engineering_template.dat` | 否，模板 | 单桩工程化输出和瞬态 VTP 的推荐配置片段。 |
| `jacket_engineering_template.dat` | 否，模板 | 导管架工程化输出和瞬态 VTP 的推荐配置片段。 |
| `fixed_owt_input_reference.md` | 否，说明 | 输入 v2 与 VTP 输出字段说明。 |

---

**主输入文件的结构**

`monopile_input.dat` 与 `jacket_input.dat` 都是 Fortran namelist 文件，分组一致：

| Namelist 分组 | 控制内容 |
|---|---|
| `FOUNDATION_CONFIG` | 基础类型、桩尺寸、埋置深度、海床高程、导管架几何与撑杆类型。 |
| `TOWER_CONFIG` | 塔筒是否启用、外部塔筒文件或简化线性锥筒参数。 |
| `MATERIAL_CONFIG` | 钢材弹性模量、泊松比、密度、屈服强度、腐蚀裕量等。 |
| `SOIL_CONFIG` | BNWF 开关、土模型、外部土层文件、冲刷、桩端条件、`m-t/Hb/Mb` 等。 |
| `ENVIRONMENT_CONFIG` | 波浪、海流、水位、海生物、浮力、充水等环境与水动力参数。 |
| `AERO_CONFIG` | 风机气动、轮毂、转子和机舱相关参数。 |
| `TOPLOAD_CONFIG` | 塔顶集中力、力矩、机舱/轮毂/转子质量。 |
| `ANALYSIS_CONFIG` | 静力、模态、瞬态、梁理论、P-Delta、载荷工况和输入校验。 |
| `OUTPUT_CONFIG` | DAT/CSV、应力、时程、工程摘要、VTP/PVD 输出。 |

---

**现在单桩模型实际采用的设置**

[monopile_input.dat](E:\CodingTests\backup\SAToex64\SAToex64\x64\Release\Data\Input\FEM\monopile_input.dat) 当前关键值：

- 基础：外径 `6.0 m`、壁厚 `0.06 m`、埋深 `30 m`、海床 `z=-50 m`。
- 桩端：`pile_end_condition="open_unplugged"`，即开口未塞土桩。
- 土耦合：`soil_enabled=.TRUE.`、`soil_coupling_mode="bnwf_distributed"`。
- 土层：`soil_input_file="Data\Input\FEM\soil_profile.dat"`，因此不会采用内置两层默认土。
- 塔筒：`tower_file="Data\Input\FEM\tower_nrel5mw.dat"`，因此不会采用输入文件中的简化线性锥筒。
- 梁理论：`beam_theory_default="timoshenko"`。
- 分析：`analysis_type="transient"`，`dt=0.05 s`，总时长 `12 s`。
- 输入校验：`input_schema_version=2`、`input_validation_mode="strict"`。
- 工程输出：工程摘要、时域节点统计、真实 FEM VTP、PVD 已开启。
- 构件覆盖、土曲线覆盖、荷载组合：当前都为空，故不会读取对应示例文件。

---

**现在导管架模型实际采用的设置**

[jacket_input.dat](E:\CodingTests\backup\SAToex64\SAToex64\x64\Release\Data\Input\FEM\jacket_input.dat) 在切换 `owt_test_mode=2` 后使用：

- 基础：四腿导管架，`6` 层 bay，底宽 `12 m`、顶宽 `8 m`。
- 腿管：外径 `1.2 m`、壁厚 `0.05 m`。
- 撑杆：外径 `0.8 m`、壁厚 `0.02 m`。
- 撑杆单元：`jacket_brace_member_type="beam"`，即撑杆有轴力、剪力、弯矩和扭矩；改为 `"rod"` 后为仅轴力杆。
- 每根桩：开口未塞土、埋深 `30 m`。
- 土层、塔筒、分析类型、工程输出控制与单桩类似。
- 当前仍采用 `bnwf_distributed`。上一次烟雾测试中导管架进入长时间非线性迭代，尚未完成“该工况收敛”的验收；这与输入选择无关，而是该模型/工况的求解诊断事项。

---

**外部塔筒文件**

[tower_nrel5mw.dat](E:\CodingTests\backup\SAToex64\SAToex64\x64\Release\Data\Input\FEM\tower_nrel5mw.dat) 是当前真实消费的塔筒几何文件：

```text
segment_height(m)  outer_diameter(m)  wall_thickness(m)
```

- 共 11 段，高度合计 `77.6 m`。
- 每一行直接控制对应塔段长度、外径和壁厚。
- 单桩和导管架输入中的 `tower_height_m`、直径和壁厚锥度参数，在 `tower_file` 非空且成功读取时仅作为回退参数，不是实际塔筒离散依据。
- 塔筒放置高程由主输入 `tower_base_height_msl_m` 控制：单桩当前为 `0 m`，导管架当前为 `15 m`。

---

**外部土层文件**

[soil_profile.dat](E:\CodingTests\backup\SAToex64\SAToex64\x64\Release\Data\Input\FEM\soil_profile.dat) 是当前真实消费的五层土层文件。

每个数据行格式：

```text
z0  z1  soil_type  gamma  phi  su  Es  mu
```

单位：

- `z0/z1`：自泥面向下的深度，m
- `gamma`：总重度，kN/m3
- `phi`：内摩擦角，deg
- `su`：不排水抗剪强度，kPa
- `Es`：土弹性模量，MPa
- `mu`：泊松比

当前土层为：

1. `0–5 m`：砂土  
2. `5–15 m`：砂土  
3. `15–25 m`：黏土  
4. `25–40 m`：黏土  
5. `40–60 m`：砂土  

BNWF 在嵌入段沿桩离散，逐点查询该文件的分层参数，建立 `p-y/t-z/q-z` 弹簧；不是再使用旧的“砂土+黏土”两层硬编码回退模型。只有 `soil_input_file=""` 或读取失败且使用非严格模式时，才会退回内置两层参数。

---

**三个可选覆盖文件如何启用**

主输入中的以下三个字段当前均为空字符串，故对应文件只是示例，并未参与计算：

```fortran
soil_model_file = ""
member_property_file = ""
load_case_file = ""
```

启用方法：

```fortran
soil_model_file = "Data\Input\FEM\soil_model_curve_example.dat"
member_property_file = "Data\Input\FEM\member_property_example.dat"
load_case_file = "Data\Input\FEM\load_case_example.dat"
```

- `soil_model_file`：覆盖土层乘子或指定深度的自定义骨架曲线。
- `member_property_file`：按构件 ID 或名称覆盖外径、厚度、`Cd/Cm/Ca`、海生物厚度、充水状态等。
- `load_case_file`：定义 `gravity/buoyancy/aero/hydro/top` 的基本工况和组合。非线性土情况下，组合荷载会先合成后再求解，不能将各单工况位移直接线性相加。

---

**输出控制现状**

当前单桩、导管架输入中已启用：

```fortran
write_resolved_input = .TRUE.
output_profile = "engineering"
result_table_format = "dat_csv"
transient_statistics_enabled = .TRUE.
code_reference_mode = "both"
vtk_transient_enabled = .TRUE.
vtk_transient_save_interval = 20
vtk_field_level = "engineering"
```

运行后主要输出到 `Data\Output`：

- `<case>_resolved_input.dat`：程序实际消费的关键输入值与文件路径。
- `<case>_engineering_summary.csv`：质量、位移、平衡残差、土反力动员率等摘要。
- `<case>_transient_node_statistics.csv`：节点平动位移的最小、最大、峰值时刻、均值、RMS、标准差。
- `<case>_member_end_forces.dat`：构件端部 `N/Vy/Vz/T/My/Mz`。
- `<case>_soil_reactions.dat`：BNWF 反力、切线刚度、动员率等。
- `<case>_code_reference.csv`：`REFERENCE_ONLY` 工程筛查指标，不是正式 DNV/API 合规结论。
- `3DModelData\<case>_Structure_Initial.vtp`：真实初始 FEM 网格。
- `3DModelData\<case>_Structure.tN.vtp`：真实瞬态节点场和构件端力帧。
- `3DModelData\<case>_Structure.pvd`：ParaView 时间序列索引。

需要注意：`output_channel_file`、`save_node_history`、`save_member_history`、`save_soil_history`、`spectral_summary_enabled` 已能被输入解析，但当前版本尚未形成“按文件筛选通道”和 Welch PSD 的专用输出链路；现有时程输出仍由 `save_time_history` 等开关控制。

可以直接在主输入文件里设置，三个覆盖文件不是必须的。它们的意义是把“基础模型定义”和“工况/局部调整”分开，适合工程迭代。

`soil_model_file`

主输入里的 `SOIL_CONFIG` 适合放通用开关和简单参数，例如土层文件、`p-y` 模型类型、冲刷深度、桩端状态。

覆盖文件适合放更细的土模型数据：

- 按土层设置 `p/t/q` 乘子；
- 在指定深度给自定义 `p-y`、`t-z`、`m-t`、`q-z` 离散曲线；
- 保留同一份 `soil_profile.dat`，只替换某个勘察解释版本或校准版本。

好处是土层的原始地质资料不必随每次曲线校准而修改，便于审计“基础资料”和“计算假设”的差别。

`member_property_file`

主输入适合定义全局默认值，例如全体构件的材料、腐蚀、海生物、充水和 Morison 系数。

覆盖文件适合少数构件的例外情况：

- Jacket 腿、撑杆、过渡段、桩、塔筒采用不同 `Cd/Cm/Ca`；
- 指定构件有不同腐蚀裕量、海生物厚度、外径或壁厚；
- 个别构件充水、其他构件不充水；
- 不改主体几何文件，只做方案比选。

例如同一导管架中，水下腿管可设海生物和充水，水上撑杆维持默认值。若全放在主输入中，需要增加大量“第 N 个构件”的字段，主文件会很难维护。

`load_case_file`

主输入中的 `AERO_CONFIG`、`ENVIRONMENT_CONFIG`、`TOPLOAD_CONFIG` 应定义基础物理状态和基础荷载。

覆盖文件适合定义工程工况及组合：

```text
CASE,DEAD,gravity,1.0
CASE,WIND,aero,1.0
CASE,WAVE,hydro,1.0
COMB,ULS_01,DEAD,1.0
COMB,ULS_01,WIND,1.35
COMB,ULS_01,WAVE,1.35
```

好处：

- 结构、土层、环境基础模型只维护一份；
- 可快速跑多个 ULS/SLS/极端风浪方向组合；
- 对 BNWF 非线性问题，程序会先合成该组合的荷载，再独立求解，避免错误地叠加非线性位移；
- 输出能记录控制工况，便于包络和追溯。

**建议**

- 初期建模、单一设计工况：直接写在 `monopile_input.dat` 或 `jacket_input.dat`，三个字段保持空即可。
- 做参数敏感性、多个环境组合、构件局部差异、土曲线标定：启用外部覆盖文件会更清晰可靠。

所以它们不是为了替代主输入，而是作为“工程方案层”。主输入定义模型骨架；覆盖文件定义局部修正和成组工况。


**环境定义位置**

固定式主输入文件在：

- [monopile_input.dat](E:/CodingTests/backup/SAToex64/SAToex64/x64/Release/Data/Input/FEM/monopile_input.dat:128)
- [jacket_input.dat](E:/CodingTests/backup/SAToex64/SAToex64/x64/Release/Data/Input/FEM/jacket_input.dat:124)

环境参数位于 `&ENVIRONMENT_CONFIG`，分析与地震参数位于 `&ANALYSIS_CONFIG`。完整工程化示例在：

- [monopile_engineering_template.dat](E:/CodingTests/backup/SAToex64/SAToex64/x64/Release/Data/Input/FEM/monopile_engineering_template.dat:22)
- [jacket_engineering_template.dat](E:/CodingTests/backup/SAToex64/SAToex64/x64/Release/Data/Input/FEM/jacket_engineering_template.dat:22)

运行时应以 `E:\CodingTests\backup\SAToex64\SAToex64\x64\Release` 为工作目录启动，文件中的 `Data\Input\...` 相对路径才能正确解析。

**波浪与海流**

波浪通过下列字段定义：

```fortran
hydrodynamic_enabled = .TRUE. ! Master Morison, buoyancy and added-mass switch
wave_enabled = .TRUE.
wave_model = "regular"       ! regular | pm | jonswap | table
wave_height_m = 4.0
wave_period_s = 8.0
wave_direction_deg = 0.0
```

`regular` 是旧案例兼容的规则波。`pm`、`jonswap` 和 `table` 使用同一组线性波分量同时计算：

- 自由液面；
- 构件积分点波浪速度与加速度；
- Morison 波浪荷载；
- 环境时程；
- VTP 中随时间起伏的水面。

JONSWAP/PM 可配置 `Hs`、`Tp`、峰值增强系数、频率范围、分量数和随机种子；`table` 从用户频谱文件读取 `frequency_hz, PSD_m2_per_hz`。

海流配置同样在 `&ENVIRONMENT_CONFIG`：

```fortran
current_enabled = .TRUE.
current_profile_mode = "power" ! constant | power | linear | table
current_speed_ms = 0.5
current_direction_deg = 0.0
current_power_factor = 0.1
current_profile_file = ""
```

`table` 文件按高程读取速度与方向。Morison 计算时，波浪水粒子速度与海流速度在每个实际梁积分点叠加，再与构件运动速度形成相对流速。

实现位于 [OWTFixed.f90](E:/CodingTests/backup/SAToex64/SourceFiles/Solve/FEM/OWTFixed.f90:13249)。

**风场与风速**

固定式风使用：

```fortran
wind_enabled = .TRUE.
wind_source_mode = "steady"  ! steady | hub_file | full_field
wind_speed_ms = 11.4
wind_reference_height_m = 87.6
wind_direction_deg = 0.0
wind_shear_exponent = 0.11

wind_file_hh = "Data\Input\WindData\windfield.hh"
wind_file_u  = "Data\Input\WindData\windfield.u"
wind_file_v  = "Data\Input\WindData\windfield.v"
wind_file_w  = "Data\Input\WindData\windfield.w"
```

风文件目录是 [WindData](E:/CodingTests/backup/SAToex64/SAToex64/x64/Release/Data/Input/WindData)。

- `steady`：按参考高度、风向和幂律风剖面计算定常三维风。
- `hub_file`：读取 `.hh`，对时间线性插值；全结构共享该时变轮毂风，未提供横向/高度变化。
- `full_field`：读取 `.u/.v/.w`，按时间线性插值，并在横向 `Y` 和高度 `Z` 作双线性插值。它适用于 TurbSim 类湍流全风场。

建议工程时程采用 `full_field`，这样叶素、塔筒和导管架可在各自真实空间位置获得同一风场中的不同风速。

**同源风场计算链路**

统一风环境初始化在 [OWTFixed.f90](E:/CodingTests/backup/SAToex64/SourceFiles/Solve/FEM/OWTFixed.f90:13876)，公共查询入口是 `FixedWindVelocityAtPoint(time, position, velocity)`。

链路为：

1. 固定式输入读取 `wind_source_mode` 与对应文件。
2. 初始化既有 `WindCal` 风场读取和插值能力，但不修改浮式风机的读取链路。
3. 转子气动在每个叶素位置调用 `WindCal`，取得该叶素时刻、位置的三分量风速。
4. 塔筒和导管架露出水面的实际 beam 构件，在三个 Gauss 积分点调用同一个 `FixedWindVelocityAtPoint`。
5. 空气阻力根据法向相对风速、真实外径和 `Cd` 计算，并用一致等效节点力方法转成节点力和节点矩。
6. 转子气动合力与合矩通过已实现的 `r × F` 力系转换施加到塔顶，不依赖硬编码转子重力。

严格模式下，`aero_wind_speed_ms` 必须与 `wind_speed_ms` 一致，避免转子和结构分别配置标量风速。

空气阻力露出判定使用**固定静水面**：

```fortran
z_integration_point > water_level_m
```

不使用瞬时波面来判断构件是否受风，符合你刚刚确认的要求。构件风阻实现见 [OWTFixed.f90](E:/CodingTests/backup/SAToex64/SourceFiles/Solve/FEM/OWTFixed.f90:6220)，转子实际风场读取见 [OWT_AeroDynamics.f90](E:/CodingTests/backup/SAToex64/SourceFiles/Solve/FEM/OWT_AeroDynamics.f90:109)。

`aero_enabled` 控制转子气动荷载；`apply_tower_drag` 独立控制露出水面 beam 构件的空气阻力。`wind_enabled=.FALSE.` 时，严格模式拒绝启用气动荷载；兼容模式会报警并自动关闭气动荷载，避免转子退回到独立标量风速。

每个输出时刻会在 `*_environment_history.csv` 记录轮毂波浪、海流、风速与地震加速度，便于追查风场来源和插值结果。

**三向地震时程**

在 `&ANALYSIS_CONFIG` 中配置：

```fortran
seismic_enabled = .TRUE.
seismic_analysis_mode = "time_history"
seismic_config_file = "Data\Input\FEM\fixed_owt_seismic_time_history_example.dat"
seismic_scale_factor = 1.0
seismic_damping_ratio = 0.05
```

文件格式见 [fixed_owt_seismic_time_history_example.dat](E:/CodingTests/backup/SAToex64/SAToex64/x64/Release/Data/Input/FEM/fixed_owt_seismic_time_history_example.dat:1)：

```text
time_s, acceleration_x_m_s2, acceleration_y_m_s2, acceleration_z_m_s2
0.0, ...
0.1, ...
```

程序对 `X/Y/Z` 三向地震加速度分别进行时间线性插值，在每个固定式瞬态时间步按相对坐标地震输入施加等效惯性荷载：

```text
F_seismic(t) = -M * r * ag(t)
```

其中 `M` 是当前 FEM 总质量矩阵，`r` 是三个平动方向的影响向量，`ag(t)` 为三分量地面加速度。它与风、波、流在同一个固定式瞬态载荷组装流程中叠加；BNWF 仍走原有的试算/收敛/提交过程。

时程结果输出 `*_seismic_history.dat`，环境总表也同步写入 `ag_x/ag_y/ag_z`。

**反应谱设置**

反应谱示例见 [fixed_owt_seismic_spectrum_example.dat](E:/CodingTests/backup/SAToex64/SAToex64/x64/Release/Data/Input/FEM/fixed_owt_seismic_spectrum_example.dat:1)：

```text
period_s, Sa_x_m_s2, Sa_y_m_s2, Sa_z_m_s2
```

配置方式：

```fortran
seismic_enabled = .TRUE.
seismic_analysis_mode = "spectrum"
seismic_combination = "srss"  ! srss | cqc | both
seismic_config_file = "Data\Input\FEM\fixed_owt_seismic_spectrum_example.dat"
seismic_damping_ratio = 0.05
```

它要求模态分析。程序根据固定式 FEM 模态周期、模态参与因子和质量信息，对每个方向插值 `Sa(T)`，生成逐模态地震响应参考量，并按 `SRSS` 或 `CQC` 做组合，输出 `*_seismic_spectrum.csv`。

这部分统一标记为 `REFERENCE_ONLY`：可作为工程响应参考和交叉校核，尚不宣称任何国家规范、DNV 或 API 的自动合规判定。相关实现从 [OWTFixed.f90](E:/CodingTests/backup/SAToex64/SourceFiles/Solve/FEM/OWTFixed.f90:13657) 开始。
