CFD · 导数是怎样算出来的

本课先用同一个已知光滑场,直观演示空间一阶/二阶导数和时间偏导数的差分来源;再展开后段的有限体积求解。使用本地 Three.js,离线可旋转、缩放、单步、播放和数值联动。

首屏课堂顺序:从数值到导数

1. 固定时间,读取 W/P/E 三点;每点相距 Δx。

2. 算左段割线斜率 mw=(φP−φW)/Δx,它对应左半点 xP−Δx/2。

3. 算右段割线斜率 me=(φE−φP)/Δx,它对应右半点 xP+Δx/2。

4. 两个半点相距 Δx,故 φxx(P)≈(me−mw)/Δx=(φE−2φP+φW)/Δx²。程序显示两种等价的真实数字代入。

5. 点击“Δx减半”,观察相邻点靠近、割线变化、二阶导数误差约缩小至1/4。可去波峰/过零点观察一阶导数与二阶导数的区别。

6. 切换空间—时间曲面。固定x看φ(t),比较前向/中心时间差分;固定t看φ(x)。时间偏导的采样始终保持同一个x。

7. 前向时间差分分母为Δt,中心为2Δt;点击“Δt减半”观察误差。四步可播放、暂停、上一步/下一步。

8. 最后展开FVM,把两段梯度与左右面通量差联系起来,再研究格式与网格。

首屏的场与显示

φ(x,t)=exp(−αk²t) sin(kx−ωt),α=0.08 m²/s、ω=1.2 rad/s,k可选1/2/3 rad/m。所有取值、空间/时间导数、割线、切片、误差都来自此同一函数;没有随机替代曲线。

φx=k exp(−αk²t)cos(kx−ωt);φxx=−k²φ;φt=exp(−αk²t)[−αk²sin(kx−ωt)−ωcos(kx−ωt)]。

此函数满足φt+(ω/k)φx=αφxx。它是可核对的教学场,不是求解出来的桥梁NS流场。

真实瞬态场有x,y,z,t四个自变量。本页画的是一个空间方向和时间构成的切片,曲面竖向为标量φ,不把它当作第三个空间坐标或真实“四维画面”。

三维样点标签用投影定位并避让;二维剖面随采样区间自动放大,以便Δx很小时仍可辨认三点。高度与水平位置按显示尺度映射,数值代入使用物理坐标与步长。

打开与软件准备

- 阅读实验:解压整个课程包,使用当前版 Edge / Chrome 打开本课 index.html;无需 MATLAB、Python 或联网。三维视图需要浏览器图形加速。

- 查看或修改程序:用 VS Code 等文本编辑器打开文件夹。derivative-physics.js 与 derivative-app.js 负责首屏导数;derivative.css 负责首屏呈现。physics.js、app.js、style.css 负责后段FVM。index.html组织两段。

- 重做数值检查:安装 Node.js 后,在本目录分别运行 node derivative-check.cjs 和 node physics-check.cjs。

- 若需要本地 HTTP 预览,可在上级课程目录运行 python -m http.server 8000,然后打开 http://localhost:8000/cfd/。这不是离线阅读的必需步骤。

后段有限体积课堂顺序

1. 控制体与面通量:旋转三维单元,选择内部/边界单元。辨别正 x 通量与控制面外法线符号;检查同一面在相邻单元内相消。比较中心距 Δx 与边界距 Δx/2。

2. 格式与网格实验:先保持原课 PeL = 11、N = 20;再点击“触发数值振荡”(PeL = 40、N = 5,PeΔ = 8),比较中心/迎风格式。保持同一物理问题逐次加密,而不是一边改风速一边声称网格收敛。

3. 源项符号:切换 Γφ″ = 10 sin(πx)、两端零值。解析解应为负,不是原稿网格对比中画出的零线。

4. 转入桥梁 CFD:操作域尺寸、近体网格分辨率、风速与时间步;检查 Re 和 Co 的尺度关系。依次讨论计算域、网格、物理与时间、验证与输出四步。桥梁几何仅帮助建立建模意识,不生成绕流结果。

模型与离散

对流扩散:J = Fφ − Γφ′,J′ = S,L = Γ = 1,F = PeL,S = 0;φ(0) = 1、φ(1) = 0。

源项案例保留原稿的正二阶导数约定 Γφ″ = 10 sin(πx),在统一守恒形式中 S = −10 sin(πx),源项用中点积分 S(xP)Δx。

内部面扩散导通量 D = Γ/Δx;物理边界采用半单元距离,Db = 2Γ/Δx。

中心格式内部面 φf = (φW + φE)/2;两端面使用给定边界值。

迎风格式内部面按 F 方向取上游值;入流对流项使用给定边界值,出流对流项使用边界相邻单元值;边界扩散项始终使用给定边界值与半单元距离。这个一阶一致的对流边界闭合是迎风方案的一部分,不能与中心边界面值完全混为一谈。

每个面仅定义一个正 x 总通量,按 Je − Jw = SΔx 组装三对角线性方程,并独立重算局部/全局守恒残差。

交互与联动

- 三个实验环节切换;三维/正视/俯视;拖动旋转、滚轮缩放、键盘 R 重置。

- 对流扩散/含源扩散切换;中心/迎风切换;PeL(含反向对流)、网格数、选中单元控制。

- 点击三维单元或拖动选中单元滑杆,同步读取两侧对流/扩散/总通量、方程系数、数值解与解析解。

- 真实计算数值解、中心点 RMS 误差、最大误差、守恒残差、有界性及 N=10→160 的误差阶次。

- 一键恢复原课参数、触发高网格 Pe 振荡、换迎风、核对源项;CSV 导出当前单元解与通量。

- 工程环节改变入口/出口距离、近体网格示意密度、U、Δt;联动三维域、Re/Co、域长与尺度曲线;四步建模提示。

准确性与显示界限

一维挤出盒子是控制体和标量分布的三维表达,不是三维 CFD。数值柱高仅映射 φ,不表示桥梁变形或流体压力。工程三维域为了看清桥梁压缩了远场展示比例;网格线说明加密策略,不是可直接求解的有效网格。本课没有求解不可压缩速度—压力耦合、湍流、分离、涡脱落、气弹耦合;没有把装饰流线当作真实 NS 解。

工程尺度例 B=30 m、ρ=1.225 kg/m³、μ=1.81×10⁻⁵ Pa·s。Co 由输入来流与示意最小网格估算;实际应使用局部计算速度,不能给出普适“Co必须小于1”的判断。

核验

physics-check.cjs 的 8 项检查均通过:

- 零对流线性解、半单元 Dirichlet 边界;

- 原源项负解与全局守恒;

- 中心对流扩散与含源扩散均二阶;

- 迎风趋近一阶;

- 高 PeΔ 中心格式越界、迎风有界;

- 正/反对流逐面通量分解及局部/全局残差;

- 反向对流镜像、解析端值;

- 工程 Re / Co 尺度计算。

PeL=11 时,N=80→160 的中心误差阶次约 2.00045,迎风约 0.94958;N=20 中心 RMS 误差约 0.0111522。中心 PeL=40、N=5 的数值范围约 [−0.74228,3.71140],用于暴露离散振荡。

来源

原始课堂附件与迁移纠错详见 source-review.md。核查依据:

- NIST FiPy,Finite Volume Method:https://pages.nist.gov/fipy/en/3.4.5/numerical/discret.html

- NIST FiPy,Numerical Schemes:https://www.ctcms.nist.gov/~wd15/fipy/documentation/numerical/scheme.html

- CFD Direct,Fixed value and fixed gradient:https://doc.cfd.direct/notes/cfd-general-principles/fixed-value-and-fixed-gradient

可观测状态与首屏核验

CourseLab.getState().activeSection 区分 derivatives 与 finite-volume;derivatives 返回首屏参数、步数、采样、解析/差分导数、误差和首屏WebGL状态;finiteVolume 返回原FVM的完整可观测状态。顶层保留原接口,顶层webgl随当前操作段切换。

首屏数值核验:node derivative-check.cjs。8项检查通过,空间二阶导误差的最终阶约1.99991;前向时间差分约0.99539,中心约1.99996。原FVM另8项检查仍通过。

浏览器脚本为qa/derivative-browser-check.js,小型核验数据为qa/derivative-results.json。390px空间与时间模式均无横向溢出;三维标签避让、轨道旋转、四步播放、步长减半、两种时间公式、两种曲面切片与旧FVM三环节均经过检查。