Chombo:AMR结构化网格PDE求解框架介绍
特性说明结构化网格仅支持矩形块(Box),不支持非结构网格AMR 支持强大,但也可完全关闭用于静态网格并行能力基于 MPI + domain decomposition数据布局是核心容器I/O支持 HDF5 格式输出(通过语言C++(模板-heavy,需熟悉 RAII 和句柄模式)
文章目录
Chombo 是由 Lawrence Berkeley National Laboratory (LBNL) 的 Applied Numerical Algorithms Group (ANAG) 开发的一套用于求解偏微分方程(PDE)的 C++ 软件框架,尤其擅长处理结构化网格(structured grids)上的问题。Chombo 支持 自适应网格细化(AMR, Adaptive Mesh Refinement),同时也支持静态嵌套网格(static nested grids)或固定层级网格(non-AMR)场景。
尽管 GitHub 仓库 applied-numerical-algorithms-group-lbnl/Chombo_3.2 页面信息有限(如无 README、无 Release),但根据 Chombo 官方历史文档(如 LBNL 官网及配套文档),我们可以整理出其核心概念、架构、基本使用方法与示例代码。
一、Chombo 核心概念
1. Box / BoxArray
Box表示一个矩形区域(多维整数区间),如Box(IntVect(0,0), IntVect(63,63))表示 64×64 的二维区域。BoxArray是Box的集合,用于描述整个计算域的分块。
2. LevelData / FArrayBox
FArrayBox是定义在单个Box上的多分量浮点数组(类似多维数组)。LevelData<FArrayBox>是定义在BoxArray上的数据容器,通常代表某一层网格(Level)上的物理场(如密度、速度等)。
3. DisjointBoxLayout
- 描述一组互不重叠的
Box,通常搭配LevelData使用,用于并行分布(通过 MPI)。
4. AMRLevel / AMR
- 在 AMR 模式下,
AMRLevel表示一个层级,AMR类负责时间推进与层级管理。 - 在静态网格(非 AMR)模式下,通常只需使用
LevelData和DisjointBoxLayout,无需AMR驱动器。
5. Ghost Cells
- Chombo 支持“幽灵单元”(ghost cells),用于在相邻
Box之间交换边界数据(通过exchange()或fillGhost())。
二、Chombo 典型使用场景:静态嵌套网格(非 AMR)
你提到关注静态细分网格(即固定多层嵌套网格,不进行动态细化/粗化),这种模式常用于多尺度模拟或固定区域局部加密。
三、最小可运行示例(静态网格,2D)
以下是一个简化的 Chombo 示例,演示如何:
- 定义计算域
- 创建
DisjointBoxLayout - 构建
LevelData<FArrayBox> - 执行简单初始化与通信
假设你已成功编译 Chombo 库(需先构建 HDF5、pFUnit 等依赖)
#include "Box.H"
#include "BoxArray.H"
#include "DisjointBoxLayout.H"
#include "LevelData.H"
#include "FArrayBox.H"
#include "BRMeshRefine.H"
#include "LoadBalance.H"
#include "SPMD.H" // for MPI
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
// 初始化 MPI 和 Chombo
CH_TIMERS("example");
CH_TIMER("main", t_main);
CH_START(t_main);
// 假设 2D,全局域 [0, 255] x [0, 255]
IntVect domLo(0, 0);
IntVect domHi(255, 255);
Box domain(domLo, domHi);
// 将域划分为若干 Box(例如 4x4 = 16 块)
int numBlocks[2] = {4, 4};
IntVect boxSize = (domHi - domLo + 1) / IntVect(numBlocks[0], numBlocks[1]);
BoxArray ba;
for (int i = 0; i < numBlocks[0]; ++i) {
for (int j = 0; j < numBlocks[1]; ++j) {
IntVect lo = domLo + IntVect(i, j) * boxSize;
IntVect hi = lo + boxSize - 1;
ba.push_back(Box(lo, hi));
}
}
// 负载均衡(生成 DisjointBoxLayout)
Vector<int> procAssign;
LoadBalance(procAssign, ba);
DisjointBoxLayout dbl(ba, procAssign, domain);
// 创建 LevelData:2 个分量,2 层 ghost cell
int nComp = 2;
int ghost = 2;
LevelData<FArrayBox> data(dbl, nComp, ghost);
// 初始化:每个 FArrayBox 设为局部坐标 + 进程号
DataIterator dit = data.dataIterator();
for (dit.reset(); dit.ok(); ++dit) {
FArrayBox& fab = data[dit()];
const Box& b = fab.box();
fab.setVal(0.0);
for (BoxIterator bit(b); bit.ok(); ++bit) {
IntVect iv = bit();
double val = iv[0] + iv[1] + procID(); // 示例值
fab(iv, 0) = val;
fab(iv, 1) = val * val;
}
}
// 填充 ghost cells
data.exchange();
// 简单输出(仅 rank 0)
if (procID() == 0) {
cout << "Chombo static grid example completed." << endl;
}
CH_STOP(t_main);
return 0;
}
编译说明(Makefile 简化示意):
CHOMBO_HOME = /path/to/chombo
INCLUDES = -I$(CHOMBO_HOME)/lib/include
LIBS = -L$(CHOMBO_HOME)/lib -lchombo -lhdf5 -lmpi
example: example.cpp
mpicxx $(INCLUDES) -o $@ $< $(LIBS)
四、关键特点总结
| 特性 | 说明 |
|---|---|
| 结构化网格 | 仅支持矩形块(Box),不支持非结构网格 |
| AMR 支持 | 强大,但也可完全关闭用于静态网格 |
| 并行能力 | 基于 MPI + domain decomposition |
| 数据布局 | LevelData<FArrayBox> 是核心容器 |
| I/O | 支持 HDF5 格式输出(通过 WritePlotFile) |
| 语言 | C++(模板-heavy,需熟悉 RAII 和句柄模式) |
五、学习资源建议
尽管 GitHub 仓库信息有限,但你可以:
- 查阅 LBNL 官方 Chombo 文档(如
chombo.pdf)——通常随源码发布 - 编译 Chombo 源码后查看
examples/目录(如EBAMRGodunov,Poisson,HeatEquation) - 关注
Chombo_3.2源码中的lib/src和lib/test目录
若你希望我提供特定功能(如泊松方程求解、多层静态嵌套、HDF5 输出等)的完整示例,请具体说明。
更多推荐



所有评论(0)