# 桥梁绕流与振动控制轻量实验室

此目录提供可直接离线运行的二维低雷诺数求解器。页面将工程尺度参照与低 Re 计算条件分别显示：真实桥梁的风速与尺度只用于量纲和相似关系说明，不能把这里的低 Re 尾流当作实桥高 Re 流动。

## 求解方法与来源

基础求解器来自 Daniel V. Schroeder（Weber State University）的 [Fluid Dynamics Simulation](https://physics.weber.edu/schroeder/fluids/)，采用 D2Q9 单松弛时间 BGK 格子玻尔兹曼法。`setBoundaries`、`collide`、`stream`、`setEquil`、`computeCurl` 五个函数保持原内容，逐函数 SHA-256 见 `upstream/provenance.json`。`upstream/FluidDynamics.html` 和 `upstream/barrierdata.js` 为原版存档。原 HTML SHA-256：

`c9c2641bf059334d7c02608ce3a5f5cc35719a27571f712f29d1cb6fe3e51e78`

Copyright 2013, Daniel V. Schroeder。许可全文保存在 `LICENSE-Schroeder.txt`，同时嵌于 `solver.js`：允许使用、修改和分发，须保留版权与许可；未经书面许可不得使用作者姓名进行广告或促销。这是含附加姓名限制条款的 MIT/X11 风格宽松许可。

本版新增参数化理想桥梁断面、固定边界局部更新和诊断接口。原程序作者注明合力计算存在待修问题，因此本版不提供合力、力矩、Cd、Cl 或据此推导的涡脱落频率；不提供伪造压力值。

## 计算条件

- 默认课堂流畅网格 320 × 128，D = 12格；另外提供400 × 160、D = 15格和480 × 192、D = 18格。三档计算域相对梁高相同；截面中心为约 (0.32 nx, 0.5 ny)。入口速度 U = 0.06 格/步，允许 API 范围 0.04–0.08，入口 Ma = U√3。
- 计算雷诺数始终是 **Re_D = UD/ν**，范围 20–200，默认120。修改 U 时保持选定 Re_D，由 ν = UD/Re_D 同步更新黏度。D 不随转角改变。以总宽 B 定义时，Re_B = (B/D) Re_D；两种口径不能直接混用。
- 上下与入口保持均匀来流，出口保留原程序的近似处理；固体采用格点反弹。无滑移轮廓由格点近似表示，不是曲线拟合网格。
- 原始 `computeCurl` 省略了中心差分分母 2，因此接口 `sample().vorticity` 和 `diagnostics().maxVorticity` 已除以 2；`fields.curl2` 保留原始 2ω 数组供绘图按需归一化。贴近固体一格的差分涉及固体内部数值，近壁涡量只宜定性观察。
- 重置时默认加入最大 0.1% U 的固定局部横向初始扰动。之后的流场由计算推进，不预设涡街、升力振荡或断面优劣。

## 几何定义

所有几何都是教学理想断面，不冠以实际桥名。坐标 x 向右、y 向上，正角为逆时针。B/D 范围 3–8，转角 −8° 至 +8°。

1. `rectangle`：外包宽 B、高 D 的实心矩形。
2. `chamfer`：上下水平板、两侧削角风嘴的八边形。每端鼻部竖向厚度为 0.2D，风嘴轴向长度为 `nose × D`，`nose` 范围 0–1.5。长度不能超过当前箱宽的 45%，实际采用值通过 `noseLength` / `effectiveNose` 输出。nose = 0 时退化为矩形。
3. `twin`：两个相同削角箱，中间留通风槽。B 是含槽的整体外包总宽，槽宽为 `gap × B`，`gap` 范围 0.04–0.30；每箱宽为 (B − gap B)/2，每箱高 D。风嘴的 45% 限制按单箱宽计算，避免风嘴交叉。

`geometry().projectedHeight` 是旋转后实际理想多边形在 y 方向的投影高度，单位格；`latticeHeight` 是离散固体占用行数，两者可能略有不同。矩形的投影高为 D cosα + B |sinα|；削角箱和双箱用全部顶点投影求得。`blockage` 为投影高度/计算域高度，只是域内阻塞比提示，未作风洞阻塞修正。

## 运行中改变几何

`setGeometry(partial)` 更新固定障碍轮廓，不清空整个流场，也不重置计算步数。旧、新均为流体的格点保持原分布函数。新遮挡格点用相邻流体平均密度、零速度的平衡分布初始化；新释放格点用邻域流体的平均密度与速度初始化。邻域限于旧、新几何下均为流体的格点；邻域无可用值时退回入口平衡态。所有替代状态先读后写，避免顺序污染。

这表示切换固定断面的教学工况，**不是运动边界、动网格或流固耦合**。更换几何会产生数值启动扰动，也不严格守恒改变区域的质量与动量。改形后应等待新工况发展，再进行定性比较；不应将改形瞬间解释为真实桥梁受力响应。

## API

```js
const sim = BridgeCFD.create({
  nx: 320, ny: 128, D: 12, speed: 0.06, reynolds: 120,
  geometry: {shape: 'chamfer', ratio: 8, angle: 0, nose: 0.6, gap: 0.15}
});
sim.configure({reynolds: 120});          // U 不变，黏度同步
sim.setGeometry({angle: 4, nose: 0.8}); // 保留当前流场与时间
sim.step(20);
sim.geometry();                        // 当前几何、投影高、轮廓顶点
sim.parameters();                      // 计算参数、时间、几何
sim.diagnostics();                     // 流体密度范围、局部 Ma、有限值等
sim.sample(240, 88);                    // 指定格点；solid 标识固体
sim.reset();                           // 当前几何下重置全场
```

浏览器导出 `BridgeCFD`；Node 可 `require('./solver.js')`。`fields` 暴露 `rho`、`ux`、`uy`、`curl2`、`barrier` 数组，按 x + y nx 索引。调用者应跳过固体格点，不将固体内部的辅助宏观量作为流体测点。`shape: 'none'` 仅供均匀流核验。`configure` 拒绝直接传黏度，以免界面 Re 与实际黏度不一致。

## 适用边界与核验记录

本模型是二维、等温、弱可压缩、低马赫数、低 Re 教学计算，不能代表实桥高 Re 大气湍流，未模拟栏杆、桥面附属物、三维效应、攻角变化风场、结构运动或颤振。没有进行网格收敛、域宽独立性或风洞气动参数验证。

上一版开发核验脚本与结果位于工作区 `修订记录/桥梁绕流教学专版_20261017`，不属于页面运行依赖。检查包括均匀流保持、几何和参数边界、旋转投影高、运行中大幅改形与改 Re、未变流体单元保持、有限值和密度范围；核验结果仅适用于记录的参数和步数。

上一版 42 项断言及 17 段有障碍演化工况全部通过：静态极限几何每组 800 步，连续改形链累计 6,000 步，每 20 步检查密度和有限值。启动及改形瞬态也纳入检查。具体极值与步数见上述修订记录中的 `求解器核验说明.md` 和 `solver-numerical-checks.json`。这不构成实桥高 Re 气动力验证。


## 2026-10-17 轻量化、振动与导出更新

- 求解状态使用Float64Array，固体标记使用Uint8Array。五个原始核心函数保持原文；本次优化主要在存储方式及宿主调度。
- HTTP/HTTPS下在Web Worker中求解，向画面传输Float32副本；file://双击打开时自动使用主线程兼容模式。两种流场求解方式均在访问者本机CPU上计算，没有调用计算服务器；三维构造显示使用WebGL图形加速。
- 页面最多一个计算批次在途；运算投入采用自适应批次，隐藏页面停止推进。更换网格重置流场；改变固定几何/Re则保留流场继续发展并清空测点时程。
- 数值保护维持原范围：有限数值、流体密度0.7—1.3、局部Ma不超过0.45。调大Re没有放宽保护条件。
- 独立振动模块比较原阻尼、增加阻尼与真实两自由度TMD。稳态由复动态刚度求解，零初态由RK4积分；外力是给定谐波，不取自LBM。`vibration.js`提供配置校验和导出接口。
- 六种输出：带参数的流场PNG、尾流测点CSV、振动CSV、工况与数据JSON、含图的离线HTML报告、当前格点流场CSV。振动CSV明确秒、归一化位移和参考值。JSON导入只恢复参数，不恢复完整分布函数，也不接续导出时的计算步。
- 测点图显示最后700条，数据保存最多5000条，实际采样时刻写入CSV；采样可能不等间隔。网格与几何变化后请重新等待流场发展，勿把启动扰动解释为结构响应。

本次核验在工作区`修订记录/桥梁轻量计算与导出_20261017`：旧新状态在同网格同工况下逐值一致；两个Re200困难工况各30000步、默认Re120工况16000步通过数值监测。预热和交替测量的本机Node核心计算提升约2.3—2.8倍，这是核心基准，不等于浏览器画面帧率或其他电脑的提升。

运行说明见同目录`运行与分发说明.md`。完整离线包保留所有运行文件、Schroeder许可和Three.js许可，不需要Python或Node。教材链接在独立包中改为随包阅读说明，避免断链。

## 三维构造视图

三维画面表现钢箱梁节段、铺装、护栏、板厚与加劲构造，以及等效支承和竖向TMD。它消费原有单模态/两自由度响应坐标，未修改振动方程，也未给二维LBM增加跨向计算。显示位移采用三方案共同的放大比例；质量块使用绝对位移，弹簧两端分别跟随桥面底架与质量块。

TMD按[MAURER官方竖向装置说明](https://www.maurer.eu/en/buildings/tuned-mass-damper/)采用四角钢弹簧支承、导杆和并联黏性阻尼的连接关系。层叠配重、吊架和钢箱梁均为课程组教学几何，不表示某个产品或实桥的尺寸、承载力和安装细节。图像参照只用于辨认构造，不复制供应商产品图。

`visual-src/vibration-three.js`为场景源代码，Three.js r178按MIT许可使用，许可见`LICENSE-Three.txt`。发布文件`vibration-three.bundle.js`将库、控制器与场景合为经典脚本，无运行时模块导入、在线纹理和字体依赖；打包工具只在开发时使用。三维不支持或图形上下文丢失时保留二维示意与全部计算功能。

场景合并同材质固定构件，三套桥梁共109个网格、约3.1万三角面。像素比上限1.5，暂停时按需绘制，离屏和隐藏页面停止绘制；播放沿用24fps上限。导出报告保留当前三维视角及原始曲线，按比例缩放，不导出隐藏的备用画布。
