diff --git a/cmake/Modules/FindN2P2.cmake b/cmake/Modules/FindN2P2.cmake index f1a9058f33..a06850f07f 100644 --- a/cmake/Modules/FindN2P2.cmake +++ b/cmake/Modules/FindN2P2.cmake @@ -1,25 +1,47 @@ include(FindPackageHandleStandardArgs) +# Check if N2P2_DIR is set manually. if (DEFINED ENV{N2P2_DIR}) set(N2P2_DIR "${N2P2_DIR}") +# If not, try if directory "lib/nnp/n2p2" exists. +else() + get_filename_component(_fullpath "${LAMMPS_LIB_SOURCE_DIR}/nnp/n2p2" REALPATH) + if (EXISTS ${_fullpath}) + set(N2P2_DIR "${_fullpath}") + endif() endif() -message(STATUS "N2P2_DIR=${N2P2_DIR}") +# Set path to include directory. find_path(N2P2_INCLUDE_DIR InterfaceLammps.h PATHS "${N2P2_DIR}/include") +# Two libraries need to be linked: libnnp and libnnpif. find_library(N2P2_LIBNNP NAMES nnp PATHS "${N2P2_DIR}/lib") find_library(N2P2_LIBNNPIF NAMES nnpif PATHS "${N2P2_DIR}/lib") +# Users could compile n2p2 with extra flags which are then also required for +# pair_nnp.cpp compilation. To forward them to the LAMMPS build process n2p2 +# writes a file with cmake commands, e.g. +# +# target_compile_definitions(lammps PRIVATE -DNNP_NO_SF_GROUPS) +# +# to "lib/lammps-extra.cmake" which is then included by USER-NNP.cmake. +find_file(N2P2_CMAKE_EXTRA NAMES lammps-extra.cmake PATHS "${N2P2_DIR}/lib") -find_package_handle_standard_args(N2P2 DEFAULT_MSG N2P2_INCLUDE_DIR N2P2_LIBNNP) +find_package_handle_standard_args(N2P2 DEFAULT_MSG + N2P2_DIR + N2P2_INCLUDE_DIR + N2P2_LIBNNP + N2P2_LIBNNPIF + N2P2_CMAKE_EXTRA) if(N2P2_FOUND) set(N2P2_INCLUDE_DIRS ${N2P2_INCLUDE_DIR}) set(N2P2_LIBRARIES ${N2P2_LIBNNPIF} ${N2P2_LIBNNP}) + set(N2P2_CMAKE_EXTRAS ${N2P2_CMAKE_EXTRA}) mark_as_advanced( N2P2_DIR N2P2_INCLUDE_DIR N2P2_LIBNNP N2P2_LIBNNPIF + N2P2_CMAKE_EXTRA ) endif() - diff --git a/cmake/Modules/Packages/USER-NNP.cmake b/cmake/Modules/Packages/USER-NNP.cmake index 57eae791d2..2ebc1f6e36 100644 --- a/cmake/Modules/Packages/USER-NNP.cmake +++ b/cmake/Modules/Packages/USER-NNP.cmake @@ -1,3 +1,4 @@ find_package(N2P2 REQUIRED) target_include_directories(lammps PRIVATE ${N2P2_INCLUDE_DIRS}) target_link_libraries(lammps PRIVATE ${N2P2_LIBRARIES}) +include(${N2P2_CMAKE_EXTRAS}) diff --git a/doc/src/Build_extras.rst b/doc/src/Build_extras.rst index 99aaf69f8f..f40972b544 100644 --- a/doc/src/Build_extras.rst +++ b/doc/src/Build_extras.rst @@ -1592,17 +1592,38 @@ on your system. USER-NNP package --------------------------------- +To build with the USER-NNP package it is required to download and build the +external `n2p2 `__ library ``v2.2.0`` +(or higher) before starting the LAMMPS build process. More specifically, only +the *n2p2* core library ``libnnp`` and interface library ``libnnpif`` are +actually needed: when using GCC it should suffice to execute ``make libnnpif`` +in the *n2p2* ``src`` directory. For more details please see the `n2p2 build +documentation `__. If +*n2p2* is downloaded and compiled in the LAMMPS directory ``lib/nnp/n2p2`` no +special flags need to be set besides the usual package activation. If you prefer +to install *n2p2* somewhere else on your system you must specify the path via +the ``N2P2_DIR`` variable. + .. tabs:: .. tab:: CMake build + There is one additional setting besides ``-D PKG_USER-NNP=yes`` in case + *n2p2* is not installed in the ``lib/nnp/n2p2`` directory: + .. code-block:: bash - ADD STUFF HERE + -D N2P2_DIR=path # path ... n2p2 installation path .. tab:: Traditional make - ADD STUFF HERE + There is one additional variable that needs to be set besides ``make + yes-user-nnp`` in case *n2p2* is not installed in the ``lib/nnp/n2p2`` + directory: + + .. code-block:: bash + + make N2P2_DIR=path ... ---------- diff --git a/doc/src/Packages_user.rst b/doc/src/Packages_user.rst index 8f7e955924..77bf13cde6 100644 --- a/doc/src/Packages_user.rst +++ b/doc/src/Packages_user.rst @@ -79,7 +79,7 @@ package: +------------------------------------------------+-----------------------------------------------------------------+-------------------------------------------------------------------------------+------------------------------------------------------+---------+ | :ref:`USER-NETCDF ` | dump output via NetCDF | :doc:`dump netcdf ` | n/a | ext | +------------------------------------------------+-----------------------------------------------------------------+-------------------------------------------------------------------------------+------------------------------------------------------+---------+ -| :ref:`USER-NNP ` | High-dimensional neural network potenials | :doc:`pair_style nnp ` | USER/nnp | ext | +| :ref:`USER-NNP ` | High-dimensional neural network potentials | :doc:`pair_style nnp ` | USER/nnp | ext | +------------------------------------------------+-----------------------------------------------------------------+-------------------------------------------------------------------------------+------------------------------------------------------+---------+ | :ref:`USER-OMP ` | OpenMP-enabled styles | :doc:`Speed omp ` | `Benchmarks `_ | no | +------------------------------------------------+-----------------------------------------------------------------+-------------------------------------------------------------------------------+------------------------------------------------------+---------+ diff --git a/doc/src/pair_nnp.rst b/doc/src/pair_nnp.rst index 78fa635c1f..fe60ef175e 100644 --- a/doc/src/pair_nnp.rst +++ b/doc/src/pair_nnp.rst @@ -112,7 +112,7 @@ function setup, ``scaling.data`` with symmetry function scaling data and The keyword *showew* can be used to turn on/off the display of extrapolation warnings (EWs) which are issued whenever a symmetry function value is out of -bounds defined by minimum/maximum values in "scaling.data". An extrapolation +bounds defined by minimum/maximum values in ``scaling.data``. An extrapolation warning may look like this: .. code-block:: LAMMPS @@ -221,14 +221,14 @@ present elements (see above). .. _Behler_Parrinello_2007: -**(Behler and Parrinello 2007)** Behler, J.; Parrinello, M. Generalized +**(Behler and Parrinello 2007)** `Behler, J.; Parrinello, M. Generalized Neural-Network Representation of High-Dimensional Potential-Energy Surfaces. Phys. Rev. Lett. 2007, 98 (14), 146401. -https://doi.org/10.1103/PhysRevLett.98.146401 +`__ .. _Singraber_et_al_2019: -**(Singraber et al 2019)** Singraber, A.; Behler, J.; Dellago, C. Library-Based +**(Singraber et al 2019)** `Singraber, A.; Behler, J.; Dellago, C. Library-Based LAMMPS Implementation of High-Dimensional Neural Network Potentials. J. Chem. -Theory Comput. 2019, 15 (3), 1827–1840. -https://doi.org/10.1021/acs.jctc.8b00770. +Theory Comput. 2019, 15 (3), 1827-1840 +`__ diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 982e1fde2a..60eb142e20 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -2171,6 +2171,8 @@ Nmin nmin Nmols nn +nnp +NNP Nocedal nocite nocoeff diff --git a/lib/README b/lib/README index d89490e202..535f2b228e 100644 --- a/lib/README +++ b/lib/README @@ -41,6 +41,8 @@ mscg hooks to the MSCG library, used by fix_mscg command from Jacob Wagner and Greg Voth group (U Chicago) netcdf hooks to a NetCDF library installed on your system from Lars Pastewka (Karlsruhe Institute of Technology) +nnp hooks to n2p2, neural network potential package, used by USER-NNP + from Andreas Singraber poems POEMS rigid-body integration package, POEMS package from Rudranarayan Mukherjee (RPI) python hooks to the system Python library, used by the PYTHON package diff --git a/lib/nnp/README b/lib/nnp/README index a5cfd5cd23..9aba16606c 100644 --- a/lib/nnp/README +++ b/lib/nnp/README @@ -1 +1,90 @@ -WRITE STUFF HERE +The USER-NNP package requires access to pre-compiled libraries of the n2p2 +package (https://github.com/CompPhysVienna/n2p2). More precisely, the n2p2 core +library ("libnnp"), the interface library ("libnnpif"), some headers and extra +build helper files are needed. These files will be created automatically during +the n2p2 build process. + +Basic build instructions for n2p2 +================================= + +The n2p2 software package comes with lots of useful tools for creating and +applying neural network potentials (NNPs). In order to use n2p2 together with +LAMMPS only a portion of the n2p2 code needs to be compiled. As an example, +everything related to NNP training is not required and would only add unwanted +library dependencies. Hence, the build infrastructure of n2p2 is designed to allow +a separate build of the LAMMPS interface. + +After downloading n2p2, change to the "src" directory and simply execute + + make libnnpif + +which should create the following files needed by the USER-NNP package: + + * "n2p2/lib/libnnp.a" + * "n2p2/lib/libnnpif.a" + * "n2p2/lib/lammps-extra.cmake" + * "n2p2/lib/Makefile.lammps-extra" + * "n2p2/include/InterfaceLammps.h" and many other header files. + +If you prefer dynamically linked libraries use + + make MODE=shared libnnpif + +instead (by default MODE=static) which will create *.so versions of the +libraries. By default, n2p2 uses the GNU C++ compiler and the corresponding +settings can be found in "n2p2/src/makefile.gnu". Other makefile presets are +also available (e.g. "makefile.intel") and can be activated by supplying the +"COMP" argument: + + make COMP=intel libnnpif + +Please make sure that your compiler settings for n2p2 and LAMMPS are compatible +(avoid mixing different compilers). For more information about the n2p2 build +process please visit https://compphysvienna.github.io/n2p2/topics/build.html or +ask questions on the Github issue page +(https://github.com/CompPhysVienna/n2p2/issues). + +Installation directory of n2p2 +============================== + +You can install n2p2 either in this folder (1) or somewhere else on your system (2): + +(1) If n2p2 is installed here, please make sure that the directory is also named + "n2p2", i.e. within "lib/nnp/n2p2" you can see the n2p2 folder structure, in + particular "lib" and "include": + + lib + | + nnp + | + n2p2 + | + ------------------ ... + | | | + include lib src ... + + In this case LAMMPS will automatically find n2p2 during the build process + and you only need to enable the USER-NNP package via CMake (-D + PKG_USER-NNP=yes) or the traditional makefile approach (make yes-user-nnp). + It is also valid to create a link here named "n2p2" which points to the n2p2 + installation directory. + +(2) If n2p2 is installed somewhere else the path must be given as an additional + setting (variable N2P2_DIR) to the build tool. For example, with CMake use + + cmake -D PKG_USER-NNP=yes -D N2P2_DIR= ../cmake/ + + and for the traditional makefiles use + + make yes-user-nnp + make N2P2_DIR= mpi + +Testing a successful build of LAMMPS with USER-NNP +================================================== + +An example is provided in the LAMMPS directory "examples/USER/nnp" which runs +10 timesteps with 360 water molecules. The neural network potential is defined +via files in the "nnp-data" subdirectory. Use the "in.nnp" LAMMPS script file +to run the simulation. You should see a large output of the n2p2 library when +the pair style "nnp" is initialized, followed by the LAMMPS per-timestep +output. diff --git a/src/.gitignore b/src/.gitignore index 45ec71e485..9e37dc316c 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -1079,6 +1079,8 @@ /pair_nm_cut_coul_cut.h /pair_nm_cut_coul_long.cpp /pair_nm_cut_coul_long.h +/pair_nnp.cpp +/pair_nnp.h /pair_oxdna_*.cpp /pair_oxdna_*.h /pair_oxdna2_*.cpp diff --git a/src/USER-NNP/README b/src/USER-NNP/README index e69de29bb2..811498f448 100644 --- a/src/USER-NNP/README +++ b/src/USER-NNP/README @@ -0,0 +1,26 @@ +This package implements the "pair_style nnp" command which can be used in a +LAMMPS input script. This pair style allows to use pre-trained high-dimensional +neural network potentials[1] via an interface to the n2p2 library +(https://github.com/CompPhysVienna/n2p2)[2]. + +Please see the main documentation for the "pair_style nnp" command for further +details on how the pair style is used. An example is provided in the +"examples/USER/nnp" directory of LAMMPS. + +The USER-NNP package requires the external library n2p2 which must be +downloaded and compiled before starting the build process of LAMMPS. A rough +guideline on how to build n2p2 is presented in "lib/nnp/README". This package +supports the LAMMPS build process via CMake and traditional makefiles, please +see the LAMMPS manual section on building with external libraries for more +details. + +This package was created by Andreas Singraber, please ask questions/report bugs +on the n2p2 Github issues page (https://github.com/CompPhysVienna/n2p2/issues). + +[1] Behler, J.; Parrinello, M. Generalized Neural-Network Representation of +High-Dimensional Potential-Energy Surfaces. Phys. Rev. Lett. 2007, 98 (14), +146401. https://doi.org/10.1103/PhysRevLett.98.146401 + +[2] Singraber, A.; Behler, J.; Dellago, C. Library-Based +LAMMPS Implementation of High-Dimensional Neural Network Potentials. J. Chem. +Theory Comput. 2019, 15 (3), 1827-1840. https://doi.org/10.1021/acs.jctc.8b00770 diff --git a/src/USER-NNP/pair_nnp.cpp b/src/USER-NNP/pair_nnp.cpp index c7ac600e45..39217c605d 100644 --- a/src/USER-NNP/pair_nnp.cpp +++ b/src/USER-NNP/pair_nnp.cpp @@ -1,32 +1,35 @@ -// n2p2 - A neural network potential package -// Copyright (C) 2018 Andreas Singraber (University of Vienna) -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + This file initially came from n2p2 (https://github.com/CompPhysVienna/n2p2) + Copyright (2018) Andreas Singraber (University of Vienna) + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Andreas Singraber +------------------------------------------------------------------------- */ -#include -#include #include "pair_nnp.h" +#include #include "atom.h" #include "comm.h" +#include "error.h" +#include "memory.h" #include "neighbor.h" #include "neigh_list.h" #include "neigh_request.h" -#include "memory.h" -#include "error.h" #include "update.h" #include "utils.h" -#include "InterfaceLammps.h" +#include "InterfaceLammps.h" // n2p2 interface header using namespace LAMMPS_NS; @@ -89,6 +92,18 @@ void PairNNP::compute(int eflag, int vflag) void PairNNP::settings(int narg, char **arg) { + single_enable = 0; // 1 if single() routine exists + single_hessian_enable = 0; // 1 if single_hessian() routine exists + restartinfo = 0; // 1 if pair style writes restart info + respa_enable = 0; // 1 if inner/middle/outer rRESPA routines + one_coeff = 1; // 1 if allows only one coeff * * call + manybody_flag = 1; // 1 if a manybody potential + unit_convert_flag = 0; // value != 0 indicates support for unit conversion. + no_virial_fdotr_compute = 0; // 1 if does not invoke virial_fdotr_compute() + writedata = 0; // 1 if writes coeffs to data file + ghostneigh = 0; // 1 if pair style needs neighbors of ghosts + reinitflag = 0; // 1 if compatible with fix adapt and alike + int iarg = 0; if (narg == 0) error->all(FLERR,"Illegal pair_style command"); @@ -312,7 +327,7 @@ void PairNNP::handleExtrapolationWarnings() // rank 0. if(showew > 0) { // First collect an overview of extrapolation warnings per process. - long* numEWPerProc = nullptr; + long *numEWPerProc = nullptr; if(comm->me == 0) numEWPerProc = new long[comm->nprocs]; MPI_Gather(&numCurrentEW, 1, MPI_LONG, numEWPerProc, 1, MPI_LONG, 0, world); @@ -323,7 +338,7 @@ void PairNNP::handleExtrapolationWarnings() MPI_Status ms; // Get buffer size. MPI_Recv(&bs, 1, MPI_LONG, i, 0, world, &ms); - char* buf = new char[bs]; + char *buf = new char[bs]; // Receive buffer. MPI_Recv(buf, bs, MPI_BYTE, i, 0, world, &ms); interface->extractEWBuffer(buf, bs); @@ -336,7 +351,7 @@ void PairNNP::handleExtrapolationWarnings() // Get desired buffer length for all extrapolation warning entries. long bs = interface->getEWBufferSize(); // Allocate and fill buffer. - char* buf = new char[bs]; + char *buf = new char[bs]; interface->fillEWBuffer(buf, bs); // Send buffer size and buffer. MPI_Send(&bs, 1, MPI_LONG, 0, 0, world); diff --git a/src/USER-NNP/pair_nnp.h b/src/USER-NNP/pair_nnp.h index 0b76739d77..8a41d1a5d6 100644 --- a/src/USER-NNP/pair_nnp.h +++ b/src/USER-NNP/pair_nnp.h @@ -1,18 +1,22 @@ -// n2p2 - A neural network potential package -// Copyright (C) 2018 Andreas Singraber (University of Vienna) -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + This file initially came from n2p2 (https://github.com/CompPhysVienna/n2p2) + Copyright (2018) Andreas Singraber (University of Vienna) + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Andreas Singraber +------------------------------------------------------------------------- */ #ifdef PAIR_CLASS @@ -58,9 +62,9 @@ class PairNNP : public Pair { double cflength; double cfenergy; double maxCutoffRadius; - char* directory; - char* emap; - nnp::InterfaceLammps* interface; + char *directory; + char *emap; + nnp::InterfaceLammps *interface; }; }