OpenFOAM:集成AMGX方程求解器实践

OpenFOAM: 集成AMGX方程求解器实践

介绍

OpenFOAM是流体计算中最著名的开源库,历史悠久,功能丰富,同时源码规模也非常庞大。在模型问题求解中,最终映射到稀疏矩阵(ldumatrix)方程求解问题,OpenFOAM自带数个方程求解器,其中GAMG求解器既是代数多重网格方法(AMG). AMG对椭圆和抛物线型PDE方程离散化后的方程效果很好,尤其是超大规模问题,收敛性基本不依赖于问题规模,一般配合做为稀疏矩阵迭代解法(CG/PCG, GMRES/FGMRES等)中的预处理器(Preconditioner)使用。

AMGX是NVIDIA公司基于BoomerAMG实现开发的一套运行在GPU加速卡环境下的代数多重网格方法实现,支持多机多卡分布式环境,已经被商业CFD软件Fluent集成。

在OpenFOMA主流应用求解器中一般采用SIMPLE,或PISO,或Pimple压力分离的定点迭代算法,其中压力场方程单独求解,在整体迭代耗时中压力场计算占比很大。这些算法中压力场方程都是椭圆类型的PDE,非常适合AMG方法应用。

OpenFOAM官网中有外部求解器仓库,其中利用petsc4Foam和改进的amgXWrapper, 可以在lduMatrix层面做一个通用的方程求解。 这里的集成实践采用另一种路线,直接修改Application应用(如iocFoam,pisoFoam,…),用AMGX方程求解器替换掉压力场求解器(pEqn.solve)。

对大规模测试(800万和2700万网格)效果很明显,无论从求解准确性和求解耗时上,AMGX方案都明显具有优势。


细节步骤

  • fvScalarMatrix(即lduMatrix)格式转换. AMGX只接收CSR压缩格式的稀疏矩阵,需要将OpenFOAM中的lduMatrix矩阵格式转化成CSR格式, 对于固定网格模型,可首次计算获取排序置换信息,在接下来转换中直接利用之,避免频繁排序,测试中CSR整体计算占比很小(CPU上计算)
  • CSR矩阵上传和更新AMGX内部矩阵、向量对象(A,x,b等, CPU->GPU数据传输)
  • AMGX调用求解函数进行求解, 主要耗时部分(GPU上计算)
  • 将GPU上结果传回CPU,耗时很少(GPU->CPU数据传输)

测试结果

测试环境说明

环境 说明 备注
CPU i9-12000k
GPU RTX 3090/24GB
CUDA 12.1
C/C++ gcc-9.3.1

OpenFOAM HPC超大规模算例实验(icoFoam)

方程求解器: PCG+AMG

求解器配置文件: PCG_CLASSICAL_V_JACOBI.json

算例 pEqn.solve AMGX.solve fvScalarMatrix->CSR pEqn和AMGX求解误差
Cavity3D(800万网格) 75.0(s) 0.72(s) 0.12(s) <1.e-6
Cavity3D(2700万网格) 315.0(s) 2.2(s) 0.4(s) <1.e-6

总结

  • 对超大模型,AMGX此种方式集成有实际意义,加速效果明显
  • 此种集成方式,不触及OpenFOAM底层(比如RapidCFD方式),也无需引入第三方库(比如petsc4foam),按需修改Application
  • AMGX的计算结果基本可以达到直接法的误差精度(在100万网格测试用例中比较了直接法的结果)
  • 对lduMatrix->CSR可进一步优化,将排序和数据置换放在GPU上进行(通过异步数据传输,可以部分覆盖CPU端计算和GPU端排序)

你可能感兴趣的:(CFD/OpenFOAM,CUDA,C/C++,GPU,OpenFOAM)