AMReX(Adaptive Mesh Refinement in C++ for Exascale)是一个开源的、高性能的C++软件框架,专为构建大规模并行、自适应网格细化(Adaptive Mesh Refinement, AMR)应用程序而设计。它最初由美国能源部(DOE)下属的多个国家实验室(如劳伦斯伯克利国家实验室 LBNL、劳伦斯利弗莫尔国家实验室 LLNL、阿贡国家实验室 ANL 等)联合开发,旨在支持下一代百亿亿次(Exascale)计算。


一、AMReX 的核心特点

  1. 自适应网格细化(AMR)支持
    AMReX 提供灵活的块结构化 AMR(Block-Structured AMR)能力,允许在计算域中对感兴趣区域进行局部网格加密,从而在保证精度的同时节省计算资源。

  2. 高性能与可扩展性

    • 支持 MPI + OpenMP 混合并行。
    • 针对现代 CPU 架构(如 Intel、AMD、ARM)和 GPU(通过 CUDA、HIP、SYCL 等后端)进行了高度优化。
    • 可扩展至数十万 CPU 核心或数千 GPU。
  3. 多语言接口

    • 主要使用 C++ 编写,提供面向对象的 API。
    • 支持 Fortran 和 Python(通过 PyAMReX)接口,便于集成传统代码或快速原型开发。
  4. 模块化设计
    AMReX 将核心功能(如网格管理、并行通信、线性求解器、粒子系统等)模块化,用户可根据需求选择组件。

  5. 丰富的数值工具

    • 内置多种插值、差分、积分算子。
    • 支持粒子-网格耦合(Particle-Mesh),适用于多相流、天体物理等场景。
    • 提供线性求解器(如 Multigrid、CG、BiCGStab)和非线性求解器框架。
  6. 活跃的社区与生态系统
    AMReX 被广泛应用于多个 DOE 项目,如:

    • ExaWind(风能模拟)
    • Nyx(宇宙学)
    • Pele 系列(燃烧模拟,如 PeleC、PeleLM)
    • WarpX(等离子体物理、激光-等离子体相互作用)

二、AMReX 的主要组件

组件功能
BoxArray / DistributionMapping描述网格块的分布与并行划分
MultiFab / iMultiFab分布式多块数组,用于存储场变量(如密度、速度)
AmrCore / AmrLevelAMR 层级管理框架
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

五、典型应用场景

  1. 计算流体力学(CFD)
    • 湍流、燃烧、多相流(如 Pele 系列)
  2. 天体物理与宇宙学
    • 引力 N 体模拟、星系形成(如 Nyx)
  3. 等离子体物理
    • 激光等离子体加速(WarpX 使用 AMReX 作为底层)
  4. 风能与环境模拟
    • 大气边界层、风电场模拟(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 时代科学模拟的重要工具之一。

如需深入使用,建议从官方示例入手,逐步理解 BoxArrayMultiFabAmrCore 等核心概念,并结合具体物理问题构建求解器。

posted on 2025-09-30 17:09  ycfenxi  阅读(29)  评论(0)    收藏  举报