From 84c945f7fb4d31d08b0e6428baeccfb2befdf966 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 11 Sep 2021 04:46:13 -0400 Subject: [PATCH 01/70] Use multi-config compatible way to integrate googletest for unit testing --- cmake/Modules/GTest.cmake | 81 ---------------------------- unittest/CMakeLists.txt | 51 ++++++++++++++++-- unittest/c-library/CMakeLists.txt | 14 ++--- unittest/commands/CMakeLists.txt | 14 ++--- unittest/cplusplus/CMakeLists.txt | 6 +-- unittest/force-styles/CMakeLists.txt | 4 +- unittest/formats/CMakeLists.txt | 34 ++++++------ unittest/fortran/CMakeLists.txt | 4 +- unittest/python/CMakeLists.txt | 2 +- unittest/utils/CMakeLists.txt | 10 ++-- 10 files changed, 91 insertions(+), 129 deletions(-) delete mode 100644 cmake/Modules/GTest.cmake diff --git a/cmake/Modules/GTest.cmake b/cmake/Modules/GTest.cmake deleted file mode 100644 index 211b506d2f..0000000000 --- a/cmake/Modules/GTest.cmake +++ /dev/null @@ -1,81 +0,0 @@ -message(STATUS "Downloading and building Google Test library") - -if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(GTEST_LIB_POSTFIX d) -else() - set(GTEST_LIB_POSTFIX) -endif() - -include(ExternalProject) -set(GTEST_URL "https://github.com/google/googletest/archive/release-1.10.0.tar.gz" CACHE STRING "URL for GTest tarball") -set(GTEST_MD5 "ecd1fa65e7de707cd5c00bdac56022cd" CACHE STRING "MD5 checksum of GTest tarball") -mark_as_advanced(GTEST_URL) -mark_as_advanced(GTEST_MD5) -ExternalProject_Add(googletest - URL ${GTEST_URL} - URL_MD5 ${GTEST_MD5} - SOURCE_DIR "${CMAKE_BINARY_DIR}/gtest-src" - BINARY_DIR "${CMAKE_BINARY_DIR}/gtest-build" - CMAKE_ARGS ${CMAKE_REQUEST_PIC} ${CMAKE_EXTRA_GTEST_OPTS} - -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DCMAKE_INSTALL_PREFIX= - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} - -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} - BUILD_BYPRODUCTS /lib/libgtest${GTEST_LIB_POSTFIX}${CMAKE_STATIC_LIBRARY_SUFFIX} - /lib/libgmock${GTEST_LIB_POSTFIX}${CMAKE_STATIC_LIBRARY_SUFFIX} - /lib/libgtest_main${GTEST_LIB_POSTFIX}${CMAKE_STATIC_LIBRARY_SUFFIX} - /lib/libgmock_main${GTEST_LIB_POSTFIX}${CMAKE_STATIC_LIBRARY_SUFFIX} - LOG_DOWNLOAD ON - LOG_CONFIGURE ON - LOG_BUILD ON - INSTALL_COMMAND "" - TEST_COMMAND "") - -ExternalProject_Get_Property(googletest SOURCE_DIR) -set(GTEST_INCLUDE_DIR ${SOURCE_DIR}/googletest/include) -set(GMOCK_INCLUDE_DIR ${SOURCE_DIR}/googlemock/include) - -# workaround for CMake 3.10 on ubuntu 18.04 -file(MAKE_DIRECTORY ${GTEST_INCLUDE_DIR}) -file(MAKE_DIRECTORY ${GMOCK_INCLUDE_DIR}) - -ExternalProject_Get_Property(googletest BINARY_DIR) -set(GTEST_LIBRARY_PATH ${BINARY_DIR}/lib/libgtest${GTEST_LIB_POSTFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}) -set(GMOCK_LIBRARY_PATH ${BINARY_DIR}/lib/libgmock${GTEST_LIB_POSTFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}) -set(GTEST_MAIN_LIBRARY_PATH ${BINARY_DIR}/lib/libgtest_main${GTEST_LIB_POSTFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}) -set(GMOCK_MAIN_LIBRARY_PATH ${BINARY_DIR}/lib/libgmock_main${GTEST_LIB_POSTFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}) - -# Prevent GoogleTest from overriding our compiler/linker options -# when building with Visual Studio -set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) - -find_package(Threads QUIET) - -add_library(GTest::GTest UNKNOWN IMPORTED) -set_target_properties(GTest::GTest PROPERTIES - IMPORTED_LOCATION ${GTEST_LIBRARY_PATH} - INTERFACE_INCLUDE_DIRECTORIES ${GTEST_INCLUDE_DIR} - INTERFACE_LINK_LIBRARIES "${CMAKE_THREAD_LIBS_INIT}") -add_dependencies(GTest::GTest googletest) - -add_library(GTest::GMock UNKNOWN IMPORTED) -set_target_properties(GTest::GMock PROPERTIES - IMPORTED_LOCATION ${GMOCK_LIBRARY_PATH} - INTERFACE_INCLUDE_DIRECTORIES ${GMOCK_INCLUDE_DIR} - INTERFACE_LINK_LIBRARIES "${CMAKE_THREAD_LIBS_INIT}") -add_dependencies(GTest::GMock googletest) - -add_library(GTest::GTestMain UNKNOWN IMPORTED) -set_target_properties(GTest::GTestMain PROPERTIES - IMPORTED_LOCATION ${GTEST_MAIN_LIBRARY_PATH} - INTERFACE_INCLUDE_DIRECTORIES ${GTEST_INCLUDE_DIR} - INTERFACE_LINK_LIBRARIES "${CMAKE_THREAD_LIBS_INIT}") -add_dependencies(GTest::GTestMain googletest) - -add_library(GTest::GMockMain UNKNOWN IMPORTED) -set_target_properties(GTest::GMockMain PROPERTIES - IMPORTED_LOCATION ${GMOCK_MAIN_LIBRARY_PATH} - INTERFACE_INCLUDE_DIRECTORIES ${GMOCK_INCLUDE_DIR} - INTERFACE_LINK_LIBRARIES "${CMAKE_THREAD_LIBS_INIT}") -add_dependencies(GTest::GMockMain googletest) diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index bb746c13ec..ac57f11e8e 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -1,4 +1,38 @@ -include(GTest) +######################################## +# CMake build for automated testing +# This file is part of LAMMPS +# Created by Axel Kohlmeyer and Richard Berger +######################################## +# download and build googletest framework +message(STATUS "Downloading and building googletest framework") +set(GTEST_URL "https://github.com/google/googletest/archive/release-1.11.0.tar.gz" CACHE STRING "URL of googletest source") +set(GTEST_MD5 "e8a8df240b6938bb6384155d4c37d937" CACHE STRING "MD5 sum for googletest source") +mark_as_advanced(GTEST_URL) +mark_as_advanced(GTEST_MD5) +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) + +# workaround for older CMake versions (tested on Ubuntu 18.04 with CMake 3.10) +if(CMAKE_VERSION VERSION_LESS 3.14) + file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/_deps) + file(DOWNLOAD ${GTEST_URL} ${CMAKE_BINARY_DIR}/_deps/googletest.tar.gz EXPECTED_HASH MD5=${GTEST_MD5}) + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf ${CMAKE_BINARY_DIR}/_deps/googletest.tar.gz + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/_deps) + file(GLOB GTEST_SOURCE "${CMAKE_BINARY_DIR}/_deps/googletest-*") + # sanity check. do not allow to have multiple downloaded and extracted versions of the source + list(LENGTH GTEST_SOURCE _num) + if(_num GREATER 1) + message(FATAL_ERROR "Inconsistent googletest sources. Please delete ${CMAKE_BINARY_DIR}/_deps and re-run cmake") + endif() + add_subdirectory(${GTEST_SOURCE}) +else() + include(FetchContent) + FetchContent_Declare(googletest URL ${GTEST_URL} URL_HASH MD5=${GTEST_MD5}) + FetchContent_MakeAvailable(googletest) +endif() + +######################################## +# General tests using the LAMMPS executable itself +######################################## # check if we can run the compiled executable and whether it prints # the LAMMPS version header in the output for an empty input @@ -26,6 +60,7 @@ set_tests_properties(InvalidFlag PROPERTIES ENVIRONMENT "TSAN_OPTIONS=ignore_noninstrumented_modules=1" PASS_REGULAR_EXPRESSION "ERROR: Invalid command-line argument.*") +# convenience function for adding tests requiring to be run in parallel with MPI if(BUILD_MPI) function(add_mpi_test) set(MPI_TEST_NUM_PROCS 1) @@ -36,12 +71,18 @@ if(BUILD_MPI) set(ARGS ${MPI_TEST_COMMAND}) add_test(NAME ${MPI_TEST_NAME} WORKING_DIRECTORY ${MPI_TEST_WORKING_DIRECTORY} - COMMAND ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} ${MPI_TEST_NUM_PROCS} ${MPIEXEC_PREFLAGS} - ${EXECUTABLE} ${MPIEXEC_POSTFLAGS} ${ARGS} - ) + COMMAND ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} ${MPI_TEST_NUM_PROCS} + ${MPIEXEC_PREFLAGS} ${EXECUTABLE} ${MPIEXEC_POSTFLAGS} ${ARGS}) + endfunction() +else() + function(add_mpi_test) + cmake_parse_arguments(MPI_TEST "" "NAME;NUM_PROCS;WORKING_DIRECTORY" "COMMAND" ${ARGN}) + message(STATUS "Skipping test ${NAME} on non-MPI compilation") endfunction() endif() +# incorporate categories of specific tests from subdirectories + add_subdirectory(utils) add_subdirectory(formats) add_subdirectory(commands) @@ -52,6 +93,8 @@ add_subdirectory(python) add_subdirectory(tools) add_subdirectory(force-styles) +# clang-format support for test sources + find_package(ClangFormat 8.0) if(ClangFormat_FOUND) diff --git a/unittest/c-library/CMakeLists.txt b/unittest/c-library/CMakeLists.txt index ee7f323c0f..fac27eaf63 100644 --- a/unittest/c-library/CMakeLists.txt +++ b/unittest/c-library/CMakeLists.txt @@ -1,24 +1,24 @@ add_executable(test_library_open test_library_open.cpp test_main.cpp) -target_link_libraries(test_library_open PRIVATE lammps GTest::GTest GTest::GMock) +target_link_libraries(test_library_open PRIVATE lammps gmock) add_test(LibraryOpen test_library_open) add_executable(test_library_commands test_library_commands.cpp test_main.cpp) -target_link_libraries(test_library_commands PRIVATE lammps GTest::GTest GTest::GMock) +target_link_libraries(test_library_commands PRIVATE lammps gmock) add_test(LibraryCommands test_library_commands) add_executable(test_library_external test_library_external.cpp test_main.cpp) -target_link_libraries(test_library_external PRIVATE lammps GTest::GTest GTest::GMock) +target_link_libraries(test_library_external PRIVATE lammps gmock) add_test(LibraryExternal test_library_external) add_executable(test_library_properties test_library_properties.cpp test_main.cpp) -target_link_libraries(test_library_properties PRIVATE lammps GTest::GTest GTest::GMock) +target_link_libraries(test_library_properties PRIVATE lammps gmock) target_compile_definitions(test_library_properties PRIVATE -DTEST_INPUT_FOLDER=${CMAKE_CURRENT_SOURCE_DIR}) add_test(LibraryProperties test_library_properties) set_tests_properties(LibraryProperties PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") add_executable(test_library_scatter_gather test_library_scatter_gather.cpp test_main.cpp) -target_link_libraries(test_library_scatter_gather PRIVATE lammps GTest::GTest GTest::GMock) +target_link_libraries(test_library_scatter_gather PRIVATE lammps gmock) target_compile_definitions(test_library_scatter_gather PRIVATE -DTEST_INPUT_FOLDER=${CMAKE_CURRENT_SOURCE_DIR}) add_test(LibraryScatterGather test_library_scatter_gather) set_tests_properties(LibraryScatterGather PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") @@ -63,13 +63,13 @@ foreach(WITH "JPEG" "PNG" "GZIP" "FFMPEG") endforeach() add_executable(test_library_config test_library_config.cpp test_main.cpp) -target_link_libraries(test_library_config PRIVATE lammps GTest::GTest GTest::GMock) +target_link_libraries(test_library_config PRIVATE lammps gmock) target_compile_definitions(test_library_config PRIVATE ${TEST_CONFIG_DEFS}) add_test(LibraryConfig test_library_config) if(BUILD_MPI) add_executable(test_library_mpi test_library_mpi.cpp) - target_link_libraries(test_library_mpi PRIVATE lammps GTest::GTest GTest::GMock) + target_link_libraries(test_library_mpi PRIVATE lammps gmock) target_compile_definitions(test_library_mpi PRIVATE ${TEST_CONFIG_DEFS}) add_mpi_test(NAME LibraryMPI NUM_PROCS 4 COMMAND $) endif() diff --git a/unittest/commands/CMakeLists.txt b/unittest/commands/CMakeLists.txt index 176e22a391..28c2cc084f 100644 --- a/unittest/commands/CMakeLists.txt +++ b/unittest/commands/CMakeLists.txt @@ -26,19 +26,19 @@ add_executable(test_simple_commands test_simple_commands.cpp) if(PKG_PLUGIN) add_dependencies(test_simple_commands plugins) endif() -target_link_libraries(test_simple_commands PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_simple_commands PRIVATE lammps gmock) add_test(NAME SimpleCommands COMMAND test_simple_commands WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_lattice_region test_lattice_region.cpp) -target_link_libraries(test_lattice_region PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_lattice_region PRIVATE lammps gmock) add_test(NAME LatticeRegion COMMAND test_lattice_region WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_groups test_groups.cpp) -target_link_libraries(test_groups PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_groups PRIVATE lammps gmock) add_test(NAME Groups COMMAND test_groups WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_variables test_variables.cpp) -target_link_libraries(test_variables PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_variables PRIVATE lammps gmock) add_test(NAME Variables COMMAND test_variables WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_kim_commands test_kim_commands.cpp) @@ -49,17 +49,17 @@ if(KIM_EXTRA_UNITTESTS) message(FATAL_ERROR "CURL not found. Enabling KIM extra unit tests requires to have libcurl installed.") endif() endif() -target_link_libraries(test_kim_commands PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_kim_commands PRIVATE lammps gmock) add_test(NAME KimCommands COMMAND test_kim_commands WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_reset_ids test_reset_ids.cpp) target_compile_definitions(test_reset_ids PRIVATE -DTEST_INPUT_FOLDER=${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(test_reset_ids PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_reset_ids PRIVATE lammps gmock) add_test(NAME ResetIDs COMMAND test_reset_ids WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) if(BUILD_MPI) add_executable(test_mpi_load_balancing test_mpi_load_balancing.cpp) - target_link_libraries(test_mpi_load_balancing PRIVATE lammps GTest::GTest GTest::GMock) + target_link_libraries(test_mpi_load_balancing PRIVATE lammps gmock) target_compile_definitions(test_mpi_load_balancing PRIVATE ${TEST_CONFIG_DEFS}) add_mpi_test(NAME MPILoadBalancing NUM_PROCS 4 COMMAND $) endif() diff --git a/unittest/cplusplus/CMakeLists.txt b/unittest/cplusplus/CMakeLists.txt index b0b2550e8c..ef6155f986 100644 --- a/unittest/cplusplus/CMakeLists.txt +++ b/unittest/cplusplus/CMakeLists.txt @@ -1,13 +1,13 @@ add_executable(test_lammps_class test_lammps_class.cpp) -target_link_libraries(test_lammps_class PRIVATE lammps GTest::GMockMain GTest::GTest GTest::GMock) +target_link_libraries(test_lammps_class PRIVATE lammps gmock_main) add_test(LammpsClass test_lammps_class) set_tests_properties(LammpsClass PROPERTIES ENVIRONMENT "OMP_NUM_THREADS=1") add_executable(test_input_class test_input_class.cpp) -target_link_libraries(test_input_class PRIVATE lammps GTest::GTest GTest::GTestMain) +target_link_libraries(test_input_class PRIVATE lammps gtest_main) add_test(InputClass test_input_class) add_executable(test_error_class test_error_class.cpp) -target_link_libraries(test_error_class PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_error_class PRIVATE lammps gmock) add_test(ErrorClass test_error_class) diff --git a/unittest/force-styles/CMakeLists.txt b/unittest/force-styles/CMakeLists.txt index 75e95c3bf0..487433c9c8 100644 --- a/unittest/force-styles/CMakeLists.txt +++ b/unittest/force-styles/CMakeLists.txt @@ -26,7 +26,7 @@ set(TEST_INPUT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR}/tests) add_library(style_tests STATIC yaml_writer.cpp error_stats.cpp test_config_reader.cpp test_main.cpp) target_compile_definitions(style_tests PRIVATE -DTEST_INPUT_FOLDER=${TEST_INPUT_FOLDER}) target_include_directories(style_tests PRIVATE ${LAMMPS_SOURCE_DIR}) -target_link_libraries(style_tests PUBLIC GTest::GTest GTest::GMock Yaml::Yaml lammps) +target_link_libraries(style_tests PUBLIC gmock Yaml::Yaml lammps) if(BUILD_MPI) target_link_libraries(style_tests PUBLIC MPI::MPI_CXX) else() @@ -43,7 +43,7 @@ endif() # unit test for error stats class add_executable(test_error_stats test_error_stats.cpp) target_include_directories(test_error_stats PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${LAMMPS_SOURCE_DIR}) -target_link_libraries(test_error_stats PRIVATE GTest::GTestMain GTest::GTest) +target_link_libraries(test_error_stats PRIVATE gtest_main) add_test(NAME ErrorStats COMMAND test_error_stats) # pair style tester diff --git a/unittest/formats/CMakeLists.txt b/unittest/formats/CMakeLists.txt index b4c637edfb..ae5919ba2a 100644 --- a/unittest/formats/CMakeLists.txt +++ b/unittest/formats/CMakeLists.txt @@ -1,44 +1,44 @@ add_executable(test_atom_styles test_atom_styles.cpp) -target_link_libraries(test_atom_styles PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_atom_styles PRIVATE lammps gmock) add_test(NAME AtomStyles COMMAND test_atom_styles WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_image_flags test_image_flags.cpp) -target_link_libraries(test_image_flags PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_image_flags PRIVATE lammps gmock) add_test(NAME ImageFlags COMMAND test_image_flags WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_molecule_file test_molecule_file.cpp) -target_link_libraries(test_molecule_file PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_molecule_file PRIVATE lammps gmock) add_test(NAME MoleculeFile COMMAND test_molecule_file WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_pair_unit_convert test_pair_unit_convert.cpp) -target_link_libraries(test_pair_unit_convert PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_pair_unit_convert PRIVATE lammps gmock) add_test(NAME PairUnitConvert COMMAND test_pair_unit_convert WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(PairUnitConvert PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") add_executable(test_potential_file_reader test_potential_file_reader.cpp) -target_link_libraries(test_potential_file_reader PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_potential_file_reader PRIVATE lammps gmock) add_test(NAME PotentialFileReader COMMAND test_potential_file_reader WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(PotentialFileReader PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") if(PKG_MANYBODY) add_executable(test_eim_potential_file_reader test_eim_potential_file_reader.cpp) - target_link_libraries(test_eim_potential_file_reader PRIVATE lammps GTest::GMock GTest::GTest) + target_link_libraries(test_eim_potential_file_reader PRIVATE lammps gmock) add_test(NAME EIMPotentialFileReader COMMAND test_eim_potential_file_reader WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(EIMPotentialFileReader PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") endif() add_executable(test_text_file_reader test_text_file_reader.cpp) -target_link_libraries(test_text_file_reader PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_text_file_reader PRIVATE lammps gmock) add_test(NAME TextFileReader COMMAND test_text_file_reader WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(TextFileReader PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") add_executable(test_file_operations test_file_operations.cpp) -target_link_libraries(test_file_operations PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_file_operations PRIVATE lammps gmock) add_test(NAME FileOperations COMMAND test_file_operations WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_dump_atom test_dump_atom.cpp) -target_link_libraries(test_dump_atom PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_dump_atom PRIVATE lammps gmock) add_test(NAME DumpAtom COMMAND test_dump_atom WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(DumpAtom PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") @@ -46,19 +46,19 @@ if(PKG_COMPRESS) find_program(GZIP_BINARY NAMES gzip REQUIRED) add_executable(test_dump_atom_compressed test_dump_atom_compressed.cpp compressed_dump_test_main.cpp) - target_link_libraries(test_dump_atom_compressed PRIVATE lammps GTest::GMock GTest::GTest) + target_link_libraries(test_dump_atom_compressed PRIVATE lammps gmock) add_executable(test_dump_custom_compressed test_dump_custom_compressed.cpp compressed_dump_test_main.cpp) - target_link_libraries(test_dump_custom_compressed PRIVATE lammps GTest::GMock GTest::GTest) + target_link_libraries(test_dump_custom_compressed PRIVATE lammps gmock) add_executable(test_dump_cfg_compressed test_dump_cfg_compressed.cpp compressed_dump_test_main.cpp) - target_link_libraries(test_dump_cfg_compressed PRIVATE lammps GTest::GMock GTest::GTest) + target_link_libraries(test_dump_cfg_compressed PRIVATE lammps gmock) add_executable(test_dump_local_compressed test_dump_local_compressed.cpp compressed_dump_test_main.cpp) - target_link_libraries(test_dump_local_compressed PRIVATE lammps GTest::GMock GTest::GTest) + target_link_libraries(test_dump_local_compressed PRIVATE lammps gmock) add_executable(test_dump_xyz_compressed test_dump_xyz_compressed.cpp compressed_dump_test_main.cpp) - target_link_libraries(test_dump_xyz_compressed PRIVATE lammps GTest::GMock GTest::GTest) + target_link_libraries(test_dump_xyz_compressed PRIVATE lammps gmock) add_test(NAME DumpAtomGZ COMMAND test_dump_atom_compressed gz WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(DumpAtomGZ PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR};COMPRESS_BINARY=${GZIP_BINARY}") @@ -98,17 +98,17 @@ if(PKG_COMPRESS) endif() add_executable(test_dump_custom test_dump_custom.cpp) -target_link_libraries(test_dump_custom PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_dump_custom PRIVATE lammps gmock) add_test(NAME DumpCustom COMMAND test_dump_custom WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(DumpCustom PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") add_executable(test_dump_cfg test_dump_cfg.cpp) -target_link_libraries(test_dump_cfg PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_dump_cfg PRIVATE lammps gmock) add_test(NAME DumpCfg COMMAND test_dump_cfg WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(DumpCfg PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") add_executable(test_dump_local test_dump_local.cpp) -target_link_libraries(test_dump_local PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_dump_local PRIVATE lammps gmock) add_test(NAME DumpLocal COMMAND test_dump_local WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(DumpLocal PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") diff --git a/unittest/fortran/CMakeLists.txt b/unittest/fortran/CMakeLists.txt index fc116c3c40..586dcf537f 100644 --- a/unittest/fortran/CMakeLists.txt +++ b/unittest/fortran/CMakeLists.txt @@ -25,11 +25,11 @@ if(CMAKE_Fortran_COMPILER) add_library(flammps STATIC ${LAMMPS_FORTRAN_MODULE}) add_executable(test_fortran_create wrap_create.cpp test_fortran_create.f90) - target_link_libraries(test_fortran_create PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTest GTest::GTestMain) + target_link_libraries(test_fortran_create PRIVATE flammps lammps MPI::MPI_Fortran gtest_main) add_test(FortranOpen test_fortran_create) add_executable(test_fortran_commands wrap_commands.cpp test_fortran_commands.f90) - target_link_libraries(test_fortran_commands PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTest GTest::GTestMain) + target_link_libraries(test_fortran_commands PRIVATE flammps lammps MPI::MPI_Fortran gtest_main) add_test(FortranCommands test_fortran_commands) else() message(STATUS "Skipping Tests for the LAMMPS Fortran Module: no Fortran compiler") diff --git a/unittest/python/CMakeLists.txt b/unittest/python/CMakeLists.txt index 5d0aad2f54..e57a894c61 100644 --- a/unittest/python/CMakeLists.txt +++ b/unittest/python/CMakeLists.txt @@ -21,7 +21,7 @@ else() endif() add_executable(test_python_package test_python_package.cpp) -target_link_libraries(test_python_package PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_python_package PRIVATE lammps gmock) target_compile_definitions(test_python_package PRIVATE -DTEST_INPUT_FOLDER=${TEST_INPUT_FOLDER}) # this requires CMake 3.12. don't care to add backward compatibility for this. if(Python3_Development_FOUND) diff --git a/unittest/utils/CMakeLists.txt b/unittest/utils/CMakeLists.txt index c1ce7c136f..431b0b2ee1 100644 --- a/unittest/utils/CMakeLists.txt +++ b/unittest/utils/CMakeLists.txt @@ -1,22 +1,22 @@ add_executable(test_tokenizer test_tokenizer.cpp) -target_link_libraries(test_tokenizer PRIVATE lammps GTest::GMockMain GTest::GMock GTest::GTest) +target_link_libraries(test_tokenizer PRIVATE lammps gmock_main) add_test(Tokenizer test_tokenizer) add_executable(test_mempool test_mempool.cpp) -target_link_libraries(test_mempool PRIVATE lammps GTest::GMockMain GTest::GMock GTest::GTest) +target_link_libraries(test_mempool PRIVATE lammps gmock_main) add_test(MemPool test_mempool) add_executable(test_argutils test_argutils.cpp) -target_link_libraries(test_argutils PRIVATE lammps GTest::GMockMain GTest::GMock GTest::GTest) +target_link_libraries(test_argutils PRIVATE lammps gmock_main) add_test(ArgUtils test_argutils) add_executable(test_utils test_utils.cpp) -target_link_libraries(test_utils PRIVATE lammps GTest::GMockMain GTest::GMock GTest::GTest) +target_link_libraries(test_utils PRIVATE lammps gmock_main) add_test(Utils test_utils) set_tests_properties(Utils PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") add_executable(test_fmtlib test_fmtlib.cpp) -target_link_libraries(test_fmtlib PRIVATE lammps GTest::GMockMain GTest::GMock GTest::GTest) +target_link_libraries(test_fmtlib PRIVATE lammps gmock_main) add_test(FmtLib test_fmtlib) add_executable(test_math_eigen_impl test_math_eigen_impl.cpp) From 68ddab03418463dd0d9e8163f1e05a400e2bed3a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 11 Sep 2021 05:36:43 -0400 Subject: [PATCH 02/70] Report multi-config and adjust paths for python unit tests --- cmake/CMakeLists.txt | 8 +++++++- unittest/python/CMakeLists.txt | 10 ++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index e0fca5bd9b..af38a0db72 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -786,11 +786,17 @@ if(ClangFormat_FOUND) endif() get_target_property(DEFINES lammps COMPILE_DEFINITIONS) +get_property(BUILD_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(BUILD_IS_MULTI_CONFIG) + set(LAMMPS_BUILD_TYPE "Multi-Config") +else() + set(LAMMPS_BUILD_TYPE ${CMAKE_BUILD_TYPE}) +endif() include(FeatureSummary) feature_summary(DESCRIPTION "The following tools and libraries have been found and configured:" WHAT PACKAGES_FOUND) message(STATUS "<<< Build configuration >>> Operating System: ${CMAKE_SYSTEM_NAME} ${CMAKE_LINUX_DISTRO} ${CMAKE_DISTRO_VERSION} - Build type: ${CMAKE_BUILD_TYPE} + Build type: ${LAMMPS_BUILD_TYPE} Install path: ${CMAKE_INSTALL_PREFIX} Generator: ${CMAKE_GENERATOR} using ${CMAKE_MAKE_PROGRAM}") ############################################################################### diff --git a/unittest/python/CMakeLists.txt b/unittest/python/CMakeLists.txt index e57a894c61..9343167228 100644 --- a/unittest/python/CMakeLists.txt +++ b/unittest/python/CMakeLists.txt @@ -34,12 +34,18 @@ set_tests_properties(PythonPackage PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${L if(Python_EXECUTABLE) # prepare to augment the environment so that the LAMMPS python module and the shared library is found. set(PYTHON_TEST_ENVIRONMENT PYTHONPATH=${LAMMPS_PYTHON_DIR}:$ENV{PYTHONPATH}) + get_property(BUILD_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + if(BUILD_IS_MULTI_CONFIG) + set(LAMMPS_LIB_PATH ${CMAKE_BINARY_DIR}/$) + else() + set(LAMMPS_LIB_PATH ${CMAKE_BINARY_DIR}) + endif() list(APPEND PYTHON_TEST_ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") list(APPEND PYTHON_TEST_ENVIRONMENT "TEST_INPUT_DIR=${CMAKE_CURRENT_SOURCE_DIR}") if(APPLE) - list(APPEND PYTHON_TEST_ENVIRONMENT "DYLD_LIBRARY_PATH=${CMAKE_BINARY_DIR}:$ENV{DYLD_LIBRARY_PATH};LAMMPS_CMAKE_CACHE=${CMAKE_BINARY_DIR}/CMakeCache.txt") + list(APPEND PYTHON_TEST_ENVIRONMENT "DYLD_LIBRARY_PATH=${LAMMPS_LIB_PATH}:$ENV{DYLD_LIBRARY_PATH};LAMMPS_CMAKE_CACHE=${CMAKE_BINARY_DIR}/CMakeCache.txt") else() - list(APPEND PYTHON_TEST_ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}:$ENV{LD_LIBRARY_PATH};LAMMPS_CMAKE_CACHE=${CMAKE_BINARY_DIR}/CMakeCache.txt") + list(APPEND PYTHON_TEST_ENVIRONMENT "LD_LIBRARY_PATH=${LAMMPS_LIB_PATH}:$ENV{LD_LIBRARY_PATH};LAMMPS_CMAKE_CACHE=${CMAKE_BINARY_DIR}/CMakeCache.txt") endif() if(LAMMPS_MACHINE) # convert from '_machine' to 'machine' From bf360ad50f5bab111610709196ac1a02026c9007 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 11 Sep 2021 05:59:50 -0400 Subject: [PATCH 03/70] explicitly specify build folder for out-of-source subdirectory --- unittest/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index ac57f11e8e..14da15c6e5 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -23,7 +23,7 @@ if(CMAKE_VERSION VERSION_LESS 3.14) if(_num GREATER 1) message(FATAL_ERROR "Inconsistent googletest sources. Please delete ${CMAKE_BINARY_DIR}/_deps and re-run cmake") endif() - add_subdirectory(${GTEST_SOURCE}) + add_subdirectory(${GTEST_SOURCE} ${CMAKE_BINARY_DIR}/googletest) else() include(FetchContent) FetchContent_Declare(googletest URL ${GTEST_URL} URL_HASH MD5=${GTEST_MD5}) From 932b3cabda1023d877fd9298280e2b344e3d4446 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 11 Sep 2021 06:05:29 -0400 Subject: [PATCH 04/70] add missing include (since we not longer include GTest.cmake) --- unittest/commands/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/unittest/commands/CMakeLists.txt b/unittest/commands/CMakeLists.txt index 28c2cc084f..8891647911 100644 --- a/unittest/commands/CMakeLists.txt +++ b/unittest/commands/CMakeLists.txt @@ -1,6 +1,7 @@ # build LAMMPS plugins, but not on Windows if((NOT (CMAKE_SYSTEM_NAME STREQUAL "Windows")) AND PKG_PLUGIN) + include(ExternalProject) ExternalProject_Add(plugins SOURCE_DIR "${LAMMPS_DIR}/examples/plugins" BINARY_DIR ${CMAKE_BINARY_DIR}/build-plugins From 30558c0cd6ffbcc351b13dc1abb7f879d19d7cbe Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 11 Sep 2021 07:01:48 -0400 Subject: [PATCH 05/70] convert plugin compilation to also use add_subdirectory() instead of external project --- examples/plugins/CMakeLists.txt | 35 +++++++++++++++++++----------- unittest/commands/CMakeLists.txt | 37 +++++++++++++++----------------- 2 files changed, 39 insertions(+), 33 deletions(-) diff --git a/examples/plugins/CMakeLists.txt b/examples/plugins/CMakeLists.txt index 59c2802b45..22bd09775f 100644 --- a/examples/plugins/CMakeLists.txt +++ b/examples/plugins/CMakeLists.txt @@ -14,17 +14,21 @@ endif() project(plugins VERSION 1.0 LANGUAGES CXX) -# NOTE: the next line should be commented out when used outside of the LAMMPS package -get_filename_component(LAMMPS_SOURCE_DIR ${PROJECT_SOURCE_DIR}/../../src ABSOLUTE) -set(LAMMPS_HEADER_DIR ${LAMMPS_SOURCE_DIR} CACHE PATH "Location of LAMMPS headers") -if(NOT LAMMPS_HEADER_DIR) - message(FATAL_ERROR "Must set LAMMPS_HEADER_DIR") -endif() - -# by default, install into $HOME/.local (not /usr/local), -# so that no root access (and sudo) is needed -if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - set(CMAKE_INSTALL_PREFIX "$ENV{HOME}/.local" CACHE PATH "Default install path" FORCE) +# when this file is included as subdirectory in the LAMMPS build, many settings are directly imported +if(LAMMPS_DIR) + set(LAMMPS_HEADER_DIR ${LAMMPS_SOURCE_DIR}) +else() + # NOTE: the next line should be commented out when used outside of the LAMMPS package + get_filename_component(LAMMPS_SOURCE_DIR ${PROJECT_SOURCE_DIR}/../../src ABSOLUTE) + set(LAMMPS_HEADER_DIR ${LAMMPS_SOURCE_DIR} CACHE PATH "Location of LAMMPS headers") + if(NOT LAMMPS_HEADER_DIR) + message(FATAL_ERROR "Must set LAMMPS_HEADER_DIR") + endif() + # by default, install into $HOME/.local (not /usr/local), + # so that no root access (and sudo) is needed + if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "$ENV{HOME}/.local" CACHE PATH "Default install path" FORCE) + endif() endif() # C++11 is required @@ -41,9 +45,11 @@ if(CMAKE_SYSTEM_NAME STREQUAL Windows) message(FATAL_ERROR "LAMMPS plugins are currently not supported on Windows") endif() -set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}) +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}) include(CheckIncludeFileCXX) -include(LAMMPSInterfaceCXX) +if(NOT LAMMPS_DIR) + include(LAMMPSInterfaceCXX) +endif() ########################## # building the plugins @@ -71,3 +77,6 @@ if(CMAKE_SYSTEM_NAME STREQUAL Darwin) set_target_properties(morse2plugin nve2plugin helloplugin zero2plugin PROPERTIES LINK_FLAGS "-Wl,-undefined,dynamic_lookup") endif() + +add_custom_target(plugins ALL ${CMAKE_COMMAND} -E echo "Building Plugins" + DEPENDS morse2plugin nve2plugin helloplugin zero2plugin morse2plugin) diff --git a/unittest/commands/CMakeLists.txt b/unittest/commands/CMakeLists.txt index 8891647911..b543e7691e 100644 --- a/unittest/commands/CMakeLists.txt +++ b/unittest/commands/CMakeLists.txt @@ -1,34 +1,31 @@ # build LAMMPS plugins, but not on Windows if((NOT (CMAKE_SYSTEM_NAME STREQUAL "Windows")) AND PKG_PLUGIN) - include(ExternalProject) - ExternalProject_Add(plugins - SOURCE_DIR "${LAMMPS_DIR}/examples/plugins" - BINARY_DIR ${CMAKE_BINARY_DIR}/build-plugins - INSTALL_DIR ${CMAKE_BINARY_DIR} - CMAKE_ARGS ${CMAKE_REQUEST_PIC} - -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DCMAKE_INSTALL_PREFIX= - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} - -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} - BUILD_BYPRODUCTS /morse2plugin${CMAKE_SHARED_MODULE_SUFFIX} - /nve2plugin${CMAKE_SHARED_MODULE_SUFFIX} - /helloplugin${CMAKE_SHARED_MODULE_SUFFIX} - INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_if_different - /morse2plugin${CMAKE_SHARED_MODULE_SUFFIX} - /nve2plugin${CMAKE_SHARED_MODULE_SUFFIX} - /helloplugin${CMAKE_SHARED_MODULE_SUFFIX} - ${CMAKE_CURRENT_BINARY_DIR} - TEST_COMMAND "") + add_subdirectory(${LAMMPS_DIR}/examples/plugins ${CMAKE_BINARY_DIR}/build-plugins) endif() add_executable(test_simple_commands test_simple_commands.cpp) + if(PKG_PLUGIN) + add_custom_target(installplugins + ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_BINARY_DIR}/build-plugins/$/morse2plugin${CMAKE_SHARED_MODULE_SUFFIX} + ${CMAKE_BINARY_DIR}/build-plugins/$/nve2plugin${CMAKE_SHARED_MODULE_SUFFIX} + ${CMAKE_BINARY_DIR}/build-plugins/$/helloplugin${CMAKE_SHARED_MODULE_SUFFIX} + ${CMAKE_BINARY_DIR} + DEPENDS plugins) add_dependencies(test_simple_commands plugins) + target_compile_definitions(test_simple_commands PRIVATE LMP_PLUGIN) endif() target_link_libraries(test_simple_commands PRIVATE lammps gmock) add_test(NAME SimpleCommands COMMAND test_simple_commands WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) +if(APPLE) + set_tests_properties(SimpleCommands PROPERTIES + ENVIRONMENT "DYLD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/build-plugins/$/:${DYLD_LIBRARY_PATH}") +else() + set_tests_properties(SimpleCommands PROPERTIES + ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/build-plugins/$/:${LD_LIBRARY_PATH}") +endif() add_executable(test_lattice_region test_lattice_region.cpp) target_link_libraries(test_lattice_region PRIVATE lammps gmock) From c394df56585ca305e8c64eb54b0ace5d65805975 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 11 Sep 2021 07:30:18 -0400 Subject: [PATCH 06/70] simplify and remove unused command. more multi-config adjustments --- unittest/commands/CMakeLists.txt | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/unittest/commands/CMakeLists.txt b/unittest/commands/CMakeLists.txt index b543e7691e..41cd4f4e51 100644 --- a/unittest/commands/CMakeLists.txt +++ b/unittest/commands/CMakeLists.txt @@ -1,30 +1,26 @@ -# build LAMMPS plugins, but not on Windows -if((NOT (CMAKE_SYSTEM_NAME STREQUAL "Windows")) AND PKG_PLUGIN) - add_subdirectory(${LAMMPS_DIR}/examples/plugins ${CMAKE_BINARY_DIR}/build-plugins) -endif() - add_executable(test_simple_commands test_simple_commands.cpp) -if(PKG_PLUGIN) - add_custom_target(installplugins - ${CMAKE_COMMAND} -E copy_if_different - ${CMAKE_BINARY_DIR}/build-plugins/$/morse2plugin${CMAKE_SHARED_MODULE_SUFFIX} - ${CMAKE_BINARY_DIR}/build-plugins/$/nve2plugin${CMAKE_SHARED_MODULE_SUFFIX} - ${CMAKE_BINARY_DIR}/build-plugins/$/helloplugin${CMAKE_SHARED_MODULE_SUFFIX} - ${CMAKE_BINARY_DIR} - DEPENDS plugins) +# tests for the plugin command require the PLUGIN package and won't work on windows +if((NOT (CMAKE_SYSTEM_NAME STREQUAL "Windows")) AND PKG_PLUGIN) + add_subdirectory(${LAMMPS_DIR}/examples/plugins ${CMAKE_BINARY_DIR}/build-plugins) add_dependencies(test_simple_commands plugins) - target_compile_definitions(test_simple_commands PRIVATE LMP_PLUGIN) + target_compile_definitions(test_simple_commands PRIVATE -DLMP_PLUGIN) endif() + target_link_libraries(test_simple_commands PRIVATE lammps gmock) add_test(NAME SimpleCommands COMMAND test_simple_commands WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) +if(BUILD_IS_MULTI_CONFIG) + set(LAMMPS_PLUGIN_BIN_DIR ${CMAKE_BINARY_DIR}/build-plugins/$) +else() + set(LAMMPS_PLUGIN_BIN_DIR ${CMAKE_BINARY_DIR}/build-plugins) +endif() if(APPLE) set_tests_properties(SimpleCommands PROPERTIES - ENVIRONMENT "DYLD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/build-plugins/$/:${DYLD_LIBRARY_PATH}") + ENVIRONMENT "DYLD_LIBRARY_PATH=${LAMMPS_PLUGIN_BIN_DIR}/:${DYLD_LIBRARY_PATH}") else() set_tests_properties(SimpleCommands PROPERTIES - ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/build-plugins/$/:${LD_LIBRARY_PATH}") + ENVIRONMENT "LD_LIBRARY_PATH=${LAMMPS_PLUGIN_BIN_DIR}/:${LD_LIBRARY_PATH}") endif() add_executable(test_lattice_region test_lattice_region.cpp) From daa39d680c4115e4de5a10d0ec6c60a7d27e332b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 11 Sep 2021 13:43:25 -0400 Subject: [PATCH 07/70] simplify --- unittest/c-library/CMakeLists.txt | 10 ++++------ unittest/commands/CMakeLists.txt | 10 ++++------ 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/unittest/c-library/CMakeLists.txt b/unittest/c-library/CMakeLists.txt index fac27eaf63..5168345727 100644 --- a/unittest/c-library/CMakeLists.txt +++ b/unittest/c-library/CMakeLists.txt @@ -67,9 +67,7 @@ target_link_libraries(test_library_config PRIVATE lammps gmock) target_compile_definitions(test_library_config PRIVATE ${TEST_CONFIG_DEFS}) add_test(LibraryConfig test_library_config) -if(BUILD_MPI) - add_executable(test_library_mpi test_library_mpi.cpp) - target_link_libraries(test_library_mpi PRIVATE lammps gmock) - target_compile_definitions(test_library_mpi PRIVATE ${TEST_CONFIG_DEFS}) - add_mpi_test(NAME LibraryMPI NUM_PROCS 4 COMMAND $) -endif() +add_executable(test_library_mpi test_library_mpi.cpp) +target_link_libraries(test_library_mpi PRIVATE lammps gmock) +target_compile_definitions(test_library_mpi PRIVATE ${TEST_CONFIG_DEFS}) +add_mpi_test(NAME LibraryMPI NUM_PROCS 4 COMMAND $) diff --git a/unittest/commands/CMakeLists.txt b/unittest/commands/CMakeLists.txt index 41cd4f4e51..10c113d781 100644 --- a/unittest/commands/CMakeLists.txt +++ b/unittest/commands/CMakeLists.txt @@ -51,9 +51,7 @@ target_compile_definitions(test_reset_ids PRIVATE -DTEST_INPUT_FOLDER=${CMAKE_CU target_link_libraries(test_reset_ids PRIVATE lammps gmock) add_test(NAME ResetIDs COMMAND test_reset_ids WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) -if(BUILD_MPI) - add_executable(test_mpi_load_balancing test_mpi_load_balancing.cpp) - target_link_libraries(test_mpi_load_balancing PRIVATE lammps gmock) - target_compile_definitions(test_mpi_load_balancing PRIVATE ${TEST_CONFIG_DEFS}) - add_mpi_test(NAME MPILoadBalancing NUM_PROCS 4 COMMAND $) -endif() +add_executable(test_mpi_load_balancing test_mpi_load_balancing.cpp) +target_link_libraries(test_mpi_load_balancing PRIVATE lammps gmock) +target_compile_definitions(test_mpi_load_balancing PRIVATE ${TEST_CONFIG_DEFS}) +add_mpi_test(NAME MPILoadBalancing NUM_PROCS 4 COMMAND $) From 342ca7ff1d0ac6b684d275055a48ccc25a104126 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 21 Sep 2021 22:02:37 -0400 Subject: [PATCH 08/70] add multi-config build support for MSCG package --- cmake/Modules/Packages/MSCG.cmake | 70 ++++++++++++++++++------------- 1 file changed, 42 insertions(+), 28 deletions(-) diff --git a/cmake/Modules/Packages/MSCG.cmake b/cmake/Modules/Packages/MSCG.cmake index 6ac62cb012..1bfd123dd0 100644 --- a/cmake/Modules/Packages/MSCG.cmake +++ b/cmake/Modules/Packages/MSCG.cmake @@ -12,34 +12,48 @@ if(DOWNLOAD_MSCG) mark_as_advanced(MSCG_URL) mark_as_advanced(MSCG_MD5) - include(ExternalProject) - ExternalProject_Add(mscg_build - URL ${MSCG_URL} - URL_MD5 ${MSCG_MD5} - SOURCE_SUBDIR src/CMake - CMAKE_ARGS ${CMAKE_REQUEST_PIC} ${EXTRA_MSCG_OPTS} - -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} - -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DCMAKE_Fortran_COMPILER=${CMAKE_Fortran_COMPILER} - -DBLAS_LIBRARIES=${BLAS_LIBRARIES} -DLAPACK_LIBRARIES=${LAPACK_LIBRARIES} - -DCMAKE_INSTALL_PREFIX= - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} - -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} - BUILD_COMMAND ${CMAKE_COMMAND} --build . --target mscg - INSTALL_COMMAND "" - BUILD_BYPRODUCTS /libmscg.a - ) - ExternalProject_get_property(mscg_build BINARY_DIR) - ExternalProject_get_property(mscg_build SOURCE_DIR) - file(MAKE_DIRECTORY ${SOURCE_DIR}/src) - add_library(LAMMPS::MSCG UNKNOWN IMPORTED) - set_target_properties(LAMMPS::MSCG PROPERTIES - IMPORTED_LOCATION "${BINARY_DIR}/libmscg.a" - INTERFACE_INCLUDE_DIRECTORIES "${SOURCE_DIR}/src" - INTERFACE_LINK_LIBRARIES "${LAPACK_LIBRARIES}") - target_link_libraries(lammps PRIVATE LAMMPS::MSCG) - add_dependencies(LAMMPS::MSCG mscg_build) + # always compile a static lib but with position independent code + # make a copy of current settings for later use + set(OLD_SHARED_LIBS ${BUILD_SHARED_LIBS}) + set(OLD_POSITION_INDEPENDENT_CODE ${CMAKE_POSITION_INDEPENDENT_CODE}) + set(BUILD_SHARED_LIBS OFF) + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + if(CMAKE_VERSION VERSION_LESS 3.14) + file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/_deps) + file(DOWNLOAD ${MSCG_URL} ${CMAKE_BINARY_DIR}/_deps/mscg.tar.gz EXPECTED_HASH MD5=${MSCG_MD5}) + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf ${CMAKE_BINARY_DIR}/_deps/mscg.tar.gz + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/_deps) + + file(GLOB MSCG_SOURCE "${CMAKE_BINARY_DIR}/_deps/MSCG-release-*") + # sanity check. do not allow to have multiple downloaded and extracted versions of the source + list(LENGTH MSCG_SOURCE _num) + if(_num GREATER 1) + message(FATAL_ERROR "Inconsistent MSCG library sources. Please delete ${CMAKE_BINARY_DIR}/_deps and re-run cmake") + endif() + add_subdirectory(${MSCG_SOURCE}/src/CMake ${CMAKE_BINARY_DIR}/_deps/mscg-build) + else() + include(FetchContent) + FetchContent_Declare(mscg URL ${MSCG_URL} URL_HASH MD5=${MSCG_MD5} SOURCE_SUBDIR src/CMake) + FetchContent_MakeAvailable(mscg) + set(MSCG_SOURCE ${CMAKE_BINARY_DIR}/_deps/mscg-src) + endif() + + # restore previous settings + if(OLD_POSITION_INDEPENDENT_CODE) + set(CMAKE_POSITON_INDEPENDENT_CODE ${OLD_POSITION_INDEPENDENT_CODE}) + else() + unset(CMAKE_POSITION_INDEPENDENT_CODE) + endif() + if (OLD_SHARED_LIBS) + set(BUILD_SHARED_LIBS ${OLD_SHARED_LIBS}) + else() + unset(BUILD_SHARED_LIBS) + endif() + + # set include and link library + target_include_directories(lammps PRIVATE "${MSCG_SOURCE}/src") + target_link_libraries(lammps PRIVATE mscg) else() find_package(MSCG) if(NOT MSCG_FOUND) From 93d6e6dec99e5410121672cb015f02254e39ff47 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 12 Oct 2021 11:46:37 -0400 Subject: [PATCH 09/70] update for new way of using googletest --- unittest/formats/CMakeLists.txt | 2 +- unittest/utils/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unittest/formats/CMakeLists.txt b/unittest/formats/CMakeLists.txt index 6be712edd6..9978857c1e 100644 --- a/unittest/formats/CMakeLists.txt +++ b/unittest/formats/CMakeLists.txt @@ -8,7 +8,7 @@ target_link_libraries(test_image_flags PRIVATE lammps gmock) add_test(NAME ImageFlags COMMAND test_image_flags WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_input_convert test_input_convert.cpp) -target_link_libraries(test_input_convert PRIVATE lammps GTest::GMockMain GTest::GMock GTest::GTest) +target_link_libraries(test_input_convert PRIVATE lammps gmock_main) add_test(NAME InputConvert COMMAND test_input_convert WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_molecule_file test_molecule_file.cpp) diff --git a/unittest/utils/CMakeLists.txt b/unittest/utils/CMakeLists.txt index 047f0cee57..8aa671cba6 100644 --- a/unittest/utils/CMakeLists.txt +++ b/unittest/utils/CMakeLists.txt @@ -15,7 +15,7 @@ target_link_libraries(test_utils PRIVATE lammps gmock_main) add_test(Utils test_utils) add_executable(test_platform test_platform.cpp) -target_link_libraries(test_platform PRIVATE lammps GTest::GMockMain GTest::GMock GTest::GTest) +target_link_libraries(test_platform PRIVATE lammps gmock_main) add_test(Platform test_platform) set_tests_properties(Utils Platform PROPERTIES From 6e3fcce9e18f760c3d3cbcbc453238b16adabc0b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 21 Oct 2021 17:30:54 -0400 Subject: [PATCH 10/70] move download and extract code into function --- cmake/Modules/ExternalCMakeProject.cmake | 35 ++++++++++++++++++++ cmake/Modules/Packages/MSCG.cmake | 42 ++---------------------- unittest/CMakeLists.txt | 20 ++--------- 3 files changed, 40 insertions(+), 57 deletions(-) create mode 100644 cmake/Modules/ExternalCMakeProject.cmake diff --git a/cmake/Modules/ExternalCMakeProject.cmake b/cmake/Modules/ExternalCMakeProject.cmake new file mode 100644 index 0000000000..d8138f9088 --- /dev/null +++ b/cmake/Modules/ExternalCMakeProject.cmake @@ -0,0 +1,35 @@ +# Build a CMake based external library as subdirectory. +# The sources will be unpacked to ${CMAKE_BINARY_DIR}/_deps/${target}-src +# The binaries will be built in ${CMAKE_BINARY_DIR}/_deps/${target}-build +# +function(ExternalCMakeProject target url hash basedir cmakedir) + # change settings locally + set(BUILD_SHARED_LIBS OFF) + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + if(CMAKE_VERSION VERSION_LESS 3.14) + get_filename_component(archive ${url} NAME) + file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/_deps/src) + message(STATUS "Downloading ${url}") + file(DOWNLOAD ${url} ${CMAKE_BINARY_DIR}/_deps/${archive} EXPECTED_HASH MD5=${hash} SHOW_PROGRESS) + message(STATUS "Unpacking and configuring ${archive}") + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf ${CMAKE_BINARY_DIR}/_deps/${archive} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/_deps/src) + file(GLOB TARGET_SOURCE "${CMAKE_BINARY_DIR}/_deps/src/${basedir}*") + list(LENGTH TARGET_SOURCE _num) + if(_num GREATER 1) + message(FATAL_ERROR "Inconsistent ${target} library sources. " + "Please delete ${CMAKE_BINARY_DIR}/_deps/src and re-run cmake") + endif() + file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/_deps/${target}-src) + file(RENAME ${TARGET_SOURCE} ${CMAKE_BINARY_DIR}/_deps/${target}-src) + add_subdirectory("${CMAKE_BINARY_DIR}/_deps/${target}-src/${cmakedir}" + "${CMAKE_BINARY_DIR}/_deps/${target}-build") + else() + include(FetchContent) + message(STATUS "Downloading ${url}") + FetchContent_Declare(${target} URL ${url} URL_HASH MD5=${hash} SOURCE_SUBDIR ${cmakedir}) + message(STATUS "Unpacking and configuring ${archive}") + FetchContent_MakeAvailable(${target}) + endif() +endfunction(ExternalCMakeProject) diff --git a/cmake/Modules/Packages/MSCG.cmake b/cmake/Modules/Packages/MSCG.cmake index 1bfd123dd0..dbfe437f67 100644 --- a/cmake/Modules/Packages/MSCG.cmake +++ b/cmake/Modules/Packages/MSCG.cmake @@ -12,47 +12,11 @@ if(DOWNLOAD_MSCG) mark_as_advanced(MSCG_URL) mark_as_advanced(MSCG_MD5) - # always compile a static lib but with position independent code - # make a copy of current settings for later use - set(OLD_SHARED_LIBS ${BUILD_SHARED_LIBS}) - set(OLD_POSITION_INDEPENDENT_CODE ${CMAKE_POSITION_INDEPENDENT_CODE}) - set(BUILD_SHARED_LIBS OFF) - set(CMAKE_POSITION_INDEPENDENT_CODE ON) - - if(CMAKE_VERSION VERSION_LESS 3.14) - file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/_deps) - file(DOWNLOAD ${MSCG_URL} ${CMAKE_BINARY_DIR}/_deps/mscg.tar.gz EXPECTED_HASH MD5=${MSCG_MD5}) - execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf ${CMAKE_BINARY_DIR}/_deps/mscg.tar.gz - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/_deps) - - file(GLOB MSCG_SOURCE "${CMAKE_BINARY_DIR}/_deps/MSCG-release-*") - # sanity check. do not allow to have multiple downloaded and extracted versions of the source - list(LENGTH MSCG_SOURCE _num) - if(_num GREATER 1) - message(FATAL_ERROR "Inconsistent MSCG library sources. Please delete ${CMAKE_BINARY_DIR}/_deps and re-run cmake") - endif() - add_subdirectory(${MSCG_SOURCE}/src/CMake ${CMAKE_BINARY_DIR}/_deps/mscg-build) - else() - include(FetchContent) - FetchContent_Declare(mscg URL ${MSCG_URL} URL_HASH MD5=${MSCG_MD5} SOURCE_SUBDIR src/CMake) - FetchContent_MakeAvailable(mscg) - set(MSCG_SOURCE ${CMAKE_BINARY_DIR}/_deps/mscg-src) - endif() - - # restore previous settings - if(OLD_POSITION_INDEPENDENT_CODE) - set(CMAKE_POSITON_INDEPENDENT_CODE ${OLD_POSITION_INDEPENDENT_CODE}) - else() - unset(CMAKE_POSITION_INDEPENDENT_CODE) - endif() - if (OLD_SHARED_LIBS) - set(BUILD_SHARED_LIBS ${OLD_SHARED_LIBS}) - else() - unset(BUILD_SHARED_LIBS) - endif() + include(ExternalCMakeProject) + ExternalCMakeProject(mscg ${MSCG_URL} ${MSCG_MD5} MSCG-release src/CMake) # set include and link library - target_include_directories(lammps PRIVATE "${MSCG_SOURCE}/src") + target_include_directories(lammps PRIVATE "${CMAKE_BINARY_DIR}/_deps/mscg-src/src") target_link_libraries(lammps PRIVATE mscg) else() find_package(MSCG) diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index a61d50af45..119e514207 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -11,24 +11,8 @@ mark_as_advanced(GTEST_URL) mark_as_advanced(GTEST_MD5) set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) -# workaround for older CMake versions (tested on Ubuntu 18.04 with CMake 3.10) -if(CMAKE_VERSION VERSION_LESS 3.14) - file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/_deps) - file(DOWNLOAD ${GTEST_URL} ${CMAKE_BINARY_DIR}/_deps/googletest.tar.gz EXPECTED_HASH MD5=${GTEST_MD5}) - execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf ${CMAKE_BINARY_DIR}/_deps/googletest.tar.gz - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/_deps) - file(GLOB GTEST_SOURCE "${CMAKE_BINARY_DIR}/_deps/googletest-*") - # sanity check. do not allow to have multiple downloaded and extracted versions of the source - list(LENGTH GTEST_SOURCE _num) - if(_num GREATER 1) - message(FATAL_ERROR "Inconsistent googletest sources. Please delete ${CMAKE_BINARY_DIR}/_deps and re-run cmake") - endif() - add_subdirectory(${GTEST_SOURCE} ${CMAKE_BINARY_DIR}/googletest) -else() - include(FetchContent) - FetchContent_Declare(googletest URL ${GTEST_URL} URL_HASH MD5=${GTEST_MD5}) - FetchContent_MakeAvailable(googletest) -endif() +include(ExternalCMakeProject) +ExternalCMakeProject(googletest ${GTEST_URL} ${GTEST_MD5} googletest .) ######################################## # General tests using the LAMMPS executable itself From e75757007e1c285edb4a16b5013b50c61791f6d7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 21 Oct 2021 19:21:34 -0400 Subject: [PATCH 11/70] always compile position independent code --- cmake/CMakeLists.txt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 055d9f3a92..c14bb16812 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -133,10 +133,7 @@ endif() set(LAMMPS_BINARY lmp${LAMMPS_MACHINE}) option(BUILD_SHARED_LIBS "Build shared library" OFF) -if(BUILD_SHARED_LIBS) # for all pkg libs, mpi_stubs and linalg - set(CMAKE_POSITION_INDEPENDENT_CODE ON) -endif() - +option(CMAKE_POSITION_INDEPENDENT_CODE "Create object compatible with shared libraries" ON) option(BUILD_TOOLS "Build and install LAMMPS tools (msi2lmp, binary2txt, chain)" OFF) option(BUILD_LAMMPS_SHELL "Build and install the LAMMPS shell" OFF) From 6ad03498c324e4852eac6b488426e65ec62998e5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 21 Oct 2021 19:22:01 -0400 Subject: [PATCH 12/70] make finding plugins for testing multi-config compatible --- unittest/commands/CMakeLists.txt | 14 ++------------ unittest/commands/test_simple_commands.cpp | 9 +++++++-- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/unittest/commands/CMakeLists.txt b/unittest/commands/CMakeLists.txt index 10c113d781..6116bf8422 100644 --- a/unittest/commands/CMakeLists.txt +++ b/unittest/commands/CMakeLists.txt @@ -10,18 +10,8 @@ endif() target_link_libraries(test_simple_commands PRIVATE lammps gmock) add_test(NAME SimpleCommands COMMAND test_simple_commands WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) -if(BUILD_IS_MULTI_CONFIG) - set(LAMMPS_PLUGIN_BIN_DIR ${CMAKE_BINARY_DIR}/build-plugins/$) -else() - set(LAMMPS_PLUGIN_BIN_DIR ${CMAKE_BINARY_DIR}/build-plugins) -endif() -if(APPLE) - set_tests_properties(SimpleCommands PROPERTIES - ENVIRONMENT "DYLD_LIBRARY_PATH=${LAMMPS_PLUGIN_BIN_DIR}/:${DYLD_LIBRARY_PATH}") -else() - set_tests_properties(SimpleCommands PROPERTIES - ENVIRONMENT "LD_LIBRARY_PATH=${LAMMPS_PLUGIN_BIN_DIR}/:${LD_LIBRARY_PATH}") -endif() +set_tests_properties(SimpleCommands PROPERTIES + ENVIRONMENT "LAMMPS_PLUGIN_BIN_DIR=${CMAKE_BINARY_DIR}/build-plugins") add_executable(test_lattice_region test_lattice_region.cpp) target_link_libraries(test_lattice_region PRIVATE lammps gmock) diff --git a/unittest/commands/test_simple_commands.cpp b/unittest/commands/test_simple_commands.cpp index 0ad47f4e96..4d68b54c21 100644 --- a/unittest/commands/test_simple_commands.cpp +++ b/unittest/commands/test_simple_commands.cpp @@ -384,7 +384,12 @@ TEST_F(SimpleCommandsTest, Units) #if defined(LMP_PLUGIN) TEST_F(SimpleCommandsTest, Plugin) { - std::string loadfmt("plugin load {}plugin.so"); + const char *bindir = getenv("LAMMPS_PLUGIN_BIN_DIR"); + const char *config = getenv("CMAKE_CONFIG_TYPE"); + if (!bindir) GTEST_SKIP(); + std::string loadfmt = platform::path_join("plugin load ", bindir); + if (config) loadfmt = platform::path_join(loadfmt, config); + loadfmt = platform::path_join(loadfmt, "{}plugin.so"); ::testing::internal::CaptureStdout(); lmp->input->one(fmt::format(loadfmt, "hello")); auto text = ::testing::internal::GetCapturedStdout(); @@ -395,7 +400,7 @@ TEST_F(SimpleCommandsTest, Plugin) lmp->input->one(fmt::format(loadfmt, "xxx")); text = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << text; - ASSERT_THAT(text, MatchesRegex(".*Open of file xxx.* failed.*")); + ASSERT_THAT(text, MatchesRegex(".*Open of file .*xxx.* failed.*")); ::testing::internal::CaptureStdout(); lmp->input->one(fmt::format(loadfmt, "nve2")); From 3869e3fce84bde6d9cef6ec0606f0626407c3c62 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 21 Oct 2021 19:27:59 -0400 Subject: [PATCH 13/70] adjust for compiling on windows --- examples/plugins/CMakeLists.txt | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/examples/plugins/CMakeLists.txt b/examples/plugins/CMakeLists.txt index ec0f6ade83..b0903613de 100644 --- a/examples/plugins/CMakeLists.txt +++ b/examples/plugins/CMakeLists.txt @@ -29,17 +29,15 @@ else() if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set(CMAKE_INSTALL_PREFIX "$ENV{HOME}/.local" CACHE PATH "Default install path" FORCE) endif() + # ugly hacks for MSVC which by default always reports an old C++ standard in the __cplusplus macro + # and prints lots of pointless warnings about "unsafe" functions + if(MSVC) + add_compile_options(/Zc:__cplusplus) + add_compile_options(/wd4244) + add_compile_options(/wd4267) + add_compile_definitions(_CRT_SECURE_NO_WARNINGS) endif() -# ugly hacks for MSVC which by default always reports an old C++ standard in the __cplusplus macro -# and prints lots of pointless warnings about "unsafe" functions -#if(MSVC) -# add_compile_options(/Zc:__cplusplus) -# add_compile_options(/wd4244) -# add_compile_options(/wd4267) -# add_compile_definitions(_CRT_SECURE_NO_WARNINGS) -#endif() - # C++11 is required set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) From 7d16078cf49cd4b6dbeb9233aacc521212a9f086 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 21 Oct 2021 19:35:48 -0400 Subject: [PATCH 14/70] always use .so suffix for plugins --- examples/plugins/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/plugins/CMakeLists.txt b/examples/plugins/CMakeLists.txt index b0903613de..b0345e4a5a 100644 --- a/examples/plugins/CMakeLists.txt +++ b/examples/plugins/CMakeLists.txt @@ -70,7 +70,7 @@ add_library(zero2plugin MODULE zero2plugin.cpp pair_zero2.cpp bond_zero2.cpp angle_zero2.cpp dihedral_zero2.cpp improper_zero2.cpp) target_link_libraries(zero2plugin PRIVATE lammps) -set_target_properties(morse2plugin nve2plugin helloplugin zero2plugin PROPERTIES PREFIX "") +set_target_properties(morse2plugin nve2plugin helloplugin zero2plugin PROPERTIES PREFIX "" SUFFIX ".so") # MacOS seems to need this if(CMAKE_SYSTEM_NAME STREQUAL Darwin) From 7cc50925472e16930b87024971ef879429c0ee08 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 21 Oct 2021 21:01:59 -0400 Subject: [PATCH 15/70] make portable to MSVC++ --- unittest/utils/test_math_eigen_impl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unittest/utils/test_math_eigen_impl.cpp b/unittest/utils/test_math_eigen_impl.cpp index 895a35080c..47ca8d9cca 100644 --- a/unittest/utils/test_math_eigen_impl.cpp +++ b/unittest/utils/test_math_eigen_impl.cpp @@ -48,7 +48,7 @@ inline static bool SimilarVec(Vector a, Vector b, int n, Scalar eps = 1.0e-06, Scalar ratio = 1.0e-06, Scalar ratio_denom = 1.0) { for (int i = 0; i < n; i++) - if (not Similar(a[i], b[i], eps, ratio, ratio_denom)) return false; + if (! Similar(a[i], b[i], eps, ratio, ratio_denom)) return false; return true; } @@ -61,7 +61,7 @@ inline static bool SimilarVecUnsigned(Vector a, Vector b, int n, Scalar eps = 1. return true; else { for (int i = 0; i < n; i++) - if (not Similar(a[i], -b[i], eps, ratio, ratio_denom)) return false; + if (! Similar(a[i], -b[i], eps, ratio, ratio_denom)) return false; return true; } } From a796d6b82426c06f46b5654ad99bc4f6a1897cdb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 21 Oct 2021 21:04:15 -0400 Subject: [PATCH 16/70] fix logic bug --- examples/plugins/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/plugins/CMakeLists.txt b/examples/plugins/CMakeLists.txt index b0345e4a5a..e237c42d41 100644 --- a/examples/plugins/CMakeLists.txt +++ b/examples/plugins/CMakeLists.txt @@ -36,6 +36,7 @@ else() add_compile_options(/wd4244) add_compile_options(/wd4267) add_compile_definitions(_CRT_SECURE_NO_WARNINGS) + endif() endif() # C++11 is required From 8d6461ffcd5e5733feabf32cd98cfb51708ce8ee Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 21 Oct 2021 23:39:14 -0400 Subject: [PATCH 17/70] whitespace --- unittest/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index 119e514207..bab92d1be7 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -25,7 +25,7 @@ add_test(NAME RunLammps COMMAND $ -log none -echo none -in in.empty WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(RunLammps PROPERTIES - ENVIRONMENT "TSAN_OPTIONS=ignore_noninstrumented_modules=1;HWLOC_HIDE_ERRORS=1" + ENVIRONMENT "TSAN_OPTIONS=ignore_noninstrumented_modules=1;HWLOC_HIDE_ERRORS=1" PASS_REGULAR_EXPRESSION "LAMMPS \\([0-9]+ [A-Za-z]+ 2[0-9][0-9][0-9]( - Update [0-9]+)?\\)") # check if the compiled executable will print the help message @@ -33,7 +33,7 @@ add_test(NAME HelpMessage COMMAND $ -h WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(HelpMessage PROPERTIES - ENVIRONMENT "TSAN_OPTIONS=ignore_noninstrumented_modules=1;HWLOC_HIDE_ERRORS=1" + ENVIRONMENT "TSAN_OPTIONS=ignore_noninstrumented_modules=1;HWLOC_HIDE_ERRORS=1" PASS_REGULAR_EXPRESSION ".*Large-scale Atomic/Molecular Massively Parallel Simulator -.*Usage example:.*") # check if the compiled executable will error out on an invalid command line flag @@ -41,7 +41,7 @@ add_test(NAME InvalidFlag COMMAND $ -xxx WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(InvalidFlag PROPERTIES - ENVIRONMENT "TSAN_OPTIONS=ignore_noninstrumented_modules=1;HWLOC_HIDE_ERRORS=1" + ENVIRONMENT "TSAN_OPTIONS=ignore_noninstrumented_modules=1;HWLOC_HIDE_ERRORS=1" PASS_REGULAR_EXPRESSION "ERROR: Invalid command-line argument.*") # convenience function for adding tests requiring to be run in parallel with MPI From b57c8bda514b4a64d501be34ee3cd0d7bd6db55c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 21 Oct 2021 23:39:56 -0400 Subject: [PATCH 18/70] build yaml library using custom CMakeLists.txt file --- unittest/force-styles/CMakeLists.txt | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/unittest/force-styles/CMakeLists.txt b/unittest/force-styles/CMakeLists.txt index 487433c9c8..89b63f462b 100644 --- a/unittest/force-styles/CMakeLists.txt +++ b/unittest/force-styles/CMakeLists.txt @@ -1,8 +1,22 @@ find_package(YAML) -if(NOT YAML_FOUND) +if(YAML_FOUND) + set(DOWNLOAD_YAML_DEFAULT OFF) +else() + set(DOWNLOAD_YAML_DEFAULT ON) +endif() +option(DOWNLOAD_YAML "Download YAML library instead of using an already installed one)" ${DOWNLOAD_YAML_DEFAULT}) +set(YAML_URL "https://github.com/akohlmey/libyaml/archive/refs/heads/new-cmake.tar.gz" CACHE STRING "URL for libyaml tarball") +set(YAML_MD5 "b45401559221758b7b48d67eecf27077" CACHE STRING "MD5 checksum of libyaml tarball") +mark_as_advanced(YAML_URL) +mark_as_advanced(YAML_MD5) + +if(DOWNLOAD_YAML) # download and build a local copy of libyaml - include(YAML) + set(BUILD_TESTING off) + include(ExternalCMakeProject) + ExternalCMakeProject(libyaml ${YAML_URL} ${YAML_MD5} libyaml .) + add_library(Yaml::Yaml ALIAS yaml) endif() if(CMAKE_VERSION VERSION_LESS 3.12) From ad81dd39604a7e1163bb3efdab4bd9d08cbbe695 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Oct 2021 08:23:49 -0400 Subject: [PATCH 19/70] recover original new style library target names through ALIAS library definitions --- unittest/CMakeLists.txt | 4 ++++ unittest/c-library/CMakeLists.txt | 14 ++++++------ unittest/commands/CMakeLists.txt | 14 ++++++------ unittest/cplusplus/CMakeLists.txt | 6 +++--- unittest/formats/CMakeLists.txt | 36 +++++++++++++++---------------- unittest/fortran/CMakeLists.txt | 4 ++-- unittest/python/CMakeLists.txt | 2 +- unittest/utils/CMakeLists.txt | 12 +++++------ 8 files changed, 48 insertions(+), 44 deletions(-) diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index bab92d1be7..f6638b839e 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -13,6 +13,10 @@ set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) include(ExternalCMakeProject) ExternalCMakeProject(googletest ${GTEST_URL} ${GTEST_MD5} googletest .) +add_library(GTest::GTest ALIAS gtest) +add_library(GTest::GMock ALIAS gmock) +add_library(GTest::GTestMain ALIAS gtest_main) +add_library(GTest::GMockMain ALIAS gmock_main) ######################################## # General tests using the LAMMPS executable itself diff --git a/unittest/c-library/CMakeLists.txt b/unittest/c-library/CMakeLists.txt index 5168345727..3d57dbbc90 100644 --- a/unittest/c-library/CMakeLists.txt +++ b/unittest/c-library/CMakeLists.txt @@ -1,24 +1,24 @@ add_executable(test_library_open test_library_open.cpp test_main.cpp) -target_link_libraries(test_library_open PRIVATE lammps gmock) +target_link_libraries(test_library_open PRIVATE lammps GTest::GMock) add_test(LibraryOpen test_library_open) add_executable(test_library_commands test_library_commands.cpp test_main.cpp) -target_link_libraries(test_library_commands PRIVATE lammps gmock) +target_link_libraries(test_library_commands PRIVATE lammps GTest::GMock) add_test(LibraryCommands test_library_commands) add_executable(test_library_external test_library_external.cpp test_main.cpp) -target_link_libraries(test_library_external PRIVATE lammps gmock) +target_link_libraries(test_library_external PRIVATE lammps GTest::GMock) add_test(LibraryExternal test_library_external) add_executable(test_library_properties test_library_properties.cpp test_main.cpp) -target_link_libraries(test_library_properties PRIVATE lammps gmock) +target_link_libraries(test_library_properties PRIVATE lammps GTest::GMock) target_compile_definitions(test_library_properties PRIVATE -DTEST_INPUT_FOLDER=${CMAKE_CURRENT_SOURCE_DIR}) add_test(LibraryProperties test_library_properties) set_tests_properties(LibraryProperties PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") add_executable(test_library_scatter_gather test_library_scatter_gather.cpp test_main.cpp) -target_link_libraries(test_library_scatter_gather PRIVATE lammps gmock) +target_link_libraries(test_library_scatter_gather PRIVATE lammps GTest::GMock) target_compile_definitions(test_library_scatter_gather PRIVATE -DTEST_INPUT_FOLDER=${CMAKE_CURRENT_SOURCE_DIR}) add_test(LibraryScatterGather test_library_scatter_gather) set_tests_properties(LibraryScatterGather PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") @@ -63,11 +63,11 @@ foreach(WITH "JPEG" "PNG" "GZIP" "FFMPEG") endforeach() add_executable(test_library_config test_library_config.cpp test_main.cpp) -target_link_libraries(test_library_config PRIVATE lammps gmock) +target_link_libraries(test_library_config PRIVATE lammps GTest::GMock) target_compile_definitions(test_library_config PRIVATE ${TEST_CONFIG_DEFS}) add_test(LibraryConfig test_library_config) add_executable(test_library_mpi test_library_mpi.cpp) -target_link_libraries(test_library_mpi PRIVATE lammps gmock) +target_link_libraries(test_library_mpi PRIVATE lammps GTest::GMock) target_compile_definitions(test_library_mpi PRIVATE ${TEST_CONFIG_DEFS}) add_mpi_test(NAME LibraryMPI NUM_PROCS 4 COMMAND $) diff --git a/unittest/commands/CMakeLists.txt b/unittest/commands/CMakeLists.txt index 6116bf8422..49603a8b22 100644 --- a/unittest/commands/CMakeLists.txt +++ b/unittest/commands/CMakeLists.txt @@ -8,21 +8,21 @@ if((NOT (CMAKE_SYSTEM_NAME STREQUAL "Windows")) AND PKG_PLUGIN) target_compile_definitions(test_simple_commands PRIVATE -DLMP_PLUGIN) endif() -target_link_libraries(test_simple_commands PRIVATE lammps gmock) +target_link_libraries(test_simple_commands PRIVATE lammps GTest::GMock) add_test(NAME SimpleCommands COMMAND test_simple_commands WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(SimpleCommands PROPERTIES ENVIRONMENT "LAMMPS_PLUGIN_BIN_DIR=${CMAKE_BINARY_DIR}/build-plugins") add_executable(test_lattice_region test_lattice_region.cpp) -target_link_libraries(test_lattice_region PRIVATE lammps gmock) +target_link_libraries(test_lattice_region PRIVATE lammps GTest::GMock) add_test(NAME LatticeRegion COMMAND test_lattice_region WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_groups test_groups.cpp) -target_link_libraries(test_groups PRIVATE lammps gmock) +target_link_libraries(test_groups PRIVATE lammps GTest::GMock) add_test(NAME Groups COMMAND test_groups WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_variables test_variables.cpp) -target_link_libraries(test_variables PRIVATE lammps gmock) +target_link_libraries(test_variables PRIVATE lammps GTest::GMock) add_test(NAME Variables COMMAND test_variables WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_kim_commands test_kim_commands.cpp) @@ -33,15 +33,15 @@ if(KIM_EXTRA_UNITTESTS) message(FATAL_ERROR "CURL not found. Enabling KIM extra unit tests requires to have libcurl installed.") endif() endif() -target_link_libraries(test_kim_commands PRIVATE lammps gmock) +target_link_libraries(test_kim_commands PRIVATE lammps GTest::GMock) add_test(NAME KimCommands COMMAND test_kim_commands WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_reset_ids test_reset_ids.cpp) target_compile_definitions(test_reset_ids PRIVATE -DTEST_INPUT_FOLDER=${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(test_reset_ids PRIVATE lammps gmock) +target_link_libraries(test_reset_ids PRIVATE lammps GTest::GMock) add_test(NAME ResetIDs COMMAND test_reset_ids WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_mpi_load_balancing test_mpi_load_balancing.cpp) -target_link_libraries(test_mpi_load_balancing PRIVATE lammps gmock) +target_link_libraries(test_mpi_load_balancing PRIVATE lammps GTest::GMock) target_compile_definitions(test_mpi_load_balancing PRIVATE ${TEST_CONFIG_DEFS}) add_mpi_test(NAME MPILoadBalancing NUM_PROCS 4 COMMAND $) diff --git a/unittest/cplusplus/CMakeLists.txt b/unittest/cplusplus/CMakeLists.txt index ef6155f986..efd194b9d2 100644 --- a/unittest/cplusplus/CMakeLists.txt +++ b/unittest/cplusplus/CMakeLists.txt @@ -1,13 +1,13 @@ add_executable(test_lammps_class test_lammps_class.cpp) -target_link_libraries(test_lammps_class PRIVATE lammps gmock_main) +target_link_libraries(test_lammps_class PRIVATE lammps GTest::GMockMain) add_test(LammpsClass test_lammps_class) set_tests_properties(LammpsClass PROPERTIES ENVIRONMENT "OMP_NUM_THREADS=1") add_executable(test_input_class test_input_class.cpp) -target_link_libraries(test_input_class PRIVATE lammps gtest_main) +target_link_libraries(test_input_class PRIVATE lammps GTest::GTestMain) add_test(InputClass test_input_class) add_executable(test_error_class test_error_class.cpp) -target_link_libraries(test_error_class PRIVATE lammps gmock) +target_link_libraries(test_error_class PRIVATE lammps GTest::GMock) add_test(ErrorClass test_error_class) diff --git a/unittest/formats/CMakeLists.txt b/unittest/formats/CMakeLists.txt index 9978857c1e..a17707fdf1 100644 --- a/unittest/formats/CMakeLists.txt +++ b/unittest/formats/CMakeLists.txt @@ -1,48 +1,48 @@ add_executable(test_atom_styles test_atom_styles.cpp) -target_link_libraries(test_atom_styles PRIVATE lammps gmock) +target_link_libraries(test_atom_styles PRIVATE lammps GTest::GMock) add_test(NAME AtomStyles COMMAND test_atom_styles WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_image_flags test_image_flags.cpp) -target_link_libraries(test_image_flags PRIVATE lammps gmock) +target_link_libraries(test_image_flags PRIVATE lammps GTest::GMock) add_test(NAME ImageFlags COMMAND test_image_flags WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_input_convert test_input_convert.cpp) -target_link_libraries(test_input_convert PRIVATE lammps gmock_main) +target_link_libraries(test_input_convert PRIVATE lammps GTest::GMockMain) add_test(NAME InputConvert COMMAND test_input_convert WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_molecule_file test_molecule_file.cpp) -target_link_libraries(test_molecule_file PRIVATE lammps gmock) +target_link_libraries(test_molecule_file PRIVATE lammps GTest::GMock) add_test(NAME MoleculeFile COMMAND test_molecule_file WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_pair_unit_convert test_pair_unit_convert.cpp) -target_link_libraries(test_pair_unit_convert PRIVATE lammps gmock) +target_link_libraries(test_pair_unit_convert PRIVATE lammps GTest::GMock) add_test(NAME PairUnitConvert COMMAND test_pair_unit_convert WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(PairUnitConvert PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") add_executable(test_potential_file_reader test_potential_file_reader.cpp) -target_link_libraries(test_potential_file_reader PRIVATE lammps gmock) +target_link_libraries(test_potential_file_reader PRIVATE lammps GTest::GMock) add_test(NAME PotentialFileReader COMMAND test_potential_file_reader WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(PotentialFileReader PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") if(PKG_MANYBODY) add_executable(test_eim_potential_file_reader test_eim_potential_file_reader.cpp) - target_link_libraries(test_eim_potential_file_reader PRIVATE lammps gmock) + target_link_libraries(test_eim_potential_file_reader PRIVATE lammps GTest::GMock) add_test(NAME EIMPotentialFileReader COMMAND test_eim_potential_file_reader WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(EIMPotentialFileReader PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") endif() add_executable(test_text_file_reader test_text_file_reader.cpp) -target_link_libraries(test_text_file_reader PRIVATE lammps gmock) +target_link_libraries(test_text_file_reader PRIVATE lammps GTest::GMock) add_test(NAME TextFileReader COMMAND test_text_file_reader WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(TextFileReader PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") add_executable(test_file_operations test_file_operations.cpp) -target_link_libraries(test_file_operations PRIVATE lammps gmock) +target_link_libraries(test_file_operations PRIVATE lammps GTest::GMock) add_test(NAME FileOperations COMMAND test_file_operations WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_dump_atom test_dump_atom.cpp) -target_link_libraries(test_dump_atom PRIVATE lammps gmock) +target_link_libraries(test_dump_atom PRIVATE lammps GTest::GMock) add_test(NAME DumpAtom COMMAND test_dump_atom WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(DumpAtom PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") @@ -50,19 +50,19 @@ if(PKG_COMPRESS) find_program(GZIP_BINARY NAMES gzip REQUIRED) add_executable(test_dump_atom_compressed test_dump_atom_compressed.cpp compressed_dump_test_main.cpp) - target_link_libraries(test_dump_atom_compressed PRIVATE lammps gmock) + target_link_libraries(test_dump_atom_compressed PRIVATE lammps GTest::GMock) add_executable(test_dump_custom_compressed test_dump_custom_compressed.cpp compressed_dump_test_main.cpp) - target_link_libraries(test_dump_custom_compressed PRIVATE lammps gmock) + target_link_libraries(test_dump_custom_compressed PRIVATE lammps GTest::GMock) add_executable(test_dump_cfg_compressed test_dump_cfg_compressed.cpp compressed_dump_test_main.cpp) - target_link_libraries(test_dump_cfg_compressed PRIVATE lammps gmock) + target_link_libraries(test_dump_cfg_compressed PRIVATE lammps GTest::GMock) add_executable(test_dump_local_compressed test_dump_local_compressed.cpp compressed_dump_test_main.cpp) - target_link_libraries(test_dump_local_compressed PRIVATE lammps gmock) + target_link_libraries(test_dump_local_compressed PRIVATE lammps GTest::GMock) add_executable(test_dump_xyz_compressed test_dump_xyz_compressed.cpp compressed_dump_test_main.cpp) - target_link_libraries(test_dump_xyz_compressed PRIVATE lammps gmock) + target_link_libraries(test_dump_xyz_compressed PRIVATE lammps GTest::GMock) add_test(NAME DumpAtomGZ COMMAND test_dump_atom_compressed gz WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(DumpAtomGZ PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR};COMPRESS_BINARY=${GZIP_BINARY}") @@ -102,17 +102,17 @@ if(PKG_COMPRESS) endif() add_executable(test_dump_custom test_dump_custom.cpp) -target_link_libraries(test_dump_custom PRIVATE lammps gmock) +target_link_libraries(test_dump_custom PRIVATE lammps GTest::GMock) add_test(NAME DumpCustom COMMAND test_dump_custom WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(DumpCustom PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") add_executable(test_dump_cfg test_dump_cfg.cpp) -target_link_libraries(test_dump_cfg PRIVATE lammps gmock) +target_link_libraries(test_dump_cfg PRIVATE lammps GTest::GMock) add_test(NAME DumpCfg COMMAND test_dump_cfg WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(DumpCfg PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") add_executable(test_dump_local test_dump_local.cpp) -target_link_libraries(test_dump_local PRIVATE lammps gmock) +target_link_libraries(test_dump_local PRIVATE lammps GTest::GMock) add_test(NAME DumpLocal COMMAND test_dump_local WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(DumpLocal PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") diff --git a/unittest/fortran/CMakeLists.txt b/unittest/fortran/CMakeLists.txt index 586dcf537f..6e7e165018 100644 --- a/unittest/fortran/CMakeLists.txt +++ b/unittest/fortran/CMakeLists.txt @@ -25,11 +25,11 @@ if(CMAKE_Fortran_COMPILER) add_library(flammps STATIC ${LAMMPS_FORTRAN_MODULE}) add_executable(test_fortran_create wrap_create.cpp test_fortran_create.f90) - target_link_libraries(test_fortran_create PRIVATE flammps lammps MPI::MPI_Fortran gtest_main) + target_link_libraries(test_fortran_create PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain) add_test(FortranOpen test_fortran_create) add_executable(test_fortran_commands wrap_commands.cpp test_fortran_commands.f90) - target_link_libraries(test_fortran_commands PRIVATE flammps lammps MPI::MPI_Fortran gtest_main) + target_link_libraries(test_fortran_commands PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain) add_test(FortranCommands test_fortran_commands) else() message(STATUS "Skipping Tests for the LAMMPS Fortran Module: no Fortran compiler") diff --git a/unittest/python/CMakeLists.txt b/unittest/python/CMakeLists.txt index 9343167228..f61a9c61ab 100644 --- a/unittest/python/CMakeLists.txt +++ b/unittest/python/CMakeLists.txt @@ -21,7 +21,7 @@ else() endif() add_executable(test_python_package test_python_package.cpp) -target_link_libraries(test_python_package PRIVATE lammps gmock) +target_link_libraries(test_python_package PRIVATE lammps GTest::GMock) target_compile_definitions(test_python_package PRIVATE -DTEST_INPUT_FOLDER=${TEST_INPUT_FOLDER}) # this requires CMake 3.12. don't care to add backward compatibility for this. if(Python3_Development_FOUND) diff --git a/unittest/utils/CMakeLists.txt b/unittest/utils/CMakeLists.txt index 8aa671cba6..28486048c4 100644 --- a/unittest/utils/CMakeLists.txt +++ b/unittest/utils/CMakeLists.txt @@ -1,21 +1,21 @@ add_executable(test_tokenizer test_tokenizer.cpp) -target_link_libraries(test_tokenizer PRIVATE lammps gmock_main) +target_link_libraries(test_tokenizer PRIVATE lammps GTest::GMockMain) add_test(Tokenizer test_tokenizer) add_executable(test_mempool test_mempool.cpp) -target_link_libraries(test_mempool PRIVATE lammps gmock_main) +target_link_libraries(test_mempool PRIVATE lammps GTest::GMockMain) add_test(MemPool test_mempool) add_executable(test_argutils test_argutils.cpp) -target_link_libraries(test_argutils PRIVATE lammps gmock_main) +target_link_libraries(test_argutils PRIVATE lammps GTest::GMockMain) add_test(ArgUtils test_argutils) add_executable(test_utils test_utils.cpp) -target_link_libraries(test_utils PRIVATE lammps gmock_main) +target_link_libraries(test_utils PRIVATE lammps GTest::GMockMain) add_test(Utils test_utils) add_executable(test_platform test_platform.cpp) -target_link_libraries(test_platform PRIVATE lammps gmock_main) +target_link_libraries(test_platform PRIVATE lammps GTest::GMockMain) add_test(Platform test_platform) set_tests_properties(Utils Platform PROPERTIES @@ -34,7 +34,7 @@ if(BUILD_SHARED_LIBS) endif() add_executable(test_fmtlib test_fmtlib.cpp) -target_link_libraries(test_fmtlib PRIVATE lammps gmock_main) +target_link_libraries(test_fmtlib PRIVATE lammps GTest::GMockMain) add_test(FmtLib test_fmtlib) add_executable(test_math_eigen_impl test_math_eigen_impl.cpp) From ced96441ef482ddb355795a0fdcdc436a655f1c6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Oct 2021 08:44:30 -0400 Subject: [PATCH 20/70] update hash after change in repo --- unittest/force-styles/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unittest/force-styles/CMakeLists.txt b/unittest/force-styles/CMakeLists.txt index 89b63f462b..9ef2b73ec5 100644 --- a/unittest/force-styles/CMakeLists.txt +++ b/unittest/force-styles/CMakeLists.txt @@ -7,7 +7,7 @@ else() endif() option(DOWNLOAD_YAML "Download YAML library instead of using an already installed one)" ${DOWNLOAD_YAML_DEFAULT}) set(YAML_URL "https://github.com/akohlmey/libyaml/archive/refs/heads/new-cmake.tar.gz" CACHE STRING "URL for libyaml tarball") -set(YAML_MD5 "b45401559221758b7b48d67eecf27077" CACHE STRING "MD5 checksum of libyaml tarball") +set(YAML_MD5 "1683f5957a79d7a823e09575b0488df2" CACHE STRING "MD5 checksum of libyaml tarball") mark_as_advanced(YAML_URL) mark_as_advanced(YAML_MD5) From d7d1c84b35c7de35fa439decc6b4c0d1692aa8b9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Oct 2021 08:56:00 -0400 Subject: [PATCH 21/70] only build a custom YAML lib, if not installed --- unittest/force-styles/CMakeLists.txt | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/unittest/force-styles/CMakeLists.txt b/unittest/force-styles/CMakeLists.txt index 9ef2b73ec5..c4c008f6df 100644 --- a/unittest/force-styles/CMakeLists.txt +++ b/unittest/force-styles/CMakeLists.txt @@ -1,19 +1,12 @@ find_package(YAML) -if(YAML_FOUND) - set(DOWNLOAD_YAML_DEFAULT OFF) -else() - set(DOWNLOAD_YAML_DEFAULT ON) -endif() -option(DOWNLOAD_YAML "Download YAML library instead of using an already installed one)" ${DOWNLOAD_YAML_DEFAULT}) -set(YAML_URL "https://github.com/akohlmey/libyaml/archive/refs/heads/new-cmake.tar.gz" CACHE STRING "URL for libyaml tarball") -set(YAML_MD5 "1683f5957a79d7a823e09575b0488df2" CACHE STRING "MD5 checksum of libyaml tarball") -mark_as_advanced(YAML_URL) -mark_as_advanced(YAML_MD5) +if(NOT YAML_FOUND) + set(YAML_URL "https://github.com/akohlmey/libyaml/archive/refs/heads/new-cmake.tar.gz" CACHE STRING "URL for libyaml tarball") + set(YAML_MD5 "1683f5957a79d7a823e09575b0488df2" CACHE STRING "MD5 checksum of libyaml tarball") + mark_as_advanced(YAML_URL) + mark_as_advanced(YAML_MD5) -if(DOWNLOAD_YAML) # download and build a local copy of libyaml - set(BUILD_TESTING off) include(ExternalCMakeProject) ExternalCMakeProject(libyaml ${YAML_URL} ${YAML_MD5} libyaml .) add_library(Yaml::Yaml ALIAS yaml) From bd9ad288b953c8bdbb9d216a3f49c77ed75530fe Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Oct 2021 09:13:07 -0500 Subject: [PATCH 22/70] recover compilation of test on windows --- unittest/force-styles/test_error_stats.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/unittest/force-styles/test_error_stats.cpp b/unittest/force-styles/test_error_stats.cpp index 52ba3baae3..0d0cbd43b3 100644 --- a/unittest/force-styles/test_error_stats.cpp +++ b/unittest/force-styles/test_error_stats.cpp @@ -9,6 +9,10 @@ #include "fmtlib_format.cpp" #include "fmtlib_os.cpp" +#if defined(max) +#undef max +#endif + TEST(ErrorStats, test) { ErrorStats stats; From 69f5e1feac2111469d7bbd3adbfa16cb50c858d8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Oct 2021 09:25:44 -0500 Subject: [PATCH 23/70] Enable testing for Debug configurations in VS --- cmake/CMakeSettings.json | 98 ++++++++++++++++++++-------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/cmake/CMakeSettings.json b/cmake/CMakeSettings.json index dada2f6752..7292649afe 100644 --- a/cmake/CMakeSettings.json +++ b/cmake/CMakeSettings.json @@ -1,55 +1,55 @@ { - "configurations": [ + "configurations": [ + { + "name": "x64-Debug-MSVC", + "generator": "Ninja", + "configurationType": "Debug", + "buildRoot": "${workspaceRoot}\\build\\${name}", + "installRoot": "${workspaceRoot}\\install\\${name}", + "cmakeCommandArgs": "-S ${workspaceRoot}\\cmake -C ${workspaceRoot}\\cmake\\presets\\windows.cmake -DENABLE_TESTING=on", + "buildCommandArgs": "", + "ctestCommandArgs": "", + "inheritEnvironments": [ "msvc_x64_x64" ], + "variables": [ { - "name": "x64-Debug-MSVC", - "generator": "Ninja", - "configurationType": "Debug", - "buildRoot": "${workspaceRoot}\\build\\${name}", - "installRoot": "${workspaceRoot}\\install\\${name}", - "cmakeCommandArgs": "-S ${workspaceRoot}\\cmake -C ${workspaceRoot}\\cmake\\presets\\windows.cmake", - "buildCommandArgs": "", - "ctestCommandArgs": "", - "inheritEnvironments": [ "msvc_x64_x64" ], - "variables": [ - { - "name": "BUILD_SHARED_LIBS", - "value": "True", - "type": "BOOL" - }, - { - "name": "BUILD_TOOLS", - "value": "True", - "type": "BOOL" - }, - { - "name": "LAMMPS_EXCEPTIONS", - "value": "True", - "type": "BOOL" - } - ] + "name": "BUILD_SHARED_LIBS", + "value": "True", + "type": "BOOL" }, { - "name": "x64-Debug-Clang", - "generator": "Ninja", - "configurationType": "Debug", - "buildRoot": "${workspaceRoot}\\build\\${name}", - "installRoot": "${workspaceRoot}\\install\\${name}", - "cmakeCommandArgs": "-S ${workspaceRoot}\\cmake -C ${workspaceRoot}\\cmake\\presets\\windows.cmake", - "buildCommandArgs": "", - "ctestCommandArgs": "", - "inheritEnvironments": [ "clang_cl_x64" ], - "variables": [ - { - "name": "BUILD_TOOLS", - "value": "True", - "type": "BOOL" - }, - { - "name": "LAMMPS_EXCEPTIONS", - "value": "True", - "type": "BOOL" - } - ] + "name": "BUILD_TOOLS", + "value": "True", + "type": "BOOL" + }, + { + "name": "LAMMPS_EXCEPTIONS", + "value": "True", + "type": "BOOL" } - ] + ] + }, + { + "name": "x64-Debug-Clang", + "generator": "Ninja", + "configurationType": "Debug", + "buildRoot": "${workspaceRoot}\\build\\${name}", + "installRoot": "${workspaceRoot}\\install\\${name}", + "cmakeCommandArgs": "-S ${workspaceRoot}\\cmake -C ${workspaceRoot}\\cmake\\presets\\windows.cmake -DENABLE_TESTING=on", + "buildCommandArgs": "", + "ctestCommandArgs": "", + "inheritEnvironments": [ "clang_cl_x64" ], + "variables": [ + { + "name": "BUILD_TOOLS", + "value": "True", + "type": "BOOL" + }, + { + "name": "LAMMPS_EXCEPTIONS", + "value": "True", + "type": "BOOL" + } + ] + } + ] } \ No newline at end of file From 5c9a4f4be01b9614a45b4e86698ff032da5c350c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Oct 2021 11:05:32 -0400 Subject: [PATCH 24/70] implement platform abstraction of unsetenv() --- doc/src/Developer_platform.rst | 3 +++ src/platform.cpp | 21 +++++++++++++++++++++ src/platform.h | 7 +++++++ unittest/cplusplus/test_lammps_class.cpp | 6 +----- unittest/utils/test_platform.cpp | 10 +++++++++- 5 files changed, 41 insertions(+), 6 deletions(-) diff --git a/doc/src/Developer_platform.rst b/doc/src/Developer_platform.rst index 4cea36f94c..fd5cf065eb 100644 --- a/doc/src/Developer_platform.rst +++ b/doc/src/Developer_platform.rst @@ -115,6 +115,9 @@ Environment variable functions .. doxygenfunction:: putenv :project: progguide +.. doxygenfunction:: unsetenv + :project: progguide + .. doxygenfunction:: list_pathenv :project: progguide diff --git a/src/platform.cpp b/src/platform.cpp index 555026b2ac..5e04251ca7 100644 --- a/src/platform.cpp +++ b/src/platform.cpp @@ -442,6 +442,27 @@ int platform::putenv(const std::string &vardef) return -1; } +/* ---------------------------------------------------------------------- + unset environment variable +------------------------------------------------------------------------- */ + +int platform::unsetenv(const std::string &variable) +{ + if (variable.size() == 0) return -1; + +#ifdef _WIN32 + // empty _putenv() definition deletes variable on Windows + // must not have an equal sign as that will result in creating an environment variable + if (variable.find_first_of('=') != std::string::npos) return -1; + auto var = utils::strdup(variable); + int rv = _putenv(var); + delete[] var; + return rv; +#else + return ::unsetenv(variable.c_str()); +#endif +} + /* ---------------------------------------------------------------------- split a "path" environment variable into a list ------------------------------------------------------------------------- */ diff --git a/src/platform.h b/src/platform.h index de8ecce016..eb14b403aa 100644 --- a/src/platform.h +++ b/src/platform.h @@ -116,6 +116,13 @@ namespace platform { int putenv(const std::string &vardef); + /*! Delete variable from the environment + * + * \param variable variable name + * \return -1 if failure otherwise 0 */ + + int unsetenv(const std::string &variable); + /*! Get list of entries in a path environment variable * * This provides a list of strings of the entries in an environment diff --git a/unittest/cplusplus/test_lammps_class.cpp b/unittest/cplusplus/test_lammps_class.cpp index 663c7358d9..3a1bde51ff 100644 --- a/unittest/cplusplus/test_lammps_class.cpp +++ b/unittest/cplusplus/test_lammps_class.cpp @@ -363,11 +363,7 @@ TEST(LAMMPS_init, NoOpenMP) FILE *fp = fopen("in.lammps_class_noomp", "w"); fputs("\n", fp); fclose(fp); -#if defined(__WIN32) - _putenv("OMP_NUM_THREADS"); -#else - unsetenv("OMP_NUM_THREADS"); -#endif + platform::unsetenv("OMP_NUM_THREADS"); const char *args[] = {"LAMMPS_init", "-in", "in.lammps_class_noomp", "-log", "none", "-nocite"}; char **argv = (char **)args; diff --git a/unittest/utils/test_platform.cpp b/unittest/utils/test_platform.cpp index 0f39534c31..ace546ba90 100644 --- a/unittest/utils/test_platform.cpp +++ b/unittest/utils/test_platform.cpp @@ -37,7 +37,7 @@ TEST(Platform, clock) ASSERT_GT(ct_used, 1e-4); } -TEST(Platform, putenv) +TEST(Platform, putenv_unsetenv) { const char *var = getenv("UNITTEST_VAR1"); ASSERT_EQ(var, nullptr); @@ -65,6 +65,14 @@ TEST(Platform, putenv) ASSERT_THAT(var, StrEq("one=two")); ASSERT_EQ(platform::putenv(""), -1); + + ASSERT_EQ(platform::unsetenv(""), -1); + ASSERT_EQ(platform::unsetenv("UNITTEST_VAR3=two"), -1); + var = getenv("UNITTEST_VAR1"); + ASSERT_NE(var, nullptr); + ASSERT_EQ(platform::unsetenv("UNITTEST_VAR1"), 0); + var = getenv("UNITTEST_VAR1"); + ASSERT_EQ(var, nullptr); } TEST(Platform, list_pathenv) From 7318aa49d8ba01e9c64d4313ec09c36cc5a6e099 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Oct 2021 12:12:20 -0400 Subject: [PATCH 25/70] set define for static linkage to avoid issues linking libyaml on windows --- unittest/force-styles/CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/unittest/force-styles/CMakeLists.txt b/unittest/force-styles/CMakeLists.txt index c4c008f6df..6624993321 100644 --- a/unittest/force-styles/CMakeLists.txt +++ b/unittest/force-styles/CMakeLists.txt @@ -31,7 +31,12 @@ endif() set(TEST_INPUT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR}/tests) add_library(style_tests STATIC yaml_writer.cpp error_stats.cpp test_config_reader.cpp test_main.cpp) -target_compile_definitions(style_tests PRIVATE -DTEST_INPUT_FOLDER=${TEST_INPUT_FOLDER}) +if(YAML_FOUND) + target_compile_definitions(style_tests PRIVATE TEST_INPUT_FOLDER=${TEST_INPUT_FOLDER}) +else() + # we always use static linkage with local compiled libyaml + target_compile_definitions(style_tests PRIVATE TEST_INPUT_FOLDER=${TEST_INPUT_FOLDER} YAML_DECLARE_STATIC) +endif() target_include_directories(style_tests PRIVATE ${LAMMPS_SOURCE_DIR}) target_link_libraries(style_tests PUBLIC gmock Yaml::Yaml lammps) if(BUILD_MPI) From 4edd5238b1cd4074bb80aac249f9e0a77f221a41 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Oct 2021 13:21:45 -0400 Subject: [PATCH 26/70] improve putenv() and unsetenv() implementation on windows by using _putenv_s() --- src/platform.cpp | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/platform.cpp b/src/platform.cpp index 5e04251ca7..5c18949482 100644 --- a/src/platform.cpp +++ b/src/platform.cpp @@ -428,11 +428,11 @@ int platform::putenv(const std::string &vardef) auto found = vardef.find_first_of('='); #ifdef _WIN32 - // must assign a value to variable with _putenv() + // must assign a value to variable with _putenv_s() if (found == std::string::npos) - return _putenv(utils::strdup(vardef + "=1")); + return _putenv_s(vardef.c_str(), "1"); else - return _putenv(utils::strdup(vardef)); + return _putenv_s(vardef.substr(0, found).c_str(), vardef.substr(found+1).c_str()); #else if (found == std::string::npos) return setenv(vardef.c_str(), "", 1); @@ -449,15 +449,12 @@ int platform::putenv(const std::string &vardef) int platform::unsetenv(const std::string &variable) { if (variable.size() == 0) return -1; - #ifdef _WIN32 - // empty _putenv() definition deletes variable on Windows - // must not have an equal sign as that will result in creating an environment variable - if (variable.find_first_of('=') != std::string::npos) return -1; - auto var = utils::strdup(variable); - int rv = _putenv(var); - delete[] var; - return rv; + // emulate POSIX semantics by returning -1 on trying to unset non-existing variable + const char *ptr = getenv(variable.c_str()); + if (!ptr) return -1; + // empty _putenv_s() definition deletes variable + return _putenv_s(variable.c_str(),""); #else return ::unsetenv(variable.c_str()); #endif From 89808266dd07f646711d7c4b0ad5e86ca30479a9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Oct 2021 13:46:13 -0400 Subject: [PATCH 27/70] remove obsolete file --- cmake/Modules/YAML.cmake | 47 ---------------------------------------- 1 file changed, 47 deletions(-) delete mode 100644 cmake/Modules/YAML.cmake diff --git a/cmake/Modules/YAML.cmake b/cmake/Modules/YAML.cmake deleted file mode 100644 index 77ee804111..0000000000 --- a/cmake/Modules/YAML.cmake +++ /dev/null @@ -1,47 +0,0 @@ -message(STATUS "Downloading and building YAML library") - -include(ExternalProject) -set(YAML_URL "https://pyyaml.org/download/libyaml/yaml-0.2.5.tar.gz" CACHE STRING "URL for libyaml tarball") -set(YAML_MD5 "bb15429d8fb787e7d3f1c83ae129a999" CACHE STRING "MD5 checksum of libyaml tarball") -mark_as_advanced(YAML_URL) -mark_as_advanced(YAML_MD5) - -# support cross-compilation to windows -if(CMAKE_CROSSCOMPILING AND (CMAKE_SYSTEM_NAME STREQUAL "Windows")) - if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86") - set(YAML_CROSS_HOST --host=i686-mingw64) - elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") - set(YAML_CROSS_HOST --host=x86_64-mingw64) - else() - message(FATAL_ERROR "Unsupported cross-compilation " - " for ${CMAKE_SYSTEM_NAME}/${CMAKE_SYSTEM_PROCESSOR}" - " on ${CMAKE_HOST_SYSTEM}/${CMAKE_HOST_SYSTEM_PROCESSOR}") - endif() -endif() - -ExternalProject_Add(libyaml - URL ${YAML_URL} - URL_MD5 ${YAML_MD5} - SOURCE_DIR "${CMAKE_BINARY_DIR}/yaml-src" - BINARY_DIR "${CMAKE_BINARY_DIR}/yaml-build" - CONFIGURE_COMMAND /configure ${CONFIGURE_REQUEST_PIC} - CXX=${CMAKE_CXX_COMPILER} CC=${CMAKE_C_COMPILER} - --prefix= --disable-shared ${YAML_CROSS_HOST} - BUILD_BYPRODUCTS /lib/libyaml${CMAKE_STATIC_LIBRARY_SUFFIX} - TEST_COMMAND "") - -ExternalProject_Get_Property(libyaml INSTALL_DIR) -set(YAML_INCLUDE_DIR ${INSTALL_DIR}/include) -set(YAML_LIBRARY_DIR ${INSTALL_DIR}/lib) - -# workaround for CMake 3.10 on ubuntu 18.04 -file(MAKE_DIRECTORY ${YAML_INCLUDE_DIR}) -file(MAKE_DIRECTORY ${YAML_LIBRARY_DIR}) - -set(YAML_LIBRARY_PATH ${INSTALL_DIR}/lib/libyaml${CMAKE_STATIC_LIBRARY_SUFFIX}) - -add_library(Yaml::Yaml UNKNOWN IMPORTED) -set_target_properties(Yaml::Yaml PROPERTIES - IMPORTED_LOCATION ${YAML_LIBRARY_PATH} - INTERFACE_INCLUDE_DIRECTORIES ${YAML_INCLUDE_DIR}) -add_dependencies(Yaml::Yaml libyaml) From b6c610ada2ab709b95852b5351a7d78b6a6c6852 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Oct 2021 14:12:19 -0400 Subject: [PATCH 28/70] tweak epsilon for portability to MSVC compilers --- unittest/force-styles/tests/atomic-pair-eim.yaml | 2 +- unittest/force-styles/tests/manybody-pair-meam.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unittest/force-styles/tests/atomic-pair-eim.yaml b/unittest/force-styles/tests/atomic-pair-eim.yaml index 4814029a3c..e705e88614 100644 --- a/unittest/force-styles/tests/atomic-pair-eim.yaml +++ b/unittest/force-styles/tests/atomic-pair-eim.yaml @@ -1,7 +1,7 @@ --- lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:09:02 2021 -epsilon: 1e-11 +epsilon: 2e-11 prerequisites: ! | pair eim pre_commands: ! "" diff --git a/unittest/force-styles/tests/manybody-pair-meam.yaml b/unittest/force-styles/tests/manybody-pair-meam.yaml index 4237f5ffc2..fed2a060cf 100644 --- a/unittest/force-styles/tests/manybody-pair-meam.yaml +++ b/unittest/force-styles/tests/manybody-pair-meam.yaml @@ -1,7 +1,7 @@ --- lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:09:15 2021 -epsilon: 7.5e-12 +epsilon: 1e-10 prerequisites: ! | pair meam pre_commands: ! | From 7abcdc8c4c7aad517a7e32136f76b03dabedd1fa Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Oct 2021 16:14:06 -0400 Subject: [PATCH 29/70] use anonymous namespace to manage visibility of multiple copies of parse_error class --- src/EXTRA-FIX/fix_ttm.cpp | 12 ++++++++++++ src/EXTRA-FIX/fix_ttm.h | 8 -------- src/EXTRA-FIX/fix_ttm_grid.cpp | 12 ++++++++++++ src/EXTRA-FIX/fix_ttm_mod.cpp | 12 ++++++++++++ src/EXTRA-FIX/fix_ttm_mod.h | 8 -------- src/QEQ/fix_qeq.cpp | 14 ++++++++------ src/REAXFF/fix_acks2_reaxff.cpp | 14 ++++++++------ src/REAXFF/fix_qeq_reaxff.cpp | 14 ++++++++------ src/REAXFF/reaxff_control.cpp | 16 +++++++++------- src/REAXFF/reaxff_ffield.cpp | 6 ++++-- 10 files changed, 73 insertions(+), 43 deletions(-) diff --git a/src/EXTRA-FIX/fix_ttm.cpp b/src/EXTRA-FIX/fix_ttm.cpp index 13fbd4aff4..4c0d2e9cd5 100644 --- a/src/EXTRA-FIX/fix_ttm.cpp +++ b/src/EXTRA-FIX/fix_ttm.cpp @@ -46,6 +46,18 @@ using namespace FixConst; static constexpr int OFFSET = 16384; static constexpr double SHIFT = 0.0; +// helper class + +namespace { + class parser_error : public std::exception { + std::string message; + + public: + parser_error(const std::string &mesg) { message = mesg; } + const char *what() const noexcept { return message.c_str(); } + }; +} + /* ---------------------------------------------------------------------- */ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) : diff --git a/src/EXTRA-FIX/fix_ttm.h b/src/EXTRA-FIX/fix_ttm.h index 1a2e9fb24a..da782b1f5a 100644 --- a/src/EXTRA-FIX/fix_ttm.h +++ b/src/EXTRA-FIX/fix_ttm.h @@ -77,14 +77,6 @@ class FixTTM : public Fix { virtual void deallocate_grid(); virtual void read_electron_temperatures(const std::string &); virtual void write_electron_temperatures(const std::string &); - - class parser_error : public std::exception { - std::string message; - - public: - parser_error(const std::string &mesg) { message = mesg; } - const char *what() const noexcept { return message.c_str(); } - }; }; } // namespace LAMMPS_NS diff --git a/src/EXTRA-FIX/fix_ttm_grid.cpp b/src/EXTRA-FIX/fix_ttm_grid.cpp index 7b3f434907..b42b876a3b 100644 --- a/src/EXTRA-FIX/fix_ttm_grid.cpp +++ b/src/EXTRA-FIX/fix_ttm_grid.cpp @@ -41,6 +41,18 @@ static constexpr int MAXLINE = 256; static constexpr int CHUNK = 1024; static constexpr int OFFSET = 16384; +// helper class + +namespace { + class parser_error : public std::exception { + std::string message; + + public: + parser_error(const std::string &mesg) { message = mesg; } + const char *what() const noexcept { return message.c_str(); } + }; +} + /* ---------------------------------------------------------------------- */ FixTTMGrid::FixTTMGrid(LAMMPS *lmp, int narg, char **arg) : diff --git a/src/EXTRA-FIX/fix_ttm_mod.cpp b/src/EXTRA-FIX/fix_ttm_mod.cpp index 0aef2ec4ff..d39d50c9e5 100644 --- a/src/EXTRA-FIX/fix_ttm_mod.cpp +++ b/src/EXTRA-FIX/fix_ttm_mod.cpp @@ -41,6 +41,18 @@ using namespace LAMMPS_NS; using namespace FixConst; using namespace MathConst; +// helper class + +namespace { + class parser_error : public std::exception { + std::string message; + + public: + parser_error(const std::string &mesg) { message = mesg; } + const char *what() const noexcept { return message.c_str(); } + }; +} + // OFFSET avoids outside-of-box atoms being rounded to grid pts incorrectly // SHIFT = 0.0 assigns atoms to lower-left grid pt // SHIFT = 0.5 assigns atoms to nearest grid pt diff --git a/src/EXTRA-FIX/fix_ttm_mod.h b/src/EXTRA-FIX/fix_ttm_mod.h index f26f270e7a..21eb0efcaa 100644 --- a/src/EXTRA-FIX/fix_ttm_mod.h +++ b/src/EXTRA-FIX/fix_ttm_mod.h @@ -87,14 +87,6 @@ class FixTTMMod : public Fix { void read_parameters(const std::string &); void read_electron_temperatures(const std::string &); void write_electron_temperatures(const std::string &); - - class parser_error : public std::exception { - std::string message; - - public: - parser_error(const std::string &mesg) { message = mesg; } - const char *what() const noexcept { return message.c_str(); } - }; }; } // namespace LAMMPS_NS diff --git a/src/QEQ/fix_qeq.cpp b/src/QEQ/fix_qeq.cpp index 79205f7c81..b43afb00d6 100644 --- a/src/QEQ/fix_qeq.cpp +++ b/src/QEQ/fix_qeq.cpp @@ -42,12 +42,14 @@ using namespace FixConst; #define MAXLINE 1024 -class parser_error : public std::exception { - std::string message; -public: - parser_error(const std::string &mesg) { message = mesg; } - const char *what() const noexcept { return message.c_str(); } -}; +namespace { + class parser_error : public std::exception { + std::string message; + public: + parser_error(const std::string &mesg) { message = mesg; } + const char *what() const noexcept { return message.c_str(); } + }; +} /* ---------------------------------------------------------------------- */ diff --git a/src/REAXFF/fix_acks2_reaxff.cpp b/src/REAXFF/fix_acks2_reaxff.cpp index f19b31f9ed..ec14ed72b2 100644 --- a/src/REAXFF/fix_acks2_reaxff.cpp +++ b/src/REAXFF/fix_acks2_reaxff.cpp @@ -43,12 +43,14 @@ using namespace LAMMPS_NS; using namespace FixConst; -class parser_error : public std::exception { - std::string message; -public: - parser_error(const std::string &mesg) { message = mesg; } - const char *what() const noexcept { return message.c_str(); } -}; +namespace { + class parser_error : public std::exception { + std::string message; + public: + parser_error(const std::string &mesg) { message = mesg; } + const char *what() const noexcept { return message.c_str(); } + }; +} static const char cite_fix_acks2_reax[] = "fix acks2/reaxff command:\n\n" diff --git a/src/REAXFF/fix_qeq_reaxff.cpp b/src/REAXFF/fix_qeq_reaxff.cpp index f0ba651a26..89ee3f338f 100644 --- a/src/REAXFF/fix_qeq_reaxff.cpp +++ b/src/REAXFF/fix_qeq_reaxff.cpp @@ -49,12 +49,14 @@ using namespace LAMMPS_NS; using namespace FixConst; -class parser_error : public std::exception { - std::string message; -public: - parser_error(const std::string &mesg) { message = mesg; } - const char *what() const noexcept { return message.c_str(); } -}; +namespace { + class parser_error : public std::exception { + std::string message; + public: + parser_error(const std::string &mesg) { message = mesg; } + const char *what() const noexcept { return message.c_str(); } + }; +} static constexpr double EV_TO_KCAL_PER_MOL = 14.4; static constexpr double SMALL = 1.0e-14; diff --git a/src/REAXFF/reaxff_control.cpp b/src/REAXFF/reaxff_control.cpp index 2020e8a5c3..90f12b2031 100644 --- a/src/REAXFF/reaxff_control.cpp +++ b/src/REAXFF/reaxff_control.cpp @@ -40,6 +40,15 @@ using LAMMPS_NS::utils::sfgets; using LAMMPS_NS::utils::logmesg; using LAMMPS_NS::ValueTokenizer; +namespace { + class parser_error : public std::exception { + std::string message; + public: + parser_error(const std::string &mesg) { message = mesg; } + const char *what() const noexcept { return message.c_str(); } + }; +} + namespace ReaxFF { static std::unordered_set inactive_keywords = { "ensemble_type", "nsteps", "dt", "proc_by_dim", "random_vel", @@ -54,13 +63,6 @@ namespace ReaxFF { "energy_update_freq", "atom_info", "atom_velocities", "atom_forces", "bond_info", "angle_info" }; - class parser_error : public std::exception { - std::string message; - public: - parser_error(const std::string &mesg) { message = mesg; } - const char *what() const noexcept { return message.c_str(); } - }; - // NOTE: this function is run on MPI rank 0 only void Read_Control_File(const char *control_file, control_params *control) diff --git a/src/REAXFF/reaxff_ffield.cpp b/src/REAXFF/reaxff_ffield.cpp index 605e077724..db4a63972e 100644 --- a/src/REAXFF/reaxff_ffield.cpp +++ b/src/REAXFF/reaxff_ffield.cpp @@ -41,14 +41,16 @@ using LAMMPS_NS::utils::open_potential; using LAMMPS_NS::utils::getsyserror; using LAMMPS_NS::utils::uppercase; -namespace ReaxFF { - +namespace { class parser_error : public std::exception { std::string message; public: parser_error(const std::string &mesg) { message = mesg; } const char *what() const noexcept { return message.c_str(); } }; +} + +namespace ReaxFF { void Read_Force_Field(const char *filename, reax_interaction *reax, control_params *control, MPI_Comm world) From 6f14cbf16737a2c9e4d1ddd7cabe9ae99d9480b2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Oct 2021 16:32:02 -0400 Subject: [PATCH 30/70] Small adjustments for compiling within VS --- cmake/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index c14bb16812..60b95dbb62 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -300,10 +300,12 @@ else() target_link_libraries(lmp PRIVATE mpi_stubs) target_include_directories(lmp INTERFACE $) target_compile_definitions(lmp INTERFACE $) - endif(MSVC) + endif() target_include_directories(lammps INTERFACE $) target_compile_definitions(lammps INTERFACE $) else() + target_include_directories(lammps INTERFACE $) + target_compile_definitions(lammps INTERFACE $) target_link_libraries(lammps PUBLIC mpi_stubs) endif() add_library(MPI::MPI_CXX ALIAS mpi_stubs) From 8a9117d511825b798204ed5912bac573959b30d1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Oct 2021 16:32:16 -0400 Subject: [PATCH 31/70] add configurations for intel compilers --- cmake/CMakeSettings.json | 56 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/cmake/CMakeSettings.json b/cmake/CMakeSettings.json index 7292649afe..ee4b3c46d5 100644 --- a/cmake/CMakeSettings.json +++ b/cmake/CMakeSettings.json @@ -50,6 +50,62 @@ "type": "BOOL" } ] + }, + { + "name": "x64-Debug-OneAPI", + "generator": "Ninja", + "configurationType": "Debug", + "buildRoot": "${workspaceRoot}\\build\\${name}", + "installRoot": "${workspaceRoot}\\install\\${name}", + "cmakeCommandArgs": "-S ${workspaceRoot}\\cmake -C ${workspaceRoot}\\cmake\\presets\\windows.cmake -DENABLE_TESTING=on -DCMAKE_CXX_COMPILER=icx -DCMAKE_C_COMPILER=icx -DBUILD_MPI=off", + "buildCommandArgs": "", + "ctestCommandArgs": "", + "inheritEnvironments": [ "msvc_x64_x64" ], + "variables": [ + { + "name": "BUILD_SHARED_LIBS", + "value": "True", + "type": "BOOL" + }, + { + "name": "BUILD_TOOLS", + "value": "True", + "type": "BOOL" + }, + { + "name": "LAMMPS_EXCEPTIONS", + "value": "True", + "type": "BOOL" + } + ] + }, + { + "name": "x64-Debug-Intel", + "generator": "Ninja", + "configurationType": "Debug", + "buildRoot": "${workspaceRoot}\\build\\${name}", + "installRoot": "${workspaceRoot}\\install\\${name}", + "cmakeCommandArgs": "-S ${workspaceRoot}\\cmake -C ${workspaceRoot}\\cmake\\presets\\windows.cmake -DENABLE_TESTING=off -DCMAKE_CXX_COMPILER=icl -DCMAKE_C_COMPILER=icl -DCMAKE_Fortran_COMPILER=ifort -DBUILD_MPI=off", + "buildCommandArgs": "", + "ctestCommandArgs": "", + "inheritEnvironments": [ "msvc_x64_x64" ], + "variables": [ + { + "name": "BUILD_SHARED_LIBS", + "value": "True", + "type": "BOOL" + }, + { + "name": "BUILD_TOOLS", + "value": "True", + "type": "BOOL" + }, + { + "name": "LAMMPS_EXCEPTIONS", + "value": "True", + "type": "BOOL" + } + ] } ] } \ No newline at end of file From 29a44e7065abfdba9aa06b32d6c675d63bf9098b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 23 Oct 2021 04:24:54 -0400 Subject: [PATCH 32/70] remove parser_error exception class ambiguity completely --- src/EXTRA-FIX/fix_ttm.cpp | 17 ++--------------- src/EXTRA-FIX/fix_ttm_grid.cpp | 16 ++-------------- src/EXTRA-FIX/fix_ttm_mod.cpp | 16 ++-------------- src/QEQ/fix_qeq.cpp | 12 ++++++------ src/REAXFF/fix_acks2_reaxff.cpp | 20 ++++++-------------- src/REAXFF/fix_qeq_reaxff.cpp | 17 +++++------------ src/REAXFF/reaxff_control.cpp | 23 +++++++++++------------ src/REAXFF/reaxff_ffield.cpp | 14 ++++++-------- src/tokenizer.h | 6 +++--- 9 files changed, 43 insertions(+), 98 deletions(-) diff --git a/src/EXTRA-FIX/fix_ttm.cpp b/src/EXTRA-FIX/fix_ttm.cpp index 4c0d2e9cd5..de4b0a4c7e 100644 --- a/src/EXTRA-FIX/fix_ttm.cpp +++ b/src/EXTRA-FIX/fix_ttm.cpp @@ -28,7 +28,6 @@ #include "random_mars.h" #include "respa.h" #include "potential_file_reader.h" -#include "tokenizer.h" #include "update.h" #include @@ -46,18 +45,6 @@ using namespace FixConst; static constexpr int OFFSET = 16384; static constexpr double SHIFT = 0.0; -// helper class - -namespace { - class parser_error : public std::exception { - std::string message; - - public: - parser_error(const std::string &mesg) { message = mesg; } - const char *what() const noexcept { return message.c_str(); } - }; -} - /* ---------------------------------------------------------------------- */ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) : @@ -503,10 +490,10 @@ void FixTTM::read_electron_temperatures(const std::string &filename) // check correctness of input data if ((ix < 0) || (ix >= nxgrid) || (iy < 0) || (iy >= nygrid) || (iz < 0) || (iz >= nzgrid)) - throw parser_error("Fix ttm invalid grid index in fix ttm grid file"); + throw TokenizerException("Fix ttm invalid grid index in fix ttm grid file",""); if (T_tmp < 0.0) - throw parser_error("Fix ttm electron temperatures must be > 0.0"); + throw TokenizerException("Fix ttm electron temperatures must be > 0.0",""); T_electron[iz][iy][ix] = T_tmp; T_initial_set[iz][iy][ix] = 1; diff --git a/src/EXTRA-FIX/fix_ttm_grid.cpp b/src/EXTRA-FIX/fix_ttm_grid.cpp index b42b876a3b..8890750818 100644 --- a/src/EXTRA-FIX/fix_ttm_grid.cpp +++ b/src/EXTRA-FIX/fix_ttm_grid.cpp @@ -41,18 +41,6 @@ static constexpr int MAXLINE = 256; static constexpr int CHUNK = 1024; static constexpr int OFFSET = 16384; -// helper class - -namespace { - class parser_error : public std::exception { - std::string message; - - public: - parser_error(const std::string &mesg) { message = mesg; } - const char *what() const noexcept { return message.c_str(); } - }; -} - /* ---------------------------------------------------------------------- */ FixTTMGrid::FixTTMGrid(LAMMPS *lmp, int narg, char **arg) : @@ -318,7 +306,7 @@ void FixTTMGrid::read_electron_temperatures(const std::string &filename) int iz = values.next_int(); if (ix < 0 || ix >= nxgrid || iy < 0 || iy >= nygrid || iz < 0 || iz >= nzgrid) - throw parser_error("Fix ttm/grid invalid grid index in input"); + throw TokenizerException("Fix ttm/grid invalid grid index in input",""); if (ix >= nxlo_in && ix <= nxhi_in && iy >= nylo_in && iy <= nyhi_in && iz >= nzlo_in && iz <= nzhi_in) { @@ -326,7 +314,7 @@ void FixTTMGrid::read_electron_temperatures(const std::string &filename) T_initial_set[iz][iy][ix] = 1; } } else { - throw parser_error("Incorrect format in fix ttm electron grid file"); + throw TokenizerException("Incorrect format in fix ttm electron grid file",""); } } catch (std::exception &e) { error->one(FLERR,e.what()); diff --git a/src/EXTRA-FIX/fix_ttm_mod.cpp b/src/EXTRA-FIX/fix_ttm_mod.cpp index d39d50c9e5..233f877e8c 100644 --- a/src/EXTRA-FIX/fix_ttm_mod.cpp +++ b/src/EXTRA-FIX/fix_ttm_mod.cpp @@ -41,18 +41,6 @@ using namespace LAMMPS_NS; using namespace FixConst; using namespace MathConst; -// helper class - -namespace { - class parser_error : public std::exception { - std::string message; - - public: - parser_error(const std::string &mesg) { message = mesg; } - const char *what() const noexcept { return message.c_str(); } - }; -} - // OFFSET avoids outside-of-box atoms being rounded to grid pts incorrectly // SHIFT = 0.0 assigns atoms to lower-left grid pt // SHIFT = 0.5 assigns atoms to nearest grid pt @@ -596,10 +584,10 @@ void FixTTMMod::read_electron_temperatures(const std::string &filename) // check correctness of input data if ((ix < 0) || (ix >= nxgrid) || (iy < 0) || (iy >= nygrid) || (iz < 0) || (iz >= nzgrid)) - throw parser_error("Fix ttm invalid grid index in fix ttm/mod grid file"); + throw TokenizerException("Fix ttm invalid grid index in fix ttm/mod grid file",""); if (T_tmp < 0.0) - throw parser_error("Fix ttm electron temperatures must be > 0.0"); + throw TokenizerException("Fix ttm electron temperatures must be > 0.0",""); T_electron[iz][iy][ix] = T_tmp; T_initial_set[iz][iy][ix] = 1; diff --git a/src/QEQ/fix_qeq.cpp b/src/QEQ/fix_qeq.cpp index b43afb00d6..5a4e4e4e7d 100644 --- a/src/QEQ/fix_qeq.cpp +++ b/src/QEQ/fix_qeq.cpp @@ -43,10 +43,10 @@ using namespace FixConst; #define MAXLINE 1024 namespace { - class parser_error : public std::exception { + class qeq_parser_error : public std::exception { std::string message; public: - parser_error(const std::string &mesg) { message = mesg; } + explicit qeq_parser_error(const std::string &mesg) { message = mesg; } const char *what() const noexcept { return message.c_str(); } }; } @@ -761,8 +761,8 @@ void FixQEq::read_file(char *file) FILE *fp = utils::open_potential(file,lmp,nullptr); if (fp == nullptr) - throw parser_error(fmt::format("Cannot open fix qeq parameter file {}:" - " {}", file,utils::getsyserror())); + throw qeq_parser_error(fmt::format("Cannot open fix qeq parameter file {}: {}", + file,utils::getsyserror())); TextFileReader reader(fp, "qeq parameter"); while (1) { @@ -770,12 +770,12 @@ void FixQEq::read_file(char *file) if (values.count() == 0) continue; if (values.count() < 6) - throw parser_error("Invalid qeq parameter file"); + throw qeq_parser_error("Invalid qeq parameter file"); auto word = values.next_string(); utils::bounds(FLERR,word,1,ntypes,nlo,nhi,nullptr); if ((nlo < 0) || (nhi < 0)) - throw parser_error("Invalid atom type range"); + throw qeq_parser_error(fmt::format("Invalid atom type range: {}",word)); val = values.next_double(); for (int n=nlo; n <= nhi; ++n) chi[n] = val; diff --git a/src/REAXFF/fix_acks2_reaxff.cpp b/src/REAXFF/fix_acks2_reaxff.cpp index ec14ed72b2..b6789b1b2e 100644 --- a/src/REAXFF/fix_acks2_reaxff.cpp +++ b/src/REAXFF/fix_acks2_reaxff.cpp @@ -43,15 +43,6 @@ using namespace LAMMPS_NS; using namespace FixConst; -namespace { - class parser_error : public std::exception { - std::string message; - public: - parser_error(const std::string &mesg) { message = mesg; } - const char *what() const noexcept { return message.c_str(); } - }; -} - static const char cite_fix_acks2_reax[] = "fix acks2/reaxff command:\n\n" "@Article{O'Hearn2020,\n" @@ -175,26 +166,27 @@ void FixACKS2ReaxFF::pertype_parameters(char *arg) const char *line = reader.next_line(); if (!line) - throw parser_error("Invalid parameter file for fix acks2/reaxff"); + throw TokenizerException("Invalid parameter file for fix acks2/reaxff",""); ValueTokenizer values(line); if (values.count() != 1) - throw parser_error("Fix acks2/reaxff: Incorrect format of parameter file"); + throw TokenizerException("Fix acks2/reaxff: Incorrect parameter file format",""); bond_softness = values.next_double(); for (int i = 1; i <= ntypes; i++) { const char *line = reader.next_line(); if (!line) - throw parser_error("Invalid parameter file for fix acks2/reaxff"); + throw TokenizerException("Fix acks2/reaxff: Incorrect parameter file format",""); ValueTokenizer values(line); if (values.count() != 5) - throw parser_error("Fix acks2/reaxff: Incorrect format of parameter file"); + throw TokenizerException("Fix acks2/reaxff: Incorrect parameter file format",""); int itype = values.next_int(); if ((itype < 1) || (itype > ntypes)) - throw parser_error("Fix acks2/reaxff: invalid atom type in parameter file"); + throw TokenizerException("Fix acks2/reaxff: invalid atom type in parameter file", + std::to_string(itype)); chi[itype] = values.next_double(); eta[itype] = values.next_double(); diff --git a/src/REAXFF/fix_qeq_reaxff.cpp b/src/REAXFF/fix_qeq_reaxff.cpp index 89ee3f338f..874a10bbae 100644 --- a/src/REAXFF/fix_qeq_reaxff.cpp +++ b/src/REAXFF/fix_qeq_reaxff.cpp @@ -45,19 +45,11 @@ #include #include #include +#include using namespace LAMMPS_NS; using namespace FixConst; -namespace { - class parser_error : public std::exception { - std::string message; - public: - parser_error(const std::string &mesg) { message = mesg; } - const char *what() const noexcept { return message.c_str(); } - }; -} - static constexpr double EV_TO_KCAL_PER_MOL = 14.4; static constexpr double SMALL = 1.0e-14; @@ -243,15 +235,16 @@ void FixQEqReaxFF::pertype_parameters(char *arg) for (int i = 1; i <= ntypes; i++) { const char *line = reader.next_line(); if (!line) - throw parser_error("Invalid param file for fix qeq/reaxff"); + throw TokenizerException("Fix qeq/reaxff: Invalid param file format",""); ValueTokenizer values(line); if (values.count() != 4) - throw parser_error("Fix qeq/reaxff: Incorrect format of param file"); + throw TokenizerException("Fix qeq/reaxff: Incorrect format of param file",""); int itype = values.next_int(); if ((itype < 1) || (itype > ntypes)) - throw parser_error("Fix qeq/reaxff: invalid atom type in param file"); + throw TokenizerException("Fix qeq/reaxff: invalid atom type in param file", + std::to_string(itype)); chi[itype] = values.next_double(); eta[itype] = values.next_double(); diff --git a/src/REAXFF/reaxff_control.cpp b/src/REAXFF/reaxff_control.cpp index 90f12b2031..a95ec1d4ac 100644 --- a/src/REAXFF/reaxff_control.cpp +++ b/src/REAXFF/reaxff_control.cpp @@ -40,15 +40,6 @@ using LAMMPS_NS::utils::sfgets; using LAMMPS_NS::utils::logmesg; using LAMMPS_NS::ValueTokenizer; -namespace { - class parser_error : public std::exception { - std::string message; - public: - parser_error(const std::string &mesg) { message = mesg; } - const char *what() const noexcept { return message.c_str(); } - }; -} - namespace ReaxFF { static std::unordered_set inactive_keywords = { "ensemble_type", "nsteps", "dt", "proc_by_dim", "random_vel", @@ -63,6 +54,15 @@ namespace ReaxFF { "energy_update_freq", "atom_info", "atom_velocities", "atom_forces", "bond_info", "angle_info" }; + class control_parser_error : public std::exception { + std::string message; + public: + explicit control_parser_error(const std::string &format, const std::string &keyword) { + message = fmt::format(format, keyword); + } + const char *what() const noexcept { return message.c_str(); } + }; + // NOTE: this function is run on MPI rank 0 only void Read_Control_File(const char *control_file, control_params *control) @@ -92,7 +92,7 @@ namespace ReaxFF { auto keyword = values.next_string(); if (!values.has_next()) - throw parser_error(fmt::format("No value(s) for control parameter: {}\n",keyword)); + throw control_parser_error("No value(s) for control parameter: {}\n", keyword); if (inactive_keywords.find(keyword) != inactive_keywords.end()) { error->warning(FLERR,fmt::format("Ignoring inactive control " @@ -114,8 +114,7 @@ namespace ReaxFF { error->warning(FLERR,"Support for writing native trajectories has " "been removed after LAMMPS version 8 April 2021"); } else { - throw parser_error(fmt::format("Unknown parameter {} in " - "control file", keyword)); + throw control_parser_error("Unknown parameter {} in control file", keyword); } } } catch (LAMMPS_NS::EOFException &) { diff --git a/src/REAXFF/reaxff_ffield.cpp b/src/REAXFF/reaxff_ffield.cpp index db4a63972e..34db1c232d 100644 --- a/src/REAXFF/reaxff_ffield.cpp +++ b/src/REAXFF/reaxff_ffield.cpp @@ -41,16 +41,14 @@ using LAMMPS_NS::utils::open_potential; using LAMMPS_NS::utils::getsyserror; using LAMMPS_NS::utils::uppercase; -namespace { - class parser_error : public std::exception { +namespace ReaxFF { + + class ffield_parser_error : public std::exception { std::string message; public: - parser_error(const std::string &mesg) { message = mesg; } + explicit ffield_parser_error(const std::string &mesg) { message = mesg; } const char *what() const noexcept { return message.c_str(); } }; -} - -namespace ReaxFF { void Read_Force_Field(const char *filename, reax_interaction *reax, control_params *control, MPI_Comm world) @@ -63,7 +61,7 @@ namespace ReaxFF { // read and parse the force field only on rank 0 #define THROW_ERROR(txt) \ - throw parser_error(fmt::format("{}:{}: {}",filename,lineno,txt)) + throw ffield_parser_error(fmt::format("{}:{}: {}",filename,lineno,txt)) if (control->me == 0) { FILE *fp = LAMMPS_NS::utils::open_potential(filename, lmp, nullptr); @@ -165,7 +163,7 @@ namespace ReaxFF { // copy element symbol in uppercase and truncate stored element symbol if necessary auto element = uppercase(values.next_string()); - strncpy(sbp[i].name,element.c_str(),4); + strncpy(sbp[i].name,element.c_str(),3); sbp[i].name[3] = '\0'; sbp[i].r_s = values.next_double(); diff --git a/src/tokenizer.h b/src/tokenizer.h index 247afd0240..060e1bf6e3 100644 --- a/src/tokenizer.h +++ b/src/tokenizer.h @@ -60,7 +60,7 @@ class TokenizerException : public std::exception { * * \param msg String with error message * \param token String of the token/word that caused the error */ - TokenizerException(const std::string &msg, const std::string &token); + explicit TokenizerException(const std::string &msg, const std::string &token); ~TokenizerException() noexcept {} @@ -74,7 +74,7 @@ class InvalidIntegerException : public TokenizerException { /** Thrown during converting string to integer number * * \param token String of the token/word that caused the error */ - InvalidIntegerException(const std::string &token) : + explicit InvalidIntegerException(const std::string &token) : TokenizerException("Not a valid integer number", token) { } @@ -85,7 +85,7 @@ class InvalidFloatException : public TokenizerException { /** Thrown during converting string to floating point number * * \param token String of the token/word that caused the error */ - InvalidFloatException(const std::string &token) : + explicit InvalidFloatException(const std::string &token) : TokenizerException("Not a valid floating-point number", token) { } From a9c6f943e1def3abc01b292ab41abd25ff119445 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Nov 2021 22:47:26 -0400 Subject: [PATCH 33/70] correct test comparisons --- unittest/commands/test_simple_commands.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/unittest/commands/test_simple_commands.cpp b/unittest/commands/test_simple_commands.cpp index 4d68b54c21..1844752d33 100644 --- a/unittest/commands/test_simple_commands.cpp +++ b/unittest/commands/test_simple_commands.cpp @@ -431,8 +431,7 @@ TEST_F(SimpleCommandsTest, Plugin) lmp->input->one("plugin unload pair nve2"); text = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << text; - ASSERT_THAT(text, MatchesRegex(".*Ignoring unload of pair style nve2: " - "not loaded from a plugin.*")); + ASSERT_THAT(text, MatchesRegex(".*Ignoring unload of pair style nve2: not from a plugin.*")); ::testing::internal::CaptureStdout(); lmp->input->one("plugin unload fix nve2"); @@ -444,8 +443,7 @@ TEST_F(SimpleCommandsTest, Plugin) lmp->input->one("plugin unload fix nve"); text = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << text; - ASSERT_THAT(text, MatchesRegex(".*Ignoring unload of fix style nve: " - "not loaded from a plugin.*")); + ASSERT_THAT(text, MatchesRegex(".*Ignoring unload of fix style nve: not from a plugin.*")); ::testing::internal::CaptureStdout(); lmp->input->one("plugin list"); From 50f39cd752f7469cdbc46849a0aaf8a4dd8abf6f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 3 Nov 2021 10:53:10 -0400 Subject: [PATCH 34/70] implement and use a platform neutral abstraction of unsetenv(3) --- doc/src/Developer_platform.rst | 3 +++ src/platform.cpp | 24 +++++++++++++++++++++--- src/platform.h | 7 +++++++ unittest/cplusplus/test_lammps_class.cpp | 6 +----- unittest/utils/test_platform.cpp | 10 +++++++++- 5 files changed, 41 insertions(+), 9 deletions(-) diff --git a/doc/src/Developer_platform.rst b/doc/src/Developer_platform.rst index c9ecd30cec..cdc4bb6770 100644 --- a/doc/src/Developer_platform.rst +++ b/doc/src/Developer_platform.rst @@ -118,6 +118,9 @@ Environment variable functions .. doxygenfunction:: putenv :project: progguide +.. doxygenfunction:: unsetenv + :project: progguide + .. doxygenfunction:: list_pathenv :project: progguide diff --git a/src/platform.cpp b/src/platform.cpp index c701c37a80..708a42be8a 100644 --- a/src/platform.cpp +++ b/src/platform.cpp @@ -446,11 +446,11 @@ int platform::putenv(const std::string &vardef) auto found = vardef.find_first_of('='); #ifdef _WIN32 - // must assign a value to variable with _putenv() + // must assign a value to variable with _putenv_s() if (found == std::string::npos) - return _putenv(utils::strdup(vardef + "=1")); + return _putenv_s(vardef.c_str(), "1"); else - return _putenv(utils::strdup(vardef)); + return _putenv_s(vardef.substr(0, found).c_str(), vardef.substr(found+1).c_str()); #else if (found == std::string::npos) return setenv(vardef.c_str(), "", 1); @@ -460,6 +460,24 @@ int platform::putenv(const std::string &vardef) return -1; } +/* ---------------------------------------------------------------------- + unset environment variable +------------------------------------------------------------------------- */ + +int platform::unsetenv(const std::string &variable) +{ + if (variable.size() == 0) return -1; +#ifdef _WIN32 + // emulate POSIX semantics by returning -1 on trying to unset non-existing variable + const char *ptr = getenv(variable.c_str()); + if (!ptr) return -1; + // empty _putenv_s() definition deletes variable + return _putenv_s(variable.c_str(),""); +#else + return ::unsetenv(variable.c_str()); +#endif +} + /* ---------------------------------------------------------------------- split a "path" environment variable into a list ------------------------------------------------------------------------- */ diff --git a/src/platform.h b/src/platform.h index 95a0c3cc35..c079fd2cd1 100644 --- a/src/platform.h +++ b/src/platform.h @@ -125,6 +125,13 @@ namespace platform { int putenv(const std::string &vardef); + /*! Delete variable from the environment + * + * \param variable variable name + * \return -1 if failure otherwise 0 */ + + int unsetenv(const std::string &variable); + /*! Get list of entries in a path environment variable * * This provides a list of strings of the entries in an environment diff --git a/unittest/cplusplus/test_lammps_class.cpp b/unittest/cplusplus/test_lammps_class.cpp index 663c7358d9..3a1bde51ff 100644 --- a/unittest/cplusplus/test_lammps_class.cpp +++ b/unittest/cplusplus/test_lammps_class.cpp @@ -363,11 +363,7 @@ TEST(LAMMPS_init, NoOpenMP) FILE *fp = fopen("in.lammps_class_noomp", "w"); fputs("\n", fp); fclose(fp); -#if defined(__WIN32) - _putenv("OMP_NUM_THREADS"); -#else - unsetenv("OMP_NUM_THREADS"); -#endif + platform::unsetenv("OMP_NUM_THREADS"); const char *args[] = {"LAMMPS_init", "-in", "in.lammps_class_noomp", "-log", "none", "-nocite"}; char **argv = (char **)args; diff --git a/unittest/utils/test_platform.cpp b/unittest/utils/test_platform.cpp index 0f39534c31..ace546ba90 100644 --- a/unittest/utils/test_platform.cpp +++ b/unittest/utils/test_platform.cpp @@ -37,7 +37,7 @@ TEST(Platform, clock) ASSERT_GT(ct_used, 1e-4); } -TEST(Platform, putenv) +TEST(Platform, putenv_unsetenv) { const char *var = getenv("UNITTEST_VAR1"); ASSERT_EQ(var, nullptr); @@ -65,6 +65,14 @@ TEST(Platform, putenv) ASSERT_THAT(var, StrEq("one=two")); ASSERT_EQ(platform::putenv(""), -1); + + ASSERT_EQ(platform::unsetenv(""), -1); + ASSERT_EQ(platform::unsetenv("UNITTEST_VAR3=two"), -1); + var = getenv("UNITTEST_VAR1"); + ASSERT_NE(var, nullptr); + ASSERT_EQ(platform::unsetenv("UNITTEST_VAR1"), 0); + var = getenv("UNITTEST_VAR1"); + ASSERT_EQ(var, nullptr); } TEST(Platform, list_pathenv) From 1ad982aa853afdc3ad9b6db052943d44a1c9d35f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 3 Nov 2021 10:54:21 -0400 Subject: [PATCH 35/70] improve portability of unit test code for windows compilers --- unittest/force-styles/test_error_stats.cpp | 5 +++++ unittest/utils/test_math_eigen_impl.cpp | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/unittest/force-styles/test_error_stats.cpp b/unittest/force-styles/test_error_stats.cpp index 52ba3baae3..cadb4e7f2a 100644 --- a/unittest/force-styles/test_error_stats.cpp +++ b/unittest/force-styles/test_error_stats.cpp @@ -9,6 +9,11 @@ #include "fmtlib_format.cpp" #include "fmtlib_os.cpp" +// Windows may define this as a macro +#if defined(max) +#undef max +#endif + TEST(ErrorStats, test) { ErrorStats stats; diff --git a/unittest/utils/test_math_eigen_impl.cpp b/unittest/utils/test_math_eigen_impl.cpp index 895a35080c..47ca8d9cca 100644 --- a/unittest/utils/test_math_eigen_impl.cpp +++ b/unittest/utils/test_math_eigen_impl.cpp @@ -48,7 +48,7 @@ inline static bool SimilarVec(Vector a, Vector b, int n, Scalar eps = 1.0e-06, Scalar ratio = 1.0e-06, Scalar ratio_denom = 1.0) { for (int i = 0; i < n; i++) - if (not Similar(a[i], b[i], eps, ratio, ratio_denom)) return false; + if (! Similar(a[i], b[i], eps, ratio, ratio_denom)) return false; return true; } @@ -61,7 +61,7 @@ inline static bool SimilarVecUnsigned(Vector a, Vector b, int n, Scalar eps = 1. return true; else { for (int i = 0; i < n; i++) - if (not Similar(a[i], -b[i], eps, ratio, ratio_denom)) return false; + if (! Similar(a[i], -b[i], eps, ratio, ratio_denom)) return false; return true; } } From eb3f928f318e5207a07bf86e69ec913808f02978 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 3 Nov 2021 10:54:40 -0400 Subject: [PATCH 36/70] tweak epsilon for portability with windows --- unittest/force-styles/tests/atomic-pair-eim.yaml | 2 +- unittest/force-styles/tests/manybody-pair-meam.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unittest/force-styles/tests/atomic-pair-eim.yaml b/unittest/force-styles/tests/atomic-pair-eim.yaml index 4814029a3c..e705e88614 100644 --- a/unittest/force-styles/tests/atomic-pair-eim.yaml +++ b/unittest/force-styles/tests/atomic-pair-eim.yaml @@ -1,7 +1,7 @@ --- lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:09:02 2021 -epsilon: 1e-11 +epsilon: 2e-11 prerequisites: ! | pair eim pre_commands: ! "" diff --git a/unittest/force-styles/tests/manybody-pair-meam.yaml b/unittest/force-styles/tests/manybody-pair-meam.yaml index 4237f5ffc2..fed2a060cf 100644 --- a/unittest/force-styles/tests/manybody-pair-meam.yaml +++ b/unittest/force-styles/tests/manybody-pair-meam.yaml @@ -1,7 +1,7 @@ --- lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:09:15 2021 -epsilon: 7.5e-12 +epsilon: 1e-10 prerequisites: ! | pair meam pre_commands: ! | From b95e12bb6ca31d5fb7757778e1ac06c467e40078 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 3 Nov 2021 11:50:39 -0400 Subject: [PATCH 37/70] add additional function argument where we can supply our own CMakeLists.txt file --- cmake/Modules/ExternalCMakeProject.cmake | 15 +++++++++-- cmake/Modules/Packages/MSCG.cmake | 2 +- unittest/CMakeLists.txt | 2 +- unittest/force-styles/CMakeLists.libyaml | 33 ++++++++++++++++++++++++ unittest/force-styles/CMakeLists.txt | 6 ++--- 5 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 unittest/force-styles/CMakeLists.libyaml diff --git a/cmake/Modules/ExternalCMakeProject.cmake b/cmake/Modules/ExternalCMakeProject.cmake index d8138f9088..026e3c393b 100644 --- a/cmake/Modules/ExternalCMakeProject.cmake +++ b/cmake/Modules/ExternalCMakeProject.cmake @@ -2,7 +2,7 @@ # The sources will be unpacked to ${CMAKE_BINARY_DIR}/_deps/${target}-src # The binaries will be built in ${CMAKE_BINARY_DIR}/_deps/${target}-build # -function(ExternalCMakeProject target url hash basedir cmakedir) +function(ExternalCMakeProject target url hash basedir cmakedir cmakefile) # change settings locally set(BUILD_SHARED_LIBS OFF) set(CMAKE_POSITION_INDEPENDENT_CODE ON) @@ -23,6 +23,9 @@ function(ExternalCMakeProject target url hash basedir cmakedir) endif() file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/_deps/${target}-src) file(RENAME ${TARGET_SOURCE} ${CMAKE_BINARY_DIR}/_deps/${target}-src) + if(NOT (cmakefile STREQUAL "")) + file(COPY ${cmakefile} ${CMAKE_BINARY_DIR}/_deps/${target}-src/${cmakedir}/CMakeLists.txt) + endif() add_subdirectory("${CMAKE_BINARY_DIR}/_deps/${target}-src/${cmakedir}" "${CMAKE_BINARY_DIR}/_deps/${target}-build") else() @@ -30,6 +33,14 @@ function(ExternalCMakeProject target url hash basedir cmakedir) message(STATUS "Downloading ${url}") FetchContent_Declare(${target} URL ${url} URL_HASH MD5=${hash} SOURCE_SUBDIR ${cmakedir}) message(STATUS "Unpacking and configuring ${archive}") - FetchContent_MakeAvailable(${target}) + FetchContent_GetProperties(${target}) + FetchContent_Populate(${target}) + if(NOT (cmakefile STREQUAL "")) + file(COPY "${cmakefile}" DESTINATION "${${target}_SOURCE_DIR}/${cmakedir}/") + get_filename_component(_cmakefile "${cmakefile}" NAME) + file(RENAME "${${target}_SOURCE_DIR}/${cmakedir}/${_cmakefile}" + "${${target}_SOURCE_DIR}/${cmakedir}/CMakeLists.txt") + endif() + add_subdirectory("${${target}_SOURCE_DIR}/${cmakedir}" "${${target}_BINARY_DIR}") endif() endfunction(ExternalCMakeProject) diff --git a/cmake/Modules/Packages/MSCG.cmake b/cmake/Modules/Packages/MSCG.cmake index dbfe437f67..e4260e059e 100644 --- a/cmake/Modules/Packages/MSCG.cmake +++ b/cmake/Modules/Packages/MSCG.cmake @@ -13,7 +13,7 @@ if(DOWNLOAD_MSCG) mark_as_advanced(MSCG_MD5) include(ExternalCMakeProject) - ExternalCMakeProject(mscg ${MSCG_URL} ${MSCG_MD5} MSCG-release src/CMake) + ExternalCMakeProject(mscg ${MSCG_URL} ${MSCG_MD5} MSCG-release src/CMake "") # set include and link library target_include_directories(lammps PRIVATE "${CMAKE_BINARY_DIR}/_deps/mscg-src/src") diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index f6638b839e..be6d20c19a 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -12,7 +12,7 @@ mark_as_advanced(GTEST_MD5) set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) include(ExternalCMakeProject) -ExternalCMakeProject(googletest ${GTEST_URL} ${GTEST_MD5} googletest .) +ExternalCMakeProject(googletest ${GTEST_URL} ${GTEST_MD5} googletest . "") add_library(GTest::GTest ALIAS gtest) add_library(GTest::GMock ALIAS gmock) add_library(GTest::GTestMain ALIAS gtest_main) diff --git a/unittest/force-styles/CMakeLists.libyaml b/unittest/force-styles/CMakeLists.libyaml new file mode 100644 index 0000000000..c1f25f7e2c --- /dev/null +++ b/unittest/force-styles/CMakeLists.libyaml @@ -0,0 +1,33 @@ +# Custom CMake file for libyaml + +cmake_minimum_required(VERSION 3.10) +project(libyaml VERSION 0.2.5 + DESCRIPTION "LibYAML a YAML parser and emitter library" + LANGUAGES C + HOMEPAGE_URL https://pyyaml.org/wiki/LibYAML) + +# compilation settings and options +option(BUILD_SHARED_LIBS "Build libYAML as a shared library" OFF) +option(CMAKE_POSITION_INDEPENDENT_CODE "Create objects compatible with shared libraries" ON) + +include(GNUInstallDirs) + +add_library(yaml + src/api.c + src/dumper.c + src/emitter.c + src/loader.c + src/parser.c + src/reader.c + src/scanner.c + src/writer.c + ) + +set (YAML_VERSION_MAJOR ${libyaml_VERSION_MAJOR}) +set (YAML_VERSION_MINOR ${libyaml_VERSION_MINOR}) +set (YAML_VERSION_PATCH ${libyaml_VERSION_PATCH}) +set (YAML_VERSION_STRING "${YAML_VERSION_MAJOR}.${YAML_VERSION_MINOR}.${YAML_VERSION_PATCH}") + +configure_file(cmake/config.h.in config.h) +target_compile_definitions(yaml PRIVATE YAML_DECLARE_STATIC HAVE_CONFIG_H) +target_include_directories(yaml PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/unittest/force-styles/CMakeLists.txt b/unittest/force-styles/CMakeLists.txt index 6624993321..0ec8be68e1 100644 --- a/unittest/force-styles/CMakeLists.txt +++ b/unittest/force-styles/CMakeLists.txt @@ -1,14 +1,14 @@ find_package(YAML) if(NOT YAML_FOUND) - set(YAML_URL "https://github.com/akohlmey/libyaml/archive/refs/heads/new-cmake.tar.gz" CACHE STRING "URL for libyaml tarball") - set(YAML_MD5 "1683f5957a79d7a823e09575b0488df2" CACHE STRING "MD5 checksum of libyaml tarball") + set(YAML_URL "https://pyyaml.org/download/libyaml/yaml-0.2.5.tar.gz" CACHE STRING "URL for libyaml tarball") + set(YAML_MD5 "bb15429d8fb787e7d3f1c83ae129a999" CACHE STRING "MD5 checksum of libyaml tarball") mark_as_advanced(YAML_URL) mark_as_advanced(YAML_MD5) # download and build a local copy of libyaml include(ExternalCMakeProject) - ExternalCMakeProject(libyaml ${YAML_URL} ${YAML_MD5} libyaml .) + ExternalCMakeProject(libyaml ${YAML_URL} ${YAML_MD5} libyaml . CMakeLists.libyaml) add_library(Yaml::Yaml ALIAS yaml) endif() From 7f0b2334a55509ad219f41bf3034ff1eddf3f258 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 3 Nov 2021 11:52:32 -0400 Subject: [PATCH 38/70] update plugin loader test --- unittest/commands/test_simple_commands.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/unittest/commands/test_simple_commands.cpp b/unittest/commands/test_simple_commands.cpp index 0ad47f4e96..1844752d33 100644 --- a/unittest/commands/test_simple_commands.cpp +++ b/unittest/commands/test_simple_commands.cpp @@ -384,7 +384,12 @@ TEST_F(SimpleCommandsTest, Units) #if defined(LMP_PLUGIN) TEST_F(SimpleCommandsTest, Plugin) { - std::string loadfmt("plugin load {}plugin.so"); + const char *bindir = getenv("LAMMPS_PLUGIN_BIN_DIR"); + const char *config = getenv("CMAKE_CONFIG_TYPE"); + if (!bindir) GTEST_SKIP(); + std::string loadfmt = platform::path_join("plugin load ", bindir); + if (config) loadfmt = platform::path_join(loadfmt, config); + loadfmt = platform::path_join(loadfmt, "{}plugin.so"); ::testing::internal::CaptureStdout(); lmp->input->one(fmt::format(loadfmt, "hello")); auto text = ::testing::internal::GetCapturedStdout(); @@ -395,7 +400,7 @@ TEST_F(SimpleCommandsTest, Plugin) lmp->input->one(fmt::format(loadfmt, "xxx")); text = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << text; - ASSERT_THAT(text, MatchesRegex(".*Open of file xxx.* failed.*")); + ASSERT_THAT(text, MatchesRegex(".*Open of file .*xxx.* failed.*")); ::testing::internal::CaptureStdout(); lmp->input->one(fmt::format(loadfmt, "nve2")); @@ -426,8 +431,7 @@ TEST_F(SimpleCommandsTest, Plugin) lmp->input->one("plugin unload pair nve2"); text = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << text; - ASSERT_THAT(text, MatchesRegex(".*Ignoring unload of pair style nve2: " - "not loaded from a plugin.*")); + ASSERT_THAT(text, MatchesRegex(".*Ignoring unload of pair style nve2: not from a plugin.*")); ::testing::internal::CaptureStdout(); lmp->input->one("plugin unload fix nve2"); @@ -439,8 +443,7 @@ TEST_F(SimpleCommandsTest, Plugin) lmp->input->one("plugin unload fix nve"); text = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << text; - ASSERT_THAT(text, MatchesRegex(".*Ignoring unload of fix style nve: " - "not loaded from a plugin.*")); + ASSERT_THAT(text, MatchesRegex(".*Ignoring unload of fix style nve: not from a plugin.*")); ::testing::internal::CaptureStdout(); lmp->input->one("plugin list"); From b7bf60ea53b7e91180b5ab933f3b674be93f4861 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 3 Nov 2021 14:26:50 -0400 Subject: [PATCH 39/70] use the portable platform::unlink() instead of unlink() --- unittest/commands/test_variables.cpp | 6 +++--- unittest/formats/test_text_file_reader.cpp | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/unittest/commands/test_variables.cpp b/unittest/commands/test_variables.cpp index 4f603df5ac..86d880f22c 100644 --- a/unittest/commands/test_variables.cpp +++ b/unittest/commands/test_variables.cpp @@ -59,8 +59,8 @@ protected: void TearDown() override { LAMMPSTest::TearDown(); - unlink("test_variable.file"); - unlink("test_variable.atomfile"); + platform::unlink("test_variable.file"); + platform::unlink("test_variable.atomfile"); } void atomic_system() @@ -165,7 +165,7 @@ TEST_F(VariableTest, CreateDelete) fputs(" ", fp); fclose(fp); ASSERT_THAT(variable->retrieve("file"), StrEq("1")); - unlink("MYFILE"); + platform::unlink("MYFILE"); ASSERT_THAT(variable->retrieve("file"), StrEq("0")); BEGIN_HIDE_OUTPUT(); diff --git a/unittest/formats/test_text_file_reader.cpp b/unittest/formats/test_text_file_reader.cpp index f0f695ae54..36f1c8d87c 100644 --- a/unittest/formats/test_text_file_reader.cpp +++ b/unittest/formats/test_text_file_reader.cpp @@ -35,8 +35,8 @@ class TextFileReaderTest : public ::testing::Test { protected: void TearDown() override { - unlink("text_reader_one.file"); - unlink("text_reader_two.file"); + platform::unlink("text_reader_one.file"); + platform::unlink("text_reader_two.file"); } void test_files() @@ -73,7 +73,7 @@ TEST_F(TextFileReaderTest, permissions) chmod("text_reader_noperms.file", 0); ASSERT_THROW({ TextFileReader reader("text_reader_noperms.file", "test"); }, FileReaderException); - unlink("text_reader_noperms.file"); + platform::unlink("text_reader_noperms.file"); } TEST_F(TextFileReaderTest, nofp) From 37dfc9e1419d9b559a727ed0da2ec1f3e9d8256e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 3 Nov 2021 14:43:18 -0400 Subject: [PATCH 40/70] simplify by not trying to use fetchcontent but do all steps manually as it turns out, fetchcontent is calling external_project internally at some point which to avoid is why this function was started in the first place --- cmake/Modules/ExternalCMakeProject.cmake | 57 +++++++++--------------- 1 file changed, 22 insertions(+), 35 deletions(-) diff --git a/cmake/Modules/ExternalCMakeProject.cmake b/cmake/Modules/ExternalCMakeProject.cmake index 026e3c393b..fdccdee6fb 100644 --- a/cmake/Modules/ExternalCMakeProject.cmake +++ b/cmake/Modules/ExternalCMakeProject.cmake @@ -7,40 +7,27 @@ function(ExternalCMakeProject target url hash basedir cmakedir cmakefile) set(BUILD_SHARED_LIBS OFF) set(CMAKE_POSITION_INDEPENDENT_CODE ON) - if(CMAKE_VERSION VERSION_LESS 3.14) - get_filename_component(archive ${url} NAME) - file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/_deps/src) - message(STATUS "Downloading ${url}") - file(DOWNLOAD ${url} ${CMAKE_BINARY_DIR}/_deps/${archive} EXPECTED_HASH MD5=${hash} SHOW_PROGRESS) - message(STATUS "Unpacking and configuring ${archive}") - execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf ${CMAKE_BINARY_DIR}/_deps/${archive} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/_deps/src) - file(GLOB TARGET_SOURCE "${CMAKE_BINARY_DIR}/_deps/src/${basedir}*") - list(LENGTH TARGET_SOURCE _num) - if(_num GREATER 1) - message(FATAL_ERROR "Inconsistent ${target} library sources. " - "Please delete ${CMAKE_BINARY_DIR}/_deps/src and re-run cmake") - endif() - file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/_deps/${target}-src) - file(RENAME ${TARGET_SOURCE} ${CMAKE_BINARY_DIR}/_deps/${target}-src) - if(NOT (cmakefile STREQUAL "")) - file(COPY ${cmakefile} ${CMAKE_BINARY_DIR}/_deps/${target}-src/${cmakedir}/CMakeLists.txt) - endif() - add_subdirectory("${CMAKE_BINARY_DIR}/_deps/${target}-src/${cmakedir}" - "${CMAKE_BINARY_DIR}/_deps/${target}-build") - else() - include(FetchContent) - message(STATUS "Downloading ${url}") - FetchContent_Declare(${target} URL ${url} URL_HASH MD5=${hash} SOURCE_SUBDIR ${cmakedir}) - message(STATUS "Unpacking and configuring ${archive}") - FetchContent_GetProperties(${target}) - FetchContent_Populate(${target}) - if(NOT (cmakefile STREQUAL "")) - file(COPY "${cmakefile}" DESTINATION "${${target}_SOURCE_DIR}/${cmakedir}/") - get_filename_component(_cmakefile "${cmakefile}" NAME) - file(RENAME "${${target}_SOURCE_DIR}/${cmakedir}/${_cmakefile}" - "${${target}_SOURCE_DIR}/${cmakedir}/CMakeLists.txt") - endif() - add_subdirectory("${${target}_SOURCE_DIR}/${cmakedir}" "${${target}_BINARY_DIR}") + get_filename_component(archive ${url} NAME) + file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/_deps/src) + message(STATUS "Downloading ${url}") + file(DOWNLOAD ${url} ${CMAKE_BINARY_DIR}/_deps/${archive} EXPECTED_HASH MD5=${hash} SHOW_PROGRESS) + message(STATUS "Unpacking and configuring ${archive}") + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf ${CMAKE_BINARY_DIR}/_deps/${archive} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/_deps/src) + file(GLOB TARGET_SOURCE "${CMAKE_BINARY_DIR}/_deps/src/${basedir}*") + list(LENGTH TARGET_SOURCE _num) + if(_num GREATER 1) + message(FATAL_ERROR "Inconsistent ${target} library sources. " + "Please delete ${CMAKE_BINARY_DIR}/_deps/src and re-run cmake") endif() + file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/_deps/${target}-src) + file(RENAME ${TARGET_SOURCE} ${CMAKE_BINARY_DIR}/_deps/${target}-src) + if(NOT (cmakefile STREQUAL "")) + file(COPY ${cmakefile} DESTINATION ${CMAKE_BINARY_DIR}/_deps/${target}-src/${cmakedir}/) + get_filename_component(_cmakefile ${cmakefile} NAME) + file(RENAME "${CMAKE_BINARY_DIR}/_deps/${target}-src/${cmakedir}/${_cmakefile}" + "${CMAKE_BINARY_DIR}/_deps/${target}-src/${cmakedir}/CMakeLists.txt") + endif() + add_subdirectory("${CMAKE_BINARY_DIR}/_deps/${target}-src/${cmakedir}" + "${CMAKE_BINARY_DIR}/_deps/${target}-build") endfunction(ExternalCMakeProject) From 62fc7b6fa0194923d2c18ade4bad36093748353a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 3 Nov 2021 14:44:16 -0400 Subject: [PATCH 41/70] small tweaks to make replacing the CMakeLists.txt file work as expected --- unittest/force-styles/CMakeLists.libyaml | 15 ++++++++------- unittest/force-styles/CMakeLists.txt | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/unittest/force-styles/CMakeLists.libyaml b/unittest/force-styles/CMakeLists.libyaml index c1f25f7e2c..51e8589f7b 100644 --- a/unittest/force-styles/CMakeLists.libyaml +++ b/unittest/force-styles/CMakeLists.libyaml @@ -1,4 +1,4 @@ -# Custom CMake file for libyaml +# Custom minimal -*- CMake -*- file for libyaml cmake_minimum_required(VERSION 3.10) project(libyaml VERSION 0.2.5 @@ -23,11 +23,12 @@ add_library(yaml src/writer.c ) -set (YAML_VERSION_MAJOR ${libyaml_VERSION_MAJOR}) -set (YAML_VERSION_MINOR ${libyaml_VERSION_MINOR}) -set (YAML_VERSION_PATCH ${libyaml_VERSION_PATCH}) -set (YAML_VERSION_STRING "${YAML_VERSION_MAJOR}.${YAML_VERSION_MINOR}.${YAML_VERSION_PATCH}") - -configure_file(cmake/config.h.in config.h) +set(YAML_VERSION_STRING "${YAML_VERSION_MAJOR}.${YAML_VERSION_MINOR}.${YAML_VERSION_PATCH}") +set(CONFIG_H_FILE "#ifndef LIBYAML_CONFIG_H\n#define LIBYAML_CONFIG_H\n") +set(CONFIG_H_FILE "${CONFIG_H_FILE}#define YAML_VERSION_MAJOR ${libyaml_VERSION_MAJOR}\n") +set(CONFIG_H_FILE "${CONFIG_H_FILE}#define YAML_VERSION_MINOR ${libyaml_VERSION_MINOR}\n") +set(CONFIG_H_FILE "${CONFIG_H_FILE}#define YAML_VERSION_PATCH ${libyaml_VERSION_PATCH}\n") +set(CONFIG_H_FILE "${CONFIG_H_FILE}#define YAML_VERSION_STRING \"${libyaml_VERSION_MAJOR}.${libyaml_VERSION_MINOR}.${libyaml_VERSION_PATCH}\"\n#endif\n") +file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/include/config.h "${CONFIG_H_FILE}") target_compile_definitions(yaml PRIVATE YAML_DECLARE_STATIC HAVE_CONFIG_H) target_include_directories(yaml PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/unittest/force-styles/CMakeLists.txt b/unittest/force-styles/CMakeLists.txt index 0ec8be68e1..39730e6aeb 100644 --- a/unittest/force-styles/CMakeLists.txt +++ b/unittest/force-styles/CMakeLists.txt @@ -8,7 +8,7 @@ if(NOT YAML_FOUND) # download and build a local copy of libyaml include(ExternalCMakeProject) - ExternalCMakeProject(libyaml ${YAML_URL} ${YAML_MD5} libyaml . CMakeLists.libyaml) + ExternalCMakeProject(libyaml ${YAML_URL} ${YAML_MD5} yaml . CMakeLists.libyaml) add_library(Yaml::Yaml ALIAS yaml) endif() From 439f997a10d03c98f5253454e91493a59bce58ed Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 3 Nov 2021 14:54:38 -0400 Subject: [PATCH 42/70] skip test for file not readable due to permissions on windows --- unittest/formats/test_text_file_reader.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/unittest/formats/test_text_file_reader.cpp b/unittest/formats/test_text_file_reader.cpp index 36f1c8d87c..6fcc21fb33 100644 --- a/unittest/formats/test_text_file_reader.cpp +++ b/unittest/formats/test_text_file_reader.cpp @@ -65,9 +65,14 @@ TEST_F(TextFileReaderTest, nofile) FileReaderException); } +// this test cannot work on windows due to its non unix-like permission system + +#if !defined(_WIN32) TEST_F(TextFileReaderTest, permissions) { + platform::unlink("text_reader_noperms.file"); FILE *fp = fopen("text_reader_noperms.file", "w"); + ASSERT_NE(fp,nullptr); fputs("word\n", fp); fclose(fp); chmod("text_reader_noperms.file", 0); @@ -75,6 +80,7 @@ TEST_F(TextFileReaderTest, permissions) FileReaderException); platform::unlink("text_reader_noperms.file"); } +#endif TEST_F(TextFileReaderTest, nofp) { From 7c80911f66479b0f0e5b2cdec6a9702175d83645 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 3 Nov 2021 15:23:29 -0400 Subject: [PATCH 43/70] whitespace --- cmake/Modules/ExternalCMakeProject.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/Modules/ExternalCMakeProject.cmake b/cmake/Modules/ExternalCMakeProject.cmake index fdccdee6fb..855ce254c9 100644 --- a/cmake/Modules/ExternalCMakeProject.cmake +++ b/cmake/Modules/ExternalCMakeProject.cmake @@ -24,9 +24,9 @@ function(ExternalCMakeProject target url hash basedir cmakedir cmakefile) file(RENAME ${TARGET_SOURCE} ${CMAKE_BINARY_DIR}/_deps/${target}-src) if(NOT (cmakefile STREQUAL "")) file(COPY ${cmakefile} DESTINATION ${CMAKE_BINARY_DIR}/_deps/${target}-src/${cmakedir}/) - get_filename_component(_cmakefile ${cmakefile} NAME) + get_filename_component(_cmakefile ${cmakefile} NAME) file(RENAME "${CMAKE_BINARY_DIR}/_deps/${target}-src/${cmakedir}/${_cmakefile}" - "${CMAKE_BINARY_DIR}/_deps/${target}-src/${cmakedir}/CMakeLists.txt") + "${CMAKE_BINARY_DIR}/_deps/${target}-src/${cmakedir}/CMakeLists.txt") endif() add_subdirectory("${CMAKE_BINARY_DIR}/_deps/${target}-src/${cmakedir}" "${CMAKE_BINARY_DIR}/_deps/${target}-build") From 461a7afc2256fef7e41a6bcf128a7314d21e9efd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 4 Nov 2021 15:18:17 -0400 Subject: [PATCH 44/70] remove PYTHON from "most" cmake preset. The PYTHON package cannot be compiled without the python development support being installed, so it must not be in the "most" preset --- cmake/presets/most.cmake | 1 - 1 file changed, 1 deletion(-) diff --git a/cmake/presets/most.cmake b/cmake/presets/most.cmake index eb26b38928..27ce57621c 100644 --- a/cmake/presets/most.cmake +++ b/cmake/presets/most.cmake @@ -48,7 +48,6 @@ set(ALL_PACKAGES PHONON PLUGIN POEMS - PYTHON QEQ REACTION REAXFF From 825945f7839fdca4d610de9c53ef0b61b02af95c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 4 Nov 2021 15:18:39 -0400 Subject: [PATCH 45/70] mention that dump sorting is limited to less than 2 billion atoms --- doc/src/dump_modify.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/src/dump_modify.rst b/doc/src/dump_modify.rst index 33f7141762..3f0b99ded9 100644 --- a/doc/src/dump_modify.rst +++ b/doc/src/dump_modify.rst @@ -710,7 +710,9 @@ default and it can be disabled with the :code:`checksum` keyword. Restrictions """""""""""" - none + +*dump_modify sort* is not supported for dumps of groups containing +more than 2 billion atoms. Related commands """""""""""""""" From 8e89c7c654d28000d4e987ee379db0fd3f334f99 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 4 Nov 2021 15:19:22 -0400 Subject: [PATCH 46/70] correct unit description of eta_n0 parameters. fixes #3016 --- doc/src/pair_granular.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/pair_granular.rst b/doc/src/pair_granular.rst index b7f9da9f8b..6f84b0d9c7 100644 --- a/doc/src/pair_granular.rst +++ b/doc/src/pair_granular.rst @@ -205,7 +205,7 @@ For *damping mass_velocity*, the normal damping is given by: \eta_n = \eta_{n0} m_{eff} Here, :math:`\eta_{n0}` is the damping coefficient specified for the normal -contact model, in units of *mass*\ /\ *time* and +contact model, in units of 1/\ *time* and :math:`m_{eff} = m_i m_j/(m_i + m_j)` is the effective mass. Use *damping mass_velocity* to reproduce the damping behavior of *pair gran/hooke/\**. From 2cd862e4a21acfc3c91e5f6d3b6f81e5387f1621 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 4 Nov 2021 15:20:29 -0400 Subject: [PATCH 47/70] Update lebedeva potential file and docs based on email on mailing list https://matsci.org/t/lammps-users-webpage-and-parameter-file-for-the-lebedeva-potential/39059 --- doc/src/pair_lebedeva_z.rst | 51 +++++++++++++++---- doc/utils/sphinx-config/false_positives.txt | 3 ++ potentials/CC.Lebedeva | 11 ++-- .../tests/manybody-pair-lebedeva_z.yaml | 2 +- 4 files changed, 50 insertions(+), 17 deletions(-) diff --git a/doc/src/pair_lebedeva_z.rst b/doc/src/pair_lebedeva_z.rst index 5afd0da92c..5d8d3aa7fd 100644 --- a/doc/src/pair_lebedeva_z.rst +++ b/doc/src/pair_lebedeva_z.rst @@ -26,15 +26,29 @@ Examples Description """"""""""" -The *lebedeva/z* style computes the Lebedeva interaction -potential as described in :ref:`(Lebedeva et al.) `. An important simplification is made, -which is to take all normals along the z-axis. +The *lebedeva/z* pair style computes the Lebedeva interaction potential +as described in :ref:`(Lebedeva1) ` and :ref:`(Lebedeva2) +`. An important simplification is made, which is to take all +normals along the z-axis. + +The Lebedeva potential is intended for the description of the interlayer +interaction between graphene layers. To perform a realistic simulation, +this potential must be used in combination with an intralayer potential +such as :doc:`AIREBO ` or :doc:`Tersoff ` +facilitated by using pair style :doc:`hybrid/overlay `. To +keep the intralayer properties unaffected, the interlayer interaction +within the same layers should be avoided. This can be achieved by +assigning different atom types to atoms of different layers (e.g. 1 and +2 in the examples above). + +Other interactions can be set to zero using pair_style *none*\ . + .. math:: - E = & \frac{1}{2} \sum_i \sum_{i \neq j} V_{ij}\\ + E = & \frac{1}{2} \sum_i \sum_{j \neq i} V_{ij}\\ V_{ij} = & B e^{-\alpha(r_{ij} - z_0)} \\ - & + C(1 + D_1\rho^2_{ij} + D_2\rho^4_{ij} e^{-\lambda_1\rho^2_{ij}} e^{-\lambda_2 (z^2_{ij} - z^2_0)} \\ + & + C(1 + D_1\rho^2_{ij} + D_2\rho^4_{ij}) e^{-\lambda_1\rho^2_{ij}} e^{-\lambda_2 (z^2_{ij} - z^2_0)} \\ & - A \left(\frac{z_0}{r_ij}\right)^6 + A \left( \frac{z_0}{r_c} \right)^6 \\ \rho^2_{ij} = & x^2_{ij} + y^2_{ij} \qquad (\mathbf{n_i} \equiv \mathbf{\hat{z}}) @@ -43,12 +57,15 @@ Energies are shifted so that they go continuously to zero at the cutoff assuming that the exponential part of :math:`V_{ij}` (first term) decays sufficiently fast. This shift is achieved by the last term in the equation for :math:`V_{ij}` above. -The parameter file (e.g. CC.Lebedeva), is intended for use with metal -:doc:`units `, with energies in meV. An additional parameter, *S*, -is available to facilitate scaling of energies. +The provided parameter file (CC.Lebedeva) contains two sets of parameters. -This potential must be used in combination with hybrid/overlay. -Other interactions can be set to zero using pair_style *none*\ . +- The first set (element name "C") is suitable for normal conditions and + is taken from :ref:`(Popov1) ` +- The second set (element name "C1") is suitable for high-pressure + conditions and is taken from :ref:`(Koziol1) ` + +Both sets contain an additional parameter, *S*, that can be used to +facilitate scaling of energies and is set to 1.0 by default. Restrictions """""""""""" @@ -77,4 +94,16 @@ none .. _Leb01: -**(Lebedeva et al.)** I. V. Lebedeva, A. A. Knizhnik, A. M. Popov, Y. E. Lozovik, B. V. Potapkin, Phys. Rev. B, 84, 245437 (2011) +**(Lebedeva1)** I. V. Lebedeva, A. A. Knizhnik, A. M. Popov, Y. E. Lozovik, B. V. Potapkin, Phys. Rev. B, 84, 245437 (2011) + +.. _Leb02: + +**(Lebedeva2)** I. V. Lebedeva, A. A. Knizhnik, A. M. Popov, Y. E. Lozovik, B. V. Potapkin, Physica E: 44, 949-954 (2012) + +.. _Popov: + +**(Popov1)** A.M. Popov, I. V. Lebedeva, A. A. Knizhnik, Y. E. Lozovik and B. V. Potapkin, Chem. Phys. Lett. 536, 82-86 (2012). + +.. _Koziol: + +**(Koziol1)** Z. Koziol, G. Gawlik and J. Jagielski, Chinese Phys. B 28, 096101 (2019). diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index d295767519..826f5a6bd5 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -1125,6 +1125,7 @@ gaussian gaussians Gaussians Gavhane +Gawlik gayberne gcc gcmc @@ -1483,6 +1484,7 @@ Izz Jacobsen Jadhao Jadhav +Jagielski jagreat Jahn Jalalvand @@ -1609,6 +1611,7 @@ Koslowski Kosovan Koster Kosztin +Koziol Kp kradius Kraker diff --git a/potentials/CC.Lebedeva b/potentials/CC.Lebedeva index bc2db03f6b..bc70500687 100644 --- a/potentials/CC.Lebedeva +++ b/potentials/CC.Lebedeva @@ -1,12 +1,13 @@ -# DATE: 2018-11-28 UNITS: metal CONTRIBUTOR: Zbigniew Koziol softquake@gmail.com CITATION: Z. Koziol et al.: https://arxiv.org/abs/1803.05162 +# DATE: 2021-11-04 UNITS: metal CONTRIBUTOR: Zbigniew Koziol softquake@gmail.com CITATION: Z. Koziol et al.: https://arxiv.org/abs/1803.05162 # -# Lebedeva Potential. https://doi.org/10.1016/j.physe.2011.07.018 +# Lebedeva potential: https://doi.org/10.1039/C0CP02614J and https://doi.org/10.1016/j.physe.2011.07.018 # Parameters must be in this order as here, otherwise their values may be changed. +# Energies here are given in meV. # The last one, S, is convenient for scaling the potential amplitude. S is a multiplication factor for A, B, C # A B C z0 alpha D1 D2 lambda1 lambda2 S -# These are values according to Levedeva et al -#C C 10.510 11.6523.34 35.883 3.34 4.16 -0.86232 0.10049 0.48703 0.46445 1.0 +# These are values according to Lebedeva et al.: https://doi.org/10.1016/j.cplett.2012.03.082 +C C 10.510 11.652 29.5 3.34 4.16 -0.86232 0.10049 0.48703 0.46445 1.0 # # These are values by Z. Koziol et al.: https://arxiv.org/abs/1803.05162 -C C 14.558 21.204 1.8 3.198 4.16 -0.862 0.10049 0.6 0.4 1.0 +C1 C1 14.558 21.204 1.8 3.198 4.16 -0.862 0.10049 0.6 0.4 1.0 diff --git a/unittest/force-styles/tests/manybody-pair-lebedeva_z.yaml b/unittest/force-styles/tests/manybody-pair-lebedeva_z.yaml index 5caeee3dca..84b44bcb0a 100644 --- a/unittest/force-styles/tests/manybody-pair-lebedeva_z.yaml +++ b/unittest/force-styles/tests/manybody-pair-lebedeva_z.yaml @@ -14,7 +14,7 @@ post_commands: ! "" input_file: in.bilayer pair_style: hybrid/overlay lebedeva/z 16.0 pair_coeff: ! | - * * lebedeva/z CC.Lebedeva C C C + * * lebedeva/z CC.Lebedeva C1 C1 C1 extract: ! "" natoms: 48 init_vdwl: 2360.887727742073 From 1a940e052e970b065a4c6b44a98aa8b1e8914bf3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 4 Nov 2021 15:55:28 -0400 Subject: [PATCH 48/70] add support for and apply clang-format to lammps-shell code --- tools/lammps-shell/.clang-format | 1 + tools/lammps-shell/lammps-shell.cpp | 35 +++++++++++++---------------- 2 files changed, 16 insertions(+), 20 deletions(-) create mode 120000 tools/lammps-shell/.clang-format diff --git a/tools/lammps-shell/.clang-format b/tools/lammps-shell/.clang-format new file mode 120000 index 0000000000..a20dd6aac4 --- /dev/null +++ b/tools/lammps-shell/.clang-format @@ -0,0 +1 @@ +../../unittest/.clang-format \ No newline at end of file diff --git a/tools/lammps-shell/lammps-shell.cpp b/tools/lammps-shell/lammps-shell.cpp index d03e1da70b..19730b8552 100644 --- a/tools/lammps-shell/lammps-shell.cpp +++ b/tools/lammps-shell/lammps-shell.cpp @@ -10,8 +10,8 @@ #include "utils.h" #include -#include #include +#include #include #include @@ -33,9 +33,9 @@ using namespace LAMMPS_NS; -void *lmp = nullptr; -char *omp_threads = nullptr; -constexpr int BUFLEN = 512; +void *lmp = nullptr; +char *omp_threads = nullptr; +constexpr int BUFLEN = 512; char buf[BUFLEN]; enum { @@ -342,14 +342,13 @@ static char *plugin_generator(const char *text, int state) { const char *subcmd[] = {"load", "unload", "list", "clear", nullptr}; const char *sub; - static std::size_t idx=0, len; + static std::size_t idx = 0, len; if (!state) idx = 0; len = strlen(text); while ((sub = subcmd[idx]) != nullptr) { ++idx; - if (strncmp(text,sub,len) == 0) - return dupstring(sub); + if (strncmp(text, sub, len) == 0) return dupstring(sub); } return nullptr; } @@ -358,13 +357,12 @@ static char *plugin_style_generator(const char *text, int state) { const char *styles[] = {"pair", "fix", "command", nullptr}; const char *s; - static std::size_t idx=0, len; + static std::size_t idx = 0, len; if (!state) idx = 0; len = strlen(text); while ((s = styles[idx]) != nullptr) { ++idx; - if (strncmp(text,s,len) == 0) - return dupstring(s); + if (strncmp(text, s, len) == 0) return dupstring(s); } return nullptr; } @@ -376,7 +374,7 @@ static char *plugin_name_generator(const char *text, int state) static std::size_t idx, len, nmax; if (!state) idx = 0; - len = words[3].size(); + len = words[3].size(); nmax = lammps_plugin_count(); while (idx < nmax) { @@ -384,8 +382,7 @@ static char *plugin_name_generator(const char *text, int state) lammps_plugin_name(idx, style, name, BUFLEN); ++idx; if (words[2] == style) { - if (strncmp(name, words[3].c_str(), len) == 0) - return dupstring(name); + if (strncmp(name, words[3].c_str(), len) == 0) return dupstring(name); } } return nullptr; @@ -527,13 +524,11 @@ static char **cmd_completion(const char *text, int start, int) } else if (words.size() == 2) { // expand third word // these commands have a group name as 3rd word - if ((words[0] == "fix") - || (words[0] == "compute") - || (words[0] == "dump")) { + if ((words[0] == "fix") || (words[0] == "compute") || (words[0] == "dump")) { matches = rl_completion_matches(text, group_generator); } else if (words[0] == "region") { matches = rl_completion_matches(text, region_generator); - // plugin style is the third word + // plugin style is the third word } else if ((words[0] == "plugin") && (words[1] == "unload")) { matches = rl_completion_matches(text, plugin_style_generator); } @@ -546,7 +541,7 @@ static char **cmd_completion(const char *text, int start, int) matches = rl_completion_matches(text, compute_generator); } else if (words[0] == "dump") { matches = rl_completion_matches(text, dump_generator); - // plugin name is the fourth word + // plugin name is the fourth word } else if ((words[0] == "plugin") && (words[1] == "unload")) { matches = rl_completion_matches(rl_line_buffer, plugin_name_generator); } @@ -599,7 +594,7 @@ static void init_commands() // read saved history, but not in test mode. if (!test_mode) read_history(".lammps_history"); - // intercept CTRL-C + // intercept CTRL-C #if defined(_WIN32) SetConsoleCtrlHandler(ctrl_c_handler, TRUE); #else @@ -736,7 +731,7 @@ int main(int argc, char **argv) // switch to the user's documents directory. auto curdir = platform::current_directory(); - if (utils::strmatch(curdir,"[Ss]ystem32")) { + if (utils::strmatch(curdir, "[Ss]ystem32")) { std::string docdir = getenv("HOMEDRIVE"); docdir += getenv("HOMEPATH"); docdir += "\\Documents"; From 935c17f02e5dec0e3f32abb376cf42f1cb577c87 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 4 Nov 2021 16:32:21 -0400 Subject: [PATCH 49/70] Document multi-configuration build support in CMake --- doc/src/Build_cmake.rst | 36 +++++++++++++++++++++ doc/src/Build_windows.rst | 5 +++ doc/utils/sphinx-config/false_positives.txt | 2 ++ 3 files changed, 43 insertions(+) diff --git a/doc/src/Build_cmake.rst b/doc/src/Build_cmake.rst index 2a64bc3240..9bee18146c 100644 --- a/doc/src/Build_cmake.rst +++ b/doc/src/Build_cmake.rst @@ -150,6 +150,42 @@ for IDEs like Eclipse, CodeBlocks, or Kate can be selected using the *-G* command line flag. A list of available generator settings for your specific CMake version is given when running ``cmake --help``. +.. _cmake_multiconfig: + +Multi-configuration build systems +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Throughout this manual it is mostly assumed that LAMMPS is being built +on a Unix-like operating system with "make" as the underlying "builder", +since this is the most common case. In this case the build "configuration" +is chose using ``-D CMAKE_BUILD_TYPE=`` with ```` +being one of "Release", "Debug", "RelWithDebInfo", or "MinSizeRel". +Some build tools, however, can also use or even require to have a so-called +multi-configuration build system setup. For those the built type (or +configuration) is chosen at compile time using the same build files. E.g. +with: + +.. code-block:: bash + + cmake --build build-multi --config Release + +In that case the resulting binaries are not in the build folder directly +but in sub-directories corresponding to the build type (i.e. Release in +the example from above). Similarly, for running unit tests the +configuration is selected with the *-C* flag: + +.. code-block:: bash + + ctest -C Debug + +The CMake scripts in LAMMPS have basic support for being compiled using a +multi-config build system, but not all of it has been ported. This is in +particular applicable to compiling packages that require additional libraries +that would be downloaded and compiled by CMake. The "windows" preset file +tries to keep track of which packages can be compiled natively with the +MSVC compilers out-of-the box. Not all of those external libraries are +portable to Windows either. + Installing CMake ^^^^^^^^^^^^^^^^ diff --git a/doc/src/Build_windows.rst b/doc/src/Build_windows.rst index fa2296d302..4bb5cfec27 100644 --- a/doc/src/Build_windows.rst +++ b/doc/src/Build_windows.rst @@ -89,6 +89,11 @@ miss the correct master ``CMakeLists.txt``. Try to open the starting point. It is also possible to configure and compile LAMMPS from the command line with a CMake binary from `cmake.org `_. +Please note, that for either approach CMake will create a so-called +:ref:`"multi-configuration" build environment `, and +the command lines for building and testing LAMMPS must be adjusted +accordingly. + To support running in parallel you can compile with OpenMP enabled using the OPENMP package or install Microsoft MPI (including the SDK) and compile LAMMPS with MPI enabled. diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index d295767519..77e9df5a82 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -1995,6 +1995,7 @@ minimizer minimizers minneigh minorder +MinSizeRel minSteps mintcream Mintmire @@ -2784,6 +2785,7 @@ relink relres relTol relu +RelWithDebInfo remappings remd Ren From b3c5f6a4fd0ef45ad1aeca19c5835b4d11a66e08 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 4 Nov 2021 16:48:29 -0400 Subject: [PATCH 50/70] whitespace --- doc/src/pair_lebedeva_z.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/pair_lebedeva_z.rst b/doc/src/pair_lebedeva_z.rst index 5d8d3aa7fd..80fe1c52cb 100644 --- a/doc/src/pair_lebedeva_z.rst +++ b/doc/src/pair_lebedeva_z.rst @@ -102,8 +102,8 @@ none .. _Popov: -**(Popov1)** A.M. Popov, I. V. Lebedeva, A. A. Knizhnik, Y. E. Lozovik and B. V. Potapkin, Chem. Phys. Lett. 536, 82-86 (2012). +**(Popov1)** A.M. Popov, I. V. Lebedeva, A. A. Knizhnik, Y. E. Lozovik and B. V. Potapkin, Chem. Phys. Lett. 536, 82-86 (2012). .. _Koziol: -**(Koziol1)** Z. Koziol, G. Gawlik and J. Jagielski, Chinese Phys. B 28, 096101 (2019). +**(Koziol1)** Z. Koziol, G. Gawlik and J. Jagielski, Chinese Phys. B 28, 096101 (2019). From d1403c62c84e8cd76e2512558734b91c192aaa41 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 5 Nov 2021 10:56:54 -0400 Subject: [PATCH 51/70] update restrictions note for dump_modify --- doc/src/dump_modify.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/dump_modify.rst b/doc/src/dump_modify.rst index 3f0b99ded9..da7ccffeb2 100644 --- a/doc/src/dump_modify.rst +++ b/doc/src/dump_modify.rst @@ -711,8 +711,8 @@ default and it can be disabled with the :code:`checksum` keyword. Restrictions """""""""""" -*dump_modify sort* is not supported for dumps of groups containing -more than 2 billion atoms. +Not all *dump_modify* options can be applied to all dump styles. +Details are in the discussions of the individual options. Related commands """""""""""""""" From 49258e93017b3f009dbe3625fcaa67b1c3ed6224 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 5 Nov 2021 16:19:19 -0400 Subject: [PATCH 52/70] add missing assignment --- src/verlet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/verlet.cpp b/src/verlet.cpp index aa180f5644..342dc3d951 100644 --- a/src/verlet.cpp +++ b/src/verlet.cpp @@ -54,7 +54,7 @@ void Verlet::init() bool do_time_integrate = false; for (const auto &fix : modify->get_fix_list()) - if (fix->time_integrate) do_time_integrate; + if (fix->time_integrate) do_time_integrate = true; if (!do_time_integrate && (comm->me == 0)) error->warning(FLERR,"No fixes with time integration, atoms won't move"); From 7c5640c1c935e996c08a811b4638d9fd80cf05f2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 5 Nov 2021 16:27:58 -0400 Subject: [PATCH 53/70] we may call ->set_molecule() only in MOLECULE mode --- src/fix_deposit.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/fix_deposit.cpp b/src/fix_deposit.cpp index c18a0e23dd..034cecd55a 100644 --- a/src/fix_deposit.cpp +++ b/src/fix_deposit.cpp @@ -569,10 +569,12 @@ void FixDeposit::pre_exchange() // coord is new position of geometric center of mol, not COM // FixShake::set_molecule stores shake info for molecule - if (rigidflag) - fixrigid->set_molecule(nlocalprev,maxtag_all,imol,coord,vnew,quat); - else if (shakeflag) - fixshake->set_molecule(nlocalprev,maxtag_all,imol,coord,vnew,quat); + if (mode == MOLECULE) { + if (rigidflag) + fixrigid->set_molecule(nlocalprev,maxtag_all,imol,coord,vnew,quat); + else if (shakeflag) + fixshake->set_molecule(nlocalprev,maxtag_all,imol,coord,vnew,quat); + } success = 1; break; From 16c50b3873c1988f9aa70ffd1e29f8c62229fa3c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 7 Nov 2021 08:27:25 -0500 Subject: [PATCH 54/70] whitespace --- unittest/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index 46f1865989..f333da1e5c 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -7,7 +7,7 @@ add_test(NAME RunLammps COMMAND $ -log none -echo none -in in.empty WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(RunLammps PROPERTIES - ENVIRONMENT "TSAN_OPTIONS=ignore_noninstrumented_modules=1;HWLOC_HIDE_ERRORS=1" + ENVIRONMENT "TSAN_OPTIONS=ignore_noninstrumented_modules=1;HWLOC_HIDE_ERRORS=1" PASS_REGULAR_EXPRESSION "LAMMPS \\([0-9]+ [A-Za-z]+ 2[0-9][0-9][0-9]( - Update [0-9]+)?\\)") # check if the compiled executable will print the help message @@ -15,7 +15,7 @@ add_test(NAME HelpMessage COMMAND $ -h WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(HelpMessage PROPERTIES - ENVIRONMENT "TSAN_OPTIONS=ignore_noninstrumented_modules=1;HWLOC_HIDE_ERRORS=1" + ENVIRONMENT "TSAN_OPTIONS=ignore_noninstrumented_modules=1;HWLOC_HIDE_ERRORS=1" PASS_REGULAR_EXPRESSION ".*Large-scale Atomic/Molecular Massively Parallel Simulator -.*Usage example:.*") # check if the compiled executable will error out on an invalid command line flag @@ -23,7 +23,7 @@ add_test(NAME InvalidFlag COMMAND $ -xxx WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(InvalidFlag PROPERTIES - ENVIRONMENT "TSAN_OPTIONS=ignore_noninstrumented_modules=1;HWLOC_HIDE_ERRORS=1" + ENVIRONMENT "TSAN_OPTIONS=ignore_noninstrumented_modules=1;HWLOC_HIDE_ERRORS=1" PASS_REGULAR_EXPRESSION "ERROR: Invalid command-line argument.*") if(BUILD_MPI) From ac6654cf0c16f64b22b0da4c6ae2c04ad7b7881d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 7 Nov 2021 08:28:16 -0500 Subject: [PATCH 55/70] skip MPI tests if they would be oversubscribing the available processors --- unittest/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index f333da1e5c..55063d56c8 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -31,6 +31,10 @@ if(BUILD_MPI) set(MPI_TEST_NUM_PROCS 1) set(MPI_TEST_WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) cmake_parse_arguments(MPI_TEST "" "NAME;NUM_PROCS;WORKING_DIRECTORY" "COMMAND" ${ARGN}) + # Do not add test when oversubscribing + if(MPI_TEST_NUMPROCS GREATER MPIEXEC_MAX_NUMPROCS) + return() + endif() list(GET MPI_TEST_COMMAND 0 EXECUTABLE) list(REMOVE_AT MPI_TEST_COMMAND 0) set(ARGS ${MPI_TEST_COMMAND}) From 25db8a21bc8c58c7ec50f5acd79828733f421f5d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 7 Nov 2021 08:29:16 -0500 Subject: [PATCH 56/70] account for increased floating point errors when summing numbers to zero --- unittest/commands/test_groups.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unittest/commands/test_groups.cpp b/unittest/commands/test_groups.cpp index 0c8a7cd83c..52b93fe742 100644 --- a/unittest/commands/test_groups.cpp +++ b/unittest/commands/test_groups.cpp @@ -246,7 +246,7 @@ TEST_F(GroupTest, Molecular) ASSERT_DOUBLE_EQ(group->mass(group->find("half")), 40); ASSERT_DOUBLE_EQ(group->mass(group->find("half"), domain->find_region("top")), 10); ASSERT_NEAR(group->charge(group->find("top")), 0, 1.0e-14); - ASSERT_DOUBLE_EQ(group->charge(group->find("right"), domain->find_region("top")), 0); + ASSERT_NEAR(group->charge(group->find("right"), domain->find_region("top")), 0, 1.0e-14); TEST_FAILURE(".*ERROR: Illegal group command.*", command("group three include xxx");); } From 1c1cd60bafa3f7c3f3a6802577dd3647983551b2 Mon Sep 17 00:00:00 2001 From: yihengwuKP Date: Mon, 15 Nov 2021 18:21:17 -0600 Subject: [PATCH 57/70] Fix the indent and ot bugs in reorder_remd_traj.py --- tools/replica/reorder_remd_traj.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/replica/reorder_remd_traj.py b/tools/replica/reorder_remd_traj.py index 5033ae1e53..205e5a34f9 100644 --- a/tools/replica/reorder_remd_traj.py +++ b/tools/replica/reorder_remd_traj.py @@ -206,7 +206,7 @@ def get_byte_index(rep_inds, byteindfns, intrajfns): # close the trajfile object fobj.close() - return + return def write_reordered_traj(temp_inds, byte_inds, outtemps, temps, @@ -459,6 +459,8 @@ if __name__ == "__main__": # get (unordered) trajectories temps = np.loadtxt(tempfn) + if not out_temps: + out_temps = temps ntemps = len(temps) intrajfns = ["%s.%d.lammpstrj" % (traj_prefix, k) for k in range(ntemps)] # check if the trajs. (or their zipped versions are present) From ed8c86d248a9cecbc811e8f3d52b9b8f05f9187d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 16 Nov 2021 10:46:09 -0500 Subject: [PATCH 58/70] correct uninitialized data access bug due to shadowing of a base class member --- src/EXTRA-COMPUTE/compute_temp_rotate.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/EXTRA-COMPUTE/compute_temp_rotate.h b/src/EXTRA-COMPUTE/compute_temp_rotate.h index afa14000b8..af218e756c 100644 --- a/src/EXTRA-COMPUTE/compute_temp_rotate.h +++ b/src/EXTRA-COMPUTE/compute_temp_rotate.h @@ -43,7 +43,6 @@ class ComputeTempRotate : public Compute { double memory_usage(); private: - int fix_dof; double tfactor, masstotal; double **vbiasall; // stored velocity bias for all atoms int maxbias; // size of vbiasall array From d0a4c4467fadd5bf2eece128b8d9db91150de100 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 16 Nov 2021 13:53:52 -0500 Subject: [PATCH 59/70] replace replicated functionality with shared code in base class --- src/DRUDE/compute_temp_drude.cpp | 4 +--- src/DRUDE/compute_temp_drude.h | 1 - 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/DRUDE/compute_temp_drude.cpp b/src/DRUDE/compute_temp_drude.cpp index 940a7e5328..96344751a7 100644 --- a/src/DRUDE/compute_temp_drude.cpp +++ b/src/DRUDE/compute_temp_drude.cpp @@ -89,9 +89,7 @@ void ComputeTempDrude::dof_compute() int dim = domain->dimension; int *drudetype = fix_drude->drudetype; - fix_dof = 0; - for (int i = 0; i < modify->nfix; i++) - fix_dof += modify->fix[i]->dof(igroup); + adjust_dof_fix(); bigint dof_core_loc = 0, dof_drude_loc = 0; for (int i = 0; i < nlocal; i++) { diff --git a/src/DRUDE/compute_temp_drude.h b/src/DRUDE/compute_temp_drude.h index cef5d8664e..e1cd54edc8 100644 --- a/src/DRUDE/compute_temp_drude.h +++ b/src/DRUDE/compute_temp_drude.h @@ -35,7 +35,6 @@ class ComputeTempDrude : public Compute { int modify_param(int, char **); private: - int fix_dof; class FixDrude *fix_drude; char *id_temp; class Compute *temperature; From d576b69dbce405cf16958ad3775ef122607144c1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 16 Nov 2021 21:41:08 -0500 Subject: [PATCH 60/70] plug memory leaks --- src/MACHDYN/compute_smd_triangle_vertices.cpp | 2 +- src/MACHDYN/pair_smd_ulsph.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/MACHDYN/compute_smd_triangle_vertices.cpp b/src/MACHDYN/compute_smd_triangle_vertices.cpp index 016ae3e85f..89a2a24b89 100644 --- a/src/MACHDYN/compute_smd_triangle_vertices.cpp +++ b/src/MACHDYN/compute_smd_triangle_vertices.cpp @@ -53,7 +53,7 @@ ComputeSMDTriangleVertices::ComputeSMDTriangleVertices(LAMMPS *lmp, int narg, ch /* ---------------------------------------------------------------------- */ ComputeSMDTriangleVertices::~ComputeSMDTriangleVertices() { - memory->sfree(outputVector); + memory->destroy(outputVector); } /* ---------------------------------------------------------------------- */ diff --git a/src/MACHDYN/pair_smd_ulsph.cpp b/src/MACHDYN/pair_smd_ulsph.cpp index 0958cbc7c3..e9eac13126 100644 --- a/src/MACHDYN/pair_smd_ulsph.cpp +++ b/src/MACHDYN/pair_smd_ulsph.cpp @@ -85,7 +85,8 @@ PairULSPH::PairULSPH(LAMMPS *lmp) : PairULSPH::~PairULSPH() { if (allocated) { - //printf("... deallocating\n"); + memory->destroy(setflag); + memory->destroy(cutsq); memory->destroy(Q1); memory->destroy(rho0); memory->destroy(eos); From 2b480f87f1a548267a8adacc69864a591cab40ce Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 16 Nov 2021 21:48:33 -0500 Subject: [PATCH 61/70] fix segfault when using atom style smd as part of a hybrid style also remove redundant for clearing --- src/MACHDYN/atom_vec_smd.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/MACHDYN/atom_vec_smd.cpp b/src/MACHDYN/atom_vec_smd.cpp index b798425e19..81f32ca0a2 100644 --- a/src/MACHDYN/atom_vec_smd.cpp +++ b/src/MACHDYN/atom_vec_smd.cpp @@ -115,6 +115,7 @@ void AtomVecSMD::grow_pointers() vfrac = atom->vfrac; rmass = atom->rmass; x0 = atom->x0; + x = atom->x; radius = atom->radius; contact_radius = atom->contact_radius; molecule = atom->molecule; @@ -129,13 +130,11 @@ void AtomVecSMD::grow_pointers() /* ---------------------------------------------------------------------- clear extra forces starting at atom N nbytes = # of bytes to clear for a per-atom vector - NOTE: does f need to be re-cleared? ------------------------------------------------------------------------- */ void AtomVecSMD::force_clear(int n, size_t nbytes) { memset(&desph[n],0,nbytes); - memset(&f[n][0],0,3*nbytes); } /* ---------------------------------------------------------------------- From ef30e3bd35b0fd6268ed3427cdd42edac0db5b60 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 17 Nov 2021 06:58:44 -0500 Subject: [PATCH 62/70] clarifications and corrections for the discussion of the main git branches --- doc/src/Howto_github.rst | 3 ++- doc/src/Install_git.rst | 29 ++++++++++++++++------------- doc/src/Manual_version.rst | 24 ++++++++++++++++-------- 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/doc/src/Howto_github.rst b/doc/src/Howto_github.rst index 278b9e4bfd..315bacac69 100644 --- a/doc/src/Howto_github.rst +++ b/doc/src/Howto_github.rst @@ -141,7 +141,8 @@ unrelated feature, you should switch branches! Committing changes to the *develop*, *release*, or *stable* branches is strongly discouraged. While it may be convenient initially, it will create more work in the long run. Various texts and tutorials - on using git effectively discuss the motivation for this. + on using git effectively discuss the motivation for using feature + branches instead. **After changes are made** diff --git a/doc/src/Install_git.rst b/doc/src/Install_git.rst index 7ad6ca18c1..a5dc19fe79 100644 --- a/doc/src/Install_git.rst +++ b/doc/src/Install_git.rst @@ -28,8 +28,9 @@ provides `limited support for subversion clients `_. You can follow the LAMMPS development on 3 different git branches: -* **stable** : this branch is updated with every stable release; - updates are always "fast forward" merges from *develop* +* **stable** : this branch is updated from the *release* branch with + every stable release version and also has selected bug fixes and updates + back-ported from the *develop* branch * **release** : this branch is updated with every patch release; updates are always "fast forward" merges from *develop* * **develop** : this branch follows the ongoing development and @@ -47,20 +48,22 @@ your machine and "release" is one of the 3 branches listed above. (Note that you actually download all 3 branches; you can switch between them at any time using "git checkout ".) -.. note:: +.. admonition:: Saving time and disk space when using ``git clone`` The complete git history of the LAMMPS project is quite large because it contains the entire commit history of the project since fall 2006, - which includes the time when LAMMPS was managed with subversion. This - also includes commits that have added and removed some large files - (mostly by accident). If you do not need access to the entire commit - history, you can speed up the "cloning" process and reduce local disk - space requirements by using the *--depth* git command line flag thus - create a "shallow clone" of the repository that contains only a - subset of the git history. Using a depth of 1000 is usually sufficient - to include the head commits of the *develop* and the *release* branches. - To include the head commit of the *stable* branch you may need a depth - of up to 10000. + which includes the time when LAMMPS was managed with subversion. + This includes a few commits that have added and removed some large + files (mostly by accident). If you do not need access to the entire + commit history (most people don't), you can speed up the "cloning" + process and reduce local disk space requirements by using the + *--depth* git command line flag. That will create a "shallow clone" + of the repository containing only a subset of the git history. Using + a depth of 1000 is usually sufficient to include the head commits of + the *develop* and the *release* branches. To include the head commit + of the *stable* branch you may need a depth of up to 10000. If you + later need more of the git history, you can always convert the + shallow clone into a "full clone". Once the command completes, your directory will contain the same files as if you unpacked a current LAMMPS tarball, with the exception, that diff --git a/doc/src/Manual_version.rst b/doc/src/Manual_version.rst index b705ce8c4a..78ed61cd7c 100644 --- a/doc/src/Manual_version.rst +++ b/doc/src/Manual_version.rst @@ -10,23 +10,31 @@ Whenever we fix a bug or update or add a feature, it will be merged into the *develop* branch of the git repository. When a sufficient number of changes have accumulated *and* the software passes a set of automated tests, we release it in the next *patch* release, which are made every -few weeks. Info on patch releases are on `this website page +few weeks. The *release* branch of the git repository is updated with +every such release. Info on patch releases are on `this website page `_. -Once or twice a year, only bug fixes and small, non-intrusive changes are -included for a period of time, and the code is subjected to more detailed +Once or twice a year, we apply only bug fixes and small, non-intrusive +changes to the *develop* branch and the code is subjected to more detailed and thorough testing than the default automated testing. The latest -patch release after such a period is then labeled as a *stable* version. +patch release after such a period is then also labeled as a *stable* version +and the *stable* branch is updated with it. Between stable releases +we occasionally release some updates to the stable release containing +only bug fixes and updates back-ported from *develop* but no new features +and update the *stable* branch accordingly. -Each version of LAMMPS contains all the features and bug-fixes up to -and including its version date. +Each version of LAMMPS contains all the documented features up to and +including its version date. The version date is printed to the screen and logfile every time you run LAMMPS. It is also in the file src/version.h and in the LAMMPS directory name created when you unpack a tarball. And it is on the first page of the :doc:`manual `. -* If you browse the HTML pages on the LAMMPS WWW site, they always - describe the most current patch release of LAMMPS. +* If you browse the HTML pages on the LAMMPS WWW site, they will by + default describe the most current patch release version of LAMMPS. + In the navigation bar on the bottom left, there is the option to + view instead the documentation for the most recent *stable* version + or the latest version from the current development branch. * If you browse the HTML pages included in your tarball, they describe the version you have, which may be older. From 36e4e3e7462512cc04fbcee7dcfbb345080863af Mon Sep 17 00:00:00 2001 From: Tim Bernhard Date: Thu, 18 Nov 2021 17:22:32 +0100 Subject: [PATCH 63/70] Add ddx, dy and dz computes to compute bond/local and property/local --- doc/src/compute_bond_local.rst | 6 +++++- doc/src/compute_pair_local.rst | 14 +++++++++----- src/compute_bond_local.cpp | 17 ++++++++++++++++- src/compute_pair_local.cpp | 13 +++++++++++-- 4 files changed, 41 insertions(+), 9 deletions(-) diff --git a/doc/src/compute_bond_local.rst b/doc/src/compute_bond_local.rst index 8bdde70dd9..cf98eb4ef3 100644 --- a/doc/src/compute_bond_local.rst +++ b/doc/src/compute_bond_local.rst @@ -13,7 +13,7 @@ Syntax * ID, group-ID are documented in :doc:`compute ` command * bond/local = style name of this compute command * one or more values may be appended -* value = *dist* or *engpot* or *force* or *fx* or *fy* or *fz* or *engvib* or *engrot* or *engtrans* or *omega* or *velvib* or *v_name* +* value = *dist* or *dx* or *dy* or *dz* or *engpot* or *force* or *fx* or *fy* or *fz* or *engvib* or *engrot* or *engtrans* or *omega* or *velvib* or *v_name* .. parsed-literal:: @@ -21,6 +21,7 @@ Syntax *engpot* = bond potential energy *force* = bond force + *dx*,\ *dy*,\ *dz* = components of pairwise distance *fx*,\ *fy*,\ *fz* = components of bond force *engvib* = bond kinetic energy of vibration *engrot* = bond kinetic energy of rotation @@ -63,6 +64,9 @@ whether the 2 atoms represent a simple diatomic molecule, or are part of some larger molecule. The value *dist* is the current length of the bond. +The values *dx*, *dy*, and *dz* are the xyz components of the +*distance* between the pair of atoms. This value is always the +distance from the atom of lower to the one of higher id. The value *engpot* is the potential energy for the bond, based on the current separation of the pair of atoms in the bond. diff --git a/doc/src/compute_pair_local.rst b/doc/src/compute_pair_local.rst index f464c7cec6..fec35b1c41 100644 --- a/doc/src/compute_pair_local.rst +++ b/doc/src/compute_pair_local.rst @@ -13,11 +13,12 @@ Syntax * ID, group-ID are documented in :doc:`compute ` command * pair/local = style name of this compute command * one or more values may be appended -* value = *dist* or *eng* or *force* or *fx* or *fy* or *fz* or *pN* +* value = *dist* or *dx* or *dy* or *dz* or *eng* or *force* or *fx* or *fy* or *fz* or *pN* .. parsed-literal:: *dist* = pairwise distance + *dx*,\ *dy*,\ *dz* = components of pairwise distance *eng* = pairwise energy *force* = pairwise force *fx*,\ *fy*,\ *fz* = components of pairwise force @@ -56,6 +57,9 @@ force cutoff distance for that interaction, as defined by the commands. The value *dist* is the distance between the pair of atoms. +The values *dx*, *dy*, and *dz* are the xyz components of the +*distance* between the pair of atoms. This value can be inconsistent +due to changing interactions and neighbor list orders. The value *eng* is the interaction energy for the pair of atoms. @@ -89,10 +93,10 @@ from the second of the two sub-styles. If the referenced *pN* is not computed for the specific pairwise interaction (based on atom types), then the output will be 0.0. -The value *dist* will be in distance :doc:`units `. The value -*eng* will be in energy :doc:`units `. The values *force*, *fx*, -*fy*, and *fz* will be in force :doc:`units `. The values *pN* -will be in whatever units the pair style defines. +The value *dist*, *dx*, *dy* and *dz* will be in distance :doc:`units `. +The value *eng* will be in energy :doc:`units `. +The values *force*, *fx*, *fy*, and *fz* will be in force :doc:`units `. +The values *pN* will be in whatever units the pair style defines. The optional *cutoff* keyword determines how the force cutoff distance for an interaction is determined. For the default setting of *type*, diff --git a/src/compute_bond_local.cpp b/src/compute_bond_local.cpp index ab0fa3fb0a..d721d28247 100644 --- a/src/compute_bond_local.cpp +++ b/src/compute_bond_local.cpp @@ -34,7 +34,7 @@ using namespace LAMMPS_NS; #define DELTA 10000 #define EPSILON 1.0e-12 -enum{DIST,VELVIB,OMEGA,ENGTRANS,ENGVIB,ENGROT,ENGPOT,FORCE,FX,FY,FZ,VARIABLE}; +enum{DIST,DX,DY,DZ,VELVIB,OMEGA,ENGTRANS,ENGVIB,ENGROT,ENGPOT,FORCE,FX,FY,FZ,VARIABLE}; /* ---------------------------------------------------------------------- */ @@ -63,6 +63,9 @@ ComputeBondLocal::ComputeBondLocal(LAMMPS *lmp, int narg, char **arg) : int iarg; for (iarg = 3; iarg < narg; iarg++) { if (strcmp(arg[iarg],"dist") == 0) bstyle[nvalues++] = DIST; + else if (strcmp(arg[iarg],"dx") == 0) bstyle[nvalues++] = DX; + else if (strcmp(arg[iarg],"dy") == 0) bstyle[nvalues++] = DY; + else if (strcmp(arg[iarg],"dz") == 0) bstyle[nvalues++] = DZ; else if (strcmp(arg[iarg],"engpot") == 0) bstyle[nvalues++] = ENGPOT; else if (strcmp(arg[iarg],"force") == 0) bstyle[nvalues++] = FORCE; else if (strcmp(arg[iarg],"fx") == 0) bstyle[nvalues++] = FX; @@ -384,11 +387,23 @@ int ComputeBondLocal::compute_bonds(int flag) if (dstr) input->variable->internal_set(dvar,sqrt(rsq)); } + // to make sure dx, dy and dz are always from the lower to the higher id + double directionCorrection = atom1 > atom2 ? -1.0 : 1.0; + for (int n = 0; n < nvalues; n++) { switch (bstyle[n]) { case DIST: ptr[n] = sqrt(rsq); break; + case DX: + ptr[n] = dx*directionCorrection; + break; + case DY: + ptr[n] = dy*directionCorrection; + break; + case DZ: + ptr[n] = dz*directionCorrection; + break; case ENGPOT: ptr[n] = engpot; break; diff --git a/src/compute_pair_local.cpp b/src/compute_pair_local.cpp index af0f20014c..f783b8435b 100644 --- a/src/compute_pair_local.cpp +++ b/src/compute_pair_local.cpp @@ -31,7 +31,7 @@ using namespace LAMMPS_NS; #define DELTA 10000 -enum{DIST,ENG,FORCE,FX,FY,FZ,PN}; +enum{DIST,ENG,FORCE,FX,FY,FZ,PN,DX,DY,DZ}; enum{TYPE,RADIUS}; /* ---------------------------------------------------------------------- */ @@ -56,6 +56,9 @@ ComputePairLocal::ComputePairLocal(LAMMPS *lmp, int narg, char **arg) : else if (strcmp(arg[iarg],"fx") == 0) pstyle[nvalues++] = FX; else if (strcmp(arg[iarg],"fy") == 0) pstyle[nvalues++] = FY; else if (strcmp(arg[iarg],"fz") == 0) pstyle[nvalues++] = FZ; + else if (strcmp(arg[iarg],"dx") == 0) pstyle[nvalues++] = DX; + else if (strcmp(arg[iarg],"dy") == 0) pstyle[nvalues++] = DY; + else if (strcmp(arg[iarg],"dz") == 0) pstyle[nvalues++] = DZ; else if (arg[iarg][0] == 'p') { int n = atoi(&arg[iarg][1]); if (n <= 0) error->all(FLERR, @@ -92,7 +95,7 @@ ComputePairLocal::ComputePairLocal(LAMMPS *lmp, int narg, char **arg) : singleflag = 0; for (int i = 0; i < nvalues; i++) - if (pstyle[i] != DIST) singleflag = 1; + if (pstyle[i] != DIST && pstyle[i] != DX && pstyle[i] != DY && pstyle[i] != DZ) singleflag = 1; if (nvalues == 1) size_local_cols = 0; else size_local_cols = nvalues; @@ -269,6 +272,12 @@ int ComputePairLocal::compute_pairs(int flag) case DIST: ptr[n] = sqrt(rsq); break; + case DX: + ptr[n] = delx; + case DY: + ptr[n] = dely; + case DZ: + ptr[n] = delz; case ENG: ptr[n] = eng; break; From 4b6090a8cb6772887ab626ae610799fa8e504957 Mon Sep 17 00:00:00 2001 From: Tim Bernhard Date: Thu, 18 Nov 2021 19:28:51 +0100 Subject: [PATCH 64/70] Add direction consistency check to pair/local too --- doc/src/compute_bond_local.rst | 2 +- doc/src/compute_pair_local.rst | 4 ++-- src/compute_pair_local.cpp | 9 ++++++--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/doc/src/compute_bond_local.rst b/doc/src/compute_bond_local.rst index cf98eb4ef3..0368f33d29 100644 --- a/doc/src/compute_bond_local.rst +++ b/doc/src/compute_bond_local.rst @@ -66,7 +66,7 @@ of some larger molecule. The value *dist* is the current length of the bond. The values *dx*, *dy*, and *dz* are the xyz components of the *distance* between the pair of atoms. This value is always the -distance from the atom of lower to the one of higher id. +distance from the atom of lower to the one with the higher id. The value *engpot* is the potential energy for the bond, based on the current separation of the pair of atoms in the bond. diff --git a/doc/src/compute_pair_local.rst b/doc/src/compute_pair_local.rst index fec35b1c41..5cff338758 100644 --- a/doc/src/compute_pair_local.rst +++ b/doc/src/compute_pair_local.rst @@ -58,8 +58,8 @@ commands. The value *dist* is the distance between the pair of atoms. The values *dx*, *dy*, and *dz* are the xyz components of the -*distance* between the pair of atoms. This value can be inconsistent -due to changing interactions and neighbor list orders. +*distance* between the pair of atoms. This value is always the +distance from the atom of lower to the one with the higher id. The value *eng* is the interaction energy for the pair of atoms. diff --git a/src/compute_pair_local.cpp b/src/compute_pair_local.cpp index f783b8435b..af3ebd50a4 100644 --- a/src/compute_pair_local.cpp +++ b/src/compute_pair_local.cpp @@ -267,17 +267,20 @@ int ComputePairLocal::compute_pairs(int flag) if (nvalues == 1) ptr = &vlocal[m]; else ptr = alocal[m]; + // to make sure dx, dy and dz are always from the lower to the higher id + double directionCorrection = i > j ? -1.0 : 1.0; + for (n = 0; n < nvalues; n++) { switch (pstyle[n]) { case DIST: ptr[n] = sqrt(rsq); break; case DX: - ptr[n] = delx; + ptr[n] = delx*directionCorrection; case DY: - ptr[n] = dely; + ptr[n] = dely*directionCorrection; case DZ: - ptr[n] = delz; + ptr[n] = delz*directionCorrection; case ENG: ptr[n] = eng; break; From 74577fa5843e2860044ec94b5bcfdc3c01dbe690 Mon Sep 17 00:00:00 2001 From: Tim Bernhard Date: Fri, 19 Nov 2021 08:08:07 +0100 Subject: [PATCH 65/70] Fix issue where direction correction in compute pair/local might not have been correct --- src/compute_pair_local.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compute_pair_local.cpp b/src/compute_pair_local.cpp index af3ebd50a4..ff9acdc4ef 100644 --- a/src/compute_pair_local.cpp +++ b/src/compute_pair_local.cpp @@ -268,7 +268,7 @@ int ComputePairLocal::compute_pairs(int flag) else ptr = alocal[m]; // to make sure dx, dy and dz are always from the lower to the higher id - double directionCorrection = i > j ? -1.0 : 1.0; + double directionCorrection = itag > jtag ? -1.0 : 1.0; for (n = 0; n < nvalues; n++) { switch (pstyle[n]) { From 23d40a1d6124e7292585e65edc5bb53c95808ce9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 19 Nov 2021 13:43:32 -0500 Subject: [PATCH 66/70] report how many pair_coeff settings parameters were generated from mixing --- src/pair.cpp | 24 ++++++++++++++++++------ src/pair.h | 1 + src/pair_hybrid.cpp | 7 +++---- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/pair.cpp b/src/pair.cpp index 1039875718..0bc698f27e 100644 --- a/src/pair.cpp +++ b/src/pair.cpp @@ -41,6 +41,7 @@ using namespace LAMMPS_NS; using namespace MathConst; enum{NONE,RLINEAR,RSQ,BMP}; +static const std::string mixing_rule_names[Pair::SIXTHPOWER+1] = {"geometric", "arithmetic", "sixthpower" }; // allocate space for static class instance variable and initialize it @@ -217,11 +218,9 @@ void Pair::init() if (tail_flag && domain->nonperiodic && comm->me == 0) error->warning(FLERR,"Using pair tail corrections with non-periodic system"); if (!compute_flag && tail_flag && comm->me == 0) - error->warning(FLERR,"Using pair tail corrections with " - "pair_modify compute no"); + error->warning(FLERR,"Using pair tail corrections with pair_modify compute no"); if (!compute_flag && offset_flag && comm->me == 0) - error->warning(FLERR,"Using pair potential shift with " - "pair_modify compute no"); + error->warning(FLERR,"Using pair potential shift with pair_modify compute no"); // for manybody potentials // check if bonded exclusions could invalidate the neighbor list @@ -259,13 +258,18 @@ void Pair::init() etail = ptail = 0.0; mixed_flag = 1; double cut; + int mixed_count = 0; for (i = 1; i <= atom->ntypes; i++) for (j = i; j <= atom->ntypes; j++) { - if ((i != j) && setflag[i][j]) mixed_flag = 0; + did_mix = false; cut = init_one(i,j); cutsq[i][j] = cutsq[j][i] = cut*cut; cutforce = MAX(cutforce,cut); + if (i != j) { + if (setflag[i][j]) mixed_flag = 0; + if (did_mix) ++mixed_count; + } if (tail_flag) { etail += etail_ij; ptail += ptail_ij; @@ -275,6 +279,12 @@ void Pair::init() } } } + + if (!manybody_flag && (comm->me == 0)) { + const int num_mixed_pairs = atom->ntypes * (atom->ntypes - 1) / 2; + utils::logmesg(lmp," generated {} of {} mixed pair_coeff terms from {} mixing rule\n", + mixed_count, num_mixed_pairs, mixing_rule_names[mix_flag]); + } } /* ---------------------------------------------------------------------- @@ -681,6 +691,7 @@ void Pair::free_disp_tables() double Pair::mix_energy(double eps1, double eps2, double sig1, double sig2) { + did_mix = true; if (mix_flag == GEOMETRIC) return sqrt(eps1*eps2); else if (mix_flag == ARITHMETIC) @@ -688,7 +699,8 @@ double Pair::mix_energy(double eps1, double eps2, double sig1, double sig2) else if (mix_flag == SIXTHPOWER) return (2.0 * sqrt(eps1*eps2) * pow(sig1,3.0) * pow(sig2,3.0) / (pow(sig1,6.0) + pow(sig2,6.0))); - else return 0.0; + else did_mix = false; + return 0.0; } /* ---------------------------------------------------------------------- diff --git a/src/pair.h b/src/pair.h index f37c0732ed..00e6734773 100644 --- a/src/pair.h +++ b/src/pair.h @@ -110,6 +110,7 @@ class Pair : protected Pointers { // public so external driver can check int compute_flag; // 0 if skip compute() int mixed_flag; // 1 if all itype != jtype coeffs are from mixing + bool did_mix; // set to true by mix_energy() to indicate that mixing was performed enum { GEOMETRIC, ARITHMETIC, SIXTHPOWER }; // mixing options diff --git a/src/pair_hybrid.cpp b/src/pair_hybrid.cpp index b5daa111da..e962e02c9e 100644 --- a/src/pair_hybrid.cpp +++ b/src/pair_hybrid.cpp @@ -706,11 +706,10 @@ double PairHybrid::init_one(int i, int j) for (int k = 0; k < nmap[i][j]; k++) { map[j][i][k] = map[i][j][k]; double cut = styles[map[i][j][k]]->init_one(i,j); - styles[map[i][j][k]]->cutsq[i][j] = - styles[map[i][j][k]]->cutsq[j][i] = cut*cut; + if (styles[map[i][j][k]]->did_mix) did_mix = true; + styles[map[i][j][k]]->cutsq[i][j] = styles[map[i][j][k]]->cutsq[j][i] = cut*cut; if (styles[map[i][j][k]]->ghostneigh) - cutghost[i][j] = cutghost[j][i] = - MAX(cutghost[i][j],styles[map[i][j][k]]->cutghost[i][j]); + cutghost[i][j] = cutghost[j][i] = MAX(cutghost[i][j],styles[map[i][j][k]]->cutghost[i][j]); if (tail_flag) { etail_ij += styles[map[i][j][k]]->etail_ij; ptail_ij += styles[map[i][j][k]]->ptail_ij; From 3d4b0121cb72ae9a97b50a9d08e5073950eb6577 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 19 Nov 2021 14:18:55 -0500 Subject: [PATCH 67/70] improve pair hybrid documentation with respect to mixing --- doc/src/pair_hybrid.rst | 44 ++++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/doc/src/pair_hybrid.rst b/doc/src/pair_hybrid.rst index 541cdc1911..1460927add 100644 --- a/doc/src/pair_hybrid.rst +++ b/doc/src/pair_hybrid.rst @@ -74,14 +74,17 @@ atoms interact with each other via an *eam* potential, the surface atoms interact with each other via a *lj/cut* potential, and the metal/surface interaction is also computed via a *lj/cut* potential. The *hybrid/overlay* style could be used as in the second example above, -where multiple potentials are superposed in an additive fashion to +where multiple potentials are superimposed in an additive fashion to compute the interaction between atoms. In this example, using *lj/cut* and *coul/long* together gives the same result as if the *lj/cut/coul/long* potential were used by itself. In this case, it would be more efficient to use the single combined potential, but in general any combination of pair potentials can be used together in to produce an interaction that is not encoded in any single pair_style -file, e.g. adding Coulombic forces between granular particles. +file, e.g. adding Coulombic forces between granular particles. Another +limitation of using the *hybrid/overlay* variant, that it does not generate +*lj/cut* parameters for mixed atom types from a mixing rule due to +restrictions discussed below. If the *hybrid/scaled* style is used instead of *hybrid/overlay*, contributions from sub-styles are weighted by their scale factors, which @@ -150,10 +153,14 @@ with Tersoff, and the cross-interactions with Lennard-Jones: pair_coeff * * tersoff 2 C.tersoff NULL C pair_coeff 1 2 lj/cut 1.0 1.5 -If pair coefficients are specified in the data file read via the -:doc:`read_data ` command, then the same rule applies. -E.g. "eam/alloy" or "lj/cut" must be added after the atom type, for -each line in the "Pair Coeffs" section, e.g. + +It is not recommended to read pair coefficients for a hybrid style from a "Pair Coeffs" +or "PairIJ Coeffs" section of a data file via the :doc:`read_data ` command, +since those sections expect a fixed number of lines, either one line per atom type or +one line pair pair of atom types, respectively. When reading from a data file, the +lines of the "Pair Coeffs" and "PairIJ Coeffs" are changed in the same way as the *pair_coeff* +command, i.e. the name of the pair style to which the parameters apply must follow the +atom type (or atom types), e.g. .. parsed-literal:: @@ -162,6 +169,11 @@ each line in the "Pair Coeffs" section, e.g. 1 lj/cut/coul/cut 1.0 1.0 ... + PairIJ Coeffs + + 1 1 lj/cut/coul/cut 1.0 1.0 + ... + Note that the pair_coeff command for some potentials such as :doc:`pair_style eam/alloy ` includes a mapping specification of elements to all atom types, which in the hybrid case, can include @@ -208,12 +220,22 @@ examples above, or in the data file read by the :doc:`read_data `, or by mixing as described below. Also all sub-styles must be used at least once in a :doc:`pair_coeff ` command. -.. note:: +.. warning:: - LAMMPS never performs mixing of parameters from different sub-styles, - **even** if they use the same type of coefficients, e.g. contain - a Lennard-Jones potential variant. Those parameters must be provided - explicitly. + With hybrid pair styles the use of mixing to generate pair + coefficients is significantly limited compared to the individual pair + styles. LAMMPS **never** performs mixing of parameters from + different sub-styles, **even** if they use the same type of + coefficients, e.g. contain a Lennard-Jones potential variant. Those + parameters must be provided explicitly. Also for *hybrid/overlay* + and *hybrid/scaled* mixing is **only** performed for pairs of atom + types for which only a single pair style is assigned. + + Thus it is strongly recommended to provide all mixed terms + explicitly. For non-hybrid styles those could be generated and + written out using the :doc:`write_coeff command ` and + then edited as needed to comply with the requirements for hybrid + styles as explained above. If you want there to be no interactions between a particular pair of atom types, you have 3 choices. You can assign the pair of atom types From b2dae36eb9f99afdb2fbd2aa619b0a52e1b5578e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 19 Nov 2021 14:36:00 -0500 Subject: [PATCH 68/70] discuss mixing informational message --- doc/src/pair_modify.rst | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/doc/src/pair_modify.rst b/doc/src/pair_modify.rst index 1a62a4c1a0..4941693fbd 100644 --- a/doc/src/pair_modify.rst +++ b/doc/src/pair_modify.rst @@ -71,21 +71,23 @@ The *mix* keyword affects pair coefficients for interactions between atoms of type I and J, when I != J and the coefficients are not explicitly set in the input script. Note that coefficients for I = J must be set explicitly, either in the input script via the -:doc:`pair_coeff ` command or in the "Pair Coeffs" section of the -:doc:`data file `. For some pair styles it is not +:doc:`pair_coeff ` command or in the "Pair Coeffs" or "PairIJ Coeffs" +sections of the :doc:`data file `. For some pair styles it is not necessary to specify coefficients when I != J, since a "mixing" rule will create them from the I,I and J,J settings. The pair_modify *mix* value determines what formulas are used to compute the mixed coefficients. In each case, the cutoff distance is mixed the same way as sigma. -Note that not all pair styles support mixing and some mix options -are not available for certain pair styles. Also, there are additional -restrictions when using :doc:`pair style hybrid or hybrid/overlay `. -See the page for individual pair styles for those restrictions. Note also that the -:doc:`pair_coeff ` command also can be used to directly set -coefficients for a specific I != J pairing, in which case no mixing is -performed. +Note that not all pair styles support mixing and some mix options are +not available for certain pair styles. Also, there are additional +restrictions when using :doc:`pair style hybrid or hybrid/overlay +`. See the page for individual pair styles for those +restrictions. Note also that the :doc:`pair_coeff ` command +also can be used to directly set coefficients for a specific I != J +pairing, in which case no mixing is performed. If possible, LAMMPS will +print an informational message about how many of the mixed pair +coefficients were generated and which mixing rule was applied. - mix *geometric* From f135d8bb4e56750a02f79fa49b329ee28dc5c9fc Mon Sep 17 00:00:00 2001 From: Tim Bernhard Date: Sat, 20 Nov 2021 14:34:24 +0100 Subject: [PATCH 69/70] Fix issue where direction correction in compute bond/local might not have been correct --- src/compute_bond_local.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compute_bond_local.cpp b/src/compute_bond_local.cpp index d721d28247..7c60df057f 100644 --- a/src/compute_bond_local.cpp +++ b/src/compute_bond_local.cpp @@ -388,7 +388,7 @@ int ComputeBondLocal::compute_bonds(int flag) } // to make sure dx, dy and dz are always from the lower to the higher id - double directionCorrection = atom1 > atom2 ? -1.0 : 1.0; + double directionCorrection = tag[atom1] > tag[atom2] ? -1.0 : 1.0; for (int n = 0; n < nvalues; n++) { switch (bstyle[n]) { From ef2e51b344c7a590c1bc08b8374160a3cdb12700 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 22 Nov 2021 14:58:41 -0500 Subject: [PATCH 70/70] whitespace fixes --- doc/src/compute_bond_local.rst | 2 +- doc/src/compute_pair_local.rst | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/src/compute_bond_local.rst b/doc/src/compute_bond_local.rst index 0368f33d29..24b0943484 100644 --- a/doc/src/compute_bond_local.rst +++ b/doc/src/compute_bond_local.rst @@ -65,7 +65,7 @@ of some larger molecule. The value *dist* is the current length of the bond. The values *dx*, *dy*, and *dz* are the xyz components of the -*distance* between the pair of atoms. This value is always the +*distance* between the pair of atoms. This value is always the distance from the atom of lower to the one with the higher id. The value *engpot* is the potential energy for the bond, diff --git a/doc/src/compute_pair_local.rst b/doc/src/compute_pair_local.rst index 5cff338758..38953d203c 100644 --- a/doc/src/compute_pair_local.rst +++ b/doc/src/compute_pair_local.rst @@ -58,7 +58,7 @@ commands. The value *dist* is the distance between the pair of atoms. The values *dx*, *dy*, and *dz* are the xyz components of the -*distance* between the pair of atoms. This value is always the +*distance* between the pair of atoms. This value is always the distance from the atom of lower to the one with the higher id. The value *eng* is the interaction energy for the pair of atoms. @@ -93,9 +93,9 @@ from the second of the two sub-styles. If the referenced *pN* is not computed for the specific pairwise interaction (based on atom types), then the output will be 0.0. -The value *dist*, *dx*, *dy* and *dz* will be in distance :doc:`units `. -The value *eng* will be in energy :doc:`units `. -The values *force*, *fx*, *fy*, and *fz* will be in force :doc:`units `. +The value *dist*, *dx*, *dy* and *dz* will be in distance :doc:`units `. +The value *eng* will be in energy :doc:`units `. +The values *force*, *fx*, *fy*, and *fz* will be in force :doc:`units `. The values *pN* will be in whatever units the pair style defines. The optional *cutoff* keyword determines how the force cutoff distance