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 的二维区域。
  • BoxArrayBox 的集合,用于描述整个计算域的分块。

2. LevelData / FArrayBox

  • FArrayBox 是定义在单个 Box 上的多分量浮点数组(类似多维数组)。
  • LevelData<FArrayBox> 是定义在 BoxArray 上的数据容器,通常代表某一层网格(Level)上的物理场(如密度、速度等)。

3. DisjointBoxLayout

  • 描述一组互不重叠的 Box,通常搭配 LevelData 使用,用于并行分布(通过 MPI)。

4. AMRLevel / AMR

  • 在 AMR 模式下,AMRLevel 表示一个层级,AMR 类负责时间推进与层级管理。
  • 静态网格(非 AMR)模式下,通常只需使用 LevelDataDisjointBoxLayout,无需 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 仓库信息有限,但你可以:

  1. 查阅 LBNL 官方 Chombo 文档(如 chombo.pdf)——通常随源码发布
  2. 编译 Chombo 源码后查看 examples/ 目录(如 EBAMRGodunov, Poisson, HeatEquation
  3. 关注 Chombo_3.2 源码中的 lib/srclib/test 目录

若你希望我提供特定功能(如泊松方程求解、多层静态嵌套、HDF5 输出等)的完整示例,请具体说明。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐