LAMMPS编译及使用 
LAMMPS ("Large-scale Atomic/Molecular Massively Parallel Simulator",大尺度原子/分子并行模拟工具)是由桑迪亚国家实验室开发的一套分子动力学模拟的开源程序包。 LAMMPS使用MPI实现多机器并行计算,在新的版本中,支持基于CUDA和OpenCL的GPU计算。其以GNU通用公共许可证发布,因而开源自由。
本教程将介绍如何在SonmiHPC集群中使用Intel OneAPI编译器来编译LAMMPS CPU版本。
下载并解压源码 
目前主要有两种方式来获取LAMMPS程序:
- 用户可以从LAMMPS官网下载预编译好的二进制文件;
- 用户直接下载LAMMPS源码手动进行编译,当你需要自定义增加某些模块的时候可以采用该方法。
本教程主要主要介绍第二种方式。
首先从官网链接下载最新的源码压缩包:
wget https://download.lammps.org/tars/lammps-stable.tar.gzwget https://download.lammps.org/tars/lammps-stable.tar.gz由于LAMMPS官网服务器在国内访问速度过慢,因此如果直接使用wget太慢的话,可以用自己笔记本电脑使用代理下载到本地后再上传到集群上。
下载完成后解压压缩包:
tar xzvf lammps-stable.tar.gztar xzvf lammps-stable.tar.gz解压后可以看到在当前目录下有个lammps开头的目录,切换到该目录再进行后续操作:
cd lammps-2Aug2023 
# 该解压目录根据不同时间下载的最新版的源码包可能不一样cd lammps-2Aug2023 
# 该解压目录根据不同时间下载的最新版的源码包可能不一样编译二进制文件 
本教程中使用cmake的方式来编译,因此集群上需要安装有cmake工具,如果没找到可以通过如下的命令进行安装需要的工具:
dnf install -y cmake patchdnf install -y cmake patch使用下面的命令激活oneAPI套件编译环境:
source /opt/intel/oneapi/setvars.shsource /opt/intel/oneapi/setvars.sh创建build文件夹:
mkdir build && cd buildmkdir 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
# 需要添加其他额外的LAMMPS模块的话可以自行修改上面生成的userdefined.cmake文件
# 生成后在编译过程中,需要将 -C 参数修改为../cmake/presets/userdefined.cmakecat ../cmake/presets/oneapi.cmake > ../cmake/presets/userdefined.cmake
cat ../cmake/presets/most.cmake >> ../cmake/presets/userdefined.cmake
# 并在上面的编译步骤中将-C指向的配置文件改为userdefined.cmake
# 需要添加其他额外的LAMMPS模块的话可以自行修改上面生成的userdefined.cmake文件
# 生成后在编译过程中,需要将 -C 参数修改为../cmake/presets/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/lammpschmod -R 755 /share/apps/lammpsModulefile编写 
管理员如果在编译好程序后要通过Module模块加载的方式提供给集群上面的其他用户使用,可以编写如下的Modulefile文件:
mkdir -p /share/apps/modulefiles/lammpsmkdir -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/modulefileschmod -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/latestmodule 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.subsbatch lammps.sub