这是桥梁抗风交互课程的第 3 个新增主题。手机课堂入口为 index.html:浏览器内现场计算,无须 Python 服务,支持 GitHub Pages。教师进阶入口为 advanced.html:保留局部 ALE、计算回放、结构对照和原课程;其中实时 ALE 仍需本机 Python 服务。
首屏只强调流场、实时风速、固有频率和阻尼比。固定/弹性支承、质量比、Scruton 数、表面压力、速度、升力记录和数据导出收进“更多观察与设置”。风速可在运行中连续调整;没有固定播放终点。
浏览器 Worker 内运行二维 D2Q9 格子 Boltzmann 与单自由度结构的双向耦合;由 CFD 动量交换升力推动结构,结构运动反馈给流体。此轻量版采用附体坐标、横向周期边界,不是局部 ALE;主图把实际场变换到实验室视图,不画虚假的变形网格。原固定外边界、局部网格变形的 ALE 方法完整保留在进阶页。
源文件为 browser-flow.js、browser-worker.js、browser-engine.js、browser-view.js、browser-panel.html、browser.css;修改面板后执行 python research/integrate-viv-browser.py 更新源码入口。python advanced-wind-course/build.py 会把 Worker 代码一同嵌入交付网页,因此单文件离线打开也能计算。数值与交互检查保存在 browser-qa/,旧 ALE 验证不替代新浏览器求解器的验证。
教师进阶页的 本机实时 ALE 提供以下功能。从低风速连续升高、手动接管、暂停和继续,始终沿用同一个流场。页面显示每个新计算步的真实变形网格、流场、CFD 升力与结构响应,不读取预计算工况。只有“重新开始”清空状态。
在源码根目录双击 启动实时涡振.cmd,或运行 python viv/ale/live_server.py --port 8792 --open。首次安装依赖使用 python -m pip install -r viv/ale/requirements-live.txt。完整操作说明见 实时服务启动与实验。
支持固定/弹性支承切换,固定时锁住当前位置。质量比 m*、固有频率 fₙ 和阻尼比 ζ 可调,k、c 自动推导。Sc=π²m*ζ;直接调 Sc 时固定质量并回算阻尼比。频率从实际升力和尾流探针的近期时程估计,窗口不足时留空。
本机实测约每秒推进 0.7 个计算时间单位;现场求解不保证与墙钟等速。初持 50、升速 160、终点持速 40 的连续历程已独立验证;网页初持默认现已延长至 120,并可调至 400。另从同一成熟流场对比两种 Sc,见 独立长程与 Sc 核验。输入 ζ 是物理阻尼;当前时间步还带来明显数值阻尼,结果用于教学,尚未获得工程量值的网格/时间步收敛保证。
新增表面 Cp 着色及周向压力曲线,涡量暗色/浅色切换,流场使用真实节点重心插值显示。速度/涡量默认不叠网格,可手动开启。完整 JSON 导出保存全部时程、参数事件、网格及当前流场;CSV 用于表格分析。显示插值不改写计算数据。
动网格计算回放保留早前的独立持速计算。二维不可压流体在真实变形的贴体三角网格上求解;外矩形节点不动,圆柱壁面节点跟随结构,内部节点按参考域的 Laplace 位移场连续变形。流体对流速度使用 u−w,其中 w 是网格速度。圆柱壁面无滑移速度等于结构速度,压力及黏性应力积分给出结构受力。
低风速回放现已从原 t*=140 的完整状态真实续算至 320,保留全部启动时程,并展示最后 120 个时间单位的流场。最后相邻两个 40 单位窗口,位移及升力脉动 RMS 变化均小于 0.005%;这说明当前离散模型的后段变化很小,不替代网格与时间步收敛。原短记录及其审计保留,新的续算与独立验证见 低风速长记录核验。
- 看网格:全域视口检查外边界,局部视口检查圆柱周围的三角单元;网格连线来自实际单元拓扑,保持单元身份,位移按真实 y/D 比例显示。
- 看响应:切换已计算的低、中、高风速及固定圆柱对照,同步观察流场、升力和位移。各工况是独立持速计算,按钮不会实时重算 CFD,也不会把工况切换拼成连续变速历程。
- 调结构:“简谐外力 · 结构对照”保留可调的质量、刚度、阻尼和结构方程积分,使用明确给定的简谐力。实时 CFD、计算回放和简谐外力对照分别标明模型与数据来源。
- 核验与限制:新求解器、原始数组、节点及单元数据在 ale/。方法、参数和运行命令见 ALE 方法与复现,实际独立审计见 ALE 数值审查。目前为有限网格、有限时长、分区耦合的教学算例;频率与幅值需要结合数值敏感性阅读。
下面保留此前随体坐标法与原课程各环节的说明。两种 CFD 方法的数据独立生成。
随体坐标对照环节保留此前的 CFD 计算回放。沿用原课程的 Python / NumPy / Numba 求解工具,新增二维低雷诺数圆柱与单自由度弹性支承的双向耦合。页面回放实算工况,不在浏览器内实时求解 CFD;拖动约化风速只选择已完成的独立持速算例,不能把跨工况切换当作同一条连续升速历程。
- CFD 双向耦合:壁面动量交换 → 升力 → 结构方程 → 位移、速度、加速度 → 下一步流体求解。没有预设简谐升力。圆柱、涡量场、升力和位移回放取同一存储帧时刻;末段频谱来自该工况的实际完整记录。
- 随体坐标法(无局部网格变形):Y=η+y(t)。网格跟随圆柱,单元不变形;相对流速及惯性加速度源包含结构运动影响。它不是局部变形网格或重网格。网页可叠加间隔 0.5D 的随体坐标参考线;这些线不是原始求解网格的抽稀节点,已默认关闭。物理位移和直径的比例为 1×。
- 简谐外力 · 结构对照:独立的单向简谐力对照模型,可以改变 m、k、ζ,fₙ由质量与刚度推导。连续升速、降速、持速或初始位移释放均为时域积分;相位连续积累,动画刷新率不改变积分。风速默认 1–9 m/s,交会点超出范围时显示提示。
- 固定圆柱、原六工况、线性稳态、非线性能量:原来的四个环节继续保留,数据来源与模型界限保持独立。
推荐课堂顺序:先在 CFD 中选低/中/高风速,比较频率与振幅;在已计算风速切换固定支承和较大阻尼;然后切换结构扫速页,把刚度增大一倍,检查 fₙ是否增大为 √2 倍;最后增大阻尼,比较响应建立与自由衰减。
- CFD 计算:compute-fsi.py;打包:pack-fsi.py;离线数据:fsi-data.js;界面:fsi-view.js、fsi.css、index.html。
- CFD 参数、实际核验与适用范围:fsi-verification.md。独立方法审查:fsi-method-review.md。
- 结构计算:response-physics.js;界面:response-view.js;API、SI单位与运行选项:response-README.md。
- 结构解析验证:node response-check.cjs。CFD 独立数值审计、参考系与结构推进检查见 qa/;浏览器操作验证见 qa/fsi-browser-check.js。
- 最终交付 HTML 的浏览代码与回放数据全部内嵌,可以双击打开;实时 CFD 仍需本机求解服务。源码目录保留可修改网页和复现脚本。实时 ALE 依赖见 ale/requirements-live.txt;此前随体坐标 CFD 复算另需 Numba。
新增 CFD 采用排液质量定义 **m*=m/(ρπD²/4);原线性/非线性教学页采用 m*=m/(ρD²)**。两者相差 π/4,界面分别写出分母。不要直接把两个模块的 m* 数值视为同一质量。结构扫速页直接输入 SI 单位的 m 与 k,不依赖这两种质量比。
1. 真实绕流与交替尾涡:切换至“固定圆柱尾流”后回放低 Re=100 固定圆柱实算流场。切换涡量 / 速度,观察绕流、分离、尾涡与同一算例升力的联动。二维流场作为可旋转三维切片呈现,粒子按数值速度积分;没有预设正弦涡管。
2. 哪个风速振得更强:先按 1、4、10 m/s 三张响应卡片,直观看到原课程自由工况响应先强后弱;再选固定 / 自由六工况,查看原位移、升力及实际频谱。默认局部 1×,需要时可选择明确标注的局部放大。拖动回放条,三维圆柱、升力箭头、时程光标同步。
3. 扫风速看频率交会:先保持 St=0.2、D=1 m、fₙ=1 Hz,按“把风速调到频率交会点”,再调阻尼或质量比。fₛ=St·U/D 始终为斜线,没有强制锁定频率的风速区间。响应为简谐外力下的线性稳态解。
4. 为什么振幅会停下:比较稳定限幅与阻尼压制。μ、ε 为假设系数,积分没有位移硬截断。累计气动净功减去结构耗能应等于能量变化;本环节只隔离限幅机理,未预测真实锁定风速。
规则尾涡管和螺旋装饰已删除。原固定圆柱环节使用实际求解的低 Re 流场;原六工况只有位移 / 系数时程,所以回放原记录时隐藏新增切片,不将两套独立数据伪配为同次计算。新流场的参数、基本网格敏感性、密度检查、来源及复现见 wake-verification.md。原记录的显示增益不改变数值、统计和频谱;极端增益会自动线性适配画面并显示实际增益,计算值不截断。
源讲义来自 wolai 抗风课程涡振页面(页面 ID:kpY43KZmdizcoEEgKT1Lt9),六组原始 TXT 可从该页附件下载。为节省空间,本课不重复打包这些完整 TXT。原工程归档中保留了讲义和原始导出;本学习包无需访问归档目录即可运行。浏览页使用生成后的 data.js,独立包含六组时程显示采样、完整记录统计及预计算谱。每条记录带原文件名、原始行数、时间范围、非均匀 dt 范围和 SHA-256。
原始 time 为自适应时间步,不能直接对行号 FFT。每个选定时间窗先取原始样本 dt 的中位数为目标间隔,按区间长度建立近似相同密度的等间隔时间网格,再线性插值、去均值、加对称 Hann 窗。单边幅值按窗相干增益 sum(window) 归一,除 DC 与偶数 N 的 Nyquist 外乘 2。奇数 N 的最后一个正频率也乘 2。峰值从实际频率坐标中读取,并排除 DC;不零填充,不插入人工谱线。
显示时程线性插值到至多 2400 点;频谱和统计量使用完整记录计算,显示采样不用于再计算谱峰。两个工况叠加时分别按各自物理时间 / 频率网格插值对齐,只有数据共有时间段叠加。时间窗“后 70%”旨在减少启动段影响,不表示已经完成平稳性检验。
六工况后 70% 的计算结果(展示保留有限位数,完整值在 data.js):
| 工况 | 升力峰频 / Hz | 位移峰频 / Hz | max \ | UY\ | (原记录单位) |
| 固定 1 m/s | 0.200 | — | — | ||
| 固定 4 m/s | 0.797 | — | — | ||
| 固定 10 m/s | 1.971 | — | — | ||
| 自由 1 m/s | 0.184 | 0.184 | 0.003479 | ||
| 自由 4 m/s | 0.759 | 0.759 | 0.586028 | ||
| 自由 10 m/s | 1.688 | 1.688 | 0.081601 |
UY 导出没有附带单位参数表,因此显示为“原记录单位”;time 与 Wind 依原讲义分别作 s 与 m/s。文件名 freq1 仅作原文件标签,不能替代结构固有频率的验证。D=1 m、fₙ=1 Hz 是交互教学模型中的假设,未用于篡改源记录。
- 调整界面文案和布局:index.html / style.css。
- 调整三维、交互和图表:app.js。
- 查看或修改计算:physics.js,可直接由浏览器加载,也可在 Node.js 中 require。
- 重新从六份完整 TXT 生成数据:安装 Python 3 与 NumPy,从原 wolai 页面下载六个原始 TXT 到任意独立目录,再运行 python advanced-wind-course/viv/prepare-data.py --source-dir "D:/下载/涡振原始记录"。脚本要求显式传入来源目录,不依赖学习包以外的固定路径。
- 检验核心计算:安装 Node.js 后运行 node advanced-wind-course/viv/physics-check.cjs。无需 npm 安装。
数值检查覆盖线性谐振解、阻尼趋势、频率不被硬夹、非线性限幅 / 衰减、RK4 能量平衡、FFT 去直流、频率索引、奇偶长度及 Nyquist 幅值约定,并核查六份预计算数据的完整性。
线性环节采用单位长度质量 m=m*ρD²,并给定假设 Cₗ=0.15、ρ=1.225 kg/m³。滑块仅影响该教学模型。
限幅环节设 q=y/D,采用
q̈+2ζωₙq̇+ωₙ²q = μωₙ(1−εq²)q̇。
μ、ε 是隔离气动非线性阻尼机理的假设系数,fₙ=1 Hz 固定为教学假设。模型无显式尾流振子,不给出真实锁定带。无外谐波力时,弱非线性平均法给出 A/D≈sqrt(4(μ−2ζ)/(με))(μ>2ζ),用于和积分结果对照。
本课采用 Sc=4πmζ/(ρD²);原讲义采用 Sc₀=mζ/(ρD²),数值相差 4π。质量比 m*=m/(ρD²) 没有 π/4 面积因子。用不同资料的限值作比较前必须核对约定、结构类型与试验条件。
课程来源与必要修正见 source-review.md。本页不能用来给实际桥梁签发涡振幅值、舒适性或疲劳验算结论。
以下 PowerShell 命令从课程项目根目录执行。依赖为 Python、NumPy、Numba;浏览网页不需要这些依赖。计算耗时取决于处理器,命令按顺序运行,不会改变浏览器工况。所有原始数组、参数与统计保存在 advanced-wind-course/viv/fsi-runs/。
python -m pip install numpy numba
$fsiCases = @(@('ur35',3.5), @('ur45',4.5), @('ur55',5.5), @('ur65',6.5), @('ur80',8))
foreach ($fsiCase in $fsiCases) {
python advanced-wind-course/viv/compute-fsi.py --diameter 16 --cycles 45 --frames 48 --mass-ratio 10 --zeta 0.01 --id $fsiCase[0] --ur $fsiCase[1] --output ("advanced-wind-course/viv/fsi-runs/" + $fsiCase[0] + ".npz")
}
python advanced-wind-course/viv/compute-fsi.py --diameter 16 --cycles 45 --ur 5.5 --zeta 0.08 --id damped55 --output advanced-wind-course/viv/fsi-runs/damped55.npz
python advanced-wind-course/viv/compute-fsi.py --diameter 16 --cycles 45 --ur 5.5 --fixed --id fixed55 --output advanced-wind-course/viv/fsi-runs/fixed55.npz
python advanced-wind-course/viv/compute-fsi.py --diameter 20 --cycles 45 --ur 5.5 --id fine55 --output advanced-wind-course/viv/fsi-runs/fine55.npz
python advanced-wind-course/viv/verify-fsi.py
python advanced-wind-course/viv/pack-fsi.py
node advanced-wind-course/viv/fsi-check.cjs前七组生成网页数据,第八组 fine55 用于网格与时间步敏感性,自动写入核验报告。pack-fsi.py 只打包上述已完成工况,不会用短程试跑或伪造记录替代缺失文件。fsi-check.cjs 检验数值有限、场数据尺寸、同帧状态与时程采样的一致性、固定结构零位移、扫速峰值和同风速阻尼对照。保持原始 NPZ 不变时,打包结果可重复;打包中不写当前时间。
根据用户对实时性和动网格的反馈,页面已将入口标为“CFD计算回放”、滑块标为“选择已计算工况”。之前把等间距叠加线称为抽稀动网格不准确:它是独立绘制的随体坐标参考线。实际计算用固定随体格点、静态圆柱掩码和非惯性源,未实现外边界固定的局部 ALE 网格变形。这段更正仅针对旧的随体坐标环节;新增局部 ALE 环节使用另一套贴体网格求解器与独立计算记录,见本说明开头。