pdeSolver 工业 PDE 计算教程
本教程介绍 DolphinDB pdeSolver 系列函数在工业计算中的使用方法,适用于 DolphinDB 3.00.6.1
及以上版本。教程面向工业计算、物联网、科学计算及数值算法开发人员,覆盖一维和二维线性抛物型偏微分方程(Partial Differential
Equation,PDE),并通过热传导、输运和源项等问题,讲解方程设置、边界条件处理及数值结果验证。具体行为以实际部署版本和官方文档为准。
1. 概览
本教程通过热传导、污染物输运和局部热源三个案例,介绍如何使用 DolphinDB pdeSolver
系列函数对工业问题进行建模和求解。教程从物理模型出发,依次讲解系数设置、网格与边界条件配置、方程求解和结果验证,帮助用户逐步掌握从实际问题到 DolphinDB
可运行代码的实现过程。
1.1 学习目标
阅读本教程后,用户应能够:
-
将热传导、扩散和输运等实际问题转化为 PDE 模型;
-
使用
pdeCoeff1D/2D设置扩散、对流、反应和源项; -
根据问题需求设置 Dirichlet、Neumann 和 Robin 边界条件;
-
合理选择网格、时间步和二维 ADI 求解方法;
-
通过解析解、守恒量和网格收敛,验证计算结果的正确性。
1.2 典型场景
本教程涵盖以下工业计算场景:
-
棒材瞬态热传导、持续热源和表面对流换热;
-
封闭介质中的脉冲扩散与质量守恒;
-
开放通道中的对流、扩散及吸附衰减;
-
局部热点的二维非均匀网格计算;
-
非负浓度羽流的二维平流扩散模拟。
1.3 适用范围
本教程主要介绍如何使用 pdeSolver 求解一维和二维线性抛物型
PDE,采用结构化网格和有限差分方法。对于二维问题,可以选择 Douglas、CS、MCS 和 HV 等 ADI 方案;对于对流项,可选择
central、upwind 或 hybrid 格式。
对于复杂几何、三维问题、强非线性问题、多场耦合问题、不可压 Navier–Stokes 方程,以及对严格的有限体积守恒性有要求的场景,应结合具体模型评估
pdeSolver 是否适用,必要时选择更合适的专用数值方法。
2. 工业 PDE 的守恒律与接口映射
本章从质量守恒和能量守恒等物理定律出发,说明扩散、对流、反应、源项和储存项在偏微分方程中的含义,并给出这些数学项与
pdeCoeff1D、pdeCoeff2D 参数之间的对应关系。
2.1 从物理守恒定律开始
给定热量或浓度 u、扩散系数 D>0、输运速度 、一级反应系数 和源项 s,守恒型模型为
在 D 和速度为常量、 时,可化为
对于 ,有 ;只有边界法向速度为零时才退化为 。
2.2 pdeCoeff1D 映射
一维标准形式: 。
| 数学项 | 接口字段 | 热传导与输运含义 |
|---|---|---|
|
M |
mass |
储存量/有效热容,须为正 |
|
A |
diff |
扩散或温度扩散率 |
|
B |
conv |
物理速度为 v>0 时,常取 -v |
|
C |
react |
反应或衰减 -k |
|
|
source |
热源/污染源注入 |
变系数守恒形式 展开时会出现 ,不能在 diff 输入 后忽略这些一阶项而声称仍在解守恒形式。必须把该导数项并入 conv/x/y,或者明确采用非散度形式模型。
2.3 pdeCoeff2D 映射
二维时:
正向输运速度 映射为 ;各向异性扩散分别进入 xx 和 yy;若模型含混合导数,xy 需要使用完整混合导数系数。
2.4 初始条件、边界与单位检查
-
initial:在
tGrid[0]的温度/浓度场;其单位要和 u 一致。 -
boundary:Dirichlet 指定函数值;Neumann 指定外法向导数;Robin 指定 。
-
对右侧一维端点, ;对左侧端点, 。将通量转成 Robin 条件时必须逐边核对符号。
-
source 的单位应是 乘上 mass 对应单位;时间、长度和速度必须换算到同一单位制。
-
定温与初始值在 t=0 的边界节点应兼容;二维角点两个 Dirichlet 边界须一致。
2.5 无源无流条件下的守恒量
若 k=s=0 且四周 ,有
纯扩散问题的零 Neumann 满足这一条件;有穿流的对流扩散问题则不能直接借用该结论。数值求解是否严格保守还受非守恒型差分算子的离散特性影响,必须实际计算网格权重积分予以评估。
3. 核心函数概览
下面只列出函数职责和常用调用方式。参数类型、默认值、返回结构及版本差异,以官方函数文档为准。
3.1 接口速查
| 函数 | 功能概述 | 参考调用 | 官方文档 |
|---|---|---|---|
|
|
创建一维均匀、sinh/tanh/log 非均匀空间网格 |
|
|
|
|
构造一维空间计算域 |
|
|
|
|
由 x/y 网格构造二维结构化计算域 |
|
|
|
|
封装一维扩散、对流、反应、源项和质量项系数 |
|
|
|
|
封装二维扩散、交叉导数、漂移与反应项 |
|
|
|
|
结合系数、初值、计算域、时间网格和边界求解 PDE |
|
|
|
|
查看网格、系数和其他对象的诊断概要 |
|
3.2 建模与求解流程
method 用于选择时间推进、对流离散、ADI/obstacle 及资源配置;setting
用于返回模式、时间层、插值、Greeks 和诊断。不要把这两种字典的字段混用。interpAt
应位于定义域内;resultMode="detail" 可在验证阶段配合
diagnostics=true 使用。
3.3 快速跑通
下面的例子求解一根两端定温、内部均匀发热的归一化棒材。先运行代码,再回头看第 4 章的方程和误差分析。
alpha = 0.2
xGrid = (0..100) / 100.0
tGrid = (0..400) * (10.0 / 400.0)
method = dict(STRING, ANY)
method["scheme"] = "implicit"
setting = dict(STRING, ANY)
setting["resultMode"] = "detail"
result = pdeSolver(
pdeCoeff1D(diff=alpha, source=2.0 * alpha),
0.0,
pdeDomain1D(xGrid),
tGrid,
0.0,
method,
setting
)
reference = xGrid * (1.0 - xGrid)
maxError = max(abs(result["value"] - reference))
table([result["value"][50]] as centerValue, [maxError] as maxError)
运行后应看到中心温度接近 0.25,maxError 约为 1.1e-9。这段代码只涉及四个对象:系数 coeff、空间域 domain、时间网格 tGrid 和边界条件;后面的案例只是逐步加入对流、源项、二维网格和诊断信息。
4. 一维工业 PDE 案例
本章通过内部热源传导、对流—扩散—吸附、高斯脉冲扩散和钢制棒材传热四个案例,演示一维工业 PDE 从物理建模、系数配置、边界设置到结果验证的完整过程。
4.1 一维热传导:内部热源与稳态
4.1.1 模型与设置
长为 1 的均匀棒材,端点维持零温度基准,内部持续均匀加热。归一化方程为 ,初值为
,端点为 。
独立解析基准。在稳态
,故
,中心温度恰为 0.25。这是解析值,不是 pdeSolver 已运行输出。
设置为 pdeCoeff1D(diff=alpha,
source=2*alpha),boundary=0.0,initial=0.0。固定终止时间和空间节点计算
误差,再分别加密
与
,同时检查非负性和对称性。
4.1.2 DolphinDB 示例代码
完整代码见第 3.3 节“快速跑通”。本例只是将源项、边界和解析参考写成一个最小的一维热传导问题。
4.1.3 运行结果
运行结果:N_x=101、N_t=400
时,maxError=1.107879e-09,symmetryError=1.998401e-15。空间和时间收敛结果见第
7 章。
4.2 一维对流—扩散—吸附:入口与出口条件
4.2.1 模型与设置
通道内存在正向流速和内部源项,方程为
。在 pdeCoeff1D 中设置
conv=-v,与物理速度正方向相反。
总流量(单位截面)为 ,所以 只表示零扩散梯度,不表示零总通量。本例用入口 、出口 近似开放通道。若边界封闭,应直接建模 ,再按 API 的外法向符号转换为 Robin 条件。
检查入口、出口、非负性、浓度峰和质心位移,并与 v=0 的结果对照。高 Peclet 数时优先试 upwind,但要通过网格加密评估其数值扩散。
4.2.2 DolphinDB 示例代码
def pollutantSource(x, t) {
normalizedDistance = (x - 0.2) / 0.03
return exp(-normalizedDistance * normalizedDistance)
}
xGrid = (0..100) / 100.0
domain = pdeDomain1D(xGrid)
outletZeroGradient = dict(STRING, ANY)
outletZeroGradient["type"] = "neumann"
outletZeroGradient["value"] = 0.0
boundary = [0.0, outletZeroGradient] // xMin: 固定入口浓度; xMax: 零梯度近似出流
coeff = pdeCoeff1D(
diff=0.003,
conv=-0.3,
react=-0.2,
source=pollutantSource
)
method = dict(STRING, ANY)
method["convectionScheme"] = "upwind"
setting = dict(STRING, ANY)
setting["resultMode"] = "detail"
result = pdeSolver(
coeff,
0.0,
domain,
(0..200) * (0.5 / 200.0),
boundary,
method,
setting
)
4.2.3 运行结果
运行结果:最终场浓度范围约为 [0.0, 0.154389]。该数值对应当前 upwind、网格和时间步;改变 Peclet 数或网格后应重新检查峰值和非负性。
4.3 一维高斯脉冲扩散:守恒验收
4.3.1 模型与设置
考虑封闭一维介质中的局部高斯脉冲,方程为 。端点没有对流,零法向导数同时表示零扩散通量和零总通量。
数学性质。积分质量 常数;峰值不增加,空间分布逐渐平缓,质量归一化方差趋向均匀分布的极限。
用与网格匹配的积分权重计算 。非均匀网格不能直接用节点值求和代替积分。
4.3.2 DolphinDB 示例代码
def gaussianPulse(x) {
normalizedDistance = (x - 0.5) / 0.04
return exp(-0.5 * normalizedDistance * normalizedDistance)
}
xGrid = (0..200) / 200.0
tGrid = (0..100) * (0.2 / 100.0)
zeroFlux = dict(STRING, ANY)
zeroFlux["type"] = "neumann"
zeroFlux["value"] = 0.0
setting = dict(STRING, ANY)
setting["resultMode"] = "detail"
setting["output"] = "all"
result = pdeSolver(
pdeCoeff1D(diff=0.002),
gaussianPulse,
pdeDomain1D(xGrid),
tGrid,
[zeroFlux, zeroFlux],
NULL,
setting
)
4.3.3 运行结果
运行结果:output="all" 返回 201×101=20301 个网格—时间值。均匀网格梯形积分得到初始质量
0.100265、末时刻质量 0.100265,相对漂移 3.737095e-15。
4.4 工程案例:钢制棒材含体积热源与表面对流换热(SI 单位)
4.4.1 工程对象及假设
一根长度为 的细长实心钢棒,横截面足够小,可采用一维轴向温度场 近似。棒材取常数热物性,体内存在均匀体积热源,两端与环境发生对流换热。忽略辐射、横向温度梯度、材料相变及热物性随温度变化;这只是可复现的教学工程模型,不可未经校准用作具体设备设计结果。
| 工程参数 | 符号 | 数值 | 单位 |
|---|---|---|---|
|
棒长 |
L |
0.20 |
m |
|
密度 |
|
7850 |
kg/m³ |
|
比热容 |
|
470 |
J/(kg·K) |
|
导热系数 |
k |
45 |
W/(m·K) |
|
均匀体积热源 |
Q |
12000 |
W/m³ |
|
两端对流换热系数 |
h |
25 |
W/(m²·K) |
|
环境与初始温度 |
|
20 |
°C |
|
求解终点 |
|
86400 |
s |
这里使用的是教学参数,不对应某种特定钢材或设备测量值。真实棒材若存在横向散热,应把侧壁散热折算为体积源/汇项,并使用实际横截面周长和面积。
4.4.2 从能量方程到 pdeCoeff1D
在常数物性和无轴向流动条件下:
其中
的单位为 J/(m³·K),
和 Q 的单位均为 W/m³。直接以物理量作为 PDE
系数:mass=rho*cp,diff=k,source=Q,无需预先归一化。温度可以使用
°C,因为该模型只涉及温差和温度导数。
两端向环境散热: ,即
注意左端外法向为 -x,右端外法向为 +x;两端使用相同 Robin 字典的原因是 pdeSolver
的导数以外法向定义,而不是两端统一使用
。初值
在 t=0 满足两端边界。
4.4.3 DolphinDB 完整可执行示例
// 参数均采用 SI 单位:m, s, kg, J, W, K(温差);显示温度为摄氏度。
length = 0.20
rhoMaterial = 7850.0
heatCapacity = 470.0
conductivity = 45.0
volumetricHeatSource = 12000.0
heatTransferCoefficient = 25.0
ambientTemp = 20.0
simulationSeconds = 86400.0
xGrid = (0..120)*(length/120.0)
tGrid = (0..480)*(simulationSeconds/480.0)
// 原始量形式:rho*c_p*T_t = k*T_xx + Q
coeff = pdeCoeff1D(
diff=conductivity,
source=volumetricHeatSource,
mass=rhoMaterial*heatCapacity
)
// Robin alpha*T + beta*dT/dn = value,外法向 n 随端点变化。
convectiveEnd = dict(STRING, ANY)
convectiveEnd["type"] = "robin"
convectiveEnd["alpha"] = heatTransferCoefficient/conductivity
convectiveEnd["beta"] = 1.0
convectiveEnd["value"] = (heatTransferCoefficient/conductivity)*ambientTemp
boundary = [convectiveEnd, convectiveEnd]
method = dict(STRING, ANY)
method["scheme"] = "implicit"
setting = dict(STRING, ANY)
setting["resultMode"] = "detail"
setting["interpAt"] = length/2.0
setting["diagnostics"] = true
result = pdeSolver(
coeff, ambientTemp, pdeDomain1D(xGrid), tGrid,
boundary, method, setting
)
// 解析稳态:仅作为长时极限基准,不应冒充 t_f 时刻的精确解。
steadyTemp = ambientTemp + volumetricHeatSource*length/(2.0*heatTransferCoefficient) + volumetricHeatSource*xGrid*(length-xGrid)/(2.0*conductivity)
steadyCenter = ambientTemp + volumetricHeatSource*length/(2.0*heatTransferCoefficient) + volumetricHeatSource*length*length/(8.0*conductivity)
summary = dict(STRING, ANY)
summary["tempCenterAtFinalTime"] = result["interpValue"]
summary["steadyCenterReference"] = steadyCenter
summary["maxDistanceToSteady"] = max(abs(result["value"]-steadyTemp))
summary
4.4.4 解析稳态与工程解释
长时间后 ,因此 ,结合两端对流 Robin 边界得到:
示例参数下,稳态两端温度为 ,中心温度为 。
独立 Python 有限体积(隐式 Euler)瞬态参考,t=86400 s:
| 空间节点 | 时间步 | 中心温度(°C) | 端点温度(°C) |
|---|---|---|---|
|
61 |
240 |
69.164906 |
67.836145 |
|
121 |
480 |
69.170469 |
67.841557 |
|
241 |
960 |
69.173214 |
67.844227 |
这些是独立 FVM 数值结果,不是 DolphinDB 运行结果,也不能代替时间趋于无穷时的解析稳态。实际 pdeSolver 精度验收应与同时间、同物性、同边界的参考瞬态比较,而非要求 24 小时结果严格等于稳态。
这两个数字是公式计算的解析稳态基准,不是 时 DolphinDB 的求解结果。瞬态结果应随时间趋近稳态,初始时刻严格为 。
4.4.5 独立数值验证、网格与生产边界
-
单位:PDE 各项为 W/m³,Robin 左右两项为 K/m,热通量还要乘以 k。
-
网格:至少比较 和对应时间步的中心温度、端点温度及稳态距离。
-
参考:
validation/reference_regression.py使用独立 FVM 隐式推进;真实设备还需校准热物性、侧壁换热和不确定性。
验证结果:解析关系、独立 FVM 参考、DolphinDB 运行结果以及空间/时间收敛数据均已记录。更换部署版本后,应在相同时间点重新做 FVM 对照,并复核生产边界条件。
5. 二维工业 PDE 案例
本章将一维建模方法扩展到二维结构化网格,介绍局部热点和对流羽流两类典型问题。内容重点包括二维扩散与漂移系数的设置、局部聚焦网格的使用、开放流场边界的处理,以及通过插值值、浓度范围、质心移动和网格加密验证计算结果。
5.1 二维局部热点:聚焦网格与源项
5.1.1 模型与设置
在 (0.3,0.7) 附近持续注入窄高斯热源,方程为 。本例取 ,四边定温为 0。
方法。构造 41×41 均匀网格和 41×41 双方向 sinh
聚焦网格,再以更细网格参考比较热点中心温度。局部加密提高关注区域精度,但不一定降低全域最大误差。
比较时保持两组网格的总节点数接近,记录聚焦区域的最小步长,并与细网格结果比较。时间步也要单独加密,避免把时间误差误认为网格收益。聚焦网格是否更准,以运行结果为准。
5.1.2 DolphinDB 示例代码
def hotspotSource(x, y, t) {
scaledX = (x - 0.3) / 0.03
scaledY = (y - 0.7) / 0.03
return exp(-scaledX * scaledX - scaledY * scaledY)
}
finalTime = 0.05
tGrid = (0..100) * (finalTime / 100.0)
uniformGrid = (0..40) / 40.0
focusedX = pdeGrid1D(0.0, 1.0, 41, "sinh", 0.3, 3.0)
focusedY = pdeGrid1D(0.0, 1.0, 41, "sinh", 0.7, 3.0)
referenceGrid = (0..120) / 120.0
coeff = pdeCoeff2D(
xx=0.002,
yy=0.002,
source=hotspotSource
)
setting = dict(STRING, ANY)
setting["resultMode"] = "detail"
setting["interpAt"] = 0.3 0.7
method = dict(STRING, ANY)
method["parallel"] = false
uniform = pdeSolver(
coeff, 0.0,
pdeDomain2D(uniformGrid, uniformGrid),
tGrid, 0.0, method, setting
)
focused = pdeSolver(
coeff, 0.0,
pdeDomain2D(focusedX, focusedY),
tGrid, 0.0, method, setting
)
reference = pdeSolver(
coeff, 0.0,
pdeDomain2D(referenceGrid, referenceGrid),
tGrid, 0.0, method, setting
)
5.1.3 运行结果
运行结果:均匀网格、聚焦网格和参考网格的插值值分别为 0.043145、0.041562 和 0.041574。当前结果显示聚焦网格更接近参考值,正式网格仍应按同样方法复核。
5.2 二维高 Peclet 羽流:开放流场边界
5.2.1 模型与设置
考虑局部污染源和二维流场,方程为 。源点为 (0.2,0.5),比较 和 (1, 0.4)。
通量为 。有穿过边界的对流时, 不等于 。本例使用固定零浓度入口和零梯度出口,适用性取决于流向和截断域;真正的无流出壁面应满足 或相应 Robin 通量条件。
把等效网格积分质量作为监测量,用浓度质心 判断输运方向。 时要检查上边界是否确实起到出口作用,并通过增加网格密度和域高度评估截断边界的影响。
5.2.2 DolphinDB 示例代码
def plumeSource(x, y, t) {
scaledX = (x - 0.2) / 0.035
scaledY = (y - 0.5) / 0.035
return exp(-scaledX * scaledX - scaledY * scaledY)
}
xGrid = (0..60) / 60.0
yGrid = (0..40) / 40.0
tGrid = (0..120) * (0.3 / 120.0)
domain = pdeDomain2D(xGrid, yGrid)
outletZeroGradient = dict(STRING, ANY)
outletZeroGradient["type"] = "neumann"
outletZeroGradient["value"] = 0.0
boundary = [0.0, outletZeroGradient, 0.0, outletZeroGradient] // 入口固定 0,出口零梯度近似
method = dict(STRING, ANY)
method["parallel"] = false
method["convectionScheme"] = "upwind"
reportSetting = dict(STRING, ANY)
reportSetting["resultMode"] = "detail"
reportSetting["diagnostics"] = true
axisAligned = pdeSolver(
pdeCoeff2D(
xx=0.001, yy=0.001,
x=-1.0, y=0.0,
source=plumeSource
),
0.0, domain, tGrid,
boundary, method,
reportSetting
)
oblique = pdeSolver(
pdeCoeff2D(
xx=0.001, yy=0.001,
x=-1.0, y=-0.4,
source=plumeSource
),
0.0, domain, tGrid,
boundary, method,
reportSetting
)
5.2.3 运行结果
在 3.00.6.2 上,两组代码均执行成功,diagnostics.success=true
且无告警。轴向流和斜向流的最终最大浓度分别为 0.056756 和 0.039527,最小值接近 0。边界适用性仍应结合流向和网格加密判断。
6. 数值方法与稳定性
本章介绍时间步、对流离散格式、交替方向隐式方法以及网格设置对求解稳定性和精度的影响。
6.1 时间步和对流格式
显式扩散通常要求 ;二维和非均匀网格还要考虑两个方向及最小网格间距。高 Peclet 数下 central 可能振荡,upwind 更稳健但会引入数值扩散。最终用网格加密检查峰值、非负性和误差。
6.2 一维、二维方法选择
一维平滑扩散可从 theta/CN 与 implicit 开始;不连续初值再考虑 Rannacher。二维问题使用 Douglas、CS、MCS 或 HV 等 ADI 方案,并单独检查交叉项和时间误差。
6.3 网格和生产设置
pdeGrid1D
的聚焦网格适合局部热点和边界层,二维域由两组一维坐标组成。生产环境通常只返回最终场或少量时间层;验证阶段再打开
detail/diagnostics。output="all"、precompute、JIT
和并行会影响内存或耗时,记录版本、硬件和线程设置后再比较。
7. 验证与工程验收
本章给出由快速合理性检查、解析解对照、守恒量检查、制造解验证和网格收敛分析组成的验证体系。除检查代码能否执行外,还应验证结果形状、边界行为、非负性、质量或通量、空间误差和时间误差,并记录目标软件版本、网格、时间步和数值配置,以支持工程验收和结果复现。
7.1 验证体系
先做四项快速检查:
-
结果形状和坐标是否正确;
-
边界值、非负性和单调趋势是否符合模型;
-
质量或边界通量是否满足预期;
-
加密空间网格和时间步后,误差是否下降。
有解析解时优先做解析对照;没有解析解时,用制造解、独立数值方法或守恒量交叉检查。不要只看一个节点的温度或浓度。
7.2 参考问题
| 参考问题 | 用途 | 对应位置 |
|---|---|---|
|
一维无源热方程 |
检查时间演化、边界和空间误差 |
案例包 IND-011 |
|
一维带源热方程 |
检查源项符号和稳态趋势 |
4.1 |
|
二维可分离热方程 |
检查二维矩阵方向和 ADI |
案例包 IND-027 |
|
MMS 制造解 |
检查 |
案例包 IND-029 |
解析关系和完整代码保留在第 4 章及 ZIP 的 validation/ 目录;正文先看表格和运行结果即可。
7.3 收敛性怎么做
| 测试 | 固定项 | 扫描项 | 指标 | 脚本入口 |
|---|---|---|---|---|
|
空间收敛 |
足够细、域固定 |
=51,101, 201,401 |
、 加权 |
|
|
时间收敛 |
固定较细 |
=50,100,200, 400,800 |
时间误差比率 |
|
|
局部聚焦 |
总节点数相同 |
uniform / sinh / tanh |
热点误差、局部步长 |
|
|
对流稳定性 |
模型与边界不变 |
central / upwind / hybrid |
非负性、过冲、峰位 |
|
|
物理边界 |
物理参数不变 |
域扩张与 Robin/出口近似 |
质量、通量与质心变化 |
|
7.4 运行结果
| 用例 | 参考 | 运行结果 | 关键指标 |
|---|---|---|---|
|
1D 热方程 |
|
代码通过,边界为 0、结果非负 |
|
|
均匀热源稳态 |
x(1-x),中心 0.25 |
代码通过且保持对称 |
|
|
1D 封闭扩散 |
M(t)=M(0) |
返回 20301 个网格—时间值 |
质量漂移 3.737095e-15 |
|
2D 封闭扩散 |
M(t)=M(0) |
|
质量漂移 6.5503158452884236e-15 |
|
2D 解析热方程 |
|
中心值 0.673860 |
误差约 3.4e-05 |
|
2D plume |
正向质心位移 |
轴向/斜向代码均通过 |
最大浓度 0.056756/0.039527 |
以上结果均来自目标版本 DolphinDB 3.00.6.2。
7.4.1 目标版本空间与时间收敛扫描
以下数据来自目标版本 3.00.6.2 Server,误差取终止时间的最大绝对误差或指定插值点误差。对应的批量脚本是
validation/convergence_scans.dos;二维制造解扫描使用
validation/mms_convergence.dos。换用生产网格后,按同样方式重新扫描。
一维解析热方程。空间扫描固定 N_t=800、theta 格式:
| 51 | 101 | 201 | 401 | |
|---|---|---|---|---|
|
误差 |
2.941e-5 |
7.354e-6 |
1.839e-6 |
4.595e-7 |
时间扫描固定 N_x=401、隐式 Euler:
| 50 | 100 | 200 | 400 | 800 | |
|---|---|---|---|---|---|
|
误差 |
8.860e-5 |
4.456e-5 |
2.252e-5 |
1.149e-5 |
5.975e-6 |
MMS 空间扫描由 validation/mms_convergence.dos 复现。固定
N_t=600 时,N_x=41/81/121/161 的误差为
7.539e-5/1.886e-5/8.382e-6/4.715e-6。validation/convergence_scans.dos
的二维 MCS 空间扫描固定 N_t=200,N=21/41/61/81 的误差为
3.330e-4/8.327e-5/3.701e-5/2.082e-5;二维时间扫描固定
N=81,N_t=50/100/200/400/800 的误差为
2.075e-5/2.080e-5/2.082e-5/2.082e-5/2.082e-5。时间步继续加密收益很小,当前配置主要受空间误差限制。
7.4.2 二维封闭扩散质量守恒专项
专项入口为 ZIP 中的 03_2D_Industrial/IND-031/example.dos。模型为
初值为 ,四边采用零 Neumann 边界,空间网格为 41×41,终止时间为 0.5。解析解用于检查场值误差;二维梯形权重用于检查
目标生产版本 3.00.6.2 2026.09.18 LINUX x86_64 的运行结果如下:
| 指标 | 结果 |
|---|---|
|
初始质量 |
1.000000 |
|
末时刻质量 |
0.999999 |
|
质量绝对漂移 |
-6.550316e-15 |
|
质量相对漂移 |
6.5503156e-15 |
|
解析解最大误差 |
1.064917e-05 |
|
四边法向导数残差 |
3.552714e-14 |
本专项在当前模型、均匀网格和边界条件下通过;它说明该配置的离散质量误差接近机器精度,但不能外推为所有对流、源项、反应或 Robin 边界问题都严格守恒。非均匀网格应使用对应的二维单元面积或梯形权重重新计算。
7.5 如何判断结果
-
纯扩散零 Neumann:检查加权质量;非均匀网格使用对应的长度或面积权重。
-
对流扩散:检查非负性、峰值、质心和出口边界,不能直接套用纯扩散的守恒结论。
-
严格守恒要求:确认离散算子本身具有守恒结构,再用实际网格计算质量和通量。
-
图表:解析图标为“参考/示意”;数值热力图必须来自目标环境,并标出单位、坐标和版本。
7.6 深入验证脚本
需要复核时间推进、MMS、二维 ADI 或 Robin 通量时,直接运行案例包中的对应脚本:
| 检查 | 案例入口 | 主要用途 |
|---|---|---|
|
一维解析热方程 |
|
时间演化、边界和空间误差 |
|
MMS 制造解 |
|
源项、初值和时空离散 |
|
二维解析热方程 |
|
矩阵方向和 ADI |
|
Robin 边界 |
|
边界字段、外法向符号和零总通量 |
正文给出结论和验收指标,完整脚本、阈值及运行说明以 ZIP 为准。收敛表中的
validation/convergence_scans.dos 和
validation/mms_convergence.dos 可直接返回各网格级别的误差向量。
8. 输出与生产使用
本章说明 pdeSolver 不同输出模式的结构以及生产运行需要保留的复现信息。
8.1 输出怎么读
| 输出 | 形状/含义 |
|---|---|
|
一维最终场 |
长度为 的向量 |
|
二维最终场 |
矩阵,行对应 x、列对应 y |
|
output="all" |
返回全部时间层;二维结果会明显增大内存 |
|
interpAt |
返回定义域内指定点的插值值 |
验证阶段可以打开 resultMode="detail" 和
diagnostics=true;生产运行通常只返回最终场或少量时间层。
8.2 工程运行结果与复现信息
每次运行至少记录方程、单位、物性参数、边界、网格、时间步、数值配置、软件版本、主要结果和告警。
运行环境为 DolphinDB 3.00.6.2 2026.09.18 LINUX x86_64。正文 6 个代码块均执行通过;深入验证脚本和阈值见案例包。生产模型按实际参数和部署版本复核。
| 回归范围 | 目标版本结果 |
|---|---|
|
一维热传导、对流扩散、脉冲扩散 |
代码执行通过;分别取得误差、浓度范围和完整时间层输出 |
|
钢棒 SI 单位案例 |
中心温度 69.1704619 °C;与稳态中心 69.3333333 °C 的差异符合瞬态解释 |
|
二维热点与高 Peclet 羽流 |
两组案例均 |
|
二维封闭扩散守恒专项 |
IND-031 通过;质量相对漂移 6.5503158452884236e-15,解析最大误差 1.0649170349985582e-05 |
|
解析热方程、MMS、二维解析解 |
收敛脚本入口分别为
|
|
Robin 零总通量映射 |
|
8.3 生产使用前检查
解析图只能作为参考示意;发布数值热力图时,应从目标环境导出数据,并标出单位、坐标和版本。复杂几何、3D、强非线性、多场耦合或严格有限体积守恒问题,先确认
pdeSolver 的结构网格和线性方程假设是否适用。
9. 附录
本章提供与教程配套案例代码以及文中出现的专业术语及其释义。
9.1 配套案例包
pdeSolver_industrial_cases_v3.zip包含 55 个
example.dos,按 API
基础、一维工业案例、二维工业案例、数值方法、输出诊断和发布示例分组。正文重点案例对应如下:
| 案例 | 用途 |
|---|---|
|
IND-011 |
一维解析热方程 |
|
IND-015 |
Robin 对流换热边界 |
|
IND-022 |
高 Peclet 对流扩散 |
|
IND-027 |
二维解析热方程 |
|
IND-031 |
二维质量守恒专项 |
|
IND-055 |
钢棒 SI 单位工程案例 |
正文 6 个代码块和 ZIP 内 55 个案例均已在目标版本回归;收敛扫描和 Robin 专项脚本位于 ZIP 的
validation/ 目录。完整索引、脚本和阈值见 ZIP 根目录
README.md。
9.2 术语与缩写
| 术语 | 全称 / 英文 | 说明 |
|---|---|---|
|
PDE |
Partial Differential Equation,偏微分方程 |
含多个自变量(如时间、空间)偏导数的方程。本文讨论线性、抛物型 PDE,例如热传导方程和对流—扩散方程。 |
|
FDM |
Finite Difference Method,有限差分法 |
在网格节点上用差商近似导数。 |
|
FVM |
Finite Volume Method,有限体积法 |
对每个控制体积分守恒方程的离散方法,天然满足离散守恒。本文用它做独立参考计算。 |
|
ADI |
Alternating Direction Implicit,交替方向隐式法 |
二维问题中把 x、y 方向拆开,每次只在一个方向上隐式求解,降低计算量。 |
|
Douglas |
Douglas 格式 |
最基础的 ADI 格式,以提出者 Jim Douglas 命名。 |
|
CS |
Craig–Sneyd 格式 |
在 Douglas 格式基础上增加对交叉导数项(xy)的校正。 |
|
MCS |
Modified Craig–Sneyd,改进 Craig–Sneyd 格式 |
对 CS 再加一步校正,含交叉项时稳定性和精度更好。 |
|
HV |
Hundsdorfer–Verwer 格式 |
另一种二阶 ADI 格式,适合含交叉项或对流项的问题。 |
|
CN |
Crank–Nicolson 格式 |
当前时间层和下一时间层各取一半的隐式格式,二阶精度。初值不光滑时可能产生振荡。 |
|
theta 格式 |
θ-scheme |
显式与隐式的加权组合。θ=0 是显式,θ=1 是隐式 Euler,θ=0.5 就是 CN。 |
|
隐式 Euler |
Implicit (Backward) Euler |
完全隐式的一阶时间格式,稳定性好,精度较低。 |
|
Rannacher |
Rannacher 启动(Rannacher time-stepping) |
先用几步隐式 Euler 平滑不连续初值,再切换到 CN,用来抑制振荡。 |
|
Dirichlet 边界 |
Dirichlet boundary condition |
在边界上直接指定函数值,例如定温。 |
|
Neumann 边界 |
Neumann boundary condition |
在边界上指定外法向导数,例如绝热或零梯度。 |
|
Robin 边界 |
Robin boundary condition |
指定函数值与外法向导数的线性组合,例如对流换热边界。 |
|
外法向 |
Outward normal |
垂直于边界、指向计算域外部的方向。本文的边界导数都按外法向定义。 |
|
Peclet 数 |
Péclet number,Pe |
对流强度与扩散强度之比,常写为 Pe = v·L/D(网格 Peclet 数中用 Δx 代替 L)。Pe 越大,对流越占主导,数值振荡风险越高。 |
|
central / upwind / hybrid |
中心差分 / 迎风格式 / 混合格式 |
对流项的离散方式。中心差分精度高但可能振荡;迎风格式更稳定,但会引入数值扩散;混合格式按局部 Peclet 数在两者之间切换。 |
|
MMS |
Method of Manufactured Solutions,制造解方法 |
先设定一个解析解,反推需要的源项,再检验数值解的误差和收敛阶。 |
|
SI |
International System of Units,国际单位制 |
本文的工程案例使用 m、s、kg、J、W、K 等单位。 |
|
JIT |
Just-In-Time Compilation,即时编译 |
运行时把用户函数(如源项函数)编译后执行,影响计算耗时。 |
|
Navier–Stokes |
Navier–Stokes 方程 |
描述黏性流体运动的非线性方程组,超出 |
