AMReX(Adaptive Mesh Refinement in C++ for Exascale)是一个开源的、高性能的C++软件框架,专为构建大规模并行、自适应网格细化(Adaptive Mesh Refinement, AMR)应用程序而设计。它最初由美国能源部(DOE)下属的多个国家实验室(如劳伦斯伯克利国家实验室 LBNL、劳伦斯利弗莫尔国家实验室 LLNL、阿贡国家实验室 ANL 等)联合开发,旨在支持下一代百亿亿次(Exascale)计算。
一、AMReX 的核心特点
自适应网格细化(AMR)支持
AMReX 提供灵活的块结构化 AMR(Block-Structured AMR)能力,允许在计算域中对感兴趣区域进行局部网格加密,从而在保证精度的同时节省计算资源。高性能与可扩展性
- 支持 MPI + OpenMP 混合并行。
- 针对现代 CPU 架构(如 Intel、AMD、ARM)和 GPU(通过 CUDA、HIP、SYCL 等后端)进行了高度优化。
- 可扩展至数十万 CPU 核心或数千 GPU。
多语言接口
- 主要使用 C++ 编写,提供面向对象的 API。
- 支持 Fortran 和 Python(通过 PyAMReX)接口,便于集成传统代码或快速原型开发。
模块化设计
AMReX 将核心功能(如网格管理、并行通信、线性求解器、粒子系统等)模块化,用户可根据需求选择组件。丰富的数值工具
- 内置多种插值、差分、积分算子。
- 支持粒子-网格耦合(Particle-Mesh),适用于多相流、天体物理等场景。
- 提供线性求解器(如 Multigrid、CG、BiCGStab)和非线性求解器框架。
活跃的社区与生态系统
AMReX 被广泛应用于多个 DOE 项目,如:- ExaWind(风能模拟)
- Nyx(宇宙学)
- Pele 系列(燃烧模拟,如 PeleC、PeleLM)
- WarpX(等离子体物理、激光-等离子体相互作用)
二、AMReX 的主要组件
| 组件 | 功能 |
|---|---|
BoxArray / DistributionMapping | 描述网格块的分布与并行划分 |
MultiFab / iMultiFab | 分布式多块数组,用于存储场变量(如密度、速度) |
AmrCore / AmrLevel | AMR 层级管理框架 |
ParticleContainer | 高性能粒子系统,支持粒子-网格交互 |
LinearSolvers | 多重网格、Krylov 子空间等求解器 |
EB2(Embedded Boundary) | 嵌入边界方法,处理复杂几何 |
三、安装与依赖
依赖项
- C++17 编译器(如 GCC ≥ 8, Clang ≥ 10, NVHPC, Intel oneAPI)
- MPI(如 OpenMPI、MPICH)
- (可选)CUDA / HIP / SYCL 用于 GPU 加速
- (可选)Python 3 + pybind11(用于 PyAMReX)
安装方式(以 Linux 为例)
git clone https://github.com/AMReX-Codes/amrex.git
cd amrex
mkdir build && cd build
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DAMReX_MPI=ON \
-DAMReX_OMP=ON \
-DAMReX_GPU_BACKEND=CUDA # 或 HIP / SYCL / NONE
make -j8
也可通过 Spack 安装:
spack install amrex +mpi +openmp +cuda
四、简单使用示例(C++)
以下是一个极简的 AMReX 程序,创建一个 3D 网格并初始化一个场变量:
#include <AMReX.H>
#include <AMReX_MultiFab.H>
using namespace amrex;
int main(int argc, char* argv[])
{
amrex::Initialize(argc, argv);
{
// 定义计算域 [0,1]^3,64^3 网格
IntVect domain_lo(0, 0, 0);
IntVect domain_hi(63, 63, 63);
Box domain(domain_lo, domain_hi);
// 创建 BoxArray 和 DistributionMapping
BoxArray ba(domain);
ba.maxSize(32); // 每个块最大 32^3
DistributionMapping dm(ba);
// 创建 MultiFab(1 个分量,1 层 ghost cell)
MultiFab mf(ba, dm, 1, 1);
mf.setVal(0.0); // 初始化为 0
// 在本地网格上赋值
for (MFIter mfi(mf); mfi.isValid(); ++mfi) {
const Box& bx = mfi.validbox();
auto arr = mf.array(mfi);
amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE (int i, int j, int k) {
arr(i,j,k) = i + j + k;
});
}
// 输出(仅用于演示)
Print() << "Initialized MultiFab on " << ParallelDescriptor::NProcs() << " ranks.\n";
}
amrex::Finalize();
return 0;
}
编译(假设 AMReX 已安装到 $AMREX_DIR):
g++ -I$AMREX_DIR/src -L$AMREX_DIR/lib -lamrex -lmpi -fopenmp example.cpp -o example
五、典型应用场景
- 计算流体力学(CFD)
- 湍流、燃烧、多相流(如 Pele 系列)
- 天体物理与宇宙学
- 引力 N 体模拟、星系形成(如 Nyx)
- 等离子体物理
- 激光等离子体加速(WarpX 使用 AMReX 作为底层)
- 风能与环境模拟
- 大气边界层、风电场模拟(ExaWind)
六、学习资源
- 官网:https://amrex-codes.github.io/amrex/
- GitHub:https://github.com/AMReX-Codes/amrex
- 文档:https://amrex-codes.github.io/amrex/docs_html/
- 教程与示例:
amrex/Tests/和amrex/Examples/目录 - 用户邮件列表与 Slack 社区(官网可申请加入)
七、总结
AMReX 是一个功能强大、性能卓越的 AMR 框架,特别适合需要高分辨率局部区域模拟的大规模科学计算问题。其对 CPU/GPU 的统一支持、模块化设计以及活跃的社区,使其成为 Exascale 时代科学模拟的重要工具之一。
如需深入使用,建议从官方示例入手,逐步理解 BoxArray、MultiFab、AmrCore 等核心概念,并结合具体物理问题构建求解器。
浙公网安备 33010602011771号