# Helmholtz_solver **Repository Path**: suyuexinghen28/helmholtz_solver ## Basic Information - **Project Name**: Helmholtz_solver - **Description**: Linear solvers to the the Helmholtz equation obtained from GRAPES_GFS - **Primary Language**: C++ - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-10-21 - **Last Updated**: 2025-01-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 程序功能说明 使用HIP C编程实现**GCR, BiCGStab, GMRES三种线性迭代算法**, 求解由GRAPES_GFS中Helmholtz方程离散得到的**19对角非对称线性方程组**。 其中GCRODR与GMRES共用一套程序,由变量kR控制GCRODR中压缩投影的维数,当kR为0时退化为通常的GMRES, 这里实现的GMRES通过GIVENS变换求解最小二乘问题。 ## 程序结构说明 - `src/main.f90`: - 主程序,调用 `inc/defmpi.inc` 初始化 MPI,调用 `mygetvar_c.cpp`。 - `src/h1.f90`: - 定义一些参数值。 - `src/mygetvar_c.cpp`: - 从 NETCDF 文件读入线性方程组的系数矩阵、右端项和初始解,然后调用 `solve_helmholts.cpp`。 - 数据可以从 [Coefficient_matrix_of_Helmholtz_equation](https://modelscope.cn/datasets/suyuexinghen/Coefficient_matrix_of_Helmholtz_equation) 下载,文件夹名称改为 `data`。 - `src/solve_helmholts.cpp`: - 初始化 GPU 设备,使用 `#define CUDA` 控制调用 `psolve_xx.cpp` 或 `cu_psolve_xx.cpp`(`xx` 为 `gcr` `bicgstab` 或 `gmres`)。 - `src/psolve_xx.cpp`: - C 版本的线性求解器(GCR, BiCGStab 或 GMRES)。 - `src/cu_psolve_xx.cpp`: - HIP 版本的线性求解器(GCR, BiCGStab 或 GMRES)。 - `src/ca_psolve_gcr.cpp`: - C版本的CA-GCR(communication-avoiding GCR),可通过在`src/solve_helmholts.cpp`中通过宏定义`CA`启用, 替代原本的`src/psolve_gcr.cpp`. - `src/matrixpro.c`: - C 版本的矩阵向量乘。 - `inc/matrixpro.hpp`: - HIP 版本的矩阵向量乘。 - `src/svrasr.c`: - C 版本的追赶法(求解 ILU 预条件子中的上下三角方程)。 - `inc/svrasr.hpp`: - HIP 版本的追赶法。 - `src/update_a.c`: - 在 C 版本中实现系数矩阵转置。 - `src/module_halo.F`: - 调用 `inc/glob_updatehalo.inc` 实现CPU上的 MPI 边界通信。 - `cu_glob_updatehalo.cpp`: - 实现 GPU 到 CPU 再到 GPU 的 MPI 边界通信。 - `inc/defvar.hpp`: - 初始化一些数组内存(包括 CPU 和 GPU)。 - `inc/gcr.h`, `inc/norm.hpp`: - 定义一些宏定义。 - `makefile`: - 通过 `make` 编译程序,通过 `make run` 运行程序(调用 `run.slurm` 提交作业)。 - `run.slurm`: - 在集群提交作业,通过src/dcu_bind.sh绑定NUMA节点执行run.exe, 节点信息写入文件 `hostfile`。 ## 其它文件说明 qr.cpp, comp_eig.cpp, orth_vec.cpp, harm_ritz_vec.cpp这些文件用于GMRES中求解调和Ritz值构建投影向量, 进一步可用于开发带有压缩重启的GMRES(GMRESDR或GCRODR) ## 输出文件讲解 - `obj/`: - 生成可执行程序的存放路径。 - `runlog/`: - 存放作业运行的 log 文件。 - `run.exe`: - 编译生成的主程序。 - `outfile_cu`: - GPTL 测时的输出文件。 ## 依赖软件 - **NetCDF**:用于读入数据,请安装 Fortran 版本。 - **DTK**:用于编译 HIP 程序。 - **Intel OneAPI**:用于编译 Fortran 和 C 程序。 - **GPTL**:用于测时,推荐使用 5.5.3 版本。 ## 联系作者 张峰 中科院计算机网络信息中心 Email: zhangfeng@cnic.cn