【LAMMPS学习】八、基础知识(6.1)将CMake 与 LAMMPS 结合使用

发布于:2024-05-16 ⋅ 阅读:(53) ⋅ 点赞:(0)

8. 基础知识

此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各种模拟。

8.1.通用基础知识

8.2. 设置入门

8.3. 分析入门

8.4. 力场入门

8.5. 软件包入门

8.6.操作教程

8.6.1.将 CMake 与 LAMMPS 结合使用

感谢 Christoph Junghans (LANL) 和 Richard Berger (LANL) 的努力,LAMMPS 最近添加了对使用 CMake 构建 LAMMPS 的支持。 CMake 的主要优势之一是它不依赖于特定平台或构建系统。相反,它生成为不同构建系统和不同平台构建和开发所需的文件。请注意,这适用于构建系统本身,而不是 LAMMPS 代码。换句话说,如果没有额外的移植工作,就不可能在 Windows 上使用 Visual C++ 编译 LAMMPS。构建系统输出还可以包括在集成开发环境 (IDE)(如 Eclipse、Visual Studio、QtCreator、Xcode、CodeBlocks、Kate 等)中将 LAMMPS 编程为项目所需的支持文件。

CMake 的第二个重要功能是它可以检测和验证可用的库、最佳设置、可用的支持工具等,因此默认情况下 LAMMPS 将利用可用的工具,而无需提供有关如何启用/集成它们的详细信息。

这种方法的缺点是,运行 CMake 本身以及如何自定义 LAMMPS 的构建存在一些复杂性。本教程将通过一些选定的示例展示如何管理此问题。请参阅有关构建 LAMMPS 的章节,了解一般 LAMMPS 和特定包的特定标志和选项的描述。

CMake 可以通过命令行界面 (CLI) 程序 cmake (或 cmake3 )、文本模式交互式用户界面 (TUI) 程序 ccmake 使用(或 ccmake3 ),或图形用户界面(GUI)程序 cmake-gui 。它们都是可移植软件,可在所有支持的平台上使用,并且可以互换使用。自 LAMMPS 版本 2023 年 8 月 2 日起,所需的最低 CMake 版本为 3.16。

有关 CMake 功能和设置的所有详细信息都在CMake 在线文档中。下面我们重点关注与编译 LAMMPS 相关的最重要的方面。

先决条件

本教程假设您使用 Bash 或 Zsh 等 shell 在命令行环境中进行操作。

  • Linux:任何终端窗口或文本控制台都可以工作

  • macOS:启动终端应用程序

  • Windows 10 或 11:安装并运行适用于 Linux 的 Windows 子系统

  • 其他类 Unix 操作系统,例如 FreeBSD

注:还可以通过 Microsoft Visual Studio IDE 与捆绑的 CMake 或使用单独安装的 CMake 包从 Windows 命令提示符在 Windows 10 或 11 上使用 CMake,两者都使用本机 Microsoft Visual C++ 编译器和(可选)Microsoft MPI SDK。然而,本教程仅涵盖类 UNIX 命令行界面。

我们还假设您已经下载并解压了最新的 LAMMPS 源代码包,或者使用 Git 在编译计算机上创建了 LAMMPS 源代码的克隆。

您应该更改为 LAMMPS 源代码树的顶级目录,教程中提到的所有路径都与该目录相关。下载后,它应该立即如下所示:

$ ls
bench  doc       lib      potentials  README  tools
cmake  examples  LICENSE  python      src
构建与源目录

使用 CMake 时,构建过程分为多个不同的阶段:

  1. Configuration: 配置:检测或定义应启用和使用哪些功能和设置以及应如何编译 LAMMPS

  2. Compilation: 编译:生成并编译所有必需的源文件并构建库和可执行文件。

  3. Installation: 安装:将选定的文件从编译复制到您的文件系统中,这样就可以使用它们,而无需保留源代码和构建树。

LAMMPS 的配置和编译必须在专用的构建目录中进行,该目录必须与源目录不同。此外,源目录 ( src ) 必须保持原始状态,因此不允许使用传统的 make 过程“安装”包,并且在尝试编译后,必须删除所有创建的源文件。这可以通过 make no-all purge 来实现。

您可以选择source tree之外的任何文件夹。我们建议在顶级目录中创建一个文件夹 build ,或者创建多个文件夹,以防您想要使用不同选项( build-parallel 、 build-serial 、 build-clang 、 build-intel )等。由一个构建过程创建的所有辅助文件(可执行文件、目标文件、日志文件等)都存储在 CMake 创建的此目录或其中的子目录中。

运行 CMake
CLI 版本

在(空) build 目录中,我们现在运行命令 cmake ../cmake ,这将启动配置阶段,您将看到配置进度打印到屏幕上,然后是摘要启用的功能、选项和编译器设置。典型的摘要屏幕如下所示:

$ cmake ../cmake/
-- The CXX compiler identification is GNU 8.2.0
-- Check for working CXX compiler: /opt/tools/gcc-8.2.0/bin/c++
-- Check for working CXX compiler: /opt/tools/gcc-8.2.0/bin/c++ - works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found Git: /usr/bin/git (found version "2.25.2")
-- Running check for auto-generated files from make-based build system
-- Found MPI_CXX: /usr/lib64/mpich/lib/libmpicxx.so (found version "3.1")
-- Found MPI: TRUE (found version "3.1")
-- Looking for C++ include omp.h
-- Looking for C++ include omp.h - found
-- Found OpenMP_CXX: -fopenmp (found version "4.5")
-- Found OpenMP: TRUE (found version "4.5")
-- Found JPEG: /usr/lib64/libjpeg.so (found version "62")
-- Found PNG: /usr/lib64/libpng.so (found version "1.6.37")
-- Found ZLIB: /usr/lib64/libz.so (found version "1.2.11")
-- Found GZIP: /usr/bin/gzip
-- Found FFMPEG: /usr/bin/ffmpeg
-- Performing Test COMPILER_SUPPORTS-ffast-math
-- Performing Test COMPILER_SUPPORTS-ffast-math - Success
-- Performing Test COMPILER_SUPPORTS-march=native
-- Performing Test COMPILER_SUPPORTS-march=native - Success
-- Looking for C++ include cmath
-- Looking for C++ include cmath - found
-- Generating style_angle.h...
[...]
-- Generating lmpinstalledpkgs.h...
-- The following tools and libraries have been found and configured:
 * Git
 * MPI
 * OpenMP
 * JPEG
 * PNG
 * ZLIB

-- <<< Build configuration >>>
   Build type:       RelWithDebInfo
   Install path:     /home/akohlmey/.local
   Generator:        Unix Makefiles using /usr/bin/gmake
-- <<< Compilers and Flags: >>>
-- C++ Compiler:     /opt/tools/gcc-8.2.0/bin/c++
      Type:          GNU
      Version:       8.2.0
      C++ Flags:     -O2 -g -DNDEBUG
      Defines:       LAMMPS_SMALLBIG;LAMMPS_MEMALIGN=64;LAMMPS_JPEG;LAMMPS_PNG;LAMMPS_GZIP;LAMMPS_FFMPEG
      Options:       -ffast-math;-march=native
-- <<< Linker flags: >>>
-- Executable name:  lmp
-- Static library flags:
-- <<< MPI flags >>>
-- MPI includes:     /usr/include/mpich-x86_64
-- MPI libraries:    /usr/lib64/mpich/lib/libmpicxx.so;/usr/lib64/mpich/lib/libmpi.so;
-- Configuring done
-- Generating done
-- Build files have been written to: /home/akohlmey/compile/lammps/build

cmake 命令有一个强制参数,即包含文件 CMakeLists.txt 或 CMakeCache.txt 的文件夹。 CMakeCache.txt 文件是在 CMake 配置运行期间创建的,包含所有活动设置,因此在第一次运行 CMake 后,构建文件夹中的所有未来运行都可以使用文件夹 . 并且 CMake 将知道在哪里可以找到 CMake 脚本并重新加载上一步中的设置。这意味着,可以通过重新运行 CMake 来修改现有配置,但只需要提供指示所需更改的标志,其他所有内容都将保留。人们还可以混合编译和配置,即从最小配置开始,然后根据需要启用其他功能并重新编译。

上述步骤不会编译代码。可以使用 cmake --build . 以便携式方式启动编译,或者使用选定的构建工具,例如 make 。

TUI 版本

对于文本模式 UI CMake 程序,基本原理是相同的。您在 build 文件夹中启动命令 ccmake ../cmake 。

_images/ccmake-initial.png

初始 ccmake 屏幕 

_images/ccmake-config.png

配置 ccmake 的输出

_images/ccmake-options.png

ccmake 的选项屏幕

这将向您显示带有空配置缓存的初始屏幕(左图)。现在您输入“c”键来运行配置步骤。这将执行第一次配置运行并显示摘要(中心图像)。您可以使用“e”退出摘要屏幕,现在可以看到包含检测到的选项和设置的主屏幕。您现在可以通过使用键盘的箭头键向下移动和修改条目来进行更改。对于开/关设置,回车键将切换状态。对于其他人,按 Enter 键将允许您修改值,并通过再次按 Enter 键提交更改或使用转义键取消。所有“新”设置都将标有星号“*”,只要有一个设置如此标记,您就必须再次按“c”键(有时多次,除非 TUI 显示)来重新运行配置字母“g”旁边的“generate”一词,然后按“g”键,构建文件将被写入该文件夹,然后 TUI 退出。您可以通过点击“q”退出而不生成构建文件。

GUI 版本

对于图形 CMake 程序,步骤与 TUI 版本类似。您可以在 build 文件夹中键入命令 cmake-gui ../cmake 。在这种情况下,不需要 CMake 脚本文件夹的路径,也可以从 GUI 输入它。

_images/cmake-gui-initial.png

初始 cmake-gui 屏幕 

_images/cmake-gui-popup.png

cmake-gui 中的生成器选择

_images/cmake-gui-options.png

cmake-gui 的选项屏幕

同样,您从空的配置缓存(左图)开始,并且需要启动配置步骤。对于文件夹中的第一个配置,您将看到一个弹出对话框(中心图像),要求选择所需的构建工具和一些配置设置(坚持默认值),然后您将看到选项屏幕,其中突出显示所有新设置红色的。您可以修改(或不修改)它们,然后再次单击“配置”按钮,直到满意为止,然后单击“生成”按钮写出构建文件。您可以从“文件”菜单退出 GUI 或点击“ctrl-q”。

设置选项

启用、禁用或修改设置的选项是通过设置 CMake 变量的值来修改的。这是在命令行上使用 -D 标志以 -D VARIABLE=value 格式完成的,例如 -D CMAKE_BUILD_TYPE=Release 或 -D BUILD_MPI=on 。有一个怪癖:当在 CMake 目录之前使用时,-D 标志和变量之间可能有一个空格,但在它之后则不能有空格。此类 CMake 变量可以具有布尔值(开/关、是/否或 1/0 均有效),或者是表示选择或路径的字符串,或者是自由格式。如果字符串包含空格,则必须将其放在引号中,例如 -D CMAKE_TUNE_FLAGS="-ftree-vectorize -ffast-math" 。

CMake 变量分为两类:1) 默认情况下用于任何 CMake 配置设置的通用 CMake 变量;2) 项目特定变量,即特定于 LAMMPS 的设置。此外,CMake 变量可以标记为高级,这意味着默认情况下,它们不会在所有设置概述中的文本模式或图形 CMake 程序中显示,但仅在明确请求时(通过按“t”键或单击“高级'复选框)。

一些常见的 CMake 变量

Variable

Description

CMAKE_INSTALL_PREFIX

make install 安装位置的根目录(默认: $HOME/.local )

LAMMPS_INSTALL_RPATH

从二进制文件中设置或删除 make install 的运行时路径设置(默认值: off )

CMAKE_BUILD_TYPE

控制编译选项: RelWithDebInfo (默认)、 Release 、 Debug 、 MinSizeRel 之一

BUILD_SHARED_LIBS

如果设置为 on 将 LAMMPS 库构建为共享库(默认值: off )

CMAKE_MAKE_PROGRAM

编译命令的名称/路径(默认取决于 -G 选项,通常为 make )

CMAKE_VERBOSE_MAKEFILE

如果设置为 on 在构建期间执行时回显命令(默认值: off )

CMAKE_C_COMPILER

用于编译的 C 编译器(默认:系统特定,Linux 上的 gcc )

CMAKE_CXX_COMPILER

用于编译的 C++ 编译器(默认:系统特定,Linux 上的 g++ )

CMAKE_Fortran_COMPILER

用于编译的 Fortran 编译器(默认:系统特定,Linux 上的 gfortran )

CXX_COMPILER_LAUNCHER

启动 C++ 编译器的工具,例如 ccache 或 distcc以加快编译速度

(默认值:空)

一些常见的 LAMMPS 特定变量

Variable

Description

BUILD_MPI

构建具有 MPI 支持的 LAMMPS(默认值: on 如果工作 MPI 可用,否则 off )

BUILD_OMP

构建支持 OpenMP 的 LAMMPS(默认: on 如果编译器完全支持OpenMP,

否则 off )

BUILD_TOOLS

从 tools 文件夹编译一些额外的可执行文件(默认: off )

BUILD_LAMMPS_SHELL

从 tools/lammps-shell 文件夹编译 LAMMPS shell(默认: off )

BUILD_DOC

包括构建用于打包/安装的 HTML 格式文档(默认: off )

CMAKE_TUNE_FLAGS

通用编译器标志,用于优化或检测(默认:)

LAMMPS_MACHINE

当设置为 name 时,LAMMPS 可执行文件和库将被调用 lmp_name 和 liblammps_name.a

FFT

选择要使用的 FFT 库: FFTW3 、 MKL 、 KISS (默认,除非找到 FFTW3)

FFT_KOKKOS

选择要在启用 Kokkos 的样式中使用哪个 FFT 库: FFTW3 、 MKL 、 HIPFFT 、 CUFFT 、 KISS (默认)

FFT_SINGLE

选择是否使用单精度 FFT(默认值: off )

WITH_JPEG

转储图像是否支持 JPEG 格式(默认: on 如果找到)

WITH_PNG

转储图像是否支持 PNG 格式(默认: on 如果找到)

WITH_GZIP

是否支持读写压缩文件(默认: on 如果找到)

WITH_FFMPEG

是否支持使用 dump movie 生成电影(默认: on 如果找到)

启用或禁用 LAMMPS 软件包

LAMMPS 软件被组织成始终包含的公共核心和必须启用才能包含在 LAMMPS 可执行文件中的大量add-on packages。通过将 PKG_<NAME> 类型的变量设置为 on 来启用包,并通过将它们设置为 off 来禁用包(或使用 yes 、 no 、 1 、 0 相应)。 <NAME> 必须替换为包的名称,例如 MOLECULE 或 EXTRA-PAIR 。

 使用预设

由于 LAMMPS 有许多可选功能和软件包,因此在命令行上指定它们可能会很乏味。或者,当选择不同的编译器工具链时,必须一致地更改多个选项,这很容易出错。或者,当启用某些软件包时,它们需要一致的设置才能在特定模式下运行。为此,我们在文件夹 cmake/presets 中为 CMake 提供了一系列“预设文件”。它们代表了一种通过设置或更改 CMake 变量来预加载或覆盖 CMake 配置缓存的方法。使用 -C 命令行标志加载预设文件。您可以结合加载多个预设文件或稍后使用附加 -D 标志更改一些变量。几个例子:

cmake -C ../cmake/presets/basic.cmake -D PKG_MISC=on ../cmake
cmake -C ../cmake/presets/clang.cmake -C ../cmake/presets/most.cmake ../cmake
cmake -C ../cmake/presets/basic.cmake -D BUILD_MPI=off ../cmake

第一个命令将安装包 KSPACE 、 MANYBODY 、 MOLECULE 、 RIGID 和 MISC ;前四个来自预设文件,第五个来自显式变量定义。第二个命令将首先切换编译器工具链以使用 Clang 编译器,并安装大量不依赖于任何特殊外部库或工具且并不罕见的软件包。第三个命令将像上面一样启用前四个包,然后强制将 LAMMPS 编译为串行程序(使用 MPI STUBS 库)。

也可以逐步进行此操作。

cmake -C ../cmake/presets/basic.cmake ../cmake
cmake -D PKG_MISC=on .

将实现与上面第一个示例相同的最终配置。在这种情况下,使用文本模式或图形用户界面( ccmake 或 cmake-gui )执行第二个配置步骤特别方便。

注:使用预设选择编译器包( clang.cmake、 gcc.cmakeintel.cmakeoneapi.cmake  或  pgi.cmake )增量更新配置机制的一个例外,因为它们将触发缓存的内部 CMake 设置的重置,从而将设置重置为其默认值。

编译和构建目标

实际的编译将通过运行选定的构建命令来启动(在 Linux 上默认为 make ,请参阅下面如何选择替代方案)。您还可以使用可移植命令 cmake --build . ,它将适应所选的构建命令。如果您通过 CMAKE_MAKE_PROGRAM 变量设置了自定义构建命令,这会特别方便。

在调用构建程序时,您还可以通过在构建命令中附加 --target 标志和目标名称来选择要构建的“目标”。当使用 make 作为构建工具时,您只需将目标名称附加到命令中即可。示例: cmake --build . --target all 或 make all 。以下抽象目标可用:

Target

Description

all

构建“一切”(默认)

lammps

构建 LAMMPS 库和可执行文件

doc

构建 HTML 文档(如果已配置)

install

将所有目标文件安装到 CMAKE_INSTALL_PREFIX 中的文件夹中

test

运行一些测试(如果配置了 -D ENABLE_TESTING=on )

clean

删除所有生成的文件

选择生成器

虽然 CMake 通常默认创建 makefile 来使用 make 程序编译软件,但它支持多个备用构建工具(例如 ninja-build ,它在并行化构建方面往往比 make ),并且可以为 VisualStudio、Eclipse 或 CodeBlocks 等集成开发环境 (IDE) 生成项目文件。这特定于本地 CMake 版本的配置和编译方式。可用选项列表可以在 cmake --help 输出的末尾看到。 Fedora 31 上的示例是:

 

Generators

The following generators are available on this platform (* marks default):
* Unix Makefiles               = Generates standard UNIX makefiles.
  Green Hills MULTI            = Generates Green Hills MULTI files
                                 (experimental, work-in-progress).
  Ninja                        = Generates build.ninja files.
  Ninja Multi-Config           = Generates build-<Config>.ninja files.
  Watcom WMake                 = Generates Watcom WMake makefiles.
  CodeBlocks - Ninja           = Generates CodeBlocks project files.
  CodeBlocks - Unix Makefiles  = Generates CodeBlocks project files.
  CodeLite - Ninja             = Generates CodeLite project files.
  CodeLite - Unix Makefiles    = Generates CodeLite project files.
  Sublime Text 2 - Ninja       = Generates Sublime Text 2 project files.
  Sublime Text 2 - Unix Makefiles
                               = Generates Sublime Text 2 project files.
  Kate - Ninja                 = Generates Kate project files.
  Kate - Unix Makefiles        = Generates Kate project files.
  Eclipse CDT4 - Ninja         = Generates Eclipse CDT 4.0 project files.
  Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files.

下面是运行 CMake 后使用 CodeBlocks IDE 与 ninja 构建工具的屏幕截图,如下所示:

cmake -G 'CodeBlocks - Ninja' ../cmake/presets/most.cmake ../cmake/