LAMMPS编译及使用
LAMMPS ("Large-scale Atomic/Molecular Massively Parallel Simulator",大尺度原子/分子并行模拟工具)是由桑迪亚国家实验室开发的一套分子动力学模拟的开源程序包。 LAMMPS使用MPI实现多机器并行计算,在新的版本中,支持基于CUDA和OpenCL的GPU计算。其以GNU通用公共许可证发布,因而开源自由。
本教程将介绍如何在SonmiHPC集群中使用Intel OneAPI编译器来编译LAMMPS。
下载并解压源码
目前主要有两种方式来获取LAMMPS程序:
- 用户可以从LAMMPS官网下载预编译好的二进制文件;
- 用户直接下载LAMMPS源码手动进行编译,当你需要自定义增加某些模块的时候可以采用该方法。
本教程主要主要介绍第二种方式。
首先从官网链接下载最新的源码压缩包:
wget https://download.lammps.org/tars/lammps-stable.tar.gz
wget https://download.lammps.org/tars/lammps-stable.tar.gz
由于LAMMPS官网服务器在国内访问速度过慢,因此如果直接使用wget太慢的话,可以用自己笔记本电脑使用代理下载到本地后再上传到集群上。
下载完成后解压压缩包:
tar xzvf lammps-stable.tar.gz
tar xzvf lammps-stable.tar.gz
解压后可以看到在当前目录下有个lammps开头的目录,切换到该目录再进行后续操作:
cd lammps-2Aug2023
cd lammps-2Aug2023
编译二进制文件
本教程中使用cmake的方式来编译,因此集群上需要安装有cmake工具,如果没找到可以通过如下的命令进行安装需要的工具:
dnf install cmake patch
dnf install cmake patch
使用下面的命令激活oneAPI套件编译环境:
source /opt/intel/oneapi/setvars.sh
source /opt/intel/oneapi/setvars.sh
创建build文件夹:
mkdir build && cd build
mkdir build && cd build
官方提供的oneapi.cmake文件需要修改以下3个地方才能顺利进行编译:
使用vim进行编辑vim ../cmake/presets/oneapi.cmake
,并修改以下的三个位置,内容如下所示:
... ...
set(OpenMP_C_FLAGS "-qopenmp -qopenmp-simd" CACHE STRING "" FORCE)
... ...
set(OpenMP_CXX_FLAGS "-qopenmp -qopenmp-simd" CACHE STRING "" FORCE)
... ...
set(OpenMP_Fortran_FLAGS "-qopenmp -qopenmp-simd" CACHE STRING "" FORCE)
... ...
set(OpenMP_C_FLAGS "-qopenmp -qopenmp-simd" CACHE STRING "" FORCE)
... ...
set(OpenMP_CXX_FLAGS "-qopenmp -qopenmp-simd" CACHE STRING "" FORCE)
... ...
set(OpenMP_Fortran_FLAGS "-qopenmp -qopenmp-simd" CACHE STRING "" FORCE)
进行编译:
# CMAKE_INSTALL_PREFIX: 设置安装路径
# Preset文件建议使用后面oneapi.cmake与most.cmake拼接的userdefined,包含大部分模块
cmake -D CMAKE_INSTALL_PREFIX=/share/apps/lammps -C ../cmake/presets/oneapi.cmake ../cmake/
make -j
make install
# CMAKE_INSTALL_PREFIX: 设置安装路径
# Preset文件建议使用后面oneapi.cmake与most.cmake拼接的userdefined,包含大部分模块
cmake -D CMAKE_INSTALL_PREFIX=/share/apps/lammps -C ../cmake/presets/oneapi.cmake ../cmake/
make -j
make install
如果要使用oneapi.preset和其他模块的preset比如most.preset等可以用如下的命令:
cat ../cmake/presets/oneapi.cmake > ../cmake/presets/userdefined.cmake
cat ../cmake/presets/most.cmake >> ../cmake/presets/userdefined.cmake
# 并在上面的编译步骤中将-C指向的配置文件改为userdefined.cmake
cat ../cmake/presets/oneapi.cmake > ../cmake/presets/userdefined.cmake
cat ../cmake/presets/most.cmake >> ../cmake/presets/userdefined.cmake
# 并在上面的编译步骤中将-C指向的配置文件改为userdefined.cmake
安装完成后进/share/apps/lammps可以看到以下的目录结构:
.
├── bin
│ └── lmp
├── etc
│ └── profile.d
└── share
├── lammps
└── man
.
├── bin
│ └── lmp
├── etc
│ └── profile.d
└── share
├── lammps
└── man
由于上面均为使用管理用户进行操作的,因此集群上其他用户需要使用的话需要修改以下文件夹权限:
chmod -R 755 /share/apps/lammps
chmod -R 755 /share/apps/lammps
Modulefile编写
管理员如果在编译好程序后要通过Module模块加载的方式提供给集群上面的其他用户使用,可以编写如下的Modulefile文件:
mkdir -p /share/apps/modulefiles/lammps
mkdir -p /share/apps/modulefiles/lammps
使用vim用cd /share/apps/moduefiles/lammps/ && vim latest
新增Modulefile文件,文件内容如下:
#%Module###########################################
set modulefilename "LAMMPS Stable Latest"
set modulefilever "2Aug2023"
set min_tcl_ver 8.4
if { $tcl_version < $min_tcl_ver } {
puts stderr " "
puts stderr "ERROR: This modulefile requires tcl $min_tcl_ver or greater."
puts stderr "Your system reports that tclsh version $tcl_version is installed."
exit 1
}
if { [ module-info mode load ] } {
puts stderr "Loading $modulefilename version $modulefilever"
}
if { [ module-info mode ] == "unload" || [ module-info mode ] == "remove" } {
puts stderr "Removing $modulefilename version $modulefilever"
puts stderr "Use to view any remaining dependent modules."
}
prepend-path PATH /share/apps/lammps/bin
setenv LAMMPS_POTENTIALS /share/apps/lammps/share/lammps/potentials
setenv MSI2LMP_LIBRARY /share/apps/lammps/share/lammps/frc_files
#%Module###########################################
set modulefilename "LAMMPS Stable Latest"
set modulefilever "2Aug2023"
set min_tcl_ver 8.4
if { $tcl_version < $min_tcl_ver } {
puts stderr " "
puts stderr "ERROR: This modulefile requires tcl $min_tcl_ver or greater."
puts stderr "Your system reports that tclsh version $tcl_version is installed."
exit 1
}
if { [ module-info mode load ] } {
puts stderr "Loading $modulefilename version $modulefilever"
}
if { [ module-info mode ] == "unload" || [ module-info mode ] == "remove" } {
puts stderr "Removing $modulefilename version $modulefilever"
puts stderr "Use to view any remaining dependent modules."
}
prepend-path PATH /share/apps/lammps/bin
setenv LAMMPS_POTENTIALS /share/apps/lammps/share/lammps/potentials
setenv MSI2LMP_LIBRARY /share/apps/lammps/share/lammps/frc_files
保存后,修改权限:
chmod -R 755 /share/apps/modulefiles
chmod -R 755 /share/apps/modulefiles
用户使用如下的命令就可以看到该模块:
[root@sonmi lammps]# module avail
--------------------------- /share/apps/modulefiles ---------------------------
lammps/latest
[root@sonmi lammps]# module avail
--------------------------- /share/apps/modulefiles ---------------------------
lammps/latest
需要加载的时候使用下面的命令即可:
module load lammps/latest
module load lammps/latest
提交脚本示例
集群上用户可以通过编辑如下的脚本进行任务调度,vim lammps.sub
:
#!/bin/bash
#SBATCH --job-name=lammps
#SBATCH --partition=sonmi
#SBATCH --output=%j.out
#SBATCH --error=%j.err
#SBATCH --nodelist=compute-0-[0-1]
#SBATCH --exclusive
#SBATCH --time=02:00:00
ulimit -s unlimited
ulimit -l unlimited
module load lammps/latest
source /opt/intel/oneapi/setvars.sh
cd $SLURM_SUBMIT_DIR
mpirun -np 16 lmp -in in.protein
#!/bin/bash
#SBATCH --job-name=lammps
#SBATCH --partition=sonmi
#SBATCH --output=%j.out
#SBATCH --error=%j.err
#SBATCH --nodelist=compute-0-[0-1]
#SBATCH --exclusive
#SBATCH --time=02:00:00
ulimit -s unlimited
ulimit -l unlimited
module load lammps/latest
source /opt/intel/oneapi/setvars.sh
cd $SLURM_SUBMIT_DIR
mpirun -np 16 lmp -in in.protein
并使用sbatch命令进行提交:
sbatch lammps.sub
sbatch lammps.sub