是一个基于 加权本质无振荡有限差分方法(WENO-FD) 的二维双曲守恒律数值求解器。该程序适用于多种测试算例,支持高阶时间推进、边界条件处理及 MPI 并行计算,适合科研与教学使用。
- 支持二维带源项欧拉方程组求解并且可以很便捷地推广到其他二维守恒型方程
- 支持 WENO/WENO-Z 重构(五阶)
- 支持 RK1/RK2/RK3 时间推进
- 多种边界条件:周期、对称、滑移、特殊
- 支持 MPI 并行计算,支持快速切换串行和并行
- Tecplot 可视化输出
- 自动误差评估与精度验证
- 每次运行程序都会把结果输出到一个单独的文件夹,还会复制一份当前的完整代码,便于后期调试
- 增加二进制格式的 tecplot 文件输出方法
- 增加 paraview 文件输出方法
- 增加保正限制器
- 给通用文件前增加文件信息
- 每次运行时能够将数据输出到不同的文件夹,并且备份一份代码
- 给 readme 文件增加算例计算结果图
- 给出 MPI 加速比,提升并行效率,一个可行的路线是在 MPI 并行的同时完成计算
- 现在只支持五阶格式重构,三点格式七点格式很不方便
- 储存一些结果便于对照
- outputave 增加一个参数,运行输出ghost单元的值用于检查
- 搞清楚现在的m_Uh是不是连续储存,如果不是,二维可变长数组嵌套一个不可变长数组是不是连续储存
- WENO5ZPI 等格式有振荡,需要debug
- 增加一个debug模式,在非debug模式下减少输出,最大化优化计算时间
.
├── README.md
├── bin
│ └── program
├── build
│ ├── WENOFD.d
│ ├── WENOFD.o
│ ├── main.d
│ └── main.o
├── docs
│ └── main.tex
├── include
│ ├── Utility.hpp
│ └── WENOFD.hpp
├── input
│ └── config.cfg
├── logfile.log
├── makefile
├── output
├── src
│ ├── WENOFD.cpp
│ └── main.cpp
└── utils
├── array.h
├── equations.hpp
├── newCommon.h
├── readConfig.hpp
├── scTools.h
└── timer.hpp
CFL = 0.05,
| N | Linf (JS) | order (JS) | L1 (JS) | order (JS) | Linf (Z) | order (Z) | L1 (Z) | order (Z) |
|---|---|---|---|---|---|---|---|---|
| 100 | 6.42E-07 | 1.92E-07 | 1.66E-07 | 4.21E-08 | ||||
| 120 | 2.56E-07 | -5.05 | 7.58E-08 | -5.09 | 6.64E-08 | 5.03 | 1.68E-08 | 5.04 |
| 140 | 1.17E-07 | -5.07 | 3.45E-08 | -5.10 | 3.06E-08 | 5.03 | 7.73E-09 | 5.03 |
| 160 | 5.81E-08 | -5.24 | 1.74E-08 | -5.11 | 1.56E-08 | 5.03 | 3.95E-09 | 5.03 |
| 180 | 3.12E-08 | -5.27 | 9.53E-09 | -5.13 | 8.65E-09 | 5.02 | 2.19E-09 | 5.03 |
| 200 | 1.78E-08 | -5.33 | 5.55E-09 | -5.14 | 5.10E-09 | 5.02 | 1.29E-09 | 5.02 |
CFL = 0.7, NxN = 800x800
左图为 WENOJS 格式,右图为 WENOZ 格式
以下运行方式说明均基于 linux 系统
- 安装 支持 C++17 的编译器(如
g++)
- MPI 库(如 OpenMPI 或 MPICH)
- 修改
input/config.cfg文件,设置模拟参数:
| 参数名 | 含义 |
|---|---|
| TESTCASE | 测试算例编号( |
| SCHEME | 重构方案(0=WENO, 1=WENOZ) |
| CFL | CFL 数 |
| RKMETH | Runge-Kutta 方法(0,1,2 对应 RK1-3) |
| ELEMNUMX | x 方向网格数 |
| ELEMNUMY | y 方向网格数 |
- 编译程序
make clean
make- 运行程序(以 4 个线程为例):
mpirun -np 4 ./bin/program输出结果储存在 output 文件夹中
| 文件名格式 | 含义 |
|---|---|
average_*.plt |
Tecplot 平均变量输出 |
error_*.plt |
与解析解的误差分布 |
accuracy_*.csv |
误差范数表格(L1, L2, L∞) |
| 函数名 | 功能描述 |
|---|---|
initializeSolver() |
初始化网格、变量、MPI分区等 |
run() |
控制整体模拟流程 |
calculateDeltaT() |
根据 CFL 条件计算时间步长 |
RunRK1/2/3() |
一阶/二阶/三阶 Runge-Kutta 时间推进 |
getFlux() |
使用 WENO 特征分解计算数值通量 |
MPICommunication() |
进行左右子域数据通信 |
outputAve() |
输出平均变量到 Tecplot |
outputError() |
输出解误差图 |
outputAccuracy() |
误差范数评估并写入 csv 文件 |
如需协助或合作,请联系作者: